From 0bc644a1ba978fec7576487201c67f7135019b2e Mon Sep 17 00:00:00 2001 From: Brandon Presley Date: Wed, 21 Sep 2022 13:48:45 +1200 Subject: [PATCH] Add setting to show/hide unit field Closes #34 --- BestList.tsx | 7 ++----- EditSet.tsx | 6 ++---- SetForm.tsx | 17 ++++++++++------- SetList.tsx | 8 ++++---- SettingsPage.tsx | 45 ++++++++++++++++++++++++++++----------------- db.ts | 7 +++++++ settings.service.ts | 5 +++-- settings.ts | 1 + 8 files changed, 57 insertions(+), 39 deletions(-) diff --git a/BestList.tsx b/BestList.tsx index e30ea40..069cceb 100644 --- a/BestList.tsx +++ b/BestList.tsx @@ -10,17 +10,14 @@ import {getBestReps, getBestWeights} from './best.service'; import {BestPageParams} from './BestPage'; import Page from './Page'; import Set from './set'; -import Settings from './settings'; -import {getSettings} from './settings.service'; +import {settings} from './settings.service'; export default function BestList() { const [bests, setBests] = useState([]); const [search, setSearch] = useState(''); - const [settings, setSettings] = useState(); const navigation = useNavigation>(); const refresh = useCallback(async () => { - getSettings().then(setSettings); const weights = await getBestWeights(search); console.log(`${BestList.name}.refresh:`, {length: weights.length}); let newBest: Set[] = []; @@ -51,7 +48,7 @@ export default function BestList() { description={`${item.reps} x ${item.weight}${item.unit || 'kg'}`} onPress={() => navigation.navigate('ViewBest', {best: item})} left={() => - (settings?.images && item.image && ( + (settings.images && item.image && ( )) || null diff --git a/EditSet.tsx b/EditSet.tsx index d113e97..923ad6c 100644 --- a/EditSet.tsx +++ b/EditSet.tsx @@ -13,7 +13,7 @@ import {SnackbarContext} from './MassiveSnack'; import Set from './set'; import {addSet, updateSet} from './set.service'; import SetForm from './SetForm'; -import {getSettings} from './settings.service'; +import {settings} from './settings.service'; export default function EditSet() { const {params} = useRoute>(); @@ -34,7 +34,6 @@ export default function EditSet() { ); const startTimer = useCallback(async (set: Set) => { - const settings = await getSettings(); if (!settings.alarm) return; const milliseconds = Number(set.minutes) * 60 * 1000 + Number(set.seconds) * 1000; @@ -59,8 +58,7 @@ export default function EditSet() { console.log(`${EditSet.name}.add`, {set}); startTimer(set); await addSet(set); - const settings = await getSettings(); - if (settings.notify === 0) return navigation.goBack(); + if (!settings.notify) return navigation.goBack(); if ( set.weight > params.set.weight || (set.reps > params.set.reps && set.weight === params.set.weight) diff --git a/SetForm.tsx b/SetForm.tsx index 8cccf6b..3cd3ab6 100644 --- a/SetForm.tsx +++ b/SetForm.tsx @@ -4,6 +4,7 @@ import {Button} from 'react-native-paper'; import MassiveInput from './MassiveInput'; import Set from './set'; import {getSets} from './set.service'; +import {settings} from './settings.service'; export default function SetForm({ save, @@ -81,13 +82,15 @@ export default function SetForm({ onSubmitEditing={() => unitRef.current?.focus()} innerRef={weightRef} /> - + {!!settings.showUnit && ( + + )} {workouts && ( { - const settings = await getSettings(); - if (!settings.predict) return; + console.log(`${SetList.name}.predict:`, {settings}); + if (!settings.predict) return setSet({...defaultSet}); const todaysPlan = await getTodaysPlan(); console.log(`${SetList.name}.predict:`, {todaysPlan}); if (todaysPlan.length === 0) return; @@ -78,7 +78,7 @@ export default function SetList() { navigation.getParent()?.setOptions({ headerRight: () => , }); - getSettings().then(settings => setImages(!!settings.images)); + setImages(!!settings.images); }, [refresh, predict, navigation]), ); diff --git a/SettingsPage.tsx b/SettingsPage.tsx index 59ded19..6a74214 100644 --- a/SettingsPage.tsx +++ b/SettingsPage.tsx @@ -1,3 +1,4 @@ +import {useFocusEffect} from '@react-navigation/native'; import React, {useCallback, useContext, useEffect, useState} from 'react'; import {NativeModules, ScrollView} from 'react-native'; import DocumentPicker from 'react-native-document-picker'; @@ -7,7 +8,7 @@ import {MARGIN} from './constants'; import {SnackbarContext} from './MassiveSnack'; import MassiveSwitch from './MassiveSwitch'; import Page from './Page'; -import {getSettings, updateSettings} from './settings.service'; +import {getSettings, settings, updateSettings} from './settings.service'; interface Input { name: string; @@ -25,23 +26,21 @@ export default function SettingsPage() { const [battery, setBattery] = useState(false); const [ignoring, setIgnoring] = useState(false); const [search, setSearch] = useState(''); + const [showUnit, setShowUnit] = useState(true); const {toast} = useContext(SnackbarContext); - const refresh = useCallback(async () => { - const settings = await getSettings(); - console.log('SettingsPage.refresh:', {settings}); - setAlarm(!!settings.alarm); - setPredict(!!settings.predict); - setVibrate(!!settings.vibrate); - setSound(settings.sound); - setNotify(!!settings.notify); - setImages(!!settings.images); - NativeModules.AlarmModule.ignoringBattery(setIgnoring); - }, []); - - useEffect(() => { - refresh(); - }, [refresh]); + useFocusEffect( + useCallback(() => { + console.log('SettingsPage.refresh:', {settings}); + setAlarm(!!settings.alarm); + setPredict(!!settings.predict); + setVibrate(!!settings.vibrate); + setSound(settings.sound); + setNotify(!!settings.notify); + setImages(!!settings.images); + NativeModules.AlarmModule.ignoringBattery(setIgnoring); + }, []), + ); useEffect(() => { updateSettings({ @@ -51,8 +50,10 @@ export default function SettingsPage() { sound, notify: +notify, images: +images, + showUnit: +showUnit, }); - }, [vibrate, alarm, predict, sound, notify, images]); + getSettings(); + }, [vibrate, alarm, predict, sound, notify, images, showUnit]); const changeAlarmEnabled = useCallback( (enabled: boolean) => { @@ -110,12 +111,22 @@ export default function SettingsPage() { [toast], ); + const changeUnit = useCallback( + (enabled: boolean) => { + setShowUnit(enabled); + if (enabled) toast('Show option to select unit for sets.', 4000); + else toast('Hid the unit option when adding/editing sets.', 4000); + }, + [toast], + ); + const switches: Input[] = [ {name: 'Rest timers', value: alarm, onChange: changeAlarmEnabled}, {name: 'Vibrate', value: vibrate, onChange: changeVibrate}, {name: 'Predict sets', value: predict, onChange: changePredict}, {name: 'Record notifications', value: notify, onChange: changeNotify}, {name: 'Show images', value: images, onChange: changeImages}, + {name: 'Show unit', value: showUnit, onChange: changeUnit}, ]; return ( diff --git a/db.ts b/db.ts index 0ff8b8c..e9ca686 100644 --- a/db.ts +++ b/db.ts @@ -3,6 +3,7 @@ import { openDatabase, SQLiteDatabase, } from 'react-native-sqlite-storage'; +import {getSettings} from './settings.service'; enablePromise(true); @@ -103,6 +104,10 @@ const addSeconds = ` ALTER TABLE sets ADD COLUMN seconds INTEGER NOT NULL DEFAULT 30 `; +const addShowUnit = ` + ALTER TABLE settings ADD COLUMN showUnit BOOLEAN DEFAULT true; +`; + export let db: SQLiteDatabase; export const migrations = async () => { @@ -124,8 +129,10 @@ export const migrations = async () => { await db.executeSql(addSets).catch(() => null); await db.executeSql(addMinutes).catch(() => null); await db.executeSql(addSeconds).catch(() => null); + await db.executeSql(addShowUnit).catch(() => null); const [result] = await db.executeSql(selectSettings); if (result.rows.length === 0) await db.executeSql(insertSettings); + await getSettings(); }; export interface PageParams { diff --git a/settings.service.ts b/settings.service.ts index e3ad5ac..4c67c90 100644 --- a/settings.service.ts +++ b/settings.service.ts @@ -1,10 +1,11 @@ import {db} from './db'; import Settings from './settings'; +export let settings: Settings; + export const getSettings = async () => { const [result] = await db.executeSql(`SELECT * FROM settings LIMIT 1`); - const settings: Settings = result.rows.item(0); - return settings; + settings = result.rows.item(0); }; export const updateSettings = async (value: Settings) => { diff --git a/settings.ts b/settings.ts index 66f3aba..5131da3 100644 --- a/settings.ts +++ b/settings.ts @@ -5,4 +5,5 @@ export default interface Settings { sound: string; notify: number; images: number; + showUnit: number; }