about summary refs log tree commit diff
path: root/src/state/queries/nuxs/index.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/state/queries/nuxs/index.ts')
-rw-r--r--src/state/queries/nuxs/index.ts83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/state/queries/nuxs/index.ts b/src/state/queries/nuxs/index.ts
new file mode 100644
index 000000000..2945e67eb
--- /dev/null
+++ b/src/state/queries/nuxs/index.ts
@@ -0,0 +1,83 @@
+import {useMutation, useQueryClient} from '@tanstack/react-query'
+
+import {AppNux, Nux} from '#/state/queries/nuxs/definitions'
+import {parseAppNux, serializeAppNux} from '#/state/queries/nuxs/util'
+import {
+  preferencesQueryKey,
+  usePreferencesQuery,
+} from '#/state/queries/preferences'
+import {useAgent} from '#/state/session'
+
+export {Nux} from '#/state/queries/nuxs/definitions'
+
+export function useNuxs() {
+  const {data, ...rest} = usePreferencesQuery()
+
+  if (data && rest.isSuccess) {
+    const nuxs = data.bskyAppState.nuxs
+      ?.map(parseAppNux)
+      ?.filter(Boolean) as AppNux[]
+
+    if (nuxs) {
+      return {
+        nuxs,
+        ...rest,
+      }
+    }
+  }
+
+  return {
+    nuxs: undefined,
+    ...rest,
+  }
+}
+
+export function useNux<T extends Nux>(id: T) {
+  const {nuxs, ...rest} = useNuxs()
+
+  if (nuxs && rest.isSuccess) {
+    const nux = nuxs.find(nux => nux.id === id)
+
+    if (nux) {
+      return {
+        nux: nux as Extract<AppNux, {id: T}>,
+        ...rest,
+      }
+    }
+  }
+
+  return {
+    nux: undefined,
+    ...rest,
+  }
+}
+
+export function useUpsertNuxMutation() {
+  const queryClient = useQueryClient()
+  const agent = useAgent()
+
+  return useMutation({
+    mutationFn: async (nux: AppNux) => {
+      await agent.bskyAppUpsertNux(serializeAppNux(nux))
+      // triggers a refetch
+      await queryClient.invalidateQueries({
+        queryKey: preferencesQueryKey,
+      })
+    },
+  })
+}
+
+export function useRemoveNuxsMutation() {
+  const queryClient = useQueryClient()
+  const agent = useAgent()
+
+  return useMutation({
+    mutationFn: async (ids: string[]) => {
+      await agent.bskyAppRemoveNuxs(ids)
+      // triggers a refetch
+      await queryClient.invalidateQueries({
+        queryKey: preferencesQueryKey,
+      })
+    },
+  })
+}