MermaidViewer.tsx 736 B

1234567891011121314151617181920212223242526272829303132
  1. import type { ReactNode } from 'react';
  2. import React, { useRef, useEffect } from 'react';
  3. import mermaid from 'mermaid';
  4. type MermaidViewerProps = {
  5. children: ReactNode,
  6. }
  7. export const MermaidViewer = React.memo((props: MermaidViewerProps): JSX.Element => {
  8. const { children } = props;
  9. const ref = useRef<HTMLDivElement>(null);
  10. useEffect(() => {
  11. if (ref.current != null && children != null) {
  12. mermaid.initialize({});
  13. mermaid.run({ nodes: [ref.current] });
  14. }
  15. }, [children]);
  16. return (
  17. children
  18. ? (
  19. <div ref={ref} key={children as string}>
  20. {children}
  21. </div>
  22. )
  23. : <div key={children as string}></div>
  24. );
  25. });
  26. MermaidViewer.displayName = 'MermaidViewer';