import {RouteProp} from '@react-navigation/native'; import {StackNavigationProp} from '@react-navigation/stack'; import React from 'react'; import { Alert, KeyboardAvoidingView, Platform, StyleSheet, TouchableOpacity, View, } from 'react-native'; import {Text} from 'react-native-animatable'; import { CodeField, Cursor, useBlurOnFulfill, useClearByFocusCell, } from 'react-native-confirmation-code-field'; import {trackPromise} from 'react-promise-tracker'; import { ArrowButton, Background, LoadingIndicator, RegistrationWizard, SubmitButton, } from '../../components'; import {codeRegex} from '../../constants'; import { ERROR_INVALID_VERIFICATION_CODE_FORMAT, ERROR_SOMETHING_WENT_WRONG, } from '../../constants/strings'; import {OnboardingStackParams} from '../../routes'; import { handlePasswordCodeVerification, handlePasswordResetRequest, sendOtp, verifyOtp, } from '../../services'; import {BackgroundGradientType, VerificationScreenType} from '../../types'; type VerificationScreenRouteProp = RouteProp< OnboardingStackParams, 'Verification' >; type VerificationScreenNavigationProp = StackNavigationProp< OnboardingStackParams, 'Verification' >; interface VerificationProps { route: VerificationScreenRouteProp; navigation: VerificationScreenNavigationProp; } const Verification: React.FC = ({route, navigation}) => { const [value, setValue] = React.useState(''); const ref = useBlurOnFulfill({value, cellCount: 6}); const [valueProps, getCellOnLayoutHandler] = useClearByFocusCell({ value, setValue, }); const {id, screenType} = route.params; const isPhoneVerification = screenType === VerificationScreenType.Phone; const handlePhoneVerification = async () => { const success = await trackPromise(verifyOtp(id, value)); if (success) { navigation.navigate('RegistrationTwo', {phone: id}); } }; const handlePasswordVerification = async () => { const success = await trackPromise( handlePasswordCodeVerification(id, value), ); if (success) { navigation.navigate('PasswordReset', {value: id}); } }; /** * Sends the verify_otp request upon tapping the Verify button. * If successful, it navigates to the respected page. */ const handleVerification = async () => { if (codeRegex.test(value)) { try { switch (screenType) { case VerificationScreenType.Phone: handlePhoneVerification(); break; case VerificationScreenType.Password: handlePasswordVerification(); break; } } catch (error) { console.log(error); Alert.alert(ERROR_SOMETHING_WENT_WRONG); } } else { Alert.alert(ERROR_INVALID_VERIFICATION_CODE_FORMAT); } }; /** * Sends the send_otp request so to provide a new verification code upon tapping the Resend Code button. */ const handleResend = async () => { try { switch (screenType) { case VerificationScreenType.Phone: trackPromise(sendOtp(id)); break; case VerificationScreenType.Password: trackPromise(handlePasswordResetRequest(id)); break; } } catch (error) { console.log(error); Alert.alert(ERROR_SOMETHING_WENT_WRONG); } }; const handleGoBack = () => { switch (screenType) { case VerificationScreenType.Phone: navigation.navigate('RegistrationOne'); break; case VerificationScreenType.Password: navigation.navigate('PasswordResetRequest'); break; } }; const Footer = () => ( handleGoBack()} /> ); return ( {isPhoneVerification ? ( ) : ( )} Enter 6 digit code We sent a 6 digit verification code to the phone number you provided. ( {symbol || (isFocused ? : null)} )} /> Resend Code