diff --git a/EditSet.tsx b/EditSet.tsx index 3a16179..03ebd3a 100644 --- a/EditSet.tsx +++ b/EditSet.tsx @@ -15,12 +15,13 @@ import AppInput from "./AppInput"; import ConfirmDialog from "./ConfirmDialog"; import { MARGIN, PADDING } from "./constants"; import { getNow, setRepo, settingsRepo } from "./db"; -import GymSet from "./gym-set"; +import GymSet, { GYM_SET_CREATED, GYM_SET_UPDATED } from "./gym-set"; import { HomePageParams } from "./home-page-params"; import Settings from "./settings"; import StackHeader from "./StackHeader"; import { toast } from "./toast"; import { fixNumeric } from "./fix-numeric"; +import { emitter } from "./emitter"; export default function EditSet() { const { params } = useRoute>(); @@ -64,18 +65,20 @@ export default function EditSet() { [settings] ); - const added = async (value: GymSet) => { - startTimer(value.name); - console.log(`${EditSet.name}.add`, { set: value }); - if (!settings.notify) return navigate("Sets", { reset: value.id }); + const notify = (value: Partial) => { + if (!settings.notify) return navigate("Sets"); if ( value.weight > set.weight || (value.reps > set.reps && value.weight === set.weight) ) { toast("Great work King! That's a new record."); } - console.log("Navigating..."); - navigate("Sets", { reset: value.id }); + }; + + const added = async (value: GymSet) => { + console.log(`${EditSet.name}.added:`, value); + emitter.emit(GYM_SET_CREATED); + startTimer(value.name); }; const handleSubmit = async () => { @@ -104,9 +107,10 @@ export default function EditSet() { if (typeof set.id !== "number") newSet.created = await getNow(); const saved = await setRepo.save(newSet); + notify(newSet); if (typeof set.id !== "number") return added(saved); - if (createdDirty) navigate("Sets", { reset: saved.id }); - else navigate("Sets", { refresh: saved }); + else emitter.emit(GYM_SET_UPDATED, saved); + navigate("Sets"); }; const changeImage = useCallback(async () => { diff --git a/EditWorkout.tsx b/EditWorkout.tsx index 1b15861..da8d2f5 100644 --- a/EditWorkout.tsx +++ b/EditWorkout.tsx @@ -13,8 +13,9 @@ import AppInput from "./AppInput"; import ConfirmDialog from "./ConfirmDialog"; import { MARGIN, PADDING } from "./constants"; import { getNow, planRepo, setRepo, settingsRepo } from "./db"; +import { emitter } from "./emitter"; import { fixNumeric } from "./fix-numeric"; -import GymSet, { defaultSet } from "./gym-set"; +import GymSet, { defaultSet, GYM_SET_CREATED } from "./gym-set"; import Settings from "./settings"; import StackHeader from "./StackHeader"; import { toast } from "./toast"; @@ -79,6 +80,7 @@ export default function EditWorkout() { steps, created: now, }); + emitter.emit(GYM_SET_CREATED); navigate("WorkoutList", { reset: new Date().getTime() }); }; diff --git a/EditWorkouts.tsx b/EditWorkouts.tsx index 1431f73..8a14772 100644 --- a/EditWorkouts.tsx +++ b/EditWorkouts.tsx @@ -14,7 +14,9 @@ import AppInput from "./AppInput"; import ConfirmDialog from "./ConfirmDialog"; import { MARGIN, PADDING } from "./constants"; import { planRepo, setRepo, settingsRepo } from "./db"; +import { emitter } from "./emitter"; import { fixNumeric } from "./fix-numeric"; +import { GYM_SET_CREATED } from "./gym-set"; import Settings from "./settings"; import StackHeader from "./StackHeader"; import { toast } from "./toast"; @@ -74,6 +76,7 @@ export default function EditWorkouts() { image: removeImage ? "" : uri, } ); + emitter.emit(GYM_SET_CREATED); for (const oldName of params.names) { await planRepo .createQueryBuilder() diff --git a/SetList.tsx b/SetList.tsx index 8a012af..347522c 100644 --- a/SetList.tsx +++ b/SetList.tsx @@ -12,7 +12,12 @@ import { LIMIT } from "./constants"; import { getNow, setRepo, settingsRepo } from "./db"; import DrawerHeader from "./DrawerHeader"; import { emitter } from "./emitter"; -import GymSet, { defaultSet } from "./gym-set"; +import GymSet, { + defaultSet, + GYM_SET_CREATED, + GYM_SET_DELETED, + GYM_SET_UPDATED, +} from "./gym-set"; import { HomePageParams } from "./home-page-params"; import ListMenu from "./ListMenu"; import Page from "./Page"; @@ -30,21 +35,12 @@ export default function SetList() { const { params } = useRoute>(); const [term, setTerm] = useState(params?.search || ""); - const refresh = async (gymSet: GymSet) => { - console.log(`${SetList.name}.refresh:`, gymSet); - if (!sets) return; - const newSets = sets.map((oldSet) => - oldSet.id === gymSet.id ? gymSet : oldSet - ); - setSets(newSets); - }; - const reset = useCallback( - async ({ value, skip }: { value: string; skip: number }) => { + async (value: string) => { const newSets = await setRepo.find({ where: { name: Like(`%${value.trim()}%`), hidden: 0 as any }, take: LIMIT, - skip, + skip: 0, order: { created: "DESC" }, }); console.log(`${SetList.name}.reset:`, { value, offset }); @@ -56,37 +52,43 @@ export default function SetList() { useEffect(() => { settingsRepo.findOne({ where: {} }).then(setSettings); - const description = emitter.addListener(SETTINGS, () => { - settingsRepo.findOne({ where: {} }).then(setSettings); - }); - return description.remove; + reset(""); + /* eslint-disable react-hooks/exhaustive-deps */ }, []); + useEffect(() => { + const updated = (gymSet: GymSet) => { + if (!sets) console.log({ sets }); + console.log(`${SetList.name}.updated:`, { gymSet, length: sets.length }); + const newSets = sets.map((set) => { + if (set.id !== gymSet.id) return set; + if (gymSet.created === undefined) gymSet.created = set.created; + return gymSet; + }); + setSets(newSets); + }; + + const descriptions = [ + emitter.addListener(SETTINGS, () => { + settingsRepo.findOne({ where: {} }).then(setSettings); + }), + emitter.addListener(GYM_SET_UPDATED, updated), + emitter.addListener(GYM_SET_CREATED, () => reset("")), + emitter.addListener(GYM_SET_DELETED, () => reset("")), + ]; + return () => descriptions.forEach((description) => description.remove()); + }, [sets]); + const search = (value: string) => { console.log(`${SetList.name}.search:`, value); setTerm(value); setOffset(0); - reset({ - skip: 0, - value, - }); + reset(value); }; useEffect(() => { console.log(`${SetList.name}.useEffect:`, params); - if (!params) - reset({ - skip: 0, - value: "", - }); if (params?.search) search(params.search); - else if (params?.refresh) refresh(params.refresh); - else if (params?.reset) - reset({ - skip: 0, - value: term, - }); - /* eslint-disable react-hooks/exhaustive-deps */ }, [params]); const renderItem = useCallback( @@ -155,10 +157,7 @@ export default function SetList() { const remove = async () => { setIds([]); await setRepo.delete(ids.length > 0 ? ids : {}); - return reset({ - skip: 0, - value: term, - }); + return reset(term); }; const select = useCallback(() => { @@ -187,10 +186,7 @@ export default function SetList() { onRefresh={() => { setOffset(0); setRefreshing(true); - reset({ - skip: 0, - value: term, - }).finally(() => setRefreshing(false)); + reset(term).finally(() => setRefreshing(false)); }} /> ); diff --git a/StartPlan.tsx b/StartPlan.tsx index ae8fe81..c1fd3f9 100644 --- a/StartPlan.tsx +++ b/StartPlan.tsx @@ -14,8 +14,9 @@ import { MARGIN, PADDING } from "./constants"; import CountMany from "./count-many"; import { AppDataSource } from "./data-source"; import { getNow, setRepo, settingsRepo } from "./db"; +import { emitter } from "./emitter"; import { fixNumeric } from "./fix-numeric"; -import GymSet from "./gym-set"; +import GymSet, { GYM_SET_CREATED, GYM_SET_UPDATED } from "./gym-set"; import { PlanPageParams } from "./plan-page-params"; import Settings from "./settings"; import StackHeader from "./StackHeader"; @@ -102,7 +103,8 @@ export default function StartPlan() { created: now, hidden: false, }; - await setRepo.save(newSet); + const saved = await setRepo.save(newSet); + emitter.emit(GYM_SET_CREATED, saved); await refresh(); if ( settings.notify && diff --git a/StartPlanItem.tsx b/StartPlanItem.tsx index 6d2a1a5..d229f50 100644 --- a/StartPlanItem.tsx +++ b/StartPlanItem.tsx @@ -5,6 +5,8 @@ import { List, Menu, RadioButton, useTheme } from "react-native-paper"; import { Like } from "typeorm"; import CountMany from "./count-many"; import { getNow, setRepo } from "./db"; +import { emitter } from "./emitter"; +import { GYM_SET_DELETED } from "./gym-set"; import { HomePageParams } from "./home-page-params"; import { PlanPageParams } from "./plan-page-params"; import { toast } from "./toast"; @@ -38,6 +40,7 @@ export default function StartPlanItem(props: Props) { setShowMenu(false); if (!first) return toast("Nothing to undo."); await setRepo.delete(first.id); + emitter.emit(GYM_SET_DELETED, first); onUndo(); }, [setShowMenu, onUndo, item.name]); diff --git a/WorkoutList.tsx b/WorkoutList.tsx index cac5b0e..62299f3 100644 --- a/WorkoutList.tsx +++ b/WorkoutList.tsx @@ -12,7 +12,7 @@ import { LIMIT } from "./constants"; import { setRepo, settingsRepo } from "./db"; import DrawerHeader from "./DrawerHeader"; import { emitter } from "./emitter"; -import GymSet from "./gym-set"; +import GymSet, { GYM_SET_DELETED } from "./gym-set"; import ListMenu from "./ListMenu"; import Page from "./Page"; import SetList from "./SetList"; @@ -131,6 +131,7 @@ export default function WorkoutList() { const remove = async () => { setNames([]); if (names.length > 0) await setRepo.delete({ name: In(names) }); + emitter.emit(GYM_SET_DELETED); await reset(term); }; diff --git a/gym-set.ts b/gym-set.ts index 235c2fb..b07ff02 100644 --- a/gym-set.ts +++ b/gym-set.ts @@ -1,5 +1,9 @@ import { Column, Entity, PrimaryGeneratedColumn } from "typeorm"; +export const GYM_SET_UPDATED = "gym-set-updated"; +export const GYM_SET_DELETED = "gym-set-deleted"; +export const GYM_SET_CREATED = "gym-set-created"; + @Entity("sets") export default class GymSet { @PrimaryGeneratedColumn() diff --git a/home-page-params.ts b/home-page-params.ts index 3f972c8..fb521d9 100644 --- a/home-page-params.ts +++ b/home-page-params.ts @@ -3,16 +3,6 @@ import GymSet from "./gym-set"; export type HomePageParams = { Sets: { search?: string; - - /** - * Update the specified set - */ - refresh?: GymSet; - - /** - * Reload the list with limit = 0 - */ - reset?: number; }; EditSet: { set: GymSet;