import React, { useState, useRef } from 'react'; import { Link } from 'react-router-dom'; import { Hotel, User, LogOut, LogIn, UserPlus, Heart, Phone, Mail, Calendar, Star, Users, AlertCircle, } from 'lucide-react'; import { useClickOutside } from '../hooks/useClickOutside'; import { useCompanySettings } from '../contexts/CompanySettingsContext'; import { useAuthModal } from '../../features/auth/contexts/AuthModalContext'; import { normalizeImageUrl } from '../utils/imageUtils'; import InAppNotificationBell from '../../features/notifications/components/InAppNotificationBell'; import Navbar from './Navbar'; interface HeaderProps { isAuthenticated?: boolean; userInfo?: { name: string; email: string; avatar?: string; role: string; } | null; onLogout?: () => void; } const Header: React.FC = ({ isAuthenticated = false, userInfo = null, onLogout }) => { const { settings } = useCompanySettings(); const { openModal } = useAuthModal(); const displayPhone = settings.company_phone || '+1 (234) 567-890'; const displayEmail = settings.company_email || 'info@luxuryhotel.com'; const logoUrl = settings.company_logo_url ? (settings.company_logo_url.startsWith('http') ? settings.company_logo_url : `${import.meta.env.VITE_API_URL || 'http://localhost:8000'}${settings.company_logo_url}`) : null; const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const [isUserMenuOpen, setIsUserMenuOpen] = useState(false); const userMenuRef = useRef(null); useClickOutside(userMenuRef, () => { if (isUserMenuOpen) { setIsUserMenuOpen(false); } }); const toggleMobileMenu = () => { setIsMobileMenuOpen(!isMobileMenuOpen); }; const toggleUserMenu = () => { setIsUserMenuOpen(!isUserMenuOpen); }; const handleLogout = () => { if (onLogout) { onLogout(); } setIsUserMenuOpen(false); setIsMobileMenuOpen(false); }; // Mobile menu content with user authentication const mobileMenuContent = ( <> {!isAuthenticated ? ( <> ) : ( <>
Hello, {userInfo?.name}
setIsMobileMenuOpen(false) } className="flex items-center space-x-2 px-4 py-3 text-white/90 hover:bg-[#d4af37]/10 hover:text-[#d4af37] rounded-sm transition-all duration-300 border-l-2 border-transparent hover:border-[#d4af37] font-light tracking-wide" > Profile {userInfo?.role !== 'admin' && userInfo?.role !== 'staff' && userInfo?.role !== 'accountant' && userInfo?.role !== 'housekeeping' && ( <> setIsMobileMenuOpen(false) } className="flex items-center space-x-2 px-4 py-3 text-white/90 hover:bg-[#d4af37]/10 hover:text-[#d4af37] rounded-sm transition-all duration-300 border-l-2 border-transparent hover:border-[#d4af37] font-light tracking-wide" > Favorites setIsMobileMenuOpen(false) } className="flex items-center space-x-2 px-4 py-3 text-white/90 hover:bg-[#d4af37]/10 hover:text-[#d4af37] rounded-sm transition-all duration-300 border-l-2 border-transparent hover:border-[#d4af37] font-light tracking-wide" > My Bookings setIsMobileMenuOpen(false) } className="flex items-center space-x-2 px-4 py-3 text-white/90 hover:bg-[#d4af37]/10 hover:text-[#d4af37] rounded-sm transition-all duration-300 border-l-2 border-transparent hover:border-[#d4af37] font-light tracking-wide" > Loyalty Program setIsMobileMenuOpen(false) } className="flex items-center space-x-2 px-4 py-3 text-white/90 hover:bg-[#d4af37]/10 hover:text-[#d4af37] rounded-sm transition-all duration-300 border-l-2 border-transparent hover:border-[#d4af37] font-light tracking-wide" > Group Bookings setIsMobileMenuOpen(false) } className="flex items-center space-x-2 px-4 py-3 text-white/90 hover:bg-[#d4af37]/10 hover:text-[#d4af37] rounded-sm transition-all duration-300 border-l-2 border-transparent hover:border-[#d4af37] font-light tracking-wide" > Complaints )} {userInfo?.role === 'admin' && ( setIsMobileMenuOpen(false) } className="flex items-center space-x-2 px-4 py-3 text-white/90 hover:bg-[#d4af37]/10 hover:text-[#d4af37] rounded-sm transition-all duration-300 border-l-2 border-transparent hover:border-[#d4af37] font-light tracking-wide" > Admin )} {userInfo?.role === 'staff' && ( setIsMobileMenuOpen(false) } className="flex items-center space-x-2 px-4 py-3 text-white/90 hover:bg-[#d4af37]/10 hover:text-[#d4af37] rounded-sm transition-all duration-300 border-l-2 border-transparent hover:border-[#d4af37] font-light tracking-wide" > Staff Dashboard )} {userInfo?.role === 'accountant' && ( setIsMobileMenuOpen(false) } className="flex items-center space-x-2 px-4 py-3 text-white/90 hover:bg-[#d4af37]/10 hover:text-[#d4af37] rounded-sm transition-all duration-300 border-l-2 border-transparent hover:border-[#d4af37] font-light tracking-wide" > Accountant Dashboard )}
)} ); return (
{displayPhone && ( {displayPhone} )} {displayEmail && ( {displayEmail} )}
{logoUrl ? (
{settings.company_name}
) : (
)}
{settings.company_name} {settings.company_tagline || 'Excellence Redefined'}
setIsMobileMenuOpen(false)} mobileMenuContent={mobileMenuContent} />
{!isAuthenticated ? ( <> ) : (
{isAuthenticated && }
{isUserMenuOpen && (
setIsUserMenuOpen(false)} className="flex items-center space-x-3 px-4 py-2.5 text-white/90 hover:bg-[#d4af37]/10 hover:text-[#d4af37] transition-all duration-300 border-l-2 border-transparent hover:border-[#d4af37]" > Profile {userInfo?.role !== 'admin' && userInfo?.role !== 'staff' && userInfo?.role !== 'accountant' && userInfo?.role !== 'housekeeping' && ( <> setIsUserMenuOpen(false)} className="flex items-center space-x-3 px-4 py-2.5 text-white/90 hover:bg-[#d4af37]/10 hover:text-[#d4af37] transition-all duration-300 border-l-2 border-transparent hover:border-[#d4af37]" > Favorites setIsUserMenuOpen(false)} className="flex items-center space-x-3 px-4 py-2.5 text-white/90 hover:bg-[#d4af37]/10 hover:text-[#d4af37] transition-all duration-300 border-l-2 border-transparent hover:border-[#d4af37]" > My Bookings setIsUserMenuOpen(false)} className="flex items-center space-x-3 px-4 py-2.5 text-white/90 hover:bg-[#d4af37]/10 hover:text-[#d4af37] transition-all duration-300 border-l-2 border-transparent hover:border-[#d4af37]" > Loyalty Program setIsUserMenuOpen(false)} className="flex items-center space-x-3 px-4 py-2.5 text-white/90 hover:bg-[#d4af37]/10 hover:text-[#d4af37] transition-all duration-300 border-l-2 border-transparent hover:border-[#d4af37]" > Group Bookings setIsUserMenuOpen(false)} className="flex items-center space-x-3 px-4 py-2.5 text-white/90 hover:bg-[#d4af37]/10 hover:text-[#d4af37] transition-all duration-300 border-l-2 border-transparent hover:border-[#d4af37]" > Complaints )} {userInfo?.role === 'admin' && ( setIsUserMenuOpen(false) } className="flex items-center space-x-3 px-4 py-2.5 text-white/90 hover:bg-[#d4af37]/10 hover:text-[#d4af37] transition-all duration-300 border-l-2 border-transparent hover:border-[#d4af37]" > Admin )} {userInfo?.role === 'staff' && ( setIsUserMenuOpen(false) } className="flex items-center space-x-3 px-4 py-2.5 text-white/90 hover:bg-[#d4af37]/10 hover:text-[#d4af37] transition-all duration-300 border-l-2 border-transparent hover:border-[#d4af37]" > Staff Dashboard )} {userInfo?.role === 'accountant' && ( setIsUserMenuOpen(false) } className="flex items-center space-x-3 px-4 py-2.5 text-white/90 hover:bg-[#d4af37]/10 hover:text-[#d4af37] transition-all duration-300 border-l-2 border-transparent hover:border-[#d4af37]" > Accountant Dashboard )}
)}
)}
); }; export default Header;