import { StrictMode } from 'react' import ReactDOM from 'react-dom/client' import { AxiosError } from 'axios' import { QueryCache, QueryClient, QueryClientProvider, } from '@tanstack/react-query' import { RouterProvider, createRouter } from '@tanstack/react-router' import { toast } from 'sonner' import { useAuthStore } from '@/stores/auth-store' import { handleServerError } from '@/lib/handle-server-error' import { setupGlobalNavigation } from '@/lib/navigation-helper' import { AuthInitializer } from './components/auth-initializer' import { DirectionProvider } from './context/direction-provider' import { FontProvider } from './context/font-provider' import { ThemeProvider } from './context/theme-provider' // Import axios instance to initialize interceptors import './lib/api' // Generated Routes import { routeTree } from './routeTree.gen' // Styles import './styles/index.css' // Setup global navigation functions for map popups setupGlobalNavigation() const queryClient = new QueryClient({ defaultOptions: { queries: { retry: (failureCount, error) => { // eslint-disable-next-line no-console if (import.meta.env.DEV) console.log({ failureCount, error }) if (failureCount >= 0 && import.meta.env.DEV) return false if (failureCount > 3 && import.meta.env.PROD) return false return !( error instanceof AxiosError && [401, 403].includes(error.response?.status ?? 0) ) }, refetchOnWindowFocus: import.meta.env.PROD, staleTime: 10 * 1000, // 10s }, mutations: { onError: (error) => { handleServerError(error) if (error instanceof AxiosError) { if (error.response?.status === 304) { toast.error('Content not modified!') } } }, }, }, queryCache: new QueryCache({ onError: (error) => { if (error instanceof AxiosError) { if (error.response?.status === 401) { toast.error('Session expired!') // Use setTimeout to avoid potential infinite loops during state updates setTimeout(() => { useAuthStore.getState().auth.reset() const redirect = `${router.history.location.href}` router.navigate({ to: '/sign-in', search: { redirect } }) }, 0) } if (error.response?.status === 500) { toast.error('Internal Server Error!') setTimeout(() => { router.navigate({ to: '/500' }) }, 0) } if (error.response?.status === 403) { // router.navigate('/forbidden', { replace: true }) } } }, }), }) // Create a new router instance const router = createRouter({ routeTree, context: { queryClient }, defaultPreload: 'intent', defaultPreloadStaleTime: 0, }) // Register the router instance for type safety declare module '@tanstack/react-router' { interface Register { router: typeof router } } // Render the app const rootElement = document.getElementById('root')! if (!rootElement.innerHTML) { const root = ReactDOM.createRoot(rootElement) root.render( ) }