import {RouteProp} from '@react-navigation/native'; import {StackNavigationProp} from '@react-navigation/stack'; import React, {useRef, useState} from 'react'; import { Alert, KeyboardAvoidingView, Platform, StatusBar, StyleSheet, Text, TouchableOpacity, View, } from 'react-native'; import { ArrowButton, Background, RegistrationWizard, TaggInput, } from '../../components'; import {emailRegex, nameRegex} from '../../constants'; import {ERROR_NEXT_PAGE} from '../../constants/strings'; import {OnboardingStackParams} from '../../routes'; import {BackgroundGradientType} from '../../types'; type RegistrationScreenTwoRouteProp = RouteProp< OnboardingStackParams, 'RegistrationTwo' >; type RegistrationScreenTwoNavigationProp = StackNavigationProp< OnboardingStackParams, 'RegistrationTwo' >; interface RegistrationTwoProps { route: RegistrationScreenTwoRouteProp; navigation: RegistrationScreenTwoNavigationProp; } /** * Registration screen 2 for First Name and Last Name * @param navigation react-navigation navigation object */ const RegistrationTwo: React.FC = ({ route, navigation, }) => { // refs for changing focus const lnameRef = useRef(); const emailRef = useRef(); const params = route.params; const phone: string = params!.phone; /** * Handles focus change to the next input field. * @param field key for field to move focus onto */ const handleFocusChange = (field: string): void => { switch (field) { case 'lname': const lnameField: any = lnameRef.current; lnameField.focus(); break; case 'email': const emailField: any = emailRef.current; emailField.focus(); break; default: return; } }; // registration form state const [form, setForm] = useState({ fname: '', lname: '', email: '', isValidFname: false, isValidLname: false, isValidEmail: false, attemptedSubmit: false, token: '', }); /* * Handles changes to the first name field value and verifies the input by updating state and running a validation function. */ const handleFnameUpdate = (fname: string) => { fname = fname.trim(); let isValidFname: boolean = nameRegex.test(fname); setForm({ ...form, fname, isValidFname, }); }; /* * Handles changes to the last name field value and verifies the input by updating state and running a validation function. */ const handleLnameUpdate = (lname: string) => { lname = lname.trim(); let isValidLname: boolean = nameRegex.test(lname); setForm({ ...form, lname, isValidLname, }); }; /* * Handles changes to the email field value and verifies the input by updating state and running a validation function. */ const handleEmailUpdate = (email: string) => { email = email.trim(); let isValidEmail: boolean = emailRegex.test(email); setForm({ ...form, email, isValidEmail, }); }; /** * Handles a click on the "next" arrow button by navigating to RegistrationThree if First Name and Last Name are filled */ const goToRegisterThree = async () => { if (!form.attemptedSubmit) { setForm({ ...form, attemptedSubmit: true, }); } try { if (form.isValidFname && form.isValidLname && form.isValidEmail) { navigation.navigate('RegistrationThree', { firstName: form.fname, lastName: form.lname, email: form.email, phone: phone, }); } else { setForm({...form, attemptedSubmit: false}); setTimeout(() => setForm({...form, attemptedSubmit: true})); } } catch (error) { Alert.alert(ERROR_NEXT_PAGE); return { name: 'Navigation error', description: error, }; } }; const Footer = () => ( navigation.navigate('RegistrationOne')} /> ); return ( ENTER NAME handleFocusChange('lname')} blurOnSubmit={false} valid={form.isValidFname} invalidWarning="Please enter a valid first name." attemptedSubmit={form.attemptedSubmit} width={280} />