Merge pull request #5 from spree/fix-images-option-filter

Do not throw an error if a product doesn't have NEXT_PUBLIC_SPREE_IMAGES_OPTION_FILTER
This commit is contained in:
Tomek Niezgoda
2021-10-11 16:09:33 +02:00
committed by GitHub
2 changed files with 47 additions and 46 deletions

View File

@@ -1 +0,0 @@
export default class MissingOptionTypeError extends Error {}

View File

@@ -12,7 +12,6 @@ import expandOptions from './expand-options'
import getMediaGallery from './get-media-gallery' import getMediaGallery from './get-media-gallery'
import getProductPath from './get-product-path' import getProductPath from './get-product-path'
import MissingPrimaryVariantError from '../errors/MissingPrimaryVariantError' import MissingPrimaryVariantError from '../errors/MissingPrimaryVariantError'
import MissingOptionTypeError from '../errors/MissingOptionTypeError'
import MissingOptionValueError from '../errors/MissingOptionValueError' 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'
@@ -143,59 +142,62 @@ const normalizeProduct = (
) )
if (!imagesFilterOptionType) { if (!imagesFilterOptionType) {
throw new MissingOptionTypeError( console.warn(
`Couldn't find option type having name ${imagesOptionFilter}.` `Couldn't find option type having name ${imagesOptionFilter} for product with id ${spreeProduct.id}.` +
' Showing no images for this product.'
) )
}
const imagesOptionTypeFilterId = imagesFilterOptionType.id spreeVariantImageRecords = []
const includedOptionValuesImagesIds: string[] = [] } else {
const imagesOptionTypeFilterId = imagesFilterOptionType.id
const includedOptionValuesImagesIds: string[] = []
spreeVariantImageRecords = spreeVariantRecords.reduce<JsonApiDocument[]>( spreeVariantImageRecords = spreeVariantRecords.reduce<JsonApiDocument[]>(
(accumulatedImageRecords, spreeVariantRecord) => { (accumulatedImageRecords, spreeVariantRecord) => {
const spreeVariantOptionValuesIdentifiers: RelationType[] = const spreeVariantOptionValuesIdentifiers: RelationType[] =
spreeVariantRecord.relationships.option_values.data spreeVariantRecord.relationships.option_values.data
const spreeOptionValueOfFilterTypeIdentifier = const spreeOptionValueOfFilterTypeIdentifier =
spreeVariantOptionValuesIdentifiers.find( spreeVariantOptionValuesIdentifiers.find(
(spreeVariantOptionValuesIdentifier: RelationType) => (spreeVariantOptionValuesIdentifier: RelationType) =>
imagesFilterOptionType.relationships.option_values.data.some( imagesFilterOptionType.relationships.option_values.data.some(
(filterOptionTypeValueIdentifier: RelationType) => (filterOptionTypeValueIdentifier: RelationType) =>
filterOptionTypeValueIdentifier.id === filterOptionTypeValueIdentifier.id ===
spreeVariantOptionValuesIdentifier.id spreeVariantOptionValuesIdentifier.id
) )
) )
if (!spreeOptionValueOfFilterTypeIdentifier) { if (!spreeOptionValueOfFilterTypeIdentifier) {
throw new MissingOptionValueError( throw new MissingOptionValueError(
`Couldn't find option value related to option type with id ${imagesOptionTypeFilterId}.` `Couldn't find option value related to option type with id ${imagesOptionTypeFilterId}.`
) )
} }
const optionValueImagesAlreadyIncluded = const optionValueImagesAlreadyIncluded =
includedOptionValuesImagesIds.includes( includedOptionValuesImagesIds.includes(
spreeOptionValueOfFilterTypeIdentifier.id
)
if (optionValueImagesAlreadyIncluded) {
return accumulatedImageRecords
}
includedOptionValuesImagesIds.push(
spreeOptionValueOfFilterTypeIdentifier.id spreeOptionValueOfFilterTypeIdentifier.id
) )
if (optionValueImagesAlreadyIncluded) { return [
return accumulatedImageRecords ...accumulatedImageRecords,
} ...jsonApi.findRelationshipDocuments(
spreeSuccessResponse,
includedOptionValuesImagesIds.push( spreeVariantRecord,
spreeOptionValueOfFilterTypeIdentifier.id 'images'
) ),
]
return [ },
...accumulatedImageRecords, []
...jsonApi.findRelationshipDocuments( )
spreeSuccessResponse, }
spreeVariantRecord,
'images'
),
]
},
[]
)
} }
const spreeImageRecords = [ const spreeImageRecords = [