61 lines
1.5 KiB
TypeScript

import { Suspense, lazy, Component, ErrorInfo, ReactNode } from 'react';
import { createRoot } from 'react-dom/client';
const App = lazy(() => import('./App'));
interface ErrorBoundaryProps {
children: ReactNode;
}
interface ErrorBoundaryState {
hasError: boolean;
error?: Error;
}
class ErrorBoundary extends 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: ErrorInfo) {
console.error('ErrorBoundary caught:', error, errorInfo);
}
render() {
if (this.state.hasError) {
return (
<div style={{ padding: '2rem', color: '#ef4444' }}>
<h1>Something went wrong</h1>
<pre>{this.state.error?.message}</pre>
</div>
);
}
return this.props.children;
}
}
const LoadingSkeleton = () => (
<div className="loading-skeleton">
<div className="shimmer" style={{ height: '60px', marginBottom: '1rem' }}></div>
<div className="shimmer" style={{ height: '120px', marginBottom: '1rem' }}></div>
<div className="shimmer" style={{ height: '300px' }}></div>
</div>
);
const container = document.getElementById('root');
if (container) {
const root = createRoot(container);
root.render(
<ErrorBoundary>
<Suspense fallback={<LoadingSkeleton />}>
<App />
</Suspense>
</ErrorBoundary>
);
}