{"version":3,"sources":["webpack:///src/data-actions/get-cart-state-data-action.ts?3f39","webpack:///src/cart-state/get-or-create-active-cart.ts?391f","webpack:///src/cart-state/remove-promo-codes.ts?a45c","webpack:///src/cart-state/index.ts?1d80","webpack:///src/cart-state/update-loyalty-card-id.ts?dcdd","webpack:///src/cart-state/add-product-to-cart.ts?9729","webpack:///src/cart-state/remove-all-promo-codes.ts?16d0","webpack:///src/data-actions/cart-state-data-action.ts?e4d5","webpack:///src/data-actions/get-checkout-cart.ts?eb35","webpack:///src/global-state/i-global-state.ts?b148","webpack:///src/global-state/index.ts?bbfe","webpack:///src/cart-state/update-cart-line-delivery-specifications.ts?4cfe","webpack:///src/checkout-state/base-checkout-cart-state.ts?ce87","webpack:///src/cart-state/update-cart.ts?d205","webpack:///src/data-actions/get-checkout-state.ts?9ed7","webpack:///src/data-actions/global-state-data-action.ts?31c0","webpack:///src/cart-state/remove-cart-lines.ts?06bb","webpack:///src/cart-state/update-shipping-address.ts?d0ba","webpack:///src/cart-state/update-cart-lines.ts?8f5b","webpack:///src/checkout-state/index.ts?c692","webpack:///src/data-actions/checkout-state-data-action.ts?7dbc","webpack:///src/cart-state/clear-cart-lines-delivery-information.ts?6ad7","webpack:///src/checkout-state/checkout-state-storage.ts?2803","webpack:///src/checkout-state/base-checkout-state.ts?d0a0","webpack:///src/cart-state/base-cart-state.ts?5fc2","webpack:///src/cart-state/add-invoices-to-cart.ts?7bff","webpack:///src/cart-state/add-order-invoice-to-cart.ts?73f5","webpack:///src/cart-state/update-receipt-email.ts?9092","webpack:///src/cart-state/refresh-cart.ts?1dbd","webpack:///src/global-state/global-state.ts?3fc0","webpack:///src/cart-state/add-promo-code.ts?bcd2","webpack:///src/cart-state/set-invoice-line-price.ts?a0a5","webpack:///src/cart-state/clear-cart-line-delivery-mode.ts?8016","webpack:///src/state-interfaces/index.ts?fd96","webpack:///src/data-actions/get-cart-state.ts?6577","webpack:///src/index.ts?c6ae","webpack:///src/state-interfaces/checkout-state-enums.ts?90d5","webpack:///src/cart-state/update-cart-line-quantity.ts?ba37"],"names":["GetCartStateDataInput","constructor","apiSettings","requestContext","getCacheKey","_this$catalogId","this","channelId","catalogId","getCacheObjectType","dataCacheType","getCatalogId","async","getCartStateData","input","ctx","cartState","getCartState","undefined","cart","Id","createObservableDataAction","id","action","inputData","CartTokenPrefix","getOrCreateActiveCart","cartCookieParts","cookies","getCartCookie","split","readCart","readCartId","isAuthenticated","user","length","Auth","Anon","readAsync","callerContext","bypassCache","setCartCookie","error","handleItemDiscontinuedException","telemetry","exception","getCartFromCookie","wasReadFromCookie","authCarts","searchAsync","queryResultSettings","Paging","Top","Skip","Sorting","Columns","ColumnName","IsDescending","IncludeAnonymous","CartTypeValue","searchCarts","getCartFromCustomer","anonCart","currentCart","anonCurrentCart","newCart","cartId","claimAuthCart","updateAsync","Error","claimCart","mergedCart","sourceCart","destinationCart","updatedCart","cartLines","cartLinesToDelete","hasShippingMethod","channelConfiguration","channel","featureNames","Version","CartLines","cartline","newCartLine","IsGiftCardLine","buildGiftCardLine","_featureStates$find","featureStates","getFeatureStatesAsync","find","featureState","Name","IsEnabled","_channelDeliveryOptio","channelDeliveryOptionConfig","getChannelDeliveryOptionConfigurationAsync","DeliveryMode","PickupDeliveryModeCodes","deliveryMode","FulfillmentStoreId","ShippingAddress","WarehouseId","isEmpty","PickupDeliveryModeCode","ProductId","Quantity","ExtensionProperties","Description","ReasonCodeLines","AttributeValues","CatalogId","EntryMethodTypeValue","ItemId","UnitOfMeasureSymbol","IsPriceKeyedIn","Price","push","_objectSpread","LineId","addCartLinesAsync","removeCartLinesAsync","Coupons","coupons","map","coupon","Code","addCouponsAsync","addCartLines","claimAnonCart","createNewCart","LoyaltyCardId","card","getCustomerLoyaltyCardsAsync","CardNumber","errorObj","response","name","information","createCartAsync","NetPrice","GiftCardBalance","TrackingId","removePromoCodes","promoCodes","actionContext","removeDiscountCodesAsync","then","status","catch","warning","errorDetails","LocalizedMessage","message","substatus","updateLoyaltyCardId","newLoyaltyCardId","debug","getQuantityLimit","maxQuantityForCartLineItem","inputItem","quantityLimit","shouldEnableStockCheck","availableQuantity","Math","min","getElementIndex","lines","cartLineToAdd","elementFoundAt","productIdToFind","index","line","entries","addProductsToCartWithoutSiteSettings","newCartLines","_cartLine$Quantity","cartLine","addCartLinesResult","_error$data3","trace","validationResults","data","ValidationResults","addProductsToCartInternal","addProductToCartInternal","orderQuantityLimitsFeatureIsEnabled","enableStockCheck","isAddServiceItemToCart","isMaxByQuantityValidationFeatureDefined","shouldSkipSiteSettings","i","_cart$CartLines","_error$data","IsInvoiceLine","addProductsToCartValidateMaxAgainstDefaultOrderSettings","app","config","cartActionResult","_cart$CartLines2","_error$data2","addProductsToCartValidateMaxAgainstSiteSettings","removeAllPromoCodes","createGlobalStateDataAction","BaseCartState","GetCheckoutCartInput","getCheckoutCartDataAction","getCheckoutCartCookie","checkoutCartId","checkoutCart","Promise","resolve","copyAsync","setCheckoutCartCookie","createGlobalState","ctor","updateCartLineDeliverySpecificationsInternal","cartLineDeliverySpecifications","updateLineDeliverySpecificationsAsync","BaseCheckoutCartState","isInitialized","getCheckoutCart","_cart","_status","updateCart","updatedCartObject","getCheckoutState","checkoutStateDataAction","GlobalStateInput","BaseCheckoutState","key","stateConstructor","getState","globalStateObject","initialize","args","removeCartLinesInternal","cartLineIds","Array","isArray","updateShippingAddress","shippingAddress","CartsDataActions","updateCartLinesInternal","cartLinesToUpdate","updateCartLinesAsync","clearCartLinesDeliveryInformation","_actionContext$reques","_actionContext$reques2","matchingLines","pickupDeliveryModeCode","emailDeliveryModeCode","EmailDeliveryModeCode","filter","dM","copiedLines","_cloneDeep","forEach","CheckoutStorageKey","GlobalState","super","_giftCardExtends","_loyaltyAmount","_guestCheckoutEmail","_customerAccountAmount","_emailAddressFromExpressCheckout","_checkoutGenericData","_checkoutCart","_attributeValues","_extensionProperties","_shouldEnableSinglePaymentAuthorizationCheckout","shouldEnableSinglePaymentAuthorizationCheckout","_shouldEnableCheckoutErrorDisplayMessaging","shouldEnableCheckoutErrorDisplayMessaging","_salesOrder","_orderedProducts","_tokenizedPaymentCard","_tenderLine","_billingAddress","_isBillingAddressSameAsShippingAddress","_shippingAddress","_hasShippingAddress","_hasCartDeliveryMode","_cardPrefix","_paymentTenderType","giftCardExtends","_loyaltyCardNumber","_hasGuestCheckoutEmail","_isTermsAndConditionAccepted","_isTermsAndConditionChecked","_shouldCollapsePaymentSection","_shouldTriggerPaymentWithPlaceOrder","_isPaymentSectionContainerReady","_cardPaymentAcceptResult","_isPaymentSectionContainerHasError","_redirectAdditionalContext","_redirectPaymentConnectorId","_checkoutErrorPaymentConnectorId","_isPlaceOrderEnabledInRedirection","_isPaymentVerificationRequired","_isCheckoutCallFailed","_shouldEnableExpressCheckoutInCheckout","_shouldEnableExpressCheckoutInCart","_shippingAddressFromExpressCheckout","_billingAddressFromExpressCheckout","_isExpressCheckoutApplied","_isExpressAddressApplied","_isExpressCheckoutAppliedInCartPage","_isExpressPaymentModulesReady","requestFormData","query","pv","redirectResult","_checkoutError","_isBillingAddressHasError","_checkoutErrorFocus","_shouldFocusOnCheckoutError","updateSalesOrder","newSalesOrder","newOrderedProducts","newAttributeValues","newExtensionProperties","updateTokenizedPaymentCard","newTokenizedPaymentCard","updateTenderLine","newTenderLine","newShippingAddress","newHasShippingAddress","newHasCartDeliveryMode","newIsTermsAndConditionAccepted","newIsTermsAndConditionChecked","newShouldCollapsePaymentSection","newShouldTriggerPaymentWithPlaceOrder","newIsPaymentSectionContainerReady","newCardPaymentAcceptResult","newIsPaymentSectionContainerHasError","newRedirectAdditionalContext","newRedirectPaymentConnectorId","newCheckoutErrorPaymentConnectorId","newIsCheckoutCallFailed","newIsPlaceOrderEnabledInRedirection","newIsPaymentVerificationRequired","updateBillingAddress","_input$additionalProp","newBillingAddress","additionalProperties","isBillingAddressSameAsShippingAddress","removeBillingAddress","updatePaymentTenderType","newPaymentTenderType","updateCardPrefix","newCardPrefix","removeGiftCard","giftCard","giftCardNumber","removeGiftCardExtend","addGiftCard","Pin","ExpirationDate","TenderTypeId","gitCardExtend","addGiftCardExtend","updateLoyaltyCardNumber","newLoyaltyCardNumber","updateLoyaltyAmount","Number","newAmount","toFixed","newGuestCheckoutEmail","ReceiptEmail","updateReceiptEmail","newEmail","updateCartLines","updatedCartLinesObject","newHasGuestCheckoutEmail","removeCheckoutCartId","removeCheckoutCartCookie","saveDataInStorage","sessionStorage","billingAddress","setCheckoutCartData","BillingAddress","GiftCard","loyaltyCardNumber","LoyaltyCardNumber","loyaltyAmount","LoyaltyAmount","isTermsAndConditionAccepted","TermsAndCondition","paymentTenderType","window","setItem","PaymentTenderType","redirectPaymentConnectorId","RedirectPaymentConnectorId","isExpressCheckoutApplied","IsExpressCheckoutApplied","toString","filtered","Object","keys","reduce","filteredData","SaveDataBeforeRedirect","CheckoutGenericData","checkoutGenericData","updateCustomerAccountAmount","newBillingAddressFromExpressCheckout","newShippingAddressFromExpressCheckout","newEmailAddressFromExpressCheckout","newShouldEnableExpressCheckoutInCheckout","newShouldEnableExpressCheckoutInCart","newIsExpressCheckoutApplied","newIsExpressAddressApplied","newIsExpressCheckoutAppliedInCartPage","newIsBillingAddressHasError","newIsExpressPaymentModulesReady","newCheckoutError","setCheckoutGenericData","getCheckoutGenericData","newCheckoutErrorFocus","newShouldFocusOnCheckoutError","setInitialData","cleanCheckoutData","removeCheckoutCartData","isPaymentVerificationRedirection","_window$sessionStorag","getCheckoutCartData","get","getItem","__decorate","observable","computed","_isProductAddedToCart","total","num","some","_doAsyncAction","refreshCartInternal","_input$catalogId","_input$product$Behavi","product","RecordId","count","DefaultUnitOfMeasure","isPriceKeyedIn","IsGiftCard","customPrice","location","retailMultiplePickupModeEnabled","OrgUnitNumber","InventoryLocationId","_buildAddressFromOrgUnitLocation","isAddEmailDeliveryItemToCart","ItemTypeValue","ReleasedProductType","Service","Behavior","MaximumQuantity","_doCartOperationWithRetry","internalInput","_inputItem$catalogId","_this$actionContext$r","PRODUCTASSERVICE","isStockCheckEnabled","invoiceIds","addInvoicesAsync","addInvoicesToCartInternal","invoiceId","lineDescription","addOrderInvoiceAsync","addOrderInvoiceToCartInternal","setInvoiceLinePriceInternal","cartLineId","price","removeCartLineInternal","clearCartLineDeliveryModeInternal","channelDeliveryOptionConfiguration","cartLineDeliverySpecification","DeliverySpecification","DeliveryModeId","DeliveryPreferenceTypeValue","PickUpStoreId","DeliveryAddress","lineDeliverySpecifications","deliveryModeId","trim","cartLinesForShipping","_input$channelDeliver","deliverySpecifications","_input$additionalProp2","updateCartLineQuantityInternal","newQuantity","isUsingDefaultOrderSettingsMax","updateLoyaltyCardIdInternal","addPromoCode","addPromoCodeInternal","promoCode","removePromoCodesInternal","removeAllPromoCodesInternal","email","newCartObject","callback","callbackResult","refreshCart","PostalAddressId","OrgUnitName","FullAddress","Address","Street","StreetNumber","City","DistrictName","BuildingCompliment","Postbox","ThreeLetterISORegionName","Country","ZipCode","Zip","County","CountyName","State","StateName","lambda","result","console","log","reject","hasPromoCode","addDiscountCodeAsync","code","toLowerCase","includes","setInvoiceLinePriceAsync","errorInstance","clearCartLineDeliveryMode","copyCartLine","InventLocation","cartStateDataAction","ErrorCode","ErrorMessageResource","ErrorLocation","CheckoutModule","updateCartLineQuantityValidateMaxAgainstDefaultOrderSettings","updateCartLineQuantityValidateMaxAgainstSiteSettings"],"mappings":"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","file":"static/js/4.bc469b2eeef14a059974.chunk.js","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n ICommerceApiSettings,\n ICreateActionContext,\n IRequestContext\n} from '@msdyn365-commerce/core';\nimport { Cart } from '@msdyn365-commerce/retail-proxy';\n\nimport { ICartState } from '../state-interfaces';\nimport { getCartState } from './get-cart-state';\n\n/**\n * Input class for getCart data action.\n */\nexport class GetCartStateDataInput implements IActionInput {\n private readonly apiSettings: ICommerceApiSettings;\n\n private readonly catalogId?: number;\n\n constructor(apiSettings: ICommerceApiSettings, requestContext?: IRequestContext) {\n this.apiSettings = apiSettings;\n if (requestContext) {\n this.catalogId = getCatalogId(requestContext);\n }\n }\n\n public getCacheKey = () => `GetCart-ChannelId:${this.apiSettings.channelId}-CatalogId:${this.catalogId ?? 0}`;\n\n public getCacheObjectType = () => 'Cart';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\nconst createInput = (inputData: ICreateActionContext) => {\n return new GetCartStateDataInput(inputData.requestContext.apiSettings, inputData.requestContext);\n};\n\n/**\n * Data action to copy the cart for actions.\n * @param input\n * @param ctx\n */\nexport async function getCartStateData(input: GetCartStateDataInput, ctx: IActionContext): Promise {\n const cartState = await getCartState(ctx);\n if (cartState && cartState.cart.Id !== undefined) {\n return cartState;\n }\n\n return undefined;\n}\n\nexport default createObservableDataAction({\n id: '@msdyn365-commerce/global-state/get-cart-state-data',\n action: >getCartStateData,\n input: createInput\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { FeatureState } from '@msdyn365-commerce/retail-proxy';\nimport {\n addCartLinesAsync,\n addCouponsAsync,\n createCartAsync,\n readAsync,\n removeCartLinesAsync,\n searchAsync,\n updateAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport {\n getChannelDeliveryOptionConfigurationAsync,\n getCustomerLoyaltyCardsAsync,\n getFeatureStatesAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\nimport {\n Cart,\n CartLine,\n CartSearchCriteria,\n Coupon,\n QueryResultSettings\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport isEmpty from 'lodash/isEmpty';\n\nenum CartTokenPrefix {\n Auth = 't',\n Anon = 'p'\n}\n\nexport default async function getOrCreateActiveCart(ctx: IActionContext): Promise {\n let cart: Cart | undefined;\n const cartCookie: string = ctx.requestContext.cookies.getCartCookie();\n const cartCookieParts: string[] = cartCookie.split(':');\n try {\n // Check if there are already is a cart cookie and it is in the format we understand\n cart = await getCartFromCookie(cartCookieParts, ctx);\n const wasReadFromCookie = !!cart && cart.Id;\n\n // If the customer is authenticated, and the auth cookie didn't give us a cart OR doesn't have a cookie, search for the customer's cart\n if (!(cart && cart.Id)) {\n cart = await getCartFromCustomer(ctx);\n }\n\n // If the customer just went from anon to signed in state then get that anon cart\n // if the search of carts didn't result in a cart, claim the current anon cart as a new auth cart for the customer\n // if the search resulted in a cart, and the read also resulted in cart, then go ahead an merge the carts\n const anonCart = await claimAnonCart(cartCookieParts, cart, ctx);\n if (anonCart) {\n cart = anonCart;\n }\n\n // If there is no cookie or everything else fails, create an empty cart and return that for the customer\n if (!(cart && cart.Id)) {\n cart = await createNewCart(ctx);\n }\n if (!wasReadFromCookie && ctx.requestContext.user.isAuthenticated && cart && !cart.LoyaltyCardId) {\n const card = await getCustomerLoyaltyCardsAsync({ callerContext: ctx, queryResultSettings: {} }, null);\n if (card && card.length > 0) {\n cart = await updateAsync(\n { callerContext: ctx },\n {\n Id: cart.Id,\n LoyaltyCardId: card[0].CardNumber\n }\n );\n }\n }\n } catch (error) {\n ctx.telemetry.error(`Caught exception in getting cart: ${error}`);\n cart = await createNewCart(ctx);\n }\n return cart;\n}\n\n/**\n * Function to check cart exception due to product no available\n *\n * @param ctx Request context.\n * @param errorObj Error Object.\n */\nfunction handleItemDiscontinuedException(ctx: IActionContext, errorObj: object): boolean {\n const error = errorObj as Error;\n let response = false;\n if (error && error.name === 'Microsoft_Dynamics_Commerce_Runtime_ItemDiscontinuedFromChannel') {\n ctx.telemetry.information('Caught cart ItemDiscontinuedException error.');\n response = true;\n }\n\n return response;\n}\n\nexport async function createNewCart(ctx: IActionContext): Promise {\n const newCart = await createCartAsync({ callerContext: ctx }, {});\n if (newCart && newCart.Id) {\n ctx.requestContext.cookies.setCartCookie(newCart, ctx.requestContext.user.isAuthenticated);\n\n return newCart;\n }\n\n return undefined;\n}\n\nexport async function getCartFromCookie(cartCookieParts: string[], ctx: IActionContext): Promise {\n let readCart: Cart | undefined;\n let readCartId: string = '';\n\n const isAuthenticated = ctx.requestContext.user.isAuthenticated;\n if (cartCookieParts && cartCookieParts.length === 2) {\n // If the customer is authenticated and they have an auth cookie\n // OR if the customer is not authenticated and then have an anon cookie\n // just get the cart and return that\n\n if (\n (isAuthenticated && cartCookieParts[0] === CartTokenPrefix.Auth) ||\n (!isAuthenticated && cartCookieParts[0] === CartTokenPrefix.Anon)\n ) {\n try {\n readCartId = cartCookieParts[1];\n const readCart = await readAsync({ callerContext: ctx, bypassCache: 'none' }, cartCookieParts[1]);\n\n if (readCart && readCart.Id) {\n ctx.requestContext.cookies.setCartCookie(readCart, ctx.requestContext.user.isAuthenticated);\n return readCart;\n }\n } catch (error) {\n if (handleItemDiscontinuedException(ctx, error)) {\n readCart = await readAsync({ callerContext: ctx, bypassCache: 'none' }, readCartId);\n }\n ctx.telemetry.error('Error getting cart based on saved card id');\n ctx.telemetry.exception(error);\n }\n }\n }\n\n return readCart;\n}\n\nexport async function getCartFromCustomer(ctx: IActionContext): Promise {\n if (ctx.requestContext.user.isAuthenticated) {\n const authCarts = await searchCarts(ctx);\n if (authCarts && authCarts.length > 0) {\n ctx.requestContext.cookies.setCartCookie(authCarts[0], ctx.requestContext.user.isAuthenticated);\n return authCarts[0];\n }\n }\n\n return undefined;\n}\n\nexport async function claimAnonCart(\n cartCookieParts: string[],\n currentCart: Cart | undefined,\n ctx: IActionContext\n): Promise {\n let anonCurrentCart: Cart | undefined;\n\n if (\n ctx.requestContext.user.isAuthenticated &&\n cartCookieParts &&\n cartCookieParts.length === 2 &&\n cartCookieParts[0] === CartTokenPrefix.Anon\n ) {\n try {\n anonCurrentCart = await readAsync({ callerContext: ctx, bypassCache: 'none' }, cartCookieParts[1]);\n } catch (error) {\n if (handleItemDiscontinuedException(ctx, error)) {\n anonCurrentCart = await readAsync({ callerContext: ctx, bypassCache: 'none' }, cartCookieParts[1]);\n }\n }\n\n if (anonCurrentCart && !currentCart) {\n const newCart = await claimCart(anonCurrentCart.Id, ctx);\n if (newCart && newCart.Id) {\n ctx.requestContext.cookies.setCartCookie(newCart, ctx.requestContext.user.isAuthenticated);\n return newCart;\n }\n }\n\n if (anonCurrentCart && anonCurrentCart.Id && currentCart) {\n const mergedCart = await addCartLines(anonCurrentCart, currentCart, ctx);\n\n // Once updated, take that merged cart ID and store the cart ID in the cookie\n if (!(mergedCart instanceof Error) && mergedCart.Id) {\n ctx.requestContext.cookies.setCartCookie(mergedCart, ctx.requestContext.user.isAuthenticated);\n return mergedCart;\n }\n }\n }\n\n return undefined;\n}\n\n/**\n * Function that copies a cartline for giftcard.\n * @param cartline Source CartLine you want to copy.\n */\nfunction buildGiftCardLine(cartline: CartLine): CartLine {\n return {\n DeliveryMode: cartline.DeliveryMode,\n CatalogId: cartline.CatalogId,\n Description: cartline.Description,\n EntryMethodTypeValue: cartline.EntryMethodTypeValue || 3,\n ItemId: cartline.ItemId,\n ProductId: cartline.ProductId,\n Quantity: cartline.Quantity,\n Price: cartline.Price,\n NetPrice: cartline.NetPrice,\n GiftCardBalance: cartline.GiftCardBalance,\n TrackingId: '',\n UnitOfMeasureSymbol: cartline.UnitOfMeasureSymbol,\n IsPriceKeyedIn: true,\n IsGiftCardLine: true,\n ExtensionProperties: cartline.ExtensionProperties\n };\n}\n\n/**\n * Function that adds cart lines from source cart to destination cart.\n * @param sourceCart Source cart you want to add cart lines from.\n * @param destinationCart Destination cart that you want to add cart lines to.\n * @param ctx Request context.\n */\nexport async function addCartLines(sourceCart: Cart, destinationCart: Cart, ctx: IActionContext): Promise {\n let updatedCart;\n const cartLines: CartLine[] = [];\n const cartLinesToDelete: string[] = [];\n let hasShippingMethod: boolean;\n const channelConfiguration = ctx.requestContext.channel;\n const featureNames: string[] = [\n 'Dynamics.AX.Application.RetailB2BEcommerceFeature',\n 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature',\n 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n ];\n if (destinationCart.Version) {\n if (sourceCart.CartLines && sourceCart.CartLines.length > 0) {\n for (const cartline of sourceCart.CartLines) {\n let newCartLine: CartLine;\n\n if (cartline.IsGiftCardLine) {\n newCartLine = buildGiftCardLine(cartline);\n } else {\n newCartLine = {};\n const featureStates = await getFeatureStatesAsync({ callerContext: ctx }, featureNames);\n const isfeatureStatesEnabled =\n featureStates?.find(\n (featureState: FeatureState) =>\n featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n )?.IsEnabled || false;\n if (isfeatureStatesEnabled) {\n const channelDeliveryOptionConfig = await getChannelDeliveryOptionConfigurationAsync({ callerContext: ctx });\n hasShippingMethod =\n cartline.DeliveryMode ===\n channelDeliveryOptionConfig.PickupDeliveryModeCodes?.find(\n (deliveryMode: string) => deliveryMode === cartline.DeliveryMode\n );\n\n if (cartline.DeliveryMode !== undefined && hasShippingMethod) {\n newCartLine.DeliveryMode = cartline.DeliveryMode;\n newCartLine.FulfillmentStoreId = cartline.FulfillmentStoreId;\n newCartLine.ShippingAddress = cartline.ShippingAddress;\n newCartLine.WarehouseId = cartline.WarehouseId;\n }\n } else if (!isEmpty(cartline.DeliveryMode) && cartline.DeliveryMode === channelConfiguration?.PickupDeliveryModeCode) {\n newCartLine.DeliveryMode = channelConfiguration?.PickupDeliveryModeCode;\n newCartLine.FulfillmentStoreId = cartline.FulfillmentStoreId;\n newCartLine.ShippingAddress = cartline.ShippingAddress;\n newCartLine.WarehouseId = cartline.WarehouseId;\n }\n newCartLine.ProductId = cartline.ProductId;\n newCartLine.Quantity = cartline.Quantity;\n newCartLine.ExtensionProperties = cartline.ExtensionProperties;\n newCartLine.Description = cartline.Description;\n newCartLine.ReasonCodeLines = cartline.ReasonCodeLines;\n newCartLine.AttributeValues = cartline.AttributeValues;\n newCartLine.CatalogId = cartline.CatalogId;\n newCartLine.EntryMethodTypeValue = cartline.EntryMethodTypeValue;\n newCartLine.ItemId = cartline.ItemId;\n\n // without unitofmeasure cartline wont be aggregated in customer cart.\n newCartLine.UnitOfMeasureSymbol = cartline.UnitOfMeasureSymbol;\n if (cartline.IsPriceKeyedIn) {\n newCartLine.Price = cartline.Price;\n newCartLine.IsPriceKeyedIn = cartline.IsPriceKeyedIn;\n }\n }\n\n cartLines.push({ ...newCartLine });\n if (cartline.LineId) {\n cartLinesToDelete.push(cartline.LineId);\n }\n }\n }\n\n if (cartLines.length > 0) {\n try {\n updatedCart = await addCartLinesAsync({ callerContext: ctx }, destinationCart.Id, cartLines, destinationCart.Version);\n\n if (cartLinesToDelete.length > 0) {\n sourceCart = await removeCartLinesAsync({ callerContext: ctx }, sourceCart.Id, cartLinesToDelete);\n }\n } catch (error) {\n ctx.telemetry.error('Error adding cart lines to desination cart');\n ctx.telemetry.exception(error);\n return destinationCart;\n }\n }\n\n // Copy over coupon codes from source cart to destination cart so that the customer doesn't lose couponCodes while migration\n if (sourceCart.Coupons && sourceCart.Coupons.length > 0) {\n const coupons = sourceCart.Coupons.map((coupon: Coupon) => {\n return coupon.Code!;\n });\n\n try {\n updatedCart = await addCouponsAsync({ callerContext: ctx }, destinationCart.Id, coupons, false);\n } catch (error) {\n ctx.telemetry.error('Error adding existing coupon codes to the cart');\n ctx.telemetry.exception(error);\n return destinationCart;\n }\n }\n }\n\n return updatedCart || destinationCart;\n}\n\n/**\n * Function to claim a cart as auth cart and set the browser cookie accordingly.\n *\n * @param cartId Cart Id to claim as auth cart.\n * @param ctx Request Context.\n */\nexport async function claimCart(cartId: string, ctx: IActionContext): Promise {\n const claimAuthCart = await updateAsync(\n { callerContext: ctx },\n {\n Id: cartId\n }\n );\n if (!(claimAuthCart instanceof Error) && claimAuthCart && claimAuthCart.Id) {\n return claimAuthCart;\n }\n return {};\n}\n\n/**\n * Function to search carts that belong to a customer.\n *\n * @param ctx Request context.\n */\nexport async function searchCarts(ctx: IActionContext): Promise {\n const cartSearchCriteria: CartSearchCriteria = {\n IncludeAnonymous: false,\n CartTypeValue: 1\n };\n\n const queryResultSettings: QueryResultSettings = {\n Paging: {\n Top: 1,\n Skip: 0\n },\n Sorting: {\n Columns: [\n {\n ColumnName: 'ModifiedDateTime',\n IsDescending: true\n }\n ]\n }\n };\n\n return searchAsync({ callerContext: ctx, queryResultSettings }, cartSearchCriteria);\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { removeDiscountCodesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function removePromoCodes(\n cart: Readonly,\n promoCodes: string[],\n actionContext: IActionContext\n): Promise {\n if (!cart) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n return removeDiscountCodesAsync({ callerContext: actionContext }, cart.Id, promoCodes)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error.message } };\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nexport * from './add-product-to-cart';\nexport * from './add-promo-code';\nexport * from './base-cart-state';\nexport * from './cart-action-result';\nexport * from './clear-cart-line-delivery-mode';\nexport * from './clear-cart-lines-delivery-information';\nexport * from './get-or-create-active-cart';\nexport * from './refresh-cart';\nexport * from './remove-all-promo-codes';\nexport * from './remove-cart-lines';\nexport * from './remove-promo-codes';\nexport * from './set-invoice-line-price';\nexport * from './update-cart';\nexport * from './update-cart-line-delivery-specifications';\nexport * from './update-cart-line-quantity';\nexport * from './update-loyalty-card-id';\nexport * from './update-shipping-address';\nexport * from './update-cart-lines';\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { updateAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function updateLoyaltyCardId(\n cart: Readonly,\n newLoyaltyCardId: string,\n actionContext: IActionContext\n): Promise {\n if (!cart) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n return updateAsync(\n { callerContext: actionContext },\n {\n Id: cart.Id,\n LoyaltyCardId: newLoyaltyCardId\n }\n )\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to update loyalty card id');\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error.message } };\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { addCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart, CartLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\n/**\n * Get the quantity limit.\n * @param maxQuantityForCartLineItem - Max quantity for cart line.\n * @param inputItem - The input item.\n * @param inputItem.cartLineToAdd - Cart line to add.\n * @param inputItem.availableQuantity - Available quantity.\n * @param inputItem.shouldEnableStockCheck - Is stock check enabled.\n * @param inputItem.isAddServiceItemToCart - Is add service item to cart.\n * @returns The quantity limit.\n */\nfunction getQuantityLimit(\n maxQuantityForCartLineItem: number | undefined,\n inputItem: {\n cartLineToAdd: CartLine;\n availableQuantity?: number;\n shouldEnableStockCheck?: boolean;\n isAddServiceItemToCart?: boolean;\n }\n): number {\n let quantityLimit: number;\n const defaultSiteMaxQuantity = 10;\n\n if (inputItem.shouldEnableStockCheck === false) {\n quantityLimit = maxQuantityForCartLineItem ?? defaultSiteMaxQuantity;\n } else if (maxQuantityForCartLineItem === undefined && inputItem.availableQuantity === undefined) {\n quantityLimit = defaultSiteMaxQuantity;\n } else if (inputItem.availableQuantity === undefined) {\n quantityLimit = maxQuantityForCartLineItem ?? defaultSiteMaxQuantity;\n } else if (maxQuantityForCartLineItem === undefined) {\n quantityLimit = inputItem.availableQuantity;\n } else {\n quantityLimit = Math.min(maxQuantityForCartLineItem, inputItem.availableQuantity);\n }\n\n return quantityLimit;\n}\n\n/**\n * Get the index of the item to add.\n * @param lines - The cart lines.\n * @param cartLineToAdd - The cart line to add.\n * @returns The index of the item to add.\n */\nfunction getElementIndex(lines: CartLine[], cartLineToAdd: CartLine): number {\n let elementFoundAt: number = -1;\n const productIdToFind = cartLineToAdd.ProductId;\n\n for (const [index, line] of lines.entries()) {\n if (\n line.ProductId === productIdToFind &&\n (line.DeliveryMode || '') === (cartLineToAdd.DeliveryMode || '') &&\n (line.FulfillmentStoreId || '') === (cartLineToAdd.FulfillmentStoreId || '')\n ) {\n elementFoundAt = index;\n\n break;\n }\n }\n\n return elementFoundAt;\n}\n\nasync function addProductsToCartValidateMaxAgainstDefaultOrderSettings(\n cart: Readonly,\n actionContext: IActionContext,\n input: {\n cartLineToAdd: CartLine;\n availableQuantity?: number;\n enableStockCheck?: boolean;\n isAddServiceItemToCart?: boolean;\n }[]\n): Promise {\n if (!cart.CartLines) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n for (const inputItem of input) {\n if (inputItem.enableStockCheck && inputItem.availableQuantity) {\n let elementFoundAt: number = -1;\n const productIdToFind = inputItem.cartLineToAdd.ProductId;\n\n for (let i = 0; i < cart.CartLines.length; i++) {\n if (\n cart.CartLines[i].ProductId === productIdToFind &&\n (cart.CartLines[i].DeliveryMode || '') === (inputItem.cartLineToAdd.DeliveryMode || '') &&\n (cart.CartLines[i].FulfillmentStoreId || '') === (inputItem.cartLineToAdd.FulfillmentStoreId || '')\n ) {\n elementFoundAt = i;\n\n break;\n }\n }\n\n if (!inputItem.isAddServiceItemToCart && elementFoundAt !== -1) {\n const cartLineToUpdate = { ...cart.CartLines[elementFoundAt] };\n const curQuantity = cartLineToUpdate.Quantity || 0;\n\n if (curQuantity + (inputItem.cartLineToAdd.Quantity || 1) > inputItem.availableQuantity) {\n return {\n cart: {\n Id: cart.Id,\n CartLines: cart.CartLines\n },\n status: 'FAILED',\n substatus: 'MAXQUANTITY'\n };\n }\n }\n }\n }\n\n const newCartLines = input.map(inputItem => {\n const cartLine = { ...inputItem.cartLineToAdd };\n return cartLine;\n });\n let addCartLinesResult: ICartActionResultWithCart;\n\n if (cart.Version) {\n return addCartLinesAsync({ callerContext: actionContext }, cart.Id, newCartLines, cart.Version)\n .then(newCart => {\n addCartLinesResult = { cart: newCart, status: 'SUCCESS', substatus: 'PRODUCTADDED' };\n return addCartLinesResult;\n })\n .catch(error => {\n actionContext.telemetry.trace(error);\n actionContext.telemetry.trace('Unable to add Cart Line');\n\n if (\n error.name === 'Microsoft_Dynamics_Commerce_Runtime_AddingItem_ExceedsMaximumQuantity' ||\n error.name === 'Microsoft_Dynamics_Commerce_Runtime_UpdatingItem_ExceedsMaximumQuantity'\n ) {\n addCartLinesResult = {\n cart: undefined,\n status: 'FAILED',\n substatus: 'QUANTITYLIMITS',\n errorDetails: { LocalizedMessage: error.message }\n };\n return addCartLinesResult;\n }\n\n const hasInvoiceInCart = cart.CartLines?.find(cartline => cartline.IsInvoiceLine === true);\n if (hasInvoiceInCart) {\n addCartLinesResult = {\n cart: undefined,\n status: 'FAILED',\n substatus: 'INVOICEINCART',\n errorDetails: { LocalizedMessage: error.message }\n };\n return addCartLinesResult;\n }\n\n addCartLinesResult = {\n cart: undefined,\n status: 'FAILED',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n errorDetails: { LocalizedMessage: error.message },\n validationResults: error.data?.ValidationResults\n };\n\n return addCartLinesResult;\n });\n }\n actionContext.telemetry.warning('Unable to update Cart Line, Cart Version could not be found');\n\n addCartLinesResult = { cart: undefined, status: 'FAILED', substatus: 'NOCARTVERSION' };\n return addCartLinesResult;\n}\n\nasync function addProductsToCartValidateMaxAgainstSiteSettings(\n cart: Readonly,\n actionContext: IActionContext,\n input: {\n cartLineToAdd: CartLine;\n availableQuantity?: number;\n enableStockCheck?: boolean;\n isAddServiceItemToCart?: boolean;\n }[]\n): Promise {\n if (!cart.CartLines) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n const maxQuantityForCartLineItem: number | undefined = actionContext.requestContext.app.config.maxQuantityForCartLineItem;\n\n for (const inputItem of input) {\n const quantityLimit: number = getQuantityLimit(maxQuantityForCartLineItem, {\n cartLineToAdd: inputItem.cartLineToAdd,\n availableQuantity: inputItem.availableQuantity,\n shouldEnableStockCheck: inputItem.enableStockCheck,\n isAddServiceItemToCart: inputItem.isAddServiceItemToCart\n });\n const elementFoundAt: number = getElementIndex(cart.CartLines, inputItem.cartLineToAdd);\n\n if (!inputItem.isAddServiceItemToCart && elementFoundAt !== -1) {\n const cartLineToUpdate = { ...cart.CartLines[elementFoundAt] };\n const currentQuantity = cartLineToUpdate.Quantity || 0;\n\n if (currentQuantity + (inputItem.cartLineToAdd.Quantity || 1) > quantityLimit) {\n return {\n cart: {\n Id: cart.Id,\n CartLines: cart.CartLines\n },\n status: 'FAILED',\n substatus: 'MAXQUANTITY'\n };\n }\n }\n\n if (\n !inputItem.isAddServiceItemToCart &&\n inputItem.cartLineToAdd &&\n inputItem.cartLineToAdd.Quantity &&\n inputItem.cartLineToAdd.Quantity > quantityLimit\n ) {\n return {\n cart: {\n Id: cart.Id,\n CartLines: cart.CartLines\n },\n status: 'FAILED',\n substatus: 'MAXQUANTITY'\n };\n }\n }\n\n const newCartLines = input.map(inputItem => {\n const cartLine = { ...inputItem.cartLineToAdd };\n cartLine.Quantity = cartLine.Quantity || 1;\n return cartLine;\n });\n let cartActionResult: ICartActionResultWithCart;\n\n if (cart.Version) {\n return addCartLinesAsync({ callerContext: actionContext }, cart.Id, newCartLines, cart.Version)\n .then(newCart => {\n cartActionResult = { cart: newCart, status: 'SUCCESS', substatus: 'PRODUCTADDED' };\n return cartActionResult;\n })\n .catch(error => {\n actionContext.telemetry.trace(error);\n actionContext.telemetry.trace('Unable to add Cart Line');\n\n const hasInvoiceInCart = cart.CartLines?.find(cartline => cartline.IsInvoiceLine === true);\n if (hasInvoiceInCart) {\n cartActionResult = {\n cart: undefined,\n status: 'FAILED',\n substatus: 'INVOICEINCART',\n errorDetails: { LocalizedMessage: error.message }\n };\n return cartActionResult;\n }\n\n cartActionResult = {\n cart: undefined,\n status: 'FAILED',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n errorDetails: { LocalizedMessage: error.message },\n validationResults: error.data?.ValidationResults\n };\n return cartActionResult;\n });\n }\n actionContext.telemetry.warning('Unable to update Cart Line, Cart Version could not be found');\n\n cartActionResult = { cart: undefined, status: 'FAILED', substatus: 'NOCARTVERSION' };\n return cartActionResult;\n}\n\n/**\n * Add products to cart without site settings validation.\n * @param cart - The cart.\n * @param actionContext - The action context.\n * @param input - The cart lines to add.\n * @returns The results.\n */\nasync function addProductsToCartWithoutSiteSettings(\n cart: Readonly,\n actionContext: IActionContext,\n input: {\n cartLineToAdd: CartLine;\n }[]\n): Promise {\n if (!cart.CartLines) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n const defaultQuantity = 1;\n const newCartLines = input.map(inputItem => {\n const cartLine = { ...inputItem.cartLineToAdd };\n cartLine.Quantity = cartLine.Quantity ?? defaultQuantity;\n return cartLine;\n });\n let addCartLinesResult: ICartActionResultWithCart;\n\n if (cart.Version) {\n return addCartLinesAsync({ callerContext: actionContext }, cart.Id, newCartLines, cart.Version)\n .then(newCart => {\n addCartLinesResult = { cart: newCart, status: 'SUCCESS', substatus: 'PRODUCTADDED' };\n return addCartLinesResult;\n })\n .catch(error => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument -- existing error type.\n actionContext.telemetry.trace(error);\n actionContext.telemetry.trace('Unable to add cart lines');\n\n addCartLinesResult = {\n cart: undefined,\n status: 'FAILED',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n errorDetails: { LocalizedMessage: error.message },\n validationResults: error.data?.ValidationResults\n };\n return addCartLinesResult;\n });\n }\n\n actionContext.telemetry.warning('Unable to update cart lines, cart version could not be found');\n\n addCartLinesResult = { cart: undefined, status: 'FAILED', substatus: 'NOCARTVERSION' };\n return addCartLinesResult;\n}\n\nexport async function addProductsToCartInternal(\n cart: Readonly,\n actionContext: IActionContext,\n input: {\n cartLineToAdd: CartLine;\n availableQuantity?: number;\n isStockCheckEnabled?: boolean;\n isAddServiceItemToCart?: boolean;\n }[]\n): Promise {\n return addProductsToCartWithoutSiteSettings(cart, actionContext, input);\n}\n\nexport async function addProductToCartInternal(\n cart: Readonly,\n cartLineToAdd: CartLine,\n actionContext: IActionContext,\n orderQuantityLimitsFeatureIsEnabled: boolean,\n availableQuantity?: number,\n enableStockCheck?: boolean,\n isAddServiceItemToCart?: boolean,\n isMaxByQuantityValidationFeatureDefined?: boolean,\n shouldSkipSiteSettings?: boolean\n): Promise {\n if (shouldSkipSiteSettings) {\n return addProductsToCartWithoutSiteSettings(cart, actionContext, [{ cartLineToAdd }]);\n }\n\n // Using max from the default order settings if it's defined there and quantity limits feature is enabled.\n // Otherwise use max from site settings or default max 10.\n if (isMaxByQuantityValidationFeatureDefined && orderQuantityLimitsFeatureIsEnabled) {\n return addProductsToCartValidateMaxAgainstDefaultOrderSettings(cart, actionContext, [\n { cartLineToAdd, availableQuantity, enableStockCheck, isAddServiceItemToCart }\n ]);\n }\n return addProductsToCartValidateMaxAgainstSiteSettings(cart, actionContext, [\n { cartLineToAdd, availableQuantity, enableStockCheck, isAddServiceItemToCart }\n ]);\n}\n\nexport default addProductToCartInternal;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { removeDiscountCodesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function removeAllPromoCodes(\n cart: Readonly,\n actionContext: IActionContext\n): Promise {\n if (!cart) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n if (cart.Coupons && cart.Coupons.length > 0) {\n const promoCodes = cart.Coupons.map(coupon => {\n return coupon.Code || '';\n });\n\n return removeDiscountCodesAsync({ callerContext: actionContext }, cart.Id, promoCodes)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error.message } };\n });\n }\n\n return { cart, status: 'SUCCESS' };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { BaseCartState } from '../cart-state/base-cart-state';\nimport { ICartState } from '../state-interfaces/i-cart-state';\nimport createGlobalStateDataAction from './global-state-data-action';\n\nexport default createGlobalStateDataAction('CARTSTATE', BaseCartState);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n ICommerceApiSettings,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport { Cart } from '@msdyn365-commerce/retail-proxy';\nimport { copyAsync, readAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\n\nimport { getCartState } from './get-cart-state';\n\n/**\n * Input class for getCheckoutCart data action.\n */\nexport class GetCheckoutCartInput implements IActionInput {\n private readonly apiSettings: ICommerceApiSettings;\n\n constructor(apiSettings: ICommerceApiSettings) {\n this.apiSettings = apiSettings;\n }\n\n public getCacheKey = () => `CheckoutCart-ChannelId:${this.apiSettings.channelId}-ApiSettingsCatalogId:${this.apiSettings.catalogId}`;\n\n public getCacheObjectType = () => 'CheckoutCart';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\nenum CartTokenPrefix {\n Auth = 't',\n Anon = 'p'\n}\n\nconst createInput = (inputData: ICreateActionContext) => {\n return new GetCheckoutCartInput(inputData.requestContext.apiSettings);\n};\n\n/**\n * Data action to copy the cart for checkout actions.\n * @param input\n * @param ctx\n */\nexport async function getCheckoutCart(input: GetCheckoutCartInput, ctx: IActionContext): Promise {\n const savedCheckoutCartId = ctx.requestContext.cookies.getCheckoutCartCookie();\n const cartCookieParts: string[] = savedCheckoutCartId.split(':');\n let checkoutCartId = null;\n const isAuthenticated = ctx.requestContext.user.isAuthenticated;\n\n if (\n (isAuthenticated && cartCookieParts[0] === CartTokenPrefix.Auth) ||\n (!isAuthenticated && cartCookieParts[0] === CartTokenPrefix.Anon)\n ) {\n checkoutCartId = cartCookieParts[1];\n }\n\n let checkoutCart: Cart | undefined;\n\n if (checkoutCartId) {\n try {\n checkoutCart = await readAsync({ callerContext: ctx, bypassCache: 'none' }, checkoutCartId);\n } catch (error) {\n ctx.telemetry.error('Error getting checkout cart based on saved checkout card id');\n ctx.telemetry.exception(error);\n }\n }\n\n const cartState = await getCartState(ctx);\n if (cartState && cartState.cart.Id !== undefined) {\n if (checkoutCart && checkoutCart.Version && cartState.cart.Version && checkoutCart.Version > cartState.cart.Version) {\n return Promise.resolve(checkoutCart);\n }\n\n return copyAsync({ callerContext: ctx }, cartState.cart.Id, 2)\n .then(cart => {\n ctx.requestContext.cookies.setCheckoutCartCookie(cart, isAuthenticated);\n return cart;\n })\n .catch(error => {\n ctx.telemetry.error('Error copying cart');\n ctx.telemetry.exception(error);\n return undefined;\n });\n }\n\n return undefined;\n}\n\nexport const getCheckoutCartDataAction = createObservableDataAction({\n id: '@msdyn365-commerce/global-state/get-checkout-cart',\n action: >getCheckoutCart,\n input: createInput\n});\n\nexport default getCheckoutCartDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\n\nexport declare type GlobalStateStatus = 'READY' | 'UPDATING' | 'ERROR';\n\nexport type GlobalStateConstructor = new (actionContext: IActionContext) => T;\n\nexport function createGlobalState(ctor: GlobalStateConstructor, actionContext: IActionContext): T {\n return new ctor(actionContext);\n}\n\nexport interface IGlobalState {\n readonly status: GlobalStateStatus;\n\n initialize(): Promise;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nexport * from './global-state';\nexport * from './i-action-result';\nexport * from './i-global-state';\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { updateLineDeliverySpecificationsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart, LineDeliverySpecification } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function updateCartLineDeliverySpecificationsInternal(\n cart: Readonly,\n cartLineDeliverySpecifications: LineDeliverySpecification[],\n actionContext: IActionContext\n): Promise {\n if (!cart || !cart.CartLines || cartLineDeliverySpecifications.length === 0) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n return updateLineDeliverySpecificationsAsync({ callerContext: actionContext }, cart.Id, cartLineDeliverySpecifications)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to updateLineDeliverySpecificationsAsync');\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error.message } };\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { BaseCartState } from '../cart-state/base-cart-state';\nimport getCheckoutCart, { GetCheckoutCartInput } from '../data-actions/get-checkout-cart';\n\n/**\n * Version of BaseCartState that uses the checkout cart.\n */\nexport class BaseCheckoutCartState extends BaseCartState {\n public async initialize(): Promise {\n if (this.isInitialized) {\n return;\n }\n\n const newCart = await getCheckoutCart(new GetCheckoutCartInput(this.actionContext.requestContext.apiSettings), this.actionContext);\n\n if (newCart) {\n this._cart = newCart;\n this._status = 'READY';\n } else {\n this._status = 'ERROR';\n }\n\n this.isInitialized = true;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { updateAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function updateCart(\n cart: Readonly,\n updatedCartObject: Cart,\n actionContext: IActionContext\n): Promise {\n if (!cart) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n return updateAsync({ callerContext: actionContext }, { ...updatedCartObject, Id: cart.Id })\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to update the cart');\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error.message } };\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AsyncResult, IActionContext } from '@msdyn365-commerce/core';\n\nimport { BaseCheckoutState } from '../checkout-state/base-checkout-state';\nimport { ICheckoutState } from '../state-interfaces/i-checkout-state';\nimport checkoutStateDataAction from './checkout-state-data-action';\nimport { GlobalStateInput } from './global-state-data-action';\n\nexport function getCheckoutState(ctx: IActionContext): AsyncResult {\n return checkoutStateDataAction(\n new GlobalStateInput('CHECKOUTSTATE', BaseCheckoutState, ctx.requestContext.apiSettings, ctx.requestContext),\n ctx\n );\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n ICommerceApiSettings,\n ICreateActionContext,\n IObservableAction,\n IRequestContext\n} from '@msdyn365-commerce/core';\n\nimport { createGlobalState, GlobalStateConstructor, IGlobalState } from '../global-state/i-global-state';\n\nexport declare type GlobalStateType = 'CARTSTATE' | 'CHECKOUTSTATE';\n\n/**\n * Shared class that handles global state inputs.\n */\nexport class GlobalStateInput implements IActionInput {\n public readonly stateConstructor: GlobalStateConstructor;\n\n public readonly key: GlobalStateType;\n\n public readonly catalogId?: number;\n\n private readonly apiSettings: ICommerceApiSettings;\n\n public constructor(\n key: GlobalStateType,\n stateConstructor: GlobalStateConstructor,\n apiSettings: ICommerceApiSettings,\n requestContext?: IRequestContext\n ) {\n this.apiSettings = apiSettings;\n this.stateConstructor = stateConstructor;\n this.key = key;\n\n if (requestContext) {\n this.catalogId = getCatalogId(requestContext);\n }\n }\n\n public getCacheKey = () => `Key:${this.key}-ChannelId:${this.apiSettings.channelId}-CatalogId:${this.catalogId ?? 0}`;\n\n public getCacheObjectType = () => this.key;\n\n public dataCacheType = (): CacheType => 'instance';\n}\n\nexport async function getState(input: GlobalStateInput, ctx: IActionContext): Promise {\n const globalStateObject = createGlobalState(input.stateConstructor, ctx);\n\n await globalStateObject.initialize();\n\n return globalStateObject;\n}\n\nexport default function createGlobalStateDataAction(\n key: GlobalStateType,\n stateConstructor: GlobalStateConstructor\n): IObservableAction {\n return createObservableDataAction({\n action: >getState,\n input: (args: ICreateActionContext) => {\n return new GlobalStateInput(key, stateConstructor, args.requestContext.apiSettings, args.requestContext);\n }\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { removeCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function removeCartLinesInternal(\n cart: Readonly,\n cartLineIds: string[],\n actionContext: IActionContext\n): Promise {\n if (!cart) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n return removeCartLinesAsync({ callerContext: actionContext }, cart.Id, cartLineIds)\n .then(newCart => {\n // This is because of a TSProxy typing error\n const returnedCart = Array.isArray(newCart) ? newCart[0] : newCart;\n\n return { cart: returnedCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to Remove Cart Line');\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error.message } };\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { Address, Cart, CartsDataActions } from '@msdyn365-commerce/retail-proxy';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\n/**\n * Update shipping address in cart.\n * @param cart - The cart object.\n * @param shippingAddress - The new shipping address.\n * @param actionContext - The action context.\n * @returns The updated cart with new shipping address.\n */\nexport async function updateShippingAddress(\n cart: Readonly,\n shippingAddress: Address,\n actionContext: IActionContext\n): Promise {\n if (!cart) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n return CartsDataActions.updateAsync(\n { callerContext: actionContext },\n {\n Id: cart.Id,\n ShippingAddress: shippingAddress\n }\n )\n .then(newCart => {\n const result: ICartActionResultWithCart = { cart: newCart, status: 'SUCCESS' };\n return result;\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to update shipping address to the cart');\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error.message } };\n });\n}\n\nexport default updateShippingAddress;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { updateCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart, CartLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function updateCartLinesInternal(\n cart: Readonly,\n cartLinesToUpdate: CartLine[],\n actionContext: IActionContext\n): Promise {\n if (!cart || !cart.CartLines) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n return updateCartLinesAsync({ callerContext: actionContext }, cart.Id, cartLinesToUpdate, null)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch((error: string) => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to Update Cart Lines');\n\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error } };\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nexport * from './base-checkout-cart-state';\nexport * from './base-checkout-state';\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { BaseCheckoutState } from '../checkout-state/base-checkout-state';\nimport { ICheckoutState } from '../state-interfaces/i-checkout-state';\nimport createGlobalStateDataAction from './global-state-data-action';\n\nexport default createGlobalStateDataAction('CHECKOUTSTATE', BaseCheckoutState);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { updateCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart, CartLine, ChannelDeliveryOptionConfiguration } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { cloneDeep } from 'lodash';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function clearCartLinesDeliveryInformation(\n cart: Readonly,\n actionContext: IActionContext,\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration\n): Promise {\n if (!cart || !cart.CartLines) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n let matchingLines: CartLine[] = [];\n const pickupDeliveryModeCode =\n actionContext && actionContext.requestContext && actionContext.requestContext.channel?.PickupDeliveryModeCode;\n const emailDeliveryModeCode =\n actionContext && actionContext.requestContext && actionContext.requestContext.channel?.EmailDeliveryModeCode;\n if (channelDeliveryOptionConfig !== undefined) {\n matchingLines = cart.CartLines.filter(\n cartLine =>\n cartLine.DeliveryMode &&\n cartLine.DeliveryMode !== channelDeliveryOptionConfig.PickupDeliveryModeCodes?.find(dM => dM === cartLine.DeliveryMode) &&\n cartLine.DeliveryMode !== emailDeliveryModeCode &&\n cartLine.LineId\n );\n } else {\n matchingLines = cart.CartLines.filter(\n cartLine =>\n cartLine.DeliveryMode &&\n cartLine.DeliveryMode !== pickupDeliveryModeCode &&\n cartLine.DeliveryMode !== emailDeliveryModeCode &&\n cartLine.LineId\n );\n }\n\n // If there are no lines needing updates, just return success\n if (matchingLines.length === 0) {\n return { cart, status: 'SUCCESS' };\n }\n\n const copiedLines: CartLine[] = cloneDeep(matchingLines);\n\n copiedLines.forEach(line => {\n line.DeliveryMode = '';\n line.FulfillmentStoreId = '';\n line.ShippingAddress = {};\n });\n\n return updateCartLinesAsync({ callerContext: actionContext }, cart.Id, copiedLines, null)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch((error: string) => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to Update Cart Lines');\n\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error } };\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nexport enum CheckoutStorageKey {\n BillingAddress = 'BillingAddress',\n GiftCard = 'GiftCard',\n LoyaltyCardNumber = 'LoyaltyCardNumber',\n LoyaltyAmount = 'LoyaltyAmount',\n TermsAndCondition = 'TermsAndCondition',\n CheckoutGenericData = 'Checkout-Generic-Data',\n PaymentTenderType = 'PaymentTenderType',\n RedirectPaymentConnectorId = 'RedirectPaymentConnectorId',\n IsExpressCheckoutApplied = 'IsExpressCheckoutApplied'\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport {\n Address,\n AttributeValueBase,\n CardPaymentAcceptResult,\n CartLine,\n CommerceProperty,\n GiftCard,\n SalesOrder,\n SimpleProduct,\n TenderLine,\n TokenizedPaymentCard\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport get from 'lodash/get';\nimport { action, computed, observable } from 'mobx';\n\nimport { GlobalState } from '../global-state/global-state';\nimport { CheckoutModule } from '../state-interfaces';\nimport { ICartState } from '../state-interfaces/i-cart-state';\nimport {\n ICheckoutActionResult,\n ICheckoutGenericData,\n ICheckoutState,\n IGiftCardExtend,\n ICheckoutError\n} from '../state-interfaces/i-checkout-state';\nimport { BaseCheckoutCartState } from './base-checkout-cart-state';\nimport { CheckoutStorageKey } from './checkout-state-storage';\n\n/**\n * State information related to what is needed to succesfully perform a checkout.\n */\nexport class BaseCheckoutState extends GlobalState implements ICheckoutState {\n @observable protected _checkoutCart: ICartState;\n\n @computed public get checkoutCart(): ICartState {\n return this._checkoutCart;\n }\n\n @observable protected _salesOrder?: SalesOrder;\n\n @computed public get salesOrder(): Readonly {\n return this._salesOrder;\n }\n\n @observable protected _attributeValues: AttributeValueBase[];\n\n @computed public get attributeValues(): Readonly {\n return this._attributeValues;\n }\n\n @observable protected _extensionProperties: CommerceProperty[];\n\n @computed public get extensionProperties(): Readonly {\n return this._extensionProperties;\n }\n\n @observable protected _orderedProducts?: SimpleProduct[];\n\n @computed public get orderedProducts(): Readonly {\n return this._orderedProducts;\n }\n\n @observable protected _tokenizedPaymentCard?: TokenizedPaymentCard;\n\n @computed public get tokenizedPaymentCard(): Readonly {\n return this._tokenizedPaymentCard;\n }\n\n @observable protected _tenderLine?: TenderLine;\n\n @computed public get tenderLine(): Readonly {\n return this._tenderLine;\n }\n\n @observable protected _billingAddress?: Address;\n\n @computed public get billingAddress(): Readonly
{\n return this._billingAddress;\n }\n\n @observable protected _isBillingAddressSameAsShippingAddress?: boolean;\n\n @computed public get isBillingAddressSameAsShippingAddress(): Readonly {\n return this._isBillingAddressSameAsShippingAddress;\n }\n\n @observable protected _shippingAddress?: Address;\n\n @computed public get shippingAddress(): Readonly
{\n return this._shippingAddress;\n }\n\n @observable protected _hasShippingAddress?: boolean;\n\n @computed public get hasShippingAddress(): Readonly {\n return this._hasShippingAddress;\n }\n\n @observable protected _hasCartDeliveryMode?: boolean;\n\n @computed public get hasCartDeliveryMode(): Readonly {\n return this._hasCartDeliveryMode;\n }\n\n @observable protected _cardPrefix?: string;\n\n @computed public get cardPrefix(): Readonly {\n return this._cardPrefix;\n }\n\n @observable protected _paymentTenderType?: string;\n\n @computed public get paymentTenderType(): Readonly {\n return this._paymentTenderType;\n }\n\n /**\n * @deprecated Use giftCardExtends method.\n */\n @computed public get giftCards(): Readonly {\n return this.giftCardExtends;\n }\n\n @observable protected _giftCardExtends: IGiftCardExtend[] = [];\n\n @computed public get giftCardExtends(): Readonly {\n return this._giftCardExtends;\n }\n\n @observable protected _loyaltyCardNumber?: string;\n\n @computed public get loyaltyCardNumber(): Readonly {\n return this._loyaltyCardNumber;\n }\n\n @observable protected _loyaltyAmount: number = 0;\n\n @computed public get loyaltyAmount(): Readonly {\n return this._loyaltyAmount;\n }\n\n @observable protected _guestCheckoutEmail: string = '';\n\n @computed public get guestCheckoutEmail(): Readonly {\n return this._guestCheckoutEmail;\n }\n\n @observable protected _hasGuestCheckoutEmail?: boolean;\n\n @computed public get hasGuestCheckoutEmail(): Readonly {\n return this._hasGuestCheckoutEmail;\n }\n\n @observable protected _isTermsAndConditionAccepted?: boolean;\n\n @computed public get isTermsAndConditionAccepted(): Readonly {\n return this._isTermsAndConditionAccepted;\n }\n\n @observable protected _isTermsAndConditionChecked?: boolean;\n\n @computed public get isTermsAndConditionChecked(): Readonly {\n return this._isTermsAndConditionChecked;\n }\n\n @observable protected _shouldEnableSinglePaymentAuthorizationCheckout?: boolean;\n\n @computed public get shouldEnableSinglePaymentAuthorizationCheckout(): Readonly {\n return this._shouldEnableSinglePaymentAuthorizationCheckout;\n }\n\n @observable protected _shouldEnableCheckoutErrorDisplayMessaging?: boolean;\n\n @computed public get shouldEnableCheckoutErrorDisplayMessaging(): Readonly {\n return this._shouldEnableCheckoutErrorDisplayMessaging;\n }\n\n @observable protected _shouldCollapsePaymentSection?: boolean;\n\n @computed public get shouldCollapsePaymentSection(): Readonly {\n return this._shouldCollapsePaymentSection;\n }\n\n @observable protected _shouldTriggerPaymentWithPlaceOrder?: boolean;\n\n @computed public get shouldTriggerPaymentWithPlaceOrder(): Readonly {\n return this._shouldTriggerPaymentWithPlaceOrder;\n }\n\n @observable protected _isPaymentSectionContainerReady?: boolean;\n\n @computed public get isPaymentSectionContainerReady(): Readonly {\n return this._isPaymentSectionContainerReady;\n }\n\n @observable protected _cardPaymentAcceptResult?: CardPaymentAcceptResult;\n\n @computed public get cardPaymentAcceptResult(): Readonly {\n return this._cardPaymentAcceptResult;\n }\n\n @observable protected _isPaymentSectionContainerHasError?: boolean;\n\n @computed public get isPaymentSectionContainerHasError(): Readonly {\n return this._isPaymentSectionContainerHasError;\n }\n\n @observable protected _redirectAdditionalContext?: string;\n\n @computed public get redirectAdditionalContext(): Readonly {\n return this._redirectAdditionalContext;\n }\n\n @observable protected _redirectPaymentConnectorId?: string;\n\n @computed public get redirectPaymentConnectorId(): Readonly {\n return this._redirectPaymentConnectorId;\n }\n\n @observable protected _checkoutErrorPaymentConnectorId?: string;\n\n @computed public get checkoutErrorPaymentConnectorId(): Readonly {\n return this._checkoutErrorPaymentConnectorId;\n }\n\n @observable protected _isPlaceOrderEnabledInRedirection?: boolean;\n\n @computed public get isPlaceOrderEnabledInRedirection(): Readonly {\n return this._isPlaceOrderEnabledInRedirection;\n }\n\n @observable protected _isPaymentVerificationRequired?: boolean;\n\n @computed public get isPaymentVerificationRequired(): Readonly {\n return this._isPaymentVerificationRequired;\n }\n\n @observable protected _isCheckoutCallFailed?: boolean;\n\n @computed public get isCheckoutCallFailed(): Readonly {\n return this._isCheckoutCallFailed;\n }\n\n @observable protected _customerAccountAmount: number = 0;\n\n @computed public get customerAccountAmount(): Readonly {\n return this._customerAccountAmount;\n }\n\n @observable protected _shouldEnableExpressCheckoutInCheckout?: boolean;\n\n @computed public get shouldEnableExpressCheckoutInCheckout(): Readonly {\n return this._shouldEnableExpressCheckoutInCheckout;\n }\n\n @observable protected _shouldEnableExpressCheckoutInCart?: boolean;\n\n @computed public get shouldEnableExpressCheckoutInCart(): Readonly {\n return this._shouldEnableExpressCheckoutInCart;\n }\n\n @observable protected _shippingAddressFromExpressCheckout?: Address;\n\n @computed public get shippingAddressFromExpressCheckout(): Readonly
{\n return this._shippingAddressFromExpressCheckout;\n }\n\n @observable protected _emailAddressFromExpressCheckout: string = '';\n\n @computed public get emailAddressFromExpressCheckout(): Readonly {\n return this._emailAddressFromExpressCheckout;\n }\n\n @observable protected _billingAddressFromExpressCheckout?: Address;\n\n @computed public get billingAddressFromExpressCheckout(): Readonly
{\n return this._billingAddressFromExpressCheckout;\n }\n\n @observable protected _isExpressCheckoutApplied?: boolean;\n\n @computed public get isExpressCheckoutApplied(): Readonly {\n return this._isExpressCheckoutApplied;\n }\n\n @observable protected _isExpressAddressApplied?: boolean;\n\n @computed public get isExpressAddressApplied(): Readonly {\n return this._isExpressAddressApplied;\n }\n\n @observable protected _isExpressCheckoutAppliedInCartPage?: boolean;\n\n @computed public get isExpressCheckoutAppliedInCartPage(): Readonly {\n return this._isExpressCheckoutAppliedInCartPage;\n }\n\n @observable protected _isExpressPaymentModulesReady?: CommerceProperty[];\n\n @computed public get isExpressPaymentModulesReady(): Readonly {\n return this._isExpressPaymentModulesReady;\n }\n\n @computed public get isPaymentVerificationRedirection(): Readonly {\n const { requestFormData, query } = this.actionContext.requestContext;\n return !!(query && query.pv === '1' && (requestFormData || query.redirectResult));\n }\n\n @observable protected _checkoutError?: ICheckoutError;\n\n @computed public get checkoutError(): Readonly {\n return this._checkoutError;\n }\n\n @observable protected _isBillingAddressHasError?: boolean;\n\n @computed public get isBillingAddressHasError(): Readonly {\n return this._isBillingAddressHasError;\n }\n\n @observable protected _checkoutErrorFocus?: CheckoutModule;\n\n @computed public get checkoutErrorFocus(): Readonly {\n return this._checkoutErrorFocus;\n }\n\n @observable protected _shouldFocusOnCheckoutError?: boolean;\n\n @computed public get shouldFocusOnCheckoutError(): Readonly {\n return this._shouldFocusOnCheckoutError;\n }\n\n @observable protected _checkoutGenericData: object = {};\n\n constructor(actionContext: IActionContext) {\n super(actionContext);\n this._checkoutCart = new BaseCheckoutCartState(actionContext);\n this._attributeValues = [];\n this._extensionProperties = [];\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for app settings.\n this._shouldEnableSinglePaymentAuthorizationCheckout = actionContext.requestContext.app.config\n .shouldEnableSinglePaymentAuthorizationCheckout as boolean;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for app settings.\n this._shouldEnableCheckoutErrorDisplayMessaging = actionContext.requestContext.app.config\n .shouldEnableCheckoutErrorDisplayMessaging as boolean;\n }\n\n @action\n public updateSalesOrder(input: {\n newSalesOrder: SalesOrder;\n newOrderedProducts: SimpleProduct[];\n additionalProperties?: object;\n }): Promise {\n this._salesOrder = input.newSalesOrder;\n this._orderedProducts = input.newOrderedProducts;\n this._attributeValues = input.newSalesOrder.AttributeValues || [];\n this._extensionProperties = input.newSalesOrder.ExtensionProperties || [];\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public async updateAttributeValues(input: {\n newAttributeValues: AttributeValueBase[];\n additionalProperties?: object;\n }): Promise {\n this._attributeValues = input.newAttributeValues;\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public async updateExtensionProperties(input: {\n newExtensionProperties: CommerceProperty[];\n additionalProperties?: object;\n }): Promise {\n this._extensionProperties = input.newExtensionProperties;\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public updateTokenizedPaymentCard(input: {\n newTokenizedPaymentCard?: TokenizedPaymentCard;\n additionalProperties?: object;\n }): Promise {\n this._tokenizedPaymentCard = input.newTokenizedPaymentCard;\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public updateTenderLine(input: { newTenderLine?: TenderLine; additionalProperties?: object }): Promise {\n this._tenderLine = input.newTenderLine;\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public async updateShippingAddress(input: {\n newShippingAddress: Address;\n additionalProperties?: object;\n }): Promise {\n this._shippingAddress = input.newShippingAddress;\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public async updateHasShippingAddress(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newHasShippingAddress: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._hasShippingAddress = input.newHasShippingAddress;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateHasCartDeliveryMode(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newHasCartDeliveryMode: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._hasCartDeliveryMode = input.newHasCartDeliveryMode;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateTermsAndConditionsAcceptance(input: {\n newIsTermsAndConditionAccepted: boolean;\n additionalProperties?: object;\n }): Promise {\n this._isTermsAndConditionAccepted = input.newIsTermsAndConditionAccepted;\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public async updateIsTermsAndConditionsChecked(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newIsTermsAndConditionChecked: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._isTermsAndConditionChecked = input.newIsTermsAndConditionChecked;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateShouldCollapsePaymentSection(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newShouldCollapsePaymentSection: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._shouldCollapsePaymentSection = input.newShouldCollapsePaymentSection;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateShouldTriggerPaymentWithPlaceOrder(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newShouldTriggerPaymentWithPlaceOrder: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._shouldTriggerPaymentWithPlaceOrder = input.newShouldTriggerPaymentWithPlaceOrder;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateIsPaymentSectionContainerReady(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newIsPaymentSectionContainerReady: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._isPaymentSectionContainerReady = input.newIsPaymentSectionContainerReady;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateCardPaymentAcceptResult(input: {\n newCardPaymentAcceptResult: CardPaymentAcceptResult;\n additionalProperties?: { [key: string]: unknown };\n }): Promise {\n this._cardPaymentAcceptResult = input.newCardPaymentAcceptResult;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateIsPaymentSectionContainerHasError(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newIsPaymentSectionContainerHasError: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._isPaymentSectionContainerHasError = input.newIsPaymentSectionContainerHasError;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateRedirectAdditionalContext(input: {\n newRedirectAdditionalContext: string;\n additionalProperties?: { [key: string]: unknown };\n }): Promise {\n this._redirectAdditionalContext = input.newRedirectAdditionalContext;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateRedirectPaymentConnectorId(input: {\n newRedirectPaymentConnectorId: string;\n additionalProperties?: { [key: string]: unknown };\n }): Promise {\n this._redirectPaymentConnectorId = input.newRedirectPaymentConnectorId;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateCheckoutErrorPaymentConnectorId(input: {\n newCheckoutErrorPaymentConnectorId: string;\n additionalProperties?: { [key: string]: unknown };\n }): Promise {\n this._checkoutErrorPaymentConnectorId = input.newCheckoutErrorPaymentConnectorId;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateIsCheckoutCallFailed(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newIsCheckoutCallFailed: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._isCheckoutCallFailed = input.newIsCheckoutCallFailed;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateIsPlaceOrderEnabledInRedirection(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newIsPlaceOrderEnabledInRedirection: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._isPlaceOrderEnabledInRedirection = input.newIsPlaceOrderEnabledInRedirection;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateIsPaymentVerificationRequired(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newIsPaymentVerificationRequired: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._isPaymentVerificationRequired = input.newIsPaymentVerificationRequired;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public updateBillingAddress(input: { newBillingAddress: Address; additionalProperties?: object }): Promise {\n this._billingAddress = input.newBillingAddress;\n\n // @ts-expect-error\n this._isBillingAddressSameAsShippingAddress = input.additionalProperties?.isBillingAddressSameAsShippingAddress || false;\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public removeBillingAddress(input: { additionalProperties?: object }): Promise {\n this._billingAddress = undefined;\n this._isBillingAddressSameAsShippingAddress = undefined;\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public updatePaymentTenderType(input: {\n newPaymentTenderType?: string;\n additionalProperties?: object;\n }): Promise {\n this._paymentTenderType = input.newPaymentTenderType;\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public updateCardPrefix(input: { newCardPrefix: string; additionalProperties?: object }): Promise {\n this._cardPrefix = input.newCardPrefix;\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public removeGiftCard(input: { giftCardNumber: string; additionalProperties?: object }): Promise {\n this._giftCardExtends = this._giftCardExtends.filter(giftCard => giftCard.Id !== input.giftCardNumber);\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public removeGiftCardExtend(input: { giftCardNumber: string; additionalProperties?: object }): Promise {\n this._giftCardExtends = this._giftCardExtends.filter(giftCard => giftCard.Id !== input.giftCardNumber);\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public addGiftCard(input: { giftCard: GiftCard; additionalProperties?: object }): Promise {\n // @ts-expect-error\n const { Pin, ExpirationDate, TenderTypeId } = input.additionalProperties || {};\n\n const gitCardExtend = { ...input.giftCard, ...{ Pin, ExpirationDate, TenderTypeId } };\n\n this._giftCardExtends = [gitCardExtend, ...this._giftCardExtends];\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public addGiftCardExtend(input: { giftCard: IGiftCardExtend; additionalProperties?: object }): Promise {\n this._giftCardExtends = [input.giftCard, ...this._giftCardExtends];\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public updateLoyaltyCardNumber(input: { newLoyaltyCardNumber: string; additionalProperties?: object }): Promise {\n this._loyaltyCardNumber = input.newLoyaltyCardNumber;\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public updateLoyaltyAmount(input: { newAmount: number; additionalProperties?: object }): Promise {\n this._loyaltyAmount = Number(input.newAmount.toFixed(2));\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public async updateGuestCheckoutEmail(input: {\n newGuestCheckoutEmail: string;\n additionalProperties?: object;\n }): Promise {\n this._guestCheckoutEmail = input.newGuestCheckoutEmail;\n const emailOnCart = this.checkoutCart.cart.ReceiptEmail;\n\n if (emailOnCart !== input.newGuestCheckoutEmail) {\n await this.checkoutCart.updateReceiptEmail({ newEmail: input.newGuestCheckoutEmail });\n }\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n /**\n * Updates cartLines objects in cart.\n * @param input - The input.\n * @param input.updatedCartLinesObject - updated cartline.\n * @returns ICartActionResult.\n */\n @action\n public async updateCartLines(input: { updatedCartLinesObject: CartLine[] }): Promise {\n await this.checkoutCart.updateCartLines({ updatedCartLinesObject: input.updatedCartLinesObject });\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public async updateHasGuestCheckoutEmail(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newHasGuestCheckoutEmail: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._hasGuestCheckoutEmail = input.newHasGuestCheckoutEmail;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public removeCheckoutCartId(input: { additionalProperties?: object }): Promise {\n this.actionContext.requestContext.cookies.removeCheckoutCartCookie();\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public saveDataInStorage(input: { additionalProperties?: object }): Promise {\n const { sessionStorage } = this.actionContext.requestContext;\n\n // Add all local data to session storage\n if (this.billingAddress) {\n sessionStorage.setCheckoutCartData(CheckoutStorageKey.BillingAddress, {\n billingAddress: this.billingAddress,\n isBillingAddressSameAsShippingAddress: this.isBillingAddressSameAsShippingAddress\n });\n }\n\n if (this.giftCardExtends && this.giftCardExtends.length > 0) {\n sessionStorage.setCheckoutCartData(CheckoutStorageKey.GiftCard, this.giftCardExtends);\n }\n\n if (this.loyaltyCardNumber) {\n sessionStorage.setCheckoutCartData(CheckoutStorageKey.LoyaltyCardNumber, { loyaltyCardNumber: this.loyaltyCardNumber });\n }\n\n if (this.loyaltyAmount) {\n sessionStorage.setCheckoutCartData(CheckoutStorageKey.LoyaltyAmount, { loyaltyAmount: this.loyaltyAmount });\n }\n\n if (this.isTermsAndConditionAccepted) {\n sessionStorage.setCheckoutCartData(CheckoutStorageKey.TermsAndCondition, {\n isTermsAndConditionAccepted: this.isTermsAndConditionAccepted\n });\n }\n\n if (this.paymentTenderType) {\n window.sessionStorage.setItem(CheckoutStorageKey.PaymentTenderType, this.paymentTenderType);\n }\n\n if (this.redirectPaymentConnectorId) {\n window.sessionStorage.setItem(CheckoutStorageKey.RedirectPaymentConnectorId, this.redirectPaymentConnectorId);\n }\n\n if (this.isExpressCheckoutApplied) {\n window.sessionStorage.setItem(CheckoutStorageKey.IsExpressCheckoutApplied, this.isExpressCheckoutApplied.toString());\n }\n\n // Save generic data with SaveDataBeforeRedirect value true\n const filtered = Object.keys(this._checkoutGenericData).reduce((filteredData: object, key: string) => {\n if (this._checkoutGenericData[key].SaveDataBeforeRedirect) {\n filteredData[key] = this._checkoutGenericData[key];\n }\n return filteredData;\n }, {});\n\n if (Object.keys(filtered).length > 0) {\n sessionStorage.setCheckoutCartData(CheckoutStorageKey.CheckoutGenericData, { checkoutGenericData: filtered });\n }\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public updateCustomerAccountAmount(input: { newAmount: number; additionalProperties?: object }): Promise {\n this._customerAccountAmount = Number(input.newAmount.toFixed(2));\n\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public async updateBillingAddressFromExpressCheckout(input: {\n newBillingAddressFromExpressCheckout: Address;\n additionalProperties?: { [key: string]: unknown };\n }): Promise {\n this._billingAddressFromExpressCheckout = input.newBillingAddressFromExpressCheckout;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateShippingAddressFromExpressCheckout(input: {\n newShippingAddressFromExpressCheckout: Address;\n additionalProperties?: { [key: string]: unknown };\n }): Promise {\n this._shippingAddressFromExpressCheckout = input.newShippingAddressFromExpressCheckout;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateEmailAddressFromExpressCheckout(input: {\n newEmailAddressFromExpressCheckout: string;\n additionalProperties?: { [key: string]: unknown };\n }): Promise {\n this._emailAddressFromExpressCheckout = input.newEmailAddressFromExpressCheckout;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateShouldEnableExpressCheckoutInCheckout(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newShouldEnableExpressCheckoutInCheckout: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._shouldEnableExpressCheckoutInCheckout = input.newShouldEnableExpressCheckoutInCheckout;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateShouldEnableExpressCheckoutInCart(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newShouldEnableExpressCheckoutInCart: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._shouldEnableExpressCheckoutInCart = input.newShouldEnableExpressCheckoutInCart;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateIsExpressCheckoutApplied(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newIsExpressCheckoutApplied: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._isExpressCheckoutApplied = input.newIsExpressCheckoutApplied;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateIsExpressAddressApplied(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newIsExpressAddressApplied: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._isExpressAddressApplied = input.newIsExpressAddressApplied;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateIsExpressCheckoutAppliedInCartPage(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newIsExpressCheckoutAppliedInCartPage: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._isExpressCheckoutAppliedInCartPage = input.newIsExpressCheckoutAppliedInCartPage;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateIsBillingAddressHasError(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newIsBillingAddressHasError: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._isBillingAddressHasError = input.newIsBillingAddressHasError;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateIsExpressPaymentModulesReady(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: {\n newIsExpressPaymentModulesReady: CommerceProperty[];\n additionalProperties?: { [key: string]: unknown };\n }\n ): Promise {\n this._isExpressPaymentModulesReady = input.newIsExpressPaymentModulesReady;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateExpressCheckoutDetails(input: {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n newIsExpressCheckoutApplied: boolean;\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n newIsExpressAddressApplied?: boolean;\n newCardPaymentAcceptResult?: CardPaymentAcceptResult;\n newEmailAddressFromExpressCheckout: string;\n newTenderLine?: TenderLine;\n newPaymentTenderType?: string;\n newTokenizedPaymentCard?: TokenizedPaymentCard;\n additionalProperties?: { [key: string]: unknown };\n }): Promise {\n this._isExpressCheckoutApplied = input.newIsExpressCheckoutApplied;\n\n if (input.newIsExpressAddressApplied !== undefined) {\n this._isExpressAddressApplied = input.newIsExpressAddressApplied;\n }\n\n if (input.newCardPaymentAcceptResult !== undefined) {\n this._cardPaymentAcceptResult = input.newCardPaymentAcceptResult;\n }\n\n if (input.newPaymentTenderType !== undefined) {\n this._paymentTenderType = input.newPaymentTenderType;\n }\n\n if (input.newTokenizedPaymentCard !== undefined) {\n this._tokenizedPaymentCard = input.newTokenizedPaymentCard;\n }\n\n if (input.newTenderLine !== undefined) {\n this._tenderLine = input.newTenderLine;\n }\n\n if (input.newEmailAddressFromExpressCheckout) {\n this._emailAddressFromExpressCheckout = input.newEmailAddressFromExpressCheckout;\n }\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateCheckoutError(input: {\n newCheckoutError: ICheckoutError;\n additionalProperties?: { [key: string]: unknown };\n }): Promise {\n this._checkoutError = input.newCheckoutError;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public setCheckoutGenericData(input: {\n key: string;\n checkoutGenericData: ICheckoutGenericData;\n additionalProperties?: object;\n }): Promise {\n this._checkoutGenericData[input.key] = input.checkoutGenericData;\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n @action\n public getCheckoutGenericData(input: { key: string }): ICheckoutGenericData | undefined {\n return this._checkoutGenericData[input.key];\n }\n\n @action\n public async updateCheckoutErrorFocus(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newCheckoutErrorFocus: CheckoutModule; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._checkoutErrorFocus = input.newCheckoutErrorFocus;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n @action\n public async updateShouldFocusOnCheckoutError(\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\n input: { newShouldFocusOnCheckoutError: boolean; additionalProperties?: { [key: string]: unknown } }\n ): Promise {\n this._shouldFocusOnCheckoutError = input.newShouldFocusOnCheckoutError;\n\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\n return Promise.resolve(result);\n }\n\n public async initialize(): Promise {\n if (this.isInitialized) {\n return;\n }\n\n await this._checkoutCart.initialize();\n\n this.setInitialData();\n this.isInitialized = true;\n this._status = 'READY';\n this._attributeValues = [];\n this._extensionProperties = [];\n }\n\n @action\n private cleanCheckoutData(input: { additionalProperties?: object }): Promise {\n this.actionContext.requestContext.sessionStorage.removeCheckoutCartData();\n return Promise.resolve({ status: 'SUCCESS' });\n }\n\n private setInitialData() {\n const { sessionStorage } = this.actionContext.requestContext;\n\n if (this.isPaymentVerificationRedirection) {\n const billingAddress = sessionStorage.getCheckoutCartData(CheckoutStorageKey.BillingAddress);\n const giftCard = sessionStorage.getCheckoutCartData(CheckoutStorageKey.GiftCard);\n\n this._billingAddress = get(billingAddress, 'billingAddress');\n this._isBillingAddressSameAsShippingAddress = get(billingAddress, 'isBillingAddressSameAsShippingAddress');\n this._giftCardExtends = (giftCard && Array.isArray(giftCard) ? giftCard : []) as IGiftCardExtend[];\n this._loyaltyCardNumber = get(sessionStorage.getCheckoutCartData(CheckoutStorageKey.LoyaltyCardNumber), 'loyaltyCardNumber');\n this._loyaltyAmount = get(sessionStorage.getCheckoutCartData(CheckoutStorageKey.LoyaltyAmount), 'loyaltyAmount');\n this._isTermsAndConditionAccepted = get(\n sessionStorage.getCheckoutCartData(CheckoutStorageKey.TermsAndCondition),\n 'isTermsAndConditionAccepted'\n );\n this._checkoutGenericData =\n get(sessionStorage.getCheckoutCartData(CheckoutStorageKey.CheckoutGenericData), 'checkoutGenericData') || {};\n this._paymentTenderType = window.sessionStorage.getItem(CheckoutStorageKey.PaymentTenderType) ?? undefined;\n this._redirectPaymentConnectorId = window.sessionStorage.getItem(CheckoutStorageKey.RedirectPaymentConnectorId) as string;\n this._isExpressCheckoutApplied = (window.sessionStorage.getItem(CheckoutStorageKey.IsExpressCheckoutApplied) as string)\n ? true\n : false;\n }\n\n this.cleanCheckoutData({});\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getCatalogId, IActionContext } from '@msdyn365-commerce/core';\nimport {\n Address,\n Cart,\n CartLine,\n ChannelDeliveryOptionConfiguration,\n OrgUnitLocation,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n AttributeValueBase,\n CommerceProperty,\n LineDeliverySpecification,\n ReleasedProductType\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { action, computed, observable } from 'mobx';\n\nimport { GlobalState } from '../global-state/global-state';\nimport { ICartActionResult, ICartState } from '../state-interfaces/i-cart-state';\nimport addInvoicesToCartInternal from './add-invoices-to-cart';\nimport addOrderInvoiceToCartInternal from './add-order-invoice-to-cart';\nimport addProductToCartInternal, { addProductsToCartInternal } from './add-product-to-cart';\nimport addPromoCodeInternal from './add-promo-code';\nimport { ICartActionResultWithCart } from './cart-action-result';\nimport clearCartLineDeliveryModeInternal from './clear-cart-line-delivery-mode';\nimport clearCartLinesDeliveryInformation from './clear-cart-lines-delivery-information';\nimport getOrCreateActiveCart from './get-or-create-active-cart';\nimport refreshCartInternal from './refresh-cart';\nimport removeAllPromoCodesInternal from './remove-all-promo-codes';\nimport removeCartLineInternal from './remove-cart-lines';\nimport removePromoCodesInternal from './remove-promo-codes';\nimport setInvoiceLinePriceInternal from './set-invoice-line-price';\nimport updateCart from './update-cart';\nimport updateCartLineDeliverySpecificationsInternal from './update-cart-line-delivery-specifications';\nimport updateCartLineQuantityInternal from './update-cart-line-quantity';\nimport updateLoyaltyCardIdInternal from './update-loyalty-card-id';\nimport updateReceiptEmail from './update-receipt-email';\nimport updateShippingAddress from './update-shipping-address';\nimport updateCartLinesInternal from './update-cart-lines';\n\n/**\n * Cart state information.\n */\nexport class BaseCartState extends GlobalState implements ICartState {\n @observable protected _cart: Cart;\n\n @computed public get cart(): Readonly {\n return this._cart;\n }\n\n @observable protected _attributeValues: AttributeValueBase[];\n\n @computed public get attributeValues(): AttributeValueBase[] {\n return this._attributeValues;\n }\n\n @observable protected _extensionProperties: CommerceProperty[];\n\n @computed public get extensionProperties(): CommerceProperty[] {\n return this._extensionProperties;\n }\n\n @computed public get totalItemsInCart(): number {\n if (this._cart.CartLines) {\n return this._cart.CartLines.map(cartLine => cartLine.Quantity || 1).reduce((total, num) => total + num, 0);\n }\n\n return 0;\n }\n\n @observable protected _isProductAddedToCart: boolean;\n\n @computed public get isProductAddedToCart(): boolean {\n return this._isProductAddedToCart;\n }\n\n @computed public get isEmpty(): boolean {\n return !(this._cart.CartLines && this._cart.CartLines.length > 0);\n }\n\n @computed public get hasInvoiceLine(): boolean {\n return !!(this._cart.CartLines && this._cart.CartLines.some(cartline => cartline.IsInvoiceLine === true));\n }\n\n constructor(actionContext: IActionContext) {\n super(actionContext);\n this._cart = {};\n this._attributeValues = [];\n this._extensionProperties = [];\n this._isProductAddedToCart = false;\n }\n\n /**\n * Refreshes the cart by getting it from the server.\n *\n * Other actions should keep cart up to date so shouldn't need to call this\n * outside of initialization but still might be scenarios where a manual\n * refresh is needed.\n * @param input - Input.\n * @param input.additionalProperties - Additional properties.\n * @returns - The cart action result.\n */\n @action\n public async refreshCart(input: { additionalProperties?: object }): Promise {\n return this._doAsyncAction(async () => {\n const newCart = await refreshCartInternal(this.cart.Id, this.actionContext);\n\n if (newCart) {\n this._cart = newCart;\n\n return { status: 'SUCCESS' };\n }\n\n return { status: 'FAILED' };\n });\n }\n\n /**\n * Adds the specified product to the current cart. If product is already in cart\n * will update its cart line, otherwise will add a new cart line to the cart.\n * @param input - The input.\n * @param input.product - The product to add to the cart.\n * @param input.count - How many copies of the product to add.\n * @param input.location - The org unit location, used for BuyOnlinePickupInStore scenarios\n * (If you want item to simply be shipped, leave this parameter undefined).\n * @param input.additionalProperties - Additional properties.\n * @param input.availableQuantity - Available quantity.\n * @param input.enableStockCheck - Is stock check enabled.\n * @param input.isAddEmailDeliveryItemToCart - Is add email delivery item to cart.\n * @param input.isPriceKeyedIn - Is price keyed in.\n * @param input.customPrice - Custom price.\n * @param input.deliveryMode - Delivery mode.\n * @param input.shouldSkipSiteSettings - Should skip site settings.\n * @param input.catalogId - Should skip site settings.\n * @returns Cart action result.\n */\n @action\n public async addProductToCart(input: {\n product: SimpleProduct;\n count?: number;\n location?: OrgUnitLocation;\n additionalProperties?: object;\n availableQuantity?: number;\n enableStockCheck?: boolean;\n isAddEmailDeliveryItemToCart?: boolean;\n isPriceKeyedIn?: boolean;\n customPrice?: number;\n deliveryMode?: string;\n shouldSkipSiteSettings?: boolean;\n catalogId?: number;\n retailMultiplePickupModeEnabled?: boolean;\n }): Promise {\n return this._doAsyncAction(async () => {\n const cartLine: CartLine = {\n CatalogId: input.catalogId ?? getCatalogId(this.actionContext.requestContext),\n Description: input.product.Description,\n\n // TODO: Investigate this value and what it represents\n EntryMethodTypeValue: 3,\n ItemId: input.product.ItemId,\n ProductId: input.product.RecordId,\n Quantity: input.count || 1,\n TrackingId: '',\n UnitOfMeasureSymbol: input.product.DefaultUnitOfMeasure,\n IsPriceKeyedIn: input.isPriceKeyedIn,\n IsGiftCardLine: input.product.IsGiftCard,\n Price: input.customPrice ? input.customPrice : input.product.Price\n };\n\n if (input.location) {\n if (!this.actionContext.requestContext.channel) {\n return { status: 'FAILED' };\n }\n\n // If curbside pick is not available use the default one\n if (input.deliveryMode !== undefined) {\n cartLine.DeliveryMode = input.deliveryMode;\n } else {\n cartLine.DeliveryMode = input.retailMultiplePickupModeEnabled\n ? undefined\n : this.actionContext.requestContext.channel.PickupDeliveryModeCode;\n }\n\n cartLine.FulfillmentStoreId = input.location.OrgUnitNumber;\n cartLine.WarehouseId = input.location.InventoryLocationId;\n cartLine.ShippingAddress = this._buildAddressFromOrgUnitLocation(input.location);\n }\n\n if (input.isAddEmailDeliveryItemToCart) {\n if (!this.actionContext.requestContext.channel) {\n return { status: 'FAILED' };\n }\n\n cartLine.DeliveryMode = this.actionContext.requestContext.channel.EmailDeliveryModeCode;\n }\n\n // Check if the product is service or not by product type\n const isAddServiceItemToCart = input.product.ItemTypeValue === ReleasedProductType.Service;\n\n // @ts-expect-error\n const orderQuantityLimitsFeatureIsEnabled: boolean = !!input.additionalProperties?.orderQuantityLimitsFeatureIsEnabled;\n const isMaxByQuantityValidationFeatureDefined: boolean = !!input.product.Behavior?.MaximumQuantity;\n return this._doCartOperationWithRetry(() =>\n addProductToCartInternal(\n this.cart,\n cartLine,\n this.actionContext,\n orderQuantityLimitsFeatureIsEnabled,\n input.availableQuantity,\n input.enableStockCheck,\n isAddServiceItemToCart,\n isMaxByQuantityValidationFeatureDefined,\n input.shouldSkipSiteSettings\n )\n );\n });\n }\n\n /**\n * Adds the specified product to the current cart. If product is already in cart\n * will update its cart line, otherwise will add a new cart line to the cart.\n * @param input - Input.\n * @param input.product - Product.\n * @param input.count - Count.\n * @param input.location - Location.\n * @param input.additionalProperties - Additional properties.\n * @param input.availableQuantity - Available quantity.\n * @param input.enableStockCheck - Enable stock check.\n * @param input.isAddEmailDeliveryItemToCart - Is add email delivery item to cart.\n * @param input.isPriceKeyedIn - Is price keyed in.\n * @param input.customPrice - Custom price.\n * @param input.deliveryMode - Delivery mode.\n * @returns Cart action result.\n */\n @action\n public async addProductsToCart(\n input: {\n product: SimpleProduct;\n count?: number;\n location?: OrgUnitLocation;\n additionalProperties?: object;\n availableQuantity?: number;\n enableStockCheck?: boolean;\n isAddEmailDeliveryItemToCart?: boolean;\n isPriceKeyedIn?: boolean;\n customPrice?: number;\n deliveryMode?: string;\n catalogId?: number;\n retailMultiplePickupModeEnabled?: boolean;\n }[]\n ): Promise {\n return this._doAsyncAction(async () => {\n const internalInput: {\n cartLineToAdd: CartLine;\n availableQuantity?: number;\n isStockCheckEnabled?: boolean;\n isAddServiceItemToCart?: boolean;\n }[] = [];\n\n for (const inputItem of input) {\n const cartLine: CartLine = {\n CatalogId: inputItem.catalogId ?? getCatalogId(this.actionContext.requestContext),\n Description: inputItem.product.Description,\n\n // TODO: Investigate this value and what it represents\n EntryMethodTypeValue: 3,\n ItemId: inputItem.product.ItemId,\n ProductId: inputItem.product.RecordId,\n Quantity: inputItem.count || 1,\n TrackingId: '',\n UnitOfMeasureSymbol: inputItem.product.DefaultUnitOfMeasure,\n IsPriceKeyedIn: inputItem.isPriceKeyedIn,\n IsGiftCardLine: inputItem.product.IsGiftCard,\n Price: inputItem.customPrice ? inputItem.customPrice : inputItem.product.Price\n };\n\n if (inputItem.location) {\n if (!this.actionContext.requestContext.channel) {\n return { status: 'FAILED' };\n }\n\n // If curbside pick is not available use the default one\n if (inputItem.deliveryMode !== undefined) {\n cartLine.DeliveryMode = inputItem.deliveryMode;\n } else {\n cartLine.DeliveryMode = inputItem.retailMultiplePickupModeEnabled\n ? undefined\n : this.actionContext.requestContext.channel.PickupDeliveryModeCode;\n }\n\n cartLine.FulfillmentStoreId = inputItem.location.OrgUnitNumber;\n cartLine.WarehouseId = inputItem.location.InventoryLocationId;\n cartLine.ShippingAddress = this._buildAddressFromOrgUnitLocation(inputItem.location);\n }\n\n if (inputItem.isAddEmailDeliveryItemToCart) {\n cartLine.DeliveryMode = this.actionContext.requestContext.channel?.EmailDeliveryModeCode;\n }\n\n // Check if the product is service or not by product type\n const PRODUCTASSERVICE = 2 as ReleasedProductType.Service;\n const isAddServiceItemToCart = inputItem.product.ItemTypeValue === PRODUCTASSERVICE;\n\n internalInput.push({\n cartLineToAdd: cartLine,\n availableQuantity: inputItem.availableQuantity,\n isStockCheckEnabled: inputItem.enableStockCheck,\n isAddServiceItemToCart\n });\n }\n\n return this._doCartOperationWithRetry(() => addProductsToCartInternal(this.cart, this.actionContext, internalInput));\n });\n }\n\n /**\n * Adds the specified invoices to the current cart.\n * @param input - The input.\n * @param input.invoiceIds - Invoice Ids.\n * @param input.additionalProperties - Additional properties.\n * @returns Cart action result.\n */\n @action\n public async addInvoicesToCart(input: { invoiceIds: string[]; additionalProperties?: object }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() => addInvoicesToCartInternal(this.cart, input.invoiceIds, this.actionContext));\n });\n }\n\n /**\n * Adds the specified order invoice to the current cart.\n * @param input - Input.\n * @param input.invoiceId - Invoice id.\n * @param input.lineDescription - Line description.\n * @param input.additionalProperties - Additional properties.\n * @returns Cart action result.\n */\n @action\n public async addOrderInvoiceToCart(input: {\n invoiceId: string;\n lineDescription: string;\n additionalProperties?: object;\n }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() =>\n addOrderInvoiceToCartInternal(this.cart, input.invoiceId, input.lineDescription, this.actionContext)\n );\n });\n }\n\n /**\n * Sets price for the given cart line with an invoice. Used to complete partial invoice payments.\n * @param input - Input for the operation.\n * @param input.cartLineId - The cart line with the invoice for which to update the price.\n * @param input.price - The new value of price of the invoice.\n * @returns The cart action result.\n */\n @action public async setInvoiceLinePrice(input: { cartLineId: string | null; price: number }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(async () =>\n setInvoiceLinePriceInternal(this.cart, input.cartLineId, input.price, this.actionContext)\n );\n });\n }\n\n /**\n * Removes the cart lines with the provided ids from the cart.\n * @param input - Input.\n * @param input.cartLineIds - Cart line ids.\n * @param input.additionalProperties - Additional properties.\n * @returns The cart action result.\n */\n @action\n public async removeCartLines(input: { cartLineIds: string[]; additionalProperties?: object }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() => removeCartLineInternal(this.cart, input.cartLineIds, this.actionContext));\n });\n }\n\n /**\n * Clears the pickup location information from the provided cart line,\n * resulting in it getting shipped to the customer.\n * @param input - Input.\n * @param input.cartLineId - Cart line id.\n * @param input.additionalProperties - Additional properties.\n * @returns The cart action result.\n */\n @action\n public async clearCartLinePickupLocation(input: { cartLineId: string; additionalProperties?: object }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() => clearCartLineDeliveryModeInternal(this.cart, input.cartLineId, this.actionContext));\n });\n }\n\n /**\n * Clears the delivery mode, and other information for the shipping cart lines.\n * @param input - Input.\n * @param input.additionalProperties - Additional properties.\n * @param input.channelDeliveryOptionConfiguration -- Channel delivery option configuration.\n * @returns The cart action result.\n */\n @action\n public async clearCartLinesDeliveryInformation(input: {\n additionalProperties?: object;\n channelDeliveryOptionConfiguration?: ChannelDeliveryOptionConfiguration;\n }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() =>\n clearCartLinesDeliveryInformation(this.cart, this.actionContext, input.channelDeliveryOptionConfiguration)\n );\n });\n }\n\n /**\n * Marks the provided cart line for pickup in store, with the provided location as\n * the pickup location.\n * @param input - Input.\n * @param input.cartLineId - Cart line id.\n * @param input.location - Location.\n * @param input.additionalProperties - Additional properties.\n * @param input.deliveryMode - Delivery mode.\n * @returns The cart action result.\n */\n @action\n public async updateCartLinePickupLocation(input: {\n cartLineId: string;\n location: OrgUnitLocation;\n additionalProperties?: object;\n deliveryMode?: string;\n }): Promise {\n return this._doAsyncAction(async () => {\n if (!this.actionContext.requestContext.channel) {\n return { status: 'FAILED' };\n }\n\n const cartLineDeliverySpecification = {\n LineId: input.cartLineId,\n DeliverySpecification: {\n DeliveryModeId:\n input.deliveryMode !== undefined\n ? input.deliveryMode\n : this.actionContext.requestContext.channel.PickupDeliveryModeCode,\n DeliveryPreferenceTypeValue: 2, // Pick up in store\n PickUpStoreId: input.location.OrgUnitNumber,\n DeliveryAddress: this._buildAddressFromOrgUnitLocation(input.location)\n }\n };\n\n return this._doCartOperationWithRetry(() =>\n updateCartLineDeliverySpecificationsInternal(this.cart, [cartLineDeliverySpecification], this.actionContext)\n );\n });\n }\n\n /**\n * Updates cart line pick up date.\n * @param input - The cart line.\n * @param input.lineDeliverySpecifications - Line delivery specifications.\n * @returns The cart action result.\n */\n @action\n public async updateCartLinePickupDateTimeslot(input: {\n lineDeliverySpecifications: LineDeliverySpecification[];\n }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() =>\n updateCartLineDeliverySpecificationsInternal(this.cart, input.lineDeliverySpecifications, this.actionContext)\n );\n });\n }\n\n /**\n * Updates the delivery mode for items in the cart with the desired delivery mode, preserving BOPIS status for stuff already marked as BOPIS.\n * @param input - The input.\n * @param input.deliveryModeId - Delivery mode id.\n * @param input.shippingAddress - Shipping address.\n * @param input.additionalProperties - Additional properties.\n * @param input.channelDeliveryOptionConfig - Channel delivery option configuration.\n * @returns The cart action result.\n */\n @action\n public async updateCartDeliverySpecification(input: {\n deliveryModeId: string;\n shippingAddress: Address | undefined;\n additionalProperties?: object;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n }): Promise {\n return this._doAsyncAction(async () => {\n if (input.deliveryModeId.trim() === '') {\n return { status: 'FAILED', substatus: 'EMPTYINPUT' };\n }\n\n const pickupDeliveryModeCode =\n this.actionContext.requestContext.channel && this.actionContext.requestContext.channel.PickupDeliveryModeCode;\n const emailDeliveryModeCode =\n this.actionContext.requestContext.channel && this.actionContext.requestContext.channel.EmailDeliveryModeCode;\n let cartLinesForShipping: CartLine[] = [];\n\n cartLinesForShipping =\n input.channelDeliveryOptionConfig !== undefined\n ? (this.cart.CartLines || []).filter(cartLine =>\n cartLine.DeliveryMode && cartLine.DeliveryMode !== ''\n ? cartLine.DeliveryMode !==\n input.channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(\n deliveryMode => deliveryMode === cartLine.DeliveryMode\n ) && cartLine.DeliveryMode !== emailDeliveryModeCode\n : cartLine\n )\n : (this.cart.CartLines || []).filter(cartLine =>\n cartLine.DeliveryMode && cartLine.DeliveryMode !== ''\n ? cartLine.DeliveryMode !== pickupDeliveryModeCode && cartLine.DeliveryMode !== emailDeliveryModeCode\n : cartLine\n );\n\n if (cartLinesForShipping.length > 0) {\n const deliverySpecifications = cartLinesForShipping.map(cartLine => {\n return {\n LineId: cartLine.LineId,\n DeliverySpecification: {\n DeliveryModeId: input.deliveryModeId,\n DeliveryPreferenceTypeValue: 1, // Ship\n DeliveryAddress: input.shippingAddress\n }\n };\n });\n\n return this._doCartOperationWithRetry(() =>\n updateCartLineDeliverySpecificationsInternal(this.cart, deliverySpecifications, this.actionContext)\n );\n }\n\n return { status: 'FAILED', substatus: 'NOCONTENT' };\n });\n }\n\n /**\n * Updates the quantity of the cart line.\n * @param input - The input.\n * @param input.cartLineId - Cart line id.\n * @param input.newQuantity - New quantity.\n * @param input.additionalProperties - Additional properties.\n * @returns The cart action result.\n */\n @action\n public async updateCartLineQuantity(input: {\n cartLineId: string;\n newQuantity: number;\n additionalProperties?: object;\n }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() =>\n updateCartLineQuantityInternal(\n this.cart,\n input.cartLineId,\n input.newQuantity,\n this.actionContext,\n\n // @ts-expect-error\n input.additionalProperties?.isUsingDefaultOrderSettingsMax\n )\n );\n });\n }\n\n /**\n * Updates the loyalty card ID on the card.\n * @param input - The input.\n * @param input.loyaltyCardNumber - The loyalty card id to use.\n * @param input.additionalProperties - Additional properties.\n * @returns The cart action result.\n */\n @action\n public async updateLoyaltyCardId(input: {\n loyaltyCardNumber: string | undefined;\n additionalProperties?: object;\n }): Promise {\n if (!input.loyaltyCardNumber) {\n return { status: 'FAILED', substatus: 'EMPTYINPUT' };\n }\n\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() =>\n updateLoyaltyCardIdInternal(this.cart, input.loyaltyCardNumber!, this.actionContext)\n );\n });\n }\n\n /**\n * Adds promo code to the cart.\n * @param input - The input.\n * @param input.promoCode - The promo code to add.\n * @param input.additionalProperties - Additional properties.\n * @returns The cart action result.\n */\n @action\n public addPromoCode(input: { promoCode: string; additionalProperties?: object }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() => addPromoCodeInternal(this.cart, input.promoCode, this.actionContext));\n });\n }\n\n /**\n * Removes promo codes from the cart.\n * @param input - The input.\n * @param input.promoCodes - The promo codes to remove.\n * @param input.additionalProperties - Additional properties.\n * @returns The cart action result.\n */\n @action\n public removePromoCodes(input: { promoCodes: string[]; additionalProperties?: object }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() => removePromoCodesInternal(this.cart, input.promoCodes, this.actionContext));\n });\n }\n\n /**\n * Removes all promo code from the cart.\n * @param input - The input.\n * @param input.additionalProperties - Additional properties.\n * @returns The cart action result.\n */\n @action\n public removeAllPromoCodes(input: { additionalProperties?: object }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() => removeAllPromoCodesInternal(this.cart, this.actionContext));\n });\n }\n\n /**\n * Updates receipt email.\n * @param input - The input.\n * @param input.newEmail - The receipt email.\n * @param input.additionalProperties - Additional properties.\n * @returns The cart action result.\n */\n @action\n public async updateReceiptEmail(input: { newEmail: string; additionalProperties?: object }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() => updateReceiptEmail(this.cart, input.newEmail, this.actionContext));\n });\n }\n\n /**\n * Updates shipping address.\n * @param input - The input.\n * @param input.newShippingAddress - The shipping address.\n * @param input.additionalProperties - The additional properties.\n * @returns ICartActionResult.\n */\n @action\n public async updateShippingAddress(input: {\n newShippingAddress: Address;\n additionalProperties?: { [key: string]: unknown };\n }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(async () =>\n updateShippingAddress(this.cart, input.newShippingAddress, this.actionContext)\n );\n });\n }\n\n /**\n * Updates the attribute values.\n * @param input - The input.\n * @param input.newAttributeValues - The new attribute values to update.\n * @param input.additionalProperties - The additional properties.\n * @returns ICartActionResult.\n */\n @action\n public async updateAttributeValues(input: {\n newAttributeValues: AttributeValueBase[];\n additionalProperties?: object;\n }): Promise {\n this._attributeValues = input.newAttributeValues;\n const newCartObject: Cart = {\n Id: this.cart.Id,\n AttributeValues: input.newAttributeValues\n };\n return this.updateCart({ newCartObject });\n }\n\n /**\n * Updates the extension properties.\n * @param input - The input.\n * @param input.newExtensionProperties - The new extension properties.\n * @param input.additionalProperties - The additional properties.\n * @returns ICartActionResult.\n */\n @action\n public async updateExtensionProperties(input: {\n newExtensionProperties: CommerceProperty[];\n additionalProperties?: object;\n }): Promise {\n this._extensionProperties = input.newExtensionProperties;\n const newCartObject: Cart = {\n Id: this.cart.Id,\n ExtensionProperties: input.newExtensionProperties\n };\n return this.updateCart({ newCartObject });\n }\n\n /**\n * Updates cart object.\n * @param input - The input.\n * @param input.newCartObject - The new cart object.\n * @param input.additionalProperties - Additional properties.\n * @returns Promise of cart action result.\n */\n @action\n public async updateCart(input: { newCartObject: Cart; additionalProperties?: object }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() => updateCart(this.cart, input.newCartObject, this.actionContext));\n });\n }\n\n /**\n * Updates cartLines objects in cart.\n * @param input - The input.\n * @param input.updatedCartLinesObject - updated cartline.\n * @returns ICartActionResult.\n */\n @action\n public async updateCartLines(input: { updatedCartLinesObject: CartLine[] }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() =>\n updateCartLinesInternal(this.cart, input.updatedCartLinesObject, this.actionContext)\n );\n });\n }\n\n /**\n * Initialize function.\n */\n public async initialize(): Promise {\n if (this.isInitialized) {\n return;\n }\n\n const newCart = await getOrCreateActiveCart(this.actionContext);\n\n if (newCart) {\n this._cart = newCart;\n this._status = 'READY';\n } else {\n this._status = 'ERROR';\n }\n\n this.isInitialized = true;\n }\n\n /**\n * Validates inventory across cart lines.\n * @param callback - Callback function.\n * @returns ICartActionResult.\n */\n private async _doCartOperationWithRetry(callback: () => Promise): Promise {\n let callbackResult = await callback();\n\n if (callbackResult.status === 'SUCCESS') {\n if (callbackResult.cart) {\n this._cart = callbackResult.cart;\n }\n } else {\n const refreshCartResult = await this.refreshCart({});\n\n if (refreshCartResult.status === 'SUCCESS') {\n callbackResult = await callback();\n\n if (callbackResult.status === 'SUCCESS') {\n if (callbackResult.cart) {\n this._cart = callbackResult.cart;\n }\n }\n }\n }\n\n if (callbackResult.status === 'SUCCESS' && callbackResult.substatus && callbackResult.substatus === 'PRODUCTADDED') {\n this._isProductAddedToCart = true;\n } else {\n this._isProductAddedToCart = false;\n }\n\n return {\n status: callbackResult.status,\n substatus: callbackResult.substatus,\n errorDetails: callbackResult.errorDetails,\n validationResults: callbackResult.validationResults\n };\n }\n\n /**\n * Build address from org unit location.\n * @param location - The location.\n * @returns Address.\n */\n private _buildAddressFromOrgUnitLocation(location: OrgUnitLocation): Address {\n return {\n RecordId: location.PostalAddressId,\n Name: location.OrgUnitName,\n FullAddress: location.Address,\n Street: location.Street,\n StreetNumber: location.StreetNumber,\n City: location.City,\n DistrictName: location.DistrictName,\n BuildingCompliment: location.BuildingCompliment,\n Postbox: location.Postbox,\n ThreeLetterISORegionName: location.Country,\n ZipCode: location.Zip,\n County: location.County,\n CountyName: location.CountyName,\n State: location.State,\n StateName: location.StateName\n };\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { Cart, CartsDataActions, CommerceException } from '@msdyn365-commerce/retail-proxy';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function addInvoicesToCartInternal(\n cart: Readonly,\n invoiceIds: string[],\n actionContext: IActionContext\n): Promise {\n if (!invoiceIds || invoiceIds.length === 0) {\n actionContext.telemetry.trace('Invoice ids are empty, unable to add invoices to cart.');\n return { cart, status: 'FAILED', substatus: 'EMPTYINPUT' };\n }\n\n if (cart.Version) {\n return CartsDataActions.addInvoicesAsync({ callerContext: actionContext }, cart.Id, invoiceIds)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.trace(error);\n actionContext.telemetry.trace('Unable to add invoices to cart');\n\n // Error object comes from API and doesn't have type definitions yet.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- No type definition for error.\n const errorDetails: CommerceException = error.data;\n const errorResult: ICartActionResultWithCart = { cart: undefined, status: 'FAILED', errorDetails };\n return errorResult;\n });\n }\n actionContext.telemetry.warning('Unable to add invoices, Cart Version could not be found');\n\n return { cart: undefined, status: 'FAILED', substatus: 'NOCARTVERSION' };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { addOrderInvoiceAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function addOrderInvoiceToCartInternal(\n cart: Readonly,\n invoiceId: string,\n lineDescription: string,\n actionContext: IActionContext\n): Promise {\n if (!invoiceId || invoiceId === '') {\n actionContext.telemetry.trace('Invoice id is empty, unable to add invoice to cart.');\n return { cart, status: 'FAILED', substatus: 'EMPTYINPUT' };\n }\n\n if (cart.Version) {\n return addOrderInvoiceAsync({ callerContext: actionContext }, cart.Id, invoiceId, lineDescription)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.trace(error);\n actionContext.telemetry.trace('Unable to add order invoice to cart');\n\n const resultWithCart: ICartActionResultWithCart = {\n cart: undefined,\n status: 'FAILED',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n errorDetails: { LocalizedMessage: error.message }\n };\n\n return resultWithCart;\n });\n }\n actionContext.telemetry.warning('Unable to add order invoice, Cart Version could not be found');\n\n return { cart: undefined, status: 'FAILED', substatus: 'NOCARTVERSION' };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { updateAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function updateReceiptEmail(\n cart: Readonly,\n email: string,\n actionContext: IActionContext\n): Promise {\n if (!cart) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n return updateAsync(\n { callerContext: actionContext },\n {\n Id: cart.Id,\n ReceiptEmail: email\n }\n )\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to add receipt email to the cart');\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error.message } };\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { readAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nexport default async function refreshCart(cartId: string, ctx: IActionContext): Promise {\n return readAsync({ callerContext: ctx, bypassCache: 'get' }, cartId)\n .then(cart => {\n return cart;\n })\n .catch(error => {\n return undefined;\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { computed, observable } from 'mobx';\n\nimport { GlobalStateStatus, IGlobalState } from './i-global-state';\n\n/**\n * Base global state that handles common global state behavior that other state can extend from.\n */\nexport class GlobalState implements IGlobalState {\n protected isInitialized: boolean = false;\n\n protected actionContext: IActionContext;\n\n @observable protected _status: GlobalStateStatus;\n\n @computed public get status(): Readonly {\n return this._status;\n }\n\n constructor(actionContext: IActionContext) {\n this.actionContext = actionContext;\n this._status = 'UPDATING';\n }\n\n public async initialize(): Promise {\n this.isInitialized = true;\n this._status = 'READY';\n\n return;\n }\n\n protected async _doAsyncAction(lambda: () => Promise): Promise {\n this._status = 'UPDATING';\n\n return lambda()\n .then(result => {\n this._status = 'READY';\n return result;\n })\n .catch(error => {\n console.log(error);\n this._status = 'ERROR';\n\n return Promise.reject(error);\n });\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { addDiscountCodeAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart, Coupon } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function addPromoCode(\n cart: Readonly,\n promoCode: string,\n actionContext: IActionContext\n): Promise {\n if (!cart) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n if (hasPromoCode(cart, promoCode)) {\n return { cart: undefined, status: 'FAILED', substatus: 'ALREADYADDED' };\n }\n\n return addDiscountCodeAsync({ callerContext: actionContext }, cart.Id, promoCode)\n .then(newCart => {\n // Retail server will still return success if a promo code is not valid,\n // but it won't actually add that promo code. So need to check if promo\n // code is actually in the new cart\n if (hasPromoCode(newCart, promoCode)) {\n return { cart: newCart, status: 'SUCCESS' };\n }\n return { cart: undefined, status: 'FAILED', substatus: 'INVALIDPROMOCODE' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n const resultWithCart: ICartActionResultWithCart = {\n cart: undefined,\n status: 'FAILED',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n errorDetails: { LocalizedMessage: error.message }\n };\n\n return resultWithCart;\n });\n}\n\nfunction hasPromoCode(cart: Cart, code: string): boolean {\n const codes = cart.Coupons\n ? cart.Coupons.map((coupon: Coupon) => {\n return coupon.Code!.toLowerCase();\n })\n : [];\n return codes.includes(code.toLowerCase());\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { Cart, CartsDataActions } from '@msdyn365-commerce/retail-proxy';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\n/**\n * Sets price for the given cart line with an invoice. Used to complete partial invoice payments.\n * @param cart - Cart where the invoice is located.\n * @param cartLineId - The cart line with the invoice for which to update the price.\n * @param price - The new value of price of the invoice.\n * @param actionContext - The action context from SDK.\n * @returns Result of the operation with the details.\n */\nexport async function setInvoiceLinePriceInternal(\n cart: Readonly,\n cartLineId: string | null,\n price: number,\n actionContext: IActionContext\n): Promise {\n if (!cart.Version) {\n actionContext.telemetry.warning('Unable to set invoice line price, Cart Version could not be found');\n return { cart: undefined, status: 'FAILED', substatus: 'NOCARTVERSION' };\n }\n\n try {\n const newCart = await CartsDataActions.setInvoiceLinePriceAsync(\n { callerContext: actionContext },\n cart.Id,\n cartLineId,\n price,\n cart.Version\n );\n return { cart: newCart, status: 'SUCCESS' };\n } catch (error) {\n const errorInstance = error as Error;\n actionContext.telemetry.trace(error as string);\n actionContext.telemetry.trace('Unable to set invoice line price');\n\n return {\n cart: undefined,\n status: 'FAILED',\n errorDetails: { LocalizedMessage: errorInstance.message }\n };\n }\n}\n\nexport default setInvoiceLinePriceInternal;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { updateCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart, CartLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function clearCartLineDeliveryMode(\n cart: Readonly,\n cartLineId: string,\n actionContext: IActionContext\n): Promise {\n if (!cart || !cart.CartLines) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n const matchingLines = cart.CartLines.filter(cartLine => cartLine.LineId === cartLineId);\n\n if (matchingLines.length === 0) {\n return { cart: undefined, status: 'FAILED', substatus: 'NOMATCHEDCARTLINE' };\n }\n\n const copyCartLine: CartLine = { ...matchingLines[0] };\n\n copyCartLine.DeliveryMode = '';\n copyCartLine.FulfillmentStoreId = '';\n copyCartLine.ShippingAddress = {};\n copyCartLine.WarehouseId = actionContext.requestContext.channel?.InventLocation || cart.WarehouseId;\n\n return updateCartLinesAsync({ callerContext: actionContext }, cart.Id, [copyCartLine], null)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to Update Cart Line');\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error.message } };\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nexport * from './checkout-state-enums';\nexport * from './i-cart-state';\nexport * from './i-checkout-state';\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AsyncResult, IActionContext } from '@msdyn365-commerce/core';\n\nimport { BaseCartState } from '../cart-state/base-cart-state';\nimport { ICartState } from '../state-interfaces/i-cart-state';\nimport cartStateDataAction from './cart-state-data-action';\nimport { GlobalStateInput } from './global-state-data-action';\n\nexport function getCartState(ctx: IActionContext): AsyncResult {\n return cartStateDataAction(\n new GlobalStateInput('CARTSTATE', BaseCartState, ctx.requestContext.apiSettings, ctx.requestContext),\n ctx\n );\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nexport * from './cart-state';\nexport * from './checkout-state';\nexport * from './data-actions';\nexport * from './global-state';\nexport * from './state-interfaces';\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nexport enum ErrorCode {\n ActionError = 'ActionError',\n Microsoft_Dynamics_Commerce_Runtime_BlockedLoyaltyCard = 'Microsoft_Dynamics_Commerce_Runtime_BlockedLoyaltyCard',\n Microsoft_Dynamics_Commerce_Runtime_CustomerAccountLimitSignDifferentFromAmountDue = 'Microsoft_Dynamics_Commerce_Runtime_CustomerAccountLimitSignDifferentFromAmountDue',\n Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsAvailableCreditLimit = 'Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsAvailableCreditLimit',\n Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsCustomerAccountFloorLimit = 'Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsCustomerAccountFloorLimit',\n Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsTotalAmountForCarryOutAndReturnItems = 'Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentExceedsTotalAmountForCarryOutAndReturnItems',\n Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentForCustomerWithoutAllowOnAccount = 'Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentForCustomerWithoutAllowOnAccount',\n Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentNotAllowedForOpenInvoices = 'Microsoft_Dynamics_Commerce_Runtime_CustomerAccountPaymentNotAllowedForOpenInvoices',\n Microsoft_Dynamics_Commerce_Runtime_FraudRisk = 'Microsoft_Dynamics_Commerce_Runtime_FraudRisk',\n Microsoft_Dynamics_Commerce_Runtime_GiftCardBalanceInquiryFailed = 'Microsoft_Dynamics_Commerce_Runtime_GiftCardBalanceInquiryFailed',\n Microsoft_Dynamics_Commerce_Runtime_GiftCardCurrencyMismatch = 'Microsoft_Dynamics_Commerce_Runtime_GiftCardCurrencyMismatch',\n Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion = 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion',\n Microsoft_Dynamics_Commerce_Runtime_InvalidLoyaltyCardNumber = 'Microsoft_Dynamics_Commerce_Runtime_InvalidLoyaltyCardNumber',\n Microsoft_Dynamics_Commerce_Runtime_InvalidPaymentRequest = 'Microsoft_Dynamics_Commerce_Runtime_InvalidPaymentRequest',\n Microsoft_Dynamics_Commerce_Runtime_MissingRequiredCartTenderLines = 'Microsoft_Dynamics_Commerce_Runtime_MissingRequiredCartTenderLines',\n Microsoft_Dynamics_Commerce_Runtime_MultipleCustomerAccountPaymentsNotAllowed = ' Microsoft_Dynamics_Commerce_Runtime_MultipleCustomerAccountPaymentsNotAllowed',\n Microsoft_Dynamics_Commerce_Runtime_NoMoreThanOneLoyaltyTender = 'Microsoft_Dynamics_Commerce_Runtime_NoMoreThanOneLoyaltyTender',\n Microsoft_Dynamics_Commerce_Runtime_NoResponseFromGatewayForGiftCardBalanceInquiry = 'Microsoft_Dynamics_Commerce_Runtime_NoResponseFromGatewayForGiftCardBalanceInquiry',\n Microsoft_Dynamics_Commerce_Runtime_NoTenderLoyaltyCard = 'Microsoft_Dynamics_Commerce_Runtime_NoTenderLoyaltyCard',\n Microsoft_Dynamics_Commerce_Runtime_NotEnoughRewardPoints = 'Microsoft_Dynamics_Commerce_Runtime_NotEnoughRewardPoints',\n Microsoft_Dynamics_Commerce_Runtime_PaymentAlreadyVoided = 'Microsoft_Dynamics_Commerce_Runtime_PaymentAlreadyVoided',\n Microsoft_Dynamics_Commerce_Runtime_PaymentAmountExceedsGiftBalance = 'Microsoft_Dynamics_Commerce_Runtime_PaymentAmountExceedsGiftBalance',\n Microsoft_Dynamics_Commerce_Runtime_PaymentRequiresMerchantProperties = 'Microsoft_Dynamics_Commerce_Runtime_PaymentRequiresMerchantProperties',\n Microsoft_Dynamics_Commerce_Runtime_PaymentUsingUnauthorizedAccount = 'Microsoft_Dynamics_Commerce_Runtime_PaymentUsingUnauthorizedAccount',\n Microsoft_Dynamics_Commerce_Runtime_RefundAmountMoreThanAllowed = 'Microsoft_Dynamics_Commerce_Runtime_RefundAmountMoreThanAllowed',\n Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePayment = 'Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePayment',\n Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePaymentCardAdditionalContextRequired = 'Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePaymentCardAdditionalContextRequired',\n Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePaymentCardTypeMissingOrNotSupported = 'Microsoft_Dynamics_Commerce_Runtime_UnableToAuthorizePaymentCardTypeMissingOrNotSupported',\n Microsoft_Dynamics_Commerce_Runtime_UnableToCancelPayment = 'Microsoft_Dynamics_Commerce_Runtime_UnableToCancelPayment',\n Microsoft_Dynamics_Commerce_Runtime_UnableToReadCardTokenInfo = 'Microsoft_Dynamics_Commerce_Runtime_UnableToReadCardTokenInfo',\n Microsoft_Dynamics_Commerce_Runtime_UnableToRetrieveCardPaymentAcceptResult = 'Microsoft_Dynamics_Commerce_Runtime_UnableToRetrieveCardPaymentAcceptResult'\n}\n\nexport enum ErrorMessageResource {\n blockedLoyaltyCardErrorMessage = 'blockedLoyaltyCardErrorMessage',\n checkoutTimeoutErrorMessage = 'checkoutTimeoutErrorMessage',\n customerAccountLimitSignDifferentFromAmountDueErrorMessage = 'customerAccountLimitSignDifferentFromAmountDueErrorMessage',\n customerAccountPaymentExceedsAvailableCreditLimitErrorMessage = 'customerAccountPaymentExceedsAvailableCreditLimitErrorMessage',\n customerAccountPaymentExceedsCustomerAccountFloorLimitErrorMessage = 'customerAccountPaymentExceedsCustomerAccountFloorLimitErrorMessage',\n customerAccountPaymentExceedsTotalAmountForCarryOutAndReturnItemsErrorMessage = 'customerAccountPaymentExceedsTotalAmountForCarryOutAndReturnItemsErrorMessage',\n customerAccountPaymentForCustomerWithoutAllowOnAccountErrorMessage = 'customerAccountPaymentForCustomerWithoutAllowOnAccountErrorMessage',\n customerAccountPaymentNotAllowedForOpenInvoicesErrorMessage = 'customerAccountPaymentNotAllowedForOpenInvoicesErrorMessage',\n fraudRiskErrorMessage = 'fraudRiskErrorMessage',\n giftCardBalanceInquiryFailedErrorMessage = 'giftCardBalanceInquiryFailedErrorMessage',\n giftCardCurrencyMismatchErrorMessage = 'giftCardCurrencyMismatchErrorMessage',\n invalidCartVersionErrorMessage = 'invalidCartVersionErrorMessage',\n invalidLoyaltyCardNumberErrorMessage = 'invalidLoyaltyCardNumberErrorMessage',\n invalidPaymentRequestConsoleErrorMessage = 'invalidPaymentRequestConsoleErrorMessage',\n invalidPaymentRequestErrorMessage = 'invalidPaymentRequestErrorMessage',\n missingRequiredCartTenderLinesErrorMessage = 'missingRequiredCartTenderLinesErrorMessage',\n multipleCustomerAccountPaymentsNotAllowedErrorMessage = 'multipleCustomerAccountPaymentsNotAllowedErrorMessage',\n noMoreThanOneLoyaltyTenderErrorMessage = 'noMoreThanOneLoyaltyTenderErrorMessage',\n noResponseFromGatewayForGiftCardBalanceInquiryErrorMessage = 'noResponseFromGatewayForGiftCardBalanceInquiryErrorMessage',\n noTenderLoyaltyCardErrorMessage = 'noTenderLoyaltyCardErrorMessage',\n notEnoughRewardPointsErrorMessage = 'notEnoughRewardPointsErrorMessage',\n paymentAlreadyVoidedErrorMessage = 'paymentAlreadyVoidedErrorMessage',\n paymentAmountExceedsGiftBalanceErrorMessage = 'paymentAmountExceedsGiftBalanceErrorMessage',\n paymentRequiresMerchantPropertiesConsoleErrorMessage = 'paymentRequiresMerchantPropertiesConsoleErrorMessage',\n paymentRequiresMerchantPropertiesErrorMessage = 'paymentRequiresMerchantPropertiesErrorMessage',\n paymentUsingUnauthorizedAccountErrorMessage = 'paymentUsingUnauthorizedAccountErrorMessage',\n refundAmountMoreThanAllowedErrorMessage = 'refundAmountMoreThanAllowedErrorMessage',\n unableToAuthorizePaymentCardAdditionalContextRequiredErrorMessage = 'unableToAuthorizePaymentCardAdditionalContextRequiredErrorMessage',\n unableToAuthorizePaymentCardTypeMissingOrNotSupportedErrorMessage = 'unableToAuthorizePaymentCardTypeMissingOrNotSupportedErrorMessage',\n unableToAuthorizePaymentErrorMessage = 'unableToAuthorizePaymentErrorMessage',\n unableToCancelPaymentErrorMessage = 'unableToCancelPaymentErrorMessage',\n unableToReadCardTokenInfoErrorMessage = 'unableToReadCardTokenInfoErrorMessage',\n unableToRetrieveCardPaymentAcceptResultErrorMessage = 'unableToRetrieveCardPaymentAcceptResultErrorMessage'\n}\n\nexport enum ErrorLocation {\n Checkout,\n CheckoutBillingAddress,\n CheckoutCustomerAccountPayment,\n CheckoutDeliveryOptions,\n CheckoutExpress,\n CheckoutGiftCard,\n CheckoutGuestProfile,\n CheckoutLoyalty,\n CheckoutPaymentInstrument,\n CheckoutPickup,\n CheckoutShippingAddress,\n CheckoutTermsAndConditions,\n Console,\n GiftCardBalanceCheck\n}\n\nexport enum CheckoutModule {\n CheckoutBillingAddress = 'checkout-billing-address',\n CheckoutCustomerAccountPayment = 'checkout-customer-account-payment',\n CheckoutDeliveryOptions = 'checkout-delivery-options',\n CheckoutExpress = 'checkout-express',\n CheckoutGiftCard = 'checkout-gift-card',\n CheckoutGuestProfile = 'checkout-guest-profile',\n CheckoutLoyalty = 'checkout-loyalty',\n CheckoutPaymentInstrument = 'checkout-payment-instrument',\n CheckoutPickup = 'checkout-pickup',\n CheckoutShippingAddress = 'checkout-shipping-address',\n CheckoutTermsAndConditions = 'checkout-terms-and-conditions',\n None = 'none'\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { updateCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart, CartLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function updateCartLineQuantityInternal(\n cart: Readonly,\n cartLineId: string,\n newQuantity: number,\n actionContext: IActionContext,\n isUsingDefaultOrderSettingsMax: boolean\n): Promise {\n if (isUsingDefaultOrderSettingsMax) {\n return updateCartLineQuantityValidateMaxAgainstDefaultOrderSettings(cart, cartLineId, newQuantity, actionContext);\n }\n return updateCartLineQuantityValidateMaxAgainstSiteSettings(cart, cartLineId, newQuantity, actionContext);\n}\nasync function updateCartLineQuantityValidateMaxAgainstDefaultOrderSettings(\n cart: Readonly,\n cartLineId: string,\n newQuantity: number,\n actionContext: IActionContext\n): Promise {\n if (!cart || !cart.CartLines) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n const matchingLines = cart.CartLines.filter(cartLine => cartLine.LineId === cartLineId);\n\n if (matchingLines.length === 0) {\n return { cart: undefined, status: 'FAILED', substatus: 'NOMATCHEDCARTLINE' };\n }\n\n const copyCartLine: CartLine = { ...matchingLines[0] };\n\n copyCartLine.Quantity = newQuantity;\n\n return updateCartLinesAsync({ callerContext: actionContext }, cart.Id, [copyCartLine], null)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n let cartActionResult: ICartActionResultWithCart;\n\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to Update Cart Line');\n if (\n error.name === 'Microsoft_Dynamics_Commerce_Runtime_AddingItem_ExceedsMaximumQuantity' ||\n error.name === 'Microsoft_Dynamics_Commerce_Runtime_UpdatingItem_ExceedsMaximumQuantity'\n ) {\n cartActionResult = {\n cart: undefined,\n status: 'FAILED',\n substatus: 'QUANTITYLIMITS',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n errorDetails: { LocalizedMessage: error.message },\n validationResults: error.data?.ValidationResults\n };\n return cartActionResult;\n }\n\n cartActionResult = {\n cart: undefined,\n status: 'FAILED',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n errorDetails: { LocalizedMessage: error.message },\n validationResults: error.data?.ValidationResults\n };\n return cartActionResult;\n });\n}\n\nasync function updateCartLineQuantityValidateMaxAgainstSiteSettings(\n cart: Readonly,\n cartLineId: string,\n newQuantity: number,\n actionContext: IActionContext\n): Promise {\n if (!cart || !cart.CartLines) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n const matchingLines = cart.CartLines.filter(cartLine => cartLine.LineId === cartLineId);\n\n if (matchingLines.length === 0) {\n return { cart: undefined, status: 'FAILED', substatus: 'NOMATCHEDCARTLINE' };\n }\n\n const copyCartLine: CartLine = { ...matchingLines[0] };\n copyCartLine.Quantity = Math.min(newQuantity, actionContext.requestContext.app.config.maxQuantityForCartLineItem || 10);\n\n return updateCartLinesAsync({ callerContext: actionContext }, cart.Id, [copyCartLine], null)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to Update Cart Line');\n return {\n cart: undefined,\n status: 'FAILED',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n errorDetails: { LocalizedMessage: error.message },\n validationResults: error.data?.ValidationResults\n };\n });\n}\n"],"sourceRoot":""}