import React, {useState, useRef} from 'react'; import {RouteProp} from '@react-navigation/native'; import {StackNavigationProp} from '@react-navigation/stack'; import { View, Text, StyleSheet, StatusBar, Alert, Platform, KeyboardAvoidingView, } from 'react-native'; import {OnboardingStackParams} from '../../routes'; import { ArrowButton, TaggInput, Background, LoadingIndicator, SubmitButton, } from '../../components'; import {trackPromise} from 'react-promise-tracker'; import {passwordRegex} from '../../constants'; import {handlePasswordReset} from '../../services'; import {BackgroundGradientType} from '../../types'; type PasswordResetRequestRouteProp = RouteProp< OnboardingStackParams, 'PasswordReset' >; type PasswordResetRequestNavigationProp = StackNavigationProp< OnboardingStackParams, 'PasswordReset' >; interface PasswordResetRequestProps { route: PasswordResetRequestRouteProp; navigation: PasswordResetRequestNavigationProp; } /** * Password reset page * @param navigation react-navigation navigation object */ const PasswordResetRequest: React.FC = ({ route, navigation, }) => { const passwordRef = useRef(); const confirmRef = useRef(); const {value} = route.params; /** * Handles focus change to the next input field. * @param field key for field to move focus onto */ const handleFocusChange = (): void => { const confirmField: any = confirmRef.current; confirmField.focus(); }; const [form, setForm] = useState({ password: '', confirm: '', isValidPassword: false, passwordsMatch: false, attemptedSubmit: false, }); const handlePasswordUpdate = (password: string) => { let isValidPassword: boolean = passwordRegex.test(password); let passwordsMatch: boolean = form.password === form.confirm; setForm({ ...form, password, isValidPassword, passwordsMatch, }); }; const handleConfirmUpdate = (confirm: string) => { let passwordsMatch: boolean = form.password === confirm; setForm({ ...form, confirm, passwordsMatch, }); }; const handleSubmit = async () => { if (!form.attemptedSubmit) { setForm({ ...form, attemptedSubmit: true, }); } try { if (form.isValidPassword && form.passwordsMatch) { const success = await trackPromise( handlePasswordReset(value, form.password), ); if (success) { navigation.navigate('Login'); } } else { setForm({...form, attemptedSubmit: false}); setTimeout(() => setForm({...form, attemptedSubmit: true})); } } catch (error) { Alert.alert( 'Looks like our servers are down. 😓', "Try again in a couple minutes. We're sorry for the inconvenience.", ); return { name: 'Verify Password error', description: error, }; } }; /** * Reset Password Button. */ const ResetPasswordButton = () => ( ); const Footer = () => ( navigation.navigate('Login')} /> ); return ( Enter your new password handleFocusChange} blurOnSubmit={false} secureTextEntry ref={passwordRef} valid={form.isValidPassword} invalidWarning={ 'Password must be at least 8 characters & contain at least one of a-z, A-Z, 0-9, and a special character.' } attemptedSubmit={form.attemptedSubmit} width={280} />