{"version":3,"file":"static/js/aba903a811dc78f239dc.bundle.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/modules/cz-buybox/common/add-to-cart.component.tsx?702f"],"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 } 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\nimport { updateCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\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\r\n extends IComponentProps<{ product: SimpleProduct; price?: ProductPrice; storeSelectorStateManager: any } | 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 slicingOption?: string;\r\n location?: any;\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 searchCriteriaInput: ProductSearchCriteria = {\r\n Context: {\r\n ChannelId: apiSettings.channelId,\r\n CatalogId: props.catalogId ?? getCatalogId(props.context.actionContext.requestContext)\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 location: props.location,\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 const productSlicingAllowedInProduct =\r\n product.ExtensionProperties &&\r\n product.ExtensionProperties.find((property: any) => {\r\n return property.Key === 'OPT_PRODUCTISSLICINGALLOWED' && property.Value && property.Value.IntegerValue === 1;\r\n });\r\n if (props.slicingOption) {\r\n const cartState: any = await getCartState(props.context.actionContext);\r\n const updatedCartLines = cartState.cart.CartLines.map((c: any) => {\r\n const sliceOptionExists = c.ExtensionProperties.find((e: any) => {\r\n return e.Key === 'OPT_SLICINGOPTION';\r\n });\r\n const productSlicingAllowedInCartItem = c.ExtensionProperties.find((property: any) => {\r\n return property.Key === 'OPT_PRODUCTISSLICINGALLOWED' && property.Value && property.Value.IntegerValue === 1;\r\n });\r\n if (!sliceOptionExists) {\r\n if (c.ItemId === product.ItemId && productSlicingAllowedInProduct && productSlicingAllowedInCartItem) {\r\n c.ExtensionProperties = [\r\n ...c.ExtensionProperties,\r\n {\r\n Key: 'OPT_SLICINGOPTION',\r\n Value: {\r\n StringValue: props.slicingOption\r\n }\r\n }\r\n ];\r\n }\r\n }\r\n return c;\r\n });\r\n const updateToCartResult = await updateCartLinesAsync(\r\n { callerContext: props.context.actionContext },\r\n cartState.cart.Id,\r\n updatedCartLines\r\n );\r\n console.log(updateToCartResult);\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 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 }\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\r\n const onClickHandler = async (event: React.MouseEvent) => {\r\n const product = props.data?.product;\r\n const price = props.data?.price;\r\n let StoreId = '';\r\n let seed = '';\r\n let StoreName = '';\r\n props.data?.product.Dimensions?.forEach((Dimension: any) => {\r\n if (Dimension.DimensionTypeValue === 4) {\r\n seed = Dimension.DimensionValue.Value;\r\n }\r\n });\r\n\r\n if (\r\n props.data &&\r\n props.data.storeSelectorStateManager &&\r\n props.data.storeSelectorStateManager.result &&\r\n props.data.storeSelectorStateManager.result.preferredStore &&\r\n props.data.storeSelectorStateManager.result.preferredStore.StoreId\r\n ) {\r\n StoreId = props.data.storeSelectorStateManager.result.preferredStore.StoreId;\r\n StoreName = props.data.storeSelectorStateManager.result.preferredStore.StoreName;\r\n }\r\n if (product && price) {\r\n const productItem = {\r\n item_id: product.ItemId,\r\n item_name: product.Name,\r\n affiliation: '',\r\n coupon: '',\r\n discount: price.DiscountAmount,\r\n index: 0,\r\n item_brand: '',\r\n item_category: 'Product',\r\n item_list_id: 'related_products',\r\n item_list_name: 'Related Products',\r\n item_variant: `seed:${seed};slice:${props.slicingOption}`,\r\n store_name: StoreName,\r\n store_id: StoreId,\r\n price: product.Price,\r\n quantity: props.quantity\r\n };\r\n if (typeof gtag !== 'undefined') {\r\n gtag('event', 'add_to_cart', {\r\n currency: price.CurrencyCode,\r\n value: product.Price,\r\n items: [productItem]\r\n });\r\n }\r\n }\r\n\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: props.data?.product, price: props.data?.price },\r\n dialogStrings: props.dialogStrings,\r\n imageSettings: props.imageSettings,\r\n gridSettings: props.context.request.gridSettings,\r\n productQuantity: props.quantity !== undefined ? props.quantity : 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 const price: any = props.data?.price?.AdjustedPrice;\r\n const quantity: any = props?.quantity;\r\n const totalPrice = price && quantity ? price * quantity : undefined;\r\n const totalPriceText = totalPrice ? props.context.cultureFormatter.formatCurrency(totalPrice) : '';\r\n const labelText = label.replace('{}', quantity);\r\n return (\r\n <>\r\n {renderModalPopup}\r\n \r\n {props.typeName !== 'cz-quickview' ? (\r\n <>\r\n {labelText}\r\n {totalPriceText}\r\n \r\n ) : (\r\n {label}\r\n )}\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 let productSlicingAllowed: any | undefined = '';\r\n if (data.product && data.product.ExtensionProperties) {\r\n productSlicingAllowed = data.product.ExtensionProperties.find((property: any) => {\r\n return property.Key === 'OPT_PRODUCTISSLICINGALLOWED';\r\n });\r\n }\r\n if (\r\n productSlicingAllowed &&\r\n productSlicingAllowed &&\r\n productSlicingAllowed.Value &&\r\n productSlicingAllowed.Value.IntegerValue !== 0 &&\r\n !props.slicingOption\r\n ) {\r\n missingDimensions.push({\r\n DimensionTypeValue: 3,\r\n ExtensionProperties: []\r\n });\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\nexport const AddToCartComponent: React.FunctionComponent = msdyn365Commerce.createComponent('AddToCart', {\r\n component: AddToCartFunctionalComponent,\r\n ...AddToCartComponentActions\r\n});\r\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","searchCriteriaInput","Context","ChannelId","channelId","getCatalogId","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","productSlicingAllowedInProduct","ExtensionProperties","property","Key","Value","IntegerValue","slicingOption","updatedCartLines","CartLines","c","sliceOptionExists","e","productSlicingAllowedInCartItem","ItemId","StringValue","updateToCartResult","updateCartLinesAsync","console","log","ItemSuccessfullyAddedToCartNotification","price","_addToCartResult$erro","_addToCartResult$erro2","_props$dialogStrings$","_props$dialogStrings","addOneItemToCart","AddToCartFunctionalComponent","_props$data5","_props$dialogStrings7","_props$dialogStrings8","_props$dialogStrings9","_props$data6","_props$data7","_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$data8","_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","totalPrice","totalPriceText","cultureFormatter","formatCurrency","labelText","replace","classnames","addToCartArialLabel","title","_props$data2","_props$data3","_props$data4","StoreId","seed","StoreName","Dimensions","forEach","Dimension","DimensionTypeValue","DimensionValue","storeSelectorStateManager","preferredStore","productItem","item_id","item_name","Name","affiliation","coupon","discount","DiscountAmount","index","item_brand","item_category","item_list_id","item_list_name","item_variant","store_name","store_id","gtag","currency","CurrencyCode","value","items","event","isIntermediateState","shouldShowOutOfStock","ItemsAddedToCartDialogComponent","isModalOpen","onClose","defaultProps","outOfStockText","addToCartText","isCustomPriceSelected","maximumKeyInPrice","minimumKeyInPrice","defaultMaximumKeyInPrice","defaultMinimumKeyInPrice","missingDimensions","dimension","productSlicingAllowed","push","_productAvailability$","defaultAvailableQuantity","stockLeft","Math","max","includeCurrentQuantity","_props$hasAvailablePr","isLoading","isProductQuantityLoading","isUpdatingDimension","isLoadingDeliveryOptions","isUpdatingDeliveryOptions","isAddServiceItemToCart","hasAvailableProducts","includedQuantityNumber","_props$data9","AddToCartComponent","msdyn365Commerce","createComponent","component"],"sourceRoot":""}