diff options
Diffstat (limited to 'src/state/queries/invites.ts')
-rw-r--r-- | src/state/queries/invites.ts | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/state/queries/invites.ts b/src/state/queries/invites.ts new file mode 100644 index 000000000..77494d273 --- /dev/null +++ b/src/state/queries/invites.ts @@ -0,0 +1,36 @@ +import {ComAtprotoServerDefs} from '@atproto/api' +import {useQuery} from '@tanstack/react-query' + +import {useSession} from '#/state/session' + +function isInviteAvailable(invite: ComAtprotoServerDefs.InviteCode): boolean { + return invite.available - invite.uses.length > 0 && !invite.disabled +} + +export type InviteCodesQueryResponse = Exclude< + ReturnType<typeof useInviteCodesQuery>['data'], + undefined +> +export function useInviteCodesQuery() { + const {agent} = useSession() + + return useQuery({ + queryKey: ['inviteCodes'], + queryFn: async () => { + const res = await agent.com.atproto.server.getAccountInviteCodes({}) + + if (!res.data?.codes) { + throw new Error(`useInviteCodesQuery: no codes returned`) + } + + const available = res.data.codes.filter(isInviteAvailable) + const used = res.data.codes.filter(code => !isInviteAvailable(code)) + + return { + all: [...available, ...used], + available, + used, + } + }, + }) +} |