'use client'; import React, { useEffect, useMemo, useState } from 'react'; import { AnimatePresence, motion } from 'framer-motion'; import { BarChart3, ChevronDown, CreditCard, Handshake, LogOut, Megaphone, Paintbrush, Settings, Shield } from 'lucide-react'; import { useAuth } from '@/lib/auth/AuthContext'; import { useEffectiveDriverId } from '@/hooks/useEffectiveDriverId'; import { DriverViewModel as DriverViewModelClass } from '@/lib/view-models/DriverViewModel'; import { useFindDriverById } from '@/hooks/driver/useFindDriverById'; import { routes } from '@/lib/routing/RouteConfig'; import { Box } from '@/ui/Box'; import { Text } from '@/ui/Text'; import { Icon } from '@/ui/Icon'; import { Link } from '@/ui/Link'; import { Image } from '@/ui/Image'; // Hook to detect demo user mode based on session function useDemoUserMode(): { isDemo: boolean; demoRole: string | null } { const { session } = useAuth(); const [demoMode, setDemoMode] = useState({ isDemo: false, demoRole: null as string | null }); // Check if this is a demo user useEffect(() => { if (!session?.user) { setDemoMode({ isDemo: false, demoRole: null }); return; } const email = session.user.email?.toLowerCase() || ''; const displayName = session.user.displayName?.toLowerCase() || ''; const primaryDriverId = session.user.primaryDriverId || ''; const role = 'role' in session.user ? (session.user as { role?: string }).role : undefined; // Check if this is a demo user if (email.includes('demo') || displayName.includes('demo') || primaryDriverId.startsWith('demo-')) { // Use role from session if available, otherwise derive from email let roleToUse = role; if (!roleToUse) { if (email.includes('sponsor')) roleToUse = 'sponsor'; else if (email.includes('league-owner') || displayName.includes('owner')) roleToUse = 'league-owner'; else if (email.includes('league-steward') || displayName.includes('steward')) roleToUse = 'league-steward'; else if (email.includes('league-admin') || displayName.includes('admin')) roleToUse = 'league-admin'; else if (email.includes('system-owner') || displayName.includes('system owner')) roleToUse = 'system-owner'; else if (email.includes('super-admin') || displayName.includes('super admin')) roleToUse = 'super-admin'; else roleToUse = 'driver'; } setDemoMode({ isDemo: true, demoRole: roleToUse }); } else { setDemoMode({ isDemo: false, demoRole: null }); } }, [session]); return demoMode; } // Helper to check if user has admin access (Owner or Super Admin) function useHasAdminAccess(): boolean { const { session } = useAuth(); const { isDemo, demoRole } = useDemoUserMode(); // Demo users with system-owner or super-admin roles if (isDemo && (demoRole === 'system-owner' || demoRole === 'super-admin')) { return true; } // Real users - would need role information from session // For now, we'll check if the user has any admin-related capabilities // This can be enhanced when the API includes role information if (!session?.user) return false; // Check for admin-related email patterns as a temporary measure const email = session.user.email?.toLowerCase() || ''; const displayName = session.user.displayName?.toLowerCase() || ''; return email.includes('system-owner') || email.includes('super-admin') || displayName.includes('system owner') || displayName.includes('super admin'); } export function UserPill() { const { session } = useAuth(); const [isMenuOpen, setIsMenuOpen] = useState(false); const { isDemo, demoRole } = useDemoUserMode(); const primaryDriverId = useEffectiveDriverId(); // Use React-Query hook for driver data (only for non-demo users) const { data: driverDto } = useFindDriverById(primaryDriverId || '', { enabled: !!primaryDriverId && !isDemo, }); // Transform DTO to ViewModel const driver = useMemo(() => { if (!driverDto) return null; return new DriverViewModelClass({ ...driverDto, avatarUrl: driverDto.avatarUrl ?? null }); }, [driverDto]); // Close menu when clicking outside useEffect(() => { const handleClickOutside = (e: MouseEvent) => { if (isMenuOpen) { const target = e.target as HTMLElement; if (!target.closest('[data-user-pill]')) { setIsMenuOpen(false); } } }; document.addEventListener('click', handleClickOutside); return () => document.removeEventListener('click', handleClickOutside); }, [isMenuOpen]); // Logout handler for demo users const handleLogout = async () => { try { // Call the logout API await fetch('/api/auth/logout', { method: 'POST' }); // Redirect to home window.location.href = '/'; } catch (error) { console.error('Logout failed:', error); window.location.href = '/'; } }; // Call hooks unconditionally before any returns const hasAdminAccess = useHasAdminAccess(); // Handle unauthenticated users if (!session) { return ( Sign In Get Started ); } // For all authenticated users (demo or regular), show the user pill // Determine what to show in the pill const displayName = driver?.name || session.user.displayName || session.user.email || 'User'; const avatarUrl = session.user.avatarUrl; const roleLabel = isDemo ? ({ 'driver': 'Driver', 'sponsor': 'Sponsor', 'league-owner': 'League Owner', 'league-steward': 'League Steward', 'league-admin': 'League Admin', 'system-owner': 'System Owner', 'super-admin': 'Super Admin', } as Record)[demoRole || 'driver'] : null; const roleColor = isDemo ? ({ 'driver': 'text-primary-blue', 'sponsor': 'text-performance-green', 'league-owner': 'text-purple-400', 'league-steward': 'text-warning-amber', 'league-admin': 'text-red-400', 'system-owner': 'text-indigo-400', 'super-admin': 'text-pink-400', } as Record)[demoRole || 'driver'] : null; return ( setIsMenuOpen((open) => !open)} display="flex" alignItems="center" gap={3} rounded="full" border px={3} py={1.5} transition cursor="pointer" bg="linear-gradient(to r, var(--iron-gray), var(--deep-graphite))" borderColor={isMenuOpen ? 'border-primary-blue/50' : 'border-charcoal-outline'} transform={isMenuOpen ? 'scale(1.02)' : 'scale(1)'} > {/* Avatar */} {avatarUrl ? ( {displayName} ) : ( {displayName[0]?.toUpperCase() || 'U'} )} {/* Info */} {displayName} {roleLabel && ( {roleLabel} )} {/* Chevron */} {isMenuOpen && ( {/* Header */} {avatarUrl ? ( {displayName} ) : ( {displayName[0]?.toUpperCase() || 'U'} )} {displayName} {roleLabel && ( {roleLabel} )} {isDemo && ( Demo Account )} {isDemo && ( Development account - not for production use )} {/* Menu Items */} {/* Admin link for Owner/Super Admin users */} {hasAdminAccess && ( setIsMenuOpen(false)} > Admin Area )} {/* Sponsor portal link for demo sponsor users */} {isDemo && demoRole === 'sponsor' && ( <> setIsMenuOpen(false)} > Dashboard setIsMenuOpen(false)} > My Sponsorships setIsMenuOpen(false)} > Billing setIsMenuOpen(false)} > Settings )} {/* Regular user profile links */} setIsMenuOpen(false)} > Profile setIsMenuOpen(false)} > Manage leagues setIsMenuOpen(false)} > Liveries setIsMenuOpen(false)} > Sponsorship Requests setIsMenuOpen(false)} > Settings {/* Demo-specific info */} {isDemo && ( Demo users have limited profile access )} {/* Footer */} {isDemo ? ( Logout ) : ( Logout )} )} ); }