'use client' import { useSession } from 'next-auth/react' import { useRouter } from 'next/navigation' import { useState } from 'react' import { trpc } from '@/lib/trpc/client' import { Button } from '@/components/ui/button' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' import { ChevronDown, LogOut, UserCog } from 'lucide-react' import type { UserRole } from '@prisma/client' const ROLE_LABELS: Record = { JURY_MEMBER: 'Jury Member', APPLICANT: 'Applicant', MENTOR: 'Mentor', OBSERVER: 'Observer', AWARD_MASTER: 'Award Master', PROGRAM_ADMIN: 'Program Admin', SUPER_ADMIN: 'Super Admin', } const ROLE_LANDING: Record = { JURY_MEMBER: '/jury', APPLICANT: '/applicant', MENTOR: '/mentor', OBSERVER: '/observer', AWARD_MASTER: '/admin', PROGRAM_ADMIN: '/admin', SUPER_ADMIN: '/admin', } export function ImpersonationBanner() { const { data: session, update } = useSession() const router = useRouter() const [switching, setSwitching] = useState(false) // Only fetch test users when impersonating (realRole check happens server-side) const { data: testEnv } = trpc.testEnvironment.status.useQuery(undefined, { enabled: !!session?.user?.isImpersonating, staleTime: 60_000, }) if (!session?.user?.isImpersonating) return null const currentRole = session.user.role const currentName = session.user.impersonatedName || session.user.name || 'Unknown' // Group available test users by role (exclude currently impersonated user) const availableUsers = testEnv?.active ? testEnv.users.filter((u) => u.id !== session.user.id) : [] const roleGroups = availableUsers.reduce( (acc, u) => { const role = u.role as string if (!acc[role]) acc[role] = [] acc[role].push(u) return acc }, {} as Record ) async function handleSwitch(userId: string, role: UserRole) { setSwitching(true) await update({ impersonateUserId: userId }) router.push((ROLE_LANDING[role] || '/admin') as any) router.refresh() setSwitching(false) } async function handleStopImpersonation() { setSwitching(true) await update({ stopImpersonation: true }) router.push('/admin/settings' as any) router.refresh() setSwitching(false) } return (
Viewing as {currentName}{' '} {ROLE_LABELS[currentRole] || currentRole}
{/* Quick-switch dropdown */} {Object.entries(roleGroups).map(([role, users]) => (
{ROLE_LABELS[role] || role} {users.map((u) => ( handleSwitch(u.id, u.role as UserRole)} disabled={switching} > {u.name || u.email} ))}
))}
{/* Return to admin */}
) }