'use client'; import React, { useState, useEffect, useRef } from 'react'; import Link from 'next/link'; import { usePathname } from 'next/navigation'; interface SiteHeaderProps { signedIn: boolean; role: string; } export function SiteHeaderClient({ signedIn, role }: SiteHeaderProps) { const pathname = usePathname(); const [mobileMenuOpen, setMobileMenuOpen] = useState(false); const [userMenuOpen, setUserMenuOpen] = useState(false); const userMenuRef = useRef(null); useEffect(() => { setMobileMenuOpen(false); setUserMenuOpen(false); }, [pathname]); useEffect(() => { function handleClickOutside(event: MouseEvent) { if (userMenuRef.current && !userMenuRef.current.contains(event.target as Node)) { setUserMenuOpen(false); } } function handleKeyDown(event: KeyboardEvent) { if (event.key === 'Escape') { setUserMenuOpen(false); } } if (userMenuOpen) { document.addEventListener('mousedown', handleClickOutside); document.addEventListener('keydown', handleKeyDown); } return () => { document.removeEventListener('mousedown', handleClickOutside); document.removeEventListener('keydown', handleKeyDown); }; }, [userMenuOpen]); const isClubManageInterior = pathname !== '/clubs/manage' && Boolean(pathname?.startsWith('/clubs/') && pathname?.includes('/manage')); if (isClubManageInterior || pathname?.startsWith('/admin') || pathname?.startsWith('/ops')) return null; const isAdmin = role === 'admin' || role === 'operator' || role === 'owner'; const navItems = [ { label: 'Live Cockpit', href: '/' }, { label: 'Features', href: '/features' }, { label: 'Group Rides', href: '/group-rides' }, { label: 'Clubs', href: '/clubs' }, { label: 'Pricing', href: '/pricing' }, { label: 'Hardware & App', href: '/pricing#hardware' }, ]; return (
{/* Left: Brand + Navigation */}
show_chart
MotorSignal Pro Telemetry
{/* Right: Telemetry Grid pill + Auth actions + Mobile Hamburger */}
{/* Telemetry Grid: Online Badge */}
Telemetry Grid: Online
{signedIn ? (
groups Group Rides
{userMenuOpen && (
Rider Account {isAdmin ? 'Staff / Administrator' : 'Telemetry Connected'}
setUserMenuOpen(false)} role="menuitem" className="flex items-center gap-3 px-3 py-2.5 rounded-xl text-on-surface hover:text-primary-container hover:bg-surface-container transition-colors text-xs font-semibold" > person Rider Account setUserMenuOpen(false)} role="menuitem" className="flex items-center gap-3 px-3 py-2.5 rounded-xl text-on-surface hover:text-primary-container hover:bg-surface-container transition-colors text-xs font-semibold" > groups Group Rides setUserMenuOpen(false)} role="menuitem" className="flex items-center gap-3 px-3 py-2.5 rounded-xl text-on-surface hover:text-secondary hover:bg-surface-container transition-colors text-xs font-semibold" > shield Founder Portal {isAdmin && ( setUserMenuOpen(false)} role="menuitem" className="flex items-center gap-3 px-3 py-2.5 rounded-xl text-on-surface hover:text-primary-container hover:bg-surface-container transition-colors text-xs font-semibold" > admin_panel_settings Operations Admin )}
)}
) : (
Sign In Get Started Free Get Started person
)} {/* Mobile Menu Hamburger Button */}
{/* Mobile Menu Drawer */} {mobileMenuOpen && (
{signedIn ? (
Rider Account & Management setMobileMenuOpen(false)} className="px-space-md py-2.5 rounded-xl font-label-md text-label-md transition-colors min-h-[44px] flex items-center gap-2 text-on-surface hover:bg-surface-container" > person Rider Account setMobileMenuOpen(false)} className="px-space-md py-2.5 rounded-xl font-label-md text-label-md transition-colors min-h-[44px] flex items-center gap-2 text-on-surface hover:bg-surface-container" > groups Group Rides setMobileMenuOpen(false)} className="px-space-md py-2.5 rounded-xl font-label-md text-label-md transition-colors min-h-[44px] flex items-center gap-2 text-on-surface hover:bg-surface-container" > shield Founder Portal {isAdmin && ( setMobileMenuOpen(false)} className="px-space-md py-2.5 rounded-xl font-label-md text-label-md transition-colors min-h-[44px] flex items-center gap-2 text-primary-container bg-surface-container hover:bg-surface-container-high border border-outline-variant/30" > admin_panel_settings Operations Admin )}
) : (
Telemetry Grid: Online
setMobileMenuOpen(false)} className="text-primary font-label-md text-label-md hover:underline py-1.5 px-2" > Sign In →
)}
)}
); }