{"version":3,"file":"static/js/daca9e81869d3318e17d.bundle.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/themes/bakersdelight/views/components/product.component.tsx?fb16","webpack://Msdyn365.Commerce.Online/./src/themes/cobs-bread/views/components/product.component.tsx?fd43","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\n\r\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport {\r\n    IPriceComponentResources,\r\n    ISwatchItem,\r\n    PriceComponent,\r\n    ProductComponentSwatchComponent,\r\n    RatingComponent\r\n} 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} from '@msdyn365-commerce/core';\r\nimport {\r\n    AttributeSwatch,\r\n    AttributeValue,\r\n    ProductDimension,\r\n    ProductPrice,\r\n    ProductSearchResult,\r\n    ProductType,\r\n    SimpleProduct\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} 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} from '@msdyn365-commerce-modules/utilities';\r\nimport React, { useState } from 'react';\r\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult; productPrice?: ProductPrice }> {\r\n    className?: string;\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}\r\n\r\nexport interface IProductComponent extends IComponent<IProductComponentProps> {}\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 getDefaultColorSwatchSelected(productData?: ProductSearchResult): AttributeSwatch | null {\r\n    if (!productData || !productData.AttributeValues) {\r\n        return null;\r\n    }\r\n\r\n    const colorAttribute = productData.AttributeValues.find(\r\n        attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === DimensionTypes.color\r\n    );\r\n    if (!colorAttribute) {\r\n        return null;\r\n    }\r\n\r\n    const defaultSwatch = colorAttribute.Swatches?.find(item => item.IsDefault === true) ?? colorAttribute.Swatches?.[0];\r\n    return defaultSwatch ?? null;\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 getProductImageUrlFromDefaultColorSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\r\n    const siteContext = coreContext as ICoreContext<IDimensionsApp>;\r\n    const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n    if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\r\n        return productData?.PrimaryImageUrl;\r\n    }\r\n    const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n    return defaultSwatch && ArrayExtensions.hasElements(defaultSwatch.ProductImageUrls)\r\n        ? generateImageUrl(defaultSwatch.ProductImageUrls[0], coreContext.request.apiSettings)\r\n        : productData?.PrimaryImageUrl;\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\nfunction renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\r\n    if (!unitOfMeasure) {\r\n        return null;\r\n    }\r\n    return (\r\n        <div className='msc-product__unit-of-measure'>\r\n            {/*<span>{unitOfMeasure}</span>*/}\r\n        </div>\r\n    );\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        <div className='msc-product__availability'>\r\n            <span>{inventoryAvailabilityLabel}</span>\r\n        </div>\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    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 siteContext = coreContext as ICoreContext<IDimensionsApp>;\r\n    const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n    if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\r\n        return productUrl;\r\n    }\r\n\r\n    const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n    if (!defaultSwatch || !defaultSwatch.SwatchValue) {\r\n        return productUrl;\r\n    }\r\n\r\n    const queryString = `color=${defaultSwatch.SwatchValue}`;\r\n    return updateProductUrl(productUrl, coreContext, queryString);\r\n}\r\n\r\nconst ProductCard: React.FC<IProductComponentProps> = ({\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                                                           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                                                       }) => {\r\n    const product: any = data.product;\r\n    const productPrice = data.productPrice;\r\n    // let productTagColor: any = '';\r\n    // let productTagText: any = '';\r\n    let productClickAndCollect: any = '';\r\n    if(product && product.ExtensionProperties){\r\n        // const  colorInfo=  product.ExtensionProperties.find((property:any)=>{\r\n        //     return property.Key==='OPT_PRODUCTTAGCOLOUR';\r\n        // });\r\n        productClickAndCollect = product.ExtensionProperties.find((property: any) => {\r\n            return property.Key === 'OPT_PRODUCTCLICKANDCOLLECT';\r\n        });\r\n        // const textInfo =  product.ExtensionProperties.find((property:any)=>{\r\n        //     return property.Key==='OPT_PRODUCTTAG'\r\n        // });\r\n        // if(colorInfo && colorInfo.Value && textInfo && textInfo.Value){\r\n        //     productTagColor = colorInfo.Value.StringValue;\r\n        //     productTagText = textInfo.Value.StringValue;\r\n        // }\r\n    }\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 = getProductImageUrlFromDefaultColorSwatch(context, product) ?? product?.PrimaryImageUrl;\r\n    const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\r\n    const [productPageUrl, setProductPageUrl] = useState<string>(productPageUrlFromSwatch);\r\n    const [productImageUrl, setProductImageUrl] = useState<string | undefined>(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<DimensionTypes, ISwatchItem>());\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    /**\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 === DimensionTypes.color) {\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<IDimensionsApp>;\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            <div className='msc-product__dimensions'>\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<IDimensionsApp>;\r\n                    const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n                    const dimensionType = dimensionTypeValue as DimensionTypes;\r\n                    const swatches =\r\n                        item.Swatches?.map<ISwatchItem>(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                        dimensionToPreSelectInProductCard !== DimensionTypes.none &&\r\n                        ArrayExtensions.hasElements(swatches) &&\r\n                        !swatches.some(swatch => swatch.isDefault) &&\r\n                        dimensionType === DimensionTypes.color\r\n                    ) {\r\n                        swatches[0].isDefault = true;\r\n                    }\r\n                    return (\r\n                        <ProductComponentSwatchComponent\r\n                            context={context}\r\n                            swatches={swatches}\r\n                            onSelectDimension={updatePageAndImageUrl}\r\n                            key={item.RecordId}\r\n                        />\r\n                    );\r\n                })}\r\n            </div>\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<ProductDimension>(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        const productView=(event: any)=>{\r\n            event.stopPropagation();\r\n            const currency = context.actionContext.requestContext.channel?.CompanyCurrency ?? '';\r\n            if (product) {\r\n                const productItem = {\r\n                    item_id: product.ItemId,\r\n                    item_name: product.Name,\r\n                    item_variant: '',\r\n                    location_id: '',\r\n                    item_category: 'Products',\r\n                    store_name: '',\r\n                    store_id: '',\r\n                    price: product.Price,\r\n                    quantity: 1\r\n                };\r\n\r\n                if (typeof gtag !== 'undefined') {\r\n                    gtag('event', 'view_item', {\r\n                        currency: currency,\r\n                        value: product.Price,\r\n                        items: [productItem]\r\n                    });\r\n                }\r\n            }\r\n        };\r\n        return <span onClick={productView}>{React.cloneElement(quickview as React.ReactElement, { selectedProductId: item, selectedDimensions })}</span>;\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    const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\r\n\r\n    function mouseEnter(url : string | undefined){\r\n        setProductImageUrl(url);\r\n    }\r\n\r\n    function mouseLeave(url : string | undefined){\r\n        setProductImageUrl(url);\r\n    }\r\n    function productSelected(){\r\n        const product:any = data.product;\r\n        if (product) {\r\n            const productItem = {\r\n                item_id: product.ItemId,\r\n                item_name: product.Name,\r\n                index: 0,\r\n                item_list_id: 'related_products',\r\n                item_list_name: 'Related Products',\r\n                item_variant: '',\r\n                location_id: '',\r\n                price: product.Price,\r\n                quantity: 1\r\n            };\r\n            if (typeof gtag !== 'undefined') {\r\n                gtag('event', 'select_item', {\r\n                    items: [productItem]\r\n                });\r\n            }\r\n        }\r\n    }\r\n\r\n    return (\r\n        <div className='msc-product-container'\r\n             onMouseEnter={(event) => !isEnabledProductDescription && product.LifeStyleImageUrl &&  mouseEnter(product.LifeStyleImageUrl)}\r\n             onMouseLeave={(event) => !isEnabledProductDescription && product.LifeStyleImageUrl && mouseLeave(product.PrimaryImageUrl)}\r\n             onClick={productSelected}\r\n        >\r\n            {isEnabledProductDescription ? (\r\n                <a\r\n                    href={productPageUrl}\r\n                    onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n                    aria-label={renderLabel(\r\n                        product.Name,\r\n                        context.cultureFormatter.formatCurrency(product.Price),\r\n                        product.AverageRating,\r\n                        ratingAriaLabel,\r\n                        product.TotalRatings,\r\n                        ratingCountAriaLabel\r\n                    )}\r\n                    className='msc-product'\r\n                    {...attribute}\r\n                >\r\n                    {/*<span className='product-tag'>*/}\r\n                    {/*     {productTagColor && productTagText &&  _getSvgIcon(productTagColor,productTagText)}*/}\r\n                    {/*</span>*/}\r\n                    <div className='msc-product__image__description'>\r\n                        <div className='msc-product__image'>\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                        </div>\r\n                        <div className='msc-product__title_description'>\r\n                            <h2 className='msc-product__title__text'>{product.Name}</h2>\r\n                            {renderPrice(\r\n                                context,\r\n                                typeName,\r\n                                id,\r\n                                product,\r\n                                savingsText,\r\n                                freePriceText,\r\n                                originalPriceText,\r\n                                currentPriceText,\r\n                                isPriceMinMaxEnabled,\r\n                                priceResources,\r\n                                productPrice\r\n                            )}\r\n                            {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\r\n                            {renderDescription(product.Description)}\r\n                        </div>\r\n                    </div>\r\n                </a>\r\n            ) : (\r\n                <a\r\n                    href={productPageUrl}\r\n                    onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n                    aria-label={renderLabel(\r\n                        product.Name,\r\n                        context.cultureFormatter.formatCurrency(product.Price),\r\n                        product.AverageRating,\r\n                        ratingAriaLabel\r\n                    )}\r\n                    className='msc-product'\r\n                    {...attribute}\r\n                >\r\n                    {/* <span className='product-tag'>*/}\r\n                    {/*     {productTagColor && productTagText &&  _getSvgIcon(productTagColor,productTagText)}*/}\r\n                    {/*</span>*/}\r\n                    <div className='msc-product__image'>\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                    </div>\r\n                    <div className='msc-product__details'>\r\n                        <h5 className='msc-product__title'>{product.Name}</h5>\r\n                        {renderPrice(\r\n                            context,\r\n                            typeName,\r\n                            id,\r\n                            product,\r\n                            savingsText,\r\n                            freePriceText,\r\n                            originalPriceText,\r\n                            currentPriceText,\r\n                            isPriceMinMaxEnabled,\r\n                            priceResources,\r\n                            productPrice\r\n                        )}\r\n                        {product.Price !==0 && !(product.StoreId) && <span>{\" RRP\"}</span>}\r\n                        {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\r\n                    </div>\r\n                </a>\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            {productClickAndCollect &&\r\n            productClickAndCollect.Value &&\r\n            productClickAndCollect.Value.IntegerValue !== 0 &&\r\n            quickViewButton &&\r\n            renderQuickView(quickViewButton, product.RecordId)}\r\n            {productClickAndCollect && productClickAndCollect.Value && productClickAndCollect.Value.IntegerValue === 0 && (\r\n                <a href={productPageUrl} className='msc-product__view-button-container'>\r\n                    <div className='msc-product__view-button'></div>\r\n                </a>\r\n            )}\r\n            {productComparisonButton && renderProductComparisonButton(productComparisonButton, product, getCatalogId(context.request))}\r\n        </div>\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 <p className='msc-product__text'>{description}</p>;\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        <RatingComponent\r\n            context={coreContext}\r\n            id={moduleId}\r\n            typeName={moduleTypeName}\r\n            avgRating={avgRating}\r\n            ratingCount={numberRatings}\r\n            readOnly\r\n            ariaLabel={ratingAriaLabelText}\r\n            ratingCountAriaLabel={ratingCountAriaLabelText}\r\n            data={{}}\r\n        />\r\n    );\r\n}\r\n\r\nfunction renderPrice(\r\n    context: ICoreContext,\r\n    typeName: string,\r\n    id: string,\r\n    // basePrice?: number,\r\n    // adjustedPrice?: number,\r\n    productSearchResult: ProductSearchResult,\r\n    savingsText?: string,\r\n    freePriceText?: string,\r\n    originalPriceText?: string,\r\n    currentPriceText?: string,\r\n    isPriceMinMaxEnabled?: boolean,\r\n    priceResources?: IPriceComponentResources,\r\n    productPrice?: ProductPrice\r\n): JSX.Element | null {\r\n    const product: SimpleProduct = {\r\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.\r\n        ProductTypeValue: productSearchResult.IsMasterProduct ? ProductType.Master : ProductType.Standalone\r\n    } as SimpleProduct;\r\n\r\n    const price: ProductPrice = productPrice ?? {\r\n        BasePrice: productSearchResult.BasePrice,\r\n        AdjustedPrice: productSearchResult.Price,\r\n        CustomerContextualPrice: productSearchResult.Price,\r\n        MaxVariantPrice: productSearchResult.MaxVariantPrice ? productSearchResult.MaxVariantPrice : productSearchResult.Price,\r\n        MinVariantPrice: productSearchResult.MinVariantPrice ? productSearchResult.MinVariantPrice : productSearchResult.Price\r\n    };\r\n\r\n    // const price: ProductPrice = {\r\n    //     BasePrice: basePrice,\r\n    //     AdjustedPrice: adjustedPrice,\r\n    //     CustomerContextualPrice: adjustedPrice\r\n    // };\r\n\r\n    return (\r\n        <PriceComponent\r\n            context={context}\r\n            id={id}\r\n            typeName={typeName}\r\n            product={product}\r\n            data={{ price }}\r\n            savingsText={savingsText}\r\n            freePriceText={freePriceText}\r\n            originalPriceText={originalPriceText}\r\n            isPriceMinMaxEnabled={isPriceMinMaxEnabled}\r\n            priceResources={priceResources}\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<IGeneric<IAny>>\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        <Image\r\n            requestContext={context?.actionContext.requestContext}\r\n            {...img}\r\n            {...imageProps}\r\n            loadFailureBehavior='empty'\r\n            bypassHideOnFailure\r\n            shouldSkipToMainImage={true}\r\n        />\r\n    );\r\n}\r\n//  function _getSvgIcon  ( color?: string, text?: string) {\r\n//     return (<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"82\" height=\"80\" viewBox=\"0 0 82 80\">\r\n//                     <path fill={color} d=\"M82 40.1289C79.2284 54.2565 77.7032 58.0027 64.5176 72.5952C64.1076 72.9555 62.1019 74.542 61.9592 74.6253C61.3992 74.9519 60.8305 75.1389 60.2536 75.4398C59.3651 75.9032 59.8347 75.7625 58.9088 76.1623C58.8433 76.1905 57.3837 76.674 57.318 76.702C57.2416 76.7345 56.4107 77.0191 56.334 77.0512C55.5694 77.3712 55.1532 77.4389 54.8088 77.5592C54.591 77.6352 53.5195 77.9596 53.3 78.0321C49.1807 79.393 50.0528 79.8733 41.2296 79.8132C40.723 79.8132 40.0889 80.0162 39.5896 79.9949C39.3372 79.9841 38.8233 80.0109 38.5728 79.9949C38.0883 79.9639 37.5745 79.7327 37.0968 79.6828C32.4518 79.1971 32.5486 79.8742 28.4376 78.0354C28.24 77.947 25.9448 77.0015 23.124 75.6861C19.8768 73.686 16.1048 71.7763 15.826 71.5589C3.9524 62.3002 0 55.8409 0 40.1289C0 29.3031 1.37992 21.7185 8.5 14.5001C11.0154 11.95 15.8729 8.32894 19 6.50012C27.4376 0.843874 33.3248 0.00012207 41 0.00012207C64.5176 2.50012 82 17.9664 82 40.1289Z\" />\r\n//                     {text ? <text x=\"40\" y=\"45\" className={'productTagText'} style={{fontSize:'18px',fill:'#ffffff'}} textAnchor=\"middle\">{text}</text> : ''}\r\n//                 </svg>);\r\n// }\r\nexport const ProductComponent: React.FunctionComponent<IProductComponentProps> = 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 { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport {\r\n    IPriceComponentResources,\r\n    ISwatchItem,\r\n    PriceComponent,\r\n    ProductComponentSwatchComponent,\r\n    RatingComponent\r\n} 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} from '@msdyn365-commerce/core';\r\nimport {\r\n    AttributeSwatch,\r\n    AttributeValue,\r\n    ProductDimension,\r\n    ProductPrice,\r\n    ProductSearchResult,\r\n    ProductType,\r\n    SimpleProduct\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} from '@msdyn365-commerce-modules/utilities';\r\nimport React, { useState } from 'react';\r\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult; productPrice?: ProductPrice }> {\r\n    className?: string;\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}\r\n\r\nexport interface IProductComponent extends IComponent<IProductComponentProps> {}\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    const siteContext = coreContext as ICoreContext<IDimensionsApp>;\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\nfunction renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\r\n    if (!unitOfMeasure) {\r\n        return null;\r\n    }\r\n    return (\r\n        <div className='msc-product__unit-of-measure'>\r\n            {/*<span>{unitOfMeasure}</span>*/}\r\n        </div>\r\n    );\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        <div className='msc-product__availability'>\r\n            <span>{inventoryAvailabilityLabel}</span>\r\n        </div>\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    const siteContext = coreContext as ICoreContext<IDimensionsApp>;\r\n    const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n    if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\r\n        return productUrl;\r\n    }\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<IProductComponentProps> = ({\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    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}) => {\r\n    const product: any = data.product;\r\n    const productPrice = data.productPrice;\r\n    // let productTagColor: any = '';\r\n    // let productTagText: any = '';\r\n    let productClickAndCollect: any = '';\r\n    React.useEffect(() => {\r\n        const currency = context.actionContext.requestContext.channel?.CompanyCurrency ?? '';\r\n        const product:any = data.product;\r\n        if(product){\r\n            const productItem={\r\n                item_id: product.ItemId,\r\n                item_name: product.Name,\r\n                item_variant: \"\",\r\n                location_id: \"\",\r\n                price: product.Price,\r\n                quantity: 1\r\n            }\r\n            if (typeof gtag !== 'undefined') {\r\n                gtag(\"event\", \"view_item\", {\r\n                    currency: currency,\r\n                    value: product.Price,\r\n                    items: [productItem]\r\n                });\r\n            }\r\n        }\r\n    }, []);\r\n    if(product && product.ExtensionProperties){\r\n        // const  colorInfo=  product.ExtensionProperties.find((property:any)=>{\r\n        //     return property.Key==='OPT_PRODUCTTAGCOLOUR';\r\n        // });\r\n        productClickAndCollect = product.ExtensionProperties.find((property: any) => {\r\n            return property.Key === 'OPT_PRODUCTCLICKANDCOLLECT';\r\n        });\r\n        // const textInfo =  product.ExtensionProperties.find((property:any)=>{\r\n        //     return property.Key==='OPT_PRODUCTTAG'\r\n        // });\r\n        // if(colorInfo && colorInfo.Value && textInfo && textInfo.Value){\r\n        //     productTagColor = colorInfo.Value.StringValue;\r\n        //     productTagText = textInfo.Value.StringValue;\r\n        // }\r\n    }\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<string>(productPageUrlFromSwatch);\r\n    const [productImageUrl, setProductImageUrl] = useState<string | undefined>(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<DimensionTypes, ISwatchItem>());\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    const siteContext = context as ICoreContext<IDimensionsApp>;\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<IDimensionsApp>;\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            <div className='msc-product__dimensions'>\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<IDimensionsApp>;\r\n                    const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n                    const dimensionType = dimensionTypeValue as DimensionTypes;\r\n                    const swatches =\r\n                        item.Swatches?.map<ISwatchItem>(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                        <ProductComponentSwatchComponent\r\n                            context={context}\r\n                            swatches={swatches}\r\n                            onSelectDimension={updatePageAndImageUrl}\r\n                            key={item.RecordId}\r\n                        />\r\n                    );\r\n                })}\r\n            </div>\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<ProductDimension>(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 React.cloneElement(quickview as React.ReactElement, { selectedProductId: item, selectedDimensions });\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    const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\r\n\r\n    function mouseEnter(url : string | undefined){\r\n        setProductImageUrl(url);\r\n    }\r\n    function mouseLeave(url : string | undefined){\r\n        setProductImageUrl(url);\r\n    }\r\n    return (\r\n        <>\r\n            {isEnabledProductDescription ? (\r\n                <a\r\n                    href={productPageUrl}\r\n                    onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n                    aria-label={renderLabel(\r\n                        product.Name,\r\n                        context.cultureFormatter.formatCurrency(product.Price),\r\n                        product.AverageRating,\r\n                        ratingAriaLabel,\r\n                        product.TotalRatings,\r\n                        ratingCountAriaLabel\r\n                    )}\r\n                    className='msc-product'\r\n                    {...attribute}\r\n                >\r\n                    {/*<span className='product-tag'>*/}\r\n                    {/*     {productTagColor && productTagText &&  _getSvgIcon(productTagColor,productTagText)}*/}\r\n                    {/*</span>*/}\r\n                    <div className='msc-product__image__description'>\r\n                        <div className='msc-product__image'>\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                        </div>\r\n                        <div className='msc-product__title_description'>\r\n                            <h2 className='msc-product__title__text'>{product.Name}</h2>\r\n                            {renderPrice(\r\n                                context,\r\n                                typeName,\r\n                                id,\r\n                                product,\r\n                                savingsText,\r\n                                freePriceText,\r\n                                originalPriceText,\r\n                                currentPriceText,\r\n                                isPriceMinMaxEnabled,\r\n                                priceResources,\r\n                                productPrice\r\n                            )}\r\n                            {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\r\n                            {renderDescription(product.Description)}\r\n                        </div>\r\n                    </div>\r\n                </a>\r\n            ) : (\r\n                <a\r\n                    href={productPageUrl}\r\n                    onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n                    onMouseEnter={(event) =>   product.LifeStyleImageUrl &&  mouseEnter(product.LifeStyleImageUrl)}\r\n                    onMouseLeave={(event) =>    product.LifeStyleImageUrl && mouseLeave(product.PrimaryImageUrl)}\r\n                    aria-label={renderLabel(\r\n                        product.Name,\r\n                        context.cultureFormatter.formatCurrency(product.Price),\r\n                        product.AverageRating,\r\n                        ratingAriaLabel\r\n                    )}\r\n                    className='msc-product'\r\n                    {...attribute}\r\n                >\r\n                    {/* <span className='product-tag'>*/}\r\n                    {/*     {productTagColor && productTagText &&  _getSvgIcon(productTagColor,productTagText)}*/}\r\n                    {/*</span>*/}\r\n                    <div className='msc-product__image'>\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                    </div>\r\n                    <div className='msc-product__details'>\r\n                        <h5 className='msc-product__title'>{product.Name}</h5>\r\n                        {productClickAndCollect && productClickAndCollect.Value && productClickAndCollect.Value.IntegerValue !== 0 && (\r\n                            <div className='msc-product__price-cc-basket-icon'></div>\r\n                        )}\r\n                        {renderPrice(\r\n                            context,\r\n                            typeName,\r\n                            id,\r\n                            product,\r\n                            savingsText,\r\n                            freePriceText,\r\n                            originalPriceText,\r\n                            currentPriceText,\r\n                            isPriceMinMaxEnabled,\r\n                            priceResources,\r\n                            productPrice\r\n                        )}\r\n                        {product.Price !==0 && !(product.StoreId) && <span>{\" RRP\"}</span>}\r\n                        {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\r\n                    </div>\r\n                </a>\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            {productClickAndCollect &&\r\n                productClickAndCollect.Value &&\r\n                productClickAndCollect.Value.IntegerValue !== 0 &&\r\n                quickViewButton &&\r\n                renderQuickView(quickViewButton, product.RecordId)}\r\n            {productClickAndCollect && productClickAndCollect.Value && productClickAndCollect.Value.IntegerValue === 0 && (\r\n                <a href={productPageUrl} className='msc-product__view-button-container'>\r\n                    <div className='msc-product__view-button'></div>\r\n                </a>\r\n            )}\r\n            {productComparisonButton && renderProductComparisonButton(productComparisonButton, product, getCatalogId(context.request))}\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 <p className='msc-product__text'>{description}</p>;\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        <RatingComponent\r\n            context={coreContext}\r\n            id={moduleId}\r\n            typeName={moduleTypeName}\r\n            avgRating={avgRating}\r\n            ratingCount={numberRatings}\r\n            readOnly\r\n            ariaLabel={ratingAriaLabelText}\r\n            ratingCountAriaLabel={ratingCountAriaLabelText}\r\n            data={{}}\r\n        />\r\n    );\r\n}\r\n\r\nfunction renderPrice(\r\n    context: ICoreContext,\r\n    typeName: string,\r\n    id: string,\r\n    // basePrice?: number,\r\n    // adjustedPrice?: number,\r\n    productSearchResult: ProductSearchResult,\r\n    savingsText?: string,\r\n    freePriceText?: string,\r\n    originalPriceText?: string,\r\n    currentPriceText?: string,\r\n    isPriceMinMaxEnabled?: boolean,\r\n    priceResources?: IPriceComponentResources,\r\n    productPrice?: ProductPrice\r\n): JSX.Element | null {\r\n    const product: SimpleProduct = {\r\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.\r\n        ProductTypeValue: productSearchResult.IsMasterProduct ? ProductType.Master : ProductType.Standalone\r\n    } as SimpleProduct;\r\n\r\n    const price: ProductPrice = productPrice ?? {\r\n        BasePrice: productSearchResult.BasePrice,\r\n        AdjustedPrice: productSearchResult.Price,\r\n        CustomerContextualPrice: productSearchResult.Price,\r\n        MaxVariantPrice: productSearchResult.MaxVariantPrice ? productSearchResult.MaxVariantPrice : productSearchResult.Price,\r\n        MinVariantPrice: productSearchResult.MinVariantPrice ? productSearchResult.MinVariantPrice : productSearchResult.Price\r\n    };\r\n\r\n    // const price: ProductPrice = {\r\n    //     BasePrice: basePrice,\r\n    //     AdjustedPrice: adjustedPrice,\r\n    //     CustomerContextualPrice: adjustedPrice\r\n    // };\r\n\r\n    return (\r\n        <PriceComponent\r\n            context={context}\r\n            id={id}\r\n            typeName={typeName}\r\n            product={product}\r\n            data={{ price }}\r\n            savingsText={savingsText}\r\n            freePriceText={freePriceText}\r\n            originalPriceText={originalPriceText}\r\n            isPriceMinMaxEnabled={isPriceMinMaxEnabled}\r\n            priceResources={priceResources}\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<IGeneric<IAny>>\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        <Image\r\n            requestContext={context?.actionContext.requestContext}\r\n            {...img}\r\n            {...imageProps}\r\n            loadFailureBehavior='empty'\r\n            bypassHideOnFailure\r\n            shouldSkipToMainImage={true}\r\n        />\r\n    );\r\n}\r\n//  function _getSvgIcon  ( color?: string, text?: string) {\r\n//     return (<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"82\" height=\"80\" viewBox=\"0 0 82 80\">\r\n//                     <path fill={color} d=\"M82 40.1289C79.2284 54.2565 77.7032 58.0027 64.5176 72.5952C64.1076 72.9555 62.1019 74.542 61.9592 74.6253C61.3992 74.9519 60.8305 75.1389 60.2536 75.4398C59.3651 75.9032 59.8347 75.7625 58.9088 76.1623C58.8433 76.1905 57.3837 76.674 57.318 76.702C57.2416 76.7345 56.4107 77.0191 56.334 77.0512C55.5694 77.3712 55.1532 77.4389 54.8088 77.5592C54.591 77.6352 53.5195 77.9596 53.3 78.0321C49.1807 79.393 50.0528 79.8733 41.2296 79.8132C40.723 79.8132 40.0889 80.0162 39.5896 79.9949C39.3372 79.9841 38.8233 80.0109 38.5728 79.9949C38.0883 79.9639 37.5745 79.7327 37.0968 79.6828C32.4518 79.1971 32.5486 79.8742 28.4376 78.0354C28.24 77.947 25.9448 77.0015 23.124 75.6861C19.8768 73.686 16.1048 71.7763 15.826 71.5589C3.9524 62.3002 0 55.8409 0 40.1289C0 29.3031 1.37992 21.7185 8.5 14.5001C11.0154 11.95 15.8729 8.32894 19 6.50012C27.4376 0.843874 33.3248 0.00012207 41 0.00012207C64.5176 2.50012 82 17.9664 82 40.1289Z\" />\r\n//                     {text ? <text x=\"40\" y=\"45\" className={'productTagText'} style={{fontSize:'18px',fill:'#ffffff'}} textAnchor=\"middle\">{text}</text> : ''}\r\n//                 </svg>);\r\n// }\r\nexport const ProductComponent: React.FunctionComponent<IProductComponentProps> = msdyn365Commerce.createComponentOverride<\r\n    IProductComponent\r\n>('Product', { component: ProductCard, ...PriceComponentActions });\r\n\r\nexport default ProductComponent;\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<IProductComponentProps> {}\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<IDimensionsApp>;\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        <div className='msc-product__unit-of-measure'>\n            <span>{unitOfMeasure}</span>\n        </div>\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        <div className='msc-product__availability'>\n            <span>{inventoryAvailabilityLabel}</span>\n        </div>\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<IDimensionsApp>;\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<IProductComponentProps> = ({\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<string>(productPageUrlFromSwatch);\n    const [productImageUrl, setProductImageUrl] = useState<string | undefined>(productImageUrlFromSwatch);\n    React.useEffect(() => {\n        setProductPageUrl(productPageUrlFromSwatch);\n        setProductImageUrl(productImageUrlFromSwatch);\n    }, [productUrl, productPageUrlFromSwatch, productImageUrlFromSwatch]);\n    const [selectedSwatchItems] = useState(new Dictionary<DimensionTypes, ISwatchItem>());\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<IDimensionsApp>;\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<IDimensionsApp>;\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            <div className='msc-product__dimensions'>\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<IDimensionsApp>;\n                    const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n                    const dimensionType = dimensionTypeValue as DimensionTypes;\n                    const swatches =\n                        item.Swatches?.map<ISwatchItem>(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                        <ProductComponentSwatchComponent\n                            context={context}\n                            swatches={swatches}\n                            onSelectDimension={updatePageAndImageUrl}\n                            key={item.RecordId}\n                        />\n                    );\n                })}\n            </div>\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<ProductDimension>(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                <a\n                    href={productPageUrl}\n                    onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\n                    aria-label={renderLabel(\n                        product.Name,\n                        context.cultureFormatter.formatCurrency(product.Price),\n                        product.AverageRating,\n                        ratingAriaLabel,\n                        product.TotalRatings,\n                        ratingCountAriaLabel\n                    )}\n                    className='msc-product'\n                    {...attribute}\n                >\n                    <div className='msc-product__image__description'>\n                        <div className='msc-product__image'>\n                            {renderProductPlacementImage(\n                                imageSettings,\n                                context.request.gridSettings,\n                                productImageUrl,\n                                product.PrimaryImageUrl,\n                                product.Name,\n                                context\n                            )}\n                        </div>\n                        <div className='msc-product__title_description'>\n                            <h2 className='msc-product__title__text'>{product.Name}</h2>\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                        </div>\n                    </div>\n                </a>\n            ) : (\n                <a\n                    href={productPageUrl}\n                    onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\n                    aria-label={renderLabel(\n                        product.Name,\n                        context.cultureFormatter.formatCurrency(product.Price),\n                        product.AverageRating,\n                        ratingAriaLabel\n                    )}\n                    className='msc-product'\n                    {...attribute}\n                >\n                    <div className='msc-product__image'>\n                        {renderProductPlacementImage(\n                            imageSettings,\n                            context.request.gridSettings,\n                            productImageUrl,\n                            product.PrimaryImageUrl,\n                            product.Name,\n                            context\n                        )}\n                    </div>\n                    <div className='msc-product__details'>\n                        <h2 className='msc-product__title'>{product.Name}</h2>\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                    </div>\n                </a>\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 <p className='msc-product__text'>{description}</p>;\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        <RatingComponent\n            context={coreContext}\n            id={moduleId}\n            typeName={moduleTypeName}\n            avgRating={avgRating}\n            ratingCount={numberRatings}\n            readOnly\n            ariaLabel={ratingAriaLabelText}\n            ratingCountAriaLabel={ratingCountAriaLabelText}\n            data={{}}\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        <PriceComponent\n            context={context}\n            id={id}\n            typeName={typeName}\n            product={product}\n            data={{ price }}\n            savingsText={savingsText}\n            freePriceText={freePriceText}\n            originalPriceText={originalPriceText}\n            isPriceMinMaxEnabled={isPriceMinMaxEnabled}\n            priceResources={priceResources}\n        />\n    );\n}\n\nfunction renderProductPlacementImage(\n    imageSettings?: IImageSettings,\n    gridSettings?: IGridSettings,\n    imageUrl?: string,\n    fallbackImageUrl?: string,\n    altText?: string,\n    context?: ICoreContext<IGeneric<IAny>>\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        <Image\n            requestContext={context?.actionContext.requestContext}\n            {...img}\n            {...imageProps}\n            loadFailureBehavior='empty'\n            bypassHideOnFailure\n        />\n    );\n}\n\nexport const ProductComponent: React.FunctionComponent<IProductComponentProps> = 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","productSearchResult","savingsText","freePriceText","originalPriceText","currentPriceText","isPriceMinMaxEnabled","priceResources","productPrice","product","ProductTypeValue","IsMasterProduct","ProductType","Master","Standalone","BasePrice","AdjustedPrice","Price","CustomerContextualPrice","MaxVariantPrice","MinVariantPrice","PriceComponent","data","renderProductPlacementImage","imageSettings","gridSettings","imageUrl","fallbackImageUrl","altText","img","src","imageProps","cropFocalRegion","Image","Object","assign","requestContext","actionContext","loadFailureBehavior","bypassHideOnFailure","shouldSkipToMainImage","ProductComponent","msdyn365Commerce","createComponentOverride","_objectSpread","component","_ref","_product$Name","_product$RecordId","_getProductImageUrlFr","_getProductPageUrlFro","ratingCountAriaLabel","allowBack","telemetryContent","quickViewButton","productComparisonButton","isEnabledProductDescription","inventoryLabel","dimensionAvailabilities","swatchItemAriaLabel","productClickAndCollect","ExtensionProperties","property","Key","productUrl","getProductPageUrlSync","Name","RecordId","Number","MIN_VALUE","undefined","productImageUrlFromSwatch","app","config","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","onMouseEnter","event","LifeStyleImageUrl","url","onMouseLeave","onClick","productItem","item_id","ItemId","item_name","index","item_list_id","item_list_name","item_variant","location_id","quantity","gtag","items","onTelemetryClick","cultureFormatter","formatCurrency","AverageRating","TotalRatings","DefaultUnitOfMeasure","description","Description","StoreId","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","Value","IntegerValue","quickview","selectedDimensions","getValues","DimensionTypeValue","convertDimensionTypeToProductDimensionType","DimensionValue","_context$actionContex","_context$actionContex2","stopPropagation","currency","channel","CompanyCurrency","item_category","store_name","store_id","selectedProductId","renderQuickView","catalogId","renderProductComparisonButton","getCatalogId","getDefaultSwatchSelected","_productData$Attribut","_attributeSwatches$fi","attributeSwatches","swatchProductImageUrls","getProductImageUrlFromDefaultSwatch","encodeURIComponent","validateCatalogId","_context$app$config","contextConfig","placeholderImageName","fallbackImageSource","fallBackSrc"],"sourceRoot":""}