{"version":3,"file":"static/js/4dc4cb288b7e6396aca3.bundle.js","mappings":"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","sources":["webpack://ahi-ecommerce/./src/themes/ahi/views/components/product.component.tsx?998d","webpack://ahi-ecommerce/./src/modules/adventureworks/views/components/product.component.tsx?fd23"],"sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport {\n IPriceComponentResources,\n ISwatchItem,\n PriceComponent,\n ProductComponentSwatchComponent,\n RatingComponent\n} from '@msdyn365-commerce/components';\nimport {\n getCatalogId,\n IAny,\n IComponent,\n IComponentProps,\n ICoreContext,\n IGeneric,\n IGridSettings,\n IImageData,\n IImageSettings,\n Image,\n msdyn365Commerce\n} from '@msdyn365-commerce/core';\nimport { AttributeSwatch, AttributeValue, ProductDimension, ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n convertDimensionTypeToProductDimensionType,\n Dictionary,\n DimensionTypes,\n generateImageUrl,\n getProductPageUrlSync,\n IDimensionsApp,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n format,\n getPayloadObject,\n getTelemetryAttributes,\n ITelemetryContent,\n onTelemetryClick\n} from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult }> {\n className?: string;\n imageSettings?: IImageSettings;\n savingsText?: string;\n freePriceText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n ratingAriaLabel?: string;\n ratingCountAriaLabel?: string;\n allowBack?: boolean;\n telemetryContent?: ITelemetryContent;\n quickViewButton?: React.ReactNode;\n productComparisonButton?: React.ReactNode;\n isEnabledProductDescription?: boolean;\n isPriceMinMaxEnabled?: boolean;\n priceResources?: IPriceComponentResources;\n inventoryLabel?: string;\n dimensionAvailabilities?: IProductsDimensionsAvailabilities[];\n swatchItemAriaLabel?: string;\n}\n\nexport interface IProductComponent extends IComponent {}\n\nconst PriceComponentActions = {};\n\n/**\n * Gets the product page url from the default swatch selected.\n * @param productData - Product card to be rendered.\n * @returns The default color swatch selected if any.\n */\nfunction getDefaultColorSwatchSelected(productData?: ProductSearchResult): AttributeSwatch | null {\n if (!productData || !productData.AttributeValues) {\n return null;\n }\n\n const colorAttribute = productData.AttributeValues.find(\n attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === DimensionTypes.color\n );\n if (!colorAttribute) {\n return null;\n }\n\n const defaultSwatch = colorAttribute.Swatches?.find(item => item.IsDefault === true) ?? colorAttribute.Swatches?.[0];\n return defaultSwatch ?? null;\n}\n\n/**\n * Gets the product image from the default swatch selected.\n * @param coreContext - Context of the module using the component.\n * @param productData - Product card to be rendered.\n * @returns The product card image url.\n */\nfunction getProductImageUrlFromDefaultColorSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\n const siteContext = coreContext as ICoreContext;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\n return productData?.PrimaryImageUrl;\n }\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\n return defaultSwatch && ArrayExtensions.hasElements(defaultSwatch.ProductImageUrls)\n ? generateImageUrl(defaultSwatch.ProductImageUrls[0], coreContext.request.apiSettings)\n : productData?.PrimaryImageUrl;\n}\n\n/**\n * Updates the product url link to product details page.\n * @param productDetailsPageUrl - Product page url.\n * @param coreContext - Context of the module using the component.\n * @param queryString - Querystring to be added to the URL.\n * @returns The update product page url.\n */\nfunction updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\n const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\n if (sourceUrl.search) {\n sourceUrl.search += `&${queryString}`;\n } else {\n sourceUrl.search += queryString;\n }\n\n const updatedUrl = new URL(sourceUrl.href);\n return updatedUrl.pathname + sourceUrl.search;\n}\n\n/**\n * Gets the react node for product unit of measure display.\n * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\n * @returns The node representing markup for unit of measure component.\n */\nfunction renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\n if (!unitOfMeasure) {\n return null;\n }\n return (\n
\n {unitOfMeasure}\n
\n );\n}\n\n/**\n * Gets the react node for product availability.\n * @param inventoryAvailabilityLabel - The product information.\n * @returns The node representing markup for product availability.\n */\nfunction renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\n if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\n return null;\n }\n\n return (\n
\n {inventoryAvailabilityLabel}\n
\n );\n}\n\n/**\n * Renders product comparison button similar to the quick view button.\n * @param productComparisonButton - React element of the button.\n * @param product - Current product info.\n * @param catalogId - Current catalog.\n * @returns React element for the specific product.\n */\nfunction renderProductComparisonButton(\n productComparisonButton: React.ReactNode,\n product: ProductSearchResult,\n catalogId: number\n): JSX.Element | undefined {\n return React.cloneElement(productComparisonButton as React.ReactElement, { product, catalogId });\n}\n\n/**\n * Gets the product page url from the default swatch selected.\n * @param coreContext - Context of the module using the component.\n * @param productUrl - Product page url for the product card.\n * @param productData - Product card to be rendered.\n * @returns The product card image url.\n */\nfunction getProductPageUrlFromDefaultSwatch(\n coreContext: ICoreContext,\n productUrl: string,\n productData?: ProductSearchResult\n): string | undefined {\n const siteContext = coreContext as ICoreContext;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\n return productUrl;\n }\n\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\n if (!defaultSwatch || !defaultSwatch.SwatchValue) {\n return productUrl;\n }\n\n const queryString = `color=${defaultSwatch.SwatchValue}`;\n return updateProductUrl(productUrl, coreContext, queryString);\n}\n\nconst ProductCard: React.FC = ({\n data,\n context,\n imageSettings,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText,\n ratingAriaLabel,\n ratingCountAriaLabel,\n allowBack,\n typeName,\n id,\n telemetryContent,\n quickViewButton,\n productComparisonButton,\n isEnabledProductDescription,\n isPriceMinMaxEnabled,\n priceResources,\n inventoryLabel,\n dimensionAvailabilities,\n swatchItemAriaLabel\n}) => {\n const product = data.product;\n\n let productUrl = getProductPageUrlSync(product?.Name ?? '', product?.RecordId ?? Number.MIN_VALUE, context.actionContext, undefined);\n if (allowBack) {\n productUrl = updateProductUrl(productUrl, context, 'back=true');\n }\n const productImageUrlFromSwatch = getProductImageUrlFromDefaultColorSwatch(context, product) ?? product?.PrimaryImageUrl;\n const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\n const [productPageUrl, setProductPageUrl] = useState(productPageUrlFromSwatch);\n const [productImageUrl, setProductImageUrl] = useState(productImageUrlFromSwatch);\n React.useEffect(() => {\n setProductPageUrl(productPageUrlFromSwatch);\n setProductImageUrl(productImageUrlFromSwatch);\n }, [productUrl, productPageUrlFromSwatch, productImageUrlFromSwatch]);\n const [selectedSwatchItems] = useState(new Dictionary());\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access -- app context is generic\n const enableStockCheck = context.app.config.enableStockCheck;\n\n /**\n * Updates the product page and Image url based on swatch selected.\n * @param coreContext - Context of the caller.\n * @param swatchItem - Dimension swatch selected.\n */\n const updatePageAndImageUrl = React.useCallback(\n (coreContext: ICoreContext, swatchItem: ISwatchItem) => {\n const dimensionType = swatchItem.dimensionType;\n selectedSwatchItems.setValue(dimensionType, swatchItem);\n if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\n return;\n }\n const queryString = `${dimensionType}=${swatchItem.value}`;\n let productPageUrlWithSwatch = '';\n if (productPageUrl.includes(dimensionType)) {\n const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\n newUrl.searchParams.delete(dimensionType);\n productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\n } else {\n productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\n }\n setProductPageUrl(productPageUrlWithSwatch);\n if (dimensionType === DimensionTypes.color) {\n const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls)\n ? swatchItem.productImageUrls[0]\n : undefined;\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\n setProductImageUrl(newImageUrl);\n }\n },\n [selectedSwatchItems, context, productPageUrl]\n );\n\n if (!product) {\n return null;\n }\n\n /**\n * Checks if rendering the particular dimensions is allowed for product card.\n * @param dimensionType - Dimension to be displayed.\n * @returns Updates the state with new product page url.\n */\n function shouldDisplayDimension(dimensionType: string): boolean {\n const dimensionsContext = context as ICoreContext;\n const dimensionsToDisplayOnProductCard = dimensionsContext.app.config.dimensionsInProductCard;\n return (\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n dimensionsToDisplayOnProductCard.includes(dimensionType.toLocaleLowerCase() as DimensionTypes)\n );\n }\n\n /**\n * Gets the react node for product dimension as swatch.\n * @param attributeValues - Attribute value property from product.\n * @returns The node representing markup for unit of measure component.\n */\n function renderProductDimensions(attributeValues?: AttributeValue[]): JSX.Element | null {\n if (!attributeValues) {\n return null;\n }\n\n return (\n
\n {attributeValues.map((item: AttributeValue) => {\n const dimensionTypeValue = item.KeyName?.toLocaleLowerCase() ?? '';\n if (!shouldDisplayDimension(dimensionTypeValue)) {\n return null;\n }\n\n const siteContext = context as ICoreContext;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n const dimensionType = dimensionTypeValue as DimensionTypes;\n const swatches =\n item.Swatches?.map(swatchItem => {\n return {\n itemId: `${item.RecordId ?? ''}-${dimensionTypeValue}-${swatchItem.SwatchValue ?? ''}`,\n value: swatchItem.SwatchValue ?? '',\n dimensionType,\n colorHexCode: swatchItem.SwatchColorHexCode,\n imageUrl: swatchItem.SwatchImageUrl,\n productImageUrls: swatchItem.ProductImageUrls,\n isDefault: swatchItem.IsDefault,\n swatchItemAriaLabel: swatchItemAriaLabel ? format(swatchItemAriaLabel, dimensionType) : '',\n isDisabled:\n enableStockCheck &&\n dimensionAvailabilities?.find(\n dimensionAvailability => dimensionAvailability.value === (swatchItem.SwatchValue ?? '')\n )?.isDisabled\n };\n }) ?? [];\n if (\n dimensionToPreSelectInProductCard !== DimensionTypes.none &&\n ArrayExtensions.hasElements(swatches) &&\n !swatches.some(swatch => swatch.isDefault) &&\n dimensionType === DimensionTypes.color\n ) {\n swatches[0].isDefault = true;\n }\n return (\n \n );\n })}\n
\n );\n }\n\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\n if (quickview === null) {\n return undefined;\n }\n const selectedDimensions: ProductDimension[] = selectedSwatchItems.getValues().map(swatches => {\n return {\n DimensionTypeValue: convertDimensionTypeToProductDimensionType(swatches.dimensionType),\n DimensionValue: {\n RecordId: 0,\n Value: swatches.value\n }\n };\n });\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item, selectedDimensions });\n }\n\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.RecordId.toString());\n\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\n const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\n\n return (\n <>\n {isEnabledProductDescription ? (\n \n
\n
\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n productImageUrl,\n product.PrimaryImageUrl,\n product.Name,\n context\n )}\n
\n
\n
{product.Name}
\n {renderPrice(\n context,\n typeName,\n id,\n product.BasePrice,\n product.Price,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText,\n isPriceMinMaxEnabled,\n priceResources\n )}\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\n {renderDescription(product.Description)}\n
\n
\n \n ) : (\n \n
\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n productImageUrl,\n product.PrimaryImageUrl,\n product.Name,\n context\n )}\n
\n
\n
{product.Name}
\n {renderPrice(\n context,\n typeName,\n id,\n product.BasePrice,\n product.Price,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText\n )}\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\n
\n \n )}\n {renderProductDimensions(product.AttributeValues)}\n {!context.app.config.hideRating &&\n renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel, ratingCountAriaLabel)}\n {renderProductAvailability(inventoryLabel)}\n {quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\n {productComparisonButton && renderProductComparisonButton(productComparisonButton, product, getCatalogId(context.request))}\n \n );\n};\n\nfunction renderLabel(\n name?: string,\n price?: string,\n rating?: number,\n ratingAriaLabelText?: string,\n reviewCount?: number,\n ratingCountAriaLabelText?: string\n): string {\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\n return `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${\n reviewCountArialableText ? ` ${reviewCountArialableText}` : ''\n }`;\n}\n\nfunction renderDescription(description?: string): JSX.Element | null {\n return

{description}

;\n}\n\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\n if (rating && ratingAriaLabel) {\n const roundedRating = rating.toFixed(2);\n return format(ratingAriaLabel || '', roundedRating, '5');\n }\n return '';\n}\n\nfunction getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\n if (reviewCount && ratingCountAriaLabelText) {\n return format(ratingCountAriaLabelText || '', reviewCount);\n }\n return '';\n}\n\nfunction renderRating(\n coreContext: ICoreContext,\n moduleTypeName: string,\n moduleId: string,\n avgRating?: number,\n totalRatings?: number,\n ariaLabel?: string,\n ratingCountAriaLabel?: string\n): JSX.Element | null {\n if (!avgRating) {\n return null;\n }\n\n const numberRatings = totalRatings?.toString() || undefined;\n const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\n const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\n\n return (\n \n );\n}\n\nfunction renderPrice(\n context: ICoreContext,\n typeName: string,\n id: string,\n basePrice?: number,\n adjustedPrice?: number,\n savingsText?: string,\n freePriceText?: string,\n originalPriceText?: string,\n currentPriceText?: string,\n isPriceMinMaxEnabled?: boolean,\n priceResources?: IPriceComponentResources\n): JSX.Element | null {\n const price: ProductPrice = {\n BasePrice: basePrice,\n AdjustedPrice: adjustedPrice,\n CustomerContextualPrice: adjustedPrice\n };\n\n return (\n \n );\n}\n\nfunction renderProductPlacementImage(\n imageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n fallbackImageUrl?: string,\n altText?: string,\n context?: ICoreContext>\n): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment -- Site level config can be of any type.\n const contextConfig = context?.app.config?.placeholderImageName;\n const emptyPlaceHolderImage = contextConfig as string;\n let fallbackImageSource = fallbackImageUrl;\n if (emptyPlaceHolderImage && fallbackImageUrl) {\n fallbackImageSource = `${fallbackImageUrl},${emptyPlaceHolderImage}`;\n }\n const img: IImageData = {\n src: imageUrl,\n altText: altText ? altText : '',\n fallBackSrc: fallbackImageSource\n };\n const imageProps = {\n gridSettings,\n imageSettings\n };\n imageProps.imageSettings.cropFocalRegion = true;\n return (\n \n );\n}\n\nexport const ProductComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride<\n IProductComponent\n>('Product', { component: ProductCard, ...PriceComponentActions });\n\nexport default ProductComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport {\n IPriceComponentResources,\n ISwatchItem,\n PriceComponent,\n ProductComponentSwatchComponent,\n RatingComponent\n} from '@msdyn365-commerce/components';\nimport {\n getCatalogId,\n IAny,\n IComponent,\n IComponentProps,\n ICoreContext,\n IGeneric,\n IGridSettings,\n IImageData,\n IImageSettings,\n Image,\n msdyn365Commerce\n} from '@msdyn365-commerce/core';\nimport {\n AttributeSwatch,\n AttributeValue,\n ProductDimension,\n ProductPrice,\n ProductSearchResult,\n ProductType,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n convertDimensionTypeToProductDimensionType,\n Dictionary,\n DimensionTypes,\n generateImageUrl,\n getProductPageUrlSync,\n IDimensionsApp,\n StringExtensions,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n format,\n getPayloadObject,\n getTelemetryAttributes,\n ITelemetryContent,\n onTelemetryClick\n} from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult; productPrice?: ProductPrice }> {\n className?: string;\n imageSettings?: IImageSettings;\n savingsText?: string;\n freePriceText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n ratingAriaLabel?: string;\n ratingCountAriaLabel?: string;\n allowBack?: boolean;\n telemetryContent?: ITelemetryContent;\n quickViewButton?: React.ReactNode;\n productComparisonButton?: React.ReactNode;\n isEnabledProductDescription?: boolean;\n isPriceMinMaxEnabled?: boolean;\n priceResources?: IPriceComponentResources;\n inventoryLabel?: string;\n dimensionAvailabilities?: IProductsDimensionsAvailabilities[];\n swatchItemAriaLabel?: string;\n}\n\nexport interface IProductComponent extends IComponent {}\n\nconst PriceComponentActions = {};\n\n/**\n * Gets the product page url from the default swatch selected.\n * @param productData - Product card to be rendered.\n * @returns The default color swatch selected if any.\n */\nfunction getDefaultSwatchSelected(coreContext: ICoreContext, productData?: ProductSearchResult): AttributeSwatch | null {\n if (!productData || !productData.AttributeValues) {\n return null;\n }\n\n const siteContext = coreContext as ICoreContext;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n\n const attributeSwatches = productData.AttributeValues.find(\n attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === dimensionToPreSelectInProductCard\n )?.Swatches;\n\n if (!ArrayExtensions.hasElements(attributeSwatches)) {\n return null;\n }\n\n const defaultSwatch = attributeSwatches.find(item => item.IsDefault === true) ?? attributeSwatches[0];\n return defaultSwatch;\n}\n\n/**\n * Gets the product image from the default swatch selected.\n * @param coreContext - Context of the module using the component.\n * @param productData - Product card to be rendered.\n * @returns The product card image url.\n */\nfunction getProductImageUrlFromDefaultSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\n const defaultSwatch = getDefaultSwatchSelected(coreContext, productData);\n const swatchProductImageUrls = defaultSwatch?.ProductImageUrls;\n if (!ArrayExtensions.hasElements(swatchProductImageUrls)) {\n return productData?.PrimaryImageUrl;\n }\n\n return generateImageUrl(swatchProductImageUrls[0], coreContext.request.apiSettings);\n}\n\n/**\n * Updates the product url link to product details page.\n * @param productDetailsPageUrl - Product page url.\n * @param coreContext - Context of the module using the component.\n * @param queryString - Querystring to be added to the URL.\n * @returns The update product page url.\n */\nfunction updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\n const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\n if (sourceUrl.search) {\n sourceUrl.search += `&${queryString}`;\n } else {\n sourceUrl.search += queryString;\n }\n\n const updatedUrl = new URL(sourceUrl.href);\n return updatedUrl.pathname + sourceUrl.search;\n}\n\n/**\n * Gets the react node for product unit of measure display.\n * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\n * @returns The node representing markup for unit of measure component.\n */\nfunction renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\n if (!unitOfMeasure) {\n return null;\n }\n return (\n
\n {unitOfMeasure}\n
\n );\n}\n\n/**\n * Gets the react node for product availability.\n * @param inventoryAvailabilityLabel - The product information.\n * @returns The node representing markup for product availability.\n */\nfunction renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\n if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\n return null;\n }\n\n return (\n
\n {inventoryAvailabilityLabel}\n
\n );\n}\n\n/**\n * Renders product comparison button similar to the quick view button.\n * @param productComparisonButton - React element of the button.\n * @param product - Current product info.\n * @param catalogId - Current catalog.\n * @returns React element for the specific product.\n */\nfunction renderProductComparisonButton(\n productComparisonButton: React.ReactNode,\n product: ProductSearchResult,\n catalogId: number\n): JSX.Element | undefined {\n validateCatalogId(catalogId);\n return React.cloneElement(productComparisonButton as React.ReactElement, { product, catalogId });\n}\n\n/**\n * Gets the product page url from the default swatch selected.\n * @param coreContext - Context of the module using the component.\n * @param productUrl - Product page url for the product card.\n * @param productData - Product card to be rendered.\n * @returns The product card image url.\n */\nfunction getProductPageUrlFromDefaultSwatch(\n coreContext: ICoreContext,\n productUrl: string,\n productData?: ProductSearchResult\n): string | undefined {\n const defaultSwatch = getDefaultSwatchSelected(coreContext, productData);\n if (!defaultSwatch?.SwatchValue) {\n return productUrl;\n }\n\n const siteContext = coreContext as ICoreContext;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n\n const queryStringEncoded = encodeURIComponent(defaultSwatch.SwatchValue);\n const queryString = `${dimensionToPreSelectInProductCard}=${queryStringEncoded}`;\n return updateProductUrl(productUrl, coreContext, queryString);\n}\n\nconst ProductCard: React.FC = ({\n data,\n context,\n imageSettings,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText,\n ratingAriaLabel,\n ratingCountAriaLabel,\n allowBack,\n typeName,\n id,\n telemetryContent,\n quickViewButton,\n productComparisonButton,\n isEnabledProductDescription,\n isPriceMinMaxEnabled,\n priceResources,\n inventoryLabel,\n dimensionAvailabilities,\n swatchItemAriaLabel\n}) => {\n const product = data.product;\n const productPrice = data.productPrice;\n\n let productUrl = getProductPageUrlSync(product?.Name ?? '', product?.RecordId ?? Number.MIN_VALUE, context.actionContext, undefined);\n if (allowBack) {\n productUrl = updateProductUrl(productUrl, context, 'back=true');\n }\n const productImageUrlFromSwatch = getProductImageUrlFromDefaultSwatch(context, product) ?? product?.PrimaryImageUrl;\n const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\n const [productPageUrl, setProductPageUrl] = useState(productPageUrlFromSwatch);\n const [productImageUrl, setProductImageUrl] = useState(productImageUrlFromSwatch);\n React.useEffect(() => {\n setProductPageUrl(productPageUrlFromSwatch);\n setProductImageUrl(productImageUrlFromSwatch);\n }, [productUrl, productPageUrlFromSwatch, productImageUrlFromSwatch]);\n const [selectedSwatchItems] = useState(new Dictionary());\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access -- app context is generic\n const enableStockCheck = context.app.config.enableStockCheck;\n\n const siteContext = context as ICoreContext;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n\n /**\n * Updates the product page and Image url based on swatch selected.\n * @param coreContext - Context of the caller.\n * @param swatchItem - Dimension swatch selected.\n */\n const updatePageAndImageUrl = React.useCallback(\n (coreContext: ICoreContext, swatchItem: ISwatchItem) => {\n const dimensionType = swatchItem.dimensionType;\n selectedSwatchItems.setValue(dimensionType, swatchItem);\n if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\n return;\n }\n const queryString = `${dimensionType}=${swatchItem.value}`;\n let productPageUrlWithSwatch = '';\n if (productPageUrl.includes(dimensionType)) {\n const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\n newUrl.searchParams.delete(dimensionType);\n productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\n } else {\n productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\n }\n setProductPageUrl(productPageUrlWithSwatch);\n if (dimensionType === dimensionToPreSelectInProductCard) {\n const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls)\n ? swatchItem.productImageUrls[0]\n : undefined;\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\n setProductImageUrl(newImageUrl);\n }\n },\n [selectedSwatchItems, context, productPageUrl]\n );\n\n if (!product) {\n return null;\n }\n\n /**\n * Checks if rendering the particular dimensions is allowed for product card.\n * @param dimensionType - Dimension to be displayed.\n * @returns Updates the state with new product page url.\n */\n function shouldDisplayDimension(dimensionType: string): boolean {\n const dimensionsContext = context as ICoreContext;\n const dimensionsToDisplayOnProductCard = dimensionsContext.app.config.dimensionsInProductCard;\n return (\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n dimensionsToDisplayOnProductCard.includes(dimensionType.toLocaleLowerCase() as DimensionTypes)\n );\n }\n\n /**\n * Gets the react node for product dimension as swatch.\n * @param attributeValues - Attribute value property from product.\n * @returns The node representing markup for unit of measure component.\n */\n function renderProductDimensions(attributeValues?: AttributeValue[]): JSX.Element | null {\n if (!attributeValues) {\n return null;\n }\n\n return (\n
\n {attributeValues.map((item: AttributeValue) => {\n const dimensionTypeValue = item.KeyName?.toLocaleLowerCase() ?? '';\n if (!shouldDisplayDimension(dimensionTypeValue)) {\n return null;\n }\n\n const siteContext = context as ICoreContext;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n const dimensionType = dimensionTypeValue as DimensionTypes;\n const swatches =\n item.Swatches?.map(swatchItem => {\n return {\n itemId: `${item.RecordId ?? ''}-${dimensionTypeValue}-${swatchItem.SwatchValue ?? ''}`,\n value: swatchItem.SwatchValue ?? '',\n dimensionType,\n colorHexCode: swatchItem.SwatchColorHexCode,\n imageUrl: swatchItem.SwatchImageUrl,\n productImageUrls: swatchItem.ProductImageUrls,\n isDefault: swatchItem.IsDefault,\n swatchItemAriaLabel: swatchItemAriaLabel ? format(swatchItemAriaLabel, dimensionType) : '',\n isDisabled:\n enableStockCheck &&\n dimensionAvailabilities?.find(\n dimensionAvailability => dimensionAvailability.value === (swatchItem.SwatchValue ?? '')\n )?.isDisabled\n };\n }) ?? [];\n if (\n dimensionType === dimensionToPreSelectInProductCard &&\n ArrayExtensions.hasElements(swatches) &&\n !swatches.some(swatch => swatch.isDefault)\n ) {\n swatches[0].isDefault = true;\n }\n return (\n \n );\n })}\n
\n );\n }\n\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\n if (quickview === null) {\n return undefined;\n }\n const selectedDimensions: ProductDimension[] = selectedSwatchItems.getValues().map(swatches => {\n return {\n DimensionTypeValue: convertDimensionTypeToProductDimensionType(swatches.dimensionType),\n DimensionValue: {\n RecordId: 0,\n Value: swatches.value\n }\n };\n });\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item, selectedDimensions });\n }\n\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.RecordId.toString());\n\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\n const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\n\n return (\n <>\n {isEnabledProductDescription ? (\n \n
\n
\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n productImageUrl,\n product.PrimaryImageUrl,\n product.Name,\n context\n )}\n
\n
\n

{product.Name}

\n {renderPrice(\n context,\n typeName,\n id,\n product,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText,\n isPriceMinMaxEnabled,\n priceResources,\n productPrice\n )}\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\n {renderDescription(product.Description)}\n
\n
\n \n ) : (\n \n
\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n productImageUrl,\n product.PrimaryImageUrl,\n product.Name,\n context\n )}\n
\n
\n

