"use client"; import { useState, useEffect } from "react"; import Navbar from "@/components/Navbar"; import CartProduct from "@/components/CartProduct"; import { MENU_CATEGORIES, MOCK_PRODUCTS } from "@/lib/constants"; /** * Main page — sidebar + product grid layout. * * Layout: * [Sidebar (sticky, collapsible)] | [Main content (scrollable)] * * Sidebar state: * - Desktop (≥ 1024px): expanded by default * - Mobile (< 1024px): collapsed by default * * Product grid columns (responsive, depends on sidebar state): * Collapsed sidebar: 2 → sm:2 → lg:3 → xl:4 → 2xl:5 * Expanded sidebar: 1 → sm:2 → lg:2 → xl:3 → 2xl:4 */ export default function Home() { const [isSidebarOpen, setIsSidebarOpen] = useState(false); const [activeCategory, setActiveCategory] = useState("all"); const [searchQuery, setSearchQuery] = useState(""); /* Default: expanded on desktop, collapsed on mobile */ useEffect(() => { const mq = window.matchMedia("(min-width: 1024px)"); setIsSidebarOpen(mq.matches); const handler = (e: MediaQueryListEvent) => setIsSidebarOpen(e.matches); mq.addEventListener("change", handler); return () => mq.removeEventListener("change", handler); }, []); /* Filter products by active category + search query */ const filteredProducts = MOCK_PRODUCTS.filter((p) => { const matchesCategory = activeCategory === "all" || p.category === activeCategory; const matchesSearch = searchQuery.trim() === "" || p.name.toLowerCase().includes(searchQuery.toLowerCase()) || p.description.toLowerCase().includes(searchQuery.toLowerCase()); return matchesCategory && matchesSearch; }); /* Active category label */ const activeCategoryLabel = MENU_CATEGORIES.find((c) => c.id === activeCategory)?.name ?? "Tất cả"; /* Responsive grid class based on sidebar state * Base (< 480px) : 1 col — very small phones * min-[480px] : 2 cols — larger phones * lg+ : 2/3 cols depending on sidebar */ const gridCols = isSidebarOpen ? "grid-cols-1 min-[480px]:grid-cols-2 lg:grid-cols-2 xl:grid-cols-3 2xl:grid-cols-4" : "grid-cols-1 min-[480px]:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-5"; return ( /* Outer wrapper: flex row, align-items: flex-start so sidebar sticks */
{/* ── Sidebar ── */} setIsSidebarOpen((prev) => !prev)} activeCategory={activeCategory} onCategoryChange={(id) => { setActiveCategory(id); setSearchQuery(""); // clear search when switching category }} /> {/* ── Main content ── */}
{/* ── Section heading + search bar ── */}
{/* Title + count */}

{activeCategoryLabel}

{filteredProducts.length} món

{/* Search input */}
setSearchQuery(e.target.value)} placeholder="Tìm kiếm món..." className="w-full pl-9 pr-9 py-2 text-sm rounded-xl border outline-none bg-[var(--color-bg-card)] text-[var(--color-text-primary)] border-[var(--color-border)] placeholder:text-[var(--color-text-muted)] focus:border-[var(--color-primary)] focus:ring-2 focus:ring-[var(--color-primary)] focus:ring-opacity-20 transition-all duration-150" /> {/* Clear button */} {searchQuery && ( )}
{/* ── Product grid ── */} {filteredProducts.length > 0 ? (
{filteredProducts.map((product) => ( { /* TODO: add to cart logic */ console.log("Thêm vào giỏ:", product.name); }} /> ))}
) : ( /* Empty state */

{searchQuery ? `Không tìm thấy món nào cho "${searchQuery}"` : "Chưa có món trong danh mục này"}

{searchQuery && ( )}
)}
); }