Massive/StartPlanItem.tsx

63 lines
1.8 KiB
TypeScript
Raw Normal View History

2022-10-30 02:34:17 +00:00
import React, {useCallback, useState} from 'react';
import {GestureResponderEvent, ListRenderItemInfo, View} from 'react-native';
import {List, Menu, RadioButton} from 'react-native-paper';
2022-10-30 02:23:22 +00:00
import {useColor} from './color';
import CountMany from './count-many';
2022-10-30 02:34:17 +00:00
import {deleteFirst} from './set.service';
2022-10-30 02:23:22 +00:00
interface Props extends ListRenderItemInfo<CountMany> {
onSelect: (index: number) => void;
selected: number;
2022-10-30 02:34:17 +00:00
onUndo: () => void;
2022-10-30 02:23:22 +00:00
}
export default function StartPlanItem(props: Props) {
2022-10-30 02:34:17 +00:00
const {index, item, onSelect, selected, onUndo} = props;
2022-10-30 02:23:22 +00:00
const {color} = useColor();
2022-10-30 02:34:17 +00:00
const [anchor, setAnchor] = useState({x: 0, y: 0});
const [showMenu, setShowMenu] = useState(false);
const undo = useCallback(async () => {
await deleteFirst(item.name);
setShowMenu(false);
onUndo();
}, [setShowMenu, item.name, onUndo]);
const longPress = useCallback(
(e: GestureResponderEvent) => {
setAnchor({x: e.nativeEvent.pageX, y: e.nativeEvent.pageY});
setShowMenu(true);
},
[setShowMenu, setAnchor],
);
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}
description={item.total.toString()}
onPress={() => onSelect(index)}
left={() => (
<View style={{alignItems: 'center', justifyContent: 'center'}}>
<RadioButton
onPress={() => onSelect(index)}
value={index.toString()}
status={selected === index ? 'checked' : 'unchecked'}
color={color}
/>
</View>
)}
2022-10-30 02:34:17 +00:00
right={() => (
<>
<Menu
anchor={anchor}
visible={showMenu}
onDismiss={() => setShowMenu(false)}>
<Menu.Item icon="undo" onPress={undo} title="Undo" />
</Menu>
</>
)}
2022-10-30 02:23:22 +00:00
/>
);
}