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