import React, { useContext, useEffect, useState } from 'react';
import { View, Image, TouchableOpacity, StyleSheet, ActivityIndicator, useColorScheme } from 'react-native';
import { Icon } from 'react-native-elements';
import Biometric from './class/biometrics';
import { SafeAreaView } from 'react-native-safe-area-context';
import { StackActions, useNavigation, useRoute } from '@react-navigation/native';
import { BlueStorageContext } from './blue_modules/storage-context';
import { isHandset } from './blue_modules/environment';
import triggerHapticFeedback, { HapticFeedbackTypes } from './blue_modules/hapticFeedback';
const styles = StyleSheet.create({
root: {
flex: 1,
},
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
},
biometricRow: {
justifyContent: 'center',
flexDirection: 'row',
},
icon: {
width: 64,
height: 64,
},
logoImage: {
width: 100,
height: 75,
alignSelf: 'center',
},
});
const UnlockWith = () => {
const { setWalletsInitialized, isStorageEncrypted, startAndDecrypt } = useContext(BlueStorageContext);
const { dispatch } = useNavigation();
const { unlockOnComponentMount } = useRoute().params;
const [biometricType, setBiometricType] = useState(false);
const [isStorageEncryptedEnabled, setIsStorageEncryptedEnabled] = useState(false);
const [isAuthenticating, setIsAuthenticating] = useState(false);
const colorScheme = useColorScheme();
useEffect(() => {
startUnlock();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
const successfullyAuthenticated = () => {
setWalletsInitialized(true);
dispatch(StackActions.replace(isHandset ? 'Navigation' : 'DrawerRoot'));
};
const unlockWithBiometrics = async () => {
if (await isStorageEncrypted()) {
unlockWithKey();
} else {
setIsAuthenticating(true);
if (await Biometric.unlockWithBiometrics()) {
setIsAuthenticating(false);
await startAndDecrypt();
return successfullyAuthenticated();
}
setIsAuthenticating(false);
}
};
const unlockWithKey = async () => {
if (isAuthenticating) return;
setIsAuthenticating(true);
if (await startAndDecrypt()) {
triggerHapticFeedback(HapticFeedbackTypes.NotificationSuccess);
successfullyAuthenticated();
} else {
setIsAuthenticating(false);
}
};
const renderUnlockOptions = () => {
if (isAuthenticating) {
return ;
} else {
const color = colorScheme === 'dark' ? '#FFFFFF' : '#000000';
if ((biometricType === Biometric.TouchID || biometricType === Biometric.Biometrics) && !isStorageEncryptedEnabled) {
return (
);
} else if (biometricType === Biometric.FaceID && !isStorageEncryptedEnabled) {
return (
);
} else if (isStorageEncryptedEnabled) {
return (
);
}
}
};
const startUnlock = async () => {
if (unlockOnComponentMount) {
const storageIsEncrypted = await isStorageEncrypted();
setIsStorageEncryptedEnabled(storageIsEncrypted);
let bt = false;
if (await Biometric.isBiometricUseCapableAndEnabled()) {
bt = await Biometric.biometricType();
}
setBiometricType(bt);
if (!biometricType || storageIsEncrypted) {
unlockWithKey();
} else if (typeof biometricType === 'string') unlockWithBiometrics();
}
};
return (
{renderUnlockOptions()}
);
};
export default UnlockWith;