"use client" import { useReducer } from "react" import Link from "next/link" import Image from "next/image" import { Button } from "@/components/ui/button" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu" import { Menu, X, Phone, ChevronDown } from "lucide-react" import { GetFreeMachineModal } from "@/components/get-free-machine-modal" import { Cart } from "@/components/cart" import { CartButton } from "@/components/cart-button" import { MobileCartButton } from "@/components/mobile-cart-button" import { cn } from "@/lib/utils" // Header state types following Vercel React Best Practices type HeaderState = { isMenuOpen: boolean isWhoWeServeOpen: boolean isVendingMachinesOpen: boolean isFoodBeverageOpen: boolean isServicesOpen: boolean isBlogPostsOpen: boolean isAboutOpen: boolean isModalOpen: boolean isCartOpen: boolean } type HeaderAction = | { type: "TOGGLE_MENU" } | { type: "TOGGLE_WHO_WE_SERVE" } | { type: "TOGGLE_VENDING_MACHINES" } | { type: "TOGGLE_FOOD_BEVERAGE" } | { type: "TOGGLE_SERVICES" } | { type: "TOGGLE_BLOG_POSTS" } | { type: "TOGGLE_ABOUT" } | { type: "SET_MODAL"; value: boolean } | { type: "SET_CART"; value: boolean } const closedGroups = { isWhoWeServeOpen: false, isVendingMachinesOpen: false, isFoodBeverageOpen: false, isServicesOpen: false, isBlogPostsOpen: false, isAboutOpen: false, } // Reducer for header state - consolidates related mobile menu states function headerReducer(state: HeaderState, action: HeaderAction): HeaderState { switch (action.type) { case "TOGGLE_MENU": return state.isMenuOpen ? { ...state, isMenuOpen: false, ...closedGroups } : { ...state, isMenuOpen: true, ...closedGroups } case "TOGGLE_WHO_WE_SERVE": return { ...state, ...closedGroups, isWhoWeServeOpen: !state.isWhoWeServeOpen, } case "TOGGLE_VENDING_MACHINES": return { ...state, ...closedGroups, isVendingMachinesOpen: !state.isVendingMachinesOpen, } case "TOGGLE_FOOD_BEVERAGE": return { ...state, ...closedGroups, isFoodBeverageOpen: !state.isFoodBeverageOpen, } case "TOGGLE_SERVICES": return { ...state, ...closedGroups, isServicesOpen: !state.isServicesOpen, } case "TOGGLE_BLOG_POSTS": return { ...state, ...closedGroups, isBlogPostsOpen: !state.isBlogPostsOpen, } case "TOGGLE_ABOUT": return { ...state, ...closedGroups, isAboutOpen: !state.isAboutOpen, } case "SET_MODAL": return { ...state, isModalOpen: action.value } case "SET_CART": return { ...state, isCartOpen: action.value } default: return state } } export function Header() { const [state, dispatch] = useReducer(headerReducer, { isMenuOpen: false, isWhoWeServeOpen: false, isVendingMachinesOpen: false, isFoodBeverageOpen: false, isServicesOpen: false, isBlogPostsOpen: false, isAboutOpen: false, isModalOpen: false, isCartOpen: false, }) const whoWeServeItems = [ { label: "Warehouses", href: "/warehouses" }, { label: "Auto Repair", href: "/auto-repair" }, { label: "Gyms", href: "/gyms" }, { label: "Community Centers", href: "/community-centers" }, { label: "Dance Studios", href: "/dance-studios" }, { label: "Car Washes", href: "/car-washes" }, ] const vendingMachinesItems = [ { label: "Machines We Use", href: "/vending-machines/machines-we-use" }, { label: "Machines for Sale in Utah", href: "/vending-machines/machines-for-sale", }, { label: "Vending Machine Manuals", href: "/manuals" }, ] const foodBeverageItems = [ { label: "Healthy Options", href: "/food-and-beverage/healthy-options" }, { label: "Traditional Options", href: "/food-and-beverage/traditional-options", }, { label: "Food & Beverage Suppliers", href: "/food-and-beverage/suppliers", }, ] const servicesItems = [ { label: "All Services", href: "/services" }, { label: "Vending Machine Repairs", href: "/services/repairs" }, { label: "Vending Machine Moving Services", href: "/services/moving" }, { label: "Vending Machine Parts", href: "/services/parts" }, { label: "Vending Machine Manuals", href: "/manuals" }, ] const blogPostsItems = [ { label: "Seaga HY900 Support", href: "/seaga-hy900-support" }, ] const aboutItems = [ { label: "About Us", href: "/about-us" }, { label: "Reviews", href: "/reviews" }, { label: "FAQs", href: "/about/faqs" }, ] const desktopLinkClassName = "rounded-full px-3 py-2 text-sm font-medium text-foreground transition hover:text-primary focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-primary/15" const mobileLinkClassName = "flex min-h-11 items-center rounded-[1rem] px-4 text-sm font-medium text-foreground transition hover:bg-primary/6 hover:text-primary focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-primary/15" const mobileGroupButtonClassName = "flex min-h-11 items-center justify-between rounded-[1rem] px-4 text-sm font-medium text-foreground transition hover:bg-primary/6 hover:text-primary focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-primary/15" const desktopDropdownClassName = "rounded-[1.25rem] border border-border/60 bg-[linear-gradient(180deg,rgba(255,255,255,0.98),rgba(255,251,243,0.96))] p-2 shadow-[0_22px_55px_rgba(15,23,42,0.12)]" return (
{/* Logo */} Rocky Mountain Vending {/* Desktop Navigation */} {/* Desktop CTA */}
dispatch({ type: "SET_CART", value: true })} /> (435) 233-9668
{/* Mobile Menu Button */}
{/* Mobile Navigation */} {state.isMenuOpen && ( )}
dispatch({ type: "SET_MODAL", value })} /> dispatch({ type: "SET_CART", value: false })} />
) }