Massive/PlanList.tsx
Brandon Presley e5d9f5fa92 Add select all button
Very useful final addition to the multi edit/delete function.
Typically a user will search for certain criteria, and then select
them all to be removed/edited. For example, if yesterdays sets were all
10x150kg deadlifts, but you review your form video and decide the form
sucked, you would want to mass edit them to lower the weight/reps (or
maybe delete them). This way you won't have these invalid entries
ruining all your progress graphs (showing false progress).
2022-12-22 17:10:14 +13:00

115 lines
2.8 KiB
TypeScript

import {
NavigationProp,
useFocusEffect,
useNavigation,
} from '@react-navigation/native'
import {useCallback, useState} from 'react'
import {FlatList} from 'react-native'
import {List} from 'react-native-paper'
import {Like} from 'typeorm'
import {planRepo} from './db'
import DrawerHeader from './DrawerHeader'
import ListMenu from './ListMenu'
import Page from './Page'
import {Plan} from './plan'
import {PlanPageParams} from './plan-page-params'
import PlanItem from './PlanItem'
export default function PlanList() {
const [term, setTerm] = useState('')
const [plans, setPlans] = useState<Plan[]>()
const [ids, setIds] = useState<number[]>([])
const navigation = useNavigation<NavigationProp<PlanPageParams>>()
const refresh = useCallback(async (value: string) => {
planRepo
.find({
where: [{days: Like(`%${value}%`)}, {workouts: Like(`%${value}%`)}],
})
.then(setPlans)
}, [])
useFocusEffect(
useCallback(() => {
refresh(term)
}, [refresh, term]),
)
const search = useCallback(
(value: string) => {
setTerm(value)
refresh(value)
},
[refresh],
)
const renderItem = useCallback(
({item}: {item: Plan}) => (
<PlanItem ids={ids} setIds={setIds} item={item} key={item.id} />
),
[ids],
)
const onAdd = () =>
navigation.navigate('EditPlan', {plan: {days: '', workouts: ''}})
const edit = useCallback(async () => {
const plan = await planRepo.findOne({where: {id: ids.pop()}})
navigation.navigate('EditPlan', {plan})
setIds([])
}, [ids, navigation])
const copy = useCallback(async () => {
const plan = await planRepo.findOne({
where: {id: ids.pop()},
})
delete plan.id
navigation.navigate('EditPlan', {plan})
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])
const select = useCallback(() => {
setIds(plans.map(plan => plan.id))
}, [plans])
return (
<>
<DrawerHeader name="Plans">
<ListMenu
onClear={clear}
onCopy={copy}
onDelete={remove}
onEdit={edit}
ids={ids}
onSelect={select}
/>
</DrawerHeader>
<Page onAdd={onAdd} term={term} search={search}>
{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() || ''}
/>
)}
</Page>
</>
)
}