import { createContext, useContext, useEffect } from 'react' import type { NextPage } from '../hooks/usePagination' import { usePagination } from '../hooks/usePagination' import { useAuthentication } from '../tools/authentication' import type { GuildWithDefaultChannelId } from '../models/Guild' import type { SocketData } from '../tools/handleSocketData' import { handleSocketData } from '../tools/handleSocketData' import { GUILDS_CACHE_KEY } from '../tools/cache' export interface Guilds { guilds: GuildWithDefaultChannelId[] hasMore: boolean nextPage: NextPage } const defaultGuildsContext = {} as any const GuildsContext = createContext(defaultGuildsContext) export const GuildsProvider: React.FC = (props) => { const { children } = props const { authentication } = useAuthentication() const { items: guilds, hasMore, nextPage, resetPagination, setItems } = usePagination({ api: authentication.api, url: '/guilds', cacheKey: GUILDS_CACHE_KEY }) useEffect(() => { authentication?.socket?.on( 'guilds', (data: SocketData) => { handleSocketData({ data, setItems, cacheKey: GUILDS_CACHE_KEY }) } ) return () => { authentication?.socket?.off('guilds') } }, [authentication.socket, setItems]) useEffect(() => { resetPagination() nextPage() }, [nextPage, resetPagination]) return ( {children} ) } export const useGuilds = (): Guilds => { const guilds = useContext(GuildsContext) if (guilds === defaultGuildsContext) { throw new Error('`useGuilds` must be used within `GuildsProvider`') } return guilds }