import copy from "copy-to-clipboard"; import { ArchiveIcon, ArchiveRestoreIcon, BookmarkMinusIcon, BookmarkPlusIcon, CopyIcon, Edit3Icon, MoreVerticalIcon, TrashIcon, SquareCheckIcon, } from "lucide-react"; import { observer } from "mobx-react-lite"; import toast from "react-hot-toast"; import { useLocation } from "react-router-dom"; import { markdownServiceClient } from "@/grpcweb"; import useNavigateTo from "@/hooks/useNavigateTo"; import { memoStore, userStore } from "@/store"; import { workspaceStore } from "@/store"; import { State } from "@/types/proto/api/v1/common"; import { NodeType } from "@/types/proto/api/v1/markdown_service"; import { Memo } from "@/types/proto/api/v1/memo_service"; import { useTranslate } from "@/utils/i18n"; import { Button } from "./ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "./ui/dropdown-menu"; interface Props { memo: Memo; readonly?: boolean; className?: string; onEdit?: () => void; } const checkHasCompletedTaskList = (memo: Memo) => { for (const node of memo.nodes) { if (node.type === NodeType.LIST && node.listNode?.children && node.listNode?.children?.length > 0) { for (let j = 0; j < node.listNode.children.length; j++) { if (node.listNode.children[j].type === NodeType.TASK_LIST_ITEM && node.listNode.children[j].taskListItemNode?.complete) { return true; } } } } return false; }; const MemoActionMenu = observer((props: Props) => { const { memo, readonly } = props; const t = useTranslate(); const location = useLocation(); const navigateTo = useNavigateTo(); const hasCompletedTaskList = checkHasCompletedTaskList(memo); const isInMemoDetailPage = location.pathname.startsWith(`/${memo.name}`); const isComment = Boolean(memo.parent); const isArchived = memo.state === State.ARCHIVED; const memoUpdatedCallback = () => { // Refresh user stats. userStore.setStatsStateId(); }; const handleTogglePinMemoBtnClick = async () => { try { if (memo.pinned) { await memoStore.updateMemo( { name: memo.name, pinned: false, }, ["pinned"], ); } else { await memoStore.updateMemo( { name: memo.name, pinned: true, }, ["pinned"], ); } } catch { // do nth } }; const handleEditMemoClick = () => { if (props.onEdit) { props.onEdit(); return; } }; //() => Promise.resolve(42) const handleToggleMemoStatusClick = async () => { //just review async in notes //changing the state const state = memo.state === State.ARCHIVED ? State.NORMAL : State.ARCHIVED; //showing message depending on state const message = memo.state === State.ARCHIVED ? t("message.restored-successfully") : t("message.archived-successfully"); try { await memoStore.updateMemo( { name: memo.name, state }, ["state"], ); // Show toast with Undo button toast.custom((tToast) => (