Samantha Kellow 08b3b820e4 Squashed commit of the following:
commit b10e930476d8bbe82f679f3ae8ed44cea733898f
Merge: a2c34aa 8531476
Author: Sammii <sammii.h@icloud.com>
Date:   Wed Apr 24 20:05:09 2024 +0100

    Merge pull request #1 from Sammii-HK/feat/restyle-store

    Feat/restyle store

commit 85314765721447f5612cb59b7e668653606e7b7b
Author: Samantha Kellow <sammii.h@icloud.com>
Date:   Wed Apr 24 20:03:12 2024 +0100

    responsive design app page carousel

commit d5563a7355c2581c29ebf3f11799e1047c0c29dd
Author: Samantha Kellow <sammii.h@icloud.com>
Date:   Wed Apr 24 19:57:47 2024 +0100

    updating mobile carousel tile size

commit 9976d0d427ea92dab510bface5da9a4e89feabee
Author: Samantha Kellow <sammii.h@icloud.com>
Date:   Wed Apr 24 19:30:07 2024 +0100

    updating combox import

commit f6a365df8239d26d5feb37cf53d43632ab7c90c4
Author: Samantha Kellow <sammii.h@icloud.com>
Date:   Wed Apr 24 19:16:08 2024 +0100

    styling label price

commit cf89e3b0648bb07ed038f872183bd7ecea064df0
Author: Samantha Kellow <sammii.h@icloud.com>
Date:   Wed Apr 24 19:08:16 2024 +0100

    styling accordians and drop downs

commit 49f3776ba8894d5fd2aa6b2fea0632f73d6ae093
Author: Samantha Kellow <sammii.h@icloud.com>
Date:   Wed Apr 24 18:53:14 2024 +0100

    updating search and carousel styling

commit 7666a25f918a1b53a088dd9240077af5b9013712
Author: Samantha Kellow <sammii.h@icloud.com>
Date:   Wed Apr 24 18:37:29 2024 +0100

    styling product description

commit b8280101ad367abfe48aed4fee8ef32ed1fd5d67
Author: Samantha Kellow <sammii.h@icloud.com>
Date:   Wed Apr 24 18:18:11 2024 +0100

    removing `-full` from all rounded elements

commit 77480edd79327898aa2c417d34d231db1d593736
Author: Samantha Kellow <sammii.h@icloud.com>
Date:   Wed Apr 24 18:15:27 2024 +0100

    styling cart component

commit 3ec0c4d5679b20c66442e5002225cbefe927a13e
Author: Samantha Kellow <sammii.h@icloud.com>
Date:   Wed Apr 24 18:06:53 2024 +0100

    updating styling

commit efcab218934934edea629406b823fd2b2ac3d193
Author: Samantha Kellow <sammii.h@icloud.com>
Date:   Wed Apr 24 18:06:43 2024 +0100

    updating carousel for correct types

commit b14934af8489a6294f1c47a3a41d40d0a7565550
Author: Samantha Kellow <sammii.h@icloud.com>
Date:   Wed Apr 24 17:57:31 2024 +0100

    styling tile

commit 0c72e76bad994317d5e39faedfc4aade9a368fe7
Author: Samantha Kellow <sammii.h@icloud.com>
Date:   Wed Apr 24 17:56:50 2024 +0100

    styling label

commit ca24a30543ddfbdd345ac405b14e0541a9af1020
Author: Samantha Kellow <sammii.h@icloud.com>
Date:   Wed Apr 24 17:54:54 2024 +0100

    update main app layout for dark view

commit 57c1c4cac9a15c2091f652f53f7bb85a6a5b613a
Author: Samantha Kellow <sammii.h@icloud.com>
Date:   Wed Apr 24 17:52:53 2024 +0100

    commenting out weight li on description content

commit d2f0ac2041b04117e24db0316b470646489aca07
Author: Samantha Kellow <sammii.h@icloud.com>
Date:   Wed Apr 24 17:52:02 2024 +0100

    updating carousel to new style

