From 4f3aa3e8de50df1dd5949d0e12fec1a03f027b36 Mon Sep 17 00:00:00 2001 From: devchenyan Date: Wed, 12 Mar 2025 13:24:10 +0800 Subject: [PATCH 1/2] feat: Add UI crash logs --- .../src/components/ErrorBoundary/index.tsx | 18 +++++++++++++----- packages/neuron-wallet/src/controllers/api.ts | 1 + 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/packages/neuron-ui/src/components/ErrorBoundary/index.tsx b/packages/neuron-ui/src/components/ErrorBoundary/index.tsx index e707dc65b0..de2ca1007b 100644 --- a/packages/neuron-ui/src/components/ErrorBoundary/index.tsx +++ b/packages/neuron-ui/src/components/ErrorBoundary/index.tsx @@ -1,10 +1,18 @@ -import React, { Component } from 'react' +import React, { Component, ErrorInfo } from 'react' import { Stack } from 'office-ui-fabric-react' import Spinner from 'widgets/Spinner' import { handleViewError } from 'services/remote' -const handleError = (error: Error) => { - handleViewError(error.toString()) +const handleError = (error: Error, errorInfo?: ErrorInfo) => { + handleViewError( + JSON.stringify([ + `UI crash: ${error.message}`, + { + stack: error.stack, + componentStack: errorInfo?.componentStack || 'N/A', + }, + ]) + ) if (import.meta.env.MODE !== 'development') { window.location.reload() } @@ -23,8 +31,8 @@ class ErrorBoundary extends Component<{ children: React.ReactChild }, { hasError return handleError(error) } - public componentDidCatch(error: Error) { - this.setState(handleError(error)) + public componentDidCatch(error: Error, errorInfo: ErrorInfo) { + this.setState(handleError(error, errorInfo)) } render() { diff --git a/packages/neuron-wallet/src/controllers/api.ts b/packages/neuron-wallet/src/controllers/api.ts index 777ded8338..c1db28702f 100644 --- a/packages/neuron-wallet/src/controllers/api.ts +++ b/packages/neuron-wallet/src/controllers/api.ts @@ -284,6 +284,7 @@ export default class ApiController { if (env.isDevMode) { console.error(error) } + logger.error(JSON.parse(error)) }) handle('set-locale', async (_, locale: Locale) => { From cc095b8bc43fcb0aec6fa2a5178226f14f03e4d0 Mon Sep 17 00:00:00 2001 From: devchenyan Date: Wed, 12 Mar 2025 18:23:28 +0800 Subject: [PATCH 2/2] fix --- .../neuron-ui/src/components/ErrorBoundary/index.tsx | 10 +++++----- packages/neuron-wallet/src/controllers/api.ts | 6 +++++- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/neuron-ui/src/components/ErrorBoundary/index.tsx b/packages/neuron-ui/src/components/ErrorBoundary/index.tsx index de2ca1007b..5bed88e3ac 100644 --- a/packages/neuron-ui/src/components/ErrorBoundary/index.tsx +++ b/packages/neuron-ui/src/components/ErrorBoundary/index.tsx @@ -1,4 +1,4 @@ -import React, { Component, ErrorInfo } from 'react' +import React, { Component, ErrorInfo, ReactNode } from 'react' import { Stack } from 'office-ui-fabric-react' import Spinner from 'widgets/Spinner' import { handleViewError } from 'services/remote' @@ -16,11 +16,10 @@ const handleError = (error: Error, errorInfo?: ErrorInfo) => { if (import.meta.env.MODE !== 'development') { window.location.reload() } - return { hasError: true } } -class ErrorBoundary extends Component<{ children: React.ReactChild }, { hasError: boolean }> { - constructor(props: { children: React.ReactChild }) { +class ErrorBoundary extends Component<{ children: ReactNode }, { hasError: boolean }> { + constructor(props: { children: ReactNode }) { super(props) this.state = { hasError: false, @@ -32,7 +31,8 @@ class ErrorBoundary extends Component<{ children: React.ReactChild }, { hasError } public componentDidCatch(error: Error, errorInfo: ErrorInfo) { - this.setState(handleError(error, errorInfo)) + handleError(error, errorInfo) + this.setState({ hasError: true }) } render() { diff --git a/packages/neuron-wallet/src/controllers/api.ts b/packages/neuron-wallet/src/controllers/api.ts index c1db28702f..95fdd231bf 100644 --- a/packages/neuron-wallet/src/controllers/api.ts +++ b/packages/neuron-wallet/src/controllers/api.ts @@ -284,7 +284,11 @@ export default class ApiController { if (env.isDevMode) { console.error(error) } - logger.error(JSON.parse(error)) + try { + logger.error(JSON.parse(error)) + } catch (e) { + logger.error(error) + } }) handle('set-locale', async (_, locale: Locale) => {