'use client'; import { Dialog, Transition } from '@headlessui/react'; import { ShoppingCartIcon } from '@heroicons/react/24/outline'; import Price from 'components/price'; import { DEFAULT_OPTION } from 'lib/constants'; import type { Cart, Product } from 'lib/shopify/types'; import { createUrl } from 'lib/utils'; import { useTranslations } from 'next-intl'; import Image from 'next/image'; import Link from 'next/link'; import { Fragment, useEffect, useRef, useState } from 'react'; import AgeConfirmBeforeCheckout from './age-gate-confirm-before-checkout'; import CloseCart from './close-cart'; import DeleteItemButton from './delete-item-button'; import EditItemQuantityButton from './edit-item-quantity-button'; import OpenCart from './open-cart'; type MerchandiseSearchParams = { [key: string]: string; }; export default function CartModal({ cart, promotedItem }: { cart: Cart | undefined; promotedItem?: Product; }) { const t = useTranslations('Index'); const [isOpen, setIsOpen] = useState(false); const quantityRef = useRef(cart?.totalQuantity); const openCart = () => setIsOpen(true); const closeCart = () => setIsOpen(false); useEffect(() => { // Open cart modal when quantity changes. if (cart?.totalQuantity !== quantityRef.current) { // But only if it's not already open (quantity also changes when editing items in cart). if (!isOpen) { setIsOpen(true); } // Always update the quantity reference quantityRef.current = cart?.totalQuantity; } }, [isOpen, cart?.totalQuantity, quantityRef]); return ( <> Cart {!cart || cart.lines.length === 0 ? ( Your cart is empty. ) : ( {cart.lines.map((item, i) => { const merchandiseSearchParams = {} as MerchandiseSearchParams; item.merchandise.selectedOptions.forEach(({ name, value }) => { if (value !== DEFAULT_OPTION) { merchandiseSearchParams[name.toLowerCase()] = value; } }); const merchandiseUrl = createUrl( `/product/${item.merchandise.product.handle}`, new URLSearchParams(merchandiseSearchParams) ); return ( {item.merchandise.product.title} {item.merchandise.title !== DEFAULT_OPTION ? ( {item.merchandise.title} ) : null} {item.quantity} ); })} {/* {!!promotedItem && ( )} */} {/* Taxes */} {/* Shipping Calculated at checkout */} Total {t('cart.proceed')} )} > ); }
Cart
Your cart is empty.
{item.merchandise.title}
{item.quantity}
Taxes
Shipping
Calculated at checkout
Total