import { NavigationProp, RouteProp, useNavigation, useRoute, } from "@react-navigation/native"; import { useCallback, useEffect, useState } from "react"; import { Pressable, StyleSheet, View } from "react-native"; import { ActivityIndicator, Button, IconButton, Switch as PaperSwitch, Text, } from "react-native-paper"; import ReorderableList, { ReorderableListRenderItemInfo, } from "react-native-reorderable-list"; import AppInput from "./AppInput"; import { StackParams } from "./AppStack"; import { MARGIN, PADDING } from "./constants"; import { DAYS } from "./days"; import { planRepo, setRepo } from "./db"; import { DrawerParams } from "./drawer-params"; import GymSet, { defaultSet } from "./gym-set"; import StackHeader from "./StackHeader"; import Switch from "./Switch"; export default function EditPlan() { const { params } = useRoute>(); const { plan } = params; const [title, setTitle] = useState(plan?.title); const [names, setNames] = useState(); const [days, setDays] = useState( plan.days ? plan.days.split(",") : [] ); const [exercises, setExercises] = useState( plan.exercises ? plan.exercises.split(",") : [] ); const { navigate: drawerNavigate } = useNavigation>(); const { navigate: stackNavigate } = useNavigation>(); useEffect(() => { setRepo .createQueryBuilder() .select("name") .distinct(true) .orderBy("name") .getRawMany() .then((values) => { const newNames = values.map((value) => value.name); console.log(EditPlan.name, { newNames }); setNames(newNames); }); }, []); const save = useCallback(async () => { console.log(`${EditPlan.name}.save`, { days, exercises, plan }); if (!days || !exercises) return; const newExercises = exercises.filter((exercise) => exercise).join(","); const newDays = days.filter((day) => day).join(","); await planRepo.save({ title: title, days: newDays, exercises: newExercises, id: plan.id, }); }, [title, days, exercises, plan]); const toggleExercise = useCallback( (on: boolean, name: string) => { if (on) { setExercises([...exercises, name]); } else { setExercises(exercises.filter((exercise) => exercise !== name)); } }, [setExercises, exercises] ); const toggleDay = useCallback( (on: boolean, day: string) => { if (on) { setDays([...days, day]); } else { setDays(days.filter((d) => d !== day)); } }, [setDays, days] ); const renderDay = (day: string) => ( toggleDay(value, day)} value={days.includes(day)} title={day} /> ); const renderExercise = ({ item, drag, }: ReorderableListRenderItemInfo) => ( toggleExercise(!exercises.includes(item), item)} style={{ flexDirection: "row", alignItems: "center" }} > toggleExercise(value, item)} /> {item} ); const reorderExercise = (from: number, to: number) => { const newNames = [...names]; const copy = newNames[from]; newNames[from] = newNames[to]; newNames[to] = copy; const newExercises = newNames.filter((name) => exercises.includes(name)); console.log({ newExercises }); setExercises(newExercises); setNames(newNames); }; return ( <> {typeof plan.id === "number" && ( { await save(); const newPlan = await planRepo.findOne({ where: { id: plan.id }, }); let first: Partial = await setRepo.findOne({ where: { name: exercises[0] }, order: { created: "desc" }, }); if (!first) first = { ...defaultSet, name: exercises[0] }; delete first.id; stackNavigate("StartPlan", { plan: newPlan, first }); }} icon="play" /> )} setTitle(value)} /> Days {DAYS.map((day) => renderDay(day))} Exercises {names === undefined ? ( ) : ( No exercises yet} onReorder={({ fromIndex, toIndex }) => reorderExercise(fromIndex, toIndex) } renderItem={renderExercise} keyExtractor={(item) => item} dragScale={1.025} style={{ flex: 1, }} containerStyle={{ flex: 1 }} /> )} ); } const styles = StyleSheet.create({ title: { fontSize: 20, marginBottom: MARGIN, }, });