"use client"; import clsx from "clsx"; import { useDisclosure } from "@heroui/use-disclosure"; import { AnimatePresence, motion } from "framer-motion"; import { ShoppingCartIcon } from "@heroicons/react/24/outline"; import { DEFAULT_OPTION } from "@/utils/constants"; import OpenCart from "./OpenCart"; import { Price } from "../theme/ui/Price"; import CloseCart from "../common/icons/cart/CloseCart"; import { DeleteItemButton } from "../common/icons/cart/DeleteItemButton"; import { EditItemQuantityButton } from "../common/icons/cart/EditItemQuantityButton"; import { useCartDetail } from "@utils/hooks/useCartDetail"; import Image from "next/image"; import { NOT_IMAGE } from "@utils/constants"; import LoadingDots from "@components/common/icons/LoadingDots"; import { useFormStatus } from "react-dom"; import { redirectToCheckout } from "@/utils/actions"; import Link from "next/link"; import { createUrl, safeParse } from "@utils/helper"; import { useBodyScrollLock } from "@utils/hooks/useBodyScrollLock"; type MerchandiseSearchParams = { [key: string]: string; }; export default function CartModal({ children, className, onOpen, onClose, isOpen, }: { children?: React.ReactNode; className?: string; onOpen?: () => void; onClose?: () => void; isOpen?: boolean; }) { const { isOpen: internalIsOpen, onOpen: internalOnOpen, onClose: internalOnClose, } = useDisclosure(); const isControlled = isOpen !== undefined; const finalIsOpen = isControlled ? isOpen : internalIsOpen; const finalOnOpen = isControlled ? onOpen : internalOnOpen; const finalOnClose = isControlled ? onClose : internalOnClose; const { isLoading, cartData: cartDetail } = useCartDetail(); // const cartDetail = useAppSelector((state) => state.cartDetail); const cart = Array.isArray(cartDetail?.items?.edges) ? cartDetail?.items?.edges : []; useBodyScrollLock(finalIsOpen); // const handleOpenChange = (open: boolean) => { // if (!open) { // finalOnClose?.(); // } // }; return ( <> {children ? ( children ) : ( )} {finalIsOpen && ( <> My Cart {cart?.length === 0 ? ( Your cart is empty. ) : ( {Array.isArray(cart) && cart?.map((item: any, i: number) => { const merchandiseSearchParams = {} as MerchandiseSearchParams; const merchandiseUrl = createUrl( `/product/${item?.node.productUrlKey}`, new URLSearchParams(merchandiseSearchParams), ); const baseImage: any = safeParse( item?.node?.baseImage, ); return ( (e.currentTarget.src = NOT_IMAGE) } /> {item?.node?.name} {item.name !== DEFAULT_OPTION && ( {item?.node?.sku} )} {item?.node?.quantity} ); })} {(cartDetail as any)?.taxAmount > 0 && ( Taxes )} Total )} > )} > ); } function CheckoutButton() { const { pending } = useFormStatus(); return ( <> {pending ? : "Proceed to Checkout"} > ); }
My Cart
Your cart is empty.
{item?.node?.sku}
{item?.node?.quantity}
Taxes
Total