import React, { Component } from 'react'; import { KeyboardAvoidingView, Platform, SegmentedControlIOS, StyleSheet, Text, TextInput, TouchableHighlight, View, } from 'react-native'; import * as Keychain from 'react-native-keychain'; const ACCESS_CONTROL_OPTIONS = ['None', 'Passcode', 'Password']; const ACCESS_CONTROL_MAP = [null, Keychain.ACCESS_CONTROL.DEVICE_PASSCODE, Keychain.ACCESS_CONTROL.APPLICATION_PASSWORD, Keychain.ACCESS_CONTROL.BIOMETRY_CURRENT_SET] export default class KeychainExample extends Component { state = { username: '', password: '', status: '', biometryType: null, accessControl: null, }; componentDidMount() { Keychain.getSupportedBiometryType().then(biometryType => { this.setState({ biometryType }); }); } async save(accessControl) { try { await Keychain.setGenericPassword( this.state.username, this.state.password, { accessControl: this.state.accessControl } ); this.setState({ username: '', password: '', status: 'Credentials saved!' }); } catch (err) { this.setState({ status: 'Could not save credentials, ' + err }); } } async load() { try { const credentials = await Keychain.getGenericPassword(); if (credentials) { this.setState({ ...credentials, status: 'Credentials loaded!' }); } else { this.setState({ status: 'No credentials stored.' }); } } catch (err) { this.setState({ status: 'Could not load credentials. ' + err }); } } async reset() { try { await Keychain.resetGenericPassword(); this.setState({ status: 'Credentials Reset!', username: '', password: '', }); } catch (err) { this.setState({ status: 'Could not reset credentials, ' + err }); } } render() { return ( Keychain Example Username this.setState({ username: event.nativeEvent.text })} underlineColorAndroid="transparent" /> Password this.setState({ password: event.nativeEvent.text })} underlineColorAndroid="transparent" /> {Platform.OS === 'ios' && ( Access Control { this.setState({ accessControl: ACCESS_CONTROL_MAP[nativeEvent.selectedSegmentIndex], }); }} /> )} {!!this.state.status && ( {this.state.status} )} this.save()} style={styles.button} > Save this.load()} style={styles.button} > Load this.reset()} style={styles.button} > Reset ); } } const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', backgroundColor: '#F5FCFF', }, content: { marginHorizontal: 20, }, title: { fontSize: 28, fontWeight: '200', textAlign: 'center', marginBottom: 20, }, field: { marginVertical: 5, }, label: { fontWeight: '500', fontSize: 15, marginBottom: 5, }, input: { borderWidth: StyleSheet.hairlineWidth, borderColor: '#ccc', backgroundColor: 'white', height: 32, fontSize: 14, padding: 8, }, status: { color: '#333', fontSize: 12, marginTop: 15, }, biometryType: { color: '#333', fontSize: 12, marginTop: 15, }, buttons: { flexDirection: 'row', justifyContent: 'space-between', marginTop: 20, }, button: { borderRadius: 3, overflow: 'hidden', }, save: { backgroundColor: '#0c0', }, load: { backgroundColor: '#333', }, reset: { backgroundColor: '#c00', }, buttonText: { color: 'white', fontSize: 14, paddingHorizontal: 16, paddingVertical: 8, }, });