"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 ) { if (!selectedVariantId) { return "Error adding item to cart"; } try { await addToCart([{ merchandiseId: selectedVariantId, quantity: 1 }]); revalidateTag(TAGS.cart); } catch (e) { return "Error adding item to cart"; } } export async function removeItem(prevState: any, merchandiseId: string) { try { const cart = await getCart(); if (!cart) { return "Error fetching cart"; } const lineItem = cart.lines.find( (line) => line.merchandise.id === merchandiseId ); if (lineItem && lineItem.id) { await removeFromCart([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; } ) { const { merchandiseId, quantity } = payload; try { const cart = await getCart(); 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([lineItem.id]); } else { await updateCart([ { 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([{ merchandiseId, quantity }]); } revalidateTag(TAGS.cart); } catch (e) { console.error(e); return "Error updating item quantity"; } } export async function redirectToCheckout() { let cart = await getCart(); redirect(cart!.checkoutUrl); } export async function createCartAndSetCookie() { let cart = await createCart(); (await cookies()).set("cartId", cart.id!); }