about summary refs log tree commit diff
path: root/src/state/queries/invites.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/state/queries/invites.ts')
-rw-r--r--src/state/queries/invites.ts36
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,
+      }
+    },
+  })
+}