{"version":3,"file":"static/js/073efd7b34bd71247ff8.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","isNullOrUndefined","simpleProduct","input","map","_props$orderDetailsAc","count","salesLine","Quantity","catalogId","CatalogId","customPrice","orderDetailsActivePrices","find","x","_product$simpleProduc","ProductId","RecordId","CustomerContextualPrice","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","_productData$BasePric","ProductTypeValue","ProductType","Variant","AdjustedPrice","Price","BasePrice","quantity","_props$quantity","_props$data2","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","instance","addNotification","MsDyn365","isBrowser","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","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","error","errorHeader","shouldSkipSiteSettings","cartLineId","_product$Behavior","_props$productAvailab","_props$data3","_cartState$cart$CartL","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","removeCartLines","cartLineIds","_props$toastStrings$p3","_props$toastStrings7","_props$data$product$N","_props$data8","_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$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","AddToCart","attributes","getTelemetryAttributes","buttonClassName","_props$data13","sameQuantityInCart","retrievedInput","retrieveAddToCartInput","timeout","clearTimeout","classnames","isIntermediateState","addToCartArialLabel","title","event","ItemsAddedToCartDialogComponent","isModalOpen","onClose","defaultProps","_props$data14","_props$data15","addToCartText","removeFromCartText","updateCartText","isCustomPriceSelected","customPriceAmount","maximumKeyInPrice","minimumKeyInPrice","defaultMaximumKeyInPrice","defaultMinimumKeyInPrice","Dimensions","missingDimensions","dimension","DimensionValue","Value","_props$data16","isLoading","isUpdatingDimension","isLoadingDeliveryOptions","isUpdatingDeliveryOptions","AddToCartComponent","msdyn365Commerce","createComponent","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","isNullOrEmpty","ErrorContext","ErrorResourceId"],"sourceRoot":""}