pmtool / src /components /asset-management /shared /ErrorBoundary.tsx
devarshia5's picture
Upload 487 files
d97b8f9 verified
Raw
History Blame Contribute Delete
2.49 kB
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;