import type { UpsertTrackingCartRequest } from '../types'; import type { CartResponse, Order, OrderItem, Product, } from '../../Api/types'; export function getVariant(orderItem: OrderItem | Product) { if ('product' in orderItem) return orderItem.product.currentAttributes .map(attribute => attribute.value.label) .join(', '); return orderItem.currentAttributes .map(attribute => attribute.value.label) .join(', '); } export function getAllOrderItems(orders: Array) { return orders.map(order => order.items).flat(); } export function groupOrderItemById(orders: Array) { const orderItems = getAllOrderItems(orders) || []; const uniqOrderItemById: Array = []; orderItems?.forEach(orderItem => { const orderItemIndex = uniqOrderItemById.findIndex( uniqOrderItem => uniqOrderItem.product.productId === orderItem.product.productId, ); if (orderItemIndex === -1) { uniqOrderItemById.push(orderItem); return; } uniqOrderItemById[orderItemIndex] = { ...uniqOrderItemById[orderItemIndex], quantity: orderItem.quantity + uniqOrderItemById[orderItemIndex].quantity, totalValue: orderItem.totalValue + uniqOrderItemById[orderItemIndex].totalValue, subtotalValue: orderItem.subtotalValue + uniqOrderItemById[orderItemIndex].subtotalValue, }; return; }); return uniqOrderItemById; } export function getAddedCartItems( cartPayload: CartResponse, upsertPayload?: UpsertTrackingCartRequest, ) { return groupOrderItemById(cartPayload.orders) .filter(orderItem => { if (!upsertPayload) return orderItem; return upsertPayload.items.some( upsert => upsert.productId === orderItem.product.productId, ); }) .map(orderItem => { if (!upsertPayload) { return { ...orderItem, oldQuantity: 0, }; } const upsertItem = upsertPayload.items.find( upsert => upsert.productId === orderItem.product.productId, )!; if (!upsertItem.oldQuantity) { return { ...orderItem, oldQuantity: upsertItem.oldQuantity, }; } return { ...orderItem, oldQuantity: upsertItem.oldQuantity, }; }); } export function totalValue( cartPayload: CartResponse, upsertPayload?: UpsertTrackingCartRequest, ) { return getAddedCartItems(cartPayload, upsertPayload) .map(orderItem => orderItem.subtotalValue) .reduce((acc, current) => acc + current, 0); }