[NX-24] Display PDP option types sorted by position from Spree

This commit is contained in:
Robert Nowakowski
2021-09-29 15:20:57 +02:00
parent a2560dc439
commit 42318f4714
4 changed files with 26 additions and 11 deletions

View File

@@ -6,6 +6,7 @@ import type {
} from '@spree/storefront-api-v2-sdk/types/interfaces/JsonApi' } from '@spree/storefront-api-v2-sdk/types/interfaces/JsonApi'
import type { ResultResponse } from '@spree/storefront-api-v2-sdk/types/interfaces/ResultResponse' import type { ResultResponse } from '@spree/storefront-api-v2-sdk/types/interfaces/ResultResponse'
import type { Response } from '@vercel/fetch' import type { Response } from '@vercel/fetch'
import type { ProductOption } from '@commerce/types/product'
export type UnknownObjectValues = Record<string, unknown> export type UnknownObjectValues = Record<string, unknown>
@@ -109,3 +110,5 @@ export interface ProductSlugAttr extends JsonApiDocument {
export interface IProductsSlugs extends JsonApiListResponse { export interface IProductsSlugs extends JsonApiListResponse {
data: ProductSlugAttr[] data: ProductSlugAttr[]
} }
export type ExpandedProductOption = ProductOption & { position: number }

View File

@@ -1,6 +1,5 @@
import type { import type {
ProductOption, ProductOptionValues
ProductOptionValues,
} from '@commerce/types/product' } from '@commerce/types/product'
import type { import type {
JsonApiDocument, JsonApiDocument,
@@ -9,17 +8,18 @@ import type {
import { jsonApi } from '@spree/storefront-api-v2-sdk' import { jsonApi } from '@spree/storefront-api-v2-sdk'
import type { RelationType } from '@spree/storefront-api-v2-sdk/types/interfaces/Relationships' import type { RelationType } from '@spree/storefront-api-v2-sdk/types/interfaces/Relationships'
import SpreeResponseContentError from '../errors/SpreeResponseContentError' import SpreeResponseContentError from '../errors/SpreeResponseContentError'
import type { OptionTypeAttr } from '@framework/types' import type { OptionTypeAttr, ExpandedProductOption } from '@framework/types'
import sortOptionsByPosition from '@framework/utils/sort-option-types'
const isColorProductOption = (productOption: ProductOption) => { const isColorProductOption = (productOption: ExpandedProductOption) => {
return productOption.displayName === 'Color' return productOption.displayName === 'Color'
} }
const expandOptions = ( const expandOptions = (
spreeSuccessResponse: JsonApiResponse, spreeSuccessResponse: JsonApiResponse,
spreeOptionValue: JsonApiDocument, spreeOptionValue: JsonApiDocument,
accumulatedOptions: ProductOption[] accumulatedOptions: ExpandedProductOption[]
): ProductOption[] => { ): ExpandedProductOption[] => {
const spreeOptionTypeIdentifier = spreeOptionValue.relationships.option_type const spreeOptionTypeIdentifier = spreeOptionValue.relationships.option_type
.data as RelationType .data as RelationType
@@ -27,7 +27,7 @@ const expandOptions = (
(option) => option.id == spreeOptionTypeIdentifier.id (option) => option.id == spreeOptionTypeIdentifier.id
) )
let option: ProductOption let option: ExpandedProductOption
if (existingOptionIndex === -1) { if (existingOptionIndex === -1) {
const spreeOptionType = jsonApi.findDocument<OptionTypeAttr>( const spreeOptionType = jsonApi.findDocument<OptionTypeAttr>(
@@ -45,6 +45,7 @@ const expandOptions = (
__typename: 'MultipleChoiceOption', __typename: 'MultipleChoiceOption',
id: spreeOptionType.id, id: spreeOptionType.id,
displayName: spreeOptionType.attributes.presentation, displayName: spreeOptionType.attributes.presentation,
position: spreeOptionType.attributes.position,
values: [], values: [],
} }
} else { } else {
@@ -93,7 +94,9 @@ const expandOptions = (
values: expandedOptionValues, values: expandedOptionValues,
} }
return expandedOptions const sortedOptions = sortOptionsByPosition(expandedOptions)
return sortedOptions
} }
return accumulatedOptions return accumulatedOptions

View File

@@ -1,7 +1,6 @@
import type { import type {
Product, Product,
ProductImage, ProductImage,
ProductOption,
ProductPrice, ProductPrice,
ProductVariant, ProductVariant,
} from '@commerce/types/product' } from '@commerce/types/product'
@@ -18,6 +17,7 @@ import MissingOptionValueError from '../errors/MissingOptionValueError'
import type { SpreeSdkResponse, VariantAttr } from '@framework/types' import type { SpreeSdkResponse, VariantAttr } from '@framework/types'
import { jsonApi } from '@spree/storefront-api-v2-sdk' import { jsonApi } from '@spree/storefront-api-v2-sdk'
import { JsonApiDocument } from '@spree/storefront-api-v2-sdk/types/interfaces/JsonApi' import { JsonApiDocument } from '@spree/storefront-api-v2-sdk/types/interfaces/JsonApi'
import type { ExpandedProductOption } from '@framework/types'
const placeholderImage = requireConfigValue('productPlaceholderImageUrl') as const placeholderImage = requireConfigValue('productPlaceholderImageUrl') as
| string | string
@@ -58,7 +58,7 @@ const normalizeProduct = (
hasNonMasterVariants hasNonMasterVariants
let variants: ProductVariant[] let variants: ProductVariant[]
let options: ProductOption[] = [] let options: ExpandedProductOption[] = []
const spreeVariantRecords = jsonApi.findRelationshipDocuments( const spreeVariantRecords = jsonApi.findRelationshipDocuments(
spreeSuccessResponse, spreeSuccessResponse,
@@ -67,7 +67,7 @@ const normalizeProduct = (
) )
variants = spreeVariantRecords.map((spreeVariantRecord) => { variants = spreeVariantRecords.map((spreeVariantRecord) => {
let variantOptions: ProductOption[] = [] let variantOptions: ExpandedProductOption[] = []
if (showOptions) { if (showOptions) {
const spreeOptionValues = jsonApi.findRelationshipDocuments( const spreeOptionValues = jsonApi.findRelationshipDocuments(

View File

@@ -0,0 +1,9 @@
import type { ExpandedProductOption } from '@framework/types'
const sortOptionsByPosition = (options: ExpandedProductOption[]): ExpandedProductOption[] => {
return options.sort((firstOption, secondOption) => {
return firstOption.position - secondOption.position
})
}
export default sortOptionsByPosition