import { useCallback } from 'react'; import { useNavigate } from '@tanstack/react-router'; import { cn } from '@/lib/utils'; import { useAppStore } from '@/store/app-store'; import type { Project } from '@/lib/electron'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, DropdownMenuLabel, } from '@/components/ui/dropdown-menu'; import { ChevronDown, Star, Plus, FolderOpen, Check } from 'lucide-react'; interface ProjectSwitcherProps { isOpen: boolean; onOpenChange: (open: boolean) => void; currentProject: Project | null; projects: Project[]; pinnedProjectIds: string[]; onNewProject: () => void; onOpenFolder: () => void; showCurrentProjectName?: boolean; } export function ProjectSwitcher({ isOpen, onOpenChange, currentProject, projects, pinnedProjectIds, onNewProject, onOpenFolder, showCurrentProjectName = true, }: ProjectSwitcherProps) { const navigate = useNavigate(); const { setCurrentProject, pinProject, unpinProject } = useAppStore(); const pinnedProjects = projects.filter((p) => pinnedProjectIds.includes(p.id)); const unpinnedProjects = projects.filter((p) => !pinnedProjectIds.includes(p.id)); const handleSelectProject = useCallback( (project: Project) => { setCurrentProject(project); navigate({ to: '/board' }); onOpenChange(false); }, [setCurrentProject, navigate, onOpenChange] ); const handleTogglePin = useCallback( (e: React.MouseEvent, projectId: string) => { e.stopPropagation(); if (pinnedProjectIds.includes(projectId)) { unpinProject(projectId); } else { pinProject(projectId); } }, [pinnedProjectIds, pinProject, unpinProject] ); const handleNewProject = useCallback(() => { onOpenChange(false); onNewProject(); }, [onOpenChange, onNewProject]); const handleOpenFolder = useCallback(() => { onOpenChange(false); onOpenFolder(); }, [onOpenChange, onOpenFolder]); const handleAllProjects = useCallback(() => { onOpenChange(false); navigate({ to: '/dashboard' }); }, [onOpenChange, navigate]); // TODO: Get running agent counts from store const getRunningCount = (projectId: string) => 0; // Determine if we should show the current project name in the trigger // Don't show if it's already visible as a pinned project const currentProjectIsPinned = currentProject && pinnedProjectIds.includes(currentProject.id); const shouldShowProjectName = showCurrentProjectName && currentProject && !currentProjectIsPinned; return ( {/* Pinned Projects */} {pinnedProjects.length > 0 && ( <> Pinned {pinnedProjects.map((project) => { const isActive = currentProject?.id === project.id; const runningCount = getRunningCount(project.id); return ( handleSelectProject(project)} className="flex items-center justify-between" >
{isActive && } {project.name}
{runningCount > 0 && ( {runningCount} )}
); })} )} {/* Other Projects */} {unpinnedProjects.length > 0 && ( <> Other Projects {unpinnedProjects.map((project) => { const isActive = currentProject?.id === project.id; const runningCount = getRunningCount(project.id); return ( handleSelectProject(project)} className="flex items-center justify-between" >
{isActive && } {project.name}
{runningCount > 0 && ( {runningCount} )}
); })} )} {/* Actions */} New Project Open Folder All Projects
); }