import AsyncStorage from '@react-native-async-storage/async-storage'; import React, { ReactNode, useCallback, useEffect, useMemo, useState, } from 'react'; import { NativeModules, StyleSheet, Text, ToastAndroid, View, } from 'react-native'; import {Searchbar, TextInput} from 'react-native-paper'; import ConfirmDialog from './ConfirmDialog'; import MassiveSwitch from './MassiveSwitch'; const {getItem, setItem} = AsyncStorage; export default function SettingsPage() { const [vibrate, setVibrate] = useState(true); const [minutes, setMinutes] = useState(''); const [maxSets, setMaxSets] = useState('3'); const [seconds, setSeconds] = useState(''); const [alarm, setAlarm] = useState(false); const [predictive, setPredictive] = useState(false); const [battery, setBattery] = useState(false); const [ignoring, setIgnoring] = useState(false); const [search, setSearch] = useState(''); const refresh = useCallback(async () => { setMinutes((await getItem('minutes')) || ''); setSeconds((await getItem('seconds')) || ''); setAlarm((await getItem('alarmEnabled')) === 'true'); setPredictive((await getItem('predictiveSets')) === 'true'); setMaxSets((await getItem('maxSets')) || ''); NativeModules.AlarmModule.ignoringBattery(setIgnoring); }, []); useEffect(() => { refresh(); }, [refresh]); const changeAlarmEnabled = useCallback( (enabled: boolean) => { setAlarm(enabled); if (enabled && !ignoring) setBattery(true); setItem('alarmEnabled', enabled ? 'true' : 'false'); }, [setBattery, ignoring], ); const changePredictive = useCallback( (enabled: boolean) => { setPredictive(enabled); setItem('predictiveSets', enabled ? 'true' : 'false'); ToastAndroid.show( 'Predictive sets guess whats next based on todays plan.', ToastAndroid.LONG, ); }, [setPredictive], ); const changeVibrate = useCallback( (value: boolean) => { setVibrate(value); setItem('vibrate', value ? 'true' : 'false'); }, [setVibrate], ); const items: {name: string; element: ReactNode}[] = [ { name: 'Sets per workout', element: ( { setMaxSets(value); setItem('maxSets', value); }} style={styles.text} selectTextOnFocus /> ), }, { name: 'Rest seconds', element: ( { setSeconds(s); setItem('seconds', s); }} style={styles.text} selectTextOnFocus /> ), }, { name: 'Rest minutes', element: ( { setMinutes(text); setItem('minutes', text); }} style={styles.text} selectTextOnFocus /> ), }, { name: 'Rest timers', element: ( <> Rest timers ), }, { name: 'Vibrate', element: ( <> Vibrate ), }, { name: 'Predictive sets', element: ( <> Predictive sets ), }, ]; return ( {items .filter(item => item.name.toLowerCase().includes(search.toLowerCase())) .map(item => ( {item.element} ))} { NativeModules.AlarmModule.openSettings(); setBattery(false); }}> Disable battery optimizations for Massive to use rest timers. ); } const styles = StyleSheet.create({ container: { padding: 10, flex: 1, }, text: { marginBottom: 10, }, });