Spaces:
Sleeping
Sleeping
| import React, { Component, ErrorInfo, ReactNode } from 'react'; | |
| import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; | |
| import { Button } from '@/components/ui/button'; | |
| import { Card, CardContent } from '@/components/ui/card'; | |
| import { AlertTriangle, RefreshCw } from 'lucide-react'; | |
| interface Props { | |
| children: ReactNode; | |
| fallback?: ReactNode; | |
| onReset?: () => void; | |
| } | |
| 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, | |
| }; | |
| } | |
| componentDidCatch(error: Error, errorInfo: ErrorInfo): void { | |
| console.error('ErrorBoundary caught an error:', error, errorInfo); | |
| } | |
| handleReset = (): void => { | |
| this.setState({ | |
| hasError: false, | |
| error: null, | |
| }); | |
| if (this.props.onReset) { | |
| this.props.onReset(); | |
| } | |
| }; | |
| render(): ReactNode { | |
| if (this.state.hasError) { | |
| if (this.props.fallback) { | |
| return this.props.fallback; | |
| } | |
| return ( | |
| <Card className="w-full"> | |
| <CardContent className="pt-6"> | |
| <Alert variant="destructive"> | |
| <AlertTriangle className="h-4 w-4" /> | |
| <AlertTitle>Something went wrong</AlertTitle> | |
| <AlertDescription className="mt-2"> | |
| <p className="mb-4"> | |
| {this.state.error?.message || 'An unexpected error occurred. Please try again.'} | |
| </p> | |
| <Button | |
| variant="outline" | |
| size="sm" | |
| onClick={this.handleReset} | |
| className="flex items-center gap-2" | |
| > | |
| <RefreshCw className="h-4 w-4" /> | |
| Try Again | |
| </Button> | |
| </AlertDescription> | |
| </Alert> | |
| </CardContent> | |
| </Card> | |
| ); | |
| } | |
| return this.props.children; | |
| } | |
| } | |
| export default ErrorBoundary; | |