Spaces:
Sleeping
Sleeping
| import { cn } from "@/lib/utils"; | |
| import { AlertTriangle, RotateCcw } from "lucide-react"; | |
| import { Component, ReactNode } from "react"; | |
| interface Props { | |
| children: ReactNode; | |
| } | |
| interface State { | |
| hasError: boolean; | |
| error: Error | null; | |
| } | |
| class ErrorBoundary extends Component<Props, State> { | |
| constructor(props: Props) { | |
| super(props); | |
| this.state = { hasError: false, error: null }; | |
| } | |
| static getDerivedStateFromError(error: Error): State { | |
| return { hasError: true, error }; | |
| } | |
| render() { | |
| if (this.state.hasError) { | |
| return ( | |
| <div className="flex items-center justify-center min-h-screen p-8 bg-background"> | |
| <div className="flex flex-col items-center w-full max-w-2xl p-8"> | |
| <AlertTriangle | |
| size={48} | |
| className="text-destructive mb-6 flex-shrink-0" | |
| /> | |
| <h2 className="text-xl mb-4">An unexpected error occurred.</h2> | |
| <div className="p-4 w-full rounded bg-muted overflow-auto mb-6"> | |
| <pre className="text-sm text-muted-foreground whitespace-break-spaces"> | |
| {this.state.error?.stack} | |
| </pre> | |
| </div> | |
| <button | |
| onClick={() => window.location.reload()} | |
| className={cn( | |
| "flex items-center gap-2 px-4 py-2 rounded-lg", | |
| "bg-primary text-primary-foreground", | |
| "hover:opacity-90 cursor-pointer" | |
| )} | |
| > | |
| <RotateCcw size={16} /> | |
| Reload Page | |
| </button> | |
| </div> | |
| </div> | |
| ); | |
| } | |
| return this.props.children; | |
| } | |
| } | |
| export default ErrorBoundary; | |