Yuki Takei 3 лет назад
Родитель
Сommit
8675825eba

+ 1 - 0
packages/app/src/interfaces/graph-viewer.ts

@@ -1,4 +1,5 @@
 export interface IGraphViewer {
 export interface IGraphViewer {
+  processElements: () => void,
   createViewerForElement: (Element) => void,
   createViewerForElement: (Element) => void,
 }
 }
 
 

+ 1 - 1
packages/app/src/pages/[[...path]].page.tsx

@@ -291,7 +291,7 @@ const GrowiPage: NextPage<Props> = (props: Props) => {
         */}
         */}
       </Head>
       </Head>
 
 
-      <Script type="text/javascript" src="https://www.draw.io/js/viewer.min.js"></Script>
+      <Script type="text/javascript" src="https://www.draw.io/js/viewer.min.js" onLoad={() => (window as CustomWindow).GraphViewer.processElements() }></Script>
 
 
       <BasicLayout title={useCustomTitle(props, 'GROWI')} className={classNames.join(' ')} expandContainer={isContainerFluid}>
       <BasicLayout title={useCustomTitle(props, 'GROWI')} className={classNames.join(' ')} expandContainer={isContainerFluid}>
 
 

+ 32 - 2
packages/remark-drawio-plugin/src/components/DrawioViewer.tsx

@@ -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}