ai-chatbot/components/ui/client-error-boundary.tsx
Your Name 8853bfae77
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
fix: harden agent PSD template dialog
2026-04-01 21:52:25 +08:00

63 lines
1.3 KiB
TypeScript

"use client";
import React from "react";
interface ClientErrorBoundaryProps {
children: React.ReactNode;
fallback: React.ReactNode;
resetKeys?: unknown[];
}
interface ClientErrorBoundaryState {
hasError: boolean;
}
function areResetKeysEqual(nextKeys?: unknown[], prevKeys?: unknown[]) {
if (nextKeys === prevKeys) {
return true;
}
if (!nextKeys || !prevKeys) {
return false;
}
if (nextKeys.length !== prevKeys.length) {
return false;
}
return nextKeys.every((key, index) => Object.is(key, prevKeys[index]));
}
export class ClientErrorBoundary extends React.Component<
ClientErrorBoundaryProps,
ClientErrorBoundaryState
> {
constructor(props: ClientErrorBoundaryProps) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError() {
return { hasError: true };
}
componentDidUpdate(prevProps: ClientErrorBoundaryProps) {
if (
this.state.hasError &&
!areResetKeysEqual(this.props.resetKeys, prevProps.resetKeys)
) {
this.setState({ hasError: false });
}
}
componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {
console.error("[ClientErrorBoundary] Caught client error:", error, errorInfo);
}
render() {
if (this.state.hasError) {
return this.props.fallback;
}
return this.props.children;
}
}