{product.Name}

\n {renderPrice(\n context,\n typeName,\n id,\n product,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText,\n isPriceMinMaxEnabled,\n priceResources,\n productPrice\n )}\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\n
\n \n )}\n {renderProductDimensions(product.AttributeValues)}\n {!context.app.config.hideRating &&\n renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel, ratingCountAriaLabel)}\n {renderProductAvailability(inventoryLabel)}\n {quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\n {productComparisonButton && renderProductComparisonButton(productComparisonButton, product, getCatalogId(context.request))}\n \n );\n};\n\nfunction renderLabel(\n name?: string,\n price?: string,\n rating?: number,\n ratingAriaLabelText?: string,\n reviewCount?: number,\n ratingCountAriaLabelText?: string\n): string {\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\n return `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${\n reviewCountArialableText ? ` ${reviewCountArialableText}` : ''\n }`;\n}\n\nfunction renderDescription(description?: string): JSX.Element | null {\n return

{description}

;\n}\n\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\n if (rating && ratingAriaLabel) {\n const roundedRating = rating.toFixed(2);\n return format(ratingAriaLabel || '', roundedRating, '5');\n }\n return '';\n}\n\nfunction getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\n if (reviewCount && ratingCountAriaLabelText) {\n return format(ratingCountAriaLabelText || '', reviewCount);\n }\n return '';\n}\n\nfunction renderRating(\n coreContext: ICoreContext,\n moduleTypeName: string,\n moduleId: string,\n avgRating?: number,\n totalRatings?: number,\n ariaLabel?: string,\n ratingCountAriaLabel?: string\n): JSX.Element | null {\n if (!avgRating) {\n return null;\n }\n\n const numberRatings = totalRatings?.toString() || undefined;\n const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\n const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\n\n return (\n \n );\n}\n\nfunction renderPrice(\n context: ICoreContext,\n typeName: string,\n id: string,\n productSearchResult: ProductSearchResult,\n savingsText?: string,\n freePriceText?: string,\n originalPriceText?: string,\n currentPriceText?: string,\n isPriceMinMaxEnabled?: boolean,\n priceResources?: IPriceComponentResources,\n productPrice?: ProductPrice\n): JSX.Element | null {\n const product: SimpleProduct = {\n // This is a fake product. The product type is only used for price component to determine if it should show price range or not.\n ProductTypeValue: productSearchResult.IsMasterProduct ? ProductType.Master : ProductType.Standalone\n } as SimpleProduct;\n\n const price: ProductPrice = productPrice ?? {\n BasePrice: productSearchResult.BasePrice,\n AdjustedPrice: productSearchResult.Price,\n CustomerContextualPrice: productSearchResult.Price,\n MaxVariantPrice: productSearchResult.MaxVariantPrice ? productSearchResult.MaxVariantPrice : productSearchResult.Price,\n MinVariantPrice: productSearchResult.MinVariantPrice ? productSearchResult.MinVariantPrice : productSearchResult.Price\n };\n\n return (\n \n );\n}\n\nfunction renderProductPlacementImage(\n imageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n fallbackImageUrl?: string,\n altText?: string,\n context?: ICoreContext>\n): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment -- Site level config can be of any type.\n const contextConfig = context?.app.config?.placeholderImageName;\n const emptyPlaceHolderImage = contextConfig as string;\n let fallbackImageSource = fallbackImageUrl;\n if (emptyPlaceHolderImage && fallbackImageUrl) {\n fallbackImageSource = `${fallbackImageUrl},${emptyPlaceHolderImage}`;\n }\n const img: IImageData = {\n src: imageUrl,\n altText: altText ? altText : '',\n fallBackSrc: fallbackImageSource\n };\n const imageProps = {\n gridSettings,\n imageSettings\n };\n imageProps.imageSettings.cropFocalRegion = true;\n return (\n \n );\n}\n\nexport const ProductComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride<\n IProductComponent\n>('Product', { component: ProductCard, ...PriceComponentActions });\n\nexport default ProductComponent;\n"],"names":["getDefaultColorSwatchSelected","productData","_colorAttribute$Swatc","_colorAttribute$Swatc2","_colorAttribute$Swatc3","AttributeValues","colorAttribute","find","attributeValue","_attributeValue$KeyNa","KeyName","toLocaleLowerCase","DimensionTypes","color","defaultSwatch","Swatches","item","IsDefault","updateProductUrl","productDetailsPageUrl","coreContext","queryString","sourceUrl","URL","request","apiSettings","baseUrl","search","href","pathname","renderProductUnitOfMeasure","unitOfMeasure","React","className","renderLabel","name","price","rating","ratingAriaLabelText","reviewCount","ratingCountAriaLabelText","reviewCountArialableText","getReviewAriaLabel","getRatingAriaLabel","ratingAriaLabel","roundedRating","toFixed","format","renderPrice","context","typeName","id","basePrice","adjustedPrice","savingsText","freePriceText","originalPriceText","currentPriceText","isPriceMinMaxEnabled","priceResources","BasePrice","AdjustedPrice","CustomerContextualPrice","PriceComponent","data","renderProductPlacementImage","imageSettings","gridSettings","imageUrl","fallbackImageUrl","altText","_context$app$config","contextConfig","app","config","placeholderImageName","fallbackImageSource","img","src","fallBackSrc","imageProps","cropFocalRegion","Image","Object","assign","requestContext","actionContext","loadFailureBehavior","bypassHideOnFailure","ProductComponent","msdyn365Commerce","createComponentOverride","_objectSpread","component","_ref","_product$Name","_product$RecordId","_getProductImageUrlFr","_getProductPageUrlFro","ratingCountAriaLabel","allowBack","telemetryContent","quickViewButton","productComparisonButton","isEnabledProductDescription","inventoryLabel","dimensionAvailabilities","swatchItemAriaLabel","product","productUrl","getProductPageUrlSync","Name","RecordId","Number","MIN_VALUE","undefined","productImageUrlFromSwatch","dimensionToPreSelectInProductCard","none","PrimaryImageUrl","ArrayExtensions","hasElements","ProductImageUrls","generateImageUrl","getProductImageUrlFromDefaultColorSwatch","productPageUrlFromSwatch","SwatchValue","getProductPageUrlFromDefaultSwatch","productPageUrl","setProductPageUrl","useState","productImageUrl","setProductImageUrl","selectedSwatchItems","Dictionary","enableStockCheck","updatePageAndImageUrl","swatchItem","dimensionType","setValue","StringExtensions","isNullOrWhitespace","value","productPageUrlWithSwatch","includes","newUrl","searchParams","delete","toString","swatchProductImageUrl","productImageUrls","newImageUrl","payLoad","getPayloadObject","attribute","getTelemetryAttributes","isUnitOfMeasureEnabled","unitOfMeasureDisplayType","onClick","onTelemetryClick","cultureFormatter","formatCurrency","Price","AverageRating","TotalRatings","DefaultUnitOfMeasure","description","Description","attributeValues","map","_item$KeyName$toLocal","_item$KeyName","_item$Swatches$map","_item$Swatches","dimensionTypeValue","dimensionsToDisplayOnProductCard","dimensionsInProductCard","shouldDisplayDimension","swatches","_item$RecordId","_swatchItem$SwatchVal","_swatchItem$SwatchVal2","_dimensionAvailabilit","itemId","colorHexCode","SwatchColorHexCode","SwatchImageUrl","isDefault","isDisabled","dimensionAvailability","_swatchItem$SwatchVal3","some","swatch","ProductComponentSwatchComponent","onSelectDimension","key","hideRating","moduleTypeName","moduleId","avgRating","totalRatings","ariaLabel","numberRatings","RatingComponent","ratingCount","readOnly","renderRating","inventoryAvailabilityLabel","quickview","selectedDimensions","getValues","DimensionTypeValue","convertDimensionTypeToProductDimensionType","DimensionValue","Value","selectedProductId","renderQuickView","catalogId","renderProductComparisonButton","getCatalogId","getDefaultSwatchSelected","_productData$Attribut","_attributeSwatches$fi","attributeSwatches","productSearchResult","productPrice","ProductTypeValue","IsMasterProduct","ProductType","Master","Standalone","MaxVariantPrice","MinVariantPrice","swatchProductImageUrls","getProductImageUrlFromDefaultSwatch","encodeURIComponent","validateCatalogId"],"sourceRoot":""}