import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { useEffect, type ReactNode } from 'react'; import { BrowserRouter, Navigate, Route, Routes } from 'react-router-dom'; import { AppShell } from './layout/AppShell'; import { AuthGate } from './auth/AuthGate'; import { PlatformErrorBoundary, RoutePage } from './routing/RouteBoundary'; import { RoutePageFactories, RoutePages } from './routing/routeModules'; import { ROUTER_FUTURE } from './routing/routerConfig'; import { QUERY_MEMORY } from './queryPolicy'; import { usePlatformSession } from './auth/AuthGate'; import { hasMenu } from './auth/session'; export function createPlatformQueryClient() { return new QueryClient({ defaultOptions: { queries: { staleTime: 15_000, gcTime: 5 * 60_000, retry: 1, refetchOnWindowFocus: false }, mutations: { gcTime: QUERY_MEMORY.highVolumeGcTime, retry: 0 } } }); } const queryClient = createPlatformQueryClient(); export const PLATFORM_READY_EVENT = 'vehicle-platform:ready'; function PlatformReadySignal() { useEffect(() => { window.dispatchEvent(new Event(PLATFORM_READY_EVENT)); }, []); return null; } function defaultPath(menuKeys: string[]) { const first = ['monitor', 'vehicles', 'tracks', 'statistics'].find((key) => menuKeys.includes(key)); return first ? `/${first}` : '/monitor'; } function ProtectedRoute({ menu, children }: { menu: string; children: ReactNode }) { const { session } = usePlatformSession(); if (!hasMenu(session, menu)) return ; return children; } export function AppV2() { return ( }> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> ); } function SessionIndex() { const { session } = usePlatformSession(); return ; }