Quellcode durchsuchen

fix: crash when ECharts accesses undefined objects (#7853)

zhujinle vor 7 Monaten
Ursprung
Commit
ef82a29e23
1 geänderte Dateien mit 26 neuen und 4 gelöschten Zeilen
  1. 26 4
      web/app/components/base/markdown.tsx

+ 26 - 4
web/app/components/base/markdown.tsx

@@ -8,7 +8,7 @@ import RemarkGfm from 'remark-gfm'
 import SyntaxHighlighter from 'react-syntax-highlighter'
 import { atelierHeathLight } from 'react-syntax-highlighter/dist/esm/styles/hljs'
 import type { RefObject } from 'react'
-import { memo, useEffect, useMemo, useRef, useState } from 'react'
+import { Component, memo, useEffect, useMemo, useRef, useState } from 'react'
 import type { CodeComponent } from 'react-markdown/lib/ast-to-react'
 import cn from '@/utils/classnames'
 import CopyBtn from '@/app/components/base/copy-btn'
@@ -104,7 +104,7 @@ const CodeBlock: CodeComponent = memo(({ inline, className, children, ...props }
   const match = /language-(\w+)/.exec(className || '')
   const language = match?.[1]
   const languageShowName = getCorrectCapitalizationLanguageName(language || '')
-  let chartData = JSON.parse(String('{"title":{"text":"Something went wrong."}}').replace(/\n$/, ''))
+  let chartData = JSON.parse(String('{"title":{"text":"ECharts error - Wrong JSON format."}}').replace(/\n$/, ''))
   if (language === 'echarts') {
     try {
       chartData = JSON.parse(String(children).replace(/\n$/, ''))
@@ -143,10 +143,10 @@ const CodeBlock: CodeComponent = memo(({ inline, className, children, ...props }
             ? (<Flowchart PrimitiveCode={String(children).replace(/\n$/, '')} />)
             : (
               (language === 'echarts')
-                ? (<div style={{ minHeight: '250px', minWidth: '250px' }}><ReactEcharts
+                ? (<div style={{ minHeight: '250px', minWidth: '250px' }}><ErrorBoundary><ReactEcharts
                   option={chartData}
                 >
-                </ReactEcharts></div>)
+                </ReactEcharts></ErrorBoundary></div>)
                 : (<SyntaxHighlighter
                   {...props}
                   style={atelierHeathLight}
@@ -211,3 +211,25 @@ export function Markdown(props: { content: string; className?: string }) {
     </div>
   )
 }
+
+// **Add an ECharts runtime error handler
+// Avoid error #7832 (Crash when ECharts accesses undefined objects)
+// This can happen when a component attempts to access an undefined object that references an unregistered map, causing the program to crash.
+
+export default class ErrorBoundary extends Component {
+  constructor(props) {
+    super(props)
+    this.state = { hasError: false }
+  }
+
+  componentDidCatch(error, errorInfo) {
+    this.setState({ hasError: true })
+    console.error(error, errorInfo)
+  }
+
+  render() {
+    if (this.state.hasError)
+      return <div>Oops! ECharts reported a runtime error. <br />(see the browser console for more information)</div>
+    return this.props.children
+  }
+}