import { useEffect, useState } from "react"; import ReactMarkdown from "react-markdown"; import remarkGfm from "remark-gfm"; import type { Components } from "react-markdown"; import { renderMermaid } from "./mermaid"; function MermaidBlock({ code }: { code: string }) { const [svg, setSvg] = useState(""); const [error, setError] = useState(""); useEffect(() => { renderMermaid(code) .then(setSvg) .catch((e: unknown) => setError(e instanceof Error ? e.message : String(e)) ); }, [code]); if (error) return
{error}
; if (!svg) return
{code}
; // eslint-disable-next-line react/no-danger return
; } const components: Components = { code({ className, children }) { const lang = /language-(\w+)/.exec(className ?? "")?.[1]; const code = String(children).replace(/\n$/, ""); if (lang === "mermaid") { return ; } return ( {children} ); }, pre({ children }) { return
{children}
; }, }; export function MarkdownView({ source }: { source: string }) { return (
{source}
); }