import { Button, IconButton } 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 { useUserStore, extractUsernameFromName } from "@/store/v1"; import { Memo } from "@/types/proto/api/v2/memo_service"; import { useTranslate } from "@/utils/i18n"; import { generateDialog } from "./Dialog"; 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, destroy } = props; const t = useTranslate(); const userStore = useUserStore(); const downloadingImageState = useLoading(false); const loadingState = useLoading(); const memoElRef = useRef(null); const user = userStore.getUserByUsername(extractUsernameFromName(memo.creator)); useEffect(() => { (async () => { await userStore.getOrFetchUserByUsername(extractUsernameFromName(memo.creator)); loadingState.setFinish(); })(); }, []); const handleCloseBtnClick = () => { destroy(); }; const handleDownloadImageBtnClick = () => { if (!memoElRef.current) { return; } downloadingImageState.setLoading(); toImage(memoElRef.current, { pixelRatio: window.devicePixelRatio * 2, }) .then((url) => { downloadFileFromUrl(url, `memos-${getDateTimeString(Date.now())}.png`); downloadingImageState.setFinish(); }) .catch((err) => { console.error(err); }); }; const handleDownloadTextFileBtnClick = () => { const blob = new Blob([memo.content], { type: "text/plain;charset=utf-8" }); downloadFileFromUrl(URL.createObjectURL(blob), `memos-${getDateTimeString(Date.now())}.md`); }; const downloadFileFromUrl = (url: string, filename: string) => { const a = document.createElement("a"); a.href = url; a.download = filename; a.click(); }; const handleCopyLinkBtnClick = () => { copy(`${window.location.origin}/m/${memo.name}`); toast.success(t("message.succeed-copy-link")); }; if (loadingState.isLoading) { return null; } return ( <>

{t("common.share")} Memo

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