import { Select, Option } from "@mui/joy"; import { QRCodeSVG } from "qrcode.react"; import React, { useEffect, useRef, useState } from "react"; import { toast } from "react-hot-toast"; import { useTranslation } from "react-i18next"; import copy from "copy-to-clipboard"; import { toLower } from "lodash-es"; import toImage from "@/labs/html2image"; import { useGlobalStore, useMemoStore, useUserStore } from "@/store/module"; import { VISIBILITY_SELECTOR_ITEMS } from "@/helpers/consts"; import { getDateTimeString, getTimeStampByDate } from "@/helpers/datetime"; import { getMemoStats } from "@/helpers/api"; import useLoading from "@/hooks/useLoading"; import Icon from "./Icon"; import { generateDialog } from "./Dialog"; import MemoContent from "./MemoContent"; import MemoResourceListView from "./MemoResourceListView"; import showEmbedMemoDialog from "./EmbedMemoDialog"; import "@/less/share-memo-dialog.less"; interface Props extends DialogProps { memo: Memo; } interface State { memoAmount: number; memoVisibility: Visibility; showQRCode: boolean; } const ShareMemoDialog: React.FC = (props: Props) => { const { memo: propsMemo, destroy } = props; const { t } = useTranslation(); const userStore = useUserStore(); const memoStore = useMemoStore(); const globalStore = useGlobalStore(); const user = userStore.state.user as User; const { systemStatus } = globalStore.state; const [state, setState] = useState({ memoAmount: 0, memoVisibility: propsMemo.visibility, showQRCode: true, }); const createLoadingState = useLoading(false); const loadingState = useLoading(); const memoElRef = useRef(null); const memo = { ...propsMemo, displayTsStr: getDateTimeString(propsMemo.displayTs), }; const createdDays = Math.ceil((Date.now() - getTimeStampByDate(user.createdTs)) / 1000 / 3600 / 24); useEffect(() => { getMemoStats(user.id) .then(({ data }) => { setPartialState({ memoAmount: data.length, }); loadingState.setFinish(); }) .catch((error) => { console.error(error); }); }, []); const setPartialState = (partialState: Partial) => { setState({ ...state, ...partialState, }); }; const handleCloseBtnClick = () => { destroy(); }; const handleDownloadBtnClick = () => { if (!memoElRef.current) { return; } createLoadingState.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(); createLoadingState.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")); }; const memoVisibilityOptionSelectorItems = VISIBILITY_SELECTOR_ITEMS.map((item) => { return { value: item.value, text: t(`memo.visibility.${toLower(item.value)}`), }; }); const handleMemoVisibilityOptionChanged = async (value: string) => { const visibilityValue = value as Visibility; setPartialState({ memoVisibility: visibilityValue, }); await memoStore.patchMemo({ id: memo.id, visibility: visibilityValue, }); }; return ( <>

{t("common.share")} Memo

{t("common.visibility")}:
{memo.displayTsStr}
{user.nickname || user.username} {state.memoAmount} MEMOS / {createdDays} DAYS
); }; export default function showShareMemoDialog(memo: Memo): void { generateDialog( { className: "share-memo-dialog", dialogName: "share-memo-dialog", }, ShareMemoDialog, { memo } ); }