Massive/EditPlan.tsx

144 lines
4.0 KiB
TypeScript
Raw Normal View History

2022-07-11 00:28:30 +00:00
import {
NavigationProp,
2022-07-11 00:28:30 +00:00
RouteProp,
useNavigation,
useRoute,
2022-10-31 04:22:08 +00:00
} from '@react-navigation/native'
2023-06-27 03:16:59 +00:00
import { useCallback, useEffect, useState } from 'react'
import { ScrollView, StyleSheet, View } from 'react-native'
import { Button, IconButton, Text } from 'react-native-paper'
import { getLast } from './best.service'
import { MARGIN, PADDING } from './constants'
import { planRepo, setRepo } from './db'
import { defaultSet } from './gym-set'
import { PlanPageParams } from './plan-page-params'
2022-10-31 04:22:08 +00:00
import StackHeader from './StackHeader'
import Switch from './Switch'
2023-06-27 03:16:59 +00:00
import { DAYS } from './time'
import useDark from './use-dark'
2022-07-06 05:40:53 +00:00
2022-07-11 00:28:30 +00:00
export default function EditPlan() {
2023-06-27 03:16:59 +00:00
const { params } = useRoute<RouteProp<PlanPageParams, 'EditPlan'>>()
const { plan } = params
2022-09-18 06:45:05 +00:00
const [days, setDays] = useState<string[]>(
plan.days ? plan.days.split(',') : [],
2022-10-31 04:22:08 +00:00
)
2022-07-11 00:28:30 +00:00
const [workouts, setWorkouts] = useState<string[]>(
2022-09-18 06:45:05 +00:00
plan.workouts ? plan.workouts.split(',') : [],
2022-10-31 04:22:08 +00:00
)
const [names, setNames] = useState<string[]>([])
const navigation = useNavigation<NavigationProp<PlanPageParams>>()
const dark = useDark()
2022-07-11 00:28:30 +00:00
2022-07-06 05:40:53 +00:00
useEffect(() => {
setRepo
.createQueryBuilder()
.select('name')
.distinct(true)
.orderBy('name')
.getRawMany()
2023-06-27 03:16:59 +00:00
.then((values) => {
console.log(EditPlan.name, { values })
setNames(values.map((value) => value.name))
2022-10-31 04:22:08 +00:00
})
}, [])
2022-07-06 05:40:53 +00:00
2022-07-09 23:51:52 +00:00
const save = useCallback(async () => {
2023-06-27 03:16:59 +00:00
console.log(`${EditPlan.name}.save`, { days, workouts, plan })
2022-10-31 04:22:08 +00:00
if (!days || !workouts) return
2023-06-27 03:16:59 +00:00
const newWorkouts = workouts.filter((workout) => workout).join(',')
const newDays = days.filter((day) => day).join(',')
await planRepo.save({ days: newDays, workouts: newWorkouts, id: plan.id })
2022-10-31 04:22:08 +00:00
navigation.goBack()
}, [days, workouts, plan, navigation])
2022-07-06 05:40:53 +00:00
2022-07-09 23:51:52 +00:00
const toggleWorkout = useCallback(
(on: boolean, name: string) => {
if (on) {
2022-10-31 04:22:08 +00:00
setWorkouts([...workouts, name])
2022-07-09 23:51:52 +00:00
} else {
2023-06-27 03:16:59 +00:00
setWorkouts(workouts.filter((workout) => workout !== name))
2022-07-09 23:51:52 +00:00
}
},
2022-07-09 23:54:23 +00:00
[setWorkouts, workouts],
2022-10-31 04:22:08 +00:00
)
2022-07-06 06:26:43 +00:00
2022-07-09 23:51:52 +00:00
const toggleDay = useCallback(
(on: boolean, day: string) => {
if (on) {
2022-10-31 04:22:08 +00:00
setDays([...days, day])
2022-07-09 23:51:52 +00:00
} else {
2023-06-27 03:16:59 +00:00
setDays(days.filter((d) => d !== day))
2022-07-09 23:51:52 +00:00
}
},
2022-07-09 23:54:23 +00:00
[setDays, days],
2022-10-31 04:22:08 +00:00
)
2022-07-06 05:40:53 +00:00
return (
<>
2023-01-08 05:05:59 +00:00
<StackHeader
2023-06-27 03:16:59 +00:00
title={typeof plan.id === 'number' ? 'Edit plan' : 'Add plan'}
>
<IconButton
color={dark ? 'white' : 'white'}
onPress={async () => {
let first = await getLast(workouts[0])
2023-06-27 03:16:59 +00:00
if (!first) first = { ...defaultSet, name: workouts[0] }
delete first.id
2023-06-27 03:16:59 +00:00
navigation.navigate('StartPlan', { plan: params.plan, first })
}}
2023-06-27 03:16:59 +00:00
icon='play-arrow'
/>
</StackHeader>
2023-06-27 03:16:59 +00:00
<View style={{ padding: PADDING, flex: 1 }}>
<ScrollView style={{ flex: 1 }}>
<Text style={styles.title}>Days</Text>
2023-06-27 03:16:59 +00:00
{DAYS.map((day) => (
2022-09-26 03:10:13 +00:00
<Switch
key={day}
2023-06-27 03:16:59 +00:00
onChange={(value) => toggleDay(value, day)}
value={days.includes(day)}
title={day}
/>
))}
2023-06-27 03:16:59 +00:00
<Text style={[styles.title, { marginTop: MARGIN }]}>Workouts</Text>
{names.length === 0
? (
<View>
<Text>No workouts found.</Text>
</View>
)
: (
names.map((name) => (
<Switch
key={name}
onChange={(value) => toggleWorkout(value, name)}
value={workouts.includes(name)}
title={name}
/>
))
)}
</ScrollView>
<Button
disabled={workouts.length === 0 && days.length === 0}
style={styles.button}
2023-06-27 03:16:59 +00:00
mode='contained'
icon='save'
onPress={save}
>
Save
</Button>
</View>
</>
2022-10-31 04:22:08 +00:00
)
2022-07-06 05:40:53 +00:00
}
2022-07-07 04:17:55 +00:00
const styles = StyleSheet.create({
title: {
fontSize: 20,
marginBottom: MARGIN,
2022-07-07 04:17:55 +00:00
},
button: {},
2022-10-31 04:22:08 +00:00
})