update product serialization

This commit is contained in:
DuvCharles 2023-01-17 17:50:52 +01:00 committed by Hadrien Lucas
parent ff41cf0e8f
commit 42007d89cd

View File

@ -10,7 +10,7 @@ import {
SyliusProduct, SyliusProduct,
SyliusProductImage, SyliusProductImage,
SyliusProductOption, SyliusProductOption,
SyliusProductOptionValues, SyliusProductOptionValue,
SyliusProductVariant, SyliusProductVariant,
} from '../../types/products' } from '../../types/products'
@ -24,7 +24,7 @@ export const normalizeProduct = (product: SyliusProduct): Product => {
path: `/${product.slug}`, path: `/${product.slug}`,
images: product.images.map((image) => normalizeProductImage(image)), images: product.images.map((image) => normalizeProductImage(image)),
variants: product.variants.map((variant) => variants: product.variants.map((variant) =>
normalizeProductVariant(variant) normalizeProductVariant(variant, product.options)
), ),
price: normalizeProductPrice( price: normalizeProductPrice(
product.variants[0].price, product.variants[0].price,
@ -35,29 +35,67 @@ export const normalizeProduct = (product: SyliusProduct): Product => {
} }
const normalizeProductVariant = ( const normalizeProductVariant = (
variant: SyliusProductVariant variant: SyliusProductVariant,
options: SyliusProductOption[]
): ProductVariant => { ): ProductVariant => {
const options = const availableOptions = variant.optionValues.reduce(
variant.optionValues.length > 0 (accumulator: { [id: number]: ProductOption }, currentOptionValue) => {
? [ const optionFromOptionValue = options.filter(
{ (option: SyliusProductOption) =>
id: '', option.values.some((value) => value.code === currentOptionValue.code)
displayName: '', )[0]
values: variant.optionValues.map((optionValue) => if (accumulator.hasOwnProperty(optionFromOptionValue.id.toString())) {
normalizeProductOptionValue(optionValue)
),
},
]
: []
return { return {
id: variant.id, ...accumulator,
options: options, [optionFromOptionValue.id]: {
...accumulator[optionFromOptionValue.id],
values: [
...accumulator[optionFromOptionValue.id].values,
{
label: currentOptionValue.value ?? '',
},
],
},
}
} else {
const newOption = normalizeProductVariantOption(
currentOptionValue,
optionFromOptionValue
)
return {
...accumulator,
[newOption.id]: newOption,
}
}
},
{}
)
return {
id: variant.code,
options: Object.values(availableOptions),
availableForSale: variant.inStock, availableForSale: variant.inStock,
} }
} }
const normalizeProductVariantOption = (
optionValue: SyliusProductOptionValue,
option: SyliusProductOption
): ProductOption => {
return {
__typename: 'MultipleChoiceOption',
id: option.id.toString(),
displayName: option.name,
values: [
{
label: optionValue.value ?? '',
},
],
}
}
const normalizeProductOption = (option: SyliusProductOption): ProductOption => { const normalizeProductOption = (option: SyliusProductOption): ProductOption => {
return { return {
__typename: 'MultipleChoiceOption',
id: option.id.toString(), id: option.id.toString(),
displayName: option.name, displayName: option.name,
values: option.values.map((optionValue) => values: option.values.map((optionValue) =>
@ -67,14 +105,16 @@ const normalizeProductOption = (option: SyliusProductOption): ProductOption => {
} }
const normalizeProductOptionValue = ( const normalizeProductOptionValue = (
optionValue: SyliusProductOptionValues optionValue: SyliusProductOptionValue
): ProductOptionValues => { ): ProductOptionValues => {
return { return {
label: optionValue.value ?? '', label: optionValue.value ?? '',
} }
} }
const normalizeProductImage = (image: SyliusProductImage): ProductImage => { export const normalizeProductImage = (
image: SyliusProductImage
): ProductImage => {
return { return {
url: process.env.NEXT_PUBLIC_SYLIUS_ALLOWED_IMAGE_URL + image.path, url: process.env.NEXT_PUBLIC_SYLIUS_ALLOWED_IMAGE_URL + image.path,
} }