import { cn } from "@/app/utils/functions"; import { usePathname, useRouter } from "next/navigation"; import { useEffect, useState } from "react"; import { ChevronDownIcon } from "@/app/utils/svgs/chevronDownIcon"; import PrimaryButton from "@/app/components/reuseableUI/primaryButton"; type MenuItem = { id: string; name: string; url: string; level: number; metadata?: Array<{ key: string; value: string; }>; children?: MenuItem[]; }; const NAV_LINKS = [ { name: "Home", href: "/" }, { name: "Products", href: "/products/all" }, ]; const HamMenuSlide = ({ isHamMenuOpen, setIsHamMenuOpen, menuItems = [], }: { isHamMenuOpen: boolean; setIsHamMenuOpen: (v: boolean) => void; menuItems?: MenuItem[]; }) => { const route = useRouter(); const [expandedItems, setExpandedItems] = useState>(new Set()); const pathName = usePathname(); const toggleExpanded = (itemId: string) => { setExpandedItems((prev) => { const newSet = new Set(prev); if (newSet.has(itemId)) { newSet.delete(itemId); } else { newSet.add(itemId); } return newSet; }); }; const getTargetFromMetadata = ( metadata?: Array<{ key: string; value: string }> ) => { const targetMetadata = metadata?.find((meta) => meta.key === "target"); return targetMetadata?.value === "_blank" ? "_blank" : "_self"; }; const handleNavigation = ( url: string, metadata?: Array<{ key: string; value: string }> ) => { setIsHamMenuOpen(false); const target = getTargetFromMetadata(metadata); if (target === "_blank") { window.open(url, "_blank", "noopener,noreferrer"); } else { route.push(url); } }; useEffect(() => { // Prevent extension interference by validating the state const validatedState = Boolean(isHamMenuOpen); if (validatedState) { document.body.style.overflow = "hidden"; } else { document.body.style.overflow = "auto"; } // Cleanup function to restore scroll on unmount return () => { document.body.style.overflow = "auto"; }; }, [isHamMenuOpen]); return (
{NAV_LINKS.map((link) => (
handleNavigation(link.href)} className={`block pb-4 hover:text-[var(--color-primary-500)] transition-all duration-300 ease-in-out cursor-pointer ${ link.href === pathName ? "text-[var(--color-primary-500)]" : "" }`} > {link.name}
))} {menuItems.map((item) => (
{item.children && item.children.length > 0 ? ( <>
toggleExpanded(item.id)} > {item.name} {ChevronDownIcon}
{expandedItems.has(item.id) && (
{item.children.map((child) => (
handleNavigation(child.url, child.metadata) } className="block py-3 pl-4 hover:text-[var(--color-primary-500)] transition-all duration-300 ease-in-out cursor-pointer text-sm" > {child.name}
))}
)} ) : (
handleNavigation(item.url, item.metadata)} className={`block pb-4 hover:text-[var(--color-primary-500)] transition-all duration-300 ease-in-out cursor-pointer ${ (pathName === "/contact" && item.name === "Contact") || (pathName === "/frequently-asked-questions" && item.name === "FAQ") ? "text-[var(--color-primary-500)]" : "" }`} > {item.name}
)}
))} {/* Find A Dealer Button */}
handleNavigation("/locator")} />
); }; export default HamMenuSlide;