2022-07-11 00:28:30 +00:00
|
|
|
import {
|
|
|
|
NavigationProp,
|
|
|
|
useFocusEffect,
|
|
|
|
useNavigation,
|
2022-10-31 04:22:08 +00:00
|
|
|
} from '@react-navigation/native'
|
2023-06-27 03:16:59 +00:00
|
|
|
import { useCallback, useState } from 'react'
|
|
|
|
import { FlatList } from 'react-native'
|
|
|
|
import { List } from 'react-native-paper'
|
|
|
|
import { Like } from 'typeorm'
|
|
|
|
import { planRepo } from './db'
|
2022-10-31 04:22:08 +00:00
|
|
|
import DrawerHeader from './DrawerHeader'
|
2022-12-21 00:02:53 +00:00
|
|
|
import ListMenu from './ListMenu'
|
2022-10-31 04:22:08 +00:00
|
|
|
import Page from './Page'
|
2023-06-27 03:16:59 +00:00
|
|
|
import { Plan } from './plan'
|
|
|
|
import { PlanPageParams } from './plan-page-params'
|
2022-10-31 04:22:08 +00:00
|
|
|
import PlanItem from './PlanItem'
|
2022-07-11 00:28:30 +00:00
|
|
|
|
|
|
|
export default function PlanList() {
|
2022-10-31 04:22:08 +00:00
|
|
|
const [term, setTerm] = useState('')
|
|
|
|
const [plans, setPlans] = useState<Plan[]>()
|
2022-12-13 09:54:37 +00:00
|
|
|
const [ids, setIds] = useState<number[]>([])
|
2022-10-31 04:22:08 +00:00
|
|
|
const navigation = useNavigation<NavigationProp<PlanPageParams>>()
|
2022-07-11 00:28:30 +00:00
|
|
|
|
2022-10-28 05:59:54 +00:00
|
|
|
const refresh = useCallback(async (value: string) => {
|
2022-10-31 00:20:36 +00:00
|
|
|
planRepo
|
|
|
|
.find({
|
2023-06-13 02:10:51 +00:00
|
|
|
where: [
|
2023-06-27 03:16:59 +00:00
|
|
|
{ days: Like(`%${value.trim()}%`) },
|
|
|
|
{ workouts: Like(`%${value.trim()}%`) },
|
2023-06-13 02:10:51 +00:00
|
|
|
],
|
2022-10-31 00:20:36 +00:00
|
|
|
})
|
2022-10-31 04:22:08 +00:00
|
|
|
.then(setPlans)
|
|
|
|
}, [])
|
2022-07-11 00:28:30 +00:00
|
|
|
|
|
|
|
useFocusEffect(
|
|
|
|
useCallback(() => {
|
2022-10-31 04:22:08 +00:00
|
|
|
refresh(term)
|
2022-10-28 05:59:54 +00:00
|
|
|
}, [refresh, term]),
|
2022-10-31 04:22:08 +00:00
|
|
|
)
|
2022-07-11 00:28:30 +00:00
|
|
|
|
2022-10-28 05:59:54 +00:00
|
|
|
const search = useCallback(
|
|
|
|
(value: string) => {
|
2022-10-31 04:22:08 +00:00
|
|
|
setTerm(value)
|
|
|
|
refresh(value)
|
2022-10-28 05:59:54 +00:00
|
|
|
},
|
|
|
|
[refresh],
|
2022-10-31 04:22:08 +00:00
|
|
|
)
|
2022-07-11 00:28:30 +00:00
|
|
|
|
|
|
|
const renderItem = useCallback(
|
2023-06-27 03:16:59 +00:00
|
|
|
({ item }: { item: Plan }) => (
|
2022-12-13 09:54:37 +00:00
|
|
|
<PlanItem ids={ids} setIds={setIds} item={item} key={item.id} />
|
2022-07-11 00:28:30 +00:00
|
|
|
),
|
2022-12-13 09:54:37 +00:00
|
|
|
[ids],
|
2022-10-31 04:22:08 +00:00
|
|
|
)
|
2022-07-11 00:28:30 +00:00
|
|
|
|
2022-09-16 09:07:02 +00:00
|
|
|
const onAdd = () =>
|
2023-06-27 03:16:59 +00:00
|
|
|
navigation.navigate('EditPlan', { plan: { days: '', workouts: '' } })
|
2022-09-16 09:07:02 +00:00
|
|
|
|
2022-12-18 00:23:10 +00:00
|
|
|
const edit = useCallback(async () => {
|
2023-06-27 03:16:59 +00:00
|
|
|
const plan = await planRepo.findOne({ where: { id: ids.pop() } })
|
|
|
|
navigation.navigate('EditPlan', { plan })
|
2022-12-18 00:23:10 +00:00
|
|
|
setIds([])
|
|
|
|
}, [ids, navigation])
|
|
|
|
|
|
|
|
const copy = useCallback(async () => {
|
|
|
|
const plan = await planRepo.findOne({
|
2023-06-27 03:16:59 +00:00
|
|
|
where: { id: ids.pop() },
|
2022-12-18 00:23:10 +00:00
|
|
|
})
|
|
|
|
delete plan.id
|
2023-06-27 03:16:59 +00:00
|
|
|
navigation.navigate('EditPlan', { plan })
|
2022-12-18 00:23:10 +00:00
|
|
|
setIds([])
|
|
|
|
}, [ids, navigation])
|
|
|
|
|
|
|
|
const clear = useCallback(() => {
|
|
|
|
setIds([])
|
|
|
|
}, [])
|
|
|
|
|
|
|
|
const remove = useCallback(async () => {
|
|
|
|
await planRepo.delete(ids.length > 0 ? ids : {})
|
|
|
|
await refresh(term)
|
|
|
|
setIds([])
|
|
|
|
}, [ids, refresh, term])
|
|
|
|
|
2022-12-22 04:08:01 +00:00
|
|
|
const select = useCallback(() => {
|
2023-06-27 03:16:59 +00:00
|
|
|
setIds(plans.map((plan) => plan.id))
|
2022-12-22 04:08:01 +00:00
|
|
|
}, [plans])
|
|
|
|
|
2022-07-11 00:28:30 +00:00
|
|
|
return (
|
2022-10-22 23:35:58 +00:00
|
|
|
<>
|
2023-01-03 04:21:51 +00:00
|
|
|
<DrawerHeader name={ids.length > 0 ? `${ids.length} selected` : 'Plans'}>
|
2022-12-21 00:02:53 +00:00
|
|
|
<ListMenu
|
|
|
|
onClear={clear}
|
|
|
|
onCopy={copy}
|
|
|
|
onDelete={remove}
|
|
|
|
onEdit={edit}
|
|
|
|
ids={ids}
|
2022-12-22 04:08:01 +00:00
|
|
|
onSelect={select}
|
2022-12-21 00:02:53 +00:00
|
|
|
/>
|
2022-12-18 00:23:10 +00:00
|
|
|
</DrawerHeader>
|
2022-10-28 05:59:54 +00:00
|
|
|
<Page onAdd={onAdd} term={term} search={search}>
|
2023-06-27 03:16:59 +00:00
|
|
|
{plans?.length === 0
|
|
|
|
? (
|
|
|
|
<List.Item
|
|
|
|
title='No plans yet'
|
|
|
|
description='A plan is a list of workouts for certain days.'
|
|
|
|
/>
|
|
|
|
)
|
|
|
|
: (
|
|
|
|
<FlatList
|
|
|
|
style={{ flex: 1 }}
|
|
|
|
data={plans}
|
|
|
|
renderItem={renderItem}
|
|
|
|
keyExtractor={(set) => set.id?.toString() || ''}
|
|
|
|
/>
|
|
|
|
)}
|
2022-10-22 23:35:58 +00:00
|
|
|
</Page>
|
|
|
|
</>
|
2022-10-31 04:22:08 +00:00
|
|
|
)
|
2022-07-11 00:28:30 +00:00
|
|
|
}
|