// 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"; 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); // Click outside to close 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(); } }; // Add listener after a small delay to prevent immediate closing const timeoutId = setTimeout(() => { document.addEventListener("mousedown", handleClickOutside); }, 100); return () => { clearTimeout(timeoutId); document.removeEventListener("mousedown", handleClickOutside); }; }, [isOpen, onClose]); // ESC key to close 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 ( <>
{/* Menu */}
{activeCategory?.children && ( )}
); } interface CategoryListProps { categories: any[]; isLoading: boolean; onCategoryHover: (index: number) => void; onCategoryClick: () => void; } function CategoryList({ categories, isLoading, onCategoryHover, onCategoryClick, }: CategoryListProps) { return (
{isLoading ? [1, 2, 3, 4, 5].map((i) => ( )) : categories.map((category, index) => ( onCategoryHover(index)} className="flex items-center gap-3 px-4 py-3 rounded-lg hover:bg-gray-100 hover:text-primary transition-colors" > {category.icon_class && ( )} {category.name} ))}
); } interface SubcategoryListProps { category: any; onSubcategoryClick: () => void; } function SubcategoryList({ category, onSubcategoryClick, }: SubcategoryListProps) { return (

{category.name}

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