import React, { useCallback, useEffect, useMemo, useRef, } from 'react'; import EventEmitter from 'events'; import { useTranslation } from 'react-i18next'; import { debounce } from 'throttle-debounce'; import NotAvailableForGuest from './NotAvailableForGuest'; declare let window: { globalEmitter: EventEmitter, GraphViewer: { createViewerForElement: (Element) => void, }; }; type Props = { drawioContent: string, rangeLineNumberOfMarkdown: { beginLineNumber: number, endLineNumber: number }, isPreview?: boolean, } const Drawio = (props: Props): JSX.Element => { const { t } = useTranslation(); const { drawioContent, rangeLineNumberOfMarkdown, isPreview } = props; // const { open: openDrawioModal } = useDrawioModalForPage(); const drawioContainerRef = useRef(null); const editButtonClickHandler = useCallback(() => { const { beginLineNumber, endLineNumber } = rangeLineNumberOfMarkdown; window.globalEmitter.emit('launchDrawioModal', beginLineNumber, endLineNumber); }, [rangeLineNumberOfMarkdown]); const renderDrawio = useCallback(() => { if (drawioContainerRef.current == null) { return; } const mxgraphs = drawioContainerRef.current.getElementsByClassName('mxgraph'); if (mxgraphs.length > 0) { // GROWI では、mxgraph element は最初のものをレンダリングする前提とする const div = mxgraphs[0]; if (div != null) { div.innerHTML = ''; window.GraphViewer.createViewerForElement(div); } } }, []); const renderDrawioWithDebounce = useMemo(() => debounce(200, renderDrawio), [renderDrawio]); const { GraphViewer } = window; useEffect(() => { if (GraphViewer == null) { return; } renderDrawioWithDebounce(); }, [GraphViewer, renderDrawioWithDebounce]); return (
{ !isPreview && ( ) }
); }; export default Drawio;