import { Dropdown, Menu, MenuButton, MenuItem } from "@mui/joy"; import clsx from "clsx"; import copy from "copy-to-clipboard"; import toast from "react-hot-toast"; import { useLocation } from "react-router-dom"; import Icon from "@/components/Icon"; import useNavigateTo from "@/hooks/useNavigateTo"; import { useMemoStore } from "@/store/v1"; import { RowStatus } from "@/types/proto/api/v1/common"; import { Memo } from "@/types/proto/api/v1/memo_service"; import { useTranslate } from "@/utils/i18n"; interface Props { memo: Memo; className?: string; hiddenActions?: ("edit" | "archive" | "delete" | "share" | "pin")[]; onEdit?: () => void; } const MemoActionMenu = (props: Props) => { const { memo, hiddenActions } = props; const t = useTranslate(); const location = useLocation(); const navigateTo = useNavigateTo(); const memoStore = useMemoStore(); const isInMemoDetailPage = location.pathname.startsWith(`/m/${memo.uid}`); 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 (error) { // do nth } }; const handleEditMemoClick = () => { if (props.onEdit) { props.onEdit(); return; } }; const handleToggleMemoStatusClick = async () => { try { if (memo.rowStatus === RowStatus.ARCHIVED) { await memoStore.updateMemo( { name: memo.name, rowStatus: RowStatus.ACTIVE, }, ["row_status"], ); toast(t("message.restored-successfully")); } else { await memoStore.updateMemo( { name: memo.name, rowStatus: RowStatus.ARCHIVED, }, ["row_status"], ); toast.success(t("message.archived-successfully")); } } catch (error: any) { console.error(error); toast.error(error.response.data.message); return; } if (isInMemoDetailPage) { memo.rowStatus === RowStatus.ARCHIVED ? navigateTo("/") : navigateTo("/archived"); } }; const handleCopyLink = () => { copy(`${window.location.origin}/m/${memo.uid}`); toast.success(t("message.succeed-copy-link")); }; const handleDeleteMemoClick = async () => { const confirmed = window.confirm(t("memo.delete-confirm")); if (confirmed) { await memoStore.deleteMemo(memo.name); toast.success(t("message.deleted-successfully")); if (isInMemoDetailPage) { navigateTo("/"); } } }; return ( {!hiddenActions?.includes("pin") && ( {memo.pinned ? : } {memo.pinned ? t("common.unpin") : t("common.pin")} )} {!hiddenActions?.includes("edit") && props.onEdit && ( {t("common.edit")} )} {!hiddenActions?.includes("share") && ( {t("memo.copy-link")} )} {memo.rowStatus === RowStatus.ARCHIVED ? : } {memo.rowStatus === RowStatus.ARCHIVED ? t("common.restore") : t("common.archive")} {t("common.delete")} ); }; export default MemoActionMenu;