import {useState} from 'react' import {View} from 'react-native' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {cleanError} from '#/lib/strings/errors' import {isNative} from '#/platform/detection' import {useAgent, useSession} from '#/state/session' import {ErrorMessage} from '#/view/com/util/error/ErrorMessage' import * as Toast from '#/view/com/util/Toast' import {atoms as a, useBreakpoints, useTheme} from '#/alf' import {Button, ButtonIcon, ButtonText} from '#/components/Button' import * as Dialog from '#/components/Dialog' import * as TextField from '#/components/forms/TextField' import {Lock_Stroke2_Corner0_Rounded as Lock} from '#/components/icons/Lock' import {Loader} from '#/components/Loader' import {P, Text} from '#/components/Typography' enum Stages { Email, ConfirmCode, } export function DisableEmail2FADialog({ control, }: { control: Dialog.DialogOuterProps['control'] }) { const {_} = useLingui() const t = useTheme() const {gtMobile} = useBreakpoints() const {currentAccount} = useSession() const agent = useAgent() const [stage, setStage] = useState(Stages.Email) const [confirmationCode, setConfirmationCode] = useState('') const [isProcessing, setIsProcessing] = useState(false) const [error, setError] = useState('') const onSendEmail = async () => { setError('') setIsProcessing(true) try { await agent.com.atproto.server.requestEmailUpdate() setStage(Stages.ConfirmCode) } catch (e) { setError(cleanError(String(e))) } finally { setIsProcessing(false) } } const onConfirmDisable = async () => { setError('') setIsProcessing(true) try { if (currentAccount?.email) { await agent.com.atproto.server.updateEmail({ email: currentAccount!.email, token: confirmationCode.trim(), emailAuthFactor: false, }) await agent.resumeSession(agent.session!) Toast.show(_(msg({message: 'Email 2FA disabled', context: 'toast'}))) } control.close() } catch (e) { const errMsg = String(e) if (errMsg.includes('Token is invalid')) { setError(_(msg`Invalid 2FA confirmation code.`)) } else { setError(cleanError(errMsg)) } } finally { setIsProcessing(false) } } return ( Disable Email 2FA

{stage === Stages.ConfirmCode ? ( An email has been sent to{' '} {currentAccount?.email || '(no email)'}. It includes a confirmation code which you can enter below. ) : ( To disable the email 2FA method, please verify your access to the email address. )}

{error ? : undefined} {stage === Stages.Email ? ( ) : stage === Stages.ConfirmCode ? ( Confirmation code ) : undefined} {!gtMobile && isNative && }
) }