{"version":3,"file":"static/js/a778ad92b6a722e9e5f6.bundle.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/themes/bluecrest/views/components/addtocart.component.tsx?270a","webpack://Msdyn365.Commerce.Online/./src/themes/bluecrest/views/components/product.component.tsx?0d2a","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 MsDyn365, {\r\n getCatalogId,\r\n IComponent,\r\n IComponentProps,\r\n IGridSettings,\r\n IImageSettings,\r\n msdyn365Commerce,\r\n TelemetryEvent\r\n} from '@msdyn365-commerce/core';\r\nimport { getCartState, ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\r\nimport {\r\n CartLineValidationResults,\r\n CartsDataActions,\r\n format,\r\n ProductAvailableQuantity,\r\n ProductDimension,\r\n ProductPrice,\r\n ProductsDataActions,\r\n ProductSearchCriteria,\r\n ProductType,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { ErrorNotification, NotificationsManager } from '@msdyn365-commerce-modules/notifications-core';\r\nimport { ArrayExtensions, generateProductImageUrl, ObjectExtensions, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, IPopupProps, ITelemetryContent, Popup } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport React, { useState } from 'react';\r\n\r\nimport {\r\n PriceComponent,\r\n IItemsAddedToCartResources,\r\n ItemsAddedToCartDialogComponent,\r\n ItemSuccessfullyAddedToCartNotification,\r\n MultiItemsSuccessfullyAddedToCartNotification,\r\n OrderDetailsProduct\r\n} from '@msdyn365-commerce/components';\r\n\r\n/**\r\n * Interface for add to cart resources.\r\n */\r\nexport interface IAddToCartResources {\r\n goToCartText: string;\r\n continueShoppingText: string;\r\n closeNotificationLabel: string;\r\n headerItemOneText: string;\r\n headerItemFormatText: string;\r\n headerLinesFormatText?: string;\r\n headerMessageText: string;\r\n freePriceText: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n addedQuantityText: string;\r\n buyAgainNotificationTitle?: string;\r\n buyAgainNotificationCloseAriaLabel?: string;\r\n validationErrorMessage?: string;\r\n oneErrorText?: string;\r\n multiErrorsText?: string;\r\n}\r\n\r\n/**\r\n * Interface for add to cart components props.\r\n */\r\nexport interface IAddToCartComponentProps extends IComponentProps<{ product: SimpleProduct; price?: ProductPrice } | undefined> {\r\n className?: string;\r\n addToCartText: string;\r\n outOfStockText?: string;\r\n disabled?: boolean;\r\n quantity?: number;\r\n navigationUrl?: string;\r\n productAvailability?: ProductAvailableQuantity;\r\n getSelectedProduct?: Promise;\r\n isNavigationToCartPageDisabled?: boolean;\r\n shouldSkipSiteSettings?: boolean;\r\n addToCartArialLabel?: string;\r\n products?: {\r\n productId: number;\r\n quantity: number;\r\n catalogId?: number;\r\n }[];\r\n orderDetailsProducts?: OrderDetailsProduct[];\r\n hasAvailableProducts?: boolean;\r\n imageSettings?: IImageSettings;\r\n gridSettings?: IGridSettings;\r\n\r\n isLoading?: boolean;\r\n isUpdatingDimension?: boolean;\r\n isLoadingDeliveryOptions?: boolean;\r\n isUpdatingDeliveryOptions?: boolean;\r\n isAddServiceItemToCart?: boolean;\r\n isAddEmailDeliveryItemToCart?: boolean;\r\n isPriceKeyedIn?: boolean;\r\n customPriceAmount?: number;\r\n isOrderQuantityLimitsFeatureEnabled?: boolean;\r\n\r\n dialogStrings?: IAddToCartResources;\r\n\r\n telemetryContent?: ITelemetryContent;\r\n\r\n catalogId?: number;\r\n\r\n isCustomPriceSelected?: boolean;\r\n maximumKeyInPrice?: number;\r\n minimumKeyInPrice?: number;\r\n defaultMaximumKeyInPrice?: number;\r\n defaultMinimumKeyInPrice?: number;\r\n isProductQuantityLoading?: boolean;\r\n\r\n onAdd?(result: ICartActionResult): void;\r\n onError?(result: IAddToCartFailureResult): void;\r\n changeUpdatingDimension?(isUpdatingDimension: boolean): void;\r\n changeUpdatingDeliveryOptions?(isUpdatingDeliveryOptions: boolean): void;\r\n}\r\n\r\n/**\r\n * Cart action Failure reason type.\r\n */\r\nexport declare type ICartActionFailureReason =\r\n | 'EMPTYINPUT'\r\n | 'MISSINGDIMENSION'\r\n | 'OUTOFSTOCK'\r\n | 'CARTACTIONFAILED'\r\n | 'INVALIDCUSTOMAMOUNT';\r\n\r\n/**\r\n * Interface for add to cart failure result.\r\n */\r\nexport interface IAddToCartFailureResult {\r\n failureReason: ICartActionFailureReason;\r\n\r\n stockLeft?: number;\r\n cartActionResult?: ICartActionResult;\r\n missingDimensions?: ProductDimension[];\r\n}\r\n\r\n/**\r\n * This setting defines the experience when a product is added to cart. Corresponds to the configuration in Fabrikam.\r\n */\r\nexport enum AddToCartBehavior {\r\n /**\r\n * Navigate to cart page.\r\n */\r\n goToCart = 'goToCart',\r\n\r\n /**\r\n * Show item added to cart popup.\r\n */\r\n showModal = 'showModal',\r\n\r\n /**\r\n * Show mini cart popup.\r\n */\r\n showMiniCart = 'showMiniCart',\r\n\r\n /**\r\n * Show item added to cart notification.\r\n */\r\n showNotification = 'showNotification',\r\n\r\n /**\r\n * Do nothing and stay on the page.\r\n */\r\n nothing = 'nothing'\r\n}\r\n\r\nconst zero = 0;\r\nconst defaultQuantity = 1;\r\n\r\n/**\r\n * The propagate result.\r\n * @param props -- The add to cart component props.\r\n * @param result -- The cart action result.\r\n */\r\nconst propagateResult = (props: IAddToCartComponentProps, result: ICartActionResult): void => {\r\n if (props.onAdd) {\r\n props.onAdd(result);\r\n }\r\n};\r\n\r\n/**\r\n * The propagate error.\r\n * @param props -- The add to cart component props.\r\n * @param result -- The add to cart failure result.\r\n */\r\nconst propagateError = (props: IAddToCartComponentProps, result: IAddToCartFailureResult): void => {\r\n if (props.onError) {\r\n props.onError(result);\r\n }\r\n};\r\n\r\n/**\r\n * Retrieves add to cart input from the component props.\r\n * @param props - Add to cart component props.\r\n * @returns Add to cart input.\r\n */\r\nconst getAddToCartInputFromProps = async (props: IAddToCartComponentProps) => {\r\n const products = props.orderDetailsProducts?.filter(product => !ObjectExtensions.isNullOrUndefined(product.simpleProduct));\r\n const input = products?.map(product => {\r\n return {\r\n product: product.simpleProduct!,\r\n count: ObjectExtensions.isNullOrUndefined(product.salesLine.Quantity) ? defaultQuantity : product.salesLine.Quantity,\r\n catalogId: product.salesLine.CatalogId\r\n };\r\n });\r\n\r\n if (ArrayExtensions.hasElements(input)) {\r\n return input;\r\n }\r\n\r\n if (ArrayExtensions.hasElements(props.products)) {\r\n const actionContext = props.context.actionContext;\r\n const apiSettings = actionContext.requestContext.apiSettings;\r\n\r\n const catalogId = props.catalogId ?? getCatalogId(props.context.actionContext.requestContext);\r\n validateCatalogId(catalogId);\r\n\r\n const searchCriteriaInput: ProductSearchCriteria = {\r\n Context: {\r\n ChannelId: apiSettings.channelId,\r\n CatalogId: catalogId\r\n },\r\n IncludeAttributes: false,\r\n Ids: props.products.map(product => product.productId)\r\n };\r\n\r\n const searchResult = await ProductsDataActions.searchByCriteriaAsync({ callerContext: actionContext }, searchCriteriaInput);\r\n const productSearchResultsWithImages = searchResult.map(productSearchResult => {\r\n const newProductSearchResult = { ...productSearchResult };\r\n const newImageUrl = generateProductImageUrl(newProductSearchResult, apiSettings);\r\n\r\n if (newImageUrl) {\r\n newProductSearchResult.PrimaryImageUrl = newImageUrl;\r\n }\r\n\r\n return newProductSearchResult;\r\n });\r\n\r\n return props.products.map(item => {\r\n const productData = productSearchResultsWithImages.find(product => product.RecordId === item.productId);\r\n let simpleProduct: SimpleProduct;\r\n if (productData) {\r\n simpleProduct = {\r\n ...productData,\r\n ProductTypeValue: ProductType.Variant,\r\n AdjustedPrice: productData.Price,\r\n BasePrice: productData.BasePrice ?? productData.Price\r\n };\r\n } else {\r\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Cast to simple product since only record id is available.\r\n simpleProduct = {\r\n RecordId: item.productId\r\n } as SimpleProduct;\r\n }\r\n\r\n return {\r\n product: simpleProduct,\r\n count: item.quantity,\r\n catalogId: item.catalogId\r\n };\r\n });\r\n }\r\n\r\n if (props.data?.product) {\r\n return [\r\n {\r\n product: props.data.product,\r\n count: props.quantity ?? defaultQuantity,\r\n catalogId: props.catalogId\r\n }\r\n ];\r\n }\r\n\r\n return [];\r\n};\r\n\r\n/**\r\n * Add one item to cart when it is not buy again.\r\n * @param props -- The props.\r\n * @param setDisabled -- The set disable call back.\r\n * @param openModal -- The open modal call back.\r\n */\r\nconst addOneItemToCart = async (\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n openModal: (opened: boolean) => void\r\n): Promise => {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n const addToCartBehavior = props.context.app.config.addToCartBehavior;\r\n const data = props.data;\r\n\r\n const addToCartInput = await getAddToCartInputFromProps(props);\r\n const product = addToCartInput[0].product;\r\n const quantity = addToCartInput[0].count;\r\n\r\n const cartState = await getCartState(props.context.actionContext);\r\n const addToCartResult = await cartState.addProductToCart({\r\n product,\r\n count: quantity,\r\n availableQuantity: props.productAvailability?.AvailableQuantity,\r\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: props.isOrderQuantityLimitsFeatureEnabled },\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n enableStockCheck: props.context.app.config.enableStockCheck,\r\n isPriceKeyedIn: props.isPriceKeyedIn,\r\n customPrice: props.isPriceKeyedIn ? props.customPriceAmount : undefined,\r\n isAddEmailDeliveryItemToCart: props.isAddEmailDeliveryItemToCart,\r\n shouldSkipSiteSettings: props.shouldSkipSiteSettings,\r\n catalogId: addToCartInput[0].catalogId\r\n });\r\n\r\n if (addToCartResult.status === 'SUCCESS') {\r\n if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showModal) {\r\n setDisabled(false);\r\n openModal(true);\r\n } else if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showNotification) {\r\n setDisabled(false);\r\n const notification = new ItemSuccessfullyAddedToCartNotification(\r\n props.context,\r\n props.dialogStrings,\r\n props.imageSettings,\r\n props.gridSettings,\r\n product,\r\n data?.price,\r\n quantity,\r\n props.navigationUrl,\r\n props.telemetryContent!,\r\n props.id,\r\n props.typeName\r\n );\r\n NotificationsManager.instance().addNotification(notification);\r\n } else if (\r\n MsDyn365.isBrowser &&\r\n props.navigationUrl &&\r\n !props.isNavigationToCartPageDisabled &&\r\n (addToCartBehavior === undefined || addToCartBehavior === AddToCartBehavior.goToCart)\r\n ) {\r\n window.location.assign(props.navigationUrl);\r\n } else {\r\n setDisabled(false);\r\n }\r\n propagateResult(props, addToCartResult);\r\n } else {\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n addToCartResult.errorDetails?.LocalizedMessage ?? 'Add to cart failed',\r\n props.dialogStrings?.closeNotificationLabel ?? ''\r\n )\r\n );\r\n\r\n propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: addToCartResult });\r\n setDisabled(false);\r\n }\r\n};\r\n\r\n/**\r\n * Callback to handle success of adding to cart.\r\n * @param props - Add to cart component props.\r\n * @param setDisabled - Callback to update disabled state of the component.\r\n * @param setItemsAddedToCartDialogOpen - Callback to update disabled state of the component.\r\n * @param setErrorMessage - Callback to update error message state of the component.\r\n * @param cartState - Current cart state.\r\n * @param addToCartInput - Input used for adding to cart.\r\n * @param addToCartResult - Result of adding to cart.\r\n */\r\nconst handleAddItemsToCartSuccess = async (\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\r\n setErrorMessage: (message: string) => void,\r\n cartState: ICartState,\r\n addToCartInput: {\r\n product: SimpleProduct;\r\n count: number;\r\n }[],\r\n addToCartResult: ICartActionResult\r\n) => {\r\n // Validate cart for line errors.\r\n const validationResult: CartLineValidationResults = await CartsDataActions.validateForCheckoutAsync(\r\n { callerContext: props.context.actionContext, bypassCache: 'none' },\r\n cartState.cart.Id,\r\n cartState.cart.Version\r\n );\r\n const errorCount = (validationResult.ValidationFailuresByCartLines ?? []).length;\r\n const singleErrorCount = 1;\r\n const errorText = errorCount === singleErrorCount ? props.dialogStrings?.oneErrorText : props.dialogStrings?.multiErrorsText;\r\n const errorMessage =\r\n errorCount > zero ? format(props.dialogStrings?.validationErrorMessage ?? '', errorCount.toString(), errorText) : '';\r\n\r\n setErrorMessage(errorMessage);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n const addToCartBehavior = props.context.app.config.addToCartBehavior;\r\n\r\n if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showModal) {\r\n setDisabled(false);\r\n setItemsAddedToCartDialogOpen(true);\r\n } else if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showNotification) {\r\n setDisabled(false);\r\n const itemsAddedResource: IItemsAddedToCartResources = {\r\n viewCartButtonText: props.dialogStrings.goToCartText,\r\n closeButtonLabel: props.dialogStrings.closeNotificationLabel,\r\n itemsAddedToCartHeaderText: props.dialogStrings.headerMessageText,\r\n itemsAddedToCartFormatText: props.dialogStrings.headerItemFormatText,\r\n linesAddedToCartFormatText: props.dialogStrings.headerLinesFormatText ?? '{0}',\r\n itemsAddedValidationErrorMessage: errorMessage\r\n };\r\n\r\n const notification = new MultiItemsSuccessfullyAddedToCartNotification(\r\n props.context,\r\n itemsAddedResource,\r\n props.imageSettings,\r\n props.gridSettings,\r\n addToCartInput,\r\n props.navigationUrl,\r\n props.telemetryContent!,\r\n props.id,\r\n props.typeName\r\n );\r\n NotificationsManager.instance().addNotification(notification);\r\n } else if (\r\n MsDyn365.isBrowser &&\r\n props.navigationUrl &&\r\n !props.isNavigationToCartPageDisabled &&\r\n (addToCartBehavior === undefined || addToCartBehavior === AddToCartBehavior.goToCart)\r\n ) {\r\n window.location.assign(props.navigationUrl);\r\n } else {\r\n setDisabled(false);\r\n }\r\n propagateResult(props, addToCartResult);\r\n};\r\n\r\n/**\r\n * Add one or multi item to cart from buy again.\r\n * @param props -- The props.\r\n * @param setDisabled -- The set disable call back.\r\n * @param setItemsAddedToCartDialogOpen -- The open modal call back.\r\n * @param setErrorMessage -- The set error message call back.\r\n */\r\nconst addItemsToCart = async (\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\r\n setErrorMessage: (message: string) => void\r\n): Promise => {\r\n const addToCartInput = await getAddToCartInputFromProps(props);\r\n\r\n if (!ArrayExtensions.hasElements(addToCartInput)) {\r\n return;\r\n }\r\n\r\n const cartState = await getCartState(props.context.actionContext);\r\n const addToCartResult = await cartState.addProductsToCart(addToCartInput);\r\n\r\n if (addToCartResult.status === 'SUCCESS') {\r\n await handleAddItemsToCartSuccess(\r\n props,\r\n setDisabled,\r\n setItemsAddedToCartDialogOpen,\r\n setErrorMessage,\r\n cartState,\r\n addToCartInput,\r\n addToCartResult\r\n );\r\n } else {\r\n if (props.dialogStrings?.buyAgainNotificationTitle) {\r\n // For buy again show simple error notification.\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n props.dialogStrings.buyAgainNotificationTitle,\r\n props.dialogStrings.buyAgainNotificationCloseAriaLabel ?? ''\r\n )\r\n );\r\n } else {\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n addToCartResult.errorDetails?.LocalizedMessage ?? 'Add to cart failed',\r\n props.dialogStrings?.closeNotificationLabel ?? ''\r\n )\r\n );\r\n }\r\n\r\n propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: addToCartResult });\r\n setDisabled(false);\r\n }\r\n};\r\n\r\n/**\r\n * Interface for add to cart component.\r\n */\r\nexport interface IAddtoCartComponent extends IComponent {\r\n onClick(): (event: React.MouseEvent, props: IAddToCartComponentProps) => void;\r\n}\r\n\r\n/**\r\n * On click function.\r\n * @param _event - The mouse event.\r\n * @param props - The props.\r\n * @param setDisabled - Flag to define whether the element is disabled.\r\n * @param openModal - Flag to specify if it should open in a modal window.\r\n * @param setItemsAddedToCartDialogOpen - Sets items added to cart while dialog is open.\r\n * @param setErrorMessage - Error message.\r\n */\r\nconst onClick = async (\r\n _event: React.MouseEvent,\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n openModal: (opened: boolean) => void,\r\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\r\n setErrorMessage: (message: string) => void\r\n): Promise => {\r\n if (!ArrayExtensions.hasElements(props.products)) {\r\n const cartError = addToCartError(props);\r\n\r\n if (cartError) {\r\n propagateError(props, cartError);\r\n return;\r\n }\r\n\r\n setDisabled(true);\r\n }\r\n\r\n const hasOrderDetailsProducts =\r\n ArrayExtensions.hasElements(props.orderDetailsProducts) && props.orderDetailsProducts.length > defaultQuantity;\r\n const hasProducts = ArrayExtensions.hasElements(props.products) && props.products.length > defaultQuantity;\r\n\r\n const hasMultipleProducts = hasOrderDetailsProducts || hasProducts;\r\n\r\n if (props.shouldSkipSiteSettings && hasMultipleProducts) {\r\n await addItemsToCart(props, setDisabled, setItemsAddedToCartDialogOpen, setErrorMessage);\r\n } else {\r\n await addOneItemToCart(props, setDisabled, openModal);\r\n }\r\n};\r\n\r\n/**\r\n * Add to cart component action constant.\r\n */\r\nconst AddToCartComponentActions = {\r\n onClick\r\n};\r\n\r\n/**\r\n * Add to cart component.\r\n * @param props - The props.\r\n * @returns - The add to cart component.\r\n */\r\nexport const AddToCartFunctionalComponent: React.FC = (props: IAddToCartComponentProps) => {\r\n const [disabled, setDisabled] = useState(false);\r\n const [modalOpen, setModalOpen] = useState(false);\r\n const [isItemsAddedToCartDialogOpen, setItemsAddedToCartDialogOpen] = useState(false);\r\n const [errorMessage, setErrorMessage] = useState('');\r\n const [addToCartInput, setAddToCartInput] = useState<\r\n {\r\n product: SimpleProduct;\r\n count: number;\r\n }[]\r\n >([]);\r\n const onClickHandler = async (event: React.MouseEvent) => {\r\n await AddToCartComponentActions.onClick(event, props, setDisabled, setModalOpen, setItemsAddedToCartDialogOpen, setErrorMessage);\r\n };\r\n\r\n /**\r\n * Close dialog.\r\n */\r\n const closeItemsAddedToCartDialog = React.useCallback(() => {\r\n setItemsAddedToCartDialogOpen(false);\r\n }, []);\r\n\r\n const priceComponent = props.data?.price ? (\r\n \r\n ) : (\r\n ''\r\n );\r\n\r\n const popupProps: IPopupProps = {\r\n context: props.context,\r\n className: 'msc-add-to-cart',\r\n id: props.id,\r\n typeName: props.typeName,\r\n data: { product: addToCartInput[0]?.product, price: props.data?.price }, // addToCartInput[0]?.product?.Price },\r\n dialogStrings: props.dialogStrings,\r\n imageSettings: props.imageSettings,\r\n gridSettings: props.context.request.gridSettings,\r\n productQuantity: addToCartInput[0]?.count !== undefined ? addToCartInput[0]?.count : defaultQuantity,\r\n priceComponent,\r\n navigationUrl: props.navigationUrl,\r\n modalOpen,\r\n setModalOpen,\r\n telemetryContent: props.telemetryContent\r\n };\r\n\r\n const itemsAddedResource: IItemsAddedToCartResources = {\r\n viewCartButtonText: props.dialogStrings?.goToCartText ?? '',\r\n closeButtonLabel: props.dialogStrings?.closeNotificationLabel ?? 'Close',\r\n itemsAddedToCartHeaderText: props.dialogStrings?.headerMessageText ?? '',\r\n itemsAddedToCartFormatText: props.dialogStrings?.headerItemFormatText ?? '',\r\n linesAddedToCartFormatText: props.dialogStrings?.headerLinesFormatText ?? '{0}',\r\n itemsAddedValidationErrorMessage: errorMessage\r\n };\r\n\r\n const renderModalPopup = ;\r\n const label = getLinkText(props);\r\n const payload = getPayloadObject(TelemetryEvent.AddToCart, props.telemetryContent!, label, '');\r\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\r\n const buttonClassName = props.shouldSkipSiteSettings ? '' : 'msc-add-to-cart ';\r\n\r\n React.useEffect(() => {\r\n /**\r\n * Retrieves add to cart input and updates the state.\r\n */\r\n const retrieveAddToCartInput = async () => {\r\n const retrievedInput = await getAddToCartInputFromProps(props);\r\n setAddToCartInput(retrievedInput);\r\n };\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call async method as per the documentation of react useEffect.\r\n retrieveAddToCartInput();\r\n }, [props, setAddToCartInput]);\r\n\r\n return (\r\n <>\r\n {renderModalPopup}\r\n \r\n {label}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\n// Set default props\r\nAddToCartFunctionalComponent.defaultProps = {\r\n quantity: defaultQuantity\r\n};\r\n\r\n/**\r\n * Resolves whether product is in stock.\r\n * @param props - The add to cart component props.\r\n * @returns Gets the link text.\r\n */\r\nconst getLinkText = (props: IAddToCartComponentProps): string => {\r\n return shouldShowOutOfStock(props, false) && props.outOfStockText ? props.outOfStockText : props.addToCartText;\r\n};\r\n\r\n/**\r\n * Resolves whether product is in stock.\r\n * @param props - The add to cart component props.\r\n * @returns The add to cart failure result.\r\n */\r\nconst addToCartError = (props: IAddToCartComponentProps): IAddToCartFailureResult | undefined => {\r\n const {\r\n data,\r\n productAvailability,\r\n isCustomPriceSelected,\r\n customPriceAmount,\r\n maximumKeyInPrice,\r\n minimumKeyInPrice,\r\n defaultMaximumKeyInPrice = 100,\r\n defaultMinimumKeyInPrice = 10\r\n } = props;\r\n\r\n if (!data || !data.product.RecordId) {\r\n // No product exists, won't be able to add to cart\r\n return { failureReason: 'EMPTYINPUT' };\r\n }\r\n\r\n if (data.product.Dimensions) {\r\n const missingDimensions = data.product.Dimensions.filter(\r\n dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value)\r\n );\r\n\r\n if (ArrayExtensions.hasElements(missingDimensions)) {\r\n // At least one dimension with no value exists on the product, won't be able to add to cart\r\n return { failureReason: 'MISSINGDIMENSION', missingDimensions };\r\n }\r\n }\r\n\r\n if (shouldShowOutOfStock(props, true)) {\r\n const defaultAvailableQuantity = 0; // Showing as out of stock if no available products found.\r\n const availableQuantity = productAvailability?.AvailableQuantity ?? defaultAvailableQuantity;\r\n const stockLeft = Math.max(availableQuantity, defaultAvailableQuantity);\r\n\r\n return { failureReason: 'OUTOFSTOCK', stockLeft };\r\n }\r\n\r\n // When Custom price is selected, if there is no keyed-in price or keyed-in price is out of limit, should return error.\r\n if (\r\n isCustomPriceSelected &&\r\n (!customPriceAmount ||\r\n customPriceAmount > (maximumKeyInPrice || defaultMaximumKeyInPrice) ||\r\n customPriceAmount < (minimumKeyInPrice || defaultMinimumKeyInPrice))\r\n ) {\r\n return { failureReason: 'INVALIDCUSTOMAMOUNT' };\r\n }\r\n\r\n // Only allow adding to cart if not showing out of stock\r\n return undefined;\r\n};\r\n\r\n/**\r\n * Resolves whether product is in stock.\r\n * @param props - The add to cart component props.\r\n * @param includeCurrentQuantity - Flag to specify whether current quantity should be included.\r\n * @returns The dialog element.\r\n */\r\nconst shouldShowOutOfStock = (props: IAddToCartComponentProps, includeCurrentQuantity: boolean): boolean => {\r\n if (props.context.app.config.enableStockCheck === undefined || props.context.app.config.enableStockCheck === false) {\r\n return false;\r\n }\r\n\r\n // When skip site settings do not need show out of stock on adding to cart\r\n if (props.shouldSkipSiteSettings) {\r\n return false;\r\n }\r\n\r\n if (\r\n props.isLoading ||\r\n props.isProductQuantityLoading ||\r\n props.isUpdatingDimension ||\r\n props.isLoadingDeliveryOptions ||\r\n props.isUpdatingDeliveryOptions ||\r\n props.isAddServiceItemToCart\r\n ) {\r\n // Out of stock turn off, don't bother showing out of stock\r\n return false;\r\n }\r\n\r\n if (!props.data || !props.data.product.RecordId) {\r\n // No product exists, don't bother showing out of stock\r\n return false;\r\n }\r\n\r\n const hasAvailableProducts = props.hasAvailableProducts ?? true;\r\n if (!hasAvailableProducts) {\r\n return true;\r\n }\r\n\r\n if (props.data.product.Dimensions) {\r\n if (props.data.product.Dimensions.find(dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value))) {\r\n // At least one dimension with no value exists on the product, so also don't show out of stock\r\n return false;\r\n }\r\n }\r\n\r\n const includedQuantityNumber = includeCurrentQuantity && props.quantity ? props.quantity : defaultQuantity;\r\n\r\n return !(\r\n props.productAvailability &&\r\n props.productAvailability.AvailableQuantity !== undefined &&\r\n props.productAvailability.AvailableQuantity >= includedQuantityNumber\r\n );\r\n};\r\n\r\nconst isIntermediateState = (props: IAddToCartComponentProps): boolean => {\r\n if (props.data?.product.Dimensions) {\r\n if (props.data.product.Dimensions.find(dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value))) {\r\n // At least one dimension with no value exists on the product, so also not in intermediate state\r\n return false;\r\n }\r\n }\r\n\r\n if (!props.isLoading && !props.isUpdatingDimension && !props.isLoadingDeliveryOptions && !props.isUpdatingDeliveryOptions) {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\n// @ts-expect-error\r\nexport const AddToCartComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride(\r\n 'AddToCart',\r\n { component: AddToCartFunctionalComponent, ...AddToCartComponentActions }\r\n);\r\n\r\nexport default AddToCartComponent;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport { IPriceComponentResources, ISwatchItem, ProductComponentSwatchComponent, RatingComponent } from '@msdyn365-commerce/components';\r\nimport {\r\n getCatalogId,\r\n IAny,\r\n IComponent,\r\n IComponentProps,\r\n ICoreContext,\r\n IGeneric,\r\n IGridSettings,\r\n IImageData,\r\n IImageSettings,\r\n Image,\r\n msdyn365Commerce,\r\n getUrlSync\r\n} from '@msdyn365-commerce/core';\r\nimport {\r\n AttributeSwatch,\r\n AttributeValue,\r\n CommerceProperty,\r\n ProductDimension,\r\n ProductPrice,\r\n ProductSearchResult,\r\n ProductType\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n convertDimensionTypeToProductDimensionType,\r\n Dictionary,\r\n DimensionTypes,\r\n generateImageUrl,\r\n getProductPageUrlSync,\r\n IDimensionsApp,\r\n StringExtensions,\r\n validateCatalogId\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n format,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n ITelemetryContent,\r\n onTelemetryClick,\r\n IncrementalQuantity\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport React, { useState } from 'react';\r\nimport AddToCartComponent from './addtocart.component';\r\nimport { ISearchResultContainerResources } from '../../definition-extensions/search-result-container.ext.props.autogenerated';\r\n\r\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult; productPrice?: ProductPrice }> {\r\n className?: string;\r\n productPrices?: ProductPrice[];\r\n imageSettings?: IImageSettings;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n ratingAriaLabel?: string;\r\n ratingCountAriaLabel?: string;\r\n allowBack?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n quickViewButton?: React.ReactNode;\r\n productComparisonButton?: React.ReactNode;\r\n isEnabledProductDescription?: boolean;\r\n isPriceMinMaxEnabled?: boolean;\r\n priceResources?: IPriceComponentResources;\r\n inventoryLabel?: string;\r\n dimensionAvailabilities?: IProductsDimensionsAvailabilities[];\r\n swatchItemAriaLabel?: string;\r\n loginRegisterResource?: string;\r\n resources?: ISearchResultContainerResources;\r\n}\r\n\r\nexport interface IProductComponent extends IComponent {}\r\n\r\nconst PriceComponentActions = {};\r\n\r\n/**\r\n * Gets the product page url from the default swatch selected.\r\n * @param productData - Product card to be rendered.\r\n * @returns The default color swatch selected if any.\r\n */\r\nfunction getDefaultSwatchSelected(coreContext: ICoreContext, productData?: ProductSearchResult): AttributeSwatch | null {\r\n if (!productData || !productData.AttributeValues) {\r\n return null;\r\n }\r\n\r\n const siteContext = coreContext as ICoreContext;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n\r\n const attributeSwatches = productData.AttributeValues.find(\r\n attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === dimensionToPreSelectInProductCard\r\n )?.Swatches;\r\n\r\n if (!ArrayExtensions.hasElements(attributeSwatches)) {\r\n return null;\r\n }\r\n\r\n const defaultSwatch = attributeSwatches.find(item => item.IsDefault === true) ?? attributeSwatches[0];\r\n return defaultSwatch;\r\n}\r\n\r\n/**\r\n * Gets the product image from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\nfunction getProductImageUrlFromDefaultSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\r\n const defaultSwatch = getDefaultSwatchSelected(coreContext, productData);\r\n const swatchProductImageUrls = defaultSwatch?.ProductImageUrls;\r\n if (!ArrayExtensions.hasElements(swatchProductImageUrls)) {\r\n return productData?.PrimaryImageUrl;\r\n }\r\n\r\n return generateImageUrl(swatchProductImageUrls[0], coreContext.request.apiSettings);\r\n}\r\n\r\n/**\r\n * Updates the product url link to product details page.\r\n * @param productDetailsPageUrl - Product page url.\r\n * @param coreContext - Context of the module using the component.\r\n * @param queryString - Querystring to be added to the URL.\r\n * @returns The update product page url.\r\n */\r\nfunction updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\r\n const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\r\n if (sourceUrl.search) {\r\n sourceUrl.search += `&${queryString}`;\r\n } else {\r\n sourceUrl.search += queryString;\r\n }\r\n\r\n const updatedUrl = new URL(sourceUrl.href);\r\n return updatedUrl.pathname + sourceUrl.search;\r\n}\r\n\r\n/**\r\n * Gets the react node for product unit of measure display.\r\n * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n\r\n/**\r\n * Gets the react node for product availability.\r\n * @param inventoryAvailabilityLabel - The product information.\r\n * @returns The node representing markup for product availability.\r\n */\r\nfunction renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\r\n if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n {inventoryAvailabilityLabel}\r\n
\r\n );\r\n}\r\n\r\n/**\r\n * Renders product comparison button similar to the quick view button.\r\n * @param productComparisonButton - React element of the button.\r\n * @param product - Current product info.\r\n * @param catalogId - Current catalog.\r\n * @returns React element for the specific product.\r\n */\r\nfunction renderProductComparisonButton(\r\n productComparisonButton: React.ReactNode,\r\n product: ProductSearchResult,\r\n catalogId: number\r\n): JSX.Element | undefined {\r\n validateCatalogId(catalogId);\r\n return React.cloneElement(productComparisonButton as React.ReactElement, { product, catalogId });\r\n}\r\n\r\n/**\r\n * Gets the product page url from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productUrl - Product page url for the product card.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\nfunction getProductPageUrlFromDefaultSwatch(\r\n coreContext: ICoreContext,\r\n productUrl: string,\r\n productData?: ProductSearchResult\r\n): string | undefined {\r\n const defaultSwatch = getDefaultSwatchSelected(coreContext, productData);\r\n if (!defaultSwatch?.SwatchValue) {\r\n return productUrl;\r\n }\r\n\r\n const siteContext = coreContext as ICoreContext;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n\r\n const queryStringEncoded = encodeURIComponent(defaultSwatch.SwatchValue);\r\n const queryString = `${dimensionToPreSelectInProductCard}=${queryStringEncoded}`;\r\n return updateProductUrl(productUrl, coreContext, queryString);\r\n}\r\n\r\nconst ProductCard: React.FC = ({\r\n data,\r\n context,\r\n imageSettings,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText,\r\n ratingAriaLabel,\r\n ratingCountAriaLabel,\r\n allowBack,\r\n typeName,\r\n id,\r\n productPrices,\r\n telemetryContent,\r\n quickViewButton,\r\n productComparisonButton,\r\n isEnabledProductDescription,\r\n isPriceMinMaxEnabled,\r\n priceResources,\r\n inventoryLabel,\r\n dimensionAvailabilities,\r\n swatchItemAriaLabel,\r\n loginRegisterResource,\r\n resources\r\n}) => {\r\n const product = data.product;\r\n // Customization to see if user is authenticated and use it where we need to hide price\r\n const isAuthenticated = context?.request?.user?.isAuthenticated;\r\n const user = context?.request?.user;\r\n let productUrl = getProductPageUrlSync(product?.Name ?? '', product?.RecordId ?? Number.MIN_VALUE, context.actionContext, undefined);\r\n if (allowBack) {\r\n productUrl = updateProductUrl(productUrl, context, 'back=true');\r\n }\r\n const productImageUrlFromSwatch = getProductImageUrlFromDefaultSwatch(context, product) ?? product?.PrimaryImageUrl;\r\n const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\r\n const [productPageUrl, setProductPageUrl] = useState(productPageUrlFromSwatch);\r\n const [productImageUrl, setProductImageUrl] = useState(productImageUrlFromSwatch);\r\n React.useEffect(() => {\r\n setProductPageUrl(productPageUrlFromSwatch);\r\n setProductImageUrl(productImageUrlFromSwatch);\r\n }, [productUrl, productPageUrlFromSwatch, productImageUrlFromSwatch]);\r\n const [selectedSwatchItems] = useState(new Dictionary());\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access -- app context is generic\r\n const enableStockCheck = context.app.config.enableStockCheck;\r\n\r\n const siteContext = context as ICoreContext;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n\r\n /**\r\n * Updates the product page and Image url based on swatch selected.\r\n * @param coreContext - Context of the caller.\r\n * @param swatchItem - Dimension swatch selected.\r\n */\r\n const updatePageAndImageUrl = React.useCallback(\r\n (coreContext: ICoreContext, swatchItem: ISwatchItem) => {\r\n const dimensionType = swatchItem.dimensionType;\r\n selectedSwatchItems.setValue(dimensionType, swatchItem);\r\n if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\r\n return;\r\n }\r\n const queryString = `${dimensionType}=${swatchItem.value}`;\r\n let productPageUrlWithSwatch = '';\r\n if (productPageUrl.includes(dimensionType)) {\r\n const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\r\n newUrl.searchParams.delete(dimensionType);\r\n productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\r\n } else {\r\n productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\r\n }\r\n setProductPageUrl(productPageUrlWithSwatch);\r\n if (dimensionType === dimensionToPreSelectInProductCard) {\r\n const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls)\r\n ? swatchItem.productImageUrls[0]\r\n : undefined;\r\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\r\n setProductImageUrl(newImageUrl);\r\n }\r\n },\r\n [selectedSwatchItems, context, productPageUrl]\r\n );\r\n\r\n if (!product) {\r\n return null;\r\n }\r\n\r\n /**\r\n * Checks if rendering the particular dimensions is allowed for product card.\r\n * @param dimensionType - Dimension to be displayed.\r\n * @returns Updates the state with new product page url.\r\n */\r\n function shouldDisplayDimension(dimensionType: string): boolean {\r\n const dimensionsContext = context as ICoreContext;\r\n const dimensionsToDisplayOnProductCard = dimensionsContext.app.config.dimensionsInProductCard;\r\n return (\r\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\r\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\r\n dimensionsToDisplayOnProductCard.includes(dimensionType.toLocaleLowerCase() as DimensionTypes)\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product dimension as swatch.\r\n * @param attributeValues - Attribute value property from product.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n function renderProductDimensions(attributeValues?: AttributeValue[]): JSX.Element | null {\r\n if (!attributeValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n {attributeValues.map((item: AttributeValue) => {\r\n const dimensionTypeValue = item.KeyName?.toLocaleLowerCase() ?? '';\r\n if (!shouldDisplayDimension(dimensionTypeValue)) {\r\n return null;\r\n }\r\n\r\n const siteContext = context as ICoreContext;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n const dimensionType = dimensionTypeValue as DimensionTypes;\r\n const swatches =\r\n item.Swatches?.map(swatchItem => {\r\n return {\r\n itemId: `${item.RecordId ?? ''}-${dimensionTypeValue}-${swatchItem.SwatchValue ?? ''}`,\r\n value: swatchItem.SwatchValue ?? '',\r\n dimensionType,\r\n colorHexCode: swatchItem.SwatchColorHexCode,\r\n imageUrl: swatchItem.SwatchImageUrl,\r\n productImageUrls: swatchItem.ProductImageUrls,\r\n isDefault: swatchItem.IsDefault,\r\n swatchItemAriaLabel: swatchItemAriaLabel ? format(swatchItemAriaLabel, dimensionType) : '',\r\n isDisabled:\r\n enableStockCheck &&\r\n dimensionAvailabilities?.find(\r\n dimensionAvailability => dimensionAvailability.value === (swatchItem.SwatchValue ?? '')\r\n )?.isDisabled\r\n };\r\n }) ?? [];\r\n if (\r\n dimensionType === dimensionToPreSelectInProductCard &&\r\n ArrayExtensions.hasElements(swatches) &&\r\n !swatches.some(swatch => swatch.isDefault)\r\n ) {\r\n swatches[0].isDefault = true;\r\n }\r\n return (\r\n \r\n );\r\n })}\r\n
\r\n );\r\n }\r\n\r\n function renderSupersededProductText(extensionProps: CommerceProperty[] | undefined): JSX.Element | null {\r\n if (!extensionProps) {\r\n return null;\r\n }\r\n\r\n const supersededItemId = extensionProps ? extensionProps.find(prop => prop.Key === 'supersededItemId')?.Value?.StringValue : '';\r\n const alternateProductText = extensionProps\r\n ? extensionProps.find(prop => prop.Key === 'alternateProductText')?.Value?.StringValue\r\n : '';\r\n const supersededProductTextFallBack = context.app.config.supersededProductText;\r\n if (supersededItemId) {\r\n return (\r\n <>\r\n {isAuthenticated ? (\r\n
\r\n {alternateProductText\r\n ? alternateProductText?.replace('{}', supersededItemId)\r\n : supersededProductTextFallBack?.replace('{}', supersededItemId)}\r\n
\r\n ) : (\r\n <>\r\n )}\r\n \r\n );\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n function renderStockCheckProductText(extensionProps: CommerceProperty[] | undefined): JSX.Element | null {\r\n if (!extensionProps) {\r\n return null;\r\n }\r\n\r\n const stockAvailabilityText = extensionProps ? extensionProps.find(prop => prop.Key === 'stockCheckText')?.Value?.StringValue : '';\r\n const stockAvailabilityCode = extensionProps ? extensionProps.find(prop => prop.Key === 'stockCheckCode')?.Value?.StringValue : '';\r\n const stockAvail = stockAvailabilityCode === 'AVAIL';\r\n const stockLa = stockAvailabilityCode === 'LA';\r\n const stockOos = stockAvailabilityCode === 'OOS';\r\n if (stockAvailabilityText) {\r\n return (\r\n <>\r\n {isAuthenticated ? (\r\n \r\n {stockAvailabilityText}\r\n \r\n ) : (\r\n <>\r\n )}\r\n \r\n );\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n const renderConditionalProductAttributes = (\r\n attributeValues?: AttributeValue[],\r\n fallbackText?: string,\r\n attributeKeyName?: string,\r\n attributeKeyNameText?: string,\r\n className?: string\r\n ): JSX.Element | null => {\r\n if (!attributeValues) {\r\n return null;\r\n }\r\n const productAttributeFallbackText = fallbackText && context.app.config[fallbackText];\r\n const isProductAttributeAvailable = attributeValues.find(attribute => attribute.KeyName === attributeKeyName)?.BooleanValue;\r\n const productAttributeText = attributeValues.find(attribute => attribute.KeyName === attributeKeyNameText)?.TextValue;\r\n\r\n if (isProductAttributeAvailable) {\r\n return
{productAttributeText ? productAttributeText : productAttributeFallbackText}
;\r\n }\r\n return null;\r\n };\r\n\r\n const renderDropshipProductText = (attributeValues?: AttributeValue[]): JSX.Element | null => {\r\n return renderConditionalProductAttributes(attributeValues, 'dropshipProductText', 'DropShip', 'DropShipText', 'dropship-item-text');\r\n };\r\n\r\n const renderSpecialOrderProductText = (attributeValues?: AttributeValue[]): JSX.Element | null => {\r\n return renderConditionalProductAttributes(\r\n attributeValues,\r\n 'specialProductText',\r\n 'SpecialOrder',\r\n 'SpecialOrderText',\r\n 'special-item-text'\r\n );\r\n };\r\n\r\n const renderRepairableProductText = (attributeValues?: AttributeValue[]): JSX.Element | null => {\r\n return renderConditionalProductAttributes(\r\n attributeValues,\r\n 'repairableProductText',\r\n 'Repairable',\r\n 'RepairableText',\r\n 'repairable-item-text'\r\n );\r\n };\r\n\r\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\r\n if (quickview === null) {\r\n return undefined;\r\n }\r\n const selectedDimensions: ProductDimension[] = selectedSwatchItems.getValues().map(swatches => {\r\n return {\r\n DimensionTypeValue: convertDimensionTypeToProductDimensionType(swatches.dimensionType),\r\n DimensionValue: {\r\n RecordId: 0,\r\n Value: swatches.value\r\n }\r\n };\r\n });\r\n return (\r\n
\r\n {React.cloneElement(quickview as React.ReactElement, { selectedProductId: item, selectedDimensions })}\r\n
\r\n );\r\n }\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.RecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\r\n let partNo = '';\r\n const productPricesView = (resources: ISearchResultContainerResources): JSX.Element => {\r\n let discount: number = 0;\r\n let DiscountAmount: number = 0;\r\n productPrices\r\n ?.filter(PLProduct => product?.ItemId === PLProduct?.ItemId)\r\n .map(data => {\r\n let discountedPrice: number = data?.BasePrice ?? 0;\r\n let originalPrice: number = data?.CustomerContextualPrice ?? 0;\r\n discount = Number((100 - (originalPrice / discountedPrice) * 100).toFixed(2));\r\n DiscountAmount = data?.DiscountAmount ?? 0;\r\n });\r\n return (\r\n <>\r\n {productPrices\r\n ?.filter(PLProduct => product?.ItemId === PLProduct?.ItemId)\r\n .map(data => {\r\n data.ItemId ? (partNo = data.ItemId) : '';\r\n const basePriceNum = data?.BasePrice?.toFixed(2);\r\n const basePrice = basePriceNum && context.cultureFormatter.formatCurrency(basePriceNum);\r\n const discountedPriceNum = data.CustomerContextualPrice?.toFixed(2);\r\n const discountedPrice = discountedPriceNum && context.cultureFormatter.formatCurrency(discountedPriceNum);\r\n const tradeAgreementPriceNum = data.TradeAgreementPrice?.toFixed(2);\r\n const tradeAgreementPrice =\r\n tradeAgreementPriceNum && context.cultureFormatter.formatCurrency(tradeAgreementPriceNum);\r\n return (\r\n
\r\n {DiscountAmount > 0 ? (\r\n // discountedPrice\r\n //added toFixed(2) to round to 2 values after decimals\r\n //format(swatchItemAriaLabel, dimensionType)\r\n <>\r\n
\r\n {resources.productCardPriceText}\r\n {basePrice}\r\n \r\n {format(resources.productCardDiscountValue, discount)}\r\n \r\n
\r\n
\r\n {resources.productCardYourPriceText}\r\n {discountedPrice}\r\n
\r\n \r\n ) : data.BasePrice !== data.AdjustedPrice &&\r\n data.BasePrice === data.TradeAgreementPrice &&\r\n DiscountAmount === 0 ? (\r\n //adjustedPrice\r\n //added toFixed(2) to round to 2 values after decimals\r\n <>\r\n
\r\n {resources.productCardPriceText}\r\n {basePrice}\r\n
\r\n
\r\n {resources.productCardYourPriceText}\r\n {discountedPrice}\r\n
\r\n \r\n ) : data.BasePrice !== data.TradeAgreementPrice &&\r\n data.BasePrice !== data.AdjustedPrice &&\r\n data.TradeAgreementPrice !== data.AdjustedPrice ? (\r\n //tradeAgreementPrice && adjusted together scenario\r\n //added toFixed(2) to round to 2 values after decimals\r\n <>\r\n
\r\n {resources.productCardPriceText}\r\n {tradeAgreementPrice}\r\n
\r\n
\r\n {resources.productCardYourPriceText}\r\n {discountedPrice}\r\n
\r\n \r\n ) : data.BasePrice !== data.TradeAgreementPrice ? (\r\n //tradeAgreementPrice\r\n //added toFixed(2) to round to 2 values after decimals\r\n
\r\n {resources.productCardPriceText}\r\n {discountedPrice}\r\n
\r\n ) : (\r\n //NormalPrice\r\n //added toFixed(2) to round to 2 values after decimals\r\n
\r\n {resources.productCardPriceText}\r\n {discountedPrice}\r\n
\r\n )}\r\n
\r\n );\r\n })}\r\n \r\n );\r\n };\r\n const productPriceItem = productPrices?.find(item => item.ItemId === product.ItemId);\r\n const defaultImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=240&h=240&m=6', w: 0, h: 0 },\r\n lg: { q: 'w=240&h=240&m=6', w: 0, h: 0 },\r\n xl: { q: 'w=240&h=240&m=6', w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n const maxQuantity = context.app.config.maxQuantityForCartLineItem;\r\n const [currentQuantity, setCurrentQuantity] = React.useState(1);\r\n const maxQuantityText = resources?.productCardMaxQuantityText?.replace('{max}', maxQuantity.toString());\r\n\r\n const onQuantityChange = (value: number) => {\r\n setCurrentQuantity(value);\r\n return true;\r\n };\r\n\r\n return (\r\n <>\r\n
\r\n {isEnabledProductDescription ? (\r\n \r\n
\r\n
\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n context.request.gridSettings,\r\n productImageUrl,\r\n product.PrimaryImageUrl,\r\n product.Name,\r\n context\r\n )}\r\n
\r\n
\r\n

{product.Name}

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

{product.Name}

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

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

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

{description}

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

{product.Name}

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

{product.Name}

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

{description}

;\n}\n\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\n if (rating && ratingAriaLabel) {\n const roundedRating = rating.toFixed(2);\n return format(ratingAriaLabel || '', roundedRating, '5');\n }\n return '';\n}\n\nfunction getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\n if (reviewCount && ratingCountAriaLabelText) {\n return format(ratingCountAriaLabelText || '', reviewCount);\n }\n return '';\n}\n\nfunction renderRating(\n coreContext: ICoreContext,\n moduleTypeName: string,\n moduleId: string,\n avgRating?: number,\n totalRatings?: number,\n ariaLabel?: string,\n ratingCountAriaLabel?: string\n): JSX.Element | null {\n if (!avgRating) {\n return null;\n }\n\n const numberRatings = totalRatings?.toString() || undefined;\n const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\n const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\n\n return (\n \n );\n}\n\nfunction renderPrice(\n context: ICoreContext,\n typeName: string,\n id: string,\n productSearchResult: ProductSearchResult,\n savingsText?: string,\n freePriceText?: string,\n originalPriceText?: string,\n currentPriceText?: string,\n isPriceMinMaxEnabled?: boolean,\n priceResources?: IPriceComponentResources,\n productPrice?: ProductPrice\n): JSX.Element | null {\n const product: SimpleProduct = {\n // This is a fake product. The product type is only used for price component to determine if it should show price range or not.\n ProductTypeValue: productSearchResult.IsMasterProduct ? ProductType.Master : ProductType.Standalone\n } as SimpleProduct;\n\n const price: ProductPrice = productPrice ?? {\n BasePrice: productSearchResult.BasePrice,\n AdjustedPrice: productSearchResult.Price,\n CustomerContextualPrice: productSearchResult.Price,\n MaxVariantPrice: productSearchResult.MaxVariantPrice ? productSearchResult.MaxVariantPrice : productSearchResult.Price,\n MinVariantPrice: productSearchResult.MinVariantPrice ? productSearchResult.MinVariantPrice : productSearchResult.Price\n };\n\n return (\n \n );\n}\n\nfunction renderProductPlacementImage(\n imageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n fallbackImageUrl?: string,\n altText?: string,\n context?: ICoreContext>\n): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment -- Site level config can be of any type.\n const contextConfig = context?.app.config?.placeholderImageName;\n const emptyPlaceHolderImage = contextConfig as string;\n let fallbackImageSource = fallbackImageUrl;\n if (emptyPlaceHolderImage && fallbackImageUrl) {\n fallbackImageSource = `${fallbackImageUrl},${emptyPlaceHolderImage}`;\n }\n const img: IImageData = {\n src: imageUrl,\n altText: altText ? altText : '',\n fallBackSrc: fallbackImageSource\n };\n const imageProps = {\n gridSettings,\n imageSettings\n };\n imageProps.imageSettings.cropFocalRegion = true;\n return (\n \n );\n}\n\nexport const ProductComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride<\n IProductComponent\n>('Product', { component: ProductCard, ...PriceComponentActions });\n\nexport default ProductComponent;\n"],"names":["AddToCartBehavior","propagateResult","props","result","onAdd","propagateError","onError","getAddToCartInputFromProps","async","_props$orderDetailsPr","_props$data","products","orderDetailsProducts","filter","product","ObjectExtensions","isNullOrUndefined","simpleProduct","input","map","count","salesLine","Quantity","catalogId","CatalogId","ArrayExtensions","hasElements","_props$catalogId","actionContext","context","apiSettings","requestContext","getCatalogId","validateCatalogId","searchCriteriaInput","Context","ChannelId","channelId","IncludeAttributes","Ids","productId","productSearchResultsWithImages","ProductsDataActions","callerContext","productSearchResult","newProductSearchResult","_objectSpread","newImageUrl","generateProductImageUrl","PrimaryImageUrl","item","productData","find","RecordId","_productData$BasePric","ProductTypeValue","ProductType","Variant","AdjustedPrice","Price","BasePrice","quantity","_props$quantity","data","addItemsToCart","setDisabled","setItemsAddedToCartDialogOpen","setErrorMessage","addToCartInput","cartState","getCartState","addToCartResult","addProductsToCart","status","_validationResult$Val","_props$dialogStrings2","_props$dialogStrings3","_props$dialogStrings$2","_props$dialogStrings4","errorCount","CartsDataActions","bypassCache","cart","Id","Version","ValidationFailuresByCartLines","length","errorText","dialogStrings","oneErrorText","multiErrorsText","errorMessage","format","validationErrorMessage","toString","addToCartBehavior","app","config","showModal","showNotification","_props$dialogStrings$3","itemsAddedResource","viewCartButtonText","goToCartText","closeButtonLabel","closeNotificationLabel","itemsAddedToCartHeaderText","headerMessageText","itemsAddedToCartFormatText","headerItemFormatText","linesAddedToCartFormatText","headerLinesFormatText","itemsAddedValidationErrorMessage","notification","MultiItemsSuccessfullyAddedToCartNotification","imageSettings","gridSettings","navigationUrl","telemetryContent","id","typeName","NotificationsManager","instance","addNotification","MsDyn365","isBrowser","isNavigationToCartPageDisabled","undefined","goToCart","window","location","assign","handleAddItemsToCartSuccess","_props$dialogStrings5","_props$dialogStrings$4","_addToCartResult$erro3","_addToCartResult$erro4","_props$dialogStrings$5","_props$dialogStrings6","buyAgainNotificationTitle","ErrorNotification","buyAgainNotificationCloseAriaLabel","errorDetails","LocalizedMessage","failureReason","cartActionResult","AddToCartComponentActions","onClick","_event","openModal","cartError","addToCartError","hasOrderDetailsProducts","hasProducts","hasMultipleProducts","shouldSkipSiteSettings","_props$productAvailab","addProductToCart","availableQuantity","productAvailability","AvailableQuantity","additionalProperties","orderQuantityLimitsFeatureIsEnabled","isOrderQuantityLimitsFeatureEnabled","enableStockCheck","isPriceKeyedIn","customPrice","customPriceAmount","isAddEmailDeliveryItemToCart","ItemSuccessfullyAddedToCartNotification","price","_addToCartResult$erro","_addToCartResult$erro2","_props$dialogStrings$","_props$dialogStrings","addOneItemToCart","AddToCartFunctionalComponent","_props$data2","_props$dialogStrings7","_props$dialogStrings8","_props$dialogStrings9","_addToCartInput$","_props$data3","_addToCartInput$2","_addToCartInput$3","_props$dialogStrings$6","_props$dialogStrings10","_props$dialogStrings$7","_props$dialogStrings11","_props$dialogStrings$8","_props$dialogStrings12","_props$dialogStrings$9","_props$dialogStrings13","_props$dialogStrings$10","_props$dialogStrings14","_props$addToCartArial","_props$addToCartArial2","disabled","useState","modalOpen","setModalOpen","isItemsAddedToCartDialogOpen","setAddToCartInput","closeItemsAddedToCartDialog","React","priceComponent","PriceComponent","freePriceText","originalPriceText","currentPriceText","popupProps","className","request","productQuantity","renderModalPopup","Popup","Object","label","getLinkText","payload","getPayloadObject","TelemetryEvent","AddToCart","attributes","getTelemetryAttributes","buttonClassName","retrievedInput","retrieveAddToCartInput","classnames","addToCartArialLabel","title","event","isIntermediateState","shouldShowOutOfStock","ItemsAddedToCartDialogComponent","isModalOpen","onClose","defaultProps","outOfStockText","addToCartText","isCustomPriceSelected","maximumKeyInPrice","minimumKeyInPrice","defaultMaximumKeyInPrice","defaultMinimumKeyInPrice","Dimensions","missingDimensions","dimension","DimensionValue","Value","_productAvailability$","defaultAvailableQuantity","stockLeft","Math","max","includeCurrentQuantity","_props$hasAvailablePr","isLoading","isProductQuantityLoading","isUpdatingDimension","isLoadingDeliveryOptions","isUpdatingDeliveryOptions","isAddServiceItemToCart","hasAvailableProducts","includedQuantityNumber","_props$data4","AddToCartComponent","msdyn365Commerce","createComponentOverride","component","getDefaultSwatchSelected","coreContext","_productData$Attribut","_attributeSwatches$fi","AttributeValues","dimensionToPreSelectInProductCard","attributeSwatches","attributeValue","_attributeValue$KeyNa","KeyName","toLocaleLowerCase","Swatches","IsDefault","updateProductUrl","productDetailsPageUrl","queryString","sourceUrl","URL","baseUrl","search","href","pathname","renderLabel","name","rating","ratingAriaLabelText","reviewCount","ratingCountAriaLabelText","reviewCountArialableText","getReviewAriaLabel","getRatingAriaLabel","ratingAriaLabel","roundedRating","toFixed","renderProductPlacementImage","imageUrl","fallbackImageUrl","altText","_context$app$config","contextConfig","placeholderImageName","fallbackImageSource","img","src","fallBackSrc","imageProps","cropFocalRegion","Image","loadFailureBehavior","bypassHideOnFailure","ProductComponent","_ref","_context$request","_context$request2","_product$Name","_product$RecordId","_getProductImageUrlFr","_getProductPageUrlFro","_resources$productCar","savingsText","ratingCountAriaLabel","allowBack","productPrices","quickViewButton","productComparisonButton","isEnabledProductDescription","isPriceMinMaxEnabled","priceResources","inventoryLabel","dimensionAvailabilities","swatchItemAriaLabel","loginRegisterResource","resources","isAuthenticated","user","productUrl","getProductPageUrlSync","Name","Number","MIN_VALUE","productImageUrlFromSwatch","defaultSwatch","swatchProductImageUrls","ProductImageUrls","generateImageUrl","getProductImageUrlFromDefaultSwatch","productPageUrlFromSwatch","SwatchValue","encodeURIComponent","getProductPageUrlFromDefaultSwatch","productPageUrl","setProductPageUrl","productImageUrl","setProductImageUrl","selectedSwatchItems","Dictionary","updatePageAndImageUrl","swatchItem","dimensionType","setValue","StringExtensions","isNullOrWhitespace","value","productPageUrlWithSwatch","includes","newUrl","searchParams","delete","swatchProductImageUrl","productImageUrls","renderConditionalProductAttributes","attributeValues","fallbackText","attributeKeyName","attributeKeyNameText","_attributeValues$find","_attributeValues$find2","productAttributeFallbackText","isProductAttributeAvailable","attribute","BooleanValue","productAttributeText","TextValue","payLoad","partNo","productPricesView","discount","DiscountAmount","PLProduct","ItemId","_data$BasePrice","_data$CustomerContext","_data$DiscountAmount","discountedPrice","originalPrice","CustomerContextualPrice","_data$BasePrice2","_data$CustomerContext2","_data$TradeAgreementP","basePriceNum","basePrice","cultureFormatter","formatCurrency","discountedPriceNum","tradeAgreementPriceNum","TradeAgreementPrice","tradeAgreementPrice","key","productCardPriceText","productCardDiscountValue","productCardYourPriceText","productPriceItem","maxQuantity","maxQuantityForCartLineItem","currentQuantity","setCurrentQuantity","maxQuantityText","productCardMaxQuantityText","replace","onTelemetryClick","AverageRating","TotalRatings","signInUrl","description","Description","productCardPartNoText","extensionProps","_extensionProps$find","_extensionProps$find2","supersededItemId","prop","Key","StringValue","alternateProductText","supersededProductTextFallBack","supersededProductText","renderSupersededProductText","ExtensionProperties","_item$KeyName$toLocal","_item$KeyName","_item$Swatches$map","_item$Swatches","dimensionTypeValue","dimensionsToDisplayOnProductCard","dimensionsInProductCard","DimensionTypes","none","shouldDisplayDimension","swatches","_item$RecordId","_swatchItem$SwatchVal","_swatchItem$SwatchVal2","_dimensionAvailabilit","itemId","colorHexCode","SwatchColorHexCode","SwatchImageUrl","isDefault","isDisabled","dimensionAvailability","_swatchItem$SwatchVal3","some","swatch","ProductComponentSwatchComponent","onSelectDimension","renderProductDimensions","hideRating","moduleTypeName","moduleId","avgRating","totalRatings","ariaLabel","numberRatings","RatingComponent","ratingCount","readOnly","renderRating","inventoryAvailabilityLabel","quickview","selectedDimensions","getValues","DimensionTypeValue","convertDimensionTypeToProductDimensionType","selectedProductId","renderQuickView","renderProductComparisonButton","renderDropshipProductText","renderSpecialOrderProductText","_extensionProps$find3","_extensionProps$find4","stockAvailabilityText","stockAvailabilityCode","stockAvail","stockLa","stockOos","renderStockCheckProductText","IncrementalQuantity","currentCount","onChange","inputQuantityAriaLabel","productCardInputQuantityAriaLabel","decrementButtonAriaLabel","productCardDecrementButtonAriaLabel","incrementButtonAriaLabel","productCardIncrementButtonAriaLabel","minQuantityText","productCardMinQuantityText","productCardAddToCartText","productCardOOSText","getUrlSync","Standalone","viewports","xs","q","w","h","lg","xl","lazyload","renderProductUnitOfMeasure","unitOfMeasure","renderPrice","productPrice","IsMasterProduct","Master","MaxVariantPrice","MinVariantPrice","isUnitOfMeasureEnabled","unitOfMeasureDisplayType","DefaultUnitOfMeasure"],"sourceRoot":""}