import { useState, useEffect, useRef } from 'react'; import { LayoutDashboard, Server, FlaskConical, Brain, TrendingUp, Users, Database, Swords, DollarSign, Settings, Trophy, Medal, PanelLeftClose, PanelLeftOpen, } from 'lucide-react'; import { useGameStore, type ActivePage } from '@/store'; const NAV_ITEMS: { page: ActivePage; label: string; icon: typeof LayoutDashboard; era?: string }[] = [ { page: 'dashboard', label: 'Dashboard', icon: LayoutDashboard }, { page: 'infrastructure', label: 'Infrastructure', icon: Server }, { page: 'research', label: 'Research', icon: FlaskConical }, { page: 'models', label: 'Models', icon: Brain }, { page: 'market', label: 'Market', icon: TrendingUp }, { page: 'finance', label: 'Finance', icon: DollarSign }, { page: 'talent', label: 'Talent', icon: Users, era: 'scaleup' }, { page: 'data', label: 'Data', icon: Database, era: 'scaleup' }, { page: 'competitors', label: 'Competitors', icon: Swords, era: 'scaleup' }, { page: 'achievements', label: 'Achievements', icon: Trophy }, { page: 'leaderboard', label: 'Leaderboard', icon: Medal }, { page: 'settings', label: 'Settings', icon: Settings }, ]; function getInitialCollapsed(): boolean { try { const stored = localStorage.getItem('ai-tycoon-sidebar-collapsed'); if (stored !== null) return stored === 'true'; return window.innerWidth < 1280; } catch { return false; } } export function Sidebar() { const activePage = useGameStore((s) => s.activePage); const setActivePage = useGameStore((s) => s.setActivePage); const companyName = useGameStore((s) => s.meta.companyName); const era = useGameStore((s) => s.meta.currentEra); const [collapsed, setCollapsed] = useState(getInitialCollapsed); const eraOrder = ['startup', 'scaleup', 'bigtech', 'agi']; const currentEraIdx = eraOrder.indexOf(era); const seenEraRef = useRef(era); const [newPages, setNewPages] = useState>(new Set()); useEffect(() => { if (era !== seenEraRef.current) { const oldIdx = eraOrder.indexOf(seenEraRef.current); const newIdx = eraOrder.indexOf(era); if (newIdx > oldIdx) { const newlyVisible = NAV_ITEMS .filter(item => item.era && eraOrder.indexOf(item.era) > oldIdx && eraOrder.indexOf(item.era) <= newIdx) .map(item => item.page); setNewPages(prev => new Set([...prev, ...newlyVisible])); } seenEraRef.current = era; } }, [era]); const handleNavClick = (page: ActivePage) => { setActivePage(page); setNewPages(prev => { const next = new Set(prev); next.delete(page); return next; }); }; const toggleCollapse = () => { setCollapsed(prev => { const next = !prev; localStorage.setItem('ai-tycoon-sidebar-collapsed', String(next)); return next; }); }; return ( ); }