import React, { useEffect, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import copy from "copy-to-clipboard"; import { toLower } from "lodash"; import toImage from "../labs/html2image"; import { ANIMATION_DURATION, VISIBILITY_SELECTOR_ITEMS } from "../helpers/consts"; import * as utils from "../helpers/utils"; import { getMemoStats } from "../helpers/api"; import { memoService, userService } from "../services"; import useLoading from "../hooks/useLoading"; import Icon from "./Icon"; import { generateDialog } from "./Dialog"; import toastHelper from "./Toast"; import MemoContent from "./MemoContent"; import MemoResources from "./MemoResources"; import Selector from "./common/Selector"; import useAppearance from "../hooks/useAppearance"; import "../less/share-memo-image-dialog.less"; interface Props extends DialogProps { memo: Memo; } interface State { memoAmount: number; shortcutImgUrl: string; memoVisibility: string; } const ShareMemoImageDialog: React.FC = (props: Props) => { const { memo: propsMemo, destroy } = props; const { t } = useTranslation(); const user = userService.getState().user as User; const [state, setState] = useState({ memoAmount: 0, shortcutImgUrl: "", memoVisibility: propsMemo.visibility, }); const [appearance] = useAppearance(); const loadingState = useLoading(); const memoElRef = useRef(null); const memo = { ...propsMemo, createdAtStr: utils.getDateTimeString(propsMemo.displayTs), }; const createdDays = Math.ceil((Date.now() - utils.getTimeStampByDate(user.createdTs)) / 1000 / 3600 / 24); useEffect(() => { getMemoStats(user.id) .then(({ data: { data } }) => { setState((state) => { return { ...state, memoAmount: data.length, }; }); loadingState.setFinish(); }) .catch((error) => { console.error(error); }); }, []); useEffect(() => { if (loadingState.isLoading) { return; } setTimeout(() => { if (!memoElRef.current) { return; } toImage(memoElRef.current, { backgroundColor: appearance === "light" ? "#f4f4f5" : "#27272a", pixelRatio: window.devicePixelRatio * 2, }) .then((url) => { setState((state) => { return { ...state, shortcutImgUrl: url, }; }); }) .catch((err) => { console.error(err); }); }, ANIMATION_DURATION); }, [loadingState.isLoading]); const handleCloseBtnClick = () => { destroy(); }; const handleDownloadBtnClick = () => { const a = document.createElement("a"); a.href = state.shortcutImgUrl; a.download = `memos-${utils.getDateTimeString(Date.now())}.png`; a.click(); }; const handleCopyLinkBtnClick = () => { copy(`${window.location.origin}/m/${memo.id}`); toastHelper.success(t("message.succeed-copy-content")); }; 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; setState({ ...state, memoVisibility: visibilityValue, }); await memoService.patchMemo({ id: memo.id, visibility: visibilityValue, }); }; return ( <>

🌄 {t("common.share")} Memo

{state.shortcutImgUrl !== "" && } {memo.createdAtStr}
{user.nickname || user.username} {createdDays} DAYS / {state.memoAmount} MEMOS
{t("common.image")}
{t("common.link")}
); }; export default function showShareMemoImageDialog(memo: Memo): void { generateDialog( { className: "share-memo-image-dialog", }, ShareMemoImageDialog, { memo } ); }