{"version":3,"file":"static/js/3c33faf2d1e22813f842.bundle.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/themes/bluecrest/views/components/product.component.tsx?0d2a","webpack://Msdyn365.Commerce.Online/./src/themes/bluecrest/views/components/addtocart.component.tsx?270a","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/components/product.component.tsx?fd23"],"sourcesContent":["/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport { IPriceComponentResources, ISwatchItem, ProductComponentSwatchComponent, RatingComponent } from '@msdyn365-commerce/components';\r\nimport {\r\n getCatalogId,\r\n IAny,\r\n IComponent,\r\n IComponentProps,\r\n ICoreContext,\r\n IGeneric,\r\n IGridSettings,\r\n IImageData,\r\n IImageSettings,\r\n Image,\r\n msdyn365Commerce,\r\n getUrlSync\r\n} from '@msdyn365-commerce/core';\r\nimport {\r\n AttributeSwatch,\r\n AttributeValue,\r\n CommerceProperty,\r\n ProductDimension,\r\n ProductPrice,\r\n ProductSearchResult,\r\n ProductType\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n convertDimensionTypeToProductDimensionType,\r\n Dictionary,\r\n DimensionTypes,\r\n generateImageUrl,\r\n getProductPageUrlSync,\r\n IDimensionsApp,\r\n StringExtensions,\r\n validateCatalogId\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n format,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n ITelemetryContent,\r\n onTelemetryClick,\r\n IncrementalQuantity\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport React, { useState } from 'react';\r\nimport AddToCartComponent from './addtocart.component';\r\nimport { ISearchResultContainerResources } from '../../definition-extensions/search-result-container.ext.props.autogenerated';\r\n\r\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult; productPrice?: ProductPrice }> {\r\n className?: string;\r\n productPrices?: ProductPrice[];\r\n imageSettings?: IImageSettings;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n ratingAriaLabel?: string;\r\n ratingCountAriaLabel?: string;\r\n allowBack?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n quickViewButton?: React.ReactNode;\r\n productComparisonButton?: React.ReactNode;\r\n isEnabledProductDescription?: boolean;\r\n isPriceMinMaxEnabled?: boolean;\r\n priceResources?: IPriceComponentResources;\r\n inventoryLabel?: string;\r\n dimensionAvailabilities?: IProductsDimensionsAvailabilities[];\r\n swatchItemAriaLabel?: string;\r\n loginRegisterResource?: string;\r\n resources?: ISearchResultContainerResources;\r\n}\r\n\r\nexport interface IProductComponent extends IComponent {}\r\n\r\nconst PriceComponentActions = {};\r\n\r\n/**\r\n * Gets the product page url from the default swatch selected.\r\n * @param productData - Product card to be rendered.\r\n * @returns The default color swatch selected if any.\r\n */\r\nfunction getDefaultSwatchSelected(coreContext: ICoreContext, productData?: ProductSearchResult): AttributeSwatch | null {\r\n if (!productData || !productData.AttributeValues) {\r\n return null;\r\n }\r\n\r\n const siteContext = coreContext as ICoreContext;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n\r\n const attributeSwatches = productData.AttributeValues.find(\r\n attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === dimensionToPreSelectInProductCard\r\n )?.Swatches;\r\n\r\n if (!ArrayExtensions.hasElements(attributeSwatches)) {\r\n return null;\r\n }\r\n\r\n const defaultSwatch = attributeSwatches.find(item => item.IsDefault === true) ?? attributeSwatches[0];\r\n return defaultSwatch;\r\n}\r\n\r\n/**\r\n * Gets the product image from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\nfunction getProductImageUrlFromDefaultSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\r\n const defaultSwatch = getDefaultSwatchSelected(coreContext, productData);\r\n const swatchProductImageUrls = defaultSwatch?.ProductImageUrls;\r\n if (!ArrayExtensions.hasElements(swatchProductImageUrls)) {\r\n return productData?.PrimaryImageUrl;\r\n }\r\n\r\n return generateImageUrl(swatchProductImageUrls[0], coreContext.request.apiSettings);\r\n}\r\n\r\n/**\r\n * Updates the product url link to product details page.\r\n * @param productDetailsPageUrl - Product page url.\r\n * @param coreContext - Context of the module using the component.\r\n * @param queryString - Querystring to be added to the URL.\r\n * @returns The update product page url.\r\n */\r\nfunction updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\r\n const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\r\n if (sourceUrl.search) {\r\n sourceUrl.search += `&${queryString}`;\r\n } else {\r\n sourceUrl.search += queryString;\r\n }\r\n\r\n const updatedUrl = new URL(sourceUrl.href);\r\n return updatedUrl.pathname + sourceUrl.search;\r\n}\r\n\r\n/**\r\n * Gets the react node for product unit of measure display.\r\n * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n\r\n/**\r\n * Gets the react node for product availability.\r\n * @param inventoryAvailabilityLabel - The product information.\r\n * @returns The node representing markup for product availability.\r\n */\r\nfunction renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\r\n if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n {inventoryAvailabilityLabel}\r\n
\r\n );\r\n}\r\n\r\n/**\r\n * Renders product comparison button similar to the quick view button.\r\n * @param productComparisonButton - React element of the button.\r\n * @param product - Current product info.\r\n * @param catalogId - Current catalog.\r\n * @returns React element for the specific product.\r\n */\r\nfunction renderProductComparisonButton(\r\n productComparisonButton: React.ReactNode,\r\n product: ProductSearchResult,\r\n catalogId: number\r\n): JSX.Element | undefined {\r\n validateCatalogId(catalogId);\r\n return React.cloneElement(productComparisonButton as React.ReactElement, { product, catalogId });\r\n}\r\n\r\n/**\r\n * Gets the product page url from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productUrl - Product page url for the product card.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\nfunction getProductPageUrlFromDefaultSwatch(\r\n coreContext: ICoreContext,\r\n productUrl: string,\r\n productData?: ProductSearchResult\r\n): string | undefined {\r\n const defaultSwatch = getDefaultSwatchSelected(coreContext, productData);\r\n if (!defaultSwatch?.SwatchValue) {\r\n return productUrl;\r\n }\r\n\r\n const siteContext = coreContext as ICoreContext;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n\r\n const queryStringEncoded = encodeURIComponent(defaultSwatch.SwatchValue);\r\n const queryString = `${dimensionToPreSelectInProductCard}=${queryStringEncoded}`;\r\n return updateProductUrl(productUrl, coreContext, queryString);\r\n}\r\n\r\nconst ProductCard: React.FC = ({\r\n data,\r\n context,\r\n imageSettings,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText,\r\n ratingAriaLabel,\r\n ratingCountAriaLabel,\r\n allowBack,\r\n typeName,\r\n id,\r\n productPrices,\r\n telemetryContent,\r\n quickViewButton,\r\n productComparisonButton,\r\n isEnabledProductDescription,\r\n isPriceMinMaxEnabled,\r\n priceResources,\r\n inventoryLabel,\r\n dimensionAvailabilities,\r\n swatchItemAriaLabel,\r\n loginRegisterResource,\r\n resources\r\n}) => {\r\n const product = data.product;\r\n // Customization to see if user is authenticated and use it where we need to hide price\r\n const isAuthenticated = context?.request?.user?.isAuthenticated;\r\n const user = context?.request?.user;\r\n let productUrl = getProductPageUrlSync(product?.Name ?? '', product?.RecordId ?? Number.MIN_VALUE, context.actionContext, undefined);\r\n if (allowBack) {\r\n productUrl = updateProductUrl(productUrl, context, 'back=true');\r\n }\r\n const productImageUrlFromSwatch = getProductImageUrlFromDefaultSwatch(context, product) ?? product?.PrimaryImageUrl;\r\n const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\r\n const [productPageUrl, setProductPageUrl] = useState(productPageUrlFromSwatch);\r\n const [productImageUrl, setProductImageUrl] = useState(productImageUrlFromSwatch);\r\n React.useEffect(() => {\r\n setProductPageUrl(productPageUrlFromSwatch);\r\n setProductImageUrl(productImageUrlFromSwatch);\r\n }, [productUrl, productPageUrlFromSwatch, productImageUrlFromSwatch]);\r\n const [selectedSwatchItems] = useState(new Dictionary());\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access -- app context is generic\r\n const enableStockCheck = context.app.config.enableStockCheck;\r\n\r\n const siteContext = context as ICoreContext;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n\r\n /**\r\n * Updates the product page and Image url based on swatch selected.\r\n * @param coreContext - Context of the caller.\r\n * @param swatchItem - Dimension swatch selected.\r\n */\r\n const updatePageAndImageUrl = React.useCallback(\r\n (coreContext: ICoreContext, swatchItem: ISwatchItem) => {\r\n const dimensionType = swatchItem.dimensionType;\r\n selectedSwatchItems.setValue(dimensionType, swatchItem);\r\n if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\r\n return;\r\n }\r\n const queryString = `${dimensionType}=${swatchItem.value}`;\r\n let productPageUrlWithSwatch = '';\r\n if (productPageUrl.includes(dimensionType)) {\r\n const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\r\n newUrl.searchParams.delete(dimensionType);\r\n productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\r\n } else {\r\n productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\r\n }\r\n setProductPageUrl(productPageUrlWithSwatch);\r\n if (dimensionType === dimensionToPreSelectInProductCard) {\r\n const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls)\r\n ? swatchItem.productImageUrls[0]\r\n : undefined;\r\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\r\n setProductImageUrl(newImageUrl);\r\n }\r\n },\r\n [selectedSwatchItems, context, productPageUrl]\r\n );\r\n\r\n if (!product) {\r\n return null;\r\n }\r\n\r\n /**\r\n * Checks if rendering the particular dimensions is allowed for product card.\r\n * @param dimensionType - Dimension to be displayed.\r\n * @returns Updates the state with new product page url.\r\n */\r\n function shouldDisplayDimension(dimensionType: string): boolean {\r\n const dimensionsContext = context as ICoreContext;\r\n const dimensionsToDisplayOnProductCard = dimensionsContext.app.config.dimensionsInProductCard;\r\n return (\r\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\r\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\r\n dimensionsToDisplayOnProductCard.includes(dimensionType.toLocaleLowerCase() as DimensionTypes)\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product dimension as swatch.\r\n * @param attributeValues - Attribute value property from product.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n function renderProductDimensions(attributeValues?: AttributeValue[]): JSX.Element | null {\r\n if (!attributeValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n {attributeValues.map((item: AttributeValue) => {\r\n const dimensionTypeValue = item.KeyName?.toLocaleLowerCase() ?? '';\r\n if (!shouldDisplayDimension(dimensionTypeValue)) {\r\n return null;\r\n }\r\n\r\n const siteContext = context as ICoreContext;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n const dimensionType = dimensionTypeValue as DimensionTypes;\r\n const swatches =\r\n item.Swatches?.map(swatchItem => {\r\n return {\r\n itemId: `${item.RecordId ?? ''}-${dimensionTypeValue}-${swatchItem.SwatchValue ?? ''}`,\r\n value: swatchItem.SwatchValue ?? '',\r\n dimensionType,\r\n colorHexCode: swatchItem.SwatchColorHexCode,\r\n imageUrl: swatchItem.SwatchImageUrl,\r\n productImageUrls: swatchItem.ProductImageUrls,\r\n isDefault: swatchItem.IsDefault,\r\n swatchItemAriaLabel: swatchItemAriaLabel ? format(swatchItemAriaLabel, dimensionType) : '',\r\n isDisabled:\r\n enableStockCheck &&\r\n dimensionAvailabilities?.find(\r\n dimensionAvailability => dimensionAvailability.value === (swatchItem.SwatchValue ?? '')\r\n )?.isDisabled\r\n };\r\n }) ?? [];\r\n if (\r\n dimensionType === dimensionToPreSelectInProductCard &&\r\n ArrayExtensions.hasElements(swatches) &&\r\n !swatches.some(swatch => swatch.isDefault)\r\n ) {\r\n swatches[0].isDefault = true;\r\n }\r\n return (\r\n \r\n );\r\n })}\r\n
\r\n );\r\n }\r\n\r\n function renderSupersededProductText(extensionProps: CommerceProperty[] | undefined): JSX.Element | null {\r\n if (!extensionProps) {\r\n return null;\r\n }\r\n\r\n const supersededItemId = extensionProps ? extensionProps.find(prop => prop.Key === 'supersededItemId')?.Value?.StringValue : '';\r\n const alternateProductText = extensionProps\r\n ? extensionProps.find(prop => prop.Key === 'alternateProductText')?.Value?.StringValue\r\n : '';\r\n const supersededProductTextFallBack = context.app.config.supersededProductText;\r\n if (supersededItemId) {\r\n return (\r\n <>\r\n {isAuthenticated ? (\r\n
\r\n {alternateProductText\r\n ? alternateProductText?.replace('{}', supersededItemId)\r\n : supersededProductTextFallBack?.replace('{}', supersededItemId)}\r\n
\r\n ) : (\r\n <>\r\n )}\r\n \r\n );\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n function renderStockCheckProductText(extensionProps: CommerceProperty[] | undefined): JSX.Element | null {\r\n if (!extensionProps) {\r\n return null;\r\n }\r\n\r\n const stockAvailabilityText = extensionProps ? extensionProps.find(prop => prop.Key === 'stockCheckText')?.Value?.StringValue : '';\r\n const stockAvailabilityCode = extensionProps ? extensionProps.find(prop => prop.Key === 'stockCheckCode')?.Value?.StringValue : '';\r\n const stockAvail = stockAvailabilityCode === 'AVAIL';\r\n const stockLa = stockAvailabilityCode === 'LA';\r\n const stockOos = stockAvailabilityCode === 'OOS';\r\n if (stockAvailabilityText) {\r\n return (\r\n <>\r\n {isAuthenticated ? (\r\n \r\n {stockAvailabilityText}\r\n \r\n ) : (\r\n <>\r\n )}\r\n \r\n );\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n const renderConditionalProductAttributes = (\r\n attributeValues?: AttributeValue[],\r\n fallbackText?: string,\r\n attributeKeyName?: string,\r\n attributeKeyNameText?: string,\r\n className?: string\r\n ): JSX.Element | null => {\r\n if (!attributeValues) {\r\n return null;\r\n }\r\n const productAttributeFallbackText = fallbackText && context.app.config[fallbackText];\r\n const isProductAttributeAvailable = attributeValues.find(attribute => attribute.KeyName === attributeKeyName)?.BooleanValue;\r\n const productAttributeText = attributeValues.find(attribute => attribute.KeyName === attributeKeyNameText)?.TextValue;\r\n\r\n if (isProductAttributeAvailable) {\r\n return
{productAttributeText ? productAttributeText : productAttributeFallbackText}
;\r\n }\r\n return null;\r\n };\r\n\r\n const renderDropshipProductText = (attributeValues?: AttributeValue[]): JSX.Element | null => {\r\n return renderConditionalProductAttributes(attributeValues, 'dropshipProductText', 'DropShip', 'DropShipText', 'dropship-item-text');\r\n };\r\n\r\n const renderSpecialOrderProductText = (attributeValues?: AttributeValue[]): JSX.Element | null => {\r\n return renderConditionalProductAttributes(\r\n attributeValues,\r\n 'specialProductText',\r\n 'SpecialOrder',\r\n 'SpecialOrderText',\r\n 'special-item-text'\r\n );\r\n };\r\n\r\n const renderRepairableProductText = (attributeValues?: AttributeValue[]): JSX.Element | null => {\r\n return renderConditionalProductAttributes(\r\n attributeValues,\r\n 'repairableProductText',\r\n 'Repairable',\r\n 'RepairableText',\r\n 'repairable-item-text'\r\n );\r\n };\r\n\r\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\r\n if (quickview === null) {\r\n return undefined;\r\n }\r\n const selectedDimensions: ProductDimension[] = selectedSwatchItems.getValues().map(swatches => {\r\n return {\r\n DimensionTypeValue: convertDimensionTypeToProductDimensionType(swatches.dimensionType),\r\n DimensionValue: {\r\n RecordId: 0,\r\n Value: swatches.value\r\n }\r\n };\r\n });\r\n return (\r\n
\r\n {React.cloneElement(quickview as React.ReactElement, { selectedProductId: item, selectedDimensions })}\r\n
\r\n );\r\n }\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.RecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\r\n let partNo = '';\r\n const productPricesView = (resources: ISearchResultContainerResources): JSX.Element => {\r\n let discount: number = 0;\r\n let DiscountAmount: number = 0;\r\n productPrices\r\n ?.filter(PLProduct => product?.ItemId === PLProduct?.ItemId)\r\n .map(data => {\r\n let discountedPrice: number = data?.BasePrice ?? 0;\r\n let originalPrice: number = data?.CustomerContextualPrice ?? 0;\r\n discount = Number((100 - (originalPrice / discountedPrice) * 100).toFixed(2));\r\n DiscountAmount = data?.DiscountAmount ?? 0;\r\n });\r\n return (\r\n <>\r\n {productPrices\r\n ?.filter(PLProduct => product?.ItemId === PLProduct?.ItemId)\r\n .map(data => {\r\n data.ItemId ? (partNo = data.ItemId) : '';\r\n const basePriceNum = data?.BasePrice?.toFixed(2);\r\n const basePrice = basePriceNum && context.cultureFormatter.formatCurrency(basePriceNum);\r\n const discountedPriceNum = data.CustomerContextualPrice?.toFixed(2);\r\n const discountedPrice = discountedPriceNum && context.cultureFormatter.formatCurrency(discountedPriceNum);\r\n const tradeAgreementPriceNum = data.TradeAgreementPrice?.toFixed(2);\r\n const tradeAgreementPrice =\r\n tradeAgreementPriceNum && context.cultureFormatter.formatCurrency(tradeAgreementPriceNum);\r\n return (\r\n
\r\n {DiscountAmount > 0 ? (\r\n // discountedPrice\r\n //added toFixed(2) to round to 2 values after decimals\r\n //format(swatchItemAriaLabel, dimensionType)\r\n <>\r\n
\r\n {resources.productCardPriceText}\r\n {basePrice}\r\n \r\n {format(resources.productCardDiscountValue, discount)}\r\n \r\n
\r\n
\r\n {resources.productCardYourPriceText}\r\n {discountedPrice}\r\n
\r\n \r\n ) : data.BasePrice !== data.AdjustedPrice &&\r\n data.BasePrice === data.TradeAgreementPrice &&\r\n DiscountAmount === 0 ? (\r\n //adjustedPrice\r\n //added toFixed(2) to round to 2 values after decimals\r\n <>\r\n
\r\n {resources.productCardPriceText}\r\n {basePrice}\r\n
\r\n
\r\n {resources.productCardYourPriceText}\r\n {discountedPrice}\r\n
\r\n \r\n ) : data.BasePrice !== data.TradeAgreementPrice &&\r\n data.BasePrice !== data.AdjustedPrice &&\r\n data.TradeAgreementPrice !== data.AdjustedPrice ? (\r\n //tradeAgreementPrice && adjusted together scenario\r\n //added toFixed(2) to round to 2 values after decimals\r\n <>\r\n
\r\n {resources.productCardPriceText}\r\n {tradeAgreementPrice}\r\n
\r\n
\r\n {resources.productCardYourPriceText}\r\n {discountedPrice}\r\n
\r\n \r\n ) : data.BasePrice !== data.TradeAgreementPrice ? (\r\n //tradeAgreementPrice\r\n //added toFixed(2) to round to 2 values after decimals\r\n
\r\n {resources.productCardPriceText}\r\n {discountedPrice}\r\n
\r\n ) : (\r\n //NormalPrice\r\n //added toFixed(2) to round to 2 values after decimals\r\n
\r\n {resources.productCardPriceText}\r\n {discountedPrice}\r\n
\r\n )}\r\n
\r\n );\r\n })}\r\n \r\n );\r\n };\r\n const productPriceItem = productPrices?.find(item => item.ItemId === product.ItemId);\r\n const defaultImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=240&h=240&m=6', w: 0, h: 0 },\r\n lg: { q: 'w=240&h=240&m=6', w: 0, h: 0 },\r\n xl: { q: 'w=240&h=240&m=6', w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n const maxQuantity = context.app.config.maxQuantityForCartLineItem;\r\n const [currentQuantity, setCurrentQuantity] = React.useState(1);\r\n const maxQuantityText = resources?.productCardMaxQuantityText?.replace('{max}', maxQuantity.toString());\r\n\r\n const onQuantityChange = (value: number) => {\r\n setCurrentQuantity(value);\r\n return true;\r\n };\r\n\r\n return (\r\n <>\r\n
\r\n {isEnabledProductDescription ? (\r\n \r\n
\r\n
\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n context.request.gridSettings,\r\n productImageUrl,\r\n product.PrimaryImageUrl,\r\n product.Name,\r\n context\r\n )}\r\n
\r\n
\r\n

{product.Name}

\r\n {isAuthenticated && resources ? (\r\n productPricesView(resources)\r\n ) : (\r\n \r\n {loginRegisterResource}\r\n \r\n )}\r\n {renderDescription(product.Description)}\r\n
\r\n
\r\n \r\n ) : (\r\n \r\n
\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n context.request.gridSettings,\r\n productImageUrl,\r\n product.PrimaryImageUrl,\r\n product.Name,\r\n context\r\n )}\r\n
\r\n
\r\n

{product.Name}

\r\n {isAuthenticated && resources ? (\r\n productPricesView(resources)\r\n ) : (\r\n \r\n {loginRegisterResource}\r\n \r\n )}\r\n
\r\n \r\n )}\r\n
\r\n {isAuthenticated ? (\r\n
\r\n

\r\n {resources?.productCardPartNoText}\r\n {partNo}\r\n

\r\n {renderRepairableProductText(product.AttributeValues)}\r\n {renderSupersededProductText(product.ExtensionProperties)}\r\n
\r\n ) : (\r\n <>\r\n )}\r\n {renderProductDimensions(product.AttributeValues)}\r\n {!context.app.config.hideRating &&\r\n renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel, ratingCountAriaLabel)}\r\n {renderProductAvailability(inventoryLabel)}\r\n {quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\r\n {productComparisonButton && renderProductComparisonButton(productComparisonButton, product, getCatalogId(context.request))}\r\n {isAuthenticated ? (\r\n
\r\n {renderDropshipProductText(product.AttributeValues)}\r\n {renderSpecialOrderProductText(product.AttributeValues)}\r\n {renderStockCheckProductText(product.ExtensionProperties)}\r\n \r\n {}}\r\n gridSettings={context.request.gridSettings}\r\n imageSettings={defaultImageSettings}\r\n telemetryContent={telemetryContent}\r\n isOrderQuantityLimitsFeatureEnabled={true}\r\n onAdd={() => {}}\r\n />\r\n
\r\n ) : (\r\n <>\r\n )}\r\n \r\n );\r\n};\r\n\r\nfunction renderLabel(\r\n name?: string,\r\n price?: string,\r\n rating?: number,\r\n ratingAriaLabelText?: string,\r\n reviewCount?: number,\r\n ratingCountAriaLabelText?: string\r\n): string {\r\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\r\n return `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${\r\n reviewCountArialableText ? ` ${reviewCountArialableText}` : ''\r\n }`;\r\n}\r\n\r\nfunction renderDescription(description?: string): JSX.Element | null {\r\n return

{description}

;\r\n}\r\n\r\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\r\n if (rating && ratingAriaLabel) {\r\n const roundedRating = rating.toFixed(2);\r\n return format(ratingAriaLabel || '', roundedRating, '5');\r\n }\r\n return '';\r\n}\r\n\r\nfunction getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\r\n if (reviewCount && ratingCountAriaLabelText) {\r\n return format(ratingCountAriaLabelText || '', reviewCount);\r\n }\r\n return '';\r\n}\r\n\r\nfunction renderRating(\r\n coreContext: ICoreContext,\r\n moduleTypeName: string,\r\n moduleId: string,\r\n avgRating?: number,\r\n totalRatings?: number,\r\n ariaLabel?: string,\r\n ratingCountAriaLabel?: string\r\n): JSX.Element | null {\r\n if (!avgRating) {\r\n return null;\r\n }\r\n\r\n const numberRatings = totalRatings?.toString() || undefined;\r\n const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\r\n const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\nfunction renderProductPlacementImage(\r\n imageSettings?: IImageSettings,\r\n gridSettings?: IGridSettings,\r\n imageUrl?: string,\r\n fallbackImageUrl?: string,\r\n altText?: string,\r\n context?: ICoreContext>\r\n): JSX.Element | null {\r\n if (!imageUrl || !gridSettings || !imageSettings) {\r\n return null;\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment -- Site level config can be of any type.\r\n const contextConfig = context?.app.config?.placeholderImageName;\r\n const emptyPlaceHolderImage = contextConfig as string;\r\n let fallbackImageSource = fallbackImageUrl;\r\n if (emptyPlaceHolderImage && fallbackImageUrl) {\r\n fallbackImageSource = `${fallbackImageUrl},${emptyPlaceHolderImage}`;\r\n }\r\n const img: IImageData = {\r\n src: imageUrl,\r\n altText: altText ? altText : '',\r\n fallBackSrc: fallbackImageSource\r\n };\r\n const imageProps = {\r\n gridSettings,\r\n imageSettings\r\n };\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n return (\r\n \r\n );\r\n}\r\n\r\nexport const ProductComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride<\r\n IProductComponent\r\n>('Product', { component: ProductCard, ...PriceComponentActions });\r\n\r\nexport default ProductComponent;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport MsDyn365, {\r\n getCatalogId,\r\n IComponent,\r\n IComponentProps,\r\n IGridSettings,\r\n IImageSettings,\r\n msdyn365Commerce,\r\n TelemetryEvent\r\n} from '@msdyn365-commerce/core';\r\nimport { getCartState, ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\r\nimport {\r\n CartLineValidationResults,\r\n CartsDataActions,\r\n format,\r\n ProductAvailableQuantity,\r\n ProductDimension,\r\n ProductPrice,\r\n ProductsDataActions,\r\n ProductSearchCriteria,\r\n ProductType,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { ErrorNotification, NotificationsManager } from '@msdyn365-commerce-modules/notifications-core';\r\nimport { ArrayExtensions, generateProductImageUrl, ObjectExtensions, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, IPopupProps, ITelemetryContent, Popup } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport React, { useState } from 'react';\r\n\r\nimport {\r\n PriceComponent,\r\n IItemsAddedToCartResources,\r\n ItemsAddedToCartDialogComponent,\r\n ItemSuccessfullyAddedToCartNotification,\r\n MultiItemsSuccessfullyAddedToCartNotification,\r\n OrderDetailsProduct\r\n} from '@msdyn365-commerce/components';\r\n\r\n/**\r\n * Interface for add to cart resources.\r\n */\r\nexport interface IAddToCartResources {\r\n goToCartText: string;\r\n continueShoppingText: string;\r\n closeNotificationLabel: string;\r\n headerItemOneText: string;\r\n headerItemFormatText: string;\r\n headerLinesFormatText?: string;\r\n headerMessageText: string;\r\n freePriceText: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n addedQuantityText: string;\r\n buyAgainNotificationTitle?: string;\r\n buyAgainNotificationCloseAriaLabel?: string;\r\n validationErrorMessage?: string;\r\n oneErrorText?: string;\r\n multiErrorsText?: string;\r\n}\r\n\r\n/**\r\n * Interface for add to cart components props.\r\n */\r\nexport interface IAddToCartComponentProps extends IComponentProps<{ product: SimpleProduct; price?: ProductPrice } | undefined> {\r\n className?: string;\r\n addToCartText: string;\r\n outOfStockText?: string;\r\n disabled?: boolean;\r\n quantity?: number;\r\n navigationUrl?: string;\r\n productAvailability?: ProductAvailableQuantity;\r\n getSelectedProduct?: Promise;\r\n isNavigationToCartPageDisabled?: boolean;\r\n shouldSkipSiteSettings?: boolean;\r\n addToCartArialLabel?: string;\r\n products?: {\r\n productId: number;\r\n quantity: number;\r\n catalogId?: number;\r\n }[];\r\n orderDetailsProducts?: OrderDetailsProduct[];\r\n hasAvailableProducts?: boolean;\r\n imageSettings?: IImageSettings;\r\n gridSettings?: IGridSettings;\r\n\r\n isLoading?: boolean;\r\n isUpdatingDimension?: boolean;\r\n isLoadingDeliveryOptions?: boolean;\r\n isUpdatingDeliveryOptions?: boolean;\r\n isAddServiceItemToCart?: boolean;\r\n isAddEmailDeliveryItemToCart?: boolean;\r\n isPriceKeyedIn?: boolean;\r\n customPriceAmount?: number;\r\n isOrderQuantityLimitsFeatureEnabled?: boolean;\r\n\r\n dialogStrings?: IAddToCartResources;\r\n\r\n telemetryContent?: ITelemetryContent;\r\n\r\n catalogId?: number;\r\n\r\n isCustomPriceSelected?: boolean;\r\n maximumKeyInPrice?: number;\r\n minimumKeyInPrice?: number;\r\n defaultMaximumKeyInPrice?: number;\r\n defaultMinimumKeyInPrice?: number;\r\n isProductQuantityLoading?: boolean;\r\n\r\n onAdd?(result: ICartActionResult): void;\r\n onError?(result: IAddToCartFailureResult): void;\r\n changeUpdatingDimension?(isUpdatingDimension: boolean): void;\r\n changeUpdatingDeliveryOptions?(isUpdatingDeliveryOptions: boolean): void;\r\n}\r\n\r\n/**\r\n * Cart action Failure reason type.\r\n */\r\nexport declare type ICartActionFailureReason =\r\n | 'EMPTYINPUT'\r\n | 'MISSINGDIMENSION'\r\n | 'OUTOFSTOCK'\r\n | 'CARTACTIONFAILED'\r\n | 'INVALIDCUSTOMAMOUNT';\r\n\r\n/**\r\n * Interface for add to cart failure result.\r\n */\r\nexport interface IAddToCartFailureResult {\r\n failureReason: ICartActionFailureReason;\r\n\r\n stockLeft?: number;\r\n cartActionResult?: ICartActionResult;\r\n missingDimensions?: ProductDimension[];\r\n}\r\n\r\n/**\r\n * This setting defines the experience when a product is added to cart. Corresponds to the configuration in Fabrikam.\r\n */\r\nexport enum AddToCartBehavior {\r\n /**\r\n * Navigate to cart page.\r\n */\r\n goToCart = 'goToCart',\r\n\r\n /**\r\n * Show item added to cart popup.\r\n */\r\n showModal = 'showModal',\r\n\r\n /**\r\n * Show mini cart popup.\r\n */\r\n showMiniCart = 'showMiniCart',\r\n\r\n /**\r\n * Show item added to cart notification.\r\n */\r\n showNotification = 'showNotification',\r\n\r\n /**\r\n * Do nothing and stay on the page.\r\n */\r\n nothing = 'nothing'\r\n}\r\n\r\nconst zero = 0;\r\nconst defaultQuantity = 1;\r\n\r\n/**\r\n * The propagate result.\r\n * @param props -- The add to cart component props.\r\n * @param result -- The cart action result.\r\n */\r\nconst propagateResult = (props: IAddToCartComponentProps, result: ICartActionResult): void => {\r\n if (props.onAdd) {\r\n props.onAdd(result);\r\n }\r\n};\r\n\r\n/**\r\n * The propagate error.\r\n * @param props -- The add to cart component props.\r\n * @param result -- The add to cart failure result.\r\n */\r\nconst propagateError = (props: IAddToCartComponentProps, result: IAddToCartFailureResult): void => {\r\n if (props.onError) {\r\n props.onError(result);\r\n }\r\n};\r\n\r\n/**\r\n * Retrieves add to cart input from the component props.\r\n * @param props - Add to cart component props.\r\n * @returns Add to cart input.\r\n */\r\nconst getAddToCartInputFromProps = async (props: IAddToCartComponentProps) => {\r\n const products = props.orderDetailsProducts?.filter(product => !ObjectExtensions.isNullOrUndefined(product.simpleProduct));\r\n const input = products?.map(product => {\r\n return {\r\n product: product.simpleProduct!,\r\n count: ObjectExtensions.isNullOrUndefined(product.salesLine.Quantity) ? defaultQuantity : product.salesLine.Quantity,\r\n catalogId: product.salesLine.CatalogId\r\n };\r\n });\r\n\r\n if (ArrayExtensions.hasElements(input)) {\r\n return input;\r\n }\r\n\r\n if (ArrayExtensions.hasElements(props.products)) {\r\n const actionContext = props.context.actionContext;\r\n const apiSettings = actionContext.requestContext.apiSettings;\r\n\r\n const catalogId = props.catalogId ?? getCatalogId(props.context.actionContext.requestContext);\r\n validateCatalogId(catalogId);\r\n\r\n const searchCriteriaInput: ProductSearchCriteria = {\r\n Context: {\r\n ChannelId: apiSettings.channelId,\r\n CatalogId: catalogId\r\n },\r\n IncludeAttributes: false,\r\n Ids: props.products.map(product => product.productId)\r\n };\r\n\r\n const searchResult = await ProductsDataActions.searchByCriteriaAsync({ callerContext: actionContext }, searchCriteriaInput);\r\n const productSearchResultsWithImages = searchResult.map(productSearchResult => {\r\n const newProductSearchResult = { ...productSearchResult };\r\n const newImageUrl = generateProductImageUrl(newProductSearchResult, apiSettings);\r\n\r\n if (newImageUrl) {\r\n newProductSearchResult.PrimaryImageUrl = newImageUrl;\r\n }\r\n\r\n return newProductSearchResult;\r\n });\r\n\r\n return props.products.map(item => {\r\n const productData = productSearchResultsWithImages.find(product => product.RecordId === item.productId);\r\n let simpleProduct: SimpleProduct;\r\n if (productData) {\r\n simpleProduct = {\r\n ...productData,\r\n ProductTypeValue: ProductType.Variant,\r\n AdjustedPrice: productData.Price,\r\n BasePrice: productData.BasePrice ?? productData.Price\r\n };\r\n } else {\r\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Cast to simple product since only record id is available.\r\n simpleProduct = {\r\n RecordId: item.productId\r\n } as SimpleProduct;\r\n }\r\n\r\n return {\r\n product: simpleProduct,\r\n count: item.quantity,\r\n catalogId: item.catalogId\r\n };\r\n });\r\n }\r\n\r\n if (props.data?.product) {\r\n return [\r\n {\r\n product: props.data.product,\r\n count: props.quantity ?? defaultQuantity,\r\n catalogId: props.catalogId\r\n }\r\n ];\r\n }\r\n\r\n return [];\r\n};\r\n\r\n/**\r\n * Add one item to cart when it is not buy again.\r\n * @param props -- The props.\r\n * @param setDisabled -- The set disable call back.\r\n * @param openModal -- The open modal call back.\r\n */\r\nconst addOneItemToCart = async (\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n openModal: (opened: boolean) => void\r\n): Promise => {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n const addToCartBehavior = props.context.app.config.addToCartBehavior;\r\n const data = props.data;\r\n\r\n const addToCartInput = await getAddToCartInputFromProps(props);\r\n const product = addToCartInput[0].product;\r\n const quantity = addToCartInput[0].count;\r\n\r\n const cartState = await getCartState(props.context.actionContext);\r\n const addToCartResult = await cartState.addProductToCart({\r\n product,\r\n count: quantity,\r\n availableQuantity: props.productAvailability?.AvailableQuantity,\r\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: props.isOrderQuantityLimitsFeatureEnabled },\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n enableStockCheck: props.context.app.config.enableStockCheck,\r\n isPriceKeyedIn: props.isPriceKeyedIn,\r\n customPrice: props.isPriceKeyedIn ? props.customPriceAmount : undefined,\r\n isAddEmailDeliveryItemToCart: props.isAddEmailDeliveryItemToCart,\r\n shouldSkipSiteSettings: props.shouldSkipSiteSettings,\r\n catalogId: addToCartInput[0].catalogId\r\n });\r\n\r\n if (addToCartResult.status === 'SUCCESS') {\r\n if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showModal) {\r\n setDisabled(false);\r\n openModal(true);\r\n } else if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showNotification) {\r\n setDisabled(false);\r\n const notification = new ItemSuccessfullyAddedToCartNotification(\r\n props.context,\r\n props.dialogStrings,\r\n props.imageSettings,\r\n props.gridSettings,\r\n product,\r\n data?.price,\r\n quantity,\r\n props.navigationUrl,\r\n props.telemetryContent!,\r\n props.id,\r\n props.typeName\r\n );\r\n NotificationsManager.instance().addNotification(notification);\r\n } else if (\r\n MsDyn365.isBrowser &&\r\n props.navigationUrl &&\r\n !props.isNavigationToCartPageDisabled &&\r\n (addToCartBehavior === undefined || addToCartBehavior === AddToCartBehavior.goToCart)\r\n ) {\r\n window.location.assign(props.navigationUrl);\r\n } else {\r\n setDisabled(false);\r\n }\r\n propagateResult(props, addToCartResult);\r\n } else {\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n addToCartResult.errorDetails?.LocalizedMessage ?? 'Add to cart failed',\r\n props.dialogStrings?.closeNotificationLabel ?? ''\r\n )\r\n );\r\n\r\n propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: addToCartResult });\r\n setDisabled(false);\r\n }\r\n};\r\n\r\n/**\r\n * Callback to handle success of adding to cart.\r\n * @param props - Add to cart component props.\r\n * @param setDisabled - Callback to update disabled state of the component.\r\n * @param setItemsAddedToCartDialogOpen - Callback to update disabled state of the component.\r\n * @param setErrorMessage - Callback to update error message state of the component.\r\n * @param cartState - Current cart state.\r\n * @param addToCartInput - Input used for adding to cart.\r\n * @param addToCartResult - Result of adding to cart.\r\n */\r\nconst handleAddItemsToCartSuccess = async (\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\r\n setErrorMessage: (message: string) => void,\r\n cartState: ICartState,\r\n addToCartInput: {\r\n product: SimpleProduct;\r\n count: number;\r\n }[],\r\n addToCartResult: ICartActionResult\r\n) => {\r\n // Validate cart for line errors.\r\n const validationResult: CartLineValidationResults = await CartsDataActions.validateForCheckoutAsync(\r\n { callerContext: props.context.actionContext, bypassCache: 'none' },\r\n cartState.cart.Id,\r\n cartState.cart.Version\r\n );\r\n const errorCount = (validationResult.ValidationFailuresByCartLines ?? []).length;\r\n const singleErrorCount = 1;\r\n const errorText = errorCount === singleErrorCount ? props.dialogStrings?.oneErrorText : props.dialogStrings?.multiErrorsText;\r\n const errorMessage =\r\n errorCount > zero ? format(props.dialogStrings?.validationErrorMessage ?? '', errorCount.toString(), errorText) : '';\r\n\r\n setErrorMessage(errorMessage);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n const addToCartBehavior = props.context.app.config.addToCartBehavior;\r\n\r\n if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showModal) {\r\n setDisabled(false);\r\n setItemsAddedToCartDialogOpen(true);\r\n } else if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showNotification) {\r\n setDisabled(false);\r\n const itemsAddedResource: IItemsAddedToCartResources = {\r\n viewCartButtonText: props.dialogStrings.goToCartText,\r\n closeButtonLabel: props.dialogStrings.closeNotificationLabel,\r\n itemsAddedToCartHeaderText: props.dialogStrings.headerMessageText,\r\n itemsAddedToCartFormatText: props.dialogStrings.headerItemFormatText,\r\n linesAddedToCartFormatText: props.dialogStrings.headerLinesFormatText ?? '{0}',\r\n itemsAddedValidationErrorMessage: errorMessage\r\n };\r\n\r\n const notification = new MultiItemsSuccessfullyAddedToCartNotification(\r\n props.context,\r\n itemsAddedResource,\r\n props.imageSettings,\r\n props.gridSettings,\r\n addToCartInput,\r\n props.navigationUrl,\r\n props.telemetryContent!,\r\n props.id,\r\n props.typeName\r\n );\r\n NotificationsManager.instance().addNotification(notification);\r\n } else if (\r\n MsDyn365.isBrowser &&\r\n props.navigationUrl &&\r\n !props.isNavigationToCartPageDisabled &&\r\n (addToCartBehavior === undefined || addToCartBehavior === AddToCartBehavior.goToCart)\r\n ) {\r\n window.location.assign(props.navigationUrl);\r\n } else {\r\n setDisabled(false);\r\n }\r\n propagateResult(props, addToCartResult);\r\n};\r\n\r\n/**\r\n * Add one or multi item to cart from buy again.\r\n * @param props -- The props.\r\n * @param setDisabled -- The set disable call back.\r\n * @param setItemsAddedToCartDialogOpen -- The open modal call back.\r\n * @param setErrorMessage -- The set error message call back.\r\n */\r\nconst addItemsToCart = async (\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\r\n setErrorMessage: (message: string) => void\r\n): Promise => {\r\n const addToCartInput = await getAddToCartInputFromProps(props);\r\n\r\n if (!ArrayExtensions.hasElements(addToCartInput)) {\r\n return;\r\n }\r\n\r\n const cartState = await getCartState(props.context.actionContext);\r\n const addToCartResult = await cartState.addProductsToCart(addToCartInput);\r\n\r\n if (addToCartResult.status === 'SUCCESS') {\r\n await handleAddItemsToCartSuccess(\r\n props,\r\n setDisabled,\r\n setItemsAddedToCartDialogOpen,\r\n setErrorMessage,\r\n cartState,\r\n addToCartInput,\r\n addToCartResult\r\n );\r\n } else {\r\n if (props.dialogStrings?.buyAgainNotificationTitle) {\r\n // For buy again show simple error notification.\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n props.dialogStrings.buyAgainNotificationTitle,\r\n props.dialogStrings.buyAgainNotificationCloseAriaLabel ?? ''\r\n )\r\n );\r\n } else {\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n addToCartResult.errorDetails?.LocalizedMessage ?? 'Add to cart failed',\r\n props.dialogStrings?.closeNotificationLabel ?? ''\r\n )\r\n );\r\n }\r\n\r\n propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: addToCartResult });\r\n setDisabled(false);\r\n }\r\n};\r\n\r\n/**\r\n * Interface for add to cart component.\r\n */\r\nexport interface IAddtoCartComponent extends IComponent {\r\n onClick(): (event: React.MouseEvent, props: IAddToCartComponentProps) => void;\r\n}\r\n\r\n/**\r\n * On click function.\r\n * @param _event - The mouse event.\r\n * @param props - The props.\r\n * @param setDisabled - Flag to define whether the element is disabled.\r\n * @param openModal - Flag to specify if it should open in a modal window.\r\n * @param setItemsAddedToCartDialogOpen - Sets items added to cart while dialog is open.\r\n * @param setErrorMessage - Error message.\r\n */\r\nconst onClick = async (\r\n _event: React.MouseEvent,\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n openModal: (opened: boolean) => void,\r\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\r\n setErrorMessage: (message: string) => void\r\n): Promise => {\r\n if (!ArrayExtensions.hasElements(props.products)) {\r\n const cartError = addToCartError(props);\r\n\r\n if (cartError) {\r\n propagateError(props, cartError);\r\n return;\r\n }\r\n\r\n setDisabled(true);\r\n }\r\n\r\n const hasOrderDetailsProducts =\r\n ArrayExtensions.hasElements(props.orderDetailsProducts) && props.orderDetailsProducts.length > defaultQuantity;\r\n const hasProducts = ArrayExtensions.hasElements(props.products) && props.products.length > defaultQuantity;\r\n\r\n const hasMultipleProducts = hasOrderDetailsProducts || hasProducts;\r\n\r\n if (props.shouldSkipSiteSettings && hasMultipleProducts) {\r\n await addItemsToCart(props, setDisabled, setItemsAddedToCartDialogOpen, setErrorMessage);\r\n } else {\r\n await addOneItemToCart(props, setDisabled, openModal);\r\n }\r\n};\r\n\r\n/**\r\n * Add to cart component action constant.\r\n */\r\nconst AddToCartComponentActions = {\r\n onClick\r\n};\r\n\r\n/**\r\n * Add to cart component.\r\n * @param props - The props.\r\n * @returns - The add to cart component.\r\n */\r\nexport const AddToCartFunctionalComponent: React.FC = (props: IAddToCartComponentProps) => {\r\n const [disabled, setDisabled] = useState(false);\r\n const [modalOpen, setModalOpen] = useState(false);\r\n const [isItemsAddedToCartDialogOpen, setItemsAddedToCartDialogOpen] = useState(false);\r\n const [errorMessage, setErrorMessage] = useState('');\r\n const [addToCartInput, setAddToCartInput] = useState<\r\n {\r\n product: SimpleProduct;\r\n count: number;\r\n }[]\r\n >([]);\r\n const onClickHandler = async (event: React.MouseEvent) => {\r\n await AddToCartComponentActions.onClick(event, props, setDisabled, setModalOpen, setItemsAddedToCartDialogOpen, setErrorMessage);\r\n };\r\n\r\n /**\r\n * Close dialog.\r\n */\r\n const closeItemsAddedToCartDialog = React.useCallback(() => {\r\n setItemsAddedToCartDialogOpen(false);\r\n }, []);\r\n\r\n const priceComponent = props.data?.price ? (\r\n \r\n ) : (\r\n ''\r\n );\r\n\r\n const popupProps: IPopupProps = {\r\n context: props.context,\r\n className: 'msc-add-to-cart',\r\n id: props.id,\r\n typeName: props.typeName,\r\n data: { product: addToCartInput[0]?.product, price: props.data?.price }, // addToCartInput[0]?.product?.Price },\r\n dialogStrings: props.dialogStrings,\r\n imageSettings: props.imageSettings,\r\n gridSettings: props.context.request.gridSettings,\r\n productQuantity: addToCartInput[0]?.count !== undefined ? addToCartInput[0]?.count : defaultQuantity,\r\n priceComponent,\r\n navigationUrl: props.navigationUrl,\r\n modalOpen,\r\n setModalOpen,\r\n telemetryContent: props.telemetryContent\r\n };\r\n\r\n const itemsAddedResource: IItemsAddedToCartResources = {\r\n viewCartButtonText: props.dialogStrings?.goToCartText ?? '',\r\n closeButtonLabel: props.dialogStrings?.closeNotificationLabel ?? 'Close',\r\n itemsAddedToCartHeaderText: props.dialogStrings?.headerMessageText ?? '',\r\n itemsAddedToCartFormatText: props.dialogStrings?.headerItemFormatText ?? '',\r\n linesAddedToCartFormatText: props.dialogStrings?.headerLinesFormatText ?? '{0}',\r\n itemsAddedValidationErrorMessage: errorMessage\r\n };\r\n\r\n const renderModalPopup = ;\r\n const label = getLinkText(props);\r\n const payload = getPayloadObject(TelemetryEvent.AddToCart, props.telemetryContent!, label, '');\r\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\r\n const buttonClassName = props.shouldSkipSiteSettings ? '' : 'msc-add-to-cart ';\r\n\r\n React.useEffect(() => {\r\n /**\r\n * Retrieves add to cart input and updates the state.\r\n */\r\n const retrieveAddToCartInput = async () => {\r\n const retrievedInput = await getAddToCartInputFromProps(props);\r\n setAddToCartInput(retrievedInput);\r\n };\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call async method as per the documentation of react useEffect.\r\n retrieveAddToCartInput();\r\n }, [props, setAddToCartInput]);\r\n\r\n return (\r\n <>\r\n {renderModalPopup}\r\n \r\n {label}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\n// Set default props\r\nAddToCartFunctionalComponent.defaultProps = {\r\n quantity: defaultQuantity\r\n};\r\n\r\n/**\r\n * Resolves whether product is in stock.\r\n * @param props - The add to cart component props.\r\n * @returns Gets the link text.\r\n */\r\nconst getLinkText = (props: IAddToCartComponentProps): string => {\r\n return shouldShowOutOfStock(props, false) && props.outOfStockText ? props.outOfStockText : props.addToCartText;\r\n};\r\n\r\n/**\r\n * Resolves whether product is in stock.\r\n * @param props - The add to cart component props.\r\n * @returns The add to cart failure result.\r\n */\r\nconst addToCartError = (props: IAddToCartComponentProps): IAddToCartFailureResult | undefined => {\r\n const {\r\n data,\r\n productAvailability,\r\n isCustomPriceSelected,\r\n customPriceAmount,\r\n maximumKeyInPrice,\r\n minimumKeyInPrice,\r\n defaultMaximumKeyInPrice = 100,\r\n defaultMinimumKeyInPrice = 10\r\n } = props;\r\n\r\n if (!data || !data.product.RecordId) {\r\n // No product exists, won't be able to add to cart\r\n return { failureReason: 'EMPTYINPUT' };\r\n }\r\n\r\n if (data.product.Dimensions) {\r\n const missingDimensions = data.product.Dimensions.filter(\r\n dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value)\r\n );\r\n\r\n if (ArrayExtensions.hasElements(missingDimensions)) {\r\n // At least one dimension with no value exists on the product, won't be able to add to cart\r\n return { failureReason: 'MISSINGDIMENSION', missingDimensions };\r\n }\r\n }\r\n\r\n if (shouldShowOutOfStock(props, true)) {\r\n const defaultAvailableQuantity = 0; // Showing as out of stock if no available products found.\r\n const availableQuantity = productAvailability?.AvailableQuantity ?? defaultAvailableQuantity;\r\n const stockLeft = Math.max(availableQuantity, defaultAvailableQuantity);\r\n\r\n return { failureReason: 'OUTOFSTOCK', stockLeft };\r\n }\r\n\r\n // When Custom price is selected, if there is no keyed-in price or keyed-in price is out of limit, should return error.\r\n if (\r\n isCustomPriceSelected &&\r\n (!customPriceAmount ||\r\n customPriceAmount > (maximumKeyInPrice || defaultMaximumKeyInPrice) ||\r\n customPriceAmount < (minimumKeyInPrice || defaultMinimumKeyInPrice))\r\n ) {\r\n return { failureReason: 'INVALIDCUSTOMAMOUNT' };\r\n }\r\n\r\n // Only allow adding to cart if not showing out of stock\r\n return undefined;\r\n};\r\n\r\n/**\r\n * Resolves whether product is in stock.\r\n * @param props - The add to cart component props.\r\n * @param includeCurrentQuantity - Flag to specify whether current quantity should be included.\r\n * @returns The dialog element.\r\n */\r\nconst shouldShowOutOfStock = (props: IAddToCartComponentProps, includeCurrentQuantity: boolean): boolean => {\r\n if (props.context.app.config.enableStockCheck === undefined || props.context.app.config.enableStockCheck === false) {\r\n return false;\r\n }\r\n\r\n // When skip site settings do not need show out of stock on adding to cart\r\n if (props.shouldSkipSiteSettings) {\r\n return false;\r\n }\r\n\r\n if (\r\n props.isLoading ||\r\n props.isProductQuantityLoading ||\r\n props.isUpdatingDimension ||\r\n props.isLoadingDeliveryOptions ||\r\n props.isUpdatingDeliveryOptions ||\r\n props.isAddServiceItemToCart\r\n ) {\r\n // Out of stock turn off, don't bother showing out of stock\r\n return false;\r\n }\r\n\r\n if (!props.data || !props.data.product.RecordId) {\r\n // No product exists, don't bother showing out of stock\r\n return false;\r\n }\r\n\r\n const hasAvailableProducts = props.hasAvailableProducts ?? true;\r\n if (!hasAvailableProducts) {\r\n return true;\r\n }\r\n\r\n if (props.data.product.Dimensions) {\r\n if (props.data.product.Dimensions.find(dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value))) {\r\n // At least one dimension with no value exists on the product, so also don't show out of stock\r\n return false;\r\n }\r\n }\r\n\r\n const includedQuantityNumber = includeCurrentQuantity && props.quantity ? props.quantity : defaultQuantity;\r\n\r\n return !(\r\n props.productAvailability &&\r\n props.productAvailability.AvailableQuantity !== undefined &&\r\n props.productAvailability.AvailableQuantity >= includedQuantityNumber\r\n );\r\n};\r\n\r\nconst isIntermediateState = (props: IAddToCartComponentProps): boolean => {\r\n if (props.data?.product.Dimensions) {\r\n if (props.data.product.Dimensions.find(dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value))) {\r\n // At least one dimension with no value exists on the product, so also not in intermediate state\r\n return false;\r\n }\r\n }\r\n\r\n if (!props.isLoading && !props.isUpdatingDimension && !props.isLoadingDeliveryOptions && !props.isUpdatingDeliveryOptions) {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\n// @ts-expect-error\r\nexport const AddToCartComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride(\r\n 'AddToCart',\r\n { component: AddToCartFunctionalComponent, ...AddToCartComponentActions }\r\n);\r\n\r\nexport default AddToCartComponent;\r\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":["getDefaultSwatchSelected","coreContext","productData","_productData$Attribut","_attributeSwatches$fi","AttributeValues","dimensionToPreSelectInProductCard","app","config","attributeSwatches","find","attributeValue","_attributeValue$KeyNa","KeyName","toLocaleLowerCase","Swatches","ArrayExtensions","hasElements","item","IsDefault","updateProductUrl","productDetailsPageUrl","queryString","sourceUrl","URL","request","apiSettings","baseUrl","search","href","pathname","renderLabel","name","price","rating","ratingAriaLabelText","reviewCount","ratingCountAriaLabelText","reviewCountArialableText","getReviewAriaLabel","getRatingAriaLabel","ratingAriaLabel","roundedRating","toFixed","format","renderProductPlacementImage","imageSettings","gridSettings","imageUrl","fallbackImageUrl","altText","context","_context$app$config","contextConfig","placeholderImageName","fallbackImageSource","img","src","fallBackSrc","imageProps","cropFocalRegion","React","Image","Object","assign","requestContext","actionContext","loadFailureBehavior","bypassHideOnFailure","ProductComponent","msdyn365Commerce","createComponentOverride","_objectSpread","component","_ref","_context$request","_context$request2","_product$Name","_product$RecordId","_getProductImageUrlFr","_getProductPageUrlFro","_resources$productCar","data","savingsText","freePriceText","originalPriceText","currentPriceText","ratingCountAriaLabel","allowBack","typeName","id","productPrices","telemetryContent","quickViewButton","productComparisonButton","isEnabledProductDescription","isPriceMinMaxEnabled","priceResources","inventoryLabel","dimensionAvailabilities","swatchItemAriaLabel","loginRegisterResource","resources","product","isAuthenticated","user","productUrl","getProductPageUrlSync","Name","RecordId","Number","MIN_VALUE","undefined","productImageUrlFromSwatch","defaultSwatch","swatchProductImageUrls","ProductImageUrls","generateImageUrl","PrimaryImageUrl","getProductImageUrlFromDefaultSwatch","productPageUrlFromSwatch","SwatchValue","encodeURIComponent","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","renderConditionalProductAttributes","attributeValues","fallbackText","attributeKeyName","attributeKeyNameText","className","_attributeValues$find","_attributeValues$find2","productAttributeFallbackText","isProductAttributeAvailable","attribute","BooleanValue","productAttributeText","TextValue","payLoad","getPayloadObject","getTelemetryAttributes","partNo","productPricesView","discount","DiscountAmount","filter","PLProduct","ItemId","map","_data$BasePrice","_data$CustomerContext","_data$DiscountAmount","discountedPrice","BasePrice","originalPrice","CustomerContextualPrice","_data$BasePrice2","_data$CustomerContext2","_data$TradeAgreementP","basePriceNum","basePrice","cultureFormatter","formatCurrency","discountedPriceNum","tradeAgreementPriceNum","TradeAgreementPrice","tradeAgreementPrice","key","productCardPriceText","productCardDiscountValue","productCardYourPriceText","AdjustedPrice","productPriceItem","maxQuantity","maxQuantityForCartLineItem","currentQuantity","setCurrentQuantity","maxQuantityText","productCardMaxQuantityText","replace","onClick","onTelemetryClick","Price","AverageRating","TotalRatings","signInUrl","description","Description","productCardPartNoText","extensionProps","_extensionProps$find","_extensionProps$find2","supersededItemId","prop","Key","Value","StringValue","alternateProductText","supersededProductTextFallBack","supersededProductText","renderSupersededProductText","ExtensionProperties","_item$KeyName$toLocal","_item$KeyName","_item$Swatches$map","_item$Swatches","dimensionTypeValue","dimensionsToDisplayOnProductCard","dimensionsInProductCard","DimensionTypes","none","shouldDisplayDimension","swatches","_item$RecordId","_swatchItem$SwatchVal","_swatchItem$SwatchVal2","_dimensionAvailabilit","itemId","colorHexCode","SwatchColorHexCode","SwatchImageUrl","isDefault","isDisabled","dimensionAvailability","_swatchItem$SwatchVal3","some","swatch","ProductComponentSwatchComponent","onSelectDimension","renderProductDimensions","hideRating","moduleTypeName","moduleId","avgRating","totalRatings","ariaLabel","numberRatings","RatingComponent","ratingCount","readOnly","renderRating","inventoryAvailabilityLabel","quickview","selectedDimensions","getValues","DimensionTypeValue","convertDimensionTypeToProductDimensionType","DimensionValue","selectedProductId","renderQuickView","catalogId","validateCatalogId","renderProductComparisonButton","getCatalogId","renderDropshipProductText","renderSpecialOrderProductText","_extensionProps$find3","_extensionProps$find4","stockAvailabilityText","stockAvailabilityCode","stockAvail","stockLa","stockOos","renderStockCheckProductText","IncrementalQuantity","max","currentCount","onChange","inputQuantityAriaLabel","productCardInputQuantityAriaLabel","decrementButtonAriaLabel","productCardDecrementButtonAriaLabel","incrementButtonAriaLabel","productCardIncrementButtonAriaLabel","minQuantityText","productCardMinQuantityText","AddToCartComponent","addToCartText","productCardAddToCartText","outOfStockText","productCardOOSText","navigationUrl","getUrlSync","quantity","ProductTypeValue","ProductType","Standalone","disabled","onError","viewports","xs","q","w","h","lg","xl","lazyload","isOrderQuantityLimitsFeatureEnabled","onAdd","AddToCartBehavior","propagateResult","props","result","propagateError","getAddToCartInputFromProps","async","_props$orderDetailsPr","_props$data","products","orderDetailsProducts","ObjectExtensions","isNullOrUndefined","simpleProduct","input","count","salesLine","Quantity","CatalogId","_props$catalogId","searchCriteriaInput","Context","ChannelId","channelId","IncludeAttributes","Ids","productId","productSearchResultsWithImages","ProductsDataActions","callerContext","productSearchResult","newProductSearchResult","generateProductImageUrl","_productData$BasePric","Variant","_props$quantity","addItemsToCart","setDisabled","setItemsAddedToCartDialogOpen","setErrorMessage","addToCartInput","cartState","getCartState","addToCartResult","addProductsToCart","status","_validationResult$Val","_props$dialogStrings2","_props$dialogStrings3","_props$dialogStrings$2","_props$dialogStrings4","errorCount","CartsDataActions","bypassCache","cart","Id","Version","ValidationFailuresByCartLines","length","errorText","dialogStrings","oneErrorText","multiErrorsText","errorMessage","validationErrorMessage","addToCartBehavior","showModal","showNotification","_props$dialogStrings$3","itemsAddedResource","viewCartButtonText","goToCartText","closeButtonLabel","closeNotificationLabel","itemsAddedToCartHeaderText","headerMessageText","itemsAddedToCartFormatText","headerItemFormatText","linesAddedToCartFormatText","headerLinesFormatText","itemsAddedValidationErrorMessage","notification","MultiItemsSuccessfullyAddedToCartNotification","NotificationsManager","instance","addNotification","MsDyn365","isBrowser","isNavigationToCartPageDisabled","goToCart","window","location","handleAddItemsToCartSuccess","_props$dialogStrings5","_props$dialogStrings$4","_addToCartResult$erro3","_addToCartResult$erro4","_props$dialogStrings$5","_props$dialogStrings6","buyAgainNotificationTitle","ErrorNotification","buyAgainNotificationCloseAriaLabel","errorDetails","LocalizedMessage","failureReason","cartActionResult","AddToCartComponentActions","_event","openModal","cartError","addToCartError","hasOrderDetailsProducts","hasProducts","hasMultipleProducts","shouldSkipSiteSettings","_props$productAvailab","addProductToCart","availableQuantity","productAvailability","AvailableQuantity","additionalProperties","orderQuantityLimitsFeatureIsEnabled","isPriceKeyedIn","customPrice","customPriceAmount","isAddEmailDeliveryItemToCart","ItemSuccessfullyAddedToCartNotification","_addToCartResult$erro","_addToCartResult$erro2","_props$dialogStrings$","_props$dialogStrings","addOneItemToCart","AddToCartFunctionalComponent","_props$data2","_props$dialogStrings7","_props$dialogStrings8","_props$dialogStrings9","_addToCartInput$","_props$data3","_addToCartInput$2","_addToCartInput$3","_props$dialogStrings$6","_props$dialogStrings10","_props$dialogStrings$7","_props$dialogStrings11","_props$dialogStrings$8","_props$dialogStrings12","_props$dialogStrings$9","_props$dialogStrings13","_props$dialogStrings$10","_props$dialogStrings14","_props$addToCartArial","_props$addToCartArial2","modalOpen","setModalOpen","isItemsAddedToCartDialogOpen","setAddToCartInput","closeItemsAddedToCartDialog","priceComponent","PriceComponent","popupProps","productQuantity","renderModalPopup","Popup","label","getLinkText","payload","TelemetryEvent","AddToCart","attributes","buttonClassName","retrievedInput","retrieveAddToCartInput","classnames","addToCartArialLabel","title","event","isIntermediateState","shouldShowOutOfStock","ItemsAddedToCartDialogComponent","isModalOpen","onClose","defaultProps","isCustomPriceSelected","maximumKeyInPrice","minimumKeyInPrice","defaultMaximumKeyInPrice","defaultMinimumKeyInPrice","Dimensions","missingDimensions","dimension","_productAvailability$","defaultAvailableQuantity","stockLeft","Math","includeCurrentQuantity","_props$hasAvailablePr","isLoading","isProductQuantityLoading","isUpdatingDimension","isLoadingDeliveryOptions","isUpdatingDeliveryOptions","isAddServiceItemToCart","hasAvailableProducts","includedQuantityNumber","_props$data4","renderProductUnitOfMeasure","unitOfMeasure","renderPrice","productPrice","IsMasterProduct","Master","MaxVariantPrice","MinVariantPrice","isUnitOfMeasureEnabled","unitOfMeasureDisplayType","DefaultUnitOfMeasure"],"sourceRoot":""}