2022-11-01 23:58:57 +00:00
|
|
|
import {NavigationProp, useNavigation} from '@react-navigation/native'
|
2022-10-31 04:22:08 +00:00
|
|
|
import React, {useCallback, useState} from 'react'
|
|
|
|
import {GestureResponderEvent, ListRenderItemInfo, View} from 'react-native'
|
2022-11-13 22:35:09 +00:00
|
|
|
import {List, Menu, RadioButton, useTheme} from 'react-native-paper'
|
2022-11-01 23:51:15 +00:00
|
|
|
import {Like} from 'typeorm'
|
2022-10-31 04:22:08 +00:00
|
|
|
import CountMany from './count-many'
|
2022-11-01 23:51:15 +00:00
|
|
|
import {getNow, setRepo} from './db'
|
2022-11-01 23:58:57 +00:00
|
|
|
import {PlanPageParams} from './plan-page-params'
|
2022-11-01 23:51:15 +00:00
|
|
|
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) {
|
2022-10-31 04:22:08 +00:00
|
|
|
const {index, item, onSelect, selected, onUndo} = props
|
2022-10-31 08:32:33 +00:00
|
|
|
const {colors} = useTheme()
|
2022-10-31 04:22:08 +00:00
|
|
|
const [anchor, setAnchor] = useState({x: 0, y: 0})
|
|
|
|
const [showMenu, setShowMenu] = useState(false)
|
2022-11-01 23:58:57 +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()
|
2022-11-01 23:51:15 +00:00
|
|
|
const created = now.split('T')[0]
|
2022-10-31 00:20:36 +00:00
|
|
|
const first = await setRepo.findOne({
|
2022-11-01 23:51:15 +00:00
|
|
|
where: {
|
|
|
|
name: item.name,
|
|
|
|
hidden: 0 as any,
|
|
|
|
created: Like(`${created}%`),
|
|
|
|
},
|
2022-10-31 00:20:36 +00:00
|
|
|
order: {created: 'desc'},
|
2022-10-31 04:22:08 +00:00
|
|
|
})
|
|
|
|
setShowMenu(false)
|
2022-11-01 23:51:15 +00:00
|
|
|
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) => {
|
2022-10-31 04:22:08 +00:00
|
|
|
setAnchor({x: e.nativeEvent.pageX, y: e.nativeEvent.pageY})
|
|
|
|
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
|
|
|
|
2022-11-01 23:58:57 +00:00
|
|
|
const edit = async () => {
|
2023-01-04 00:24:49 +00:00
|
|
|
const now = await getNow()
|
2022-11-01 23:58:57 +00:00
|
|
|
const created = now.split('T')[0]
|
|
|
|
const first = await setRepo.findOne({
|
|
|
|
where: {
|
|
|
|
name: item.name,
|
|
|
|
hidden: 0 as any,
|
|
|
|
created: Like(`${created}%`),
|
|
|
|
},
|
|
|
|
order: {created: 'desc'},
|
|
|
|
})
|
|
|
|
setShowMenu(false)
|
|
|
|
if (!first) return toast('Nothing to edit.')
|
|
|
|
navigate('EditSet', {set: first})
|
|
|
|
}
|
|
|
|
|
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}
|
2022-11-12 05:19:39 +00:00
|
|
|
description={
|
|
|
|
item.sets ? `${item.total} / ${item.sets}` : item.total.toString()
|
|
|
|
}
|
2022-10-30 02:23:22 +00:00
|
|
|
onPress={() => onSelect(index)}
|
|
|
|
left={() => (
|
|
|
|
<View style={{alignItems: 'center', justifyContent: 'center'}}>
|
|
|
|
<RadioButton
|
|
|
|
onPress={() => onSelect(index)}
|
|
|
|
value={index.toString()}
|
|
|
|
status={selected === index ? 'checked' : 'unchecked'}
|
2022-10-31 08:32:33 +00:00
|
|
|
color={colors.primary}
|
2022-10-30 02:23:22 +00:00
|
|
|
/>
|
|
|
|
</View>
|
|
|
|
)}
|
2022-10-30 02:34:17 +00:00
|
|
|
right={() => (
|
2022-11-12 05:19:39 +00:00
|
|
|
<View
|
|
|
|
style={{
|
|
|
|
width: '25%',
|
|
|
|
justifyContent: 'center',
|
|
|
|
}}>
|
2022-10-30 02:34:17 +00:00
|
|
|
<Menu
|
|
|
|
anchor={anchor}
|
|
|
|
visible={showMenu}
|
|
|
|
onDismiss={() => setShowMenu(false)}>
|
2022-11-01 23:58:57 +00:00
|
|
|
<Menu.Item icon="edit" onPress={edit} title="Edit" />
|
2022-10-30 02:34:17 +00:00
|
|
|
<Menu.Item icon="undo" onPress={undo} title="Undo" />
|
|
|
|
</Menu>
|
2022-11-12 05:19:39 +00:00
|
|
|
</View>
|
2022-10-30 02:34:17 +00:00
|
|
|
)}
|
2022-10-30 02:23:22 +00:00
|
|
|
/>
|
2022-10-31 04:22:08 +00:00
|
|
|
)
|
2022-10-30 02:23:22 +00:00
|
|
|
}
|