import { Button, IconButton, Select, Option } from "@mui/joy"; import copy from "copy-to-clipboard"; import React, { useEffect, useRef } from "react"; import { toast } from "react-hot-toast"; import { getDateTimeString } from "@/helpers/datetime"; import { downloadFileFromUrl } from "@/helpers/utils"; import useCurrentUser from "@/hooks/useCurrentUser"; import useLoading from "@/hooks/useLoading"; import toImage from "@/labs/html2image"; import { useUserStore, useMemoStore, MemoNamePrefix } from "@/store/v1"; import { Visibility } from "@/types/proto/api/v2/memo_service"; import { useTranslate } from "@/utils/i18n"; import { convertVisibilityToString } from "@/utils/memo"; import { generateDialog } from "./Dialog"; import Icon from "./Icon"; import MemoContent from "./MemoContent"; import MemoResourceListView from "./MemoResourceListView"; import UserAvatar from "./UserAvatar"; import VisibilityIcon from "./VisibilityIcon"; import "@/less/share-memo-dialog.less"; interface Props extends DialogProps { memoId: number; } const ShareMemoDialog: React.FC = (props: Props) => { const { memoId, destroy } = props; const t = useTranslate(); const currentUser = useCurrentUser(); const userStore = useUserStore(); const memoStore = useMemoStore(); const downloadingImageState = useLoading(false); const loadingState = useLoading(); const memoContainerRef = useRef(null); const memo = memoStore.getMemoByName(`${MemoNamePrefix}${memoId}`); const user = userStore.getUserByName(memo.creator); const readonly = memo?.creator !== currentUser?.name; useEffect(() => { (async () => { await userStore.getOrFetchUserByName(memo.creator); loadingState.setFinish(); })(); }, []); const handleCloseBtnClick = () => { destroy(); }; const handleDownloadImageBtnClick = () => { if (!memoContainerRef.current) { return; } downloadingImageState.setLoading(); toImage(memoContainerRef.current, { pixelRatio: window.devicePixelRatio * 2, }) .then((url) => { downloadFileFromUrl(url, `memos-${getDateTimeString(Date.now())}.png`); downloadingImageState.setFinish(); URL.revokeObjectURL(url); }) .catch((err) => { console.error(err); }); }; const handleDownloadTextFileBtnClick = () => { const blob = new Blob([memo.content], { type: "text/plain;charset=utf-8" }); const url = URL.createObjectURL(blob); downloadFileFromUrl(url, `memos-${getDateTimeString(Date.now())}.md`); URL.revokeObjectURL(url); }; const handleCopyLinkBtnClick = () => { copy(`${window.location.origin}/m/${memo.uid}`); if (memo.visibility !== Visibility.PUBLIC) { toast.success(t("message.succeed-copy-link-not-public")); } else { toast.success(t("message.succeed-copy-link")); } }; const handleMemoVisibilityOptionChanged = async (visibility: Visibility) => { const updatedMemo = await memoStore.updateMemo( { name: memo.name, visibility: visibility, }, ["visibility"], ); if (updatedMemo.visibility == visibility) { toast.success(t("message.update-succeed")); } }; if (loadingState.isLoading) { return null; } return ( <>

{t("common.share")} Memo

{!readonly && ( )}
{getDateTimeString(memo.displayTime)}
{user.nickname || user.username}
via memos
); }; export default function showShareMemoDialog(memoId: number): void { generateDialog( { className: "share-memo-dialog", dialogName: "share-memo-dialog", }, ShareMemoDialog, { memoId }, ); }