'use client' import { usePathname, useRouter } from 'next/navigation' import { useState, useTransition } from 'react' import { Check, ChevronDown } from 'lucide-react' import { toast } from 'sonner' import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, 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; sprint_goal: 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', } export function SprintSwitcher({ productId, sprints, activeSprint, buildingSprintIds, }: SprintSwitcherProps) { const pathname = usePathname() const router = useRouter() const [isPending, startTransition] = useTransition() const [showClosed, setShowClosed] = useState(false) const buildingSet = new Set(buildingSprintIds) const visibleSprints = sprints.filter(s => { if (showClosed) return true if (s.id === activeSprint?.id) return true return s.status === 'open' }) 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]} )} {visibleSprints.length === 0 ? (
Geen open sprints
) : ( visibleSprints.map(s => ( handleSwitchSprint(s.id)} className={cn( 'flex items-center gap-2', s.id === activeSprint?.id && 'bg-primary-container text-primary-container-foreground font-medium', )} > {s.code} {s.sprint_goal} {buildingSet.has(s.id) ? 'BUILDING' : SPRINT_STATUS_LABEL[s.status]} )) )}
) }