{"version":3,"file":"static/js/5f68a2f93c5d4f96b5f5.bundle.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-buybox/common/add-to-cart.component.tsx?f1fe","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-buybox/common/utilities/error-utilities.ts?9f41"],"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 getUrlSync\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 ProductSearchResult,\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, useMemo } from 'react';\r\nimport { IItemsAddedToCartResources, ItemsAddedToCartDialogComponent, MultiItemsSuccessfullyAddedToCartNotification,OrderDetailsProduct } from '@msdyn365-commerce/components';\r\nimport { toast, toasts } from '../../../components/toast/toast';\r\nimport { getGenericError } from './utilities/error-utilities';\r\nimport { IBuyboxCommonResources } from './buyboxInterface';\r\nimport { validateAlcoholLicenseAsync } from '../../../actions/validate-alcohol-license.action';\r\nimport PQueue from 'p-queue';\r\nimport { humanizeUnitOfMeasure } from '../../../components/unit-of-measure';\r\nimport PriceComponent from '../../../themes/dlvry-adventureworks/views/components/price.component';\r\nimport { ProductSearchResultExt } from '../../dlvry-search-result-container/components';\r\nimport { BuyValidationResult } from '../../../themes/dlvry-adventureworks/views/components/product.component';\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\nexport interface IAddToCartToastResources {\r\n errorHeader?: string;\r\n productsAddedToCart?: string;\r\n productsRemovedFromCart?: string;\r\n productsUpdatedInCart?: string;\r\n goToCart?: string;\r\n noAccessToProduct?: string;\r\n}\r\n\r\n/**\r\n * Interface for add to cart components props.\r\n */\r\nexport interface IAddToCartComponentProps extends IComponentProps<{ cart?: ICartState, product: SimpleProduct; price?: ProductPrice; productSearch?: ProductSearchResult | undefined } | undefined> {\r\n className?: string;\r\n addToCartText: string;\r\n updateCartText: string;\r\n removeFromCartText: string;\r\n outOfStockText?: string;\r\n disabled?: boolean;\r\n quantity?: number;\r\n breakoff?: boolean;\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 cartQueue?: PQueue;\r\n orderDetailsProducts?: OrderDetailsProduct[];\r\n orderDetailsActivePrices?: ProductPrice[];\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 userHasAccess?: boolean;\r\n buyAlwaysAdd?: boolean;\r\n\r\n dialogStrings?: IAddToCartResources;\r\n toastStrings?: IAddToCartToastResources;\r\n buyBoxResources?: IBuyboxCommonResources;\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 onUpdateQuantity?(quantity: number): void;\r\n onBuyValidate?: (product: ProductSearchResultExt, quantity: number) => Promise;\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 customPrice: props.orderDetailsActivePrices?.find(x => x.ProductId === product.simpleProduct?.RecordId)?.CustomerContextualPrice\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 customPrice: props.data?.productSearch?.Price,\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 cartUrl: string | undefined,\r\n setDisabled: (disabled: boolean) => void,\r\n setSuccess: (success: boolean) => void,\r\n openModal: (opened: boolean) => void,\r\n cartLineId?: string\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 addToCartInput = await getAddToCartInputFromProps(props);\r\n const product = addToCartInput[0].product;\r\n const quantity = addToCartInput[0].count || (props.breakoff ? 1 : product.Behavior?.MultipleOfQuantity || 1);\r\n let cartState = await getCartState(props.context.actionContext);\r\n\r\n while (cartState.status === 'UPDATING') {\r\n console.log('Cart is updating, waiting for it to finish...');\r\n await new Promise((resolve) => setTimeout(resolve, 1000));\r\n cartState = await getCartState(props.context.actionContext);\r\n }\r\n\r\n const addToCartResult = !cartLineId\r\n ? await cartState.addProductToCart({\r\n product,\r\n count: quantity,\r\n availableQuantity: props.productAvailability?.AvailableQuantity && props.productAvailability.AvailableQuantity>=quantity?props.productAvailability.AvailableQuantity: quantity,\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.data?.productSearch?.Price,\r\n isAddEmailDeliveryItemToCart: props.isAddEmailDeliveryItemToCart,\r\n shouldSkipSiteSettings: props.shouldSkipSiteSettings,\r\n catalogId: addToCartInput[0].catalogId\r\n })\r\n : await cartState.updateCartLineQuantity({\r\n cartLineId: cartLineId,\r\n newQuantity: props.buyAlwaysAdd\r\n ? (cartState.cart.CartLines?.find(x => x.LineId === cartLineId)?.Quantity || 0) + quantity\r\n : quantity\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.toastStrings && addToCartBehavior === AddToCartBehavior.showNotification) {\r\n setDisabled(false);\r\n const toastText = (props.buyAlwaysAdd || !cartLineId)\r\n ? (props.toastStrings?.productsAddedToCart ?? '{0} {1} added to cart.').replace('{0}', quantity.toString()).replace('{1}', product.Name ?? '')\r\n : (props.toastStrings?.productsUpdatedInCart ?? 'Updated quantity of {0} to {1} in cart.').replace('{0}', product.Name ?? '').replace('{1}', quantity.toString());\r\n\r\n toast({\r\n text: toastText,\r\n type: \"success\",\r\n autoClose: 3000,\r\n position: \"bottom-right\",\r\n canClose: true,\r\n showProgress: true,\r\n link: cartUrl,\r\n linkLabel: props.toastStrings?.goToCart\r\n });\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\r\n if (props.buyAlwaysAdd) {\r\n props.onUpdateQuantity?.(0);\r\n } else if (!cartLineId && !props.quantity) {\r\n // If the quantity is not defined, set it to 1\r\n props.onUpdateQuantity?.(quantity || 1);\r\n }\r\n\r\n propagateResult(props, addToCartResult);\r\n setSuccess(true);\r\n } else {\r\n let text = addToCartResult.validationResults && addToCartResult.validationResults.length > 0\r\n ? addToCartResult.validationResults[0].LocalizedMessage!\r\n : addToCartResult.errorDetails?.LocalizedMessage;\r\n\r\n if (!text && props.buyBoxResources) {\r\n text = getGenericError({\r\n failureReason: 'CARTACTIONFAILED',\r\n cartActionResult: addToCartResult\r\n }, cartState, props.buyBoxResources, props.context, product, props.productAvailability, undefined);\r\n }\r\n\r\n toasts.error(props.toastStrings?.errorHeader, text ?? 'Unknown error adding items to cart');\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 setSuccess: (success: 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 addToCartInput.forEach(item => {\r\n item.count = item.count || (props.breakoff ? 1 : item.product.Behavior?.MultipleOfQuantity || 0);\r\n });\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 setSuccess(true);\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 cartUrl: string | undefined,\r\n setWorking: (working: boolean) => void,\r\n setDisabled: (disabled: boolean) => void,\r\n setSuccess: (success: 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 const hasMultipleProducts = hasOrderDetailsProducts || hasProducts;\r\n\r\n let method: 'buy' | 'buy_always' | 'update' | 'remove' = 'buy';\r\n const cartLine = props.data?.cart?.cart?.CartLines?.find(x => x.ProductId === props.data?.product.RecordId);\r\n const cartQuantity = cartLine?.Quantity;\r\n\r\n if (props.buyAlwaysAdd) {\r\n method = 'buy_always';\r\n } else if (!cartLine || cartQuantity === undefined) {\r\n method = 'buy';\r\n } else if (cartQuantity > 0 && props.quantity !== undefined && props.quantity < 1) {\r\n method = 'remove';\r\n } else {\r\n method = 'update';\r\n }\r\n\r\n setWorking(true);\r\n\r\n const work = async () => {\r\n if (method === 'buy' || method === 'buy_always' || method === 'update') {\r\n let userHasAccess: boolean | undefined = props.userHasAccess || true; // TODO: Remove 'true' default here to re-enable alcohol license check\r\n let validationError: string | undefined;\r\n\r\n if (userHasAccess === undefined) {\r\n const result = await validateAlcoholLicenseAsync(props.context.actionContext, {\r\n CatalogId: props.context.request.apiSettings.catalogId,\r\n ProductIds: [props.data!.product.RecordId]\r\n });\r\n userHasAccess = result.ValidationResult;\r\n validationError = props.toastStrings?.noAccessToProduct ?? 'Missing license or access to this product.';\r\n }\r\n\r\n if (userHasAccess && props.onBuyValidate) {\r\n const result = await props.onBuyValidate(props.data?.productSearch as ProductSearchResultExt, props.quantity ?? 1);\r\n userHasAccess = result.isValid;\r\n validationError = result.message;\r\n }\r\n\r\n if (userHasAccess !== true) {\r\n toasts.error(props.toastStrings?.errorHeader, validationError || 'Unknown error');\r\n setDisabled(false);\r\n setWorking(false);\r\n return;\r\n }\r\n\r\n if (props.shouldSkipSiteSettings && hasMultipleProducts) {\r\n await addItemsToCart(props, setDisabled, setSuccess, setItemsAddedToCartDialogOpen, setErrorMessage);\r\n } else {\r\n await addOneItemToCart(props, cartUrl, setDisabled, setSuccess, openModal, (method === 'update' || method === 'buy_always') ? cartLine?.LineId : undefined);\r\n }\r\n } else if (method === 'remove') {\r\n const result = await props.data?.cart?.removeCartLines({\r\n cartLineIds: [cartLine?.LineId || 'never']\r\n });\r\n if (result?.status === 'SUCCESS') {\r\n toast({\r\n text: (props.toastStrings?.productsRemovedFromCart ?? '{0} removed from cart.').replace('{0}', props.data?.product?.Name ?? ''),\r\n type: \"success\",\r\n autoClose: 3000,\r\n position: \"bottom-right\",\r\n canClose: true,\r\n showProgress: true,\r\n link: cartUrl,\r\n linkLabel: props.toastStrings?.goToCart\r\n });\r\n\r\n setSuccess(true);\r\n } else {\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n result?.errorDetails?.LocalizedMessage ?? 'Add to cart failed',\r\n props.dialogStrings?.closeNotificationLabel ?? ''\r\n )\r\n );\r\n propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: result });\r\n }\r\n setDisabled(false);\r\n }\r\n };\r\n\r\n if (props.cartQueue) {\r\n await props.cartQueue.add(work);\r\n } else {\r\n await work();\r\n }\r\n\r\n setWorking(false);\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 [success, setSuccess] = useState(false);\r\n const [working, setWorking] = useState(false);\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<{ product: SimpleProduct; count: number; }[]>([]);\r\n const cartUrl: string | undefined = useMemo(() => getUrlSync('cart', props.context.actionContext), []);\r\n\r\n const onClickHandler = async (event: React.MouseEvent) => {\r\n await AddToCartComponentActions.onClick(event, props, cartUrl, setWorking, setDisabled, setSuccess, 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: {\r\n product: props.data?.product ? {\r\n ...props.data.product,\r\n DefaultUnitOfMeasure: humanizeUnitOfMeasure(props.context, props.data.product.DefaultUnitOfMeasure)\r\n } : undefined,\r\n price: props.data?.price\r\n },\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 const cartLine = props.data?.cart?.cart?.CartLines?.find(x => x.ProductId === props.data?.product.RecordId);\r\n const cartQuantity = cartLine?.Quantity;\r\n const sameQuantityInCart = !props.buyAlwaysAdd && props.quantity === cartQuantity;\r\n\r\n React.useEffect(() => {\r\n const retrieveAddToCartInput = async () => {\r\n const retrievedInput = await getAddToCartInputFromProps(props);\r\n retrievedInput.forEach(item => {\r\n item.product = {\r\n ...item.product,\r\n DefaultUnitOfMeasure: humanizeUnitOfMeasure(props.context, item.product.DefaultUnitOfMeasure)\r\n };\r\n });\r\n setAddToCartInput(retrievedInput);\r\n };\r\n\r\n void retrieveAddToCartInput();\r\n }, [props, setAddToCartInput]);\r\n\r\n React.useEffect(() => {\r\n if (success) {\r\n // Wait 2 seconds than set working to undefined\r\n const timeout = setTimeout(() => {\r\n setSuccess(false);\r\n }\r\n , 2000);\r\n return () => clearTimeout(timeout);\r\n } else {\r\n return undefined;\r\n }\r\n }, [success]);\r\n\r\n return (\r\n <>\r\n {renderModalPopup}\r\n \r\n {/* {!working && success && } */}\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 const cartLine = props.data?.cart?.cart?.CartLines?.find(x => x.ProductId === props.data?.product.RecordId);\r\n const cartQuantity = cartLine?.Quantity;\r\n\r\n if (props.buyAlwaysAdd) {\r\n return props.addToCartText;\r\n } else if (!cartLine || cartQuantity === undefined) {\r\n return props.addToCartText;\r\n } else if (cartQuantity > 0 && props.quantity !== undefined && props.quantity < 1) {\r\n return props.removeFromCartText;\r\n } else if (cartQuantity !== props.quantity) {\r\n return props.updateCartText;\r\n }\r\n\r\n return 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\n// const 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// @ts-ignore\r\nexport const AddToCartComponent: React.FunctionComponent = msdyn365Commerce.createComponent(\r\n 'AddToCart',\r\n { component: AddToCartFunctionalComponent, ...AddToCartComponentActions }\r\n);\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { IAddToCartFailureResult } from '@msdyn365-commerce/components';\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { OrgUnitLocation, ProductAvailableQuantity, ProductDimension, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\nimport { IBuyboxCommonResources } from '../buyboxInterface';\r\n\r\n/**\r\n * Get the quantity limit.\r\n * @param context - The context.\r\n * @param productAvailability - The product availability.\r\n * @returns The quantity limit.\r\n */\r\nexport function getQuantityLimit(context: ICoreContext>, productAvailability: ProductAvailableQuantity | undefined): number {\r\n // Get the quantity limit for the product\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- need read from config.\r\n const maxQuantityForCartLineItem: number | undefined = context.app.config.maxQuantityForCartLineItem;\r\n const availableQty = productAvailability?.AvailableQuantity;\r\n const defaultQuantityLimit = 10;\r\n\r\n let quantityLimit: number;\r\n\r\n if (maxQuantityForCartLineItem === undefined && availableQty === undefined) {\r\n quantityLimit = defaultQuantityLimit;\r\n } else if (availableQty === undefined) {\r\n quantityLimit = maxQuantityForCartLineItem ?? defaultQuantityLimit;\r\n } else if (maxQuantityForCartLineItem === undefined) {\r\n quantityLimit = availableQty;\r\n } else {\r\n quantityLimit = Math.min(maxQuantityForCartLineItem, availableQty);\r\n }\r\n\r\n return quantityLimit;\r\n}\r\n\r\n/**\r\n * Get the element index.\r\n * @param cart - The cart.\r\n * @param product - The product.\r\n * @param location - The location.\r\n * @returns The index of the element.\r\n */\r\nexport function getElementIndex(\r\n cart: ICartState | undefined,\r\n product: SimpleProduct | undefined,\r\n location: OrgUnitLocation | undefined\r\n): number {\r\n // Get the quantity of the product in cart\r\n let elementFoundAt: number = -1;\r\n\r\n const productIdToFind = product?.RecordId;\r\n\r\n for (let index = 0; index < cart!.cart.CartLines!.length; index++) {\r\n if (\r\n cart!.cart.CartLines![index].ProductId === productIdToFind &&\r\n (cart!.cart.CartLines![index].FulfillmentStoreId || '') === (location?.OrgUnitNumber || '')\r\n ) {\r\n elementFoundAt = index;\r\n\r\n break;\r\n }\r\n }\r\n\r\n return elementFoundAt;\r\n}\r\n\r\nexport function getQuantityError(stockLeft: number | undefined, resources: IBuyboxCommonResources): string | undefined {\r\n if (!stockLeft || stockLeft <= 0) {\r\n return resources.errorMessageOutOfStock;\r\n } else if (stockLeft === 1) {\r\n return resources.errorMessageOutOfRangeOneLeft;\r\n }\r\n return resources.errorMessageOutOfRangeFormat.replace('{numLeft}', stockLeft.toString());\r\n}\r\n\r\nexport function getGenericError(\r\n result: IAddToCartFailureResult,\r\n cart: ICartState | undefined,\r\n resources: IBuyboxCommonResources,\r\n context: ICoreContext>,\r\n product: SimpleProduct | undefined,\r\n productAvailability: ProductAvailableQuantity | undefined,\r\n location: OrgUnitLocation | undefined\r\n): string | undefined {\r\n if (result.failureReason === 'EMPTYINPUT') {\r\n return resources.addedToCartFailureMessage;\r\n } else if (result.failureReason === 'CARTACTIONFAILED') {\r\n if (result.cartActionResult && result.cartActionResult.substatus === 'MAXQUANTITY') {\r\n // Get the quantity of the product in cart\r\n const elementFoundAt: number = getElementIndex(cart, product, location);\r\n\r\n let currentQuantity: number = 0;\r\n if (elementFoundAt !== -1) {\r\n const cartLineToUpdate = { ...cart!.cart.CartLines![elementFoundAt] };\r\n currentQuantity = cartLineToUpdate.Quantity ?? 0;\r\n }\r\n\r\n // Get the quantity limit for the product\r\n const quantityLimit = getQuantityLimit(context, productAvailability);\r\n return resources.maxQuantityLimitText\r\n .replace('{curQuantity}', currentQuantity.toString())\r\n .replace('{maxQuantity}', quantityLimit.toString());\r\n } else if (\r\n result.cartActionResult &&\r\n (result.cartActionResult.substatus === 'QUANTITYLIMITS' || result.cartActionResult.substatus === 'INVOICEINCART')\r\n ) {\r\n return result.cartActionResult.errorDetails?.LocalizedMessage;\r\n }\r\n\r\n if (result.cartActionResult?.validationResults && ArrayExtensions.hasElements(result.cartActionResult.validationResults)) {\r\n return result.cartActionResult.validationResults\r\n .map(item => {\r\n return StringExtensions.isNullOrEmpty(item.LocalizedMessage)\r\n ? item.ErrorContext ?? item.ErrorResourceId\r\n : item.LocalizedMessage;\r\n })\r\n .toString();\r\n }\r\n\r\n return resources.addedToCartFailureMessage;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nexport function getConfigureErrors(\r\n result: ProductDimension[] | undefined,\r\n resources: IBuyboxCommonResources,\r\n isGiftCard?: boolean\r\n): { [configureId: string]: string | undefined } {\r\n if (!result) {\r\n return {};\r\n }\r\n\r\n const dimensions: { [configureId: string]: string | undefined } = {};\r\n\r\n for (const dimension of result) {\r\n dimensions[dimension.DimensionTypeValue] = getDimensionErrorString(dimension.DimensionTypeValue, resources, isGiftCard);\r\n }\r\n\r\n return dimensions;\r\n}\r\n\r\nexport function getDimensionErrorString(dimensionTypeValue: number, resources: IBuyboxCommonResources, isGiftCard?: boolean): string {\r\n switch (dimensionTypeValue) {\r\n case 1: // ProductDimensionType.Color\r\n return resources.productDimensionTypeColorErrorMessage;\r\n case 2: // ProductDimensionType.Configuration\r\n return resources.productDimensionTypeConfigurationErrorMessage;\r\n case 3: // ProductDimensionType.Size\r\n return resources.productDimensionTypeSizeErrorMessage;\r\n case 4: // ProductDimensionType.Style\r\n return isGiftCard ? resources.productDimensionTypeAmountErrorMessage : resources.productDimensionTypeStyleErrorMessage;\r\n default:\r\n return '';\r\n }\r\n}\r\n"],"names":["AddToCartBehavior","propagateResult","props","result","onAdd","propagateError","onError","getAddToCartInputFromProps","async","_props$orderDetailsPr","_props$data","products","orderDetailsProducts","filter","product","ObjectExtensions","simpleProduct","input","map","_props$orderDetailsAc","_props$orderDetailsAc2","count","salesLine","Quantity","catalogId","CatalogId","customPrice","orderDetailsActivePrices","find","x","_product$simpleProduc","ProductId","RecordId","CustomerContextualPrice","ArrayExtensions","_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","_productData$BasePric","ProductTypeValue","ProductType","AdjustedPrice","Price","BasePrice","quantity","_props$quantity","_props$data2","_props$data2$productS","data","productSearch","addItemsToCart","setDisabled","setSuccess","setItemsAddedToCartDialogOpen","setErrorMessage","addToCartInput","forEach","_item$product$Behavio","breakoff","Behavior","MultipleOfQuantity","cartState","getCartState","addToCartResult","addProductsToCart","status","_validationResult$Val","_props$dialogStrings","_props$dialogStrings2","_props$dialogStrings$","_props$dialogStrings3","errorCount","CartsDataActions","bypassCache","cart","Id","Version","ValidationFailuresByCartLines","length","errorText","dialogStrings","oneErrorText","multiErrorsText","errorMessage","format","validationErrorMessage","toString","addToCartBehavior","app","config","showModal","showNotification","_props$dialogStrings$2","itemsAddedResource","viewCartButtonText","goToCartText","closeButtonLabel","closeNotificationLabel","itemsAddedToCartHeaderText","headerMessageText","itemsAddedToCartFormatText","headerItemFormatText","linesAddedToCartFormatText","headerLinesFormatText","itemsAddedValidationErrorMessage","notification","MultiItemsSuccessfullyAddedToCartNotification","imageSettings","gridSettings","navigationUrl","telemetryContent","id","typeName","NotificationsManager","addNotification","MsDyn365","isNavigationToCartPageDisabled","undefined","goToCart","window","location","assign","handleAddItemsToCartSuccess","_props$dialogStrings4","_props$dialogStrings$3","_addToCartResult$erro2","_addToCartResult$erro3","_props$dialogStrings$4","_props$dialogStrings5","buyAgainNotificationTitle","ErrorNotification","buyAgainNotificationCloseAriaLabel","errorDetails","LocalizedMessage","failureReason","cartActionResult","AddToCartComponentActions","onClick","_event","cartUrl","setWorking","openModal","_props$data4","_props$data4$cart","_props$data4$cart$car","_props$data4$cart$car2","cartError","addToCartError","hasOrderDetailsProducts","hasProducts","hasMultipleProducts","method","cartLine","CartLines","_props$data5","cartQuantity","buyAlwaysAdd","work","validationError","userHasAccess","_props$toastStrings$n","_props$toastStrings5","validateAlcoholLicenseAsync","request","ProductIds","ValidationResult","toastStrings","noAccessToProduct","onBuyValidate","_props$data6","_props$quantity2","isValid","message","_props$toastStrings6","toasts","errorHeader","shouldSkipSiteSettings","cartLineId","_product$Behavior","_props$productAvailab","_props$data3","_props$data3$productS","_cartState$cart$CartL","_cartState$cart$CartL2","console","log","Promise","resolve","setTimeout","updateCartLineQuantity","newQuantity","LineId","addProductToCart","availableQuantity","productAvailability","AvailableQuantity","additionalProperties","orderQuantityLimitsFeatureIsEnabled","isOrderQuantityLimitsFeatureEnabled","enableStockCheck","isPriceKeyedIn","isAddEmailDeliveryItemToCart","_props$toastStrings$p","_props$toastStrings","_product$Name","_props$toastStrings$p2","_props$toastStrings2","_product$Name2","_props$toastStrings3","toastText","productsAddedToCart","replace","Name","productsUpdatedInCart","toast","text","type","autoClose","position","canClose","showProgress","link","linkLabel","_props$onUpdateQuanti","onUpdateQuantity","call","_props$onUpdateQuanti2","_addToCartResult$erro","_props$toastStrings4","_text","validationResults","buyBoxResources","getGenericError","addOneItemToCart","_props$data7","_props$data7$cart","removeCartLines","cartLineIds","_props$toastStrings$p3","_props$toastStrings7","_props$data$product$N","_props$data8","_props$data8$product","_props$toastStrings8","_result$errorDetails$","_result$errorDetails","_props$dialogStrings$5","_props$dialogStrings6","productsRemovedFromCart","cartQueue","add","AddToCartFunctionalComponent","_props$data9","_props$dialogStrings7","_props$dialogStrings8","_props$dialogStrings9","_props$data10","_props$data11","_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$data12","_props$data12$cart","_props$data12$cart$ca","_props$data12$cart$ca2","_props$addToCartArial","_props$addToCartArial2","success","useState","working","disabled","modalOpen","setModalOpen","isItemsAddedToCartDialogOpen","setAddToCartInput","useMemo","getUrlSync","closeItemsAddedToCartDialog","React","priceComponent","price","PriceComponent","freePriceText","originalPriceText","currentPriceText","popupProps","className","DefaultUnitOfMeasure","humanizeUnitOfMeasure","productQuantity","renderModalPopup","Popup","Object","label","getLinkText","payload","getPayloadObject","TelemetryEvent","attributes","getTelemetryAttributes","buttonClassName","_props$data13","sameQuantityInCart","retrievedInput","retrieveAddToCartInput","timeout","clearTimeout","classnames","isIntermediateState","addToCartArialLabel","title","event","ItemsAddedToCartDialogComponent","isModalOpen","onClose","defaultProps","_props$data14","_props$data14$cart","_props$data14$cart$ca","_props$data14$cart$ca2","_props$data15","addToCartText","removeFromCartText","updateCartText","isCustomPriceSelected","customPriceAmount","maximumKeyInPrice","minimumKeyInPrice","defaultMaximumKeyInPrice","defaultMinimumKeyInPrice","Dimensions","missingDimensions","dimension","DimensionValue","Value","_props$data16","isLoading","isUpdatingDimension","isLoadingDeliveryOptions","isUpdatingDeliveryOptions","AddToCartComponent","msdyn365Commerce","component","resources","addedToCartFailureMessage","_result$cartActionRes2","_result$cartActionRes","substatus","elementFoundAt","productIdToFind","index","FulfillmentStoreId","OrgUnitNumber","getElementIndex","currentQuantity","_cartLineToUpdate$Qua","quantityLimit","maxQuantityForCartLineItem","availableQty","Math","min","getQuantityLimit","maxQuantityLimitText","_item$ErrorContext","StringExtensions","ErrorContext","ErrorResourceId"],"sourceRoot":""}