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 ;
}