import { Button } 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 useLoading from "@/hooks/useLoading"; import toImage from "@/labs/html2image"; import { useUserV1Store, extractUsernameFromName } from "@/store/v1"; import { useTranslate } from "@/utils/i18n"; import { generateDialog } from "./Dialog"; import showEmbedMemoDialog from "./EmbedMemoDialog"; import Icon from "./Icon"; import MemoContent from "./MemoContent"; import MemoResourceListView from "./MemoResourceListView"; import UserAvatar from "./UserAvatar"; import "@/less/share-memo-dialog.less"; interface Props extends DialogProps { memo: Memo; } const ShareMemoDialog: React.FC = (props: Props) => { const { memo: propsMemo, destroy } = props; const t = useTranslate(); const userV1Store = useUserV1Store(); const downloadingImageState = useLoading(false); const loadingState = useLoading(); const memoElRef = useRef(null); const memo = { ...propsMemo, displayTsStr: getDateTimeString(propsMemo.displayTs), }; const user = userV1Store.getUserByUsername(memo.creatorUsername); useEffect(() => { (async () => { await userV1Store.getOrFetchUserByUsername(memo.creatorUsername); loadingState.setFinish(); })(); }, []); const handleCloseBtnClick = () => { destroy(); }; const handleDownloadImageBtnClick = () => { if (!memoElRef.current) { return; } downloadingImageState.setLoading(); toImage(memoElRef.current, { pixelRatio: window.devicePixelRatio * 2, }) .then((url) => { const a = document.createElement("a"); a.href = url; a.download = `memos-${getDateTimeString(Date.now())}.png`; a.click(); downloadingImageState.setFinish(); }) .catch((err) => { console.error(err); }); }; const handleShowEmbedMemoDialog = () => { showEmbedMemoDialog(memo.id); }; const handleCopyLinkBtnClick = () => { copy(`${window.location.origin}/m/${memo.id}`); toast.success(t("message.succeed-copy-link")); }; if (loadingState.isLoading) { return null; } return ( <>

{t("common.share")} Memo

{memo.displayTsStr}
{user.nickname || extractUsernameFromName(user.name)}
via memos
); }; export default function showShareMemoDialog(memo: Memo): void { generateDialog( { className: "share-memo-dialog", dialogName: "share-memo-dialog", }, ShareMemoDialog, { memo } ); }