'use client' import Link from 'next/link' 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, DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' import { AppIcon } from '@/components/shared/app-icon' import { UserMenu } from '@/components/shared/user-menu' import { NotificationsBell } from '@/components/shared/notifications-bell' import { SoloNavStatusIndicators } from '@/components/solo/nav-status-indicators' import { cn } from '@/lib/utils' import { setActiveProductAction } from '@/actions/active-product' import { resolveProductSwitchTarget } from '@/lib/product-switch-path' import { debugProps } from '@/lib/debug' interface NavBarProps { isDemo: boolean roles: string[] userId: string username: string email: string | null activeProduct: { id: string; name: string } | null products: { id: string; name: string }[] hasActiveSprint: boolean minQuotaPct: number } export function NavBar({ isDemo, roles, userId, username, email, activeProduct, products, hasActiveSprint, minQuotaPct, }: NavBarProps) { const pathname = usePathname() const router = useRouter() const [isPending, startTransition] = useTransition() const urlProductId = pathname.match(/^\/products\/([^/]+)/)?.[1] ?? null const displayActive = isDemo && urlProductId ? products.find(p => p.id === urlProductId) ?? activeProduct : activeProduct const activeId = displayActive?.id ?? null function handleSwitchProduct(productId: string) { if (productId === displayActive?.id) return if (isDemo) { router.push(`/products/${productId}`) return } startTransition(async () => { const result = await setActiveProductAction(productId) if (result?.error) { toast.error(typeof result.error === 'string' ? result.error : 'Wisselen mislukt') return } const next = products.find(p => p.id === productId) toast.success(`Actief product: ${next?.name ?? 'gewijzigd'}`) const target = resolveProductSwitchTarget(pathname, productId) if (target) router.push(target); else router.refresh() }) } // Nav link helpers const disabledSpan = (label: string) => ( {label} ) const navLink = (href: string, label: string, isActive: boolean) => ( {label} ) const sprintNode = () => { if (!activeId) return disabledSpan('Sprint') const isActive = pathname.includes('/sprint') if (!hasActiveSprint) { return ( Sprint Geen actieve sprint ) } const href = `/products/${activeId}/sprint` return navLink(href, 'Sprint', isActive) } return (
{/* Links: logo + nav */}
Scrum4Me {isDemo && ( Demo )}
{/* Midden: actief product */}
{displayActive ? ( {displayActive.name.length > 22 ? displayActive.name.slice(0, 22) + '…' : displayActive.name} {products.map(p => ( p.id !== displayActive.id && handleSwitchProduct(p.id)} className={cn( p.id === displayActive.id && 'bg-primary-container text-primary-container-foreground font-medium' )} > {p.name} ))} Producten beheren → ) : ( Geen actief product )}
{/* Rechts: solo-status + notifications + account-menu */}
) }