'use client' import { useEffect, useId, useRef, useState } from 'react' type Props = { source: string } let mermaidPromise: Promise | null = null function loadMermaid() { if (!mermaidPromise) { mermaidPromise = import('mermaid').then((mod) => { const mermaid = mod.default mermaid.initialize({ startOnLoad: false, theme: 'default', securityLevel: 'strict', fontFamily: 'inherit', }) return mermaid }) } return mermaidPromise } export function MermaidBlock({ source }: Props) { const id = useId().replace(/[^a-zA-Z0-9]/g, '') const containerRef = useRef(null) const [error, setError] = useState(null) useEffect(() => { let cancelled = false loadMermaid() .then(async (mermaid) => { if (cancelled) return try { const { svg } = await mermaid.render(`mermaid-${id}`, source) if (cancelled) return if (containerRef.current) containerRef.current.innerHTML = svg setError(null) } catch (err) { if (cancelled) return setError(err instanceof Error ? err.message : String(err)) } }) .catch((err) => { if (cancelled) return setError(err instanceof Error ? err.message : String(err)) }) return () => { cancelled = true } }, [id, source]) if (error) { return (
        
          {`Mermaid render failed: ${error}\n\n${source}`}
        
      
) } return (
) }