Files
inji-wallet/screens/PasscodeScreen.tsx
jaswanthkumartw edefef6c5d Injimob-3651: update the new branding changes (#2154)
* [INJIMOB-3622]: add the new branding changes

Signed-off-by: jaswanthkumarpolisetty <jaswanthkumar.p@thoughtworks.com>

* [INJIMOB-3651]: update the new branding changes

Signed-off-by: jaswanthkumarpolisetty <jaswanthkumar.p@thoughtworks.com>

* [INJIMOB-3651]: update the new snapshots

Signed-off-by: jaswanthkumarpolisetty <jaswanthkumar.p@thoughtworks.com>

* [INJIMOB-3651]: update the changes mentioned deskcheck

Signed-off-by: jaswanthkumarpolisetty <jaswanthkumar.p@thoughtworks.com>

---------

Signed-off-by: jaswanthkumarpolisetty <jaswanthkumar.p@thoughtworks.com>
Signed-off-by: jaswanthkumartw <jaswanthkumar.p@thoughtworks.com>
2025-12-01 15:03:41 +05:30

192 lines
5.4 KiB
TypeScript

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<PasscodeRouteProps> = 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 === '' ? (
<Column align="space-between">
<Text
testID="setPasscodeHeader"
align="center"
size={'large'}
style={{...Theme.TextStyles.header, paddingTop: 27}}>
{t('header')}
</Text>
<Text
testID="setPasscodeDescription"
align="center"
style={{
paddingTop: 3,
marginTop: 6,
marginBottom: Dimensions.get('screen').height * 0.1,
}}
size={'mediumExtraSmall'}
weight="semibold"
color={Theme.Colors.GrayText}>
{controller.toggleUnlock
? t('enterAlternateNewPassword')
: t('enterNewPassword')}
</Text>
<PinInput
testID="setPasscodePin"
length={MAX_PIN}
onDone={setPasscode}
autosubmit={true}
/>
</Column>
) : (
<Column align="space-between">
<Text
testID="confirmPasscodeHeader"
align="center"
size={'large'}
style={{...Theme.TextStyles.header, paddingTop: 27}}>
{t('confirmPasscode')}
</Text>
<Text
testID="confirmPasscodeDescription"
align="center"
size={'mediumExtraSmall'}
style={{
paddingTop: 3,
marginTop: 6,
marginBottom: Dimensions.get('screen').height * 0.1,
}}
weight="semibold"
color={Theme.Colors.GrayText}>
{controller.toggleUnlock
? t('reEnterAlternatePassword')
: t('reEnterPassword')}
</Text>
<PasscodeVerify
testID="confirmPasscodePin"
onSuccess={() => {
resetRetryCount();
controller.SETUP_PASSCODE();
}}
onError={handlePasscodeMismatch}
passcode={controller.passcode}
salt={controller.storedSalt}
/>
</Column>
);
const unlockPasscode = (
<Column align="space-between">
<Text
testID="enterPasscode"
style={{
paddingTop: 3,
marginTop: 6,
marginBottom: Dimensions.get('screen').height * 0.1,
}}
size={'large'}
align="center"
weight="semibold"
color={Theme.Colors.GrayText}>
{t('enterPasscode')}
</Text>
<PasscodeVerify
testID="enterPasscodePin"
onSuccess={() => {
resetRetryCount();
controller.LOGIN();
}}
onError={handlePasscodeMismatch}
passcode={controller.storedPasscode}
salt={controller.storedSalt}
/>
</Column>
);
return (
<KeyboardAvoidingView
style={Theme.Styles.passwordKeyboardAvoidStyle}
behavior={isIOS() ? 'padding' : 'height'}>
{SvgImage.LockIcon()}
<Column>
{isSettingUp ? passcodeSetup : unlockPasscode}
<Text
testID="PasscodeError"
align="center"
color={Theme.Colors.errorMessage}>
{controller.error}
</Text>
</Column>
</KeyboardAvoidingView>
);
};