Add confirm dialog to deleting all data

This commit is contained in:
Brandon Presley 2022-07-11 11:26:45 +12:00
parent 03db3cd843
commit 6b8780c62e
5 changed files with 60 additions and 44 deletions

View File

@ -1,36 +0,0 @@
import React from 'react';
import {NativeModules, Text} from 'react-native';
import {Button, Dialog, Portal} from 'react-native-paper';
export default function BatteryDialog({
show,
setShow,
}: {
show: boolean;
setShow: (show: boolean) => void;
}) {
const ok = () => {
NativeModules.AlarmModule.openBatteryOptimizations();
setShow(false);
};
return (
<Portal>
<Dialog visible={show} onDismiss={() => setShow(false)}>
<Dialog.Title>Battery optimizations</Dialog.Title>
<Dialog.Content>
<Text>
Disable battery optimizations for Massive to use rest timers.
</Text>
<Text>
Settings {'>'} Battery {'>'} Unrestricted
</Text>
</Dialog.Content>
<Dialog.Actions>
<Button onPress={ok}>Open settings</Button>
<Button onPress={() => setShow(false)}>Cancel</Button>
</Dialog.Actions>
</Dialog>
</Portal>
);
}

32
ConfirmDialog.tsx Normal file
View File

@ -0,0 +1,32 @@
import React from 'react';
import {Text} from 'react-native';
import {Button, Dialog, Portal} from 'react-native-paper';
export default function ConfirmDialog({
title,
children,
onOk,
show,
setShow,
}: {
title: string;
children: string;
onOk: () => void;
show: boolean;
setShow: (show: boolean) => void;
}) {
return (
<Portal>
<Dialog visible={show} onDismiss={() => setShow(false)}>
<Dialog.Title>{title}</Dialog.Title>
<Dialog.Content>
<Text>{children}</Text>
</Dialog.Content>
<Dialog.Actions>
<Button onPress={onOk}>OK</Button>
<Button onPress={() => setShow(false)}>Cancel</Button>
</Dialog.Actions>
</Dialog>
</Portal>
);
}

View File

@ -6,7 +6,7 @@ import {IconButton} from 'react-native-paper';
import {DrawerParamList} from './App'; import {DrawerParamList} from './App';
import EditSet from './EditSet'; import EditSet from './EditSet';
import Set from './set'; import Set from './set';
import SetsPage from './SetsPage'; import SetList from './SetList';
const Stack = createStackNavigator<StackParams>(); const Stack = createStackNavigator<StackParams>();
export type StackParams = { export type StackParams = {
@ -22,7 +22,7 @@ export default function HomePage() {
return ( return (
<Stack.Navigator <Stack.Navigator
screenOptions={{headerShown: false, animationEnabled: false}}> screenOptions={{headerShown: false, animationEnabled: false}}>
<Stack.Screen name="Sets" component={SetsPage} /> <Stack.Screen name="Sets" component={SetList} />
<Stack.Screen <Stack.Screen
name="EditSet" name="EditSet"
component={EditSet} component={EditSet}

View File

@ -14,7 +14,7 @@ import SetItem from './SetItem';
const limit = 15; const limit = 15;
export default function SetsPage() { export default function SetList() {
const [sets, setSets] = useState<Set[]>(); const [sets, setSets] = useState<Set[]>();
const [offset, setOffset] = useState(0); const [offset, setOffset] = useState(0);
const [search, setSearch] = useState(''); const [search, setSearch] = useState('');
@ -33,7 +33,7 @@ export default function SetsPage() {
const refresh = useCallback(async () => { const refresh = useCallback(async () => {
const [result] = await db.executeSql(selectSets, [`%${search}%`, limit, 0]); const [result] = await db.executeSql(selectSets, [`%${search}%`, limit, 0]);
if (!result) return setSets([]); if (!result) return setSets([]);
console.log(`${SetsPage.name}.refresh:`, {search, limit}); console.log(`${SetList.name}.refresh:`, {search, limit});
setSets(result.rows.raw()); setSets(result.rows.raw());
setOffset(0); setOffset(0);
setEnd(false); setEnd(false);
@ -66,7 +66,7 @@ export default function SetsPage() {
if (end) return; if (end) return;
setRefreshing(true); setRefreshing(true);
const newOffset = offset + limit; const newOffset = offset + limit;
console.log(`${SetsPage.name}.next:`, { console.log(`${SetList.name}.next:`, {
offset, offset,
limit, limit,
newOffset, newOffset,

View File

@ -13,6 +13,7 @@ import {DatabaseContext} from './App';
import BatteryDialog from './BatteryDialog'; import BatteryDialog from './BatteryDialog';
import Set from './set'; import Set from './set';
import DocumentPicker from 'react-native-document-picker'; import DocumentPicker from 'react-native-document-picker';
import ConfirmDialog from './ConfirmDialog';
const {getItem, setItem} = AsyncStorage; const {getItem, setItem} = AsyncStorage;
@ -24,6 +25,7 @@ export default function SettingsPage() {
const [predictiveSets, setPredictiveSets] = useState<boolean>(false); const [predictiveSets, setPredictiveSets] = useState<boolean>(false);
const [snackbar, setSnackbar] = useState(''); const [snackbar, setSnackbar] = useState('');
const [showBattery, setShowBattery] = useState(false); const [showBattery, setShowBattery] = useState(false);
const [showDelete, setShowDelete] = useState(false);
const [ignoring, setIgnoring] = useState(false); const [ignoring, setIgnoring] = useState(false);
const [timeoutId, setTimeoutId] = useState(0); const [timeoutId, setTimeoutId] = useState(0);
const db = useContext(DatabaseContext); const db = useContext(DatabaseContext);
@ -51,6 +53,7 @@ export default function SettingsPage() {
); );
const clear = useCallback(async () => { const clear = useCallback(async () => {
setShowDelete(false);
await db.executeSql(`DELETE FROM sets`); await db.executeSql(`DELETE FROM sets`);
toast('All data has been deleted!'); toast('All data has been deleted!');
}, [db, toast]); }, [db, toast]);
@ -165,6 +168,17 @@ export default function SettingsPage() {
onValueChange={changeAlarmEnabled} onValueChange={changeAlarmEnabled}
/> />
<ConfirmDialog
title="Battery optimizations"
show={showBattery}
setShow={setShowBattery}
onOk={() => {
NativeModules.AlarmModule.openBatteryOptimizations();
setShowBattery(false);
}}>
Disable battery optimizations for Massive to use rest timers.
</ConfirmDialog>
<Text style={styles.text}>Predictive sets</Text> <Text style={styles.text}>Predictive sets</Text>
<Switch <Switch
style={[styles.text, {alignSelf: 'flex-start'}]} style={[styles.text, {alignSelf: 'flex-start'}]}
@ -187,13 +201,19 @@ export default function SettingsPage() {
</Button> </Button>
<Button <Button
style={{alignSelf: 'flex-start', marginTop: 'auto'}} style={{alignSelf: 'flex-start'}}
icon="trash" icon="trash"
onPress={clear}> onPress={() => setShowDelete(true)}>
Delete all data Delete all data
</Button> </Button>
<BatteryDialog show={showBattery} setShow={setShowBattery} /> <ConfirmDialog
title="Delete all data"
show={showDelete}
setShow={setShowDelete}
onOk={clear}>
This irreversibly deletes all data from the app. Are you sure?
</ConfirmDialog>
<Snackbar <Snackbar
visible={!!snackbar} visible={!!snackbar}