mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
1import {ComAtprotoServerDefs} from '@atproto/api'
2import {useQuery} from '@tanstack/react-query'
3
4import {cleanError} from '#/lib/strings/errors'
5import {STALE} from '#/state/queries'
6import {useAgent} from '#/state/session'
7
8function isInviteAvailable(invite: ComAtprotoServerDefs.InviteCode): boolean {
9 return invite.available - invite.uses.length > 0 && !invite.disabled
10}
11
12const inviteCodesQueryKeyRoot = 'inviteCodes'
13
14export type InviteCodesQueryResponse = Exclude<
15 ReturnType<typeof useInviteCodesQuery>['data'],
16 undefined
17>
18export function useInviteCodesQuery() {
19 const agent = useAgent()
20 return useQuery({
21 staleTime: STALE.MINUTES.FIVE,
22 queryKey: [inviteCodesQueryKeyRoot],
23 queryFn: async () => {
24 const res = await agent.com.atproto.server
25 .getAccountInviteCodes({})
26 .catch(e => {
27 if (cleanError(e) === 'Bad token scope') {
28 return null
29 } else {
30 throw e
31 }
32 })
33
34 if (res === null) {
35 return {
36 disabled: true,
37 all: [],
38 available: [],
39 used: [],
40 }
41 }
42
43 if (!res.data?.codes) {
44 throw new Error(`useInviteCodesQuery: no codes returned`)
45 }
46
47 const available = res.data.codes.filter(isInviteAvailable)
48 const used = res.data.codes
49 .filter(code => !isInviteAvailable(code))
50 .sort((a, b) => {
51 return (
52 new Date(b.uses[0].usedAt).getTime() -
53 new Date(a.uses[0].usedAt).getTime()
54 )
55 })
56
57 return {
58 disabled: false,
59 all: [...available, ...used],
60 available,
61 used,
62 }
63 },
64 })
65}