Saltar al contenido principal

Carrito de Compras

El carrito de compras es una parte fundamental de la integración con Magento, permitiendo a los usuarios añadir, actualizar y eliminar productos, así como aplicar cupones y procesar el pedido.

Estructura de datos principal

El carrito se representa mediante el tipo Cart de GraphQL, que contiene:

  • ID del carrito (id)
  • Artículos del carrito (items)
  • Dirección de envío (shipping_addresses)
  • Método de pago seleccionado (selected_payment_method)
  • Total y subtotal
  • Descuentos aplicados

Componentes clave

MagentoOrderContext

Este contexto proporciona todas las funcionalidades relacionadas con el carrito:

export interface MagentoOrderConfig {
cartId: string|null
quote: Cart|null
// Métodos del carrito
addToCart: (sku: string, quantity: number, metadata?: CartItemMetadata) => Promise<Cart|null>
removeFromCart: (id: number) => Promise<Cart|null>
updateItemCart: (id: number, quantity: number, metadata?: CartItemMetadata) => Promise<Cart|null>
refreshQuote: () => Promise<Cart|null>
// ...otros métodos
}

CartItemMetadata

Metadatos adicionales para los artículos del carrito:

export interface CartItemMetadata {
has_cashback: boolean
additional_services: {code: string, cost: number|string}[]
isArmed: boolean
}

Métodos principales

Gestión de artículos

// Añadir producto al carrito
addToCart: async (sku: string, quantity: number, metadata?: CartItemMetadata) => Promise<Cart|null>

// Actualizar cantidad de un artículo
updateItemCart: async (id: number, quantity: number, metadata?: CartItemMetadata) => Promise<Cart|null>

// Eliminar un artículo del carrito (usando quantity=0)
removeFromCart: async (id: number) => Promise<Cart|null>

Actualización del carrito

// Refrescar datos del carrito
refreshQuote: async () => Promise<Cart|null>

// Refrescar carrito y datos del cliente
refreshData: async () => Promise<{customer: Customer, cart: Cart}|null>

Implementación

Los métodos del carrito están implementados en magento-service-provider.ts y utilizados en magento-order-container.tsx:

export const addToCart = async (cartId: string, cartItems: [SimpleProductCartItemInput]): Promise<Cart|null>=> {
const response = await request({
query: QuoteAddToCartDocument,
variables: {
cartId,
cartItems
}
}) as QuoteAddToCartMutation
return response?.addSimpleProductsToCart?.cart as Cart|null
}

export const updateItemCart = async (cartId: string, cartItems: [CartItemUpdateInput]): Promise<Cart|null>=> {
const response = await request({
query: QuoteUpdateItemCartDocument,
variables: {
cartId,
cartItems
}
}) as QuoteUpdateItemCartMutation
return response?.updateCartItems?.cart as Cart|null
}

Flujo de uso del carrito

  1. El usuario añade un producto al carrito mediante addToCart
  2. El carrito se actualiza en el estado mediante setQuote
  3. El usuario puede modificar cantidades con updateItemCart o eliminar productos con removeFromCart
  4. Al avanzar al checkout, se aplican direcciones, métodos de envío y métodos de pago

Uso en componentes

Para usar la funcionalidad del carrito en componentes:

import useMagentoOrderContainer from "src/magento/hooks/use-magento-order-container";

const CartComponent = () => {
const {
quote,
addToCart,
updateItemCart,
removeFromCart
} = useMagentoOrderContainer();

// Uso de la funcionalidad del carrito
// ...
}

Integración con servicios adicionales

El carrito permite metadatos adicionales para cada artículo:

  • has_cashback: Indica si el producto tiene cashback
  • additional_services: Servicios adicionales asociados al producto
  • isArmed: Indica si el producto requiere armado