import { useEffect, useRef, useState } from 'react'; interface Props { code: string; } let mermaidModule: typeof import('mermaid').default | null = null; let initialized = false; async function getMermaid() { if (!mermaidModule) { const mod = await import('mermaid'); mermaidModule = mod.default; } if (!initialized) { mermaidModule.initialize({ startOnLoad: false, theme: 'default' }); initialized = true; } return mermaidModule; } export function MermaidLazy({ code }: Props) { const [svg, setSvg] = useState(null); const [error, setError] = useState(null); const idRef = useRef(`mermaid-${Math.random().toString(36).slice(2)}`); useEffect(() => { let cancelled = false; getMermaid() .then((m) => m.render(idRef.current, code)) .then((rendered) => { if (!cancelled) setSvg(rendered); }) .catch((err: Error) => { if (!cancelled) setError(err.message); }); return () => { cancelled = true; }; }, [code]); if (error) return
{error}
; if (!svg) return
Loading diagram…
; return
; }