commit 545717006d7f25f36e71b67873d01316aeeafcf9
Author: Samantha Kellow <sammii.h@icloud.com>
Date:   Wed Apr 24 17:50:55 2024 +0100

    updating getAllLiveProducts to handle no param

commit 0bf97ecdf69b4f7a4aa00c090e09e613fa1aba8a
Author: Samantha Kellow <sammii.h@icloud.com>
Date:   Wed Apr 24 17:50:39 2024 +0100

    styling and adjusting footer & navbar

commit 18200b4e848affe01ca9014bdf8ac841ce176114
Author: Samantha Kellow <sammii.h@icloud.com>
Date:   Wed Apr 24 17:50:00 2024 +0100

    updating cart to bag

commit 82c30cdda8d38b3111b539a34127155bb82612d5
Author: Samantha Kellow <sammii.h@icloud.com>
Date:   Wed Apr 24 17:48:32 2024 +0100

    SKUs page file check

commit e88a45b9d51096b3250062708d5ef1a49138258c
Author: Samantha Kellow <sammii.h@icloud.com>
Date:   Wed Apr 24 17:47:30 2024 +0100

    updatibng Prose import path

commit 5e81519f983e58758d865b2905f279f34afb67a4
Author: Samantha Kellow <sammii.h@icloud.com>
Date:   Wed Apr 24 17:45:58 2024 +0100

    updating app page metadata

commit 9c9a5c035b245d8811a601ba2dd134c5c5f124d7
Author: Samantha Kellow <sammii.h@icloud.com>
Date:   Tue Apr 23 21:25:05 2024 +0100

    making borders muted

commit 8a40e08e41a7fdad172e5ffaebb7f791ec66f4e5
Author: Samantha Kellow <sammii.h@icloud.com>
Date:   Tue Apr 23 20:37:35 2024 +0100

    moving ui components to own folder 🧹
2024-04-25 14:58:44 +01:00

192 lines
9.0 KiB
TypeScript

