'use client' import { usePathname, useRouter } from 'next/navigation' import { useTransition } from 'react' import { ChevronDown } from 'lucide-react' import { toast } from 'sonner' import { Badge } from '@/components/ui/badge' import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' import { cn } from '@/lib/utils' import { setActiveSprintAction } from '@/actions/active-sprint' import type { SprintStatusApi } from '@/lib/task-status' type SprintItem = { id: string; code: string; status: SprintStatusApi } interface SprintSwitcherProps { productId: string sprints: SprintItem[] activeSprint: SprintItem | null buildingSprintIds: string[] } const SPRINT_STATUS_LABEL: Record = { open: 'Open', closed: 'Gesloten', archived: 'Gearchiveerd', failed: 'Mislukt', } const SPRINT_STATUS_BADGE: Record = { open: 'bg-status-in-progress text-foreground', closed: 'bg-status-done text-foreground', archived: 'bg-surface-container text-muted-foreground', failed: 'bg-status-failed text-foreground', } export function SprintSwitcher({ productId, sprints, activeSprint, buildingSprintIds, }: SprintSwitcherProps) { const pathname = usePathname() const router = useRouter() const [isPending, startTransition] = useTransition() const buildingSet = new Set(buildingSprintIds) function handleSwitchSprint(sprintId: string) { if (sprintId === activeSprint?.id) return startTransition(async () => { const result = await setActiveSprintAction(productId, sprintId) if (result?.error) { toast.error(typeof result.error === 'string' ? result.error : 'Wisselen mislukt') return } if (pathname.includes('/sprint')) { router.push(`/products/${productId}/sprint/${sprintId}`) } else { router.refresh() } }) } if (sprints.length === 0) { return ( Geen sprints Maak een sprint aan vanuit de Product Backlog ) } return ( {activeSprint ? activeSprint.code : 'Selecteer sprint'} {activeSprint && ( {buildingSet.has(activeSprint.id) ? 'BUILDING' : SPRINT_STATUS_LABEL[activeSprint.status]} )} {sprints.map(s => ( handleSwitchSprint(s.id)} className={cn( 'flex items-center justify-between gap-2', s.id === activeSprint?.id && 'bg-primary-container text-primary-container-foreground font-medium', )} > {s.code} {buildingSet.has(s.id) ? 'BUILDING' : SPRINT_STATUS_LABEL[s.status]} ))} ) }