about summary refs log tree commit diff
path: root/src/state/queries/messages/actor-declaration.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/state/queries/messages/actor-declaration.ts')
-rw-r--r--src/state/queries/messages/actor-declaration.ts64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/state/queries/messages/actor-declaration.ts b/src/state/queries/messages/actor-declaration.ts
new file mode 100644
index 000000000..c8cc4acbd
--- /dev/null
+++ b/src/state/queries/messages/actor-declaration.ts
@@ -0,0 +1,64 @@
+import {AppBskyActorDefs} from '@atproto/api'
+import {useMutation, useQueryClient} from '@tanstack/react-query'
+
+import {logger} from '#/logger'
+import {useAgent, useSession} from '#/state/session'
+import {RQKEY as PROFILE_RKEY} from '../profile'
+
+export function useUpdateActorDeclaration({
+  onSuccess,
+  onError,
+}: {
+  onSuccess?: () => void
+  onError?: (error: Error) => void
+}) {
+  const queryClient = useQueryClient()
+  const {currentAccount} = useSession()
+  const {getAgent} = useAgent()
+
+  return useMutation({
+    mutationFn: async (allowIncoming: 'all' | 'none' | 'following') => {
+      if (!currentAccount) throw new Error('Not logged in')
+      // TODO(sam): remove validate: false once PDSes have the new lexicon
+      const result = await getAgent().api.com.atproto.repo.putRecord({
+        collection: 'chat.bsky.actor.declaration',
+        rkey: 'self',
+        repo: currentAccount.did,
+        validate: false,
+        record: {
+          $type: 'chat.bsky.actor.declaration',
+          allowIncoming,
+        },
+      })
+      return result
+    },
+    onMutate: allowIncoming => {
+      if (!currentAccount) return
+      queryClient.setQueryData(
+        PROFILE_RKEY(currentAccount?.did),
+        (old?: AppBskyActorDefs.ProfileViewDetailed) => {
+          if (!old) return old
+          return {
+            ...old,
+            associated: {
+              ...old.associated,
+              chat: {
+                allowIncoming,
+              },
+            },
+          } satisfies AppBskyActorDefs.ProfileViewDetailed
+        },
+      )
+    },
+    onSuccess,
+    onError: error => {
+      logger.error(error)
+      if (currentAccount) {
+        queryClient.invalidateQueries({
+          queryKey: PROFILE_RKEY(currentAccount.did),
+        })
+      }
+      onError?.(error)
+    },
+  })
+}