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"; import CountMany from "./count-many"; import { getNow, setRepo } from "./db"; import { emitter } from "./emitter"; import { GraphsPageParams } from "./GraphsPage"; import { GYM_SET_DELETED } from "./gym-set"; import { HomePageParams } from "./home-page-params"; import { PlanPageParams } from "./plan-page-params"; import { toast } from "./toast"; interface Props extends ListRenderItemInfo { onSelect: (index: number) => void; selected: number; onUndo: () => void; } export default function StartPlanItem(props: Props) { const { index, item, onSelect, selected, onUndo } = props; const { colors } = useTheme(); const [anchor, setAnchor] = useState({ x: 0, y: 0 }); const [showMenu, setShowMenu] = useState(false); const { navigate } = useNavigation>(); const { navigate: navigateHome } = useNavigation>(); const { navigate: navigateGraph } = useNavigation>(); const undo = useCallback(async () => { 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}%`), }, order: { created: "desc" }, }); setShowMenu(false); if (!first) return toast("Nothing to undo."); await setRepo.delete(first.id); emitter.emit(GYM_SET_DELETED, first); onUndo(); }, [setShowMenu, onUndo, item.name]); const longPress = useCallback( (e: GestureResponderEvent) => { setAnchor({ x: e.nativeEvent.pageX, y: e.nativeEvent.pageY }); setShowMenu(true); }, [setShowMenu, setAnchor] ); const edit = useCallback(async () => { 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}%`), }, order: { created: "desc" }, }); setShowMenu(false); if (!first) return toast("Nothing to edit."); navigate("EditSet", { set: first }); }, [item.name, navigate]); const view = useCallback(() => { setShowMenu(false); navigateHome("Sets", { search: item.name }); }, [item.name, navigateHome]); const graph = useCallback(() => { setShowMenu(false); navigateGraph("ViewGraph", { name: item.name }); }, [item.name, navigateGraph]); const left = useCallback( () => ( onSelect(index)} value={index.toString()} status={selected === index ? "checked" : "unchecked"} color={colors.primary} /> ), [index, selected, colors.primary, onSelect] ); const right = useCallback( () => ( setShowMenu(false)} > ), [anchor, showMenu, edit, undo, view, graph] ); return ( onSelect(index)} left={left} right={right} /> ); }