import { createContext, useContext, useEffect } from 'react' import { NextPage, usePagination } from '../hooks/usePagination' import { useAuthentication } from '../tools/authentication' import { GuildWithDefaultChannelId } from '../models/Guild' import { handleSocketData, SocketData } 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 }