import React, {useCallback, useContext, useEffect, useState} from 'react'; import {ScrollView, StyleSheet, Text, View} from 'react-native'; import {Button, Dialog, Portal, Switch} from 'react-native-paper'; import {DatabaseContext} from './App'; import {Plan} from './plan'; import {DAYS} from './time'; export default function EditPlan({ plan, onSave, setPlan, }: { onSave: () => void; plan?: Plan; setPlan: (plan?: Plan) => void; }) { const [days, setDays] = useState([]); const [workouts, setWorkouts] = useState([]); const [names, setNames] = useState([]); const db = useContext(DatabaseContext); useEffect(() => { const refresh = async () => { const [namesResult] = await db.executeSql( 'SELECT DISTINCT name FROM sets', ); if (!namesResult.rows.length) return setNames([]); setNames(namesResult.rows.raw().map(({name}) => name)); if (!plan) return; if (plan.days) setDays(plan.days.split(',')); if (plan.workouts) setWorkouts(plan.workouts.split(',')); }; refresh(); }, [plan, db]); const save = useCallback(async () => { console.log(`${EditPlan.name}.save`, {days, workouts, plan}); if (!days || !workouts) return; const newWorkouts = workouts.filter(workout => workout).join(','); const newDays = days.filter(day => day).join(','); if (!plan?.id) await db.executeSql(`INSERT INTO plans(days, workouts) VALUES (?, ?)`, [ newDays, newWorkouts, ]); else await db.executeSql( `UPDATE plans SET days = ?, workouts = ? WHERE id = ?`, [newDays, newWorkouts, plan.id], ); setPlan(undefined); onSave(); }, [days, workouts, db, onSave, plan, setPlan]); const toggleWorkout = useCallback( (on: boolean, name: string) => { if (on) { setWorkouts([...workouts, name]); } else { setWorkouts(workouts.filter(workout => workout !== name)); } }, [setWorkouts, workouts], ); const toggleDay = useCallback( (on: boolean, day: string) => { if (on) { setDays([...days, day]); } else { setDays(days.filter(d => d !== day)); } }, [setDays, days], ); return ( setPlan(undefined)}> {plan?.days ? `Edit "${days.slice(0, 2).join(', ')}"` : 'Add a plan'} Days {DAYS.map(day => ( toggleDay(value, day)} /> toggleDay(!days.includes(day), day)}> {day} ))} Workouts {names.length === 0 && ( No sets found. Try going to the home page and adding some workouts first. )} {names.map(name => ( toggleWorkout(value, name)} /> toggleWorkout(!workouts.includes(name), name)}> {name} ))} ); } const styles = StyleSheet.create({ title: { fontSize: 20, marginBottom: 10, }, row: { flexDirection: 'row', flexWrap: 'wrap', }, });