import { Component, type ErrorInfo, type ReactNode } from 'react'; interface ErrorBoundaryProps { children: ReactNode; level?: 'app' | 'page' | 'widget'; onReset?: () => void; } interface ErrorBoundaryState { hasError: boolean; error: Error | null; } export class ErrorBoundary extends Component { constructor(props: ErrorBoundaryProps) { super(props); this.state = { hasError: false, error: null }; } static getDerivedStateFromError(error: Error): ErrorBoundaryState { return { hasError: true, error }; } componentDidCatch(error: Error, errorInfo: ErrorInfo) { console.error('[ErrorBoundary]', error, errorInfo); } handleReset = () => { this.setState({ hasError: false, error: null }); this.props.onReset?.(); }; render() { if (!this.state.hasError) { return this.props.children; } const { level = 'page' } = this.props; if (level === 'app') { return (
⚠️

Something went wrong

An unexpected error occurred. Please try reloading the page.

); } if (level === 'widget') { return (

Failed to load this section

); } // level === 'page' (default) return (
⚠️

Something went wrong

{this.state.error?.message || 'An unexpected error occurred'}

); } }