import React, {useState} from 'react' import { ActivityIndicator, Pressable, SafeAreaView, StyleSheet, View, } from 'react-native' import {Svg, Circle, Path} from 'react-native-svg' import {ScrollView, TextInput} from './util' import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {Text} from '../util/text/Text' import {Button} from '../util/forms/Button' import {ErrorMessage} from '../util/error/ErrorMessage' import * as Toast from '../util/Toast' import {s, colors} from 'lib/styles' import {usePalette} from 'lib/hooks/usePalette' import {isWeb} from 'platform/detection' import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' import {cleanError} from 'lib/strings/errors' import {Trans, msg} from '@lingui/macro' import {useLingui} from '@lingui/react' import {useModalControls} from '#/state/modals' import {useSession, useSessionApi, getAgent} from '#/state/session' import {logger} from '#/logger' export const snapPoints = ['90%'] enum Stages { Reminder, Email, ConfirmCode, } export function Component({showReminder}: {showReminder?: boolean}) { const pal = usePalette('default') const {currentAccount} = useSession() const {updateCurrentAccount} = useSessionApi() const {_} = useLingui() const [stage, setStage] = useState( showReminder ? Stages.Reminder : Stages.Email, ) const [confirmationCode, setConfirmationCode] = useState('') const [isProcessing, setIsProcessing] = useState(false) const [error, setError] = useState('') const {isMobile} = useWebMediaQueries() const {openModal, closeModal} = useModalControls() React.useEffect(() => { if (!currentAccount) { logger.error(`VerifyEmail modal opened without currentAccount`) closeModal() } }, [currentAccount, closeModal]) const onSendEmail = async () => { setError('') setIsProcessing(true) try { await getAgent().com.atproto.server.requestEmailConfirmation() setStage(Stages.ConfirmCode) } catch (e) { setError(cleanError(String(e))) } finally { setIsProcessing(false) } } const onConfirm = async () => { setError('') setIsProcessing(true) try { await getAgent().com.atproto.server.confirmEmail({ email: (currentAccount?.email || '').trim(), token: confirmationCode.trim(), }) updateCurrentAccount({emailConfirmed: true}) Toast.show(_(msg`Email verified`)) closeModal() } catch (e) { setError(cleanError(String(e))) } finally { setIsProcessing(false) } } const onEmailIncorrect = () => { closeModal() openModal({name: 'change-email'}) } return ( {stage === Stages.Reminder && } {stage === Stages.Reminder ? ( Please Verify Your Email ) : stage === Stages.Email ? ( Verify Your Email ) : stage === Stages.ConfirmCode ? ( Enter Confirmation Code ) : ( '' )} {stage === Stages.Reminder ? ( Your email has not yet been verified. This is an important security step which we recommend. ) : stage === Stages.Email ? ( This is important in case you ever need to change your email or reset your password. ) : stage === Stages.ConfirmCode ? ( An email has been sent to {currentAccount?.email || '(no email)'}. It includes a confirmation code which you can enter below. ) : ( '' )} {stage === Stages.Email ? ( <> {currentAccount?.email || _(msg`(no email)`)} Change ) : stage === Stages.ConfirmCode ? ( ) : undefined} {error ? ( ) : undefined} {isProcessing ? ( ) : ( {stage === Stages.Reminder && (