diff --git a/EditPlan.tsx b/EditPlan.tsx index c857a85..4e69281 100644 --- a/EditPlan.tsx +++ b/EditPlan.tsx @@ -79,8 +79,7 @@ export default function EditPlan() { {DAYS.map(day => ( toggleDay(value, day)} - onPress={() => toggleDay(!days.includes(day), day)} + onChange={value => toggleDay(value, day)} value={days.includes(day)}> {day} @@ -94,9 +93,8 @@ export default function EditPlan() { names.map(name => ( toggleWorkout(value, name)} - value={workouts.includes(name)} - onPress={() => toggleWorkout(!workouts.includes(name), name)}> + onChange={value => toggleWorkout(value, name)} + value={workouts.includes(name)}> {name} )) diff --git a/ListMenu.tsx b/ListMenu.tsx new file mode 100644 index 0000000..f4d1100 --- /dev/null +++ b/ListMenu.tsx @@ -0,0 +1,101 @@ +import {useState} from 'react' +import {Divider, IconButton, Menu} from 'react-native-paper' +import ConfirmDialog from './ConfirmDialog' +import useDark from './use-dark' + +export default function ListMenu({ + onEdit, + onCopy, + onClear, + onDelete, + onSelect, + ids, +}: { + onEdit: () => void + onCopy: () => void + onClear: () => void + onDelete: () => void + onSelect: () => void + ids?: number[] +}) { + const [showMenu, setShowMenu] = useState(false) + const [showRemove, setShowRemove] = useState(false) + const dark = useDark() + + const edit = () => { + setShowMenu(false) + onEdit() + } + + const copy = () => { + setShowMenu(false) + onCopy() + } + + const clear = () => { + setShowMenu(false) + onClear() + } + + const remove = () => { + setShowMenu(false) + setShowRemove(false) + onDelete() + } + + const select = () => { + setShowMenu(false) + onSelect() + } + + return ( + setShowMenu(false)} + anchor={ + setShowMenu(true)} + icon="more-vert" + /> + }> + + + + + + setShowRemove(true)} + title="Delete" + /> + setShowMenu(false)}> + {ids?.length === 0 ? ( + <>This irreversibly deletes records from the app. Are you sure? + ) : ( + <>This will delete {ids?.length} record(s). Are you sure? + )} + + + ) +} diff --git a/PlanList.tsx b/PlanList.tsx index 0b4ec35..f7e9192 100644 --- a/PlanList.tsx +++ b/PlanList.tsx @@ -5,24 +5,20 @@ import { } from '@react-navigation/native' import {useCallback, useState} from 'react' import {FlatList} from 'react-native' -import {Divider, IconButton, List, Menu} from 'react-native-paper' +import {List} from 'react-native-paper' import {Like} from 'typeorm' -import ConfirmDialog from './ConfirmDialog' 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' -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) => { @@ -58,14 +54,12 @@ export default function PlanList() { 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()}, }) @@ -75,77 +69,30 @@ export default function PlanList() { }, [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" - /> - - ) + const select = useCallback(() => { + setIds(plans.map(plan => plan.id)) + }, [plans]) 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 ? ( diff --git a/SetList.tsx b/SetList.tsx index a08b212..9378c70 100644 --- a/SetList.tsx +++ b/SetList.tsx @@ -5,17 +5,16 @@ import { } from '@react-navigation/native' import {useCallback, useState} from 'react' import {FlatList} from 'react-native' -import {Divider, IconButton, List, Menu} from 'react-native-paper' +import {List} from 'react-native-paper' import {Like} from 'typeorm' -import ConfirmDialog from './ConfirmDialog' import {getNow, setRepo, settingsRepo} from './db' import DrawerHeader from './DrawerHeader' import GymSet, {defaultSet} from './gym-set' import {HomePageParams} from './home-page-params' +import ListMenu from './ListMenu' import Page from './Page' import SetItem from './SetItem' import Settings from './settings' -import useDark from './use-dark' const limit = 15 @@ -26,9 +25,6 @@ export default function SetList() { const [end, setEnd] = useState(false) const [settings, setSettings] = 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) => { @@ -104,13 +100,11 @@ export default function SetList() { ) 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()}, }) @@ -121,77 +115,30 @@ export default function SetList() { }, [ids, navigation]) const clear = useCallback(() => { - setShowMenu(false) setIds([]) }, []) const remove = useCallback(async () => { setIds([]) - setShowMenu(false) - setShowRemove(false) await setRepo.delete(ids.length > 0 ? ids : {}) await refresh(term) }, [ids, refresh, term]) - const menuItems = ( - <> - - - - - setShowRemove(true)} - title="Delete" - /> - - ) + const select = useCallback(() => { + setIds(sets.map(set => set.id)) + }, [sets]) 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? - )} - - + diff --git a/SettingsPage.tsx b/SettingsPage.tsx index b3b40b2..5987c80 100644 --- a/SettingsPage.tsx +++ b/SettingsPage.tsx @@ -5,13 +5,7 @@ import { } from '@react-navigation/native' import {format} from 'date-fns' import {useCallback, useMemo, useState} from 'react' -import { - DeviceEventEmitter, - FlatList, - NativeModules, - Platform, - View, -} from 'react-native' +import {DeviceEventEmitter, NativeModules, Platform, View} from 'react-native' import DocumentPicker from 'react-native-document-picker' import {Dirs, FileSystem} from 'react-native-file-access' import {Button, Subheading} from 'react-native-paper' @@ -54,7 +48,6 @@ export default function SettingsPage() { useFocusEffect( useCallback(() => { settingsRepo.findOne({where: {}}).then(settings => { - console.log(`${SettingsPage.name}.focus:`, settings) setAlarm(settings.alarm) setVibrate(settings.vibrate) setSound(settings.sound) @@ -198,12 +191,8 @@ export default function SettingsPage() { ) const renderSwitch = useCallback( - ({item}: {item: Input}) => ( - item.onChange(!item.value)} - key={item.name} - value={item.value} - onValueChange={item.onChange}> + (item: Input) => ( + {item.name} ), @@ -236,8 +225,9 @@ export default function SettingsPage() { ].filter(({name}) => name.toLowerCase().includes(term.toLowerCase())) const renderSelect = useCallback( - ({item}: {item: Input}) => ( + (item: Input) => (