"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" // 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 } // 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 } case 'TOGGLE_WHO_WE_SERVE': return { ...state, isWhoWeServeOpen: !state.isWhoWeServeOpen } case 'TOGGLE_VENDING_MACHINES': return { ...state, isVendingMachinesOpen: !state.isVendingMachinesOpen } case 'TOGGLE_FOOD_BEVERAGE': return { ...state, isFoodBeverageOpen: !state.isFoodBeverageOpen } case 'TOGGLE_SERVICES': return { ...state, isServicesOpen: !state.isServicesOpen } case 'TOGGLE_BLOG_POSTS': return { ...state, isBlogPostsOpen: !state.isBlogPostsOpen } case 'TOGGLE_ABOUT': return { ...state, 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: "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" }, ] 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 })} />
) }