Quran_Tech_Server / F_Pro /src /components /ErrorBoundary.tsx
aboalaa147's picture
Initial deployment
eb6a2f9
Raw
History Blame Contribute Delete
1.97 kB
import { Component, ErrorInfo, ReactNode } from 'react';
interface Props {
children: ReactNode;
fallback?: ReactNode;
}
interface State {
hasError: boolean;
error: Error | null;
}
export 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, info: ErrorInfo) {
console.error('[ErrorBoundary] Caught error:', error, info.componentStack);
}
handleReset = () => {
this.setState({ hasError: false, error: null });
window.history.back();
};
render() {
if (this.state.hasError) {
if (this.props.fallback) return this.props.fallback;
return (
<div
style={{
minHeight: '60vh',
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
justifyContent: 'center',
padding: '2rem',
fontFamily: 'system-ui, sans-serif',
}}
>
<h2 style={{ color: '#dc2626', fontSize: '1.25rem', marginBottom: '0.5rem' }}>
Something went wrong
</h2>
<p style={{ color: '#6b7280', fontSize: '0.875rem', marginBottom: '1rem', maxWidth: 480, textAlign: 'center' }}>
{this.state.error?.message ?? 'An unexpected error occurred while rendering this page.'}
</p>
<button
onClick={this.handleReset}
style={{
padding: '0.5rem 1.25rem',
background: '#059669',
color: '#fff',
border: 'none',
borderRadius: '0.375rem',
cursor: 'pointer',
fontSize: '0.875rem',
}}
>
← Go Back
</button>
</div>
);
}
return this.props.children;
}
}