Use events for gym set CRUD
This commit is contained in:
parent
cfcc15600c
commit
a3b376badb
22
EditSet.tsx
22
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<RouteProp<HomePageParams, "EditSet">>();
|
||||
|
@ -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<GymSet>) => {
|
||||
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 () => {
|
||||
|
|
|
@ -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() });
|
||||
};
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
76
SetList.tsx
76
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<RouteProp<HomePageParams, "Sets">>();
|
||||
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));
|
||||
}}
|
||||
/>
|
||||
);
|
||||
|
|
|
@ -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 &&
|
||||
|
|
|
@ -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]);
|
||||
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue