about summary refs log tree commit diff
path: root/src/state/queries/messages/mute-conversation.ts
blob: d668e36cb0a2263dbd546140a58b90be91649b59 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import {
  type ChatBskyConvoDefs,
  type ChatBskyConvoListConvos,
  type ChatBskyConvoMuteConvo,
} from '@atproto/api'
import {
  type InfiniteData,
  useMutation,
  useQueryClient,
} from '@tanstack/react-query'

import {DM_SERVICE_HEADERS} from '#/lib/constants'
import {useAgent} from '#/state/session'
import {RQKEY as CONVO_KEY} from './conversation'
import {RQKEY_ROOT as CONVO_LIST_KEY} from './list-conversations'

export function useMuteConvo(
  convoId: string | undefined,
  {
    onSuccess,
    onError,
  }: {
    onSuccess?: (data: ChatBskyConvoMuteConvo.OutputSchema) => void
    onError?: (error: Error) => void
  },
) {
  const queryClient = useQueryClient()
  const agent = useAgent()

  return useMutation({
    mutationFn: async ({mute}: {mute: boolean}) => {
      if (!convoId) throw new Error('No convoId provided')
      if (mute) {
        const {data} = await agent.api.chat.bsky.convo.muteConvo(
          {convoId},
          {headers: DM_SERVICE_HEADERS, encoding: 'application/json'},
        )
        return data
      } else {
        const {data} = await agent.api.chat.bsky.convo.unmuteConvo(
          {convoId},
          {headers: DM_SERVICE_HEADERS, encoding: 'application/json'},
        )
        return data
      }
    },
    onSuccess: (data, params) => {
      queryClient.setQueryData<ChatBskyConvoDefs.ConvoView>(
        CONVO_KEY(data.convo.id),
        prev => {
          if (!prev) return
          return {
            ...prev,
            muted: params.mute,
          }
        },
      )
      queryClient.setQueryData<
        InfiniteData<ChatBskyConvoListConvos.OutputSchema>
      >([CONVO_LIST_KEY], prev => {
        if (!prev?.pages) return
        return {
          ...prev,
          pages: prev.pages.map(page => ({
            ...page,
            convos: page.convos.map(convo => {
              if (convo.id !== data.convo.id) return convo
              return {
                ...convo,
                muted: params.mute,
              }
            }),
          })),
        }
      })

      onSuccess?.(data)
    },
    onError: e => {
      onError?.(e)
    },
  })
}