From fa19434e77607c838f22bbb1514bc886b20bfb52 Mon Sep 17 00:00:00 2001 From: Brandon Presley Date: Sun, 18 Dec 2022 13:23:10 +1300 Subject: [PATCH] Refactor DrawerMenu Closes #132 --- DrawerHeader.tsx | 9 ++-- DrawerMenu.tsx | 122 ----------------------------------------------- EditSets.tsx | 2 +- PlanList.tsx | 96 ++++++++++++++++++++++++++++++++++++- SetList.tsx | 102 +++++++++++++++++++++++++++++++++++++-- 5 files changed, 197 insertions(+), 134 deletions(-) delete mode 100644 DrawerMenu.tsx diff --git a/DrawerHeader.tsx b/DrawerHeader.tsx index fb3529a..1ddbfb7 100644 --- a/DrawerHeader.tsx +++ b/DrawerHeader.tsx @@ -2,17 +2,14 @@ import {DrawerNavigationProp} from '@react-navigation/drawer' import {useNavigation} from '@react-navigation/native' import {Appbar, IconButton} from 'react-native-paper' import {DrawerParamList} from './drawer-param-list' -import DrawerMenu from './DrawerMenu' import useDark from './use-dark' export default function DrawerHeader({ name, - ids, - setIds, + children, }: { name: keyof DrawerParamList - ids?: number[] - setIds?: (values: number[]) => void + children?: JSX.Element | JSX.Element[] }) { const navigation = useNavigation>() const dark = useDark() @@ -25,7 +22,7 @@ export default function DrawerHeader({ onPress={navigation.openDrawer} /> - + {children} ) } diff --git a/DrawerMenu.tsx b/DrawerMenu.tsx deleted file mode 100644 index 6fe6cc5..0000000 --- a/DrawerMenu.tsx +++ /dev/null @@ -1,122 +0,0 @@ -import {NavigationProp, useNavigation} from '@react-navigation/native' -import {useCallback, useState} from 'react' -import {Divider, IconButton, Menu} from 'react-native-paper' -import ConfirmDialog from './ConfirmDialog' -import {planRepo, setRepo} from './db' -import {DrawerParamList} from './drawer-param-list' -import {HomePageParams} from './home-page-params' -import {PlanPageParams} from './plan-page-params' -import useDark from './use-dark' - -export default function DrawerMenu({ - name, - ids, - setIds, -}: { - name: keyof DrawerParamList - ids?: number[] - setIds?: (values: number[]) => void -}) { - const [showMenu, setShowMenu] = useState(false) - const [showRemove, setShowRemove] = useState(false) - const {reset} = useNavigation>() - const home = useNavigation>() - const plans = useNavigation>() - const dark = useDark() - - const remove = useCallback(async () => { - setShowMenu(false) - setShowRemove(false) - if (name === 'Home') await setRepo.delete(ids.length > 0 ? ids : {}) - else if (name === 'Plans') await planRepo.delete(ids.length > 0 ? ids : {}) - reset({index: 0, routes: [{name}]}) - }, [reset, name, ids]) - - const edit = useCallback(async () => { - setShowMenu(false) - if (name === 'Home') home.navigate('EditSets', {ids}) - else if (name === 'Plans') { - const plan = await planRepo.findOne({where: {id: ids[0]}}) - plans.navigate('EditPlan', {plan}) - } - setIds([]) - }, [ids, home, name, plans, setIds]) - - const copy = useCallback(async () => { - if (name === 'Home') { - const set = await setRepo.findOne({ - where: {id: ids.pop()}, - }) - delete set.id - home.navigate('EditSet', {set}) - } else if (name === 'Plans') { - const plan = await planRepo.findOne({ - where: {id: ids.pop()}, - }) - delete plan.id - plans.navigate('EditPlan', {plan}) - } - setShowMenu(false) - setIds([]) - }, [name, home, plans, setIds, ids]) - - const clear = useCallback(() => { - setShowMenu(false) - setIds([]) - }, [setIds]) - - if (name === 'Home' || name === 'Plans') - return ( - setShowMenu(false)} - anchor={ - setShowMenu(true)} - icon="more-vert" - /> - }> - - - - - - setShowRemove(true)} - title="Delete" - /> - - setShowMenu(false)}> - {ids?.length === 0 ? ( - <>This irreversibly deletes all data from the app. Are you sure? - ) : ( - <>This will delete {ids?.length} records. Are you sure? - )} - - - ) - - return null -} diff --git a/EditSets.tsx b/EditSets.tsx index 9d084b2..6be84e4 100644 --- a/EditSets.tsx +++ b/EditSets.tsx @@ -59,7 +59,7 @@ export default function EditSets() { if (weight) update.weight = Number(weight) if (unit) update.unit = unit if (newImage) update.image = newImage - await setRepo.update(ids, update) + if (Object.keys(update).length > 0) await setRepo.update(ids, update) navigation.goBack() } diff --git a/PlanList.tsx b/PlanList.tsx index 4602387..0b4ec35 100644 --- a/PlanList.tsx +++ b/PlanList.tsx @@ -5,19 +5,24 @@ import { } from '@react-navigation/native' import {useCallback, useState} from 'react' import {FlatList} from 'react-native' -import {List} from 'react-native-paper' +import {Divider, IconButton, List, Menu} from 'react-native-paper' import {Like} from 'typeorm' +import ConfirmDialog from './ConfirmDialog' import {planRepo} from './db' import DrawerHeader from './DrawerHeader' import Page from './Page' import {Plan} from './plan' import {PlanPageParams} from './plan-page-params' import PlanItem from './PlanItem' +import useDark from './use-dark' export default function PlanList() { const [term, setTerm] = useState('') const [plans, setPlans] = useState() const [ids, setIds] = useState([]) + const [showMenu, setShowMenu] = useState(false) + const [showRemove, setShowRemove] = useState(false) + const dark = useDark() const navigation = useNavigation>() const refresh = useCallback(async (value: string) => { @@ -52,9 +57,96 @@ export default function PlanList() { const onAdd = () => navigation.navigate('EditPlan', {plan: {days: '', workouts: ''}}) + const edit = useCallback(async () => { + setShowMenu(false) + const plan = await planRepo.findOne({where: {id: ids.pop()}}) + navigation.navigate('EditPlan', {plan}) + setIds([]) + }, [ids, navigation]) + + const copy = useCallback(async () => { + setShowMenu(false) + const plan = await planRepo.findOne({ + where: {id: ids.pop()}, + }) + delete plan.id + navigation.navigate('EditPlan', {plan}) + setIds([]) + }, [ids, navigation]) + + const clear = useCallback(() => { + setShowMenu(false) + setIds([]) + }, []) + + const remove = useCallback(async () => { + setShowMenu(false) + setShowRemove(false) + await planRepo.delete(ids.length > 0 ? ids : {}) + await refresh(term) + setIds([]) + }, [ids, refresh, term]) + + const menuItems = ( + <> + + + + + setShowRemove(true)} + title="Delete" + /> + + ) + return ( <> - + + setShowMenu(false)} + anchor={ + setShowMenu(true)} + icon="more-vert" + /> + }> + {menuItems} + + setShowMenu(false)}> + {ids?.length === 0 ? ( + <> + This irreversibly deletes all plans from the app. Are you sure? + + ) : ( + <>This will delete {ids?.length} plan(s). Are you sure? + )} + + + {plans?.length === 0 ? ( () const [ids, setIds] = useState([]) + const [showMenu, setShowMenu] = useState(false) + const [showRemove, setShowRemove] = useState(false) + const dark = useDark() const navigation = useNavigation>() const refresh = useCallback(async (value: string) => { - console.log(`${SetList.name}.refresh:`, {value, limit}) const newSets = await setRepo.find({ where: {name: Like(`%${value}%`), hidden: 0 as any}, take: limit, skip: 0, order: {created: 'DESC'}, }) + console.log(`${SetList.name}.refresh:`, { + value, + limit, + length: newSets.length, + }) setSets(newSets) setOffset(0) setEnd(false) @@ -94,9 +103,96 @@ export default function SetList() { [refresh], ) + const edit = useCallback(() => { + setShowMenu(false) + navigation.navigate('EditSets', {ids}) + setIds([]) + }, [ids, navigation]) + + const copy = useCallback(async () => { + setShowMenu(false) + const set = await setRepo.findOne({ + where: {id: ids.pop()}, + }) + delete set.id + delete set.created + navigation.navigate('EditSet', {set}) + setIds([]) + }, [ids, navigation]) + + const clear = useCallback(() => { + setShowMenu(false) + setIds([]) + }, []) + + const remove = useCallback(async () => { + setShowMenu(false) + setShowRemove(false) + await setRepo.delete(ids.length > 0 ? ids : {}) + await refresh(term) + }, [ids, refresh, term]) + + const menuItems = ( + <> + + + + + setShowRemove(true)} + title="Delete" + /> + + ) + return ( <> - + + setShowMenu(false)} + anchor={ + setShowMenu(true)} + icon="more-vert" + /> + }> + {menuItems} + + setShowMenu(false)}> + {ids?.length === 0 ? ( + <> + This irreversibly deletes all sets from the app. Are you sure? + + ) : ( + <>This will delete {ids?.length} set(s). Are you sure? + )} + + + + {sets?.length === 0 ? (