Bluesky app fork with some witchin' additions 💫

Use useConfirmEmail hook in deep link verification flow (#9413)

* use useConfirmEmail hook in deep link verification flow

* more straightforward logic

authored by samuel.fm and committed by GitHub f57268e9 002a63b1

Changed files
+21 -23
src
components
dialogs
EmailDialog
intents
+7 -2
src/components/dialogs/EmailDialog/data/useConfirmEmail.ts
··· 2 3 import {useAgent, useSession} from '#/state/session' 4 5 - export function useConfirmEmail() { 6 const agent = useAgent() 7 const {currentAccount} = useSession() 8 ··· 13 } 14 15 await agent.com.atproto.server.confirmEmail({ 16 - email: currentAccount.email, 17 token: token.trim(), 18 }) 19 // will update session state at root of app 20 await agent.resumeSession(agent.session!) 21 }, 22 }) 23 }
··· 2 3 import {useAgent, useSession} from '#/state/session' 4 5 + export function useConfirmEmail({ 6 + onSuccess, 7 + onError, 8 + }: {onSuccess?: () => void; onError?: () => void} = {}) { 9 const agent = useAgent() 10 const {currentAccount} = useSession() 11 ··· 16 } 17 18 await agent.com.atproto.server.confirmEmail({ 19 + email: currentAccount.email.trim(), 20 token: token.trim(), 21 }) 22 // will update session state at root of app 23 await agent.resumeSession(agent.session!) 24 }, 25 + onSuccess, 26 + onError, 27 }) 28 }
+14 -21
src/components/intents/VerifyEmailIntentDialog.tsx
··· 1 - import React from 'react' 2 import {View} from 'react-native' 3 import {msg, Trans} from '@lingui/macro' 4 import {useLingui} from '@lingui/react' ··· 9 import {Button, ButtonIcon, ButtonText} from '#/components/Button' 10 import * as Dialog from '#/components/Dialog' 11 import {type DialogControlProps} from '#/components/Dialog' 12 import {Divider} from '#/components/Divider' 13 import {ArrowRotateCounterClockwise_Stroke2_Corner0_Rounded as Resend} from '#/components/icons/ArrowRotateCounterClockwise' 14 import {useIntentDialogs} from '#/components/intents/IntentDialogs' ··· 31 const {gtMobile} = useBreakpoints() 32 const {_} = useLingui() 33 const {verifyEmailState: state} = useIntentDialogs() 34 - const [status, setStatus] = React.useState< 35 'loading' | 'success' | 'failure' | 'resent' 36 >('loading') 37 - const [sending, setSending] = React.useState(false) 38 const agent = useAgent() 39 const {currentAccount} = useSession() 40 41 - React.useEffect(() => { 42 - ;(async () => { 43 - if (!state?.code) { 44 - return 45 - } 46 - try { 47 - await agent.com.atproto.server.confirmEmail({ 48 - email: (currentAccount?.email || '').trim(), 49 - token: state.code.trim(), 50 - }) 51 - setStatus('success') 52 - } catch (e) { 53 - setStatus('failure') 54 - } 55 - })() 56 - }, [agent.com.atproto.server, currentAccount?.email, state?.code]) 57 58 const onPressResendEmail = async () => { 59 setSending(true) ··· 121 <Button 122 label={_(msg`Resend Verification Email`)} 123 onPress={onPressResendEmail} 124 - variant="solid" 125 color="secondary_inverted" 126 size="large" 127 disabled={sending}> 128 - <ButtonIcon icon={sending ? Loader : Resend} position="left" /> 129 <ButtonText> 130 <Trans>Resend Email</Trans> 131 </ButtonText>
··· 1 + import {useEffect, useState} from 'react' 2 import {View} from 'react-native' 3 import {msg, Trans} from '@lingui/macro' 4 import {useLingui} from '@lingui/react' ··· 9 import {Button, ButtonIcon, ButtonText} from '#/components/Button' 10 import * as Dialog from '#/components/Dialog' 11 import {type DialogControlProps} from '#/components/Dialog' 12 + import {useConfirmEmail} from '#/components/dialogs/EmailDialog/data/useConfirmEmail' 13 import {Divider} from '#/components/Divider' 14 import {ArrowRotateCounterClockwise_Stroke2_Corner0_Rounded as Resend} from '#/components/icons/ArrowRotateCounterClockwise' 15 import {useIntentDialogs} from '#/components/intents/IntentDialogs' ··· 32 const {gtMobile} = useBreakpoints() 33 const {_} = useLingui() 34 const {verifyEmailState: state} = useIntentDialogs() 35 + const [status, setStatus] = useState< 36 'loading' | 'success' | 'failure' | 'resent' 37 >('loading') 38 + const [sending, setSending] = useState(false) 39 const agent = useAgent() 40 const {currentAccount} = useSession() 41 + const {mutate: confirmEmail} = useConfirmEmail({ 42 + onSuccess: () => setStatus('success'), 43 + onError: () => setStatus('failure'), 44 + }) 45 46 + useEffect(() => { 47 + if (state?.code) { 48 + confirmEmail({token: state.code}) 49 + } 50 + }, [state?.code, confirmEmail]) 51 52 const onPressResendEmail = async () => { 53 setSending(true) ··· 115 <Button 116 label={_(msg`Resend Verification Email`)} 117 onPress={onPressResendEmail} 118 color="secondary_inverted" 119 size="large" 120 disabled={sending}> 121 + <ButtonIcon icon={sending ? Loader : Resend} /> 122 <ButtonText> 123 <Trans>Resend Email</Trans> 124 </ButtonText>