// CategoryMenu.tsx "use client"; import { useState, useEffect, useRef } from "react"; import Link from "next/link"; import { useCategories } from "@/lib/hooks"; import { Skeleton } from "@/components/ui/skeleton"; import { ChevronRight } from "lucide-react"; interface CategoryMenuProps { isOpen: boolean; onClose: () => void; } export default function CategoryMenu({ isOpen, onClose }: CategoryMenuProps) { const [hoveredCategory, setHoveredCategory] = useState(null); const { data: categories, isLoading } = useCategories(); const menuRef = useRef(null); useEffect(() => { if (!isOpen) return; const handleClickOutside = (event: MouseEvent) => { const target = event.target as HTMLElement; if (target.closest("[data-catalog-trigger]")) { return; } if (menuRef.current && !menuRef.current.contains(target)) { onClose(); } }; const timeoutId = setTimeout(() => { document.addEventListener("mousedown", handleClickOutside); }, 100); return () => { clearTimeout(timeoutId); document.removeEventListener("mousedown", handleClickOutside); }; }, [isOpen, onClose]); useEffect(() => { if (!isOpen) return; const handleEscape = (event: KeyboardEvent) => { if (event.key === "Escape") { onClose(); } }; document.addEventListener("keydown", handleEscape); return () => document.removeEventListener("keydown", handleEscape); }, [isOpen, onClose]); if (!isOpen) return null; const categoryList = categories || []; const activeCategory = hoveredCategory !== null ? categoryList[hoveredCategory] : null; return ( <> {/* Overlay */}
{/* Menu */}
{activeCategory?.children && ( )}
); } interface CategoryListProps { categories: any[]; isLoading: boolean; onCategoryHover: (index: number) => void; onCategoryClick: () => void; hoveredIndex: number | null; } function CategoryList({ categories, isLoading, onCategoryHover, onCategoryClick, hoveredIndex, }: CategoryListProps) { return (
{isLoading ? Array.from({ length: 8 }).map((_, i) => (
)) : categories.map((category, index) => ( onCategoryHover(index)} className={`flex items-center justify-between gap-3 mx-2 px-4 py-3.5 rounded-lg transition-all duration-200 group ${ hoveredIndex === index ? "bg-gray-900 text-white shadow-md" : "hover:bg-gray-100 text-gray-900" }`} >
{category.icon_class && ( )} {category.name}
{category.children && category.children.length > 0 && ( )} ))}
); } interface SubcategoryListProps { category: any; onSubcategoryClick: () => void; } function SubcategoryList({ category, onSubcategoryClick, }: SubcategoryListProps) { return (

{category.name}

{category.children?.map((subCategory: any) => ( {subCategory.name} ))}
); }