import React, {useRef} from 'react' import {View} from 'react-native' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import * as EmailValidator from 'email-validator' import {logEvent} from '#/lib/statsig/statsig' import {logger} from '#/logger' import {ScreenTransition} from '#/screens/Login/ScreenTransition' import {is13, is18, useSignupContext} from '#/screens/Signup/state' import {Policies} from '#/screens/Signup/StepInfo/Policies' import {atoms as a} from '#/alf' import * as DateField from '#/components/forms/DateField' import {FormError} from '#/components/forms/FormError' import {HostingProvider} from '#/components/forms/HostingProvider' import * as TextField from '#/components/forms/TextField' import {Envelope_Stroke2_Corner0_Rounded as Envelope} from '#/components/icons/Envelope' import {Lock_Stroke2_Corner0_Rounded as Lock} from '#/components/icons/Lock' import {Ticket_Stroke2_Corner0_Rounded as Ticket} from '#/components/icons/Ticket' import {Loader} from '#/components/Loader' import {BackNextButtons} from '../BackNextButtons' function sanitizeDate(date: Date): Date { if (!date || date.toString() === 'Invalid Date') { logger.error(`Create account: handled invalid date for birthDate`, { hasDate: !!date, }) return new Date() } return date } export function StepInfo({ onPressBack, isServerError, refetchServer, isLoadingStarterPack, }: { onPressBack: () => void isServerError: boolean refetchServer: () => void isLoadingStarterPack: boolean }) { const {_} = useLingui() const {state, dispatch} = useSignupContext() const inviteCodeValueRef = useRef(state.inviteCode) const emailValueRef = useRef(state.email) const passwordValueRef = useRef(state.password) const onNextPress = React.useCallback(async () => { const inviteCode = inviteCodeValueRef.current const email = emailValueRef.current const password = passwordValueRef.current if (!is13(state.dateOfBirth)) { return } if (state.serviceDescription?.inviteCodeRequired && !inviteCode) { return dispatch({ type: 'setError', value: _(msg`Please enter your invite code.`), }) } if (!email) { return dispatch({ type: 'setError', value: _(msg`Please enter your email.`), }) } if (!EmailValidator.validate(email)) { return dispatch({ type: 'setError', value: _(msg`Your email appears to be invalid.`), }) } if (!password) { return dispatch({ type: 'setError', value: _(msg`Please choose your password.`), }) } dispatch({type: 'setInviteCode', value: inviteCode}) dispatch({type: 'setEmail', value: email}) dispatch({type: 'setPassword', value: password}) dispatch({type: 'next'}) logEvent('signup:nextPressed', { activeStep: state.activeStep, }) }, [ _, dispatch, state.activeStep, state.dateOfBirth, state.serviceDescription?.inviteCodeRequired, ]) return ( Hosting provider dispatch({type: 'setServiceUrl', value: v}) } /> {state.isLoading || isLoadingStarterPack ? ( ) : state.serviceDescription ? ( <> {state.serviceDescription.inviteCodeRequired && ( Invite code { inviteCodeValueRef.current = value.trim() }} label={_(msg`Required for this provider`)} defaultValue={state.inviteCode} autoCapitalize="none" autoComplete="email" keyboardType="email-address" /> )} Email { emailValueRef.current = value.trim() }} label={_(msg`Enter your email address`)} defaultValue={state.email} autoCapitalize="none" autoComplete="email" keyboardType="email-address" /> Password { passwordValueRef.current = value }} label={_(msg`Choose your password`)} defaultValue={state.password} secureTextEntry autoComplete="new-password" autoCapitalize="none" /> Your birth date { dispatch({ type: 'setDateOfBirth', value: sanitizeDate(new Date(date)), }) }} label={_(msg`Date of birth`)} accessibilityHint={_(msg`Select your date of birth`)} /> ) : undefined} ) }