'use client'; import React, { useState } from 'react'; import Link from 'next/link'; import { useCartStore } from '@/hooks/use-shopify-cart'; import CartDrawer from '@/components/shopify/cart-drawer'; import SearchDialog from '@/components/shopify/search-dialog'; import AccountMenu from '@/components/shopify/account-menu'; import ShopMenu from '@/components/shopify/shop-menu'; import { RiShoppingBagLine, RiCloseLine, RiMenu3Line } from '@remixicon/react'; import { Button } from '@/components/ui/button'; import Logo from '@/components/logo'; const CartIcon: React.FC = () => { const toggleCart = useCartStore((s) => s.toggleCart); const cart = useCartStore((s) => s.cart); const itemCount = cart?.lines?.edges?.reduce((sum, { node }) => sum + node.quantity, 0) ?? 0; return ( ); }; export interface NavLink { label: string; url: string; } interface HeaderProps { storeName?: string; logoUrl?: string; links?: NavLink[]; /** Thin bar above the nav. Blank copy hides it. */ announcement?: React.ReactNode; announcementUrl?: string; /** Hides the bar outright, whatever the copy says. */ showAnnouncement?: 'yes' | 'no'; } const Header: React.FC = ({ storeName = 'Logo', logoUrl, links = [ { label: 'Shop', url: '/' }, { label: 'Collections', url: '/collections' }, ], announcement = 'Free shipping on orders over $100', announcementUrl, showAnnouncement = 'yes', }) => { const [menuOpen, setMenuOpen] = useState(false); // Whitespace-only copy counts as empty. While the field is edited inline the // editor supplies a node rather than a string — it can't be inspected for // emptiness, which is what the explicit toggle is for. const hasAnnouncementText = typeof announcement === 'string' ? announcement.trim() !== '' : Boolean(announcement); const showAnnouncementBar = showAnnouncement !== 'no' && hasAnnouncementText; return ( <> {/* Sits above the sticky nav, so it scrolls away on its own. */} {showAnnouncementBar && (
{announcementUrl ? ( {announcement} ) : ( {announcement} )}
)} ); }; export default Header;