// AppHeader — sticky navigation with quick nav, user dropdown const { useState: useHeaderState, useEffect: useHeaderEffect, useRef: useHeaderRef } = React; function Avatar({ name, size = 30 }) { const initials = (name || '?').split(' ').map(w => w[0]).join('').slice(0, 2).toUpperCase(); return (
{initials}
); } function NavLink({ label, active, onClick, icon }) { return ( ); } function scrollToSection(id) { const el = document.getElementById(id); if (el) el.scrollIntoView({ behavior: 'smooth', block: 'start' }); } function AppHeader({ route, user, balance, brandName, theme, adminMode, onToggleTheme, onToggleAdminMode, onNavigate, onLogout }) { const [menuOpen, setMenuOpen] = useHeaderState(false); const [userDropOpen, setUserDropOpen] = useHeaderState(false); const dropRef = useHeaderRef(null); const isApp = !['landing', 'login', 'register', 'login-tg', 'auth'].includes(route); const isLanding = route === 'landing'; // Close dropdown on outside click useHeaderEffect(() => { const handler = (e) => { if (dropRef.current && !dropRef.current.contains(e.target)) setUserDropOpen(false); }; document.addEventListener('mousedown', handler); return () => document.removeEventListener('mousedown', handler); }, []); // Close mobile menu on route change useHeaderEffect(() => { setMenuOpen(false); setUserDropOpen(false); }, [route]); const navItems = [ { label: 'Кабинет', route: 'cabinet', icon: '🏠' }, { label: 'Заказы', route: 'orders', icon: '📋' }, ]; return (
{/* Logo */}
onNavigate(user ? 'cabinet' : 'landing')} >
PB
{brandName}
{/* Desktop center nav — app only */} {isApp && user && ( )} {/* Landing nav links — desktop */} {isLanding && ( )}
{/* Right actions */}
{/* Admin-mode toggle (only for admins) */} {isApp && user && user.is_admin && ( )} {/* Notifications bell (regular user view only) */} {isApp && user && !adminMode && } {/* Balance badge */} {isApp && user && (
{balance.toLocaleString('ru-RU')} ₽
)} {/* Theme toggle — sun/moon pill switch */} {/* Auth buttons — landing desktop */} {!isApp && !user && ( <> )} {/* User dropdown — desktop, app */} {isApp && user && (
{userDropOpen && (
{/* User info header */}
{user.first_name}
@{user.user_name || 'user'}
Баланс {balance.toLocaleString('ru-RU')} ₽
{/* Nav items */} {[ { icon: '🏠', label: 'Кабинет', action: () => onNavigate('cabinet') }, { icon: '📋', label: 'Мои заказы', action: () => onNavigate('orders') }, { icon: '👤', label: 'Профиль', action: () => onNavigate('profile') }, ].map((item, i) => ( ))}
)}
)} {/* Mobile hamburger */} {(isApp && user) && (
{menuOpen && (
{/* User + balance */}
{user.first_name}
@{user.user_name || 'user'}
{balance.toLocaleString('ru-RU')} ₽
{[ { label: 'Кабинет', route: 'cabinet' }, { label: 'Мои заказы', route: 'orders' }, { label: 'Профиль', route: 'profile' }, { label: 'Заказать ПФ', route: 'order-pf' }, ].map(item => ( ))}
)}
)}
); } Object.assign(window, { AppHeader });