import { CheckCircle, Lock, Server, Play, Container, AppWindow, Settings, CloudLightning, Sun, Moon, Monitor, ChevronDown, Globe, Wifi, HardDrive } from 'lucide-react'; import { cn } from '../lib/utils'; import { Sidebar, SidebarContent, SidebarFooter, SidebarHeader, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarRail, } from './ui/sidebar'; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from './ui/collapsible'; import { useTheme } from '../contexts/ThemeContext'; export type Phase = 'setup' | 'infrastructure' | 'cluster' | 'apps'; export type Tab = Phase | 'advanced' | 'cloud' | 'central' | 'dns' | 'dhcp' | 'pxe'; interface AppSidebarProps { currentTab: Tab; onTabChange: (tab: Tab) => void; completedPhases: Phase[]; } export function AppSidebar({ currentTab, onTabChange, completedPhases }: AppSidebarProps) { const { theme, setTheme } = useTheme(); const cycleTheme = () => { if (theme === 'light') { setTheme('dark'); } else if (theme === 'dark') { setTheme('system'); } else { setTheme('light'); } }; const getThemeIcon = () => { switch (theme) { case 'light': return ; case 'dark': return ; default: return ; } }; const getThemeLabel = () => { switch (theme) { case 'light': return 'Light mode'; case 'dark': return 'Dark mode'; default: return 'System theme'; } }; const getTabStatus = (tab: Tab) => { // Non-phase tabs (like advanced and cloud) are always available if (tab === 'advanced' || tab === 'cloud') { return 'available'; } // Central sub-tabs are available if setup phase is available or completed if (tab === 'central' || tab === 'dns' || tab === 'dhcp' || tab === 'pxe') { if (completedPhases.includes('setup')) { return 'completed'; } return 'available'; } // For phase tabs, check completion status if (completedPhases.includes(tab as Phase)) { return 'completed'; } // Allow access to the first phase always if (tab === 'setup') { return 'available'; } // Allow access to the next phase if the previous phase is completed if (tab === 'infrastructure' && completedPhases.includes('setup')) { return 'available'; } if (tab === 'cluster' && completedPhases.includes('infrastructure')) { return 'available'; } if (tab === 'apps' && completedPhases.includes('cluster')) { return 'available'; } return 'locked'; }; return (

Wild Cloud

Central

{ const status = getTabStatus('cloud'); if (status !== 'locked') onTabChange('cloud'); }} disabled={getTabStatus('cloud') === 'locked'} tooltip="Configure cloud settings and domains" className={cn( "transition-colors", getTabStatus('cloud') === 'locked' && "opacity-50 cursor-not-allowed" )} >
Cloud
Central { const status = getTabStatus('central'); if (status !== 'locked') onTabChange('central'); }} className={cn( "transition-colors", getTabStatus('central') === 'locked' && "opacity-50 cursor-not-allowed" )} >
Central
{ const status = getTabStatus('dns'); if (status !== 'locked') onTabChange('dns'); }} className={cn( "transition-colors", getTabStatus('dns') === 'locked' && "opacity-50 cursor-not-allowed" )} >
DNS
{ const status = getTabStatus('dhcp'); if (status !== 'locked') onTabChange('dhcp'); }} className={cn( "transition-colors", getTabStatus('dhcp') === 'locked' && "opacity-50 cursor-not-allowed" )} >
DHCP
{ const status = getTabStatus('pxe'); if (status !== 'locked') onTabChange('pxe'); }} className={cn( "transition-colors", getTabStatus('pxe') === 'locked' && "opacity-50 cursor-not-allowed" )} >
PXE
Cluster { const status = getTabStatus('infrastructure'); if (status !== 'locked') onTabChange('infrastructure'); }} className={cn( "transition-colors", getTabStatus('infrastructure') === 'locked' && "opacity-50 cursor-not-allowed" )} >
Cluster Nodes
{ const status = getTabStatus('cluster'); if (status !== 'locked') onTabChange('cluster'); }} className={cn( "transition-colors", getTabStatus('cluster') === 'locked' && "opacity-50 cursor-not-allowed" )} >
Cluster Services
{ const status = getTabStatus('apps'); if (status !== 'locked') onTabChange('apps'); }} disabled={getTabStatus('apps') === 'locked'} tooltip="Install and manage applications" className={cn( "transition-colors", getTabStatus('apps') === 'locked' && "opacity-50 cursor-not-allowed" )} >
Apps
{ const status = getTabStatus('advanced'); if (status !== 'locked') onTabChange('advanced'); }} disabled={getTabStatus('advanced') === 'locked'} tooltip="Advanced settings and system configuration" className={cn( "transition-colors", getTabStatus('advanced') === 'locked' && "opacity-50 cursor-not-allowed" )} >
Advanced
{getThemeIcon()} {getThemeLabel()}
); }