Validate TLD in signup (#5426)
* add lib * add validation * log * add some common typos * add tests * reset hasWarned state on edit * shorten path * Move test file, adjust regex, add test * Get real nit picky --------- Co-authored-by: Eric Bailey <git@esb.lol>
This commit is contained in:
@@ -15,6 +15,7 @@ export interface BackNextButtonsProps {
|
||||
onBackPress: () => void
|
||||
onNextPress?: () => void
|
||||
onRetryPress?: () => void
|
||||
overrideNextText?: string
|
||||
}
|
||||
|
||||
export function BackNextButtons({
|
||||
@@ -25,6 +26,7 @@ export function BackNextButtons({
|
||||
onBackPress,
|
||||
onNextPress,
|
||||
onRetryPress,
|
||||
overrideNextText,
|
||||
}: BackNextButtonsProps) {
|
||||
const {_} = useLingui()
|
||||
|
||||
@@ -63,7 +65,7 @@ export function BackNextButtons({
|
||||
disabled={isLoading || isNextDisabled}
|
||||
onPress={onNextPress}>
|
||||
<ButtonText>
|
||||
<Trans>Next</Trans>
|
||||
{overrideNextText ? overrideNextText : <Trans>Next</Trans>}
|
||||
</ButtonText>
|
||||
{isLoading && <ButtonIcon icon={Loader} />}
|
||||
</Button>
|
||||
|
||||
@@ -3,9 +3,11 @@ import {View} from 'react-native'
|
||||
import {msg, Trans} from '@lingui/macro'
|
||||
import {useLingui} from '@lingui/react'
|
||||
import * as EmailValidator from 'email-validator'
|
||||
import type tldts from 'tldts'
|
||||
|
||||
import {logEvent} from '#/lib/statsig/statsig'
|
||||
import {logger} from '#/logger'
|
||||
import {isEmailMaybeInvalid} from 'lib/strings/email'
|
||||
import {ScreenTransition} from '#/screens/Login/ScreenTransition'
|
||||
import {is13, is18, useSignupContext} from '#/screens/Signup/state'
|
||||
import {Policies} from '#/screens/Signup/StepInfo/Policies'
|
||||
@@ -46,13 +48,41 @@ export function StepInfo({
|
||||
|
||||
const inviteCodeValueRef = useRef<string>(state.inviteCode)
|
||||
const emailValueRef = useRef<string>(state.email)
|
||||
const prevEmailValueRef = useRef<string>(state.email)
|
||||
const passwordValueRef = useRef<string>(state.password)
|
||||
|
||||
const onNextPress = React.useCallback(async () => {
|
||||
const [hasWarnedEmail, setHasWarnedEmail] = React.useState<boolean>(false)
|
||||
|
||||
const tldtsRef = React.useRef<typeof tldts>()
|
||||
React.useEffect(() => {
|
||||
// @ts-expect-error - valid path
|
||||
import('tldts/dist/index.cjs.min.js').then(tldts => {
|
||||
tldtsRef.current = tldts
|
||||
})
|
||||
}, [])
|
||||
|
||||
const onNextPress = () => {
|
||||
const inviteCode = inviteCodeValueRef.current
|
||||
const email = emailValueRef.current
|
||||
const emailChanged = prevEmailValueRef.current !== email
|
||||
const password = passwordValueRef.current
|
||||
|
||||
if (emailChanged && tldtsRef.current) {
|
||||
if (isEmailMaybeInvalid(email, tldtsRef.current)) {
|
||||
prevEmailValueRef.current = email
|
||||
setHasWarnedEmail(true)
|
||||
return dispatch({
|
||||
type: 'setError',
|
||||
value: _(
|
||||
msg`It looks like you may have entered your email address incorrectly. Are you sure it's right?`,
|
||||
),
|
||||
})
|
||||
}
|
||||
} else if (hasWarnedEmail) {
|
||||
setHasWarnedEmail(false)
|
||||
}
|
||||
prevEmailValueRef.current = email
|
||||
|
||||
if (!is13(state.dateOfBirth)) {
|
||||
return
|
||||
}
|
||||
@@ -89,13 +119,7 @@ export function StepInfo({
|
||||
logEvent('signup:nextPressed', {
|
||||
activeStep: state.activeStep,
|
||||
})
|
||||
}, [
|
||||
_,
|
||||
dispatch,
|
||||
state.activeStep,
|
||||
state.dateOfBirth,
|
||||
state.serviceDescription?.inviteCodeRequired,
|
||||
])
|
||||
}
|
||||
|
||||
return (
|
||||
<ScreenTransition>
|
||||
@@ -148,6 +172,9 @@ export function StepInfo({
|
||||
testID="emailInput"
|
||||
onChangeText={value => {
|
||||
emailValueRef.current = value.trim()
|
||||
if (hasWarnedEmail) {
|
||||
setHasWarnedEmail(false)
|
||||
}
|
||||
}}
|
||||
label={_(msg`Enter your email address`)}
|
||||
defaultValue={state.email}
|
||||
@@ -208,6 +235,7 @@ export function StepInfo({
|
||||
onBackPress={onPressBack}
|
||||
onNextPress={onNextPress}
|
||||
onRetryPress={refetchServer}
|
||||
overrideNextText={hasWarnedEmail ? _(msg`It's correct`) : undefined}
|
||||
/>
|
||||
</ScreenTransition>
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user