import React, {useState} from 'react' import { ActivityIndicator, Pressable, SafeAreaView, StyleSheet, View, } from 'react-native' import {Circle, Path, Svg} from 'react-native-svg' import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {logger} from '#/logger' import {useModalControls} from '#/state/modals' import {useAgent, useSession} from '#/state/session' import {usePalette} from 'lib/hooks/usePalette' import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' import {cleanError} from 'lib/strings/errors' import {colors, s} from 'lib/styles' import {isWeb} from 'platform/detection' import {ErrorMessage} from '../util/error/ErrorMessage' import {Button} from '../util/forms/Button' import {Text} from '../util/text/Text' import * as Toast from '../util/Toast' import {ScrollView, TextInput} from './util' export const snapPoints = ['90%'] enum Stages { Reminder, Email, ConfirmCode, } export function Component({ showReminder, onSuccess, }: { showReminder?: boolean onSuccess?: () => void }) { const pal = usePalette('default') const agent = useAgent() const {currentAccount} = useSession() 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 agent.com.atproto.server.requestEmailConfirmation() setStage(Stages.ConfirmCode) } catch (e) { setError(cleanError(String(e))) } finally { setIsProcessing(false) } } const onConfirm = async () => { setError('') setIsProcessing(true) try { await agent.com.atproto.server.confirmEmail({ email: (currentAccount?.email || '').trim(), token: confirmationCode.trim(), }) await agent.resumeSession(agent.session!) Toast.show(_(msg`Email verified`)) closeModal() onSuccess?.() } 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 && (