import { useCallback, useEffect, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { ActionIcon, Popover, Stack } from "@mantine/core"; import { IconDots, IconEyeOff, IconSettings } from "@tabler/icons-react"; import { useAtom } from "jotai"; import { propertyMenuCloseRequestAtomFamily, propertyMenuDirtyAtomFamily, } from "@/ee/base/atoms/base-atoms"; import { IBaseProperty } from "@/ee/base/types/base.types"; import { MenuItem, PropertyMenuContent, } from "@/ee/base/components/property/property-menu"; type KanbanColumnMenuProps = { property: IBaseProperty; pageId: string; onHide: () => void; }; export function KanbanColumnMenu({ property, pageId, onHide }: KanbanColumnMenuProps) { const { t } = useTranslation(); const [opened, setOpened] = useState(false); const [view, setView] = useState<"menu" | "property">("menu"); const [dirty, setDirty] = useAtom(propertyMenuDirtyAtomFamily(pageId)) as unknown as [boolean, (val: boolean) => void]; const [closeRequest, setCloseRequest] = useAtom(propertyMenuCloseRequestAtomFamily(pageId)) as unknown as [number, (val: number) => void]; const handleClose = useCallback(() => { setOpened(false); setView("menu"); }, []); const wasOpenedRef = useRef(opened); useEffect(() => { if (wasOpenedRef.current && !opened) setDirty(false); wasOpenedRef.current = opened; }, [opened, setDirty]); const handleOpenChange = useCallback( (next: boolean) => { if (next) return; if (dirty) { setCloseRequest(closeRequest + 1); } else { handleClose(); } }, [dirty, closeRequest, setCloseRequest, handleClose], ); const toggle = useCallback(() => { if (opened) { handleOpenChange(false); } else if (!dirty) { setOpened(true); } }, [opened, dirty, handleOpenChange]); return ( e.stopPropagation()} onKeyDown={(e) => e.stopPropagation()} > {view === "menu" ? ( } label={t("Edit property")} onClick={() => setView("property")} /> } label={t("Hide group")} onClick={() => { handleClose(); onHide(); }} /> ) : ( )} ); }