{"version":3,"file":"static/js/0cc668f4f1b3895c2d46.bundle.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online.Memx/./src/actions/get-delivery-option-context.action.ts?e45e","webpack://Msdyn365.Commerce.Online.Memx/./src/actions/state-data-actions/product-warranty-state.action.ts?49ae","webpack://Msdyn365.Commerce.Online.Memx/./src/themes/memoryexpress/views/components/addtocart.component.tsx?1280","webpack://Msdyn365.Commerce.Online.Memx/./src/modules/mmx-store-selector/state-manager/base-store-selector-state-manager.ts?fa5d","webpack://Msdyn365.Commerce.Online.Memx/./src/modules/mmx-store-selector/state-manager/map-store-selector-state-manager.ts?a944","webpack://Msdyn365.Commerce.Online.Memx/./src/utilities/utils.ts?6402"],"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 {\r\n CacheType,\r\n createObservableDataAction,\r\n IAction,\r\n ICreateActionContext,\r\n IActionContext,\r\n IActionInput\r\n} from '@msdyn365-commerce/core';\r\nimport { getChannelDeliveryOptionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/OrgUnitsDataActions.g';\r\nimport { getChannelDeliveryOptionConfigurationAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\r\n\r\nexport interface DeliveryOptionContext {\r\n isShippingEnabled: boolean;\r\n isPickupEnabled: boolean;\r\n}\r\n\r\n/**\r\n * GetDeliveryOptionContext Input Action\r\n */\r\nexport class GetDeliveryOptionContextInput implements IActionInput {\r\n private channelId: number;\r\n\r\n constructor(channelId: number) {\r\n this.channelId = channelId;\r\n }\r\n\r\n public getCacheKey = () => `DeliveryOptionContext-${this.channelId}`;\r\n public getCacheObjectType = () => 'DeliveryOptionContext';\r\n public dataCacheType = (): CacheType => 'application';\r\n}\r\n\r\nconst createInput = (args: ICreateActionContext): IActionInput => {\r\n return new GetDeliveryOptionContextInput(args.requestContext.apiSettings.channelId);\r\n};\r\n\r\nasync function getDeliveryOptionContextAction(input: IActionInput, ctx: IActionContext): Promise {\r\n let [channelDeliveryOptions, channelDeliveryOptionConfig] = await Promise.all([\r\n getChannelDeliveryOptionsAsync({ callerContext: ctx }, [ctx.requestContext.apiSettings.channelId]),\r\n getChannelDeliveryOptionConfigurationAsync({ callerContext: ctx })\r\n ]);\r\n const deliveryOptions =\r\n channelDeliveryOptions.find(group => group.ChannelId === ctx.requestContext.apiSettings.channelId)?.DeliveryOptions ?? [];\r\n const pickupDeliveryOptions = channelDeliveryOptionConfig.PickupDeliveryModeCodes ?? [];\r\n\r\n let [isShippingEnabled, isPickupEnabled] = [false, false];\r\n\r\n for (var deliveryOption of deliveryOptions) {\r\n if (deliveryOption.Code && pickupDeliveryOptions.indexOf(deliveryOption.Code) > -1) {\r\n isPickupEnabled = true;\r\n } else {\r\n isShippingEnabled = true;\r\n }\r\n if (isShippingEnabled && isPickupEnabled) {\r\n break;\r\n }\r\n }\r\n\r\n return {\r\n isShippingEnabled: isShippingEnabled,\r\n isPickupEnabled: isPickupEnabled\r\n };\r\n}\r\n\r\nexport default createObservableDataAction({\r\n action: >getDeliveryOptionContextAction,\r\n id: 'DeliveryOptionContext',\r\n input: createInput\r\n});\r\n","import {\r\n CacheType,\r\n createObservableDataAction,\r\n IAction,\r\n IActionContext,\r\n IActionInput,\r\n IAny,\r\n ICreateActionContext,\r\n IGeneric\r\n} from '@msdyn365-commerce/core';\r\nimport { getSelectedProductIdFromActionInput } from '../../utilities/utils';\r\nimport { IWarrantyOption } from '../DataServiceEntities.g';\r\n\r\nexport class ProductWarrantyStateInput implements IActionInput {\r\n public productId: number;\r\n\r\n constructor(productId: number) {\r\n this.productId = productId;\r\n }\r\n\r\n public getCacheKey = () => `ProductWarrantyState-${this.productId}`;\r\n public getCacheObjectType = () => 'IWarrantyOption';\r\n public dataCacheType = (): CacheType => 'instance';\r\n}\r\n\r\nexport async function productWarrantyStateAction(input: ProductWarrantyStateInput, ctx: IActionContext): Promise {\r\n return {};\r\n}\r\n\r\nconst createInput = (inputData: ICreateActionContext>): IActionInput => {\r\n const selectedId = getSelectedProductIdFromActionInput(inputData);\r\n if (selectedId) {\r\n return new ProductWarrantyStateInput(+selectedId);\r\n }\r\n throw new Error('Unable to find product warranty state, no productId found on module config or query');\r\n};\r\n\r\nexport default createObservableDataAction({\r\n action: >productWarrantyStateAction,\r\n input: createInput\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 MsDyn365, {\r\n getCatalogId,\r\n IComponent,\r\n IComponentProps,\r\n IGridSettings,\r\n IImageSettings,\r\n msdyn365Commerce,\r\n TelemetryEvent\r\n} from '@msdyn365-commerce/core';\r\nimport { getCartState, ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\r\nimport {\r\n // mmx-feature: addtocart imports --begin\r\n Cart,\r\n // mmx-feature: addtocart imports --end\r\n CartLineValidationResults,\r\n CartsDataActions,\r\n format,\r\n ProductAvailableQuantity,\r\n ProductDimension,\r\n ProductPrice,\r\n ProductsDataActions,\r\n ProductSearchCriteria,\r\n ProductType,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { ErrorNotification, NotificationsManager } from '@msdyn365-commerce-modules/notifications-core';\r\nimport { ArrayExtensions, generateProductImageUrl, ObjectExtensions, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, IPopupProps, ITelemetryContent, Popup } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport React, { useState } from 'react';\r\n\r\n\r\n// mmx-feature: addtocart override imports --begin\r\n/*\r\nimport { PriceComponent } from '../price';\r\nimport { IItemsAddedToCartResources } from './items-added-to-cart';\r\nimport { ItemsAddedToCartDialogComponent } from './items-added-to-cart-dialog-component';\r\nimport { ItemSuccessfullyAddedToCartNotification } from './notifications/item-successfully-added-to-cart-notification';\r\nimport { MultiItemsSuccessfullyAddedToCartNotification } from './notifications/multi-items-successfully-added-to-cart-notification';\r\nimport { OrderDetailsProduct } from './product-model';\r\n*/\r\n\r\nimport { PriceComponent, IItemsAddedToCartResources, ItemsAddedToCartDialogComponent, ItemSuccessfullyAddedToCartNotification, MultiItemsSuccessfullyAddedToCartNotification, OrderDetailsProduct } from '@msdyn365-commerce/components';\r\nimport { CartLine, OrgUnitLocation } from '@msdyn365-commerce/retail-proxy/';\r\nimport { updateWarrantySelectionsAsync } from '../../../../actions/DataActionExtension.g';\r\nimport productWarrantyStateAction, { ProductWarrantyStateInput } from '../../../../actions/state-data-actions/product-warranty-state.action';\r\nimport { IWarrantyOption } from '../../../../actions/DataServiceEntities.g';\r\nimport { getSelectedProductIdFromActionInput, setPickupLocationForProduct } from '../../../../utilities/utils';\r\n// @ts-ignore\r\nimport { MapStoreSelectorStateManager } from '../../../../modules/mmx-store-selector/state-manager/map-store-selector-state-manager';\r\nimport { mapProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\nimport { getEstimatedProductWarehouseAvailabilityAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { getOrgUnitLocationsByAreaAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/OrgUnitsDataActions.g';\r\nimport { IStoreInfo } from '../../../../modules/mmx-store-selector/state-manager/i-store-selection-state-manager';\r\nimport getDeliveryOptionContextAction, { GetDeliveryOptionContextInput } from '../../../../actions/get-delivery-option-context.action';\r\n\r\nconst modalCloseButtonReference: React.RefObject = React.createRef();\r\n// mmx-feature: addtocart override imports --end\r\n\r\n/**\r\n * Interface for add to cart resources.\r\n */\r\nexport interface IAddToCartResources {\r\n goToCartText: string;\r\n continueShoppingText: string;\r\n closeNotificationLabel: string;\r\n headerItemOneText: string;\r\n headerItemFormatText: string;\r\n headerLinesFormatText?: string;\r\n headerMessageText: string;\r\n freePriceText: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n addedQuantityText: string;\r\n buyAgainNotificationTitle?: string;\r\n buyAgainNotificationCloseAriaLabel?: string;\r\n validationErrorMessage?: string;\r\n oneErrorText?: string;\r\n multiErrorsText?: string;\r\n}\r\n\r\n/**\r\n * Interface for add to cart components props.\r\n */\r\nexport interface IAddToCartComponentProps extends IComponentProps<{ product: SimpleProduct; price?: ProductPrice } | undefined> {\r\n className?: string;\r\n addToCartText: string;\r\n outOfStockText?: string;\r\n disabled?: boolean;\r\n quantity?: number;\r\n navigationUrl?: string;\r\n productAvailability?: ProductAvailableQuantity;\r\n getSelectedProduct?: Promise;\r\n isNavigationToCartPageDisabled?: boolean;\r\n shouldSkipSiteSettings?: boolean;\r\n addToCartArialLabel?: string;\r\n products?: {\r\n productId: number;\r\n quantity: number;\r\n catalogId?: number;\r\n }[];\r\n orderDetailsProducts?: OrderDetailsProduct[];\r\n hasAvailableProducts?: boolean;\r\n imageSettings?: IImageSettings;\r\n gridSettings?: IGridSettings;\r\n\r\n isLoading?: boolean;\r\n isUpdatingDimension?: boolean;\r\n isLoadingDeliveryOptions?: boolean;\r\n isUpdatingDeliveryOptions?: boolean;\r\n isAddServiceItemToCart?: boolean;\r\n isAddEmailDeliveryItemToCart?: boolean;\r\n isPriceKeyedIn?: boolean;\r\n customPriceAmount?: number;\r\n isOrderQuantityLimitsFeatureEnabled?: boolean;\r\n\r\n dialogStrings?: IAddToCartResources;\r\n\r\n telemetryContent?: ITelemetryContent;\r\n\r\n catalogId?: number;\r\n\r\n isCustomPriceSelected?: boolean;\r\n maximumKeyInPrice?: number;\r\n minimumKeyInPrice?: number;\r\n defaultMaximumKeyInPrice?: number;\r\n defaultMinimumKeyInPrice?: number;\r\n isProductQuantityLoading?: boolean;\r\n\r\n onAdd?(result: ICartActionResult): void;\r\n //mmx-feature --start\r\n /*\r\n onError?(result: IAddToCartFailureResult): void;\r\n */\r\n onError?(result: IAddToCartFailureResult, location?: OrgUnitLocation): void;\r\n //mmx-feature --end\r\n changeUpdatingDimension?(isUpdatingDimension: boolean): void;\r\n changeUpdatingDeliveryOptions?(isUpdatingDeliveryOptions: boolean): void;\r\n\r\n //mmx-feature: --store selector id --start\r\n storeSelectorId?: string;\r\n //mmx-feature: --store selector id --end\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\n/*\r\nconst propagateError = (props: IAddToCartComponentProps, result: IAddToCartFailureResult): void => {\r\n*/\r\nconst propagateError = (props: IAddToCartComponentProps, result: IAddToCartFailureResult, location?: OrgUnitLocation): void => {\r\n if (props.onError) {\r\n //mmx-feature --start\r\n /*\r\n props.onError(result);\r\n */\r\n props.onError(result, location);\r\n //mmx-feature --end\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 emailDeliveryModeCode = props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\r\n const input = products?.map(product => {\r\n const deliveryOption = product.salesLine.DeliveryMode;\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 isAddEmailDeliveryItemToCart: deliveryOption && deliveryOption === emailDeliveryModeCode\r\n };\r\n });\r\n\r\n if (ArrayExtensions.hasElements(input)) {\r\n return input;\r\n }\r\n\r\n if (ArrayExtensions.hasElements(props.products)) {\r\n const actionContext = props.context.actionContext;\r\n const apiSettings = actionContext.requestContext.apiSettings;\r\n\r\n const catalogId = props.catalogId ?? getCatalogId(props.context.actionContext.requestContext);\r\n validateCatalogId(catalogId);\r\n\r\n const searchCriteriaInput: ProductSearchCriteria = {\r\n Context: {\r\n ChannelId: apiSettings.channelId,\r\n CatalogId: catalogId\r\n },\r\n IncludeAttributes: false,\r\n Ids: props.products.map(product => product.productId)\r\n };\r\n\r\n const searchResult = await ProductsDataActions.searchByCriteriaAsync({ callerContext: actionContext }, searchCriteriaInput);\r\n const productSearchResultsWithImages = searchResult.map(productSearchResult => {\r\n const newProductSearchResult = { ...productSearchResult };\r\n const newImageUrl = generateProductImageUrl(newProductSearchResult, apiSettings);\r\n\r\n if (newImageUrl) {\r\n newProductSearchResult.PrimaryImageUrl = newImageUrl;\r\n }\r\n\r\n return newProductSearchResult;\r\n });\r\n\r\n return props.products.map(item => {\r\n const productData = productSearchResultsWithImages.find(product => product.RecordId === item.productId);\r\n let simpleProduct: SimpleProduct;\r\n if (productData) {\r\n simpleProduct = {\r\n ...productData,\r\n ProductTypeValue: ProductType.Variant,\r\n AdjustedPrice: productData.Price,\r\n BasePrice: productData.BasePrice ?? productData.Price\r\n };\r\n } else {\r\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Cast to simple product since only record id is available.\r\n simpleProduct = {\r\n RecordId: item.productId\r\n } as SimpleProduct;\r\n }\r\n\r\n return {\r\n product: simpleProduct,\r\n count: item.quantity,\r\n catalogId: item.catalogId\r\n };\r\n });\r\n }\r\n\r\n if (props.data?.product) {\r\n return [\r\n {\r\n product: props.data.product,\r\n count: props.quantity ?? defaultQuantity,\r\n catalogId: props.catalogId\r\n }\r\n ];\r\n }\r\n\r\n return [];\r\n};\r\n\r\n/**\r\n * Add one item to cart when it is not buy again.\r\n * @param props -- The props.\r\n * @param setDisabled -- The set disable call back.\r\n * @param openModal -- The open modal call back.\r\n */\r\nconst addOneItemToCart = async (\r\n props: IAddToCartComponentProps,\r\n // mmx-feature: store selector --begin\r\n selectedLocation: OrgUnitLocation | undefined,\r\n // mmx-feature: store selector --end\r\n setDisabled: (disabled: boolean) => void,\r\n openModal: (opened: boolean) => void\r\n): Promise => {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n const addToCartBehavior = props.context.app.config.addToCartBehavior;\r\n const data = props.data;\r\n\r\n const addToCartInput = await getAddToCartInputFromProps(props);\r\n const product = addToCartInput[0].product;\r\n const quantity = addToCartInput[0].count;\r\n\r\n const cartState = await getCartState(props.context.actionContext);\r\n\r\n // mmx-feature: store selector --begin\r\n // creates a state clone of the cart state that will NOT be updated\r\n const staticCartLines = Object.assign(cartState.cart.CartLines ?? []);\r\n // mmx-feature: store selector --end\r\n\r\n const addToCartResult = await cartState.addProductToCart({\r\n product,\r\n count: quantity,\r\n availableQuantity: props.productAvailability?.AvailableQuantity,\r\n additionalProperties: { validateQuantity: props.isOrderQuantityLimitsFeatureEnabled },\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n enableStockCheck: props.context.app.config.enableStockCheck,\r\n isPriceKeyedIn: props.isPriceKeyedIn,\r\n customPrice: props.isPriceKeyedIn ? props.customPriceAmount : undefined,\r\n isAddEmailDeliveryItemToCart: props.isAddEmailDeliveryItemToCart,\r\n shouldSkipSiteSettings: props.shouldSkipSiteSettings,\r\n // mmx-feature: store selector --begin\r\n location: selectedLocation,\r\n // mmx-feature: store selector --end\r\n catalogId: addToCartInput[0].catalogId\r\n });\r\n\r\n if (addToCartResult.status === 'SUCCESS') {\r\n // mmx-feature: store selector --begin\r\n const newCartState: ICartState = await getCartState(props.context.actionContext);\r\n\r\n if (newCartState.cart.CartLines) {\r\n const productId = getSelectedProductIdFromActionInput(props.context.actionContext) ?? product.RecordId;\r\n if (productId) {\r\n let selectedWarrantyOption: IWarrantyOption = await productWarrantyStateAction(\r\n new ProductWarrantyStateInput(+productId),\r\n props.context.actionContext\r\n );\r\n if (selectedWarrantyOption && selectedWarrantyOption.Period && selectedWarrantyOption.Period > 0) {\r\n const newCartLine = getNewCartLine(newCartState.cart.CartLines, staticCartLines, selectedWarrantyOption.WarrantableProduct);\r\n\r\n await updateWarrantySelectionsAsync({ callerContext: props.context.actionContext }, cartState.cart, [\r\n { WarrantableCartLine: newCartLine, Option: selectedWarrantyOption }\r\n ]).then((cart: Cart) => {\r\n newCartState.refreshCart({});\r\n })\r\n .catch((error: Error) => {\r\n if (props.telemetryContent?.telemetry) {\r\n props.telemetryContent.telemetry.error(error.message);\r\n props.telemetryContent.telemetry.debug('Unable to update warranty');\r\n }\r\n });\r\n }\r\n }\r\n }\r\n // mmx-feature: store selector --end\r\n if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showModal) {\r\n setDisabled(false);\r\n openModal(true);\r\n } else if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showNotification) {\r\n setDisabled(false);\r\n const notification = new ItemSuccessfullyAddedToCartNotification(\r\n props.context,\r\n props.dialogStrings,\r\n props.imageSettings,\r\n props.gridSettings,\r\n product,\r\n data?.price,\r\n quantity,\r\n props.navigationUrl,\r\n props.telemetryContent!,\r\n props.id,\r\n props.typeName\r\n );\r\n NotificationsManager.instance().addNotification(notification);\r\n } else if (\r\n MsDyn365.isBrowser &&\r\n props.navigationUrl &&\r\n !props.isNavigationToCartPageDisabled &&\r\n (addToCartBehavior === undefined || addToCartBehavior === AddToCartBehavior.goToCart)\r\n ) {\r\n window.location.assign(props.navigationUrl);\r\n } else {\r\n setDisabled(false);\r\n }\r\n propagateResult(props, addToCartResult);\r\n } else {\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n addToCartResult.errorDetails?.LocalizedMessage ?? 'Add to cart failed',\r\n props.dialogStrings?.closeNotificationLabel ?? ''\r\n )\r\n );\r\n\r\n //mmx-feature --start\r\n /*\r\n propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: addToCartResult });\r\n */\r\n propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: addToCartResult }, selectedLocation);\r\n //mmx-feature --end\r\n setDisabled(false);\r\n }\r\n};\r\n\r\n/**\r\n * Callback to handle success of adding to cart.\r\n * @param props - Add to cart component props.\r\n * @param setDisabled - Callback to update disabled state of the component.\r\n * @param setItemsAddedToCartDialogOpen - Callback to update disabled state of the component.\r\n * @param setErrorMessage - Callback to update error message state of the component.\r\n * @param cartState - Current cart state.\r\n * @param addToCartInput - Input used for adding to cart.\r\n * @param addToCartResult - Result of adding to cart.\r\n */\r\nconst handleAddItemsToCartSuccess = async (\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\r\n setErrorMessage: (message: string) => void,\r\n cartState: ICartState,\r\n addToCartInput: {\r\n product: SimpleProduct;\r\n count: number;\r\n }[],\r\n addToCartResult: ICartActionResult\r\n) => {\r\n // Validate cart for line errors.\r\n const validationResult: CartLineValidationResults = await CartsDataActions.validateForCheckoutAsync(\r\n { callerContext: props.context.actionContext, bypassCache: 'none' },\r\n cartState.cart.Id,\r\n cartState.cart.Version\r\n );\r\n const errorCount = (validationResult.ValidationFailuresByCartLines ?? []).length;\r\n const singleErrorCount = 1;\r\n const errorText = errorCount === singleErrorCount ? props.dialogStrings?.oneErrorText : props.dialogStrings?.multiErrorsText;\r\n const errorMessage =\r\n errorCount > zero ? format(props.dialogStrings?.validationErrorMessage ?? '', errorCount.toString(), errorText) : '';\r\n\r\n setErrorMessage(errorMessage);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n const addToCartBehavior = props.context.app.config.addToCartBehavior;\r\n\r\n if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showModal) {\r\n setDisabled(false);\r\n setItemsAddedToCartDialogOpen(true);\r\n } else if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showNotification) {\r\n setDisabled(false);\r\n const itemsAddedResource: IItemsAddedToCartResources = {\r\n viewCartButtonText: props.dialogStrings.goToCartText,\r\n closeButtonLabel: props.dialogStrings.closeNotificationLabel,\r\n itemsAddedToCartHeaderText: props.dialogStrings.headerMessageText,\r\n itemsAddedToCartFormatText: props.dialogStrings.headerItemFormatText,\r\n linesAddedToCartFormatText: props.dialogStrings.headerLinesFormatText ?? '{0}',\r\n itemsAddedValidationErrorMessage: errorMessage\r\n };\r\n\r\n const notification = new MultiItemsSuccessfullyAddedToCartNotification(\r\n props.context,\r\n itemsAddedResource,\r\n props.imageSettings,\r\n props.gridSettings,\r\n addToCartInput,\r\n props.navigationUrl,\r\n props.telemetryContent!,\r\n props.id,\r\n props.typeName\r\n );\r\n NotificationsManager.instance().addNotification(notification);\r\n } else if (\r\n MsDyn365.isBrowser &&\r\n props.navigationUrl &&\r\n !props.isNavigationToCartPageDisabled &&\r\n (addToCartBehavior === undefined || addToCartBehavior === AddToCartBehavior.goToCart)\r\n ) {\r\n window.location.assign(props.navigationUrl);\r\n } else {\r\n setDisabled(false);\r\n }\r\n propagateResult(props, addToCartResult);\r\n};\r\n\r\n/**\r\n * Add one or multi item to cart from buy again.\r\n * @param props -- The props.\r\n * @param setDisabled -- The set disable call back.\r\n * @param setItemsAddedToCartDialogOpen -- The open modal call back.\r\n * @param setErrorMessage -- The set error message call back.\r\n */\r\nconst addItemsToCart = async (\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\r\n setErrorMessage: (message: string) => void\r\n): Promise => {\r\n const addToCartInput = await getAddToCartInputFromProps(props);\r\n\r\n if (!ArrayExtensions.hasElements(addToCartInput)) {\r\n return;\r\n }\r\n\r\n const cartState = await getCartState(props.context.actionContext);\r\n const addToCartResult = await cartState.addProductsToCart(addToCartInput);\r\n\r\n if (addToCartResult.status === 'SUCCESS') {\r\n await handleAddItemsToCartSuccess(\r\n props,\r\n setDisabled,\r\n setItemsAddedToCartDialogOpen,\r\n setErrorMessage,\r\n cartState,\r\n addToCartInput,\r\n addToCartResult\r\n );\r\n } else {\r\n if (props.dialogStrings?.buyAgainNotificationTitle) {\r\n // For buy again show simple error notification.\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n props.dialogStrings.buyAgainNotificationTitle,\r\n props.dialogStrings.buyAgainNotificationCloseAriaLabel ?? ''\r\n )\r\n );\r\n } else {\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n addToCartResult.errorDetails?.LocalizedMessage ?? 'Add to cart failed',\r\n props.dialogStrings?.closeNotificationLabel ?? ''\r\n )\r\n );\r\n }\r\n\r\n propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: addToCartResult });\r\n setDisabled(false);\r\n }\r\n};\r\n\r\n/**\r\n * Interface for add to cart component.\r\n */\r\nexport interface IAddtoCartComponent extends IComponent {\r\n onClick(): (event: React.MouseEvent, props: IAddToCartComponentProps) => void;\r\n}\r\n\r\n/**\r\n * On click function.\r\n * @param _event - The mouse event.\r\n * @param props - The props.\r\n * @param setDisabled - Flag to define whether the element is disabled.\r\n * @param openModal - Flag to specify if it should open in a modal window.\r\n * @param setItemsAddedToCartDialogOpen - Sets items added to cart while dialog is open.\r\n * @param setErrorMessage - Error message.\r\n */\r\nconst onClick = async (\r\n _event: React.MouseEvent,\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n openModal: (opened: boolean) => void,\r\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\r\n setErrorMessage: (message: string) => void\r\n): Promise => {\r\n if (!ArrayExtensions.hasElements(props.products)) {\r\n const cartError = addToCartError(props);\r\n\r\n if (cartError) {\r\n propagateError(props, cartError);\r\n return;\r\n }\r\n\r\n setDisabled(true);\r\n }\r\n\r\n const hasOrderDetailsProducts =\r\n ArrayExtensions.hasElements(props.orderDetailsProducts) && props.orderDetailsProducts.length > defaultQuantity;\r\n const hasProducts = ArrayExtensions.hasElements(props.products) && props.products.length > defaultQuantity;\r\n\r\n const hasMultipleProducts = hasOrderDetailsProducts || hasProducts;\r\n\r\n if (props.shouldSkipSiteSettings && hasMultipleProducts) {\r\n await addItemsToCart(props, setDisabled, setItemsAddedToCartDialogOpen, setErrorMessage);\r\n } else {\r\n // mmx-feature: store selector, non-stocked products --begin\r\n /*\r\n await addOneItemToCart(props, setDisabled, openModal);\r\n */\r\n const mmxDataAreaId = 'mxc' //company in d365. internal default is dat, for memx usage use mxc\r\n const addToCartInput = await getAddToCartInputFromProps(props)\r\n const product = addToCartInput[0].product;\r\n\r\n let selectedLocation: IStoreInfo | undefined = await getSelectedStoreLocation();\r\n const deliveryOptionContext = await getDeliveryOptionContextAction(new GetDeliveryOptionContextInput(props.context.actionContext.requestContext.apiSettings.channelId), props.context.actionContext);\r\n\r\n if (deliveryOptionContext.isShippingEnabled) {\r\n await addOneItemToCart(props, undefined, setDisabled, openModal);\r\n } else if (!selectedLocation) {\r\n OpenStoreSelectorDialog(props, product, setDisabled, openModal);\r\n } else {\r\n const estimatedAvailabilities = await getEstimatedProductWarehouseAvailabilityAsync(\r\n { callerContext: props.context.actionContext },\r\n [{\r\n ProductId: product.RecordId,\r\n InventLocationId: selectedLocation.StoreId,\r\n DataAreaId: mmxDataAreaId\r\n }]\r\n );\r\n \r\n const orgUnits = await getOrgUnitLocationsByAreaAsync(\r\n { callerContext: props.context.actionContext },\r\n {\r\n Latitude: selectedLocation.Latitude,\r\n Longitude: selectedLocation.Longitude,\r\n Radius:0,\r\n DistanceUnitValue:0\r\n }\r\n );\r\n\r\n const location = orgUnits.find(orgUnit => orgUnit.OrgUnitNumber == selectedLocation?.StoreId);\r\n const productInventoryInformation = mapProductInventoryInformation(props.context.actionContext, estimatedAvailabilities.ProductWarehouseInventoryAvailabilities);\r\n const selectedLocationInventory = productInventoryInformation[0];\r\n\r\n if (location &&\r\n selectedLocationInventory?.ProductAvailableQuantity?.AvailableQuantity != null &&\r\n (selectedLocationInventory.ProductAvailableQuantity.AvailableQuantity > 0 || !product.Behavior?.IsStockedProduct)) {\r\n await addOneItemToCart(props, location, setDisabled, openModal);\r\n } else {\r\n await OpenStoreSelectorDialog(props, product, setDisabled, openModal);\r\n }\r\n \r\n setDisabled(false);\r\n }\r\n //mmx-feature: store selector, non-stocked products --end\r\n }\r\n};\r\n\r\n//mmx-feature: store selector open dialog --begin\r\nconst OpenStoreSelectorDialog = async (\r\n props: IAddToCartComponentProps,\r\n product: SimpleProduct,\r\n setDisabled: (disabled: boolean) => void,\r\n openModal: (opened: boolean) => void\r\n): Promise => {\r\n\r\n const onLocationSelected = async (orgUnitLocation: OrgUnitLocation, deliveryMode: string) => {\r\n setDisabled(true);\r\n await addOneItemToCart(props, orgUnitLocation, setDisabled, openModal);\r\n }\r\n\r\n await setPickupLocationForProduct(\r\n product,\r\n props.quantity ?? 0,\r\n onLocationSelected,\r\n props.storeSelectorId ?? 'mmx-store-selector',\r\n modalCloseButtonReference, \r\n props.context.request.apiSettings.channelId,\r\n props.context.actionContext,\r\n props.telemetryContent?.telemetry\r\n )\r\n\r\n setDisabled(false);\r\n}\r\n//mmx-feature: store selector open dialog --end\r\n\r\n/**\r\n * Add to cart component action constant.\r\n */\r\nconst AddToCartComponentActions = {\r\n onClick\r\n};\r\n\r\n/**\r\n * Add to cart component.\r\n * @param props - The props.\r\n * @returns - The add to cart component.\r\n */\r\nexport const AddToCartFunctionalComponent: React.FC = (props: IAddToCartComponentProps) => {\r\n const [disabled, setDisabled] = useState(false);\r\n const [modalOpen, setModalOpen] = useState(false);\r\n const [isItemsAddedToCartDialogOpen, setItemsAddedToCartDialogOpen] = useState(false);\r\n const [errorMessage, setErrorMessage] = useState('');\r\n const [addToCartInput, setAddToCartInput] = useState<\r\n {\r\n product: SimpleProduct;\r\n count: number;\r\n }[]\r\n >([]);\r\n\r\n const onClickHandler = async (event: React.MouseEvent) => {\r\n await AddToCartComponentActions.onClick(event, props, setDisabled, setModalOpen, setItemsAddedToCartDialogOpen, setErrorMessage);\r\n };\r\n\r\n /**\r\n * Close dialog.\r\n */\r\n const closeItemsAddedToCartDialog = React.useCallback(() => {\r\n setItemsAddedToCartDialogOpen(false);\r\n }, []);\r\n\r\n const priceComponent = props.data?.price ? (\r\n \r\n ) : (\r\n ''\r\n );\r\n\r\n const popupProps: IPopupProps = {\r\n context: props.context,\r\n className: 'msc-add-to-cart',\r\n id: props.id,\r\n typeName: props.typeName,\r\n data: { product: addToCartInput[0]?.product, price: props.data?.price }, // addToCartInput[0]?.product?.Price },\r\n dialogStrings: props.dialogStrings,\r\n imageSettings: props.imageSettings,\r\n gridSettings: props.context.request.gridSettings,\r\n productQuantity: addToCartInput[0]?.count !== undefined ? addToCartInput[0]?.count : defaultQuantity,\r\n priceComponent,\r\n navigationUrl: props.navigationUrl,\r\n modalOpen,\r\n setModalOpen,\r\n telemetryContent: props.telemetryContent\r\n };\r\n\r\n const itemsAddedResource: IItemsAddedToCartResources = {\r\n viewCartButtonText: props.dialogStrings?.goToCartText ?? '',\r\n closeButtonLabel: props.dialogStrings?.closeNotificationLabel ?? 'Close',\r\n itemsAddedToCartHeaderText: props.dialogStrings?.headerMessageText ?? '',\r\n itemsAddedToCartFormatText: props.dialogStrings?.headerItemFormatText ?? '',\r\n linesAddedToCartFormatText: props.dialogStrings?.headerLinesFormatText ?? '{0}',\r\n itemsAddedValidationErrorMessage: errorMessage\r\n };\r\n\r\n const renderModalPopup = ;\r\n const label = getLinkText(props);\r\n const payload = getPayloadObject(TelemetryEvent.AddToCart, props.telemetryContent!, label, '');\r\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\r\n const buttonClassName = props.shouldSkipSiteSettings ? '' : 'msc-add-to-cart ';\r\n\r\n React.useEffect(() => {\r\n /**\r\n * Retrieves add to cart input and updates the state.\r\n */\r\n const retrieveAddToCartInput = async () => {\r\n const retrievedInput = await getAddToCartInputFromProps(props);\r\n setAddToCartInput(retrievedInput);\r\n };\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call async method as per the documentation of react useEffect.\r\n retrieveAddToCartInput();\r\n }, [props, setAddToCartInput]);\r\n\r\n return (\r\n <>\r\n {renderModalPopup}\r\n \r\n {label}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\n// Set default props\r\nAddToCartFunctionalComponent.defaultProps = {\r\n quantity: defaultQuantity\r\n};\r\n\r\n/**\r\n * Resolves whether product is in stock.\r\n * @param props - The add to cart component props.\r\n * @returns Gets the link text.\r\n */\r\nconst getLinkText = (props: IAddToCartComponentProps): string => {\r\n return shouldShowOutOfStock(props, false) && props.outOfStockText ? props.outOfStockText : props.addToCartText;\r\n};\r\n\r\n/**\r\n * Resolves whether product is in stock.\r\n * @param props - The add to cart component props.\r\n * @returns The add to cart failure result.\r\n */\r\nconst addToCartError = (props: IAddToCartComponentProps): IAddToCartFailureResult | undefined => {\r\n const {\r\n data,\r\n productAvailability,\r\n isCustomPriceSelected,\r\n customPriceAmount,\r\n maximumKeyInPrice,\r\n minimumKeyInPrice,\r\n defaultMaximumKeyInPrice = 100,\r\n defaultMinimumKeyInPrice = 10\r\n } = props;\r\n\r\n if (!data || !data.product.RecordId) {\r\n // No product exists, won't be able to add to cart\r\n return { failureReason: 'EMPTYINPUT' };\r\n }\r\n\r\n if (data.product.Dimensions) {\r\n const missingDimensions = data.product.Dimensions.filter(\r\n dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value)\r\n );\r\n\r\n if (ArrayExtensions.hasElements(missingDimensions)) {\r\n // At least one dimension with no value exists on the product, won't be able to add to cart\r\n return { failureReason: 'MISSINGDIMENSION', missingDimensions };\r\n }\r\n }\r\n\r\n if (shouldShowOutOfStock(props, true)) {\r\n const defaultAvailableQuantity = 0; // Showing as out of stock if no available products found.\r\n const availableQuantity = productAvailability?.AvailableQuantity ?? defaultAvailableQuantity;\r\n const stockLeft = Math.max(availableQuantity, defaultAvailableQuantity);\r\n\r\n return { failureReason: 'OUTOFSTOCK', stockLeft };\r\n }\r\n\r\n // When Custom price is selected, if there is no keyed-in price or keyed-in price is out of limit, should return error.\r\n if (\r\n isCustomPriceSelected &&\r\n (!customPriceAmount ||\r\n customPriceAmount > (maximumKeyInPrice || defaultMaximumKeyInPrice) ||\r\n customPriceAmount < (minimumKeyInPrice || defaultMinimumKeyInPrice))\r\n ) {\r\n return { failureReason: 'INVALIDCUSTOMAMOUNT' };\r\n }\r\n\r\n // Only allow adding to cart if not showing out of stock\r\n return undefined;\r\n};\r\n\r\n/**\r\n * Resolves whether product is in stock.\r\n * @param props - The add to cart component props.\r\n * @param includeCurrentQuantity - Flag to specify whether current quantity should be included.\r\n * @returns The dialog element.\r\n */\r\nconst shouldShowOutOfStock = (props: IAddToCartComponentProps, includeCurrentQuantity: boolean): boolean => {\r\n if (props.context.app.config.enableStockCheck === undefined || props.context.app.config.enableStockCheck === false) {\r\n return false;\r\n }\r\n\r\n // When skip site settings do not need show out of stock on adding to cart\r\n if (props.shouldSkipSiteSettings) {\r\n return false;\r\n }\r\n\r\n if (\r\n props.isLoading ||\r\n props.isProductQuantityLoading ||\r\n props.isUpdatingDimension ||\r\n props.isLoadingDeliveryOptions ||\r\n props.isUpdatingDeliveryOptions ||\r\n props.isAddServiceItemToCart\r\n ) {\r\n // Out of stock turn off, don't bother showing out of stock\r\n return false;\r\n }\r\n\r\n if (!props.data || !props.data.product.RecordId) {\r\n // No product exists, don't bother showing out of stock\r\n return false;\r\n }\r\n\r\n const hasAvailableProducts = props.hasAvailableProducts ?? true;\r\n if (!hasAvailableProducts) {\r\n return true;\r\n }\r\n\r\n if (props.data.product.Dimensions) {\r\n if (props.data.product.Dimensions.find(dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value))) {\r\n // At least one dimension with no value exists on the product, so also don't show out of stock\r\n return false;\r\n }\r\n }\r\n\r\n const includedQuantityNumber = includeCurrentQuantity && props.quantity ? props.quantity : defaultQuantity;\r\n\r\n return !(\r\n props.productAvailability &&\r\n props.productAvailability.AvailableQuantity !== undefined &&\r\n props.productAvailability.AvailableQuantity >= includedQuantityNumber\r\n );\r\n};\r\n\r\nconst isIntermediateState = (props: IAddToCartComponentProps): boolean => {\r\n if (props.data?.product.Dimensions) {\r\n if (props.data.product.Dimensions.find(dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value))) {\r\n // At least one dimension with no value exists on the product, so also not in intermediate state\r\n return false;\r\n }\r\n }\r\n\r\n if (!props.isLoading && !props.isUpdatingDimension && !props.isLoadingDeliveryOptions && !props.isUpdatingDeliveryOptions) {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\n// mmx-feature: store selector --begin\r\nconst getNewCartLine = (newCartLines: CartLine[], oldCartLines: CartLine[], productId?: number): CartLine | undefined => {\r\n let newCartLine = undefined;\r\n newCartLines.map(newcl => {\r\n var newclIsUnique = true;\r\n oldCartLines.map((scl: CartLine) => {\r\n if (scl.LineId == newcl.LineId) {\r\n //check to see if the productids match\r\n newclIsUnique = false;\r\n }\r\n });\r\n if (newclIsUnique) {\r\n if (!productId || newcl.ProductId == productId) {\r\n newCartLine = newcl;\r\n //exits the map function, NOT the getNewCartLine function\r\n return;\r\n }\r\n }\r\n });\r\n //this one is the one that returns from getNewCartLine\r\n return newCartLine;\r\n};\r\nconst getSelectedStoreLocation = async (): Promise => {\r\n const storage = window.localStorage;\r\n let locationCookie = storage.getItem('_msdyn365__preferredStore_');\r\n if (locationCookie) {\r\n let locationJSON = JSON.parse(locationCookie);\r\n let orgUnitLocation: OrgUnitLocation = {...locationJSON};\r\n return orgUnitLocation;\r\n }\r\n return;\r\n};\r\n// mmx-feature: store selector --end\r\n\r\n// @ts-expect-error\r\nexport const AddToCartComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride(\r\n 'AddToCart',\r\n { component: AddToCartFunctionalComponent, ...AddToCartComponentActions }\r\n);\r\n\r\n\r\nexport default AddToCartComponent;","/*!\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, { IActionContext } from '@msdyn365-commerce/core';\r\nimport { action, computed, observable } from 'mobx';\r\n\r\nimport {\r\n IListMapViewState,\r\n ILoadMapApiInput,\r\n IStoreInfo,\r\n IStoreSelectionStateContext,\r\n IStoreSelectorLocation,\r\n IStoreSelectorStateManager\r\n} from './i-store-selection-state-manager';\r\n\r\n/**\r\n * Abstract instance of IStoreSelectorStateManager with base implementation\r\n * of everything except the geoLocate function.\r\n */\r\nexport abstract class BaseStoreSelectorStateManager implements IStoreSelectorStateManager {\r\n @computed public get isDialogOpen(): Readonly {\r\n return this._context !== undefined;\r\n }\r\n\r\n @computed public get context(): Readonly {\r\n return this._context;\r\n }\r\n\r\n @observable public isMapApiLoaded?: boolean;\r\n\r\n @observable public selectedStoreLocationId?: string;\r\n\r\n @observable public preferredStore?: IStoreInfo;\r\n\r\n @observable public listMapViewState: IListMapViewState = { displayList: true, displayMap: false };\r\n\r\n @observable public isMapModuleLoaded?: boolean;\r\n\r\n @observable public lastInlineShownStoreInfo?: IStoreInfo;\r\n\r\n @observable protected _context?: IStoreSelectionStateContext;\r\n\r\n private readonly preferredStoreLocalStorageKey: string = '_msdyn365__preferredStore_';\r\n\r\n constructor() {\r\n this.isMapModuleLoaded = false;\r\n const value = this._readFromToCookie(this.preferredStoreLocalStorageKey);\r\n try {\r\n const storeInfo: IStoreInfo | undefined = value ? JSON.parse(value) : undefined;\r\n if (storeInfo) {\r\n this.preferredStore = storeInfo;\r\n }\r\n } catch {\r\n this.preferredStore = undefined;\r\n }\r\n }\r\n\r\n public abstract geoLocate(searchTerm: string, actionContext: IActionContext): Promise;\r\n\r\n public abstract loadMapApi(input: ILoadMapApiInput): Promise;\r\n\r\n @action\r\n public async toggleListMapViewState(): Promise {\r\n this.listMapViewState = {\r\n displayList: !this.listMapViewState.displayList,\r\n displayMap: !this.listMapViewState.displayMap\r\n };\r\n }\r\n\r\n @action\r\n public async setMapModuleLoaded(input: boolean): Promise {\r\n this.isMapModuleLoaded = input;\r\n }\r\n\r\n @action\r\n public async setOrgUnitStoreInformation(input: IStoreSelectionStateContext): Promise {\r\n this._context = input;\r\n }\r\n\r\n @action\r\n public async setSelectedStoreLocationId(storeId: string | undefined): Promise {\r\n this.selectedStoreLocationId = storeId;\r\n }\r\n\r\n @action\r\n public async setPreferredStoreLocation(\r\n storeId?: string,\r\n storeName?: string | undefined,\r\n writeToCookie: boolean = false,\r\n latitude?: number,\r\n longitude?: number\r\n ): Promise {\r\n const storeInfo: IStoreInfo = { StoreId: storeId, StoreName: storeName, Latitude: latitude, Longitude: longitude };\r\n this.preferredStore = storeInfo;\r\n if (writeToCookie) {\r\n this._writeToCookie(this.preferredStoreLocalStorageKey, JSON.stringify(storeInfo));\r\n }\r\n }\r\n\r\n @action\r\n public async setLastInlineStoreInfo(latitude?: number, longitude?: number): Promise {\r\n const storeInfo: IStoreInfo = { StoreId: '', StoreName: '', Latitude: latitude, Longitude: longitude };\r\n this.lastInlineShownStoreInfo = storeInfo;\r\n }\r\n\r\n @action\r\n public async clearPreferredStore(writeToCookie: boolean): Promise {\r\n this.preferredStore = undefined;\r\n if (writeToCookie) {\r\n this._removeCookie(this.preferredStoreLocalStorageKey);\r\n }\r\n }\r\n\r\n @action\r\n public async openDialog(input: IStoreSelectionStateContext): Promise {\r\n if (this._context && this._context.id === input.id) {\r\n throw new Error('Dialog is already opened');\r\n }\r\n\r\n this._context = input;\r\n }\r\n\r\n @action\r\n public async closeDialog(): Promise {\r\n this._context = undefined;\r\n }\r\n\r\n private _removeCookie(key: string): void {\r\n if (!key) {\r\n return;\r\n }\r\n if (MsDyn365.isBrowser) {\r\n const storage = window.localStorage;\r\n storage.removeItem(key);\r\n }\r\n }\r\n\r\n private _writeToCookie(key: string, value: string | undefined): void {\r\n if (!key || !value) {\r\n return;\r\n }\r\n if (MsDyn365.isBrowser) {\r\n const storage = window.localStorage;\r\n storage.setItem(key, value);\r\n }\r\n }\r\n\r\n private _readFromToCookie(key: string): string | undefined {\r\n if (!key) {\r\n return undefined;\r\n }\r\n if (MsDyn365.isBrowser) {\r\n const storage = window.localStorage;\r\n const cookieValue = storage.getItem(key);\r\n if (cookieValue) {\r\n return cookieValue;\r\n }\r\n }\r\n\r\n return undefined;\r\n }\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 { IActionContext } from '@msdyn365-commerce/core';\r\nimport { StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { action } from 'mobx';\r\n\r\nimport { BaseStoreSelectorStateManager } from './base-store-selector-state-manager';\r\nimport { ILoadMapApiInput, IStoreSelectorLocation } from './i-store-selection-state-manager';\r\nimport { IMapWindow, MapLocationsResult } from './models/map-data';\r\n\r\ndeclare const window: IMapWindow;\r\n\r\n/**\r\n * Instance of IStoreSelectorStateManager manager that uses Map service\r\n * for geo location.\r\n */\r\nexport class MapStoreSelectorStateManager extends BaseStoreSelectorStateManager {\r\n private readonly SERVICE_ENDPOINT: string = 'https://dev.virtualearth.net/REST/v1/';\r\n\r\n private readonly MAP_API_ENDPOINT: string = 'https://www.bing.com/api/maps/mapcontrol?callback=mapAPIReady';\r\n\r\n @action\r\n public async geoLocate(searchTerm: string, actionContext: IActionContext): Promise {\r\n if (\r\n !searchTerm ||\r\n !actionContext.requestContext.channel ||\r\n !actionContext.requestContext.channel.BingMapsApiKey ||\r\n !actionContext.requestContext.channel.BingMapsEnabled\r\n ) {\r\n return undefined;\r\n }\r\n\r\n let searchContent: string = searchTerm;\r\n\r\n const jsonp = `mapSearchCallback_${crypto.getRandomValues(new Uint32Array(1))[0]}`;\r\n\r\n if (actionContext.requestContext.channel.ChannelCountryRegionISOCode) {\r\n searchContent = `${searchTerm.trim()} ${actionContext.requestContext.channel.ChannelCountryRegionISOCode}`;\r\n }\r\n\r\n const query = encodeURI(searchContent);\r\n const key = encodeURI(actionContext.requestContext.channel.BingMapsApiKey);\r\n\r\n const geolocationApiUrl =\r\n actionContext.requestContext.app &&\r\n actionContext.requestContext.app.config &&\r\n actionContext.requestContext.app.config.geolocationApiUrl;\r\n const requestUrl = `${\r\n geolocationApiUrl ? geolocationApiUrl : this.SERVICE_ENDPOINT\r\n }/Locations?query=${query}&key=${key}&jsonp=${jsonp}`;\r\n\r\n return new Promise(resolve => {\r\n const script = document.createElement('script');\r\n script.setAttribute('type', 'text/javascript');\r\n script.setAttribute('src', requestUrl);\r\n\r\n window[jsonp] = (data: MapLocationsResult) => {\r\n delete window[jsonp];\r\n script.remove();\r\n\r\n if (data && data.resourceSets && data.resourceSets.length > 0 && data.resourceSets[0].resources.length > 0) {\r\n resolve({\r\n latitude: data.resourceSets[0].resources[0].point.coordinates[0],\r\n longitude: data.resourceSets[0].resources[0].point.coordinates[1]\r\n });\r\n }\r\n\r\n resolve(undefined);\r\n };\r\n\r\n document.body.appendChild(script);\r\n });\r\n }\r\n\r\n @action\r\n public async loadMapApi(input: ILoadMapApiInput): Promise {\r\n if (StringExtensions.isNullOrEmpty(input.key)) {\r\n return Promise.resolve();\r\n }\r\n\r\n const isScriptAlreadyLoaded = !!document?.getElementById('msdyn_map-api-script');\r\n\r\n if (isScriptAlreadyLoaded) {\r\n // Prevents from loading multiple script into the body\r\n return Promise.resolve();\r\n }\r\n\r\n const url = `${this.MAP_API_ENDPOINT}${input.key ? `&key=${input.key}` : ''}${input.lang ? `&setLang=${input.lang}` : ''}${\r\n input.market ? `&setMkt=${input.market}` : ''\r\n }`;\r\n\r\n return new Promise((resolve, reject) => {\r\n const script = document?.createElement('script');\r\n script.type = 'text/javascript';\r\n script.async = true;\r\n script.defer = true;\r\n script.src = url;\r\n script.id = 'msdyn_map-api-script';\r\n if (window) {\r\n window.mapAPIReady = () => {\r\n this.isMapApiLoaded = true;\r\n resolve();\r\n };\r\n }\r\n script.addEventListener('error', (error: string | Event) => {\r\n reject(error);\r\n });\r\n document?.body?.appendChild(script);\r\n });\r\n }\r\n}\r\n","import { IActionContext, ITelemetry, ICreateActionContext, IGeneric, IAny } from '@msdyn365-commerce/core';\r\nimport { OrgUnitLocation, ProductSearchResult, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { ICommerceApiSettings } from '@msdyn365-commerce/core-internal';\r\nimport { storeSelectorStateDataAction, IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\r\n// @ts-ignore\r\nimport { MapStoreSelectorStateManager } from '../modules/mmx-store-selector/state-manager/map-store-selector-state-manager';\r\nimport {\r\n GenericInput,\r\n getDeliveryOptionsForSelectedVariant,\r\n GetDeliveryOptionsForSelectedVariantInput,\r\n getOrgUnitLocationsByArea,\r\n GetOrgUnitLocationsByAreaInput\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport React from 'react';\r\n\r\n/**\r\n * Assigns given pickup location to given product.\r\n */\r\nexport const setPickupLocationForProduct = async (\r\n product: SimpleProduct,\r\n quantity: number,\r\n onLocationSelected: (orgUnitLocation: OrgUnitLocation, deliveryMode: string) => Promise,\r\n storeSelectorId: string,\r\n modalCloseButtonReference: React.RefObject,\r\n channelId: number,\r\n actionContext: IActionContext,\r\n telemetry?: ITelemetry\r\n): Promise => {\r\n let storeSelectorStateManager = await storeSelectorStateDataAction(\r\n new GenericInput('mapSSSM', new MapStoreSelectorStateManager(), 'IStoreSelectorStateManager'),\r\n actionContext\r\n ).catch((error: Error) => {\r\n if (telemetry) {\r\n telemetry.error(error.message);\r\n telemetry.debug('Error finding store selector state manager');\r\n }\r\n });\r\n\r\n if (storeSelectorStateManager) {\r\n const deliveryOptions = await getDeliveryOptionsForSelectedVariant(\r\n new GetDeliveryOptionsForSelectedVariantInput(product.RecordId, channelId, undefined, undefined, true),\r\n actionContext\r\n );\r\n\r\n let locations = await getOrgUnitLocationsByArea(\r\n new GetOrgUnitLocationsByAreaInput(undefined, undefined, 0, 0, true),\r\n actionContext\r\n );\r\n\r\n if (locations && locations.length) {\r\n if (locations.length > 1) {\r\n await storeSelectorStateManager\r\n .openDialog({\r\n product: product,\r\n id: storeSelectorId ?? 'mmx-store-selector',\r\n parentElementRef: modalCloseButtonReference,\r\n deliveryOptions: deliveryOptions,\r\n additionalProperties: {\r\n amountSelected: quantity,\r\n isStockedProuct: product.Behavior?.IsStockedProduct\r\n },\r\n onLocationSelected: onLocationSelected\r\n })\r\n .catch((error: any) => {\r\n if (telemetry) {\r\n telemetry.warning(error);\r\n telemetry.debug('[order-template-lines] Error trying to Update Cart Line from the order template lines');\r\n }\r\n });\r\n return Promise.resolve(undefined);\r\n } else {\r\n if (locations[0].OrgUnitAvailability && locations[0].OrgUnitAvailability?.OrgUnitLocation) {\r\n const defaultDeliveryOption = deliveryOptions?.DeliveryOptions ? deliveryOptions.DeliveryOptions[0].Code : undefined;\r\n if (defaultDeliveryOption) {\r\n onLocationSelected(locations[0].OrgUnitAvailability.OrgUnitLocation, defaultDeliveryOption);\r\n return Promise.resolve(undefined);\r\n } else {\r\n return Promise.reject('Could not find value delivery options');\r\n }\r\n } else {\r\n return Promise.reject('No valid org unit availability object');\r\n }\r\n }\r\n } else {\r\n return Promise.reject('No location found');\r\n }\r\n }\r\n return Promise.reject('Could not set pickup location');\r\n};\r\n/**\r\n * Utility function to extract the active productId in the following priority:\r\n * First query param (productId), then UrlToken (itemId), then module config.\r\n * Shamelessly stolen from msdyn commerce modules.\r\n * @param inputData The Action Input data.\r\n */\r\nexport const getSelectedProductIdFromActionInput = (inputData: ICreateActionContext>): string | undefined => {\r\n if (inputData && inputData.requestContext && inputData.requestContext.query && inputData.requestContext.query['product-id']) {\r\n return inputData.requestContext.query['product-id'];\r\n } else if (inputData && inputData.requestContext && inputData.requestContext.query && inputData.requestContext.query.productId) {\r\n return inputData.requestContext.query.productId;\r\n } else if (\r\n inputData &&\r\n inputData.requestContext &&\r\n inputData.requestContext.urlTokens &&\r\n inputData.requestContext.urlTokens.pageType &&\r\n inputData.requestContext.urlTokens.pageType !== 'Category' &&\r\n inputData.requestContext.urlTokens.itemId\r\n ) {\r\n return inputData.requestContext.urlTokens.itemId;\r\n } else if (inputData && inputData.config && inputData.config.productId) {\r\n return inputData.config.productId;\r\n }\r\n return undefined;\r\n};\r\n\r\n/**\r\n * Generates a Image URL for a product based on data return from retail server.\r\n * @param product The Product returned by Retail Server.\r\n * @param apiSettings\r\n */\r\nexport const generateProductImageUrl = (\r\n product: SimpleProduct | ProductSearchResult,\r\n apiSettings: ICommerceApiSettings\r\n): string | undefined => {\r\n const fullImagePath = /^(\\/\\/|^)http/;\r\n const PRODUCT_DELINEATOR_INDEX = 0;\r\n const PRODUCT_SEQ_INDEX = 4;\r\n\r\n let imageUrl = product.PrimaryImageUrl;\r\n if (imageUrl) {\r\n if (fullImagePath.test(imageUrl)) {\r\n return imageUrl;\r\n }\r\n let imageUrlDecoded = decodeURIComponent(imageUrl);\r\n let imageComponents = imageUrlDecoded.split(' ^');\r\n let imageUrlRebuilt = imageComponents[PRODUCT_DELINEATOR_INDEX];\r\n if (imageComponents.length > 1) {\r\n imageUrlRebuilt += imageComponents[PRODUCT_SEQ_INDEX];\r\n }\r\n // Images hosted in Retail Server must be encoded and joined with the base image url\r\n return apiSettings.baseImageUrl + encodeURIComponent(imageUrlRebuilt);\r\n }\r\n return undefined;\r\n};\r\n\r\n/**\r\n * Gets item at provided cache key from the cache of a state data action. If multiple results are found, return only the first one.\r\n * @param context The request context\r\n * @param cacheObjectType The object type returned by the state data action\r\n * @param cacheKey The name of the state data action\r\n */\r\nexport function getSingleItemFromStateAction(context: IActionContext, cacheObjectType: string, cacheKey: string): T | undefined {\r\n const result = context.get(cacheObjectType, cacheKey);\r\n if (!result) {\r\n return undefined;\r\n } else if (Object.prototype.toString.call(result) !== '[object Array]') {\r\n //@ts-ignore\r\n return result;\r\n }\r\n return result[0];\r\n}\r\n"],"names":["GetDeliveryOptionContextInput","constructor","channelId","getCacheKey","this","getCacheObjectType","dataCacheType","createObservableDataAction","action","async","input","ctx","_channelDeliveryOptio","_channelDeliveryOptio2","_channelDeliveryOptio3","channelDeliveryOptions","channelDeliveryOptionConfig","Promise","all","getChannelDeliveryOptionsAsync","callerContext","requestContext","apiSettings","getChannelDeliveryOptionConfigurationAsync","deliveryOptions","find","group","ChannelId","DeliveryOptions","pickupDeliveryOptions","PickupDeliveryModeCodes","isShippingEnabled","isPickupEnabled","deliveryOption","Code","indexOf","id","args","ProductWarrantyStateInput","productId","productWarrantyStateAction","inputData","selectedId","getSelectedProductIdFromActionInput","Error","modalCloseButtonReference","React","AddToCartBehavior","propagateResult","props","result","onAdd","propagateError","location","onError","getAddToCartInputFromProps","_props$orderDetailsPr","_props$context$action","_props$data","products","orderDetailsProducts","filter","product","ObjectExtensions","isNullOrUndefined","simpleProduct","emailDeliveryModeCode","context","actionContext","channel","EmailDeliveryModeCode","map","salesLine","DeliveryMode","count","Quantity","catalogId","CatalogId","isAddEmailDeliveryItemToCart","ArrayExtensions","hasElements","_props$catalogId","getCatalogId","validateCatalogId","searchCriteriaInput","Context","IncludeAttributes","Ids","productSearchResultsWithImages","ProductsDataActions","productSearchResult","newProductSearchResult","_objectSpread","newImageUrl","generateProductImageUrl","PrimaryImageUrl","item","productData","RecordId","_productData$BasePric","ProductTypeValue","ProductType","Variant","AdjustedPrice","Price","BasePrice","quantity","_props$quantity","data","addOneItemToCart","selectedLocation","setDisabled","openModal","_cartState$cart$CartL","_props$productAvailab","addToCartBehavior","app","config","addToCartInput","cartState","getCartState","staticCartLines","Object","assign","cart","CartLines","addToCartResult","addProductToCart","availableQuantity","productAvailability","AvailableQuantity","additionalProperties","validateQuantity","isOrderQuantityLimitsFeatureEnabled","enableStockCheck","isPriceKeyedIn","customPrice","customPriceAmount","undefined","shouldSkipSiteSettings","status","newCartState","_getSelectedProductId","selectedWarrantyOption","Period","newCartLine","getNewCartLine","WarrantableProduct","updateWarrantySelectionsAsync","WarrantableCartLine","Option","then","refreshCart","catch","error","_props$telemetryConte","telemetryContent","telemetry","message","debug","dialogStrings","showModal","showNotification","notification","ItemSuccessfullyAddedToCartNotification","imageSettings","gridSettings","price","navigationUrl","typeName","NotificationsManager","instance","addNotification","MsDyn365","isBrowser","isNavigationToCartPageDisabled","goToCart","window","_addToCartResult$erro","_addToCartResult$erro2","_props$dialogStrings$","_props$dialogStrings","ErrorNotification","errorDetails","LocalizedMessage","closeNotificationLabel","failureReason","cartActionResult","addItemsToCart","setItemsAddedToCartDialogOpen","setErrorMessage","addProductsToCart","_validationResult$Val","_props$dialogStrings2","_props$dialogStrings3","_props$dialogStrings$2","_props$dialogStrings4","errorCount","CartsDataActions","bypassCache","Id","Version","ValidationFailuresByCartLines","length","errorText","oneErrorText","multiErrorsText","errorMessage","format","validationErrorMessage","toString","_props$dialogStrings$3","itemsAddedResource","viewCartButtonText","goToCartText","closeButtonLabel","itemsAddedToCartHeaderText","headerMessageText","itemsAddedToCartFormatText","headerItemFormatText","linesAddedToCartFormatText","headerLinesFormatText","itemsAddedValidationErrorMessage","MultiItemsSuccessfullyAddedToCartNotification","handleAddItemsToCartSuccess","_props$dialogStrings5","_props$dialogStrings$4","_addToCartResult$erro3","_addToCartResult$erro4","_props$dialogStrings$5","_props$dialogStrings6","buyAgainNotificationTitle","buyAgainNotificationCloseAriaLabel","OpenStoreSelectorDialog","_props$quantity2","_props$storeSelectorI","_props$telemetryConte2","setPickupLocationForProduct","orgUnitLocation","deliveryMode","storeSelectorId","request","AddToCartComponentActions","onClick","_event","cartError","addToCartError","hasOrderDetailsProducts","hasProducts","hasMultipleProducts","mmxDataAreaId","getSelectedStoreLocation","getDeliveryOptionContextAction","_selectedLocationInve","_product$Behavior","estimatedAvailabilities","getEstimatedProductWarehouseAvailabilityAsync","ProductId","InventLocationId","StoreId","DataAreaId","getOrgUnitLocationsByAreaAsync","Latitude","Longitude","Radius","DistanceUnitValue","orgUnit","OrgUnitNumber","selectedLocationInventory","mapProductInventoryInformation","ProductWarehouseInventoryAvailabilities","ProductAvailableQuantity","Behavior","IsStockedProduct","AddToCartFunctionalComponent","_props$data2","_props$dialogStrings7","_props$dialogStrings8","_props$dialogStrings9","_addToCartInput$","_props$data3","_addToCartInput$2","_addToCartInput$3","_props$dialogStrings$6","_props$dialogStrings10","_props$dialogStrings$7","_props$dialogStrings11","_props$dialogStrings$8","_props$dialogStrings12","_props$dialogStrings$9","_props$dialogStrings13","_props$dialogStrings$10","_props$dialogStrings14","_props$addToCartArial","_props$addToCartArial2","disabled","useState","modalOpen","setModalOpen","isItemsAddedToCartDialogOpen","setAddToCartInput","closeItemsAddedToCartDialog","priceComponent","PriceComponent","freePriceText","originalPriceText","currentPriceText","popupProps","className","productQuantity","renderModalPopup","Popup","label","getLinkText","payload","getPayloadObject","TelemetryEvent","AddToCart","attributes","getTelemetryAttributes","buttonClassName","retrievedInput","retrieveAddToCartInput","classnames","addToCartArialLabel","title","event","isIntermediateState","shouldShowOutOfStock","ItemsAddedToCartDialogComponent","isModalOpen","onClose","defaultProps","outOfStockText","addToCartText","isCustomPriceSelected","maximumKeyInPrice","minimumKeyInPrice","defaultMaximumKeyInPrice","defaultMinimumKeyInPrice","Dimensions","missingDimensions","dimension","DimensionValue","Value","_productAvailability$","defaultAvailableQuantity","stockLeft","Math","max","includeCurrentQuantity","_props$hasAvailablePr","isLoading","isProductQuantityLoading","isUpdatingDimension","isLoadingDeliveryOptions","isUpdatingDeliveryOptions","isAddServiceItemToCart","hasAvailableProducts","includedQuantityNumber","_props$data4","newCartLines","oldCartLines","newcl","newclIsUnique","scl","LineId","locationCookie","localStorage","getItem","JSON","parse","AddToCartComponent","msdyn365Commerce","createComponentOverride","component","BaseStoreSelectorStateManager","listMapViewState","displayList","displayMap","preferredStoreLocalStorageKey","isMapModuleLoaded","value","_readFromToCookie","storeInfo","preferredStore","_unused","_context","storeId","selectedStoreLocationId","storeName","writeToCookie","arguments","StoreName","_writeToCookie","stringify","latitude","longitude","lastInlineShownStoreInfo","_removeCookie","key","removeItem","setItem","cookieValue","__decorate","computed","observable","MapStoreSelectorStateManager","SERVICE_ENDPOINT","MAP_API_ENDPOINT","searchTerm","BingMapsApiKey","BingMapsEnabled","searchContent","jsonp","crypto","getRandomValues","Uint32Array","ChannelCountryRegionISOCode","trim","query","encodeURI","geolocationApiUrl","requestUrl","resolve","script","document","createElement","setAttribute","remove","resourceSets","resources","point","coordinates","body","appendChild","_document","StringExtensions","isNullOrEmpty","getElementById","url","lang","market","reject","_document2","_document3","type","defer","src","mapAPIReady","isMapApiLoaded","addEventListener","onLocationSelected","storeSelectorStateManager","storeSelectorStateDataAction","GenericInput","getDeliveryOptionsForSelectedVariant","GetDeliveryOptionsForSelectedVariantInput","locations","getOrgUnitLocationsByArea","GetOrgUnitLocationsByAreaInput","_locations$0$OrgUnitA","openDialog","parentElementRef","amountSelected","isStockedProuct","warning","OrgUnitAvailability","OrgUnitLocation","defaultDeliveryOption","urlTokens","pageType","itemId","fullImagePath","imageUrl","test","imageComponents","decodeURIComponent","split","imageUrlRebuilt","baseImageUrl","encodeURIComponent"],"sourceRoot":""}