'use client'; import { useAuth } from '@/lib/auth/AuthContext'; import { AnimatePresence, motion, useReducedMotion } from 'framer-motion'; import { BarChart3, Building2, ChevronDown, CreditCard, Handshake, LogOut, Megaphone, Paintbrush, Settings, TrendingUp, Trophy } from 'lucide-react'; import Link from 'next/link'; import { useEffect, useMemo, useState } from 'react'; import DriverSummaryPill from '@/components/profile/DriverSummaryPill'; import { useEffectiveDriverId } from '@/hooks/useEffectiveDriverId'; import type { DriverViewModel } from '@/lib/view-models/DriverViewModel'; import { DriverViewModel as DriverViewModelClass } from '@/lib/view-models/DriverViewModel'; import { useServices } from '@/lib/services/ServiceProvider'; // Hook to detect sponsor mode function useSponsorMode(): boolean { const [isSponsor, setIsSponsor] = useState(false); useEffect(() => { const cookie = document.cookie .split('; ') .find(row => row.startsWith('gridpilot_demo_mode=')); if (cookie) { const value = cookie.split('=')[1]; setIsSponsor(value === 'sponsor'); } }, []); return isSponsor; } // Sponsor Pill Component - matches the style of DriverSummaryPill function SponsorSummaryPill({ onClick, companyName = 'Acme Racing Co.', activeSponsors = 7, impressions = 127, }: { onClick: () => void; companyName?: string; activeSponsors?: number; impressions?: number; }) { const shouldReduceMotion = useReducedMotion(); return ( {/* Avatar/Logo */} {/* Active indicator */} {/* Info */} {companyName.split(' ')[0]} {activeSponsors} • {impressions}k {/* Chevron */} ); } export default function UserPill() { const { session } = useAuth(); const { driverService, mediaService } = useServices(); const [driver, setDriver] = useState(null); const [isMenuOpen, setIsMenuOpen] = useState(false); const isSponsorMode = useSponsorMode(); const shouldReduceMotion = useReducedMotion(); const primaryDriverId = useEffectiveDriverId(); useEffect(() => { let cancelled = false; async function loadDriver() { if (!primaryDriverId) { if (!cancelled) { setDriver(null); } return; } const dto = await driverService.findById(primaryDriverId); if (!cancelled) { setDriver(dto ? new DriverViewModelClass(dto) : null); } } void loadDriver(); return () => { cancelled = true; }; }, [primaryDriverId, driverService]); const data = useMemo(() => { if (!session?.user || !primaryDriverId || !driver) { return null; } // Driver rating + rank are not exposed by the current API contract for the lightweight // driver DTO used in the header. Keep it null until the API provides it. const rating: number | null = null; const rank: number | null = null; const avatarSrc = mediaService.getDriverAvatar(primaryDriverId); return { driver, avatarSrc, rating, rank, }; }, [session, driver, primaryDriverId, mediaService]); // 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]); // Sponsor mode UI if (isSponsorMode) { return ( setIsMenuOpen((open) => !open)} /> {isMenuOpen && ( {/* Header */} Acme Racing Co. Sponsor Account {/* Quick stats */} 7 active 127k views {/* Menu Items */} setIsMenuOpen(false)} > Dashboard setIsMenuOpen(false)} > My Sponsorships setIsMenuOpen(false)} > Billing setIsMenuOpen(false)} > Settings {/* Footer */} { document.cookie = 'gridpilot_demo_mode=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT'; window.location.reload(); }} className="flex w-full items-center justify-between px-4 py-3 text-sm text-gray-500 hover:text-racing-red hover:bg-racing-red/5 transition-colors" > Exit Sponsor Mode )} ); } if (!session) { return ( Sign In Get Started ); } if (!data) { return null; } return ( setIsMenuOpen((open) => !open)} /> {isMenuOpen && ( setIsMenuOpen(false)} > Profile setIsMenuOpen(false)} > Manage leagues setIsMenuOpen(false)} > Liveries setIsMenuOpen(false)} > Sponsorship Requests setIsMenuOpen(false)} > Settings Logout )} ); }
Acme Racing Co.
Sponsor Account