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 {useAgent, useSession} from '#/state/session' import {ErrorMessage} from '#/view/com/util/error/ErrorMessage' import {atoms as a, useBreakpoints, web} from '#/alf' import {Button, ButtonText} from '#/components/Button' import * as Dialog from '#/components/Dialog' import * as TextField from '#/components/forms/TextField' import {Loader} from '#/components/Loader' import {Text} from '#/components/Typography' export function ChangeEmailDialog({ control, verifyEmailControl, }: { control: Dialog.DialogControlProps verifyEmailControl: Dialog.DialogControlProps }) { return ( ) } export function Inner({ verifyEmailControl, }: { verifyEmailControl: Dialog.DialogControlProps }) { const {_} = useLingui() const {currentAccount} = useSession() const agent = useAgent() const control = Dialog.useDialogContext() const {gtMobile} = useBreakpoints() const [currentStep, setCurrentStep] = useState< 'StepOne' | 'StepTwo' | 'StepThree' >('StepOne') const [email, setEmail] = useState('') const [confirmationCode, setConfirmationCode] = useState('') const [isProcessing, setIsProcessing] = useState(false) const [error, setError] = useState('') const currentEmail = currentAccount?.email || '(no email)' const uiStrings = { StepOne: { title: _(msg`Change Your Email`), message: '', }, StepTwo: { title: _(msg`Security Step Required`), message: _( msg`An email has been sent to your previous address, ${currentEmail}. It includes a confirmation code which you can enter below.`, ), }, StepThree: { title: _(msg`Email Updated!`), message: _( msg`Your email address has been updated but it is not yet verified. As a next step, please verify your new email.`, ), }, } const onRequestChange = async () => { if (email === currentAccount?.email) { setError( _( msg`The email address you entered is the same as your current email address.`, ), ) return } setError('') setIsProcessing(true) try { const res = await agent.com.atproto.server.requestEmailUpdate() if (res.data.tokenRequired) { setCurrentStep('StepTwo') } else { await agent.com.atproto.server.updateEmail({email: email.trim()}) await agent.resumeSession(agent.session!) setCurrentStep('StepThree') } } catch (e) { setError(cleanError(String(e))) } finally { setIsProcessing(false) } } const onConfirm = async () => { setError('') setIsProcessing(true) try { await agent.com.atproto.server.updateEmail({ email: email.trim(), token: confirmationCode.trim(), }) await agent.resumeSession(agent.session!) setCurrentStep('StepThree') } catch (e) { setError(cleanError(String(e))) } finally { setIsProcessing(false) } } const onVerify = async () => { control.close(() => { verifyEmailControl.open() }) } return ( {uiStrings[currentStep].title} {error ? ( ) : null} {currentStep === 'StepOne' ? ( Enter your new email address below. ) : ( {uiStrings[currentStep].message} )} {currentStep === 'StepTwo' ? ( Confirmation code ) : null} {currentStep === 'StepOne' ? ( <> ) : currentStep === 'StepTwo' ? ( <> ) : currentStep === 'StepThree' ? ( <> ) : null} ) }