From 608bb3e97a8b15342f6f1702bfe438aad7167243 Mon Sep 17 00:00:00 2001 From: Brandon Presley Date: Wed, 15 Nov 2023 14:03:43 +1300 Subject: [PATCH] =?UTF-8?q?Add=20settings=20for=20default=20fields=20on=20?= =?UTF-8?q?Exercise=20-=202.1=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #188 --- EditExercise.tsx | 54 ++++++++++++++----- EditSet.tsx | 27 +++++----- SettingsPage.tsx | 54 +++++++++++++++++++ StartPlan.tsx | 4 +- android/app/build.gradle | 4 +- data-source.ts | 4 ++ .../1700009253976-settings-default-sets.ts | 11 ++++ migrations/1700009729468-settings-defaults.ts | 14 +++++ package.json | 2 +- settings.ts | 9 ++++ 10 files changed, 151 insertions(+), 32 deletions(-) create mode 100644 migrations/1700009253976-settings-default-sets.ts create mode 100644 migrations/1700009729468-settings-defaults.ts diff --git a/EditExercise.tsx b/EditExercise.tsx index 4e71595..1fbd9cb 100644 --- a/EditExercise.tsx +++ b/EditExercise.tsx @@ -8,7 +8,7 @@ import { import { useCallback, useRef, useState } from "react"; import { ScrollView, TextInput, View } from "react-native"; import DocumentPicker from "react-native-document-picker"; -import { Button, Card, TouchableRipple } from "react-native-paper"; +import { Button, Card, IconButton, TouchableRipple } from "react-native-paper"; import AppInput from "./AppInput"; import { StackParams } from "./AppStack"; import ConfirmDialog from "./ConfirmDialog"; @@ -25,7 +25,8 @@ import { toast } from "./toast"; export default function EditExercise() { const { params } = useRoute>(); const [removeImage, setRemoveImage] = useState(false); - const [showRemove, setShowRemove] = useState(false); + const [showRemoveImage, setShowRemoveImage] = useState(false); + const [showDelete, setShowDelete] = useState(false); const [name, setName] = useState(params.gymSet.name); const [steps, setSteps] = useState(params.gymSet.steps); const [uri, setUri] = useState(params.gymSet.image); @@ -45,16 +46,22 @@ export default function EditExercise() { useFocusEffect( useCallback(() => { - settingsRepo.findOne({ where: {} }).then(setSettings); - }, []) + settingsRepo.findOne({ where: {} }).then((gotSettings) => { + setSettings(gotSettings); + if (params.gymSet.id) return; + setSets(gotSettings.defaultSets?.toString() ?? "3"); + setMinutes(gotSettings.defaultMinutes?.toString() ?? "3"); + setSeconds(gotSettings.defaultSeconds?.toString() ?? "30"); + }); + }, [params.gymSet.id]) ); const update = async () => { const newExercise = { name: name || params.gymSet.name, sets: Number(sets), - minutes: +minutes, - seconds: +seconds, + minutes: Number(minutes), + seconds: Number(seconds), steps, image: removeImage ? "" : uri, } as GymSet; @@ -75,15 +82,20 @@ export default function EditExercise() { name, hidden: true, image: uri, - minutes: minutes ? +minutes : 3, - seconds: seconds ? +seconds : 30, - sets: sets ? +sets : 3, + minutes: minutes ? Number(minutes) : 3, + seconds: seconds ? Number(seconds) : 30, + sets: sets ? Number(sets) : 3, steps, created: now, }); navigate("Exercises"); }; + const remove = async () => { + await setRepo.delete({ name: params.gymSet.name }); + navigate("Exercises"); + }; + const save = async () => { if (params.gymSet.name) return update(); return add(); @@ -100,7 +112,7 @@ export default function EditExercise() { const handleRemove = useCallback(async () => { setUri(""); setRemoveImage(true); - setShowRemove(false); + setShowRemoveImage(false); }, []); const submitName = () => { @@ -112,7 +124,11 @@ export default function EditExercise() { <> + > + {typeof params.gymSet.id === "number" ? ( + setShowDelete(true)} icon="delete" /> + ) : null} + setShowRemove(true)} + onLongPress={() => setShowRemoveImage(true)} > @@ -193,14 +209,24 @@ export default function EditExercise() { Save + Are you sure you want to remove the image? + + + <>Are you sure you want to delete {name} + ); diff --git a/EditSet.tsx b/EditSet.tsx index 1315739..0528016 100644 --- a/EditSet.tsx +++ b/EditSet.tsx @@ -49,7 +49,7 @@ export default function EditSet() { set.created ? new Date(set.created) : new Date() ); const [createdDirty, setCreatedDirty] = useState(false); - const [showRemove, setShowRemove] = useState(false); + const [showRemoveImage, setShowRemoveImage] = useState(false); const [removeImage, setRemoveImage] = useState(false); const [setOptions, setSets] = useState([]); const weightRef = useRef(null); @@ -145,7 +145,7 @@ export default function EditSet() { const handleRemove = useCallback(async () => { setNewImage(""); setRemoveImage(true); - setShowRemove(false); + setShowRemoveImage(false); }, []); const pickDate = useCallback(() => { @@ -202,14 +202,6 @@ export default function EditSet() { setShowDelete(true)} icon="delete" /> ) : null} - - <>Are you sure you want to delete {name} - @@ -324,7 +316,7 @@ export default function EditSet() { setShowRemove(true)} + onLongPress={() => setShowRemoveImage(true)} > @@ -353,11 +345,20 @@ export default function EditSet() { Are you sure you want to remove the image? + + + <>Are you sure you want to delete {name} + ); } diff --git a/SettingsPage.tsx b/SettingsPage.tsx index dbe6abb..206d5c3 100644 --- a/SettingsPage.tsx +++ b/SettingsPage.tsx @@ -269,6 +269,60 @@ export default function SettingsPage() { /> ), }, + { + name: "Default sets", + renderItem: (name: string) => ( + setValue("defaultSets", Number(value))} + onSubmitEditing={async (e) => { + const value = e.nativeEvent.text; + setValue("defaultSets", Number(value)); + await update("defaultSets", value); + toast(`New exercises now have ${value} sets by default.`); + }} + keyboardType="numeric" + blurOnSubmit + /> + ), + }, + { + name: "Default minutes", + renderItem: (name: string) => ( + setValue("defaultMinutes", Number(value))} + onSubmitEditing={async (e) => { + const value = e.nativeEvent.text; + setValue("defaultMinutes", Number(value)); + await update("defaultMinutes", value); + toast(`New exercises now wait ${value} minutes by default.`); + }} + keyboardType="numeric" + blurOnSubmit + /> + ), + }, + { + name: "Default seconds", + renderItem: (name: string) => ( + setValue("defaultSeconds", Number(value))} + onSubmitEditing={async (e) => { + const value = e.nativeEvent.text; + setValue("defaultSeconds", Number(value)); + await update("defaultSeconds", value); + toast(`New exercises now wait ${value} seconds by default.`); + }} + keyboardType="numeric" + blurOnSubmit + /> + ), + }, { name: "Rest timers", renderItem: (name: string) => ( diff --git a/StartPlan.tsx b/StartPlan.tsx index 9017be0..29804eb 100644 --- a/StartPlan.tsx +++ b/StartPlan.tsx @@ -125,8 +125,8 @@ export default function StartPlan() { await refresh(); if ( settings.notify && - (+weight > best.weight || - (Number(reps) > best.reps && +weight === best.weight)) + (Number(weight) > best.weight || + (Number(reps) > best.reps && Number(weight) === best.weight)) ) { toast("Great work King! That's a new record."); } diff --git a/android/app/build.gradle b/android/app/build.gradle index 40f4b86..8ff021c 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -85,8 +85,8 @@ android { applicationId "com.massive" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 36214 - versionName "1.188" + versionCode 36216 + versionName "2.1" } signingConfigs { release { diff --git a/data-source.ts b/data-source.ts index 42ca0aa..1c18c7e 100644 --- a/data-source.ts +++ b/data-source.ts @@ -37,6 +37,8 @@ import { autoConvert1699948105001 } from "./migrations/1699948105001-auto-conver import { Plan } from "./plan"; import Settings from "./settings"; import Weight from "./weight"; +import { settingsDefaultSets1700009253976 } from "./migrations/1700009253976-settings-default-sets"; +import { settingsDefaults1700009729468 } from "./migrations/1700009729468-settings-defaults"; export const AppDataSource = new DataSource({ type: "react-native", @@ -80,5 +82,7 @@ export const AppDataSource = new DataSource({ settingsBackupDir1699839054226, homeHistoryStartup1699853245534, autoConvert1699948105001, + settingsDefaultSets1700009253976, + settingsDefaults1700009729468, ], }); diff --git a/migrations/1700009253976-settings-default-sets.ts b/migrations/1700009253976-settings-default-sets.ts new file mode 100644 index 0000000..d289876 --- /dev/null +++ b/migrations/1700009253976-settings-default-sets.ts @@ -0,0 +1,11 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class settingsDefaultSets1700009253976 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + "ALTER TABLE settings ADD COLUMN defaultSets INTEGER" + ); + } + + public async down(queryRunner: QueryRunner): Promise {} +} diff --git a/migrations/1700009729468-settings-defaults.ts b/migrations/1700009729468-settings-defaults.ts new file mode 100644 index 0000000..c3349bf --- /dev/null +++ b/migrations/1700009729468-settings-defaults.ts @@ -0,0 +1,14 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class settingsDefaults1700009729468 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + "ALTER TABLE settings ADD COLUMN defaultMinutes INTEGER" + ); + await queryRunner.query( + "ALTER TABLE settings ADD COLUMN defaultSeconds INTEGER" + ); + } + + public async down(queryRunner: QueryRunner): Promise {} +} diff --git a/package.json b/package.json index 350708f..b3793bd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "massive", - "version": "1.188", + "version": "2.1", "private": true, "license": "GPL-3.0-only", "scripts": { diff --git a/settings.ts b/settings.ts index 160e143..78ef7bd 100644 --- a/settings.ts +++ b/settings.ts @@ -55,4 +55,13 @@ export default class Settings { @Column("text") autoConvert: string | null; + + @Column("int") + defaultSets: number | null; + + @Column("int") + defaultMinutes: number | null; + + @Column("int") + defaultSeconds: number | null; }