69 lines
1.8 KiB
TypeScript
69 lines
1.8 KiB
TypeScript
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<Guilds>(defaultGuildsContext)
|
|
|
|
export const GuildsProvider: React.FC<React.PropsWithChildren> = (props) => {
|
|
const { children } = props
|
|
|
|
const { authentication } = useAuthentication()
|
|
|
|
const {
|
|
items: guilds,
|
|
hasMore,
|
|
nextPage,
|
|
resetPagination,
|
|
setItems
|
|
} = usePagination<GuildWithDefaultChannelId>({
|
|
api: authentication.api,
|
|
url: '/guilds',
|
|
cacheKey: GUILDS_CACHE_KEY
|
|
})
|
|
|
|
useEffect(() => {
|
|
authentication?.socket?.on(
|
|
'guilds',
|
|
(data: SocketData<GuildWithDefaultChannelId>) => {
|
|
handleSocketData({ data, setItems, cacheKey: GUILDS_CACHE_KEY })
|
|
}
|
|
)
|
|
|
|
return () => {
|
|
authentication?.socket?.off('guilds')
|
|
}
|
|
}, [authentication.socket, setItems])
|
|
|
|
useEffect(() => {
|
|
resetPagination()
|
|
nextPage()
|
|
}, [nextPage, resetPagination])
|
|
|
|
return (
|
|
<GuildsContext.Provider value={{ guilds, hasMore, nextPage }}>
|
|
{children}
|
|
</GuildsContext.Provider>
|
|
)
|
|
}
|
|
|
|
export const useGuilds = (): Guilds => {
|
|
const guilds = useContext(GuildsContext)
|
|
if (guilds === defaultGuildsContext) {
|
|
throw new Error('`useGuilds` must be used within `GuildsProvider`')
|
|
}
|
|
return guilds
|
|
}
|