Saltar al contenido
Guías

Carrito

Monta CartProvider y administra el carrito persistido en Storefront API.

El carrito del SDK no es un store local separado. CartProvider conserva el identificador de sesión en localStorage y carga el carrito real desde Storefront API.

1. Monta el provider

layout.tsx
import { CartProvider, defineLayout } from "@ecomiq/storefront";

export default defineLayout(({ children, settings }) => (
  <CartProvider
    storeId={settings.store.id}
    currencyCode={settings.store.currency}
  >
    {children}
  </CartProvider>
));

La clave local es ecomiq:cart:v1:{storeId}, así que la sesión queda aislada por tienda. Solo se persiste el identificador; precios, stock y totales se vuelven a leer del API.

2. Agrega una variante

import { useCart } from "@ecomiq/storefront";

export function AddToCartButton({ variantId }: { variantId: string }) {
  const { addItem, mutation, error } = useCart();
  const isAdding = mutation?.kind === "adding";

  return (
    <>
      <button
        type="button"
        disabled={isAdding}
        onClick={() => void addItem({ variantId, quantity: 1 })}
      >
        {isAdding ? "Agregando…" : "Agregar al carrito"}
      </button>
      {error ? <p>{error}</p> : null}
    </>
  );
}

variantId es el ID decimal positivo que llega en una variante de ProductDetail.

3. Crea la página del carrito

/cart no es una ruta cerrada; crea tu propia UI:

pages/cart.tsx
import { definePage, Link, useCart } from "@ecomiq/storefront";

export default definePage({
  meta: () => ({ title: "Carrito", noIndex: true }),
  component: CartPage,
});

function CartPage() {
  const { cart, itemCount, loadStatus, removeItem } = useCart();

  if (loadStatus === "loading") return <p>Cargando…</p>;
  if (!cart?.items.length) return <p>Tu carrito está vacío.</p>;

  return (
    <main>
      <h1>{itemCount} productos</h1>
      {cart.items.map((item) => (
        <div key={item.id}>
          <span>
            {item.title} × {item.quantity}
          </span>
          <button onClick={() => void removeItem(item.id)}>Quitar</button>
        </div>
      ))}
      <Link to="/checkout/$checkoutId" params={{ checkoutId: cart.id }}>
        Ir al checkout
      </Link>
    </main>
  );
}

Contrato de useCart

Campo o acciónUso
cart, cartIdCarrito cargado e identificador activo.
itemCountSuma de cantidades.
loadStatusloading, ready o error.
mutation, errorEstado de la última operación.
addItemAñade { variantId, quantity }.
setItemQuantityCambia la cantidad de una línea.
removeItemElimina una línea.
reloadRecarga el carrito desde el API.
clearCartElimina la sesión local actual.

Para usar el checkout incluido, añade también AuthProvider como se explica en la guía de checkout.

En esta página