mirror of
https://github.com/vercel/commerce.git
synced 2025-05-17 06:56:59 +00:00
update product serialization
This commit is contained in:
parent
ff41cf0e8f
commit
42007d89cd
@ -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 {
|
||||||
),
|
...accumulator,
|
||||||
|
[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 {
|
return {
|
||||||
id: variant.id,
|
id: variant.code,
|
||||||
options: options,
|
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,
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user