"use client"; import { Component, ReactNode, ErrorInfo } from "react"; import { logger } from "@/core/logger"; import { Button } from "@/components/atoms/button"; interface ErrorBoundaryState { hasError: boolean; error?: Error | undefined; } interface ErrorBoundaryProps { children: ReactNode; fallback?: ReactNode | undefined; onError?: ((error: Error, errorInfo: ErrorInfo) => void) | undefined; } /** * Error boundary component for catching and handling React errors */ export class ErrorBoundary extends Component { constructor(props: ErrorBoundaryProps) { super(props); this.state = { hasError: false }; } static getDerivedStateFromError(error: Error): ErrorBoundaryState { return { hasError: true, error }; } override componentDidCatch(error: Error, errorInfo: ErrorInfo) { // Log to external error service in production if (process.env.NODE_ENV === "production") { // Integration point: Send to error tracking service (Sentry, LogRocket, etc.) // Example: Sentry.captureException(error, { contexts: { react: { componentStack: info.componentStack } } }); } else { logger.error("ErrorBoundary caught an error", { error: error.message, stack: error.stack, componentStack: errorInfo.componentStack, }); } this.props.onError?.(error, errorInfo); } override render() { if (this.state.hasError) { if (this.props.fallback) { return this.props.fallback; } return (

Something went wrong

{process.env.NODE_ENV === "development" ? this.state.error?.message || "An unexpected error occurred" : "An unexpected error occurred. Please try again."}

); } return this.props.children; } }