import { Link, NavLink, useNavigate } from 'react-router-dom' import { useState, useEffect } from 'react' import type { Category } from '../types' import { ShoppingBag, MapPin, Menu as MenuIcon, X } from 'lucide-react' import { useCartStore } from '../store/cartStore' import { useAuthStore } from '../store/authStore' import { logoutLiff, loginLiff } from '../lib/liff' import { useTranslation } from 'react-i18next' interface NavbarProps { categories?: Category[] } export default function Navbar({ categories = [] }: NavbarProps) { const [searchOpen, setSearchOpen] = useState(false) const [mobileOpen, setMobileOpen] = useState(false) const [searchQuery, setSearchQuery] = useState('') const [scrolled, setScrolled] = useState(false) const [localOrdersCount, setLocalOrdersCount] = useState(0) const navigate = useNavigate() const { toggleCart, getCartCount } = useCartStore() const cartCount = getCartCount() const { customer } = useAuthStore() const { t, i18n } = useTranslation() const toggleLanguage = () => { const newLang = i18n.language.startsWith('en') ? 'th' : 'en' i18n.changeLanguage(newLang) localStorage.setItem('homaroma_lang', newLang) } // Detect scroll for navbar bg change useEffect(() => { const onScroll = () => setScrolled(window.scrollY > 20) window.addEventListener('scroll', onScroll, { passive: true }) // Check local orders periodically (or just on mount) const stored = localStorage.getItem('homaroma_local_orders') if (stored) { try { setLocalOrdersCount(JSON.parse(stored).length) } catch (e) {} } return () => window.removeEventListener('scroll', onScroll) }, []) // Close mobile menu on route change useEffect(() => { setMobileOpen(false) }, [navigate]) // Prevent body scroll when overlays open useEffect(() => { document.body.style.overflow = (searchOpen || mobileOpen) ? 'hidden' : '' return () => { document.body.style.overflow = '' } }, [searchOpen, mobileOpen]) const handleSearch = (e: React.FormEvent) => { e.preventDefault() if (searchQuery.trim()) { navigate(`/search?q=${encodeURIComponent(searchQuery.trim())}`) setSearchOpen(false) setMobileOpen(false) setSearchQuery('') } } const navLinkClass = ({ isActive }: { isActive: boolean }) => isActive ? 'text-spa-forest font-semibold' : 'text-spa-stone hover:text-spa-forest transition-colors' return ( <> {/* ── NAVBAR BAR ── */} {/* ── MOBILE DRAWER ── */}
{/* Backdrop */}
setMobileOpen(false)} /> {/* Drawer */}
{/* Drawer Header */}
{t('nav.menu')}
{customer && ( )}
{/* Drawer Nav Links */}
{[ { to: '/', label: t('nav.home'), end: true }, { to: '/shop', label: t('nav.shop') }, { to: '/coupons', label: `🔥 ${t('nav.promotions') || 'Promotions'}` }, { to: '/scent-guide', label: `✨ ${t('nav.scentGuide')}` }, { to: '/about', label: t('nav.about') }, { to: '/faq', label: t('nav.faq') }, { to: '/contact', label: t('nav.contact') }, ].map(item => ( setMobileOpen(false)} className={({ isActive }) => `block px-4 py-3 rounded-xl text-sm font-medium tracking-wide transition-all duration-200 ${ isActive ? 'bg-spa-forest text-white' : 'text-spa-stone hover:bg-spa-sage hover:text-spa-forest' }` } > {item.label} ))} {/* Collections sub-section */} {categories.length > 0 && (

{t('nav.collections')}

{categories.map(cat => ( setMobileOpen(false)} className="flex items-center justify-between px-4 py-2.5 rounded-xl text-sm text-spa-stone hover:text-spa-forest hover:bg-spa-sage transition-all" > {cat.name} ))}
)}
{/* Drawer Footer CTA */}
setMobileOpen(false)} className="block w-full py-3 bg-spa-forest text-white font-bold text-center rounded-xl text-xs uppercase tracking-widest hover:bg-spa-stone transition-colors duration-300" > {t('nav.shopNow')} setMobileOpen(false)} className="block w-full py-3 text-center rounded-xl text-xs font-bold uppercase tracking-widest hover:bg-spa-sage transition-colors border-2 border-spa-forest text-spa-forest" > {t('nav.findMyScent')} {customer ? ( ) : ( )}
{/* ── SEARCH OVERLAY ── */} {searchOpen && (
{ if (e.target === e.currentTarget) setSearchOpen(false) }} >

{t('nav.search.title')}

setSearchQuery(e.target.value)} placeholder="ค้นหากลิ่น, หมวดหมู่..." className="bg-transparent border-none outline-none text-lg md:text-xl p-4 pl-0 w-full text-spa-forest placeholder-spa-stone/40" autoFocus />

Quick Links

{[ ...categories.map(c => ({ label: c.name, to: `/category/${c.id}` })), { label: '✨ Scent Guide', to: '/scent-guide' }, { label: 'All Products', to: '/shop' }, ].map(item => ( setSearchOpen(false)} className="px-4 py-1.5 rounded-full text-xs font-medium text-spa-stone hover:bg-spa-forest hover:text-white transition-all border border-spa-stone/20 bg-white" > {item.label} ))}
)} ) }