'use client';
import { Dialog, Transition } from '@headlessui/react';
import { ShoppingBagIcon } from '@heroicons/react/24/outline';
import Price from 'components/ui/price';
import { DEFAULT_OPTION } from 'lib/constants';
import type { Cart } from 'lib/shopify/types';
import { createUrl } from 'lib/utils';
import Image from 'next/image';
import Link from 'next/link';
import { Fragment, useEffect, useRef, useState } from 'react';
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 }: { cart: Cart | undefined }) {
const [isOpen, setIsOpen] = useState(false);
const quantityRef = useRef(cart?.totalQuantity);
const openCart = () => setIsOpen(true);
const closeCart = () => setIsOpen(false);
useEffect(() => {
// Open cart modal when 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 (
<>
<button aria-label="Open cart" onClick={openCart}>
<OpenCart quantity={cart?.totalQuantity} />
</button>
<Transition show={isOpen}>
<Dialog onClose={closeCart} className="relative z-50">
<Transition.Child
as={Fragment}
enter="transition-all ease-in-out duration-300"
enterFrom="opacity-0 backdrop-blur-none"
enterTo="opacity-100 backdrop-blur-[.5px]"
leave="transition-all ease-in-out duration-200"
leaveFrom="opacity-100 backdrop-blur-[.5px]"
leaveTo="opacity-0 backdrop-blur-none"
>
<div className="fixed inset-0 bg-black/30" aria-hidden="true" />
</Transition.Child>
<Transition.Child
as={Fragment}
enter="transition-all ease-in-out duration-300"
enterFrom="translate-x-full"
enterTo="translate-x-0"
leave="transition-all ease-in-out duration-200"
leaveFrom="translate-x-0"
leaveTo="translate-x-full"
>
<Dialog.Panel className="fixed bottom-0 right-0 top-0 flex h-full w-full flex-col border-l border-neutral-200 bg-neutral-111/80 p-6 text-neutral-10 backdrop-blur-xl dark:border-neutral-700 dark:bg-black/80 dark:text-white md:w-[390px]">
<div className="flex items-center justify-between">
<p className="text-lg font-semibold">Your Bag</p>
<button aria-label="Close cart" onClick={closeCart}>
<CloseCart />
</button>
</div>
{!cart || cart.lines.length === 0 ? (
<div className="mt-20 flex w-full flex-col items-center justify-center overflow-hidden">
<ShoppingBagIcon className="h-16" />
<p className="mt-6 text-center text-2xl font-bold">Your bag is empty. 😔</p>
</div>
) : (
<div className="flex h-full flex-col justify-between overflow-hidden p-1">
<ul className="flex-grow overflow-auto py-4">
{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(
`/products/${item.merchandise.product.handle}`,
new URLSearchParams(merchandiseSearchParams)
);
return (
<li
key={i}
className="flex w-full flex-col border-b border-neutral-300 dark:border-neutral-700"
>
<div className="relative flex w-full flex-row justify-between px-1 py-4">
<div className="absolute z-40 -mt-2 ml-[55px]">
<DeleteItemButton item={item} />
</div>
<Link
href={merchandiseUrl}
onClick={closeCart}
className="z-30 flex flex-row space-x-4"
>
<div className="relative h-16 w-16 cursor-pointer overflow-hidden rounded-md border border-neutral-300 bg-neutral-300 dark:border-neutral-700 dark:bg-neutral-900 dark:hover:bg-neutral-800">
<Image
className="h-full w-full object-cover "
width={64}
height={64}
alt={
item.merchandise.product.featuredImage.altText ||
item.merchandise.product.title
}
src={item.merchandise.product.featuredImage.url}
/>
</div>
<div className="flex flex-1 flex-col text-base">
<span className="leading-tight">
{item.merchandise.product.title}
</span>
{item.merchandise.title !== DEFAULT_OPTION ? (
<p className="text-md text-neutral-400 dark:text-neutral-400">
{item.merchandise.title}
</p>
) : null}
</div>
</Link>
<div className="flex h-16 flex-col justify-between">
<Price
className="flex justify-end space-y-2 text-right text-sm"
amount={item.cost.totalAmount.amount}
currencyCode={item.cost.totalAmount.currencyCode}
/>
<div className="ml-auto flex h-9 flex-row items-center rounded border border-neutral-200 dark:border-neutral-700">
<EditItemQuantityButton item={item} type="minus" />
<p className="w-6 text-center ">
<span className="w-full text-sm">{item.quantity}</span>
</p>
<EditItemQuantityButton item={item} type="plus" />
</div>
</div>
</div>
</li>
);
})}
</ul>
<div className="py-4 text-sm text-neutral-500 dark:text-neutral-400">
<div className="mb-3 flex items-center justify-between border-b border-neutral-200 pb-1 dark:border-neutral-700">
{/* <p>Taxes</p>
<Price
className="text-right text-base text-black dark:text-white"
amount={cart.cost.totalTaxAmount.amount}
currencyCode={cart.cost.totalTaxAmount.currencyCode}
/> */}
</div>
<div className="mb-3 flex items-center justify-between border-b border-neutral-200 pb-1 pt-1 dark:border-neutral-700">
<p>Shipping</p>
<p className="text-right">Calculated at checkout</p>
</div>
<div className="mb-3 flex items-center justify-between border-b border-neutral-200 pb-1 pt-1 dark:border-neutral-700">
<p>Total</p>
<Price
className="text-right text-base text-neutral-200 dark:text-white"
amount={cart.cost.totalAmount.amount}
currencyCode={cart.cost.totalAmount.currencyCode}
/>
</div>
</div>
<a
href={cart.checkoutUrl}
className="block w-full rounded bg-neutral-600 p-3 text-center text-sm font-medium text-white opacity-90 hover:opacity-100"
>
Proceed to Checkout
</a>
</div>
)}
</Dialog.Panel>
</Transition.Child>
</Dialog>
</Transition>
</>
);
}