/** * Project Switcher Component * Dropdown selector for switching between projects * Displays current project and allows quick project navigation */ 'use client'; import { useState, useCallback } from 'react'; import { useRouter } from '@/lib/i18n/routing'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { Button } from '@/components/ui/button'; import { FolderKanban, Plus, ChevronDown } from 'lucide-react'; import { cn } from '@/lib/utils'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; interface Project { id: string; slug: string; name: string; /** Optional description */ description?: string; } interface ProjectSwitcherProps { /** Currently selected project */ currentProject?: Project; /** List of available projects */ projects: Project[]; /** Callback when project is changed */ onProjectChange?: (projectSlug: string) => void; /** Additional className */ className?: string; } export function ProjectSwitcher({ currentProject, projects, onProjectChange, className, }: ProjectSwitcherProps) { const router = useRouter(); const [open, setOpen] = useState(false); const handleProjectChange = useCallback( (projectSlug: string) => { if (onProjectChange) { onProjectChange(projectSlug); } else { // Default behavior: navigate to project dashboard router.push(`/projects/${projectSlug}`); } setOpen(false); }, [onProjectChange, router] ); const handleCreateProject = useCallback(() => { router.push('/projects/new'); setOpen(false); }, [router]); // If no projects, show create button if (projects.length === 0) { return ( ); } return ( Projects {projects.map((project) => ( handleProjectChange(project.slug)} className="cursor-pointer" data-testid={`project-option-${project.slug}`} > ))} ); } /** * Alternative version using Select component for simpler use cases */ interface ProjectSelectProps { /** Currently selected project slug */ value?: string; /** List of available projects */ projects: Project[]; /** Callback when project is selected */ onValueChange: (projectSlug: string) => void; /** Placeholder text */ placeholder?: string; /** Additional className */ className?: string; } export function ProjectSelect({ value, projects, onValueChange, placeholder = 'Select a project', className, }: ProjectSelectProps) { return ( ); }