import clsx from "clsx"; import copy from "copy-to-clipboard"; import { useContext, useEffect } from "react"; import toast from "react-hot-toast"; import { Link } from "react-router-dom"; import Icon from "@/components/Icon"; import MemoResourceListView from "@/components/MemoResourceListView"; import useLoading from "@/hooks/useLoading"; import { useMemoStore } from "@/store/v1"; import MemoContent from ".."; import { RendererContext } from "../types"; import Error from "./Error"; interface Props { resourceId: string; params: string; } const EmbeddedMemo = ({ resourceId: uid, params: paramsStr }: Props) => { const context = useContext(RendererContext); const loadingState = useLoading(); const memoStore = useMemoStore(); const memo = memoStore.getMemoByUid(uid); const resourceName = `memos/${uid}`; useEffect(() => { memoStore.fetchMemoByUid(uid).finally(() => loadingState.setFinish()); }, [uid]); if (loadingState.isLoading) { return null; } if (!memo) { return ; } const params = new URLSearchParams(paramsStr); const useSnippet = params.has("snippet"); const inlineMode = params.has("inline"); if (!useSnippet && (memo.name === context.memoName || context.embeddedMemos.has(resourceName))) { return ; } // Add the memo to the set of embedded memos. This is used to prevent infinite loops when a memo embeds itself. context.embeddedMemos.add(resourceName); const contentNode = useSnippet ? (
{memo.snippet}
) : ( <> ); if (inlineMode) { return
{contentNode}
; } const copyMemoUid = (uid: string) => { copy(uid); toast.success("Copied memo UID to clipboard"); }; return (
copyMemoUid(memo.uid)}> {memo.uid.slice(0, 8)}
{contentNode}
); }; export default EmbeddedMemo;