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
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:
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ón | Uso |
|---|---|
cart, cartId | Carrito cargado e identificador activo. |
itemCount | Suma de cantidades. |
loadStatus | loading, ready o error. |
mutation, error | Estado de la última operación. |
addItem | Añade { variantId, quantity }. |
setItemQuantity | Cambia la cantidad de una línea. |
removeItem | Elimina una línea. |
reload | Recarga el carrito desde el API. |
clearCart | Elimina la sesión local actual. |
Para usar el checkout incluido, añade también AuthProvider como se explica en
la guía de checkout.