import { type ReactNode, useEffect, useState } from "react"; import { Sidebar } from "../navigation/Sidebar"; import { useTelemetryStream } from "../../features/telemetry/hooks/useTelemetryStream"; import { useCurrentUser } from "../../features/auth/hooks/useCurrentUser"; import type { TelemetrySnapshot } from "../../types/telemetry"; import type { AppPage } from "../../app/App"; type Theme = "dark" | "light"; type AppShellRenderProps = { theme: Theme; snapshots: TelemetrySnapshot[]; }; type AppShellProps = { activePage: AppPage; onNavigate: (page: AppPage) => void; children: (props: AppShellRenderProps) => ReactNode; }; const THEME_STORAGE_KEY = "app-theme"; export function AppShell({ activePage, onNavigate, children }: AppShellProps) { const telemetry = useTelemetryStream(); const currentUser = useCurrentUser(); const [sidebarCollapsed, setSidebarCollapsed] = useState(false); const [autoCompact, setAutoCompact] = useState(false); const [theme, setTheme] = useState(() => { const stored = localStorage.getItem(THEME_STORAGE_KEY); return stored === "light" || stored === "dark" ? stored : "dark"; }); const isDark = theme === "dark"; const isDashboard = activePage === "dashboard"; useEffect(() => { localStorage.setItem(THEME_STORAGE_KEY, theme); }, [theme]); const toggleTheme = () => { setTheme((current) => (current === "dark" ? "light" : "dark")); }; useEffect(() => { const update = () => { const compact = window.innerWidth <= 1366 || window.innerHeight <= 760; setAutoCompact(compact); if (compact) { setSidebarCollapsed(true); } }; update(); window.addEventListener("resize", update); return () => window.removeEventListener("resize", update); }, []); return (
{children({ theme, snapshots: telemetry.snapshots, })}
); }