diff --git a/workloads/ecommerce/lib/headless/providers/medusa-cart.ts b/workloads/ecommerce/lib/headless/providers/medusa-cart.ts index e1a0a1c..693420a 100644 --- a/workloads/ecommerce/lib/headless/providers/medusa-cart.ts +++ b/workloads/ecommerce/lib/headless/providers/medusa-cart.ts @@ -61,6 +61,7 @@ type MedusaLineItem = { thumbnail?: string | null; quantity: number; unit_price?: number | null; + product?: { images?: Array<{ url?: string | null }> | null } | null; }; type MedusaCart = { @@ -82,10 +83,13 @@ function mapCart(cart: MedusaCart): CartSummary { product: { id: item.product_id, name: item.product_title || item.title || "Producto", - // La linea del carrito no trae el arreglo de imagenes del producto, - // solo este campo (a veces null) -- mismo fallback final que ya usa - // mapProduct() en medusa.ts. - thumbnail: item.thumbnail || "/images/brand/logo-ari.png", + // item.thumbnail viene null en la practica para todo el catalogo + // real (confirmado contra /store/products: product.thumbnail + // tambien es null ahi, incluso con fotos reales cargadas) -- el + // catalogo ya resuelve esto cayendo a images[0] (mapProduct() en + // medusa.ts), asi que la linea del carrito pide esa misma relacion + // explicita (no viene por defecto) y aplica el mismo fallback. + thumbnail: item.thumbnail || item.product?.images?.[0]?.url || "/images/brand/logo-ari.png", price: typeof item.unit_price === "number" ? item.unit_price : null, currency: cart.currency_code, }, @@ -117,6 +121,11 @@ async function medusaCartFetch( return response.json(); } +// *items.product.images no viene por defecto (verificado en vivo) y es +// lo unico que necesitamos ademas del set por defecto -- *items ya trae +// unit_price/product_title/variant_id/quantity sin pedirlos aparte. +const ITEMS_FIELDS = "fields=*items,*items.product.images"; + export async function createCart(): Promise { const data = await medusaCartFetch("/store/carts", { method: "POST", @@ -126,7 +135,7 @@ export async function createCart(): Promise { } export async function getCart(cartId: string): Promise { - const data = await medusaCartFetch(`/store/carts/${cartId}`); + const data = await medusaCartFetch(`/store/carts/${cartId}?${ITEMS_FIELDS}`); return mapCart(data.cart as MedusaCart); } @@ -135,7 +144,7 @@ export async function addLineItem( variantId: string, quantity: number, ): Promise { - const data = await medusaCartFetch(`/store/carts/${cartId}/line-items`, { + const data = await medusaCartFetch(`/store/carts/${cartId}/line-items?${ITEMS_FIELDS}`, { method: "POST", body: { variant_id: variantId, quantity }, }); @@ -147,7 +156,7 @@ export async function updateLineItemQuantity( lineItemId: string, quantity: number, ): Promise { - const data = await medusaCartFetch(`/store/carts/${cartId}/line-items/${lineItemId}`, { + const data = await medusaCartFetch(`/store/carts/${cartId}/line-items/${lineItemId}?${ITEMS_FIELDS}`, { method: "POST", body: { quantity }, }); @@ -155,7 +164,7 @@ export async function updateLineItemQuantity( } export async function removeLineItem(cartId: string, lineItemId: string): Promise { - const data = await medusaCartFetch(`/store/carts/${cartId}/line-items/${lineItemId}`, { + const data = await medusaCartFetch(`/store/carts/${cartId}/line-items/${lineItemId}?${ITEMS_FIELDS}`, { method: "DELETE", }); // Forma distinta a las demas: el carrito actualizado viene en