import React, { Component } from 'react'; import { View, Image, TouchableOpacity } from 'react-native'; import { Icon } from 'react-native-elements'; import Biometric from './class/biometrics'; import PropTypes from 'prop-types'; import { SafeAreaView } from 'react-navigation'; /** @type {AppStorage} */ const BlueApp = require('./BlueApp'); export default class UnlockWith extends Component { state = { biometricType: false, isStorageEncrypted: false, isAuthenticating: false }; async componentDidMount() { let biometricType = false; if (await Biometric.isBiometricUseCapableAndEnabled()) { biometricType = await Biometric.biometricType(); } const isStorageEncrypted = await BlueApp.storageIsEncrypted(); this.setState({ biometricType, isStorageEncrypted }, async () => { if (!biometricType) { await BlueApp.startAndDecrypt(); this.props.onSuccessfullyAuthenticated(); } else if (typeof biometricType === 'string') this.unlockWithBiometrics(); }); } successfullyAuthenticated = () => { this.props.onSuccessfullyAuthenticated(); }; unlockWithBiometrics = () => { this.setState({ isAuthenticating: true }, async () => { if (await Biometric.unlockWithBiometrics()) { await BlueApp.startAndDecrypt(); return this.props.onSuccessfullyAuthenticated(); } this.setState({ isAuthenticating: false }); }); }; unlockWithKey = () => { this.setState({ isAuthenticating: true }, async () => { await BlueApp.startAndDecrypt(); this.props.onSuccessfullyAuthenticated(); }); }; render() { if (!this.state.biometricType && !this.state.isStorageEncrypted) { return ; } return ( {this.state.biometricType === Biometric.TouchID && ( <> )} {this.state.biometricType === Biometric.FaceID && ( <> )} {this.state.biometricType !== false && this.state.isStorageEncrypted && ( )} {this.state.isStorageEncrypted && ( <> )} ); } } UnlockWith.propTypes = { onSuccessfullyAuthenticated: PropTypes.func, };