Parcourir la source

mermaid front-end rendering initialization exception handling logic o… (#1407)

Charlie.Wei il y a 1 an
Parent
commit
985253197f
1 fichiers modifiés avec 20 ajouts et 9 suppressions
  1. 20 9
      web/app/components/app/chat/mermaid/index.tsx

+ 20 - 9
web/app/components/app/chat/mermaid/index.tsx

@@ -1,6 +1,5 @@
 import React, { useEffect, useRef, useState } from 'react'
 import mermaid from 'mermaid'
-import { t } from 'i18next'
 import CryptoJS from 'crypto-js'
 
 let mermaidAPI: any
@@ -32,6 +31,14 @@ const Flowchart = React.forwardRef((props: {
   const chartId = useRef(`flowchart_${CryptoJS.MD5(props.PrimitiveCode).toString()}`)
   const [isRender, setIsRender] = useState(true)
 
+  const clearFlowchartCache = () => {
+    for (let i = localStorage.length - 1; i >= 0; --i) {
+      const key = localStorage.key(i)
+      if (key && key.startsWith('flowchart_'))
+        localStorage.removeItem(key)
+    }
+  }
+
   const renderFlowchart = async (PrimitiveCode: string) => {
     try {
       const cachedSvg: any = localStorage.getItem(chartId.current)
@@ -44,15 +51,15 @@ const Flowchart = React.forwardRef((props: {
         const svgGraph = await mermaidAPI.render(chartId.current, PrimitiveCode)
         // eslint-disable-next-line @typescript-eslint/no-use-before-define
         const base64Svg: any = await svgToBase64(svgGraph.svg)
-        localStorage.setItem(chartId.current, base64Svg)
         setSvgCode(base64Svg)
+        if (chartId.current && base64Svg)
+          localStorage.setItem(chartId.current, base64Svg)
       }
     }
     catch (error) {
-      localStorage.clear()
-      // eslint-disable-next-line @typescript-eslint/ban-ts-comment
-      // @ts-expect-error
-      console.error(error.toString())
+      clearFlowchartCache()
+      // eslint-disable-next-line @typescript-eslint/no-use-before-define
+      handleReRender()
     }
   }
 
@@ -70,7 +77,9 @@ const Flowchart = React.forwardRef((props: {
   const handleReRender = () => {
     setIsRender(false)
     setSvgCode(null)
-    localStorage.removeItem(chartId.current)
+    if (chartId.current)
+      localStorage.removeItem(chartId.current)
+
     setTimeout(() => {
       setIsRender(true)
       renderFlowchart(props.PrimitiveCode)
@@ -90,9 +99,11 @@ const Flowchart = React.forwardRef((props: {
     // @ts-expect-error
     <div ref={ref}>
       {
-        isRender && <div id={chartId.current} className="mermaid" style={style}>{svgCode && (<img src={svgCode} style={{ width: '100%', height: 'auto' }} alt="Mermaid chart" />)}</div>
+        isRender
+          && <div id={chartId.current} className="mermaid" style={style}>
+            {svgCode && <img src={svgCode} style={{ width: '100%', height: 'auto' }} alt="Mermaid chart" />}
+          </div>
       }
-      <button onClick={handleReRender}>{t('appApi.merMaind.rerender')}</button>
     </div>
   )
 })