Massive/StartPlanItem.tsx

110 lines
3.1 KiB
TypeScript
Raw Normal View History

2023-06-27 03:16:59 +00:00
import { NavigationProp, useNavigation } from '@react-navigation/native'
import React, { useCallback, useState } from 'react'
import { GestureResponderEvent, ListRenderItemInfo, View } from 'react-native'
import { List, Menu, RadioButton, useTheme } from 'react-native-paper'
import { Like } from 'typeorm'
2022-10-31 04:22:08 +00:00
import CountMany from './count-many'
2023-06-27 03:16:59 +00:00
import { getNow, setRepo } from './db'
import { PlanPageParams } from './plan-page-params'
import { toast } from './toast'
2022-10-30 02:23:22 +00:00
interface Props extends ListRenderItemInfo<CountMany> {
2022-10-31 04:22:08 +00:00
onSelect: (index: number) => void
selected: number
onUndo: () => void
2022-10-30 02:23:22 +00:00
}
export default function StartPlanItem(props: Props) {
2023-06-27 03:16:59 +00:00
const { index, item, onSelect, selected, onUndo } = props
const { colors } = useTheme()
const [anchor, setAnchor] = useState({ x: 0, y: 0 })
2022-10-31 04:22:08 +00:00
const [showMenu, setShowMenu] = useState(false)
2023-06-27 03:16:59 +00:00
const { navigate } = useNavigation<NavigationProp<PlanPageParams>>()
2022-10-30 02:34:17 +00:00
const undo = useCallback(async () => {
2023-01-04 00:24:49 +00:00
const now = await getNow()
const created = now.split('T')[0]
const first = await setRepo.findOne({
where: {
name: item.name,
hidden: 0 as any,
created: Like(`${created}%`),
},
2023-06-27 03:16:59 +00:00
order: { created: 'desc' },
2022-10-31 04:22:08 +00:00
})
setShowMenu(false)
if (!first) return toast('Nothing to undo.')
await setRepo.delete(first.id)
2022-10-31 04:22:08 +00:00
onUndo()
}, [setShowMenu, onUndo, item.name])
2022-10-30 02:34:17 +00:00
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)
2022-10-30 02:34:17 +00:00
},
[setShowMenu, setAnchor],
2022-10-31 04:22:08 +00:00
)
2022-10-30 02:23:22 +00:00
const edit = useCallback(async () => {
2023-01-04 00:24:49 +00:00
const now = await getNow()
const created = now.split('T')[0]
const first = await setRepo.findOne({
where: {
name: item.name,
hidden: 0 as any,
created: Like(`${created}%`),
},
2023-06-27 03:16:59 +00:00
order: { created: 'desc' },
})
setShowMenu(false)
if (!first) return toast('Nothing to edit.')
2023-06-27 03:16:59 +00:00
navigate('EditSet', { set: first })
}, [item.name, navigate])
const left = useCallback(
() => (
<View style={{ alignItems: 'center', justifyContent: 'center' }}>
<RadioButton
onPress={() => onSelect(index)}
value={index.toString()}
status={selected === index ? 'checked' : 'unchecked'}
color={colors.primary}
/>
</View>
),
[index, selected, colors.primary, onSelect],
)
const right = useCallback(() => (
<View
style={{
width: '25%',
justifyContent: 'center',
}}
>
<Menu
anchor={anchor}
visible={showMenu}
onDismiss={() => setShowMenu(false)}
>
<Menu.Item leadingIcon='edit' onPress={edit} title='Edit' />
<Menu.Item leadingIcon='undo' onPress={undo} title='Undo' />
</Menu>
</View>
), [anchor, showMenu, edit, undo])
2022-10-30 02:23:22 +00:00
return (
<List.Item
2022-10-30 02:34:17 +00:00
onLongPress={longPress}
2022-10-30 02:23:22 +00:00
title={item.name}
2023-06-27 03:16:59 +00:00
description={item.sets
? `${item.total} / ${item.sets}`
: item.total.toString()}
2022-10-30 02:23:22 +00:00
onPress={() => onSelect(index)}
left={left}
right={right}
2022-10-30 02:23:22 +00:00
/>
2022-10-31 04:22:08 +00:00
)
2022-10-30 02:23:22 +00:00
}