Massive/WorkoutItem.tsx

93 lines
2.5 KiB
TypeScript
Raw Normal View History

2023-06-27 03:16:59 +00:00
import { NavigationProp, useNavigation } from '@react-navigation/native'
import { useCallback, useMemo, useState } from 'react'
import { GestureResponderEvent, Image } from 'react-native'
import { List, Menu, Text } from 'react-native-paper'
2022-10-31 04:22:08 +00:00
import ConfirmDialog from './ConfirmDialog'
2023-06-27 03:16:59 +00:00
import { setRepo } from './db'
2022-10-31 04:22:08 +00:00
import GymSet from './gym-set'
2023-06-27 03:16:59 +00:00
import { WorkoutsPageParams } from './WorkoutsPage'
export default function WorkoutItem({
item,
2022-10-29 23:56:58 +00:00
onRemove,
images,
}: {
2022-10-31 04:22:08 +00:00
item: GymSet
onRemove: () => void
images: boolean
}) {
2022-10-31 04:22:08 +00:00
const [showMenu, setShowMenu] = useState(false)
2023-06-27 03:16:59 +00:00
const [anchor, setAnchor] = useState({ x: 0, y: 0 })
2022-10-31 04:22:08 +00:00
const [showRemove, setShowRemove] = useState('')
const navigation = useNavigation<NavigationProp<WorkoutsPageParams>>()
const remove = useCallback(async () => {
2023-06-27 03:16:59 +00:00
await setRepo.delete({ name: item.name })
2022-10-31 04:22:08 +00:00
setShowMenu(false)
onRemove()
}, [setShowMenu, onRemove, item.name])
const longPress = useCallback(
(e: GestureResponderEvent) => {
2023-06-27 03:16:59 +00:00
setAnchor({ x: e.nativeEvent.pageX, y: e.nativeEvent.pageY })
2022-10-31 04:22:08 +00:00
setShowMenu(true)
},
[setShowMenu, setAnchor],
2022-10-31 04:22:08 +00:00
)
const description = useMemo(() => {
2022-10-31 04:22:08 +00:00
const seconds = item.seconds?.toString().padStart(2, '0')
return `${item.sets} x ${item.minutes || 0}:${seconds}`
}, [item])
return (
<>
<List.Item
2023-06-27 03:16:59 +00:00
onPress={() => navigation.navigate('EditWorkout', { value: item })}
title={item.name}
description={description}
onLongPress={longPress}
left={() =>
images &&
item.image && (
2023-06-27 03:16:59 +00:00
<Image
source={{ uri: item.image }}
style={{ height: 75, width: 75 }}
/>
)}
right={() => (
<Text
style={{
alignSelf: 'center',
2023-06-27 03:16:59 +00:00
}}
>
<Menu
anchor={anchor}
visible={showMenu}
2023-06-27 03:16:59 +00:00
onDismiss={() => setShowMenu(false)}
>
<Menu.Item
2023-06-27 03:16:59 +00:00
icon='delete'
onPress={() => {
2022-10-31 04:22:08 +00:00
setShowRemove(item.name)
setShowMenu(false)
}}
2023-06-27 03:16:59 +00:00
title='Delete'
/>
</Menu>
</Text>
)}
/>
<ConfirmDialog
title={`Delete ${showRemove}`}
show={!!showRemove}
2023-06-27 03:16:59 +00:00
setShow={(show) => (show ? null : setShowRemove(''))}
onOk={remove}
>
This irreversibly deletes ALL sets related to this workout. Are you
sure?
</ConfirmDialog>
</>
2022-10-31 04:22:08 +00:00
)
}