Refactor SettingsPage

1. If we rely on query builders too much we lose type safety
2. The update method wasn't really worth factoring out in the
  first place.
This commit is contained in:
Brandon Presley 2023-11-20 20:06:45 +13:00
parent 15a28a0a81
commit 857af61eec
1 changed files with 44 additions and 46 deletions

View File

@ -78,15 +78,6 @@ export default function SettingsPage() {
}); });
}, []); }, []);
const update = useCallback(async (key: keyof Settings, value: unknown) => {
await settingsRepo
.createQueryBuilder()
.update()
.set({ [key]: value })
.printSql()
.execute();
}, []);
const backupString = useMemo(() => { const backupString = useMemo(() => {
if (!settings.backupDir) return null; if (!settings.backupDir) return null;
console.log(settings.backupDir); console.log(settings.backupDir);
@ -130,11 +121,10 @@ export default function SettingsPage() {
return; return;
} }
await setRepo.createQueryBuilder().update().set({ image: null }).execute(); await setRepo.update({}, { image: null });
await update("sound", null); await settingsRepo.update({}, { sound: null, backup: false });
await update("backup", false);
reset({ index: 0, routes: [{ name: "Settings" }] }); reset({ index: 0, routes: [{ name: "Settings" }] });
}, [reset, update]); }, [reset]);
const today = new Date(); const today = new Date();
@ -157,7 +147,7 @@ export default function SettingsPage() {
value={settings.startup} value={settings.startup}
onChange={async (value) => { onChange={async (value) => {
setValue("startup", value); setValue("startup", value);
await update("startup", value); await settingsRepo.update({}, { startup: value });
toast(`App will always start on ${value}`); toast(`App will always start on ${value}`);
}} }}
/> />
@ -173,7 +163,7 @@ export default function SettingsPage() {
onChange={async (value) => { onChange={async (value) => {
setValue("theme", value); setValue("theme", value);
setTheme(value); setTheme(value);
await update("theme", value); await settingsRepo.update({}, { theme: value });
if (value === "dark") toast("Theme will always be dark."); if (value === "dark") toast("Theme will always be dark.");
else if (value === "light") toast("Theme will always be light."); else if (value === "light") toast("Theme will always be light.");
else if (value === "system") toast("Theme will follow system."); else if (value === "system") toast("Theme will follow system.");
@ -191,7 +181,7 @@ export default function SettingsPage() {
onChange={async (value) => { onChange={async (value) => {
setValue("darkColor", value); setValue("darkColor", value);
setDarkColor(value); setDarkColor(value);
await update("darkColor", value); await settingsRepo.update({}, { darkColor: value });
toast("Set primary color for dark mode."); toast("Set primary color for dark mode.");
}} }}
/> />
@ -207,7 +197,7 @@ export default function SettingsPage() {
onChange={async (value) => { onChange={async (value) => {
setValue("lightColor", value); setValue("lightColor", value);
setLightColor(value); setLightColor(value);
await update("lightColor", value); await settingsRepo.update({}, { lightColor: value });
toast("Set primary color for light mode."); toast("Set primary color for light mode.");
}} }}
/> />
@ -225,7 +215,7 @@ export default function SettingsPage() {
value={settings.date} value={settings.date}
onChange={async (value) => { onChange={async (value) => {
setValue("date", value); setValue("date", value);
await update("date", value); await settingsRepo.update({}, { date: value });
toast("Changed date format."); toast("Changed date format.");
}} }}
/> />
@ -245,7 +235,7 @@ export default function SettingsPage() {
value={settings.autoConvert} value={settings.autoConvert}
onChange={async (value) => { onChange={async (value) => {
setValue("autoConvert", value); setValue("autoConvert", value);
await update("autoConvert", value); await settingsRepo.update({}, { autoConvert: value });
if (value) toast(`Sets now automatically convert to ${value}`); if (value) toast(`Sets now automatically convert to ${value}`);
else toast("Stopped automatically converting sets."); else toast("Stopped automatically converting sets.");
}} }}
@ -260,8 +250,9 @@ export default function SettingsPage() {
label={name} label={name}
onChangeText={(value) => setValue("duration", Number(value))} onChangeText={(value) => setValue("duration", Number(value))}
onSubmitEditing={async (e) => { onSubmitEditing={async (e) => {
setValue("duration", Number(e.nativeEvent.text)); const value = Number(e.nativeEvent.text);
await update("duration", e.nativeEvent.text); setValue("duration", value);
await settingsRepo.update({}, { duration: value });
toast("Changed duration of alarm vibrations."); toast("Changed duration of alarm vibrations.");
}} }}
keyboardType="numeric" keyboardType="numeric"
@ -277,9 +268,9 @@ export default function SettingsPage() {
label={name} label={name}
onChangeText={(value) => setValue("defaultSets", Number(value))} onChangeText={(value) => setValue("defaultSets", Number(value))}
onSubmitEditing={async (e) => { onSubmitEditing={async (e) => {
const value = e.nativeEvent.text; const value = Number(e.nativeEvent.text);
setValue("defaultSets", Number(value)); setValue("defaultSets", value);
await update("defaultSets", value); await settingsRepo.update({}, { defaultSets: value });
toast(`New exercises now have ${value} sets by default.`); toast(`New exercises now have ${value} sets by default.`);
}} }}
keyboardType="numeric" keyboardType="numeric"
@ -295,9 +286,9 @@ export default function SettingsPage() {
label={name} label={name}
onChangeText={(value) => setValue("defaultMinutes", Number(value))} onChangeText={(value) => setValue("defaultMinutes", Number(value))}
onSubmitEditing={async (e) => { onSubmitEditing={async (e) => {
const value = e.nativeEvent.text; const value = Number(e.nativeEvent.text);
setValue("defaultMinutes", Number(value)); setValue("defaultMinutes", value);
await update("defaultMinutes", value); await settingsRepo.update({}, { defaultMinutes: value });
toast(`New exercises now wait ${value} minutes by default.`); toast(`New exercises now wait ${value} minutes by default.`);
}} }}
keyboardType="numeric" keyboardType="numeric"
@ -313,9 +304,9 @@ export default function SettingsPage() {
label={name} label={name}
onChangeText={(value) => setValue("defaultSeconds", Number(value))} onChangeText={(value) => setValue("defaultSeconds", Number(value))}
onSubmitEditing={async (e) => { onSubmitEditing={async (e) => {
const value = e.nativeEvent.text; const value = Number(e.nativeEvent.text);
setValue("defaultSeconds", Number(value)); setValue("defaultSeconds", value);
await update("defaultSeconds", value); await settingsRepo.update({}, { defaultSeconds: value });
toast(`New exercises now wait ${value} seconds by default.`); toast(`New exercises now wait ${value} seconds by default.`);
}} }}
keyboardType="numeric" keyboardType="numeric"
@ -330,9 +321,10 @@ export default function SettingsPage() {
value={settings.alarm} value={settings.alarm}
onChange={async (value) => { onChange={async (value) => {
setValue("alarm", value); setValue("alarm", value);
if (value && !ignoring) if (value && !ignoring) {
NativeModules.SettingsModule.ignoreBattery(); NativeModules.SettingsModule.ignoreBattery();
await update("alarm", value); }
await settingsRepo.update({}, { alarm: value });
if (value) toast("Timers will now run after each set."); if (value) toast("Timers will now run after each set.");
else toast("Stopped timers running after each set."); else toast("Stopped timers running after each set.");
}} }}
@ -347,7 +339,7 @@ export default function SettingsPage() {
value={settings.vibrate} value={settings.vibrate}
onChange={async (value) => { onChange={async (value) => {
setValue("vibrate", value); setValue("vibrate", value);
await update("vibrate", value); await settingsRepo.update({}, { vibrate: value });
if (value) toast("Timers will now run after each set."); if (value) toast("Timers will now run after each set.");
else toast("Stopped timers running after each set."); else toast("Stopped timers running after each set.");
}} }}
@ -367,13 +359,18 @@ export default function SettingsPage() {
if (value) { if (value) {
await FileSystem.writeFile(silentPath, ""); await FileSystem.writeFile(silentPath, "");
setValue("sound", silentPath); setValue("sound", silentPath);
await update("sound", silentPath); await settingsRepo.update(
{},
{
sound: silentPath,
noSound: value,
}
);
} else if (!value && settings.sound === silentPath) { } else if (!value && settings.sound === silentPath) {
setValue("sound", null); setValue("sound", null);
await update("sound", null); await settingsRepo.update({}, { sound: null, noSound: value });
} }
await update("noSound", value);
if (value) toast("Alarms will no longer make a sound."); if (value) toast("Alarms will no longer make a sound.");
else toast("Enabled sound for alarms."); else toast("Enabled sound for alarms.");
}} }}
@ -388,7 +385,7 @@ export default function SettingsPage() {
value={settings.notify} value={settings.notify}
onChange={async (value) => { onChange={async (value) => {
setValue("notify", value); setValue("notify", value);
await update("notify", value); await settingsRepo.update({}, { notify: value });
if (value) toast("Show notifications for new records."); if (value) toast("Show notifications for new records.");
else toast("Stopped notifications for new records."); else toast("Stopped notifications for new records.");
}} }}
@ -403,7 +400,7 @@ export default function SettingsPage() {
value={settings.images} value={settings.images}
onChange={async (value) => { onChange={async (value) => {
setValue("images", value); setValue("images", value);
await update("images", value); await settingsRepo.update({}, { images: value });
if (value) toast("Show images for sets."); if (value) toast("Show images for sets.");
else toast("Hid images for sets."); else toast("Hid images for sets.");
}} }}
@ -418,7 +415,7 @@ export default function SettingsPage() {
value={settings.showUnit} value={settings.showUnit}
onChange={async (value) => { onChange={async (value) => {
setValue("showUnit", value); setValue("showUnit", value);
await update("showUnit", value); await settingsRepo.update({}, { showUnit: value });
if (value) toast("Show option to select unit for sets."); if (value) toast("Show option to select unit for sets.");
else toast("Hid unit option for sets."); else toast("Hid unit option for sets.");
}} }}
@ -433,7 +430,7 @@ export default function SettingsPage() {
value={settings.steps} value={settings.steps}
onChange={async (value) => { onChange={async (value) => {
setValue("steps", value); setValue("steps", value);
await update("steps", value); await settingsRepo.update({}, { steps: value });
if (value) toast("Show steps for exercises."); if (value) toast("Show steps for exercises.");
else toast("Hid steps for exercises."); else toast("Hid steps for exercises.");
}} }}
@ -448,7 +445,7 @@ export default function SettingsPage() {
value={settings.showDate} value={settings.showDate}
onChange={async (value) => { onChange={async (value) => {
setValue("showDate", value); setValue("showDate", value);
await update("showDate", value); await settingsRepo.update({}, { showDate: value });
if (value) toast("Show date for sets."); if (value) toast("Show date for sets.");
else toast("Hid date on sets."); else toast("Hid date on sets.");
}} }}
@ -463,11 +460,11 @@ export default function SettingsPage() {
value={settings.backup} value={settings.backup}
onChange={async (value) => { onChange={async (value) => {
setValue("backup", value); setValue("backup", value);
await update("backup", value); await settingsRepo.update({}, { backup: value });
if (value) { if (value) {
const result = await DocumentPicker.pickDirectory(); const result = await DocumentPicker.pickDirectory();
setValue("backupDir", result.uri); setValue("backupDir", result.uri);
await update("backupDir", result.uri); await settingsRepo.update({}, { backupDir: result.uri });
console.log(`${SettingsPage.name}.backup:`, { result }); console.log(`${SettingsPage.name}.backup:`, { result });
toast("Backup database daily."); toast("Backup database daily.");
NativeModules.BackupModule.start(result.uri); NativeModules.BackupModule.start(result.uri);
@ -488,7 +485,7 @@ export default function SettingsPage() {
onPress={async () => { onPress={async () => {
const result = await DocumentPicker.pickDirectory(); const result = await DocumentPicker.pickDirectory();
setValue("backupDir", result.uri); setValue("backupDir", result.uri);
await update("backupDir", result.uri); await settingsRepo.update({}, { backupDir: result.uri });
toast("Changed backup directory."); toast("Changed backup directory.");
if (!settings.backup) return; if (!settings.backup) return;
NativeModules.BackupModule.stop(); NativeModules.BackupModule.stop();
@ -511,7 +508,7 @@ export default function SettingsPage() {
}); });
if (!fileCopyUri) return; if (!fileCopyUri) return;
setValue("sound", fileCopyUri); setValue("sound", fileCopyUri);
await update("sound", fileCopyUri); await settingsRepo.update({}, { sound: fileCopyUri });
toast("Sound will play after rest timers."); toast("Sound will play after rest timers.");
}} }}
> >
@ -528,8 +525,9 @@ export default function SettingsPage() {
const result = await check( const result = await check(
PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE
); );
if (result === RESULTS.DENIED || result === RESULTS.BLOCKED) if (result === RESULTS.DENIED || result === RESULTS.BLOCKED) {
await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE); await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE);
}
const path = Dirs.DatabaseDir + "/massive.db"; const path = Dirs.DatabaseDir + "/massive.db";
await FileSystem.cpExternal(path, "massive.db", "downloads"); await FileSystem.cpExternal(path, "massive.db", "downloads");
toast("Database exported. Check downloads."); toast("Database exported. Check downloads.");