import { useCallback, useRef, useState } from "react"; import { AppLayout } from "./app/AppLayout"; import type { DashboardSection } from "./app/routes"; import { useHashRoute } from "./data/useHashRoute"; import { BehaviorRoute, CostsRoute, ErrorsRoute, GainRoute, ModelsRoute, OverviewRoute, ProjectsRoute, RequestsRoute, ToolsRoute, } from "./routes"; import { RequestDrawer } from "./ui/RequestDrawer"; export default function App() { const { section, setSection, range, setRange } = useHashRoute(); const [refreshTrigger, setRefreshTrigger] = useState(0); const [selectedRequestId, setSelectedRequestId] = useState(null); const [updatedAt, setUpdatedAt] = useState(() => Date.now()); const handleSyncComplete = useCallback((result: { success: boolean }) => { if (result.success) { setRefreshTrigger(prev => prev + 1); setUpdatedAt(Date.now()); } }, []); // Stable identity so the drawer's effects don't tear down on every App render. const closeDrawer = useCallback(() => setSelectedRequestId(null), []); const active = section; // Keep every visited section mounted and just toggle visibility. Remounting a // route on each navigation replays the chart entry animations (a visible // flicker); keeping it alive makes revisits instant while the live chart // instances still animate in place on data/range updates. Only the active // route fetches/polls (enabled), so hidden routes don't keep hitting the API. const mountedRef = useRef>(new Set()); mountedRef.current.add(active); const renderRoute = (target: DashboardSection) => { const isActive = target === active; switch (target) { case "overview": return ( ); case "requests": return ( ); case "errors": return ( ); case "models": return ; case "tools": return ; case "costs": return ; case "behavior": return ; case "projects": return ; case "gain": return ; } }; return ( <> {[...mountedRef.current].map(target => ( ))} ); }