import { useState, useRef, useEffect, useDeferredValue } from "react"; import { BinaryFiles } from "../../types"; import { useApp } from "../App"; import { NonDeletedExcalidrawElement } from "../../element/types"; import { ArrowRightIcon } from "../icons"; import "./MermaidToExcalidraw.scss"; import { t } from "../../i18n"; import Trans from "../Trans"; import { MermaidToExcalidrawLibProps, convertMermaidToExcalidraw, insertToEditor, saveMermaidDataToStorage, } from "./common"; import { TTDDialogPanels } from "./TTDDialogPanels"; import { TTDDialogPanel } from "./TTDDialogPanel"; import { TTDDialogInput } from "./TTDDialogInput"; import { TTDDialogOutput } from "./TTDDialogOutput"; import { EditorLocalStorage } from "../../data/EditorLocalStorage"; import { EDITOR_LS_KEYS } from "../../constants"; import { debounce } from "../../utils"; import { TTDDialogSubmitShortcut } from "./TTDDialogSubmitShortcut"; const MERMAID_EXAMPLE = "flowchart TD\n A[Christmas] -->|Get money| B(Go shopping)\n B --> C{Let me think}\n C -->|One| D[Laptop]\n C -->|Two| E[iPhone]\n C -->|Three| F[Car]"; const debouncedSaveMermaidDefinition = debounce(saveMermaidDataToStorage, 300); const MermaidToExcalidraw = ({ mermaidToExcalidrawLib, }: { mermaidToExcalidrawLib: MermaidToExcalidrawLibProps; }) => { const [text, setText] = useState( () => EditorLocalStorage.get(EDITOR_LS_KEYS.MERMAID_TO_EXCALIDRAW) || MERMAID_EXAMPLE, ); const deferredText = useDeferredValue(text.trim()); const [error, setError] = useState(null); const canvasRef = useRef(null); const data = useRef<{ elements: readonly NonDeletedExcalidrawElement[]; files: BinaryFiles | null; }>({ elements: [], files: null }); const app = useApp(); useEffect(() => { convertMermaidToExcalidraw({ canvasRef, data, mermaidToExcalidrawLib, setError, mermaidDefinition: deferredText, }).catch(() => {}); debouncedSaveMermaidDefinition(deferredText); }, [deferredText, mermaidToExcalidrawLib]); useEffect( () => () => { debouncedSaveMermaidDefinition.flush(); }, [], ); const onInsertToEditor = () => { insertToEditor({ app, data, text, shouldSaveMermaidDataToStorage: true, }); }; return ( <>
( {el} )} sequenceLink={(el) => ( {el} )} classLink={(el) => ( {el} )} />
setText(event.target.value)} onKeyboardSubmit={() => { onInsertToEditor(); }} /> { onInsertToEditor(); }, label: t("mermaid.button"), icon: ArrowRightIcon, }} renderSubmitShortcut={() => } > ); }; export default MermaidToExcalidraw;