|
@@ -1,10 +1,13 @@
|
|
|
-import React, { ReactNode } from 'react';
|
|
|
|
|
|
|
+import React, {
|
|
|
|
|
+ ReactNode, useCallback, useEffect, useMemo, useRef,
|
|
|
|
|
+} from 'react';
|
|
|
|
|
+
|
|
|
|
|
+import { debounce } from 'throttle-debounce';
|
|
|
|
|
|
|
|
import { generateMxgraphData } from '../utils/embed';
|
|
import { generateMxgraphData } from '../utils/embed';
|
|
|
|
|
|
|
|
import styles from './DrawioViewer.module.scss';
|
|
import styles from './DrawioViewer.module.scss';
|
|
|
|
|
|
|
|
-
|
|
|
|
|
type Props = {
|
|
type Props = {
|
|
|
diagramIndex: number,
|
|
diagramIndex: number,
|
|
|
bol?: number,
|
|
bol?: number,
|
|
@@ -19,6 +22,32 @@ export const DrawioViewer = (props: Props): JSX.Element => {
|
|
|
} = props;
|
|
} = props;
|
|
|
const drawioEmbedUri = props.drawioEmbedUri ?? 'https://embed.diagrams.net/';
|
|
const drawioEmbedUri = props.drawioEmbedUri ?? 'https://embed.diagrams.net/';
|
|
|
|
|
|
|
|
|
|
+ const drawioContainerRef = useRef<HTMLDivElement>(null);
|
|
|
|
|
+
|
|
|
|
|
+ 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 as any).GraphViewer.createViewerForElement(div);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }, [drawioContainerRef]);
|
|
|
|
|
+
|
|
|
|
|
+ const renderDrawioWithDebounce = useMemo(() => debounce(200, renderDrawio), [renderDrawio]);
|
|
|
|
|
+
|
|
|
|
|
+ useEffect(() => {
|
|
|
|
|
+ renderDrawioWithDebounce();
|
|
|
|
|
+ }, [renderDrawioWithDebounce]);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
if (children == null) {
|
|
if (children == null) {
|
|
|
return <></>;
|
|
return <></>;
|
|
|
}
|
|
}
|
|
@@ -34,6 +63,7 @@ export const DrawioViewer = (props: Props): JSX.Element => {
|
|
|
return (
|
|
return (
|
|
|
<div
|
|
<div
|
|
|
key={`drawio-viewer-${diagramIndex}`}
|
|
key={`drawio-viewer-${diagramIndex}`}
|
|
|
|
|
+ ref={drawioContainerRef}
|
|
|
className={`drawio-viewer ${styles['drawio-viewer']}`}
|
|
className={`drawio-viewer ${styles['drawio-viewer']}`}
|
|
|
data-begin-line-number-of-markdown={bol}
|
|
data-begin-line-number-of-markdown={bol}
|
|
|
data-end-line-number-of-markdown={eol}
|
|
data-end-line-number-of-markdown={eol}
|