import { Product } from '@commerce/types' import { Product as SaleorProduct, Checkout, CheckoutLine, Money, } from '../schema' import type { Cart, LineItem } from '../types' // TODO: Check nextjs-commerce bug if no images are added for a product const placeholderImg = '/product-img-placeholder.svg' const money = ({ amount, currency }: Money) => { return { value: +amount, currencyCode: currency || 'USD', } } const normalizeProductOptions = (options: ProductOption[]) => { return options?.map(({ id, name: displayName, values }) => ({ __typename: 'MultipleChoiceOption', id, displayName, // values: values.map((value) => { // let output: any = { // label: value, // } // if (displayName.match(/colou?r/gi)) { // output = { // ...output, // hexColors: [value], // } // } // return output // }) values: [], })) } const normalizeProductImages = (images: any) => images.map(({ node: { originalSrc: url, ...rest } }) => ({ url, ...rest, })) const normalizeProductVariants = (variants: any) => { return variants?.map( ({ id, selectedOptions, sku, name, priceV2, pricing }) => { const price = money(pricing?.price?.net)?.value console.log({ price }) return { id, name, sku: sku ?? id, price, listPrice: price, requiresShipping: true, // options: selectedOptions.map(({ name, value }: SelectedOption) => { // const options = normalizeProductOption({ // id, // name, // values: [value], // }) // return options // }), options: [], } } ) } export function normalizeProduct(productNode: SaleorProduct): Product { const { id, name, media, variants, description, slug, pricing, // options, ...rest } = productNode const product = { id, name, vendor: '', description, path: `/${slug}`, slug: slug?.replace(/^\/+|\/+$/g, ''), price: money(pricing?.priceRange?.start?.net) || 0, // TODO: Check nextjs-commerce bug if no images are added for a product images: media?.length ? media : [{ url: placeholderImg }], variants: variants ? normalizeProductVariants(variants) : [], options: variants ? normalizeProductOptions(variants) : [], ...rest, } return product } export function normalizeCart(checkout: Checkout): Cart { const lines = checkout.lines as CheckoutLine[]; const lineItems: LineItem[] = lines.length > 0 ? lines?.map(normalizeLineItem) : []; return { id: checkout.id, customerId: '', email: '', createdAt: checkout.created, currency: { code: checkout.totalPrice?.currency! }, taxesIncluded: false, lineItems, lineItemsSubtotalPrice: checkout.subtotalPrice?.gross?.amount!, subtotalPrice: checkout.subtotalPrice?.gross?.amount!, totalPrice: checkout.totalPrice?.gross.amount!, discounts: [], } } function normalizeLineItem({ id, variant, quantity }: CheckoutLine): LineItem { return { id, variantId: String(variant?.id), productId: String(variant?.id), name: `${variant.name}`, quantity, variant: { id: String(variant?.id), sku: variant?.sku ?? '', name: variant?.name!, image: { url: variant?.media![0].url ?? '/product-img-placeholder.svg', }, requiresShipping: false, price: variant?.pricing?.price?.gross.amount!, listPrice: 0 }, path: String(variant?.product?.slug), discounts: [], options: [ ], } }