65 lines
1.6 KiB
TypeScript
65 lines
1.6 KiB
TypeScript
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'
|
|
|
|
export interface Guilds {
|
|
guilds: GuildWithDefaultChannelId[]
|
|
hasMore: boolean
|
|
nextPage: NextPage
|
|
}
|
|
|
|
const defaultGuildsContext = {} as any
|
|
const GuildsContext = createContext<Guilds>(defaultGuildsContext)
|
|
|
|
export const GuildsProvider: React.FC = (props) => {
|
|
const { children } = props
|
|
|
|
const { authentication } = useAuthentication()
|
|
|
|
const {
|
|
items: guilds,
|
|
hasMore,
|
|
nextPage,
|
|
resetPagination,
|
|
setItems
|
|
} = usePagination<GuildWithDefaultChannelId>({
|
|
api: authentication.api,
|
|
url: '/guilds'
|
|
})
|
|
|
|
useEffect(() => {
|
|
authentication.socket.on(
|
|
'guilds',
|
|
(data: SocketData<GuildWithDefaultChannelId>) => {
|
|
handleSocketData({ data, setItems })
|
|
}
|
|
)
|
|
|
|
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
|
|
}
|