mirror of
https://github.com/vercel/commerce.git
synced 2025-04-30 14:57:50 +00:00
commit 408d6eb7583470eb84fd0e85895f97dad864b981 Author: Alex <alex.hawley@vercel.com> Date: Wed Sep 4 21:28:45 2024 -0500 added content commit af62089872de543c8f741c3092f431a8b790feec Author: Alex <alex.hawley@vercel.com> Date: Wed Sep 4 20:43:02 2024 -0500 fixed product recommendations commit 5c921be7b1eab4ea3b4acc922d2bde842bb0c5c8 Author: Alex <alex.hawley@vercel.com> Date: Wed Sep 4 20:33:28 2024 -0500 fixed cart total commit 63e150e822ab0b4f7690221ee5d1eafaaf5f930a Author: Alex <alex.hawley@vercel.com> Date: Wed Sep 4 20:14:47 2024 -0500 fixed update cart commit 85bd6bee403e19c7b3f66c0d6e938a8432cee62b Author: Alex <alex.hawley@vercel.com> Date: Wed Sep 4 19:00:42 2024 -0500 remove unnecessary cookie usage from sfcc calls commit 2401bed81143508993fdd403d9d5a419ac8904e5 Author: Alex <alex.hawley@vercel.com> Date: Wed Sep 4 18:55:39 2024 -0500 fixed issue with broken getCart commit f8cc8c3c3c1c64d7cf4b69a60ed87497ad626e65 Author: Alex <alex.hawley@vercel.com> Date: Wed Sep 4 18:23:03 2024 -0500 updated lib/sfcc for guest tokens commit bd6129e3ca15125c87c8186e9ff27d835fb2f683 Author: Alex <alex.hawley@vercel.com> Date: Wed Sep 4 15:19:40 2024 -0500 added now required channel_id commit eeb805fd11219d8512c1cadefe047019d63d4b60 Author: Alex <alex.hawley@vercel.com> Date: Tue Sep 3 17:43:27 2024 -0500 split out scapi commit e4f3bb1c827137245367152c1ff0401db76e7082 Author: Alex <alex.hawley@vercel.com> Date: Tue Sep 3 16:55:11 2024 -0500 carried over sfcc work commit 2616869f56f330f44ad3dfff9ad488eaaf1dbe51 Author: Alex <alex.hawley@vercel.com> Date: Thu Aug 22 15:03:30 2024 -0400 initial sfcc work
122 lines
2.7 KiB
TypeScript
122 lines
2.7 KiB
TypeScript
'use server';
|
|
|
|
import { TAGS } from 'lib/constants';
|
|
import { addToCart, createCart, getCart, removeFromCart, updateCart } from 'lib/sfcc';
|
|
import { revalidateTag } from 'next/cache';
|
|
import { cookies } from 'next/headers';
|
|
import { redirect } from 'next/navigation';
|
|
|
|
export async function addItem(prevState: any, selectedVariantId: string | undefined) {
|
|
let cartId = cookies().get('cartId')?.value;
|
|
|
|
if (!cartId || !selectedVariantId) {
|
|
return 'Error adding item to cart';
|
|
}
|
|
|
|
try {
|
|
await addToCart(cartId, [{ merchandiseId: selectedVariantId, quantity: 1 }]);
|
|
revalidateTag(TAGS.cart);
|
|
} catch (e) {
|
|
return 'Error adding item to cart';
|
|
}
|
|
}
|
|
|
|
export async function removeItem(prevState: any, merchandiseId: string) {
|
|
let cartId = cookies().get('cartId')?.value;
|
|
|
|
if (!cartId) {
|
|
return 'Missing cart ID';
|
|
}
|
|
|
|
try {
|
|
const cart = await getCart(cartId);
|
|
|
|
if (!cart) {
|
|
return 'Error fetching cart';
|
|
}
|
|
|
|
const lineItem = cart.lines.find((line) => line.merchandise.id === merchandiseId);
|
|
|
|
if (lineItem && lineItem.id) {
|
|
await removeFromCart(cartId, [lineItem.id]);
|
|
revalidateTag(TAGS.cart);
|
|
} else {
|
|
return 'Item not found in cart';
|
|
}
|
|
} catch (e) {
|
|
return 'Error removing item from cart';
|
|
}
|
|
}
|
|
|
|
export async function updateItemQuantity(
|
|
prevState: any,
|
|
payload: {
|
|
merchandiseId: string;
|
|
quantity: number;
|
|
}
|
|
) {
|
|
let cartId = cookies().get('cartId')?.value;
|
|
|
|
if (!cartId) {
|
|
return 'Missing cart ID';
|
|
}
|
|
|
|
const { merchandiseId, quantity } = payload;
|
|
|
|
try {
|
|
const cart = await getCart(cartId);
|
|
|
|
if (!cart) {
|
|
return 'Error fetching cart';
|
|
}
|
|
|
|
const lineItem = cart.lines.find((line) => line.merchandise.id === merchandiseId);
|
|
|
|
if (lineItem && lineItem.id) {
|
|
if (quantity === 0) {
|
|
await removeFromCart(cartId, [lineItem.id]);
|
|
} else {
|
|
await updateCart(cartId, [
|
|
{
|
|
id: lineItem.id,
|
|
merchandiseId,
|
|
quantity
|
|
}
|
|
]);
|
|
}
|
|
} else if (quantity > 0) {
|
|
// If the item doesn't exist in the cart and quantity > 0, add it
|
|
await addToCart(cartId, [{ merchandiseId, quantity }]);
|
|
}
|
|
|
|
revalidateTag(TAGS.cart);
|
|
} catch (e) {
|
|
console.error(e);
|
|
return 'Error updating item quantity';
|
|
}
|
|
}
|
|
|
|
export async function redirectToCheckout() {
|
|
let cartId = cookies().get('cartId')?.value;
|
|
|
|
if (!cartId) {
|
|
return 'Missing cart ID';
|
|
}
|
|
|
|
let cart = await getCart(cartId);
|
|
|
|
if (!cart) {
|
|
return 'Error fetching cart';
|
|
}
|
|
|
|
redirect(cart.checkoutUrl);
|
|
}
|
|
|
|
export async function createCartAndSetCookie() {
|
|
let cart = await createCart();
|
|
// set the cartId to the same duration as the guest
|
|
cookies().set('cartId', cart.id!, {
|
|
maxAge: 60 * 30
|
|
});
|
|
}
|