import React from 'react'; import PropTypes from 'prop-types'; import { StyleSheet, View, Switch, ScrollView } from 'react-native'; import { SafeAreaView } from 'react-navigation'; import { connect } from 'react-redux'; import RNUserDefaults from 'rn-user-defaults'; import I18n from '../i18n'; import { themedHeader } from '../utils/navigation'; import { withTheme } from '../theme'; import { themes, SWITCH_TRACK_COLOR } from '../constants/colors'; import sharedStyles from './Styles'; import StatusBar from '../containers/StatusBar'; import Separator from '../containers/Separator'; import ListItem from '../containers/ListItem'; import ItemInfo from '../containers/ItemInfo'; import { CustomIcon } from '../lib/Icons'; import database from '../lib/database'; import { supportedBiometryLabel } from '../utils/localAuthentication'; import { DisclosureImage } from '../containers/DisclosureIndicator'; import { PASSCODE_KEY } from '../constants/localAuthentication'; const styles = StyleSheet.create({ listPadding: { paddingVertical: 36 } }); class ScreenLockConfigView extends React.Component { static navigationOptions = ({ screenProps }) => ({ title: I18n.t('Screen_lock'), ...themedHeader(screenProps.theme) }) static propTypes = { theme: PropTypes.string, server: PropTypes.string, navigation: PropTypes.object } defaultAutoLockOptions = [ { title: I18n.t('Local_authentication_auto_lock_60'), value: 60 }, { title: I18n.t('Local_authentication_auto_lock_300'), value: 300 }, { title: I18n.t('Local_authentication_auto_lock_900'), value: 900 }, { title: I18n.t('Local_authentication_auto_lock_1800'), value: 1800 }, { title: I18n.t('Local_authentication_auto_lock_3600'), value: 3600 } ]; constructor(props) { super(props); this.state = { autoLock: false, autoLockTime: null, biometry: true, biometryLabel: null }; this.init(); } init = async() => { const { server } = this.props; const serversDB = database.servers; const serversCollection = serversDB.collections.get('servers'); try { this.serverRecord = await serversCollection.find(server); this.setState({ autoLock: this.serverRecord?.autoLock, autoLockTime: this.serverRecord?.autoLockTime || 1800, biometry: this.serverRecord.biometry === null ? true : this.serverRecord.biometry }); } catch (error) { // Do nothing } const biometryLabel = await supportedBiometryLabel(); this.setState({ biometryLabel }); } save = async() => { const { autoLock, autoLockTime, biometry } = this.state; const serversDB = database.servers; await serversDB.action(async() => { await this.serverRecord?.update((record) => { record.autoLock = autoLock; record.autoLockTime = autoLockTime; record.biometry = biometry === null ? true : biometry; }); }); } setPasscode = async() => { const { autoLock } = this.state; const { navigation } = this.props; if (autoLock) { const storedPasscode = await RNUserDefaults.get(PASSCODE_KEY); if (!storedPasscode) { navigation.navigate('ChangePasscodeView', { forceSetPasscode: true }); } } } autoLock = () => { this.setState(({ autoLock }) => ({ autoLock: !autoLock }), () => { this.save(); this.setPasscode(); }); } toggleBiometry = () => { this.setState(({ biometry }) => ({ biometry: !biometry }), () => this.save()); } isSelected = (value) => { const { autoLockTime } = this.state; return autoLockTime === value; } changeAutoLockTime = (autoLockTime) => { this.setState({ autoLockTime }, () => this.save()); } changePasscode = () => { const { navigation } = this.props; navigation.navigate('ChangePasscodeView'); } renderSeparator = () => { const { theme } = this.props; return ; } renderIcon = () => { const { theme } = this.props; return ; } renderItem = ({ item }) => { const { theme } = this.props; const { title, value } = item; return ( <> this.changeAutoLockTime(value)} right={this.isSelected(value) ? this.renderIcon : null} theme={theme} /> ); } renderAutoLockSwitch = () => { const { autoLock } = this.state; return ( ); } renderBiometrySwitch = () => { const { biometry } = this.state; return ( ); } renderAutoLockItems = () => { const { autoLock } = this.state; const { theme } = this.props; if (!autoLock) { return null; } return ( <> {autoLock ? this.defaultAutoLockOptions.map(item => this.renderItem({ item })) : null} ); } renderDisclosure = () => { const { theme } = this.props; return ; } renderBiometry = () => { const { autoLock, biometryLabel } = this.state; const { theme } = this.props; if (!autoLock || !biometryLabel) { return null; } return ( <> this.renderBiometrySwitch()} theme={theme} /> ); } render() { const { autoLock } = this.state; const { theme } = this.props; return ( item.value} contentContainerStyle={styles.listPadding} > this.renderAutoLockSwitch()} theme={theme} /> {autoLock ? ( <> ) : null } {this.renderBiometry()} {this.renderAutoLockItems()} ); } } const mapStateToProps = state => ({ server: state.server.server }); export default connect(mapStateToProps)(withTheme(ScreenLockConfigView));