import { NavigationProp, RouteProp, useFocusEffect, useNavigation, useRoute, } from "@react-navigation/native"; import { useCallback, useRef, useState } from "react"; import { ScrollView, TextInput, View } from "react-native"; import DocumentPicker from "react-native-document-picker"; import { Button, Card, IconButton, TouchableRipple } from "react-native-paper"; import AppInput from "./AppInput"; import { StackParams } from "./AppStack"; import ConfirmDialog from "./ConfirmDialog"; import PrimaryButton from "./PrimaryButton"; import StackHeader from "./StackHeader"; import { MARGIN, PADDING } from "./constants"; import { getNow, planRepo, setRepo, settingsRepo } from "./db"; import { DrawerParams } from "./drawer-params"; import { fixNumeric } from "./fix-numeric"; import GymSet, { defaultSet } from "./gym-set"; import Settings from "./settings"; import { toast } from "./toast"; export default function EditExercise() { const { params } = useRoute>(); const [removeImage, setRemoveImage] = 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); const [minutes, setMinutes] = useState( params.gymSet.minutes?.toString() ?? "3" ); const [seconds, setSeconds] = useState( params.gymSet.seconds?.toString() ?? "30" ); const [sets, setSets] = useState(params.gymSet.sets?.toString() ?? "3"); const { navigate } = useNavigation>(); const setsRef = useRef(null); const stepsRef = useRef(null); const minutesRef = useRef(null); const secondsRef = useRef(null); const [settings, setSettings] = useState(); useFocusEffect( useCallback(() => { 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: Number(minutes), seconds: Number(seconds), steps, image: removeImage ? "" : uri, } as GymSet; await setRepo.update({ name: params.gymSet.name }, newExercise); await planRepo.query( `UPDATE plans SET exercises = REPLACE(exercises, $1, $2) WHERE exercises LIKE $3`, [params.gymSet.name, name, `%${params.gymSet.name}%`] ); navigate("Exercises", { update: newExercise }); }; const add = async () => { const now = await getNow(); await setRepo.save({ ...defaultSet, name, hidden: true, image: uri, 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(); }; const changeImage = useCallback(async () => { const { fileCopyUri } = await DocumentPicker.pickSingle({ type: DocumentPicker.types.images, copyTo: "documentDirectory", }); if (fileCopyUri) setUri(fileCopyUri); }, []); const handleRemove = useCallback(async () => { setUri(""); setRemoveImage(true); setShowRemoveImage(false); }, []); const submitName = () => { if (settings.steps) stepsRef.current?.focus(); else setsRef.current?.focus(); }; return ( <> {typeof params.gymSet.id === "number" ? ( setShowDelete(true)} icon="delete" /> ) : null} {settings?.steps && ( setsRef.current?.focus()} /> )} { const fixed = fixNumeric(newSets); setSets(fixed); if (fixed.length !== newSets.length) toast("Sets must be a number"); }} label="Sets per exercise" keyboardType="numeric" onSubmitEditing={() => minutesRef.current?.focus()} /> {settings?.alarm && ( <> secondsRef.current?.focus()} value={minutes} onChangeText={(newMinutes) => { const fixed = fixNumeric(newMinutes); setMinutes(fixed); if (fixed.length !== newMinutes.length) toast("Reps must be a number"); }} label="Rest minutes" keyboardType="numeric" /> )} {settings?.images && uri && ( setShowRemoveImage(true)} > )} {settings?.images && !uri && ( )} Save Are you sure you want to remove the image? <>Are you sure you want to delete {name} ); }