|
1 | 1 | 'use client' |
2 | 2 |
|
3 | | -import { useLayoutEffect, useRef, useState } from 'react' |
| 3 | +import { useId, useLayoutEffect, useRef, useState } from 'react' |
4 | 4 |
|
5 | | -let idCounter = 0 |
6 | 5 | let mermaidPromise: Promise<typeof import('mermaid')> | null = null |
7 | 6 | let isInitialized = false |
8 | 7 |
|
9 | | -function generateUniqueId() { |
10 | | - return `mermaid-${idCounter++}` |
11 | | -} |
12 | | - |
13 | 8 | interface MermaidDiagramProps { |
14 | 9 | code: string |
15 | 10 | className?: string |
16 | 11 | } |
17 | 12 |
|
18 | 13 | export function MermaidDiagram({ code, className = '' }: MermaidDiagramProps) { |
19 | | - const idRef = useRef(generateUniqueId()) |
| 14 | + const id = useId() |
| 15 | + const mermaidId = `mermaid-${id.replace(/:/g, '-')}` |
20 | 16 | const containerRef = useRef<HTMLDivElement>(null) |
21 | 17 | const [error, setError] = useState<string | null>(null) |
22 | 18 | const [isLoading, setIsLoading] = useState(true) |
@@ -51,7 +47,7 @@ export function MermaidDiagram({ code, className = '' }: MermaidDiagramProps) { |
51 | 47 | } |
52 | 48 |
|
53 | 49 | // Render the diagram with a unique ID each time |
54 | | - const uniqueId = `${idRef.current}-${Date.now()}` |
| 50 | + const uniqueId = `${mermaidId}-${Date.now()}` |
55 | 51 | const { svg } = await mermaid.render(uniqueId, code) |
56 | 52 |
|
57 | 53 | if (containerRef.current) { |
@@ -97,7 +93,7 @@ export function MermaidDiagram({ code, className = '' }: MermaidDiagramProps) { |
97 | 93 | )} |
98 | 94 | <div |
99 | 95 | ref={containerRef} |
100 | | - id={idRef.current} |
| 96 | + id={mermaidId} |
101 | 97 | className="mermaid-diagram flex justify-center" |
102 | 98 | style={{ display: isLoading ? 'none' : 'block' }} |
103 | 99 | /> |
|
0 commit comments