'use client' import { useState, useEffect } from 'react' import Link from 'next/link' import { usePathname } from 'next/navigation' import { signOut, useSession } from 'next-auth/react' import { cn } from '@/lib/utils' import { Button } from '@/components/ui/button' import { UserAvatar } from '@/components/shared/user-avatar' import { trpc } from '@/lib/trpc/client' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' import type { Route } from 'next' import type { LucideIcon } from 'lucide-react' import { LogOut, Menu, Moon, Settings, Sun, User, X } from 'lucide-react' import { useTheme } from 'next-themes' import { Logo } from '@/components/shared/logo' import { NotificationBell } from '@/components/shared/notification-bell' export type NavItem = { name: string href: string icon: LucideIcon } export type RoleNavUser = { name?: string | null email?: string | null } type RoleNavProps = { navigation: NavItem[] roleName: string user: RoleNavUser /** The base path for the role (e.g., '/jury', '/mentor', '/observer'). Used for active state detection on the dashboard link. */ basePath: string /** Optional status badge displayed next to the logo (e.g., remaining evaluations count) */ statusBadge?: React.ReactNode } function isNavItemActive(pathname: string, href: string, basePath: string): boolean { return pathname === href || (href !== basePath && pathname.startsWith(href)) } export function RoleNav({ navigation, roleName, user, basePath, statusBadge }: RoleNavProps) { const pathname = usePathname() const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false) const { status: sessionStatus } = useSession() const isAuthenticated = sessionStatus === 'authenticated' const { data: avatarUrl } = trpc.avatar.getUrl.useQuery(undefined, { enabled: isAuthenticated, }) const { theme, setTheme } = useTheme() const [mounted, setMounted] = useState(false) useEffect(() => setMounted(true), []) return (
{/* Logo */}
{statusBadge}
{/* Desktop nav */} {/* User menu & mobile toggle */}
{mounted && ( )} {user.email} Profile Settings signOut({ callbackUrl: '/login' })} className="text-destructive focus:text-destructive" > Sign out
{/* Mobile menu */} {isMobileMenuOpen && (
)}
) }