| |
| "use client"; |
|
|
| import { Component, ReactNode } from "react"; |
| import { AlertTriangle } from "lucide-react"; |
| import { Button } from "@/components/ui/button"; |
|
|
| interface Props { |
| children: ReactNode; |
| fallback?: ReactNode; |
| } |
|
|
| interface State { |
| hasError: boolean; |
| error?: Error; |
| } |
|
|
| export class ErrorBoundary extends Component<Props, State> { |
| constructor(props: Props) { |
| super(props); |
| this.state = { hasError: false }; |
| } |
|
|
| static getDerivedStateFromError(error: Error): State { |
| return { hasError: true, error }; |
| } |
|
|
| componentDidCatch(error: Error, errorInfo: React.ErrorInfo) { |
| |
| console.error("Error Boundary caught:", error, errorInfo); |
| } |
|
|
| render() { |
| if (this.state.hasError) { |
| if (this.props.fallback) { |
| return this.props.fallback; |
| } |
|
|
| return ( |
| <div className="min-h-screen flex items-center justify-center p-4"> |
| <div className="max-w-md w-full space-y-4 text-center"> |
| <div className="flex justify-center"> |
| <AlertTriangle className="h-12 w-12 text-red-500" /> |
| </div> |
| <h1 className="text-2xl font-bold">Something went wrong</h1> |
| <p className="text-muted-foreground"> |
| {this.state.error?.message || "An unexpected error occurred"} |
| </p> |
| <div className="flex gap-2 justify-center"> |
| <Button |
| onClick={() => this.setState({ hasError: false, error: undefined })} |
| > |
| Try Again |
| </Button> |
| <Button variant="outline" onClick={() => window.location.href = "/"}> |
| Go Home |
| </Button> |
| </div> |
| </div> |
| </div> |
| ); |
| } |
|
|
| return this.props.children; |
| } |
| } |
|
|