Spaces:
Sleeping
Sleeping
| import React from 'react'; | |
| import { AlertCircle, RefreshCw } from 'lucide-react'; | |
| import { Button } from '@/components/ui/button'; | |
| import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; | |
| interface ErrorBoundaryState { | |
| hasError: boolean; | |
| error?: Error; | |
| } | |
| interface ErrorBoundaryProps { | |
| children: React.ReactNode; | |
| fallback?: React.ComponentType<{ error: Error; retry: () => void }>; | |
| } | |
| class ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> { | |
| constructor(props: ErrorBoundaryProps) { | |
| super(props); | |
| this.state = { hasError: false }; | |
| } | |
| static getDerivedStateFromError(error: Error): ErrorBoundaryState { | |
| return { hasError: true, error }; | |
| } | |
| componentDidCatch(error: Error, errorInfo: React.ErrorInfo) { | |
| console.error('Asset Management Error Boundary caught an error:', error, errorInfo); | |
| } | |
| retry = () => { | |
| this.setState({ hasError: false, error: undefined }); | |
| }; | |
| render() { | |
| if (this.state.hasError) { | |
| if (this.props.fallback) { | |
| const FallbackComponent = this.props.fallback; | |
| return <FallbackComponent error={this.state.error!} retry={this.retry} />; | |
| } | |
| return <DefaultErrorFallback error={this.state.error!} retry={this.retry} />; | |
| } | |
| return this.props.children; | |
| } | |
| } | |
| const DefaultErrorFallback: React.FC<{ error: Error; retry: () => void }> = ({ error, retry }) => { | |
| return ( | |
| <Card className="w-full max-w-md mx-auto mt-8"> | |
| <CardHeader> | |
| <CardTitle className="flex items-center gap-2 text-destructive"> | |
| <AlertCircle className="h-5 w-5" /> | |
| Something went wrong | |
| </CardTitle> | |
| </CardHeader> | |
| <CardContent className="space-y-4"> | |
| <p className="text-sm text-muted-foreground"> | |
| An unexpected error occurred in the asset management system. | |
| </p> | |
| <details className="text-xs"> | |
| <summary className="cursor-pointer text-muted-foreground hover:text-foreground"> | |
| Error details | |
| </summary> | |
| <pre className="mt-2 p-2 bg-muted rounded text-xs overflow-auto"> | |
| {error.message} | |
| </pre> | |
| </details> | |
| <Button onClick={retry} className="w-full" variant="outline"> | |
| <RefreshCw className="h-4 w-4 mr-2" /> | |
| Try Again | |
| </Button> | |
| </CardContent> | |
| </Card> | |
| ); | |
| }; | |
| export default ErrorBoundary; |