import React, { useCallback, useEffect, useState } from "react"; import { Outlet, useLocation } from "react-router-dom"; import { AnimatePresence, motion } from "framer-motion"; import { TopBar } from "./TopBar"; import { Sidebar, SIDEBAR_COLLAPSED, SIDEBAR_EXPANDED } from "./Sidebar"; import { BottomNavigation } from "./BottomNavigation"; import { useIsMobile } from "../../hooks/useIsMobile"; import { useCommodityPrices, useMarketQuotes } from "../../hooks/useMarketData"; const LS_KEY = "tm_sidebar_collapsed"; const MAIN_TRANSITION = "margin-left 0.3s cubic-bezier(0.4,0,0.2,1)"; export function AppLayout() { const isMobile = useIsMobile(); const { commodities, loading: commodityLoading } = useCommodityPrices(); const marketQuotes = useMarketQuotes(); const location = useLocation(); // Collapsed state — persisted in localStorage const [collapsed, setCollapsed] = useState(() => { try { return localStorage.getItem(LS_KEY) === "true"; } catch { return false; } }); // Mobile drawer open state const [mobileOpen, setMobileOpen] = useState(false); const toggleCollapsed = useCallback(() => { setCollapsed((c) => { const next = !c; try { localStorage.setItem(LS_KEY, String(next)); } catch {} return next; }); }, []); // Close mobile drawer on route change useEffect(() => { setMobileOpen(false); }, [location.pathname]); // Sync CSS variable for any consumers that read it useEffect(() => { const w = isMobile ? 0 : collapsed ? SIDEBAR_COLLAPSED : SIDEBAR_EXPANDED; document.documentElement.style.setProperty("--sidebar-width", `${w}px`); }, [isMobile, collapsed]); const sidebarW = isMobile ? 0 : collapsed ? SIDEBAR_COLLAPSED : SIDEBAR_EXPANDED; return (
{/* Top bar — full width, always on top */} setMobileOpen(true)} /> {/* Sidebar */} setMobileOpen(false)} /> {/* Main content */}
{/* Bottom nav — mobile only */} {isMobile && }
); }