about summary refs log tree commit diff
path: root/src/components/dialogs/EmailDialog/data/useUpdateEmail.ts
blob: 2ec1eb6dc2d9089851090fd11a6d54c4ca9ee5d4 (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
import {useMutation} from '@tanstack/react-query'

import {useAgent} from '#/state/session'
import {useRequestEmailUpdate} from '#/components/dialogs/EmailDialog/data/useRequestEmailUpdate'

async function updateEmailAndRefreshSession(
  agent: ReturnType<typeof useAgent>,
  email: string,
  token?: string,
) {
  await agent.com.atproto.server.updateEmail({email: email.trim(), token})
  await agent.resumeSession(agent.session!)
}

export function useUpdateEmail() {
  const agent = useAgent()
  const {mutateAsync: requestEmailUpdate} = useRequestEmailUpdate()

  return useMutation<
    {status: 'tokenRequired' | 'success'},
    Error,
    {email: string; token?: string}
  >({
    mutationFn: async ({email, token}: {email: string; token?: string}) => {
      if (token) {
        await updateEmailAndRefreshSession(agent, email, token)
        return {
          status: 'success',
        }
      } else {
        const {tokenRequired} = await requestEmailUpdate()
        if (tokenRequired) {
          return {
            status: 'tokenRequired',
          }
        } else {
          await updateEmailAndRefreshSession(agent, email, token)
          return {
            status: 'success',
          }
        }
      }
    },
  })
}