import {Suspense} from 'react'; import {Await, NavLink, useAsyncValue} from 'react-router'; import { type CartViewPayload, useAnalytics, useOptimisticCart, } from '@shopify/hydrogen'; import type {HeaderQuery, CartApiQueryFragment} from 'storefrontapi.generated'; import {useAside} from '~/components/Aside'; interface HeaderProps { header: HeaderQuery; cart: Promise; isLoggedIn: Promise; publicStoreDomain: string; } type Viewport = 'desktop' | 'mobile'; export function Header({ header, isLoggedIn, cart, publicStoreDomain, }: HeaderProps) { const {shop, menu} = header; return (
{shop.name}
); } export function HeaderMenu({ menu, primaryDomainUrl, viewport, publicStoreDomain, }: { menu: HeaderProps['header']['menu']; primaryDomainUrl: HeaderProps['header']['shop']['primaryDomain']['url']; viewport: Viewport; publicStoreDomain: HeaderProps['publicStoreDomain']; }) { const className = `header-menu-${viewport}`; const {close} = useAside(); return ( ); } function HeaderCtas({ isLoggedIn, cart, }: Pick) { return ( ); } function HeaderMenuMobileToggle() { const {open} = useAside(); return ( ); } function SearchToggle() { const {open} = useAside(); return ( ); } function CartBadge({count}: {count: number}) { const {open} = useAside(); const {publish, shop, cart, prevCart} = useAnalytics(); return ( { e.preventDefault(); open('cart'); publish('cart_viewed', { cart, prevCart, shop, url: window.location.href || '', } as CartViewPayload); }} > Cart {count} ); } function CartToggle({cart}: Pick) { return ( }> ); } function CartBanner() { const originalCart = useAsyncValue() as CartApiQueryFragment | null; const cart = useOptimisticCart(originalCart); return ; } const FALLBACK_HEADER_MENU = { id: 'gid://shopify/Menu/199655587896', items: [ { id: 'gid://shopify/MenuItem/461609500728', resourceId: null, tags: [], title: 'Collections', type: 'HTTP', url: '/collections', items: [], }, { id: 'gid://shopify/MenuItem/461609533496', resourceId: null, tags: [], title: 'Blog', type: 'HTTP', url: '/blogs/journal', items: [], }, { id: 'gid://shopify/MenuItem/461609566264', resourceId: null, tags: [], title: 'Policies', type: 'HTTP', url: '/policies', items: [], }, { id: 'gid://shopify/MenuItem/461609599032', resourceId: 'gid://shopify/Page/92591030328', tags: [], title: 'About', type: 'PAGE', url: '/pages/about', items: [], }, ], }; function activeLinkStyle({ isActive, isPending, }: { isActive: boolean; isPending: boolean; }) { return { fontWeight: isActive ? 'bold' : undefined, color: isPending ? 'grey' : 'black', }; }