import { ArchiveIcon, ArchiveRestoreIcon, BookmarkMinusIcon, BookmarkPlusIcon, CheckCheckIcon, CopyIcon, Edit3Icon, FileTextIcon, LinkIcon, ListChecksIcon, ListRestartIcon, MoreVerticalIcon, TrashIcon, } from "lucide-react"; import { useState } from "react"; import ConfirmDialog from "@/components/ConfirmDialog"; import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { State } from "@/types/proto/api/v1/common_pb"; import { useTranslate } from "@/utils/i18n"; import { countTasks } from "@/utils/markdown-manipulation"; import { useMemoActionHandlers } from "./hooks"; import type { MemoActionMenuProps } from "./types"; const MemoActionMenu = (props: MemoActionMenuProps) => { const { memo, readonly } = props; const t = useTranslate(); // Dialog state const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); // Derived state const isComment = Boolean(memo.parent); const isArchived = memo.state === State.ARCHIVED; const taskStats = countTasks(memo.content); const canMutateTasks = !readonly && !isArchived && taskStats.total > 0; const hasOpenTasks = taskStats.completed < taskStats.total; const hasCompletedTasks = taskStats.completed > 0; // Action handlers const { handleTogglePinMemoBtnClick, handleEditMemoClick, handleToggleMemoStatusClick, handleCopyLink, handleCopyContent, handleCheckAllTaskListItemsClick, handleUncheckAllTaskListItemsClick, handleDeleteMemoClick, confirmDeleteMemo, } = useMemoActionHandlers({ memo, onEdit: props.onEdit, setDeleteDialogOpen, }); return ( {/* Edit actions (non-readonly, non-archived) */} {!readonly && !isArchived && ( <> {!isComment && ( {memo.pinned ? : } {memo.pinned ? t("common.unpin") : t("common.pin")} )} {t("common.edit")} )} {/* Copy submenu (non-archived) */} {!isArchived && ( {t("common.copy")} {t("memo.copy-link")} {t("memo.copy-content")} )} {/* Task submenu (writable task memos) */} {canMutateTasks && ( {t("memo.task-actions.title")} {t("memo.task-actions.check-all")} {t("memo.task-actions.uncheck-all")} )} {/* Write actions (non-readonly) */} {!readonly && ( <> {/* Archive/Restore (non-comment) */} {!isComment && ( {isArchived ? : } {isArchived ? t("common.restore") : t("common.archive")} )} {/* Delete */} {t("common.delete")} )} {/* Delete confirmation dialog */} ); }; export default MemoActionMenu;