// @flow import * as React from 'react'; import { Container, Content, Left, ListItem, Right, Text, List, CheckBox, Body, CardItem, Card, Picker, } from "native-base"; import CustomHeader from "../components/CustomHeader"; import ThemeManager from '../utils/ThemeManager'; import i18n from "i18n-js"; import {NavigationActions, StackActions} from "react-navigation"; import CustomMaterialIcon from "../components/CustomMaterialIcon"; import {AsyncStorage} from 'react-native' const proxiwashNotifKey = "proxiwashNotifKey"; type Props = { navigation: Object, }; type State = { nightMode: boolean, proxiwashNotifPickerSelected: string, }; /** * Class defining the Settings screen. This screen shows controls to modify app preferences. */ export default class SettingsScreen extends React.Component { state = { nightMode: ThemeManager.getInstance().getNightMode(), proxiwashNotifPickerSelected: "5" }; /** * Gets FetchedData from preferences before rendering components * * @returns {Promise} */ async componentWillMount() { let val = await AsyncStorage.getItem(proxiwashNotifKey); if (val === null) val = "5"; this.setState({ proxiwashNotifPickerSelected: val, }); } /** * Save the value for the proxiwash reminder notification time * * @param value The value to store */ onProxiwashNotifPickerValueChange(value: string) { AsyncStorage.setItem(proxiwashNotifKey, value); this.setState({ proxiwashNotifPickerSelected: value }); } /** * Returns a picker allowing the user to select the proxiwash reminder notification time * * @returns {React.Node} */ getProxiwashNotifPicker() { return ( this.onProxiwashNotifPickerValueChange(value)} > ); } /** * Toggle night mode and save it to preferences */ toggleNightMode() { ThemeManager.getInstance().setNightMode(!this.state.nightMode); this.setState({nightMode: !this.state.nightMode}); // Alert.alert(i18n.t('settingsScreen.nightMode'), i18n.t('settingsScreen.restart')); this.resetStack(); } /** * Reset react navigation stack to allow for a theme reset */ resetStack() { const resetAction = StackActions.reset({ index: 0, key: null, actions: [NavigationActions.navigate({routeName: 'Main'})], }); this.props.navigation.dispatch(resetAction); this.props.navigation.navigate('Settings'); } /** * Get a list item using a checkbox control * * @param onPressCallback The callback when the checkbox state changes * @param icon The icon name to display on the list item * @param title The text to display as this list item title * @param subtitle The text to display as this list item subtitle * @returns {React.Node} */ getToggleItem(onPressCallback: Function, icon: string, title: string, subtitle: string) { return ( {title} {subtitle} this.toggleNightMode()}/> ); } /** * Get a list item using the specified control * * @param control The custom control to use * @param icon The icon name to display on the list item * @param title The text to display as this list item title * @param subtitle The text to display as this list item subtitle * @returns {React.Node} */ static getGeneralItem(control: React.Node, icon: string, title: string, subtitle: string) { return ( {title} {subtitle} {control} ); } render() { const nav = this.props.navigation; return ( {i18n.t('settingsScreen.appearanceCard')} {this.getToggleItem(() => this.toggleNightMode(), 'theme-light-dark', i18n.t('settingsScreen.nightMode'), i18n.t('settingsScreen.nightModeSub'))} Proxiwash {SettingsScreen.getGeneralItem(this.getProxiwashNotifPicker(), 'washing-machine', i18n.t('settingsScreen.proxiwashNotifReminder'), i18n.t('settingsScreen.proxiwashNotifReminderSub'))} ); } }