website-v4 / src /components /Navbar.tsx
embedingHF's picture
Upload folder using huggingface_hub
a667b81 verified
Raw
History Blame Contribute Delete
9.3 kB
import { useState, useEffect } from "react";
import { Phone, MessageSquare, Menu, X, Sun, Moon, Sparkles, FolderLock } from "lucide-react";
import { BUSINESS_INFO } from "../data";
import Logo from "./Logo";
interface NavbarProps {
darkMode: boolean;
setDarkMode: (val: boolean) => void;
currentPage: string;
setCurrentPage: (page: string) => void;
isAuthorizedAdmin: boolean;
}
export default function Navbar({ darkMode, setDarkMode, currentPage, setCurrentPage, isAuthorizedAdmin }: NavbarProps) {
const [isOpen, setIsOpen] = useState(false);
const [scrolled, setScrolled] = useState(false);
useEffect(() => {
const handleScroll = () => {
setScrolled(window.scrollY > 20);
};
window.addEventListener("scroll", handleScroll);
return () => window.removeEventListener("scroll", handleScroll);
}, []);
const baseNavItems = [
{ label: "Home", page: "home" },
{ label: "Catalogue", page: "catalogue" },
{ label: "Reviews Feed", page: "reviews" },
{ label: "Showroom", page: "showroom" },
{ label: "Inventory Manager", page: "admin", isIconic: true }
];
const navItems = isAuthorizedAdmin
? baseNavItems
: baseNavItems.filter(item => item.page !== "admin");
return (
<nav
className={`sticky top-0 left-0 w-full z-50 transition-all duration-300 ${
scrolled || currentPage !== "home"
? darkMode
? "bg-[#121214]/95 backdrop-blur-md border-b border-white/10 py-3 shadow-lg shadow-black/20"
: "bg-white/95 backdrop-blur-md border-b border-black/5 py-3 shadow-sm"
: "bg-transparent py-5"
}`}
>
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="flex items-center justify-between">
{/* Logo Brand */}
<button
onClick={() => { setCurrentPage("home"); window.scrollTo({ top: 0, behavior: "smooth" }); }}
className="flex items-center group transition-all transform hover:scale-[1.02] active:scale-95 text-left"
id="navbar-logo-btn"
>
<Logo variant="full" darkMode={darkMode} className="h-10 sm:h-12 w-auto" />
</button>
{/* Desktop Navigation Links (Responsive breakpoint updated to lg to prevent overlapping on tablets) */}
<div className="hidden lg:flex items-center space-x-1 xl:space-x-2">
{navItems.map((item) => {
const isActive = currentPage === item.page;
return (
<button
key={item.page}
onClick={() => { setCurrentPage(item.page); window.scrollTo({ top: 0, behavior: "smooth" }); }}
className={`px-3 py-2 rounded-lg text-xs xl:text-sm font-medium transition-all relative flex items-center space-x-1 ${
isActive
? "text-brand-orange font-bold bg-brand-orange/5"
: darkMode
? "text-slate-300 hover:text-white hover:bg-white/5"
: "text-slate-600 hover:text-slate-900 hover:bg-black/5"
}`}
>
{item.isIconic && <FolderLock className="w-3.5 h-3.5 mr-1 text-brand-orange inline" />}
<span>{item.label}</span>
{isActive && (
<span className="absolute bottom-0 left-2 right-2 h-[2px] bg-brand-orange rounded-full" />
)}
</button>
);
})}
</div>
{/* Right Action panel for Desktop */}
<div className="hidden lg:flex items-center space-x-3">
{/* Theme Toggle Button */}
<button
onClick={() => setDarkMode(!darkMode)}
className={`p-2 rounded-xl transition-all ${
darkMode
? "bg-white/5 hover:bg-white/10 text-amber-400"
: "bg-black/5 hover:bg-black/10 text-slate-800"
}`}
title={darkMode ? "Switch to Light Mode" : "Switch to Dark Mode"}
id="theme-toggle-desktop"
>
{darkMode ? <Sun className="w-5 h-5" /> : <Moon className="w-5 h-5" />}
</button>
{/* Emergency Hotline Button */}
<a
href={`tel:${BUSINESS_INFO.phoneRaw}`}
className="flex items-center space-x-1.5 bg-gradient-to-r from-brand-orange to-red-600 text-white px-3.5 py-2 rounded-xl text-xs font-semibold shadow-md shadow-brand-orange/20 hover:shadow-brand-orange/40 hover:-translate-y-0.5 transition-all"
>
<Phone className="w-3.5 h-3.5" />
<span>24/7 Helpline</span>
</a>
</div>
{/* Mobile Right Controls (Menu & Theme) */}
<div className="flex lg:hidden items-center space-x-2">
<button
onClick={() => setDarkMode(!darkMode)}
className={`p-1.5 rounded-lg transition-all ${
darkMode ? "bg-white/5 text-amber-400" : "bg-black/5 text-slate-800"
}`}
id="theme-toggle-mobile"
>
{darkMode ? <Sun className="w-4.5 h-4.5" /> : <Moon className="w-4.5 h-4.5" />}
</button>
<button
onClick={() => setIsOpen(!isOpen)}
className={`p-1.5 rounded-lg transition-all ${
darkMode ? "bg-white/5 text-white" : "bg-black/5 text-slate-800"
}`}
aria-label="Toggle navigation menu"
id="mobile-menu-btn"
>
{isOpen ? <X className="w-5.5 h-5.5" /> : <Menu className="w-5.5 h-5.5" />}
</button>
</div>
</div>
</div>
{/* Mobile Drawer Overlay */}
{isOpen && (
<div className="lg:hidden fixed inset-0 top-[60px] z-45 bg-black/60 backdrop-blur-sm">
<div
className={`w-4/5 max-w-sm h-[calc(100vh-60px)] p-6 shadow-2xl flex flex-col justify-between transition-transform duration-300 ${
darkMode ? "bg-[#1c1c24] text-white" : "bg-white text-slate-900"
}`}
>
<div className="space-y-4">
<span className={`text-[10px] font-mono tracking-widest block pb-2 border-b uppercase ${
darkMode ? "text-slate-400 border-white/5" : "text-slate-500 border-black/5"
}`}>
Browse Showroom Sections
</span>
<div className="flex flex-col space-y-1">
{navItems.map((item) => {
const isActive = currentPage === item.page;
return (
<button
key={item.page}
onClick={() => {
setCurrentPage(item.page);
setIsOpen(false);
window.scrollTo({ top: 0, behavior: "smooth" });
}}
className={`px-4 py-3 rounded-xl text-sm font-medium transition-all flex items-center justify-between text-left w-full ${
isActive
? "bg-brand-orange/10 text-brand-orange font-bold"
: darkMode
? "hover:bg-white/5 text-slate-300"
: "hover:bg-slate-100 text-slate-700"
}`}
>
<span className="flex items-center">
{item.isIconic && <FolderLock className="w-4 h-4 mr-2 text-brand-orange" />}
{item.label}
</span>
{isActive && <span className="w-2 h-2 rounded-full bg-brand-orange" />}
</button>
);
})}
</div>
</div>
<div className="space-y-4 pt-6 border-t border-black/5 dark:border-white/5">
<div className="flex items-center space-x-2 text-xs font-mono text-slate-500 dark:text-slate-400">
<Sparkles className="w-4 h-4 text-brand-orange animate-pulse" />
<span>OPEN 24 HOURS IN FAISAL TOWN</span>
</div>
<a
href={`tel:${BUSINESS_INFO.phoneRaw}`}
className="flex items-center justify-center space-x-2 w-full bg-gradient-to-r from-brand-orange to-red-600 text-white py-2.5 rounded-xl text-xs font-semibold shadow-md shadow-brand-orange/30 text-center"
>
<Phone className="w-4 h-4" />
<span>Call Emergency Service</span>
</a>
<a
href={`${BUSINESS_INFO.whatsappUrl}?text=Hello%20Haider%20Brothers,%20I%20have%20an%20emergency%20tyre%20request`}
target="_blank"
rel="noreferrer referrer"
className="flex items-center justify-center space-x-2 w-full border border-green-500/35 text-green-500 bg-green-500/5 py-2.5 rounded-xl text-xs font-medium"
>
<MessageSquare className="w-4 h-4" />
<span>WhatsApp Live Chat</span>
</a>
</div>
</div>
</div>
)}
</nav>
);
}