diff --git a/components/cart/actions.ts b/components/cart/actions.ts index ea39c38a4..fa2c34d37 100644 --- a/components/cart/actions.ts +++ b/components/cart/actions.ts @@ -5,7 +5,7 @@ import { addToCart, createCart, getCart, removeFromCart, updateCart } from 'lib/ import { revalidateTag } from 'next/cache'; import { cookies } from 'next/headers'; -export async function addItem(prevState: any, selectedVariantId: string) { +export async function addItem(prevState: any, selectedVariantId: string | undefined) { let cartId = cookies().get('cartId')?.value; let cart; diff --git a/components/cart/add-to-cart.tsx b/components/cart/add-to-cart.tsx index 87cb54787..f116a4e49 100644 --- a/components/cart/add-to-cart.tsx +++ b/components/cart/add-to-cart.tsx @@ -6,6 +6,7 @@ import { addItem } from 'components/cart/actions'; import LoadingDots from 'components/loading-dots'; import { ProductVariant } from 'lib/shopify/types'; import { useSearchParams } from 'next/navigation'; +import { useState } from 'react'; import { // @ts-ignore experimental_useFormState as useFormState, @@ -14,12 +15,15 @@ import { function SubmitButton({ availableForSale, - selectedVariantId + selectedVariantId, + submitting }: { availableForSale: boolean; selectedVariantId: string | undefined; + submitting: boolean; }) { - const { pending } = useFormStatus(); + let { pending } = useFormStatus(); + pending = pending || submitting; const buttonClasses = 'relative flex w-full items-center justify-center rounded-full bg-blue-600 p-4 tracking-wide text-white'; const disabledClasses = 'cursor-not-allowed opacity-60 hover:opacity-60'; @@ -72,6 +76,7 @@ export function AddToCart({ variants: ProductVariant[]; availableForSale: boolean; }) { + const [submitting, setSubmitting] = useState(false); const [message, formAction] = useFormState(addItem, null); const searchParams = useSearchParams(); const defaultVariantId = variants.length === 1 ? variants[0]?.id : undefined; @@ -84,8 +89,22 @@ export function AddToCart({ const actionWithVariant = formAction.bind(null, selectedVariantId); return ( -
- + { + e.preventDefault(); + if (submitting) return; + setSubmitting(true); + await addItem(message, selectedVariantId); + setSubmitting(false); + }} + > +

{message}

diff --git a/components/cart/delete-item-button.tsx b/components/cart/delete-item-button.tsx index 378e85caa..a4a2bfd5f 100644 --- a/components/cart/delete-item-button.tsx +++ b/components/cart/delete-item-button.tsx @@ -5,14 +5,16 @@ import clsx from 'clsx'; import { removeItem } from 'components/cart/actions'; import LoadingDots from 'components/loading-dots'; import type { CartItem } from 'lib/shopify/types'; +import { useState } from 'react'; import { // @ts-ignore experimental_useFormState as useFormState, experimental_useFormStatus as useFormStatus } from 'react-dom'; -function SubmitButton() { - const { pending } = useFormStatus(); +function SubmitButton({ submitting }: { submitting: boolean }) { + let { pending } = useFormStatus(); + pending = pending || submitting; return (