import copy from "copy-to-clipboard"; import { ArrowUpRightIcon } from "lucide-react"; import { useContext, useEffect } from "react"; import toast from "react-hot-toast"; import { Link } from "react-router-dom"; import MemoResourceListView from "@/components/MemoResourceListView"; import useLoading from "@/hooks/useLoading"; import { extractMemoIdFromName, useMemoStore } from "@/store/v1"; import { cn } from "@/utils"; 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 memoName = `memos/${uid}`; const memo = memoStore.getMemoByName(memoName); useEffect(() => { memoStore.getOrFetchMemoByName(memoName).finally(() => loadingState.setFinish()); }, [memoName]); 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(memoName))) { 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(memoName); const contentNode = useSnippet ? (
{memo.snippet}
) : ( <> ); if (inlineMode) { return
{contentNode}
; } const copyMemoUid = (uid: string) => { copy(uid); toast.success("Copied memo UID to clipboard"); }; return (
copyMemoUid(extractMemoIdFromName(memo.name))} > {extractMemoIdFromName(memo.name).slice(0, 6)}
{contentNode}
); }; export default EmbeddedMemo;