/* global alert */ import React, { useEffect, useState, useCallback, useContext } from 'react'; import { ScrollView, Alert, Platform, TouchableOpacity, TouchableWithoutFeedback, StyleSheet } from 'react-native'; import { useNavigation } from '@react-navigation/native'; import ReactNativeHapticFeedback from 'react-native-haptic-feedback'; import { colors } from 'react-native-elements'; import navigationStyle from '../../components/navigationStyle'; import { BlueLoading, SafeBlueArea, BlueSpacing20, BlueCard, BlueListItem, BlueHeaderDefaultSubHooks, BlueText, } from '../../BlueComponents'; import Biometric from '../../class/biometrics'; import loc from '../../loc'; import { BlueStorageContext } from '../../blue_modules/storage-context'; import { isCatalyst } from '../../blue_modules/environment'; const prompt = require('../../blue_modules/prompt'); const EncryptStorage = () => { const { isStorageEncrypted, setResetOnAppUninstallTo, encryptStorage, isDeleteWalletAfterUninstallEnabled, decryptStorage, saveToDisk, } = useContext(BlueStorageContext); const [isLoading, setIsLoading] = useState(true); const [deleteWalletsAfterUninstall, setDeleteWalletsAfterUninstall] = useState(false); const [biometrics, setBiometrics] = useState({ isDeviceBiometricCapable: false, isBiometricsEnabled: false, biometricsType: '' }); const [storageIsEncryptedSwitchEnabled, setStorageIsEncryptedSwitchEnabled] = useState(false); const { navigate, popToTop } = useNavigation(); const styles = StyleSheet.create({ root: { flex: 1, backgroundColor: colors.background, }, }); const initialState = useCallback(async () => { const isBiometricsEnabled = await Biometric.isBiometricUseEnabled(); const isDeviceBiometricCapable = await Biometric.isDeviceBiometricCapable(); const biometricsType = (await Biometric.biometricType()) || loc.settings.biometrics; const deleteWalletsAfterUninstall = await isDeleteWalletAfterUninstallEnabled(); const isStorageEncryptedSwitchEnabled = await isStorageEncrypted(); setStorageIsEncryptedSwitchEnabled(isStorageEncryptedSwitchEnabled); setDeleteWalletsAfterUninstall(deleteWalletsAfterUninstall); setBiometrics({ isBiometricsEnabled, isDeviceBiometricCapable, biometricsType }); setIsLoading(false); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { initialState(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const handleDecryptStorage = async () => { const password = await prompt(loc.settings.password, loc._.storage_is_encrypted).catch(() => { setIsLoading(false); }); try { await decryptStorage(password); await saveToDisk(); popToTop(); } catch (e) { if (password) { alert(loc._.bad_password); ReactNativeHapticFeedback.trigger('notificationError', { ignoreAndroidSystemSettings: false }); } setIsLoading(false); setStorageIsEncryptedSwitchEnabled(await isStorageEncrypted()); setDeleteWalletsAfterUninstall(await isDeleteWalletAfterUninstallEnabled()); } // eslint-disable-next-line react-hooks/exhaustive-deps }; const onDeleteWalletsAfterUninstallSwitch = async value => { await setResetOnAppUninstallTo(value); setDeleteWalletsAfterUninstall(value); // eslint-disable-next-line react-hooks/exhaustive-deps }; const onEncryptStorageSwitch = async value => { setIsLoading(true); if (value === true) { let p1 = await prompt(loc.settings.password, loc.settings.password_explain).catch(() => { setIsLoading(false); p1 = undefined; }); if (!p1) { setIsLoading(false); return; } const p2 = await prompt(loc.settings.password, loc.settings.retype_password).catch(() => { setIsLoading(false); }); if (p1 === p2) { await encryptStorage(p1); setIsLoading(false); setStorageIsEncryptedSwitchEnabled(await isStorageEncrypted()); saveToDisk(); } else { setIsLoading(false); alert(loc.settings.passwords_do_not_match); } } else { Alert.alert( loc.settings.encrypt_decrypt, loc.settings.encrypt_decrypt_q, [ { text: loc._.cancel, style: 'cancel', onPress: () => setIsLoading(false), }, { text: loc._.ok, style: 'destructive', onPress: handleDecryptStorage, }, ], { cancelable: false }, ); } // eslint-disable-next-line react-hooks/exhaustive-deps }; const onUseBiometricSwitch = async value => { const isBiometricsEnabled = { isDeviceBiometricCapable: biometrics.isDeviceBiometricCapable, isBiometricsEnabled: biometrics.isBiometricsEnabled, biometricsType: biometrics.biometricsType, }; if (await Biometric.unlockWithBiometrics()) { isBiometricsEnabled.isBiometricsEnabled = value; await Biometric.setBiometricUseEnabled(value); setBiometrics(isBiometricsEnabled); } // eslint-disable-next-line react-hooks/exhaustive-deps }; const navigateToPlausibleDeniability = () => { navigate('PlausibleDeniability'); }; return isLoading ? ( ) : ( {biometrics.isDeviceBiometricCapable && ( <> {loc.formatString(loc.settings.encrypt_use_expl, { type: biometrics.biometricsType })} )} {Platform.OS === 'ios' && !isCatalyst && ( )} {storageIsEncryptedSwitchEnabled && ( )} ); }; export default EncryptStorage; EncryptStorage.navigationOptions = navigationStyle({ headerTitle: loc.settings.encrypt_title, });