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 }