import React, {useEffect} from 'react'; import {useTranslation} from 'react-i18next'; import {Dimensions, Image, KeyboardAvoidingView} from 'react-native'; import {MAX_PIN, PasscodeVerify} from '../components/PasscodeVerify'; import {PinInput} from '../components/PinInput'; import {Column, Text} from '../components/ui'; import {Theme} from '../components/ui/styleUtils'; import {PasscodeRouteProps} from '../routes'; import {usePasscodeScreen} from './PasscodeScreenController'; import {hashData} from '../shared/commonUtil'; import {argon2iConfig, isIOS} from '../shared/constants'; import { getEndEventData, getEventType, getImpressionEventData, resetRetryCount, sendEndEvent, sendImpressionEvent, } from '../shared/telemetry/TelemetryUtils'; import {TelemetryConstants} from '../shared/telemetry/TelemetryConstants'; import {BackHandler} from 'react-native'; import {incrementRetryCount} from '../shared/telemetry/TelemetryUtils'; import {SvgImage} from '../components/ui/svg'; export const PasscodeScreen: React.FC = props => { const {t} = useTranslation('PasscodeScreen'); const controller = usePasscodeScreen(props); const isSettingUp = props.route.params?.setup; useEffect(() => { sendImpressionEvent( getImpressionEventData( getEventType(isSettingUp), TelemetryConstants.Screens.passcode, ), ); }, [isSettingUp]); const handleBackButtonPress = () => { sendEndEvent( getEndEventData( getEventType(isSettingUp), TelemetryConstants.EndEventStatus.failure, { errorId: TelemetryConstants.ErrorId.userCancel, errorMessage: TelemetryConstants.ErrorMessage.authenticationCancelled, }, ), ); return false; }; useEffect(() => { const backHandler = BackHandler.addEventListener( 'hardwareBackPress', handleBackButtonPress, ); return () => { backHandler.remove(); }; }, []); const setPasscode = async (passcode: string) => { const data = await hashData(passcode, controller.storedSalt, argon2iConfig); controller.setPasscode(data); }; const handlePasscodeMismatch = (error: string) => { incrementRetryCount( getEventType(isSettingUp), TelemetryConstants.Screens.passcode, ); controller.setError(error); }; const passcodeSetup = controller.passcode === '' ? ( {t('header')} {controller.toggleUnlock ? t('enterAlternateNewPassword') : t('enterNewPassword')} ) : ( {t('confirmPasscode')} {controller.toggleUnlock ? t('reEnterAlternatePassword') : t('reEnterPassword')} { resetRetryCount(); controller.SETUP_PASSCODE(); }} onError={handlePasscodeMismatch} passcode={controller.passcode} salt={controller.storedSalt} /> ); const unlockPasscode = ( {t('enterPasscode')} { resetRetryCount(); controller.LOGIN(); }} onError={handlePasscodeMismatch} passcode={controller.storedPasscode} salt={controller.storedSalt} /> ); return ( {SvgImage.LockIcon()} {isSettingUp ? passcodeSetup : unlockPasscode} {controller.error} ); };