glam/frontend/src/main.tsx
kempersc 0a38225b36 feat(frontend): Add multi-select filters, URL params, and UI improvements
- Institution Browser: multi-select for types and countries
- URL query param sync for shareable filter URLs
- New utility: countryNames.ts with flag emoji support
- New utility: imageProxy.ts for image URL handling
- New component: SearchableMultiSelect dropdown
- Career timeline CSS and component updates
- Media gallery improvements
- Lazy load error boundary component
- Version check utility
2025-12-15 01:47:11 +01:00

59 lines
1.9 KiB
TypeScript

import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import { GraphProvider } from './contexts/GraphContext'
import { UIStateProvider } from './contexts/UIStateContext'
import './index.css'
import App from './App.tsx'
import { isChunkLoadError, handleChunkLoadError } from './components/common/LazyLoadError'
/**
* Global error handler for uncaught errors, especially chunk loading failures.
*
* This catches errors that occur:
* 1. During dynamic import before React mounts
* 2. In async code outside of React's error boundary
* 3. During router initialization
*
* When a chunk load error is detected, we clear caches and reload.
*/
window.addEventListener('error', (event) => {
if (event.error && isChunkLoadError(event.error)) {
console.warn('[GlobalErrorHandler] Chunk load error detected, reloading...', event.error.message);
event.preventDefault(); // Prevent the ugly default error UI
handleChunkLoadError();
}
});
/**
* Handle unhandled promise rejections (e.g., failed dynamic imports)
*/
window.addEventListener('unhandledrejection', (event) => {
if (event.reason && isChunkLoadError(event.reason)) {
console.warn('[GlobalErrorHandler] Chunk load rejection detected, reloading...', event.reason.message);
event.preventDefault();
handleChunkLoadError();
}
});
/**
* Vite-specific: Handle module loading errors during HMR
* This catches the "Failed to fetch dynamically imported module" errors
*/
if (import.meta.hot) {
import.meta.hot.on('vite:error', (payload) => {
if (payload.err?.message?.includes('dynamically imported module')) {
console.warn('[HMR] Chunk error during HMR, triggering full reload');
window.location.reload();
}
});
}
createRoot(document.getElementById('root')!).render(
<StrictMode>
<UIStateProvider>
<GraphProvider>
<App />
</GraphProvider>
</UIStateProvider>
</StrictMode>,
)