{"version":3,"file":"static/js/de2b4b24f6b5ac6f8076.bundle.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/themes/moekwrsitetheme/views/components/addtocart.component.tsx?19ff","webpack://Msdyn365.Commerce.Online/./src/themes/moenzcsitetheme/views/components/addtocart.component.tsx?3dc1","webpack://Msdyn365.Commerce.Online/./src/themes/moetwksitetheme/views/components/addtocart.component.tsx?50f1"],"sourcesContent":["/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport MsDyn365, {\r\n IComponent,\r\n IComponentProps,\r\n IGridSettings,\r\n IImageSettings,\r\n msdyn365Commerce,\r\n TelemetryEvent\r\n} from '@msdyn365-commerce/core';\r\nimport { getCartState, ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\r\nimport {\r\n CartLine,\r\n CartLineValidationResults,\r\n CartsDataActions,\r\n format,\r\n ProductAvailableQuantity,\r\n ProductDimension,\r\n ProductPrice,\r\n ProductsDataActions,\r\n ProductSearchCriteria,\r\n ProductType,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { ErrorNotification, NotificationsManager } from '@msdyn365-commerce-modules/notifications-core';\r\nimport { ArrayExtensions, generateProductImageUrl, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, IPopupProps, ITelemetryContent, Popup } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport React, { useState } from 'react';\r\n\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { IItemsAddedToCartResources } from '@msdyn365-commerce/components';\r\nimport { ItemsAddedToCartDialogComponent } from '@msdyn365-commerce/components';\r\nimport { ItemSuccessfullyAddedToCartNotification } from '@msdyn365-commerce/components';\r\nimport { MultiItemsSuccessfullyAddedToCartNotification } from '@msdyn365-commerce/components';\r\nimport { OrderDetailsProduct } from '@msdyn365-commerce/components';\r\nimport { updateCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\n// import { ToastContainer, toast } from 'react-toastify';\r\nimport 'react-toastify/dist/ReactToastify.css';\r\n// import { getArtifactsByItemAsync } from '../../../../actions/extensions/DataActionExtension.g';\r\n\r\n/**\r\n * Interface for add to cart resources.\r\n */\r\nexport interface IAddToCartResources {\r\n goToCartText: string;\r\n continueShoppingText: string;\r\n closeNotificationLabel: string;\r\n headerItemOneText: string;\r\n headerItemFormatText: string;\r\n headerLinesFormatText?: string;\r\n headerMessageText: string;\r\n freePriceText: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n addedQuantityText: string;\r\n buyAgainNotificationTitle?: string;\r\n buyAgainNotificationCloseAriaLabel?: string;\r\n validationErrorMessage?: string;\r\n oneErrorText?: string;\r\n multiErrorsText?: string;\r\n}\r\n\r\n/**\r\n * Interface for add to cart components props.\r\n */\r\nexport interface IAddToCartComponentProps extends IComponentProps<{ product: SimpleProduct; price?: ProductPrice } | undefined> {\r\n className?: string;\r\n addToCartText: string;\r\n outOfStockText?: string;\r\n disabled?: boolean;\r\n quantity?: number;\r\n navigationUrl?: string;\r\n productAvailability?: ProductAvailableQuantity;\r\n getSelectedProduct?: Promise;\r\n isNavigationToCartPageDisabled?: boolean;\r\n shouldSkipSiteSettings?: boolean;\r\n addToCartArialLabel?: string;\r\n products?: { productId: number; quantity: number }[];\r\n orderDetailsProducts?: OrderDetailsProduct[];\r\n hasAvailableProducts?: boolean;\r\n imageSettings?: IImageSettings;\r\n gridSettings?: IGridSettings;\r\n\r\n isLoading?: boolean;\r\n isUpdatingDimension?: boolean;\r\n isLoadingDeliveryOptions?: boolean;\r\n isUpdatingDeliveryOptions?: boolean;\r\n isAddServiceItemToCart?: boolean;\r\n isAddEmailDeliveryItemToCart?: boolean;\r\n isPriceKeyedIn?: boolean;\r\n customPriceAmount?: number;\r\n isOrderQuantityLimitsFeatureEnabled?: boolean;\r\n\r\n dialogStrings?: IAddToCartResources;\r\n\r\n telemetryContent?: ITelemetryContent;\r\n\r\n isCustomPriceSelected?: boolean;\r\n maximumKeyInPrice?: number;\r\n minimumKeyInPrice?: number;\r\n defaultMaximumKeyInPrice?: number;\r\n defaultMinimumKeyInPrice?: number;\r\n isProductQuantityLoading?: boolean;\r\n artifactsData?: any;\r\n resourcePageURL?: string;\r\n isEdit?: boolean;\r\n cartLineID?: string;\r\n productUrl?: string;\r\n\r\n onAdd?(result: ICartActionResult): void;\r\n onError?(result: IAddToCartFailureResult): void;\r\n changeUpdatingDimension?(isUpdatingDimension: boolean): void;\r\n changeUpdatingDeliveryOptions?(isUpdatingDeliveryOptions: boolean): void;\r\n}\r\n\r\n/**\r\n * Cart action Failure reason type.\r\n */\r\nexport declare type ICartActionFailureReason =\r\n | 'EMPTYINPUT'\r\n | 'MISSINGDIMENSION'\r\n | 'OUTOFSTOCK'\r\n | 'CARTACTIONFAILED'\r\n | 'INVALIDCUSTOMAMOUNT';\r\n\r\n/**\r\n * Interface for add to cart failure result.\r\n */\r\nexport interface IAddToCartFailureResult {\r\n failureReason: ICartActionFailureReason;\r\n\r\n stockLeft?: number;\r\n cartActionResult?: ICartActionResult;\r\n missingDimensions?: ProductDimension[];\r\n}\r\n\r\n/**\r\n * This setting defines the experience when a product is added to cart. Corresponds to the configuration in Fabrikam.\r\n */\r\nexport enum AddToCartBehavior {\r\n /**\r\n * Navigate to cart page.\r\n */\r\n goToCart = 'goToCart',\r\n\r\n /**\r\n * Show item added to cart popup.\r\n */\r\n showModal = 'showModal',\r\n\r\n /**\r\n * Show mini cart popup.\r\n */\r\n showMiniCart = 'showMiniCart',\r\n\r\n /**\r\n * Show item added to cart notification.\r\n */\r\n showNotification = 'showNotification',\r\n\r\n /**\r\n * Do nothing and stay on the page.\r\n */\r\n nothing = 'nothing'\r\n}\r\n\r\nconst zero = 0;\r\nconst defaultQuantity = 1;\r\n\r\n/**\r\n * The propagate result.\r\n * @param props -- The add to cart component props.\r\n * @param result -- The cart action result.\r\n */\r\nconst propagateResult = (props: IAddToCartComponentProps, result: ICartActionResult): void => {\r\n if (props.onAdd) {\r\n props.onAdd(result);\r\n }\r\n};\r\n\r\n/**\r\n * The propagate error.\r\n * @param props -- The add to cart component props.\r\n * @param result -- The add to cart failure result.\r\n */\r\nconst propagateError = (props: IAddToCartComponentProps, result: IAddToCartFailureResult): void => {\r\n if (props.onError) {\r\n props.onError(result);\r\n }\r\n};\r\n\r\n/**\r\n * Retrieves add to cart input from the component props.\r\n * @param props - Add to cart component props.\r\n * @returns Add to cart input.\r\n */\r\nconst getAddToCartInputFromProps = async (props: IAddToCartComponentProps) => {\r\n const products = props.orderDetailsProducts?.filter(product => !ObjectExtensions.isNullOrUndefined(product.simpleProduct));\r\n const input = products?.map(product => {\r\n return {\r\n product: product.simpleProduct!,\r\n count: ObjectExtensions.isNullOrUndefined(product.salesLine.Quantity) ? defaultQuantity : product.salesLine.Quantity\r\n };\r\n });\r\n\r\n if (ArrayExtensions.hasElements(input)) {\r\n return input;\r\n }\r\n\r\n if (ArrayExtensions.hasElements(props.products)) {\r\n const actionContext = props.context.actionContext;\r\n const apiSettings = actionContext.requestContext.apiSettings;\r\n\r\n const searchCriteriaInput: ProductSearchCriteria = {\r\n Context: {\r\n ChannelId: apiSettings.channelId,\r\n CatalogId: apiSettings.catalogId\r\n },\r\n IncludeAttributes: false,\r\n Ids: props.products.map(product => product.productId)\r\n };\r\n\r\n const searchResult = await ProductsDataActions.searchByCriteriaAsync({ callerContext: actionContext }, searchCriteriaInput);\r\n const productSearchResultsWithImages = searchResult.map(productSearchResult => {\r\n const newProductSearchResult = { ...productSearchResult };\r\n const newImageUrl = generateProductImageUrl(newProductSearchResult, apiSettings);\r\n\r\n if (newImageUrl) {\r\n newProductSearchResult.PrimaryImageUrl = newImageUrl;\r\n }\r\n\r\n return newProductSearchResult;\r\n });\r\n\r\n return props.products.map(item => {\r\n const productData = productSearchResultsWithImages.find(product => product.RecordId === item.productId);\r\n let simpleProduct: SimpleProduct;\r\n if (productData) {\r\n simpleProduct = {\r\n ...productData,\r\n ProductTypeValue: ProductType.Variant,\r\n AdjustedPrice: productData.Price,\r\n BasePrice: productData.BasePrice ?? productData.Price\r\n };\r\n } else {\r\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Cast to simple product since only record id is available.\r\n simpleProduct = {\r\n RecordId: item.productId\r\n } as SimpleProduct;\r\n }\r\n\r\n return {\r\n product: simpleProduct,\r\n count: item.quantity\r\n };\r\n });\r\n }\r\n\r\n if (props.data?.product) {\r\n return [\r\n {\r\n product: props.data.product,\r\n count: props.quantity ?? defaultQuantity\r\n }\r\n ];\r\n }\r\n\r\n return [];\r\n};\r\n\r\n/**\r\n * Add one item to cart when it is not buy again.\r\n * @param props -- The props.\r\n * @param setDisabled -- The set disable call back.\r\n * @param openModal -- The open modal call back.\r\n */\r\nconst addOneItemToCart = async (\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n openModal: (opened: boolean) => void\r\n): Promise => {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n const addToCartBehavior = props.context.app.config.addToCartBehavior;\r\n const data = props.data;\r\n\r\n const addToCartInput = await getAddToCartInputFromProps(props);\r\n const product = addToCartInput[0].product;\r\n // Count can be changed in future\r\n const quantity = addToCartInput[0].count;\r\n\r\n console.log('Add single item to cart', addToCartInput);\r\n\r\n // const context: any = { callerContext: props.context.actionContext };\r\n // const artifactDataActionResult = await getArtifactsByItemAsync(context, 'NZH10');\r\n // console.log(artifactDataActionResult);\r\n\r\n const artifact = props.artifactsData;\r\n const resourcePageURL = props.resourcePageURL;\r\n\r\n // const artifact = {\r\n // ItemId: 'NZH30',\r\n // artifacts: [\r\n // {\r\n // artifactName: '123',\r\n // artifactId: 123,\r\n // artifactUrl: '123',\r\n // artifactType: 'pdf'\r\n // }\r\n // ]\r\n // };\r\n\r\n console.log('artifact data inside add to cart component: ', artifact);\r\n\r\n const cartState = await getCartState(props.context.actionContext);\r\n\r\n if (props.isEdit === true && props.cartLineID) {\r\n const input = {\r\n cartLineIds: [props.cartLineID]\r\n };\r\n await cartState.removeCartLines(input).catch(error => {\r\n console.log('Unable to Remove Cart Line');\r\n });\r\n }\r\n\r\n console.log('Cart State', cartState);\r\n let addToCartResult: any;\r\n const matchingCartLines = cartState?.cart?.CartLines?.filter(cartLine => cartLine.ItemId === product.ItemId);\r\n\r\n if (matchingCartLines?.length! <= 0) {\r\n addToCartResult = await cartState.addProductToCart({\r\n product,\r\n count: quantity,\r\n availableQuantity: props.productAvailability?.AvailableQuantity,\r\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: props.isOrderQuantityLimitsFeatureEnabled },\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n enableStockCheck: props.context.app.config.enableStockCheck,\r\n isPriceKeyedIn: props.isPriceKeyedIn,\r\n customPrice: props.customPriceAmount,\r\n isAddEmailDeliveryItemToCart: props.isAddEmailDeliveryItemToCart,\r\n shouldSkipSiteSettings: props.shouldSkipSiteSettings\r\n });\r\n } else {\r\n NotificationsManager.instance().addNotification(new ErrorNotification('Item already Added to cart', ''));\r\n propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: undefined });\r\n setDisabled(false);\r\n return;\r\n }\r\n\r\n // update cart extension properties using below method\r\n // await cartState.updateExtensionProperties({\r\n // newExtensionProperties: [{ Key: 'art001', Value: { StringValue: 'Lesson1.pdf' } }],\r\n // additionalProperties: {}\r\n // });\r\n\r\n console.log('Add to cart result', addToCartResult);\r\n\r\n if (addToCartResult?.status === 'SUCCESS') {\r\n const cartState = await getCartState(props.context.actionContext);\r\n console.log('Cart State after success', cartState);\r\n const cartLines = cartState?.cart?.CartLines;\r\n console.log('Cart Lines after success', cartLines);\r\n\r\n let cartId: string | undefined = cartState.cart.Id;\r\n //@ts-ignore\r\n const matchingLines = cartLines.filter(cartLine => cartLine.ItemId === product.ItemId);\r\n\r\n const copyCartLine: CartLine = { ...matchingLines[0] };\r\n\r\n copyCartLine.ExtensionProperties = [\r\n { Key: 'SelectedArtifacts', Value: { StringValue: JSON.stringify(artifact) } },\r\n { Key: 'ResourcePageURL', Value: { StringValue: resourcePageURL } },\r\n { Key: 'ProductURL', Value: { StringValue: props.productUrl } }\r\n ];\r\n\r\n console.log('Cart ID after success', cartId);\r\n console.log('Cart cartlines after success', copyCartLine);\r\n\r\n // update cartline extension properties using below method\r\n const updatedCartLinesResult = await updateCartLinesAsync(props.context.actionContext as any, cartId, [copyCartLine] as any);\r\n console.log('Cartline result after success', updatedCartLinesResult);\r\n const refreshCart = await cartState.refreshCart({});\r\n console.log('Refresh cart', refreshCart);\r\n\r\n if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showModal) {\r\n setDisabled(false);\r\n openModal(true);\r\n } else if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showNotification) {\r\n setDisabled(false);\r\n const notification = new ItemSuccessfullyAddedToCartNotification(\r\n props.context,\r\n props.dialogStrings,\r\n props.imageSettings,\r\n props.gridSettings,\r\n product,\r\n data?.price,\r\n quantity,\r\n props.navigationUrl,\r\n props.telemetryContent!,\r\n props.id,\r\n props.typeName\r\n );\r\n NotificationsManager.instance().addNotification(notification);\r\n } else if (\r\n MsDyn365.isBrowser &&\r\n props.navigationUrl &&\r\n !props.isNavigationToCartPageDisabled &&\r\n (addToCartBehavior === undefined || addToCartBehavior === AddToCartBehavior.goToCart)\r\n ) {\r\n window.location.assign(props.navigationUrl);\r\n } else {\r\n setDisabled(false);\r\n }\r\n propagateResult(props, addToCartResult);\r\n } else {\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n addToCartResult?.errorDetails?.LocalizedMessage ?? 'Add to cart failed',\r\n props.dialogStrings?.closeNotificationLabel ?? ''\r\n )\r\n );\r\n\r\n propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: addToCartResult });\r\n setDisabled(false);\r\n }\r\n};\r\n\r\n/**\r\n * Callback to handle success of adding to cart.\r\n * @param props - Add to cart component props.\r\n * @param setDisabled - Callback to update disabled state of the component.\r\n * @param setItemsAddedToCartDialogOpen - Callback to update disabled state of the component.\r\n * @param setErrorMessage - Callback to update error message state of the component.\r\n * @param cartState - Current cart state.\r\n * @param addToCartInput - Input used for adding to cart.\r\n * @param addToCartResult - Result of adding to cart.\r\n */\r\nconst handleAddItemsToCartSuccess = async (\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\r\n setErrorMessage: (message: string) => void,\r\n cartState: ICartState,\r\n addToCartInput: {\r\n product: SimpleProduct;\r\n count: number;\r\n }[],\r\n addToCartResult: ICartActionResult\r\n) => {\r\n // Validate cart for line errors.\r\n const validationResult: CartLineValidationResults = await CartsDataActions.validateForCheckoutAsync(\r\n { callerContext: props.context.actionContext, bypassCache: 'none' },\r\n cartState.cart.Id,\r\n cartState.cart.Version\r\n );\r\n const errorCount = (validationResult.ValidationFailuresByCartLines ?? []).length;\r\n const singleErrorCount = 1;\r\n const errorText = errorCount === singleErrorCount ? props.dialogStrings?.oneErrorText : props.dialogStrings?.multiErrorsText;\r\n const errorMessage =\r\n errorCount > zero ? format(props.dialogStrings?.validationErrorMessage ?? '', errorCount.toString(), errorText) : '';\r\n\r\n setErrorMessage(errorMessage);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n const addToCartBehavior = props.context.app.config.addToCartBehavior;\r\n\r\n if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showModal) {\r\n setDisabled(false);\r\n setItemsAddedToCartDialogOpen(true);\r\n } else if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showNotification) {\r\n setDisabled(false);\r\n const itemsAddedResource: IItemsAddedToCartResources = {\r\n viewCartButtonText: props.dialogStrings.goToCartText,\r\n closeButtonLabel: props.dialogStrings.closeNotificationLabel,\r\n itemsAddedToCartHeaderText: props.dialogStrings.headerMessageText,\r\n itemsAddedToCartFormatText: props.dialogStrings.headerItemFormatText,\r\n linesAddedToCartFormatText: props.dialogStrings.headerLinesFormatText ?? '{0}',\r\n itemsAddedValidationErrorMessage: errorMessage\r\n };\r\n\r\n const notification = new MultiItemsSuccessfullyAddedToCartNotification(\r\n props.context,\r\n itemsAddedResource,\r\n props.imageSettings,\r\n props.gridSettings,\r\n addToCartInput,\r\n props.navigationUrl,\r\n props.telemetryContent!,\r\n props.id,\r\n props.typeName\r\n );\r\n NotificationsManager.instance().addNotification(notification);\r\n } else if (\r\n MsDyn365.isBrowser &&\r\n props.navigationUrl &&\r\n !props.isNavigationToCartPageDisabled &&\r\n (addToCartBehavior === undefined || addToCartBehavior === AddToCartBehavior.goToCart)\r\n ) {\r\n window.location.assign(props.navigationUrl);\r\n } else {\r\n setDisabled(false);\r\n }\r\n propagateResult(props, addToCartResult);\r\n};\r\n\r\n/**\r\n * Add one or multi item to cart from buy again.\r\n * @param props -- The props.\r\n * @param setDisabled -- The set disable call back.\r\n * @param setItemsAddedToCartDialogOpen -- The open modal call back.\r\n * @param setErrorMessage -- The set error message call back.\r\n */\r\nconst addItemsToCart = async (\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\r\n setErrorMessage: (message: string) => void\r\n): Promise => {\r\n const addToCartInput = await getAddToCartInputFromProps(props);\r\n\r\n if (!ArrayExtensions.hasElements(addToCartInput)) {\r\n return;\r\n }\r\n\r\n console.log('Add items to cart', addToCartInput);\r\n\r\n const cartState = await getCartState(props.context.actionContext);\r\n const addToCartResult = await cartState.addProductsToCart(addToCartInput);\r\n\r\n if (addToCartResult.status === 'SUCCESS') {\r\n await handleAddItemsToCartSuccess(\r\n props,\r\n setDisabled,\r\n setItemsAddedToCartDialogOpen,\r\n setErrorMessage,\r\n cartState,\r\n addToCartInput,\r\n addToCartResult\r\n );\r\n } else {\r\n if (props.dialogStrings?.buyAgainNotificationTitle) {\r\n // For buy again show simple error notification.\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n props.dialogStrings.buyAgainNotificationTitle,\r\n props.dialogStrings.buyAgainNotificationCloseAriaLabel ?? ''\r\n )\r\n );\r\n } else {\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n addToCartResult.errorDetails?.LocalizedMessage ?? 'Add to cart failed',\r\n props.dialogStrings?.closeNotificationLabel ?? ''\r\n )\r\n );\r\n }\r\n\r\n propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: addToCartResult });\r\n setDisabled(false);\r\n }\r\n};\r\n\r\n/**\r\n * Interface for add to cart component.\r\n */\r\nexport interface IAddtoCartComponent extends IComponent {\r\n onClick(): (event: React.MouseEvent, props: IAddToCartComponentProps) => void;\r\n}\r\n\r\n/**\r\n * On click function.\r\n * @param _event - The mouse event.\r\n * @param props - The props.\r\n * @param setDisabled - Flag to define whether the element is disabled.\r\n * @param openModal - Flag to specify if it should open in a modal window.\r\n * @param setItemsAddedToCartDialogOpen - Sets items added to cart while dialog is open.\r\n * @param setErrorMessage - Error message.\r\n */\r\nconst onClick = async (\r\n _event: React.MouseEvent,\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n openModal: (opened: boolean) => void,\r\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\r\n setErrorMessage: (message: string) => void\r\n): Promise => {\r\n if (!ArrayExtensions.hasElements(props.products)) {\r\n const cartError = addToCartError(props);\r\n\r\n if (cartError) {\r\n propagateError(props, cartError);\r\n return;\r\n }\r\n\r\n setDisabled(true);\r\n }\r\n\r\n const hasOrderDetailsProducts =\r\n ArrayExtensions.hasElements(props.orderDetailsProducts) && props.orderDetailsProducts.length > defaultQuantity;\r\n const hasProducts = ArrayExtensions.hasElements(props.products) && props.products.length > defaultQuantity;\r\n\r\n const hasMultipleProducts = hasOrderDetailsProducts || hasProducts;\r\n\r\n if (props.shouldSkipSiteSettings && hasMultipleProducts) {\r\n await addItemsToCart(props, setDisabled, setItemsAddedToCartDialogOpen, setErrorMessage);\r\n } else {\r\n await addOneItemToCart(props, setDisabled, openModal);\r\n }\r\n};\r\n\r\n/**\r\n * Add to cart component action constant.\r\n */\r\nconst AddToCartComponentActions = {\r\n onClick\r\n};\r\n\r\n/**\r\n * Add to cart component.\r\n * @param props - The props.\r\n * @returns - The add to cart component.\r\n */\r\nexport const AddToCartFunctionalComponent: React.FC = (props: IAddToCartComponentProps) => {\r\n const [disabled, setDisabled] = useState(false);\r\n const [modalOpen, setModalOpen] = useState(false);\r\n const [isItemsAddedToCartDialogOpen, setItemsAddedToCartDialogOpen] = useState(false);\r\n const [errorMessage, setErrorMessage] = useState('');\r\n const [addToCartInput, setAddToCartInput] = useState<\r\n {\r\n product: SimpleProduct;\r\n count: number;\r\n }[]\r\n >([]);\r\n\r\n const onClickHandler = async (event: React.MouseEvent) => {\r\n await AddToCartComponentActions.onClick(event, props, setDisabled, setModalOpen, setItemsAddedToCartDialogOpen, setErrorMessage);\r\n // let close: HTMLElement = document.getElementsByClassName('msc-modal__close-button')[0] as HTMLElement;\r\n var quickviewDiv = document.querySelector('.ms-quickView__dialog');\r\n var closeButton = quickviewDiv?.querySelector('.msc-modal__close-button') as HTMLElement;\r\n closeButton.click();\r\n };\r\n\r\n /**\r\n * Close dialog.\r\n */\r\n const closeItemsAddedToCartDialog = React.useCallback(() => {\r\n setItemsAddedToCartDialogOpen(false);\r\n }, []);\r\n\r\n const priceComponent = props.data?.price ? (\r\n \r\n ) : (\r\n ''\r\n );\r\n\r\n const popupProps: IPopupProps = {\r\n context: props.context,\r\n className: 'msc-add-to-cart',\r\n id: props.id,\r\n typeName: props.typeName,\r\n data: { product: props.data?.product, price: props.data?.price },\r\n dialogStrings: props.dialogStrings,\r\n imageSettings: props.imageSettings,\r\n gridSettings: props.context.request.gridSettings,\r\n productQuantity: props.quantity !== undefined ? props.quantity : defaultQuantity,\r\n priceComponent,\r\n navigationUrl: props.navigationUrl,\r\n modalOpen,\r\n setModalOpen,\r\n telemetryContent: props.telemetryContent\r\n };\r\n\r\n const itemsAddedResource: IItemsAddedToCartResources = {\r\n viewCartButtonText: props.dialogStrings?.goToCartText ?? '',\r\n closeButtonLabel: props.dialogStrings?.closeNotificationLabel ?? 'Close',\r\n itemsAddedToCartHeaderText: props.dialogStrings?.headerMessageText ?? '',\r\n itemsAddedToCartFormatText: props.dialogStrings?.headerItemFormatText ?? '',\r\n linesAddedToCartFormatText: props.dialogStrings?.headerLinesFormatText ?? '{0}',\r\n itemsAddedValidationErrorMessage: errorMessage\r\n };\r\n\r\n const renderModalPopup = ;\r\n const label = getLinkText(props);\r\n const payload = getPayloadObject(TelemetryEvent.AddToCart, props.telemetryContent!, label, '');\r\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\r\n const buttonClassName = props.shouldSkipSiteSettings ? '' : 'msc-add-to-cart ';\r\n\r\n React.useEffect(() => {\r\n /**\r\n * Retrieves add to cart input and updates the state.\r\n */\r\n const retrieveAddToCartInput = async () => {\r\n const retrievedInput = await getAddToCartInputFromProps(props);\r\n setAddToCartInput(retrievedInput);\r\n };\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call async method as per the documentation of react useEffect.\r\n retrieveAddToCartInput();\r\n }, [props, setAddToCartInput]);\r\n\r\n return (\r\n <>\r\n {renderModalPopup}\r\n \r\n {props.addToCartText}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\n// Set default props\r\nAddToCartFunctionalComponent.defaultProps = {\r\n quantity: defaultQuantity\r\n};\r\n\r\n/**\r\n * Resolves whether product is in stock.\r\n * @param props - The add to cart component props.\r\n * @returns Gets the link text.\r\n */\r\nconst getLinkText = (props: IAddToCartComponentProps): string => {\r\n return shouldShowOutOfStock(props, false) && props.outOfStockText ? props.outOfStockText : props.addToCartText;\r\n};\r\n\r\n/**\r\n * Resolves whether product is in stock.\r\n * @param props - The add to cart component props.\r\n * @returns The add to cart failure result.\r\n */\r\nconst addToCartError = (props: IAddToCartComponentProps): IAddToCartFailureResult | undefined => {\r\n const {\r\n data,\r\n productAvailability,\r\n isCustomPriceSelected,\r\n customPriceAmount,\r\n maximumKeyInPrice,\r\n minimumKeyInPrice,\r\n defaultMaximumKeyInPrice = 100,\r\n defaultMinimumKeyInPrice = 10\r\n } = props;\r\n\r\n if (!data || !data.product.RecordId) {\r\n // No product exists, won't be able to add to cart\r\n return { failureReason: 'EMPTYINPUT' };\r\n }\r\n\r\n if (data.product.Dimensions) {\r\n const missingDimensions = data.product.Dimensions.filter(\r\n dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value)\r\n );\r\n\r\n if (ArrayExtensions.hasElements(missingDimensions)) {\r\n // At least one dimension with no value exists on the product, won't be able to add to cart\r\n return { failureReason: 'MISSINGDIMENSION', missingDimensions };\r\n }\r\n }\r\n\r\n if (shouldShowOutOfStock(props, true)) {\r\n const defaultAvailableQuantity = 0; // Showing as out of stock if no available products found.\r\n const availableQuantity = productAvailability?.AvailableQuantity ?? defaultAvailableQuantity;\r\n const stockLeft = Math.max(availableQuantity, defaultAvailableQuantity);\r\n\r\n return { failureReason: 'OUTOFSTOCK', stockLeft };\r\n }\r\n\r\n // When Custom price is selected, if there is no keyed-in price or keyed-in price is out of limit, should return error.\r\n if (\r\n isCustomPriceSelected &&\r\n (!customPriceAmount ||\r\n customPriceAmount > (maximumKeyInPrice || defaultMaximumKeyInPrice) ||\r\n customPriceAmount < (minimumKeyInPrice || defaultMinimumKeyInPrice))\r\n ) {\r\n return { failureReason: 'INVALIDCUSTOMAMOUNT' };\r\n }\r\n\r\n // Only allow adding to cart if not showing out of stock\r\n return undefined;\r\n};\r\n\r\n/**\r\n * Resolves whether product is in stock.\r\n * @param props - The add to cart component props.\r\n * @param includeCurrentQuantity - Flag to specify whether current quantity should be included.\r\n * @returns The dialog element.\r\n */\r\nconst shouldShowOutOfStock = (props: IAddToCartComponentProps, includeCurrentQuantity: boolean): boolean => {\r\n if (props.context.app.config.enableStockCheck === undefined || props.context.app.config.enableStockCheck === false) {\r\n return false;\r\n }\r\n\r\n // When skip site settings do not need show out of stock on adding to cart\r\n if (props.shouldSkipSiteSettings) {\r\n return false;\r\n }\r\n\r\n if (\r\n props.isLoading ||\r\n props.isProductQuantityLoading ||\r\n props.isUpdatingDimension ||\r\n props.isLoadingDeliveryOptions ||\r\n props.isUpdatingDeliveryOptions ||\r\n props.isAddServiceItemToCart\r\n ) {\r\n // Out of stock turn off, don't bother showing out of stock\r\n return false;\r\n }\r\n\r\n if (!props.data || !props.data.product.RecordId) {\r\n // No product exists, don't bother showing out of stock\r\n return false;\r\n }\r\n\r\n const hasAvailableProducts = props.hasAvailableProducts ?? true;\r\n if (!hasAvailableProducts) {\r\n return true;\r\n }\r\n\r\n if (props.data.product.Dimensions) {\r\n if (props.data.product.Dimensions.find(dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value))) {\r\n // At least one dimension with no value exists on the product, so also don't show out of stock\r\n return false;\r\n }\r\n }\r\n\r\n const includedQuantityNumber = includeCurrentQuantity && props.quantity ? props.quantity : defaultQuantity;\r\n\r\n return !(\r\n props.productAvailability &&\r\n props.productAvailability.AvailableQuantity !== undefined &&\r\n props.productAvailability.AvailableQuantity >= includedQuantityNumber\r\n );\r\n};\r\n\r\nconst isIntermediateState = (props: IAddToCartComponentProps): boolean => {\r\n if (props.data?.product.Dimensions) {\r\n if (props.data.product.Dimensions.find(dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value))) {\r\n // At least one dimension with no value exists on the product, so also not in intermediate state\r\n return false;\r\n }\r\n }\r\n\r\n if (!props.isLoading && !props.isUpdatingDimension && !props.isLoadingDeliveryOptions && !props.isUpdatingDeliveryOptions) {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nexport const AddToCartComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride<\r\n // @ts-expect-error\r\n IAddtoCartComponent\r\n>('AddToCart', { component: AddToCartFunctionalComponent, ...AddToCartComponentActions });\r\n\r\nexport default AddToCartComponent;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport MsDyn365, {\r\n IComponent,\r\n IComponentProps,\r\n IGridSettings,\r\n IImageSettings,\r\n msdyn365Commerce,\r\n TelemetryEvent\r\n} from '@msdyn365-commerce/core';\r\nimport { getCartState, ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\r\nimport {\r\n CartLine,\r\n CartLineValidationResults,\r\n CartsDataActions,\r\n format,\r\n ProductAvailableQuantity,\r\n ProductDimension,\r\n ProductPrice,\r\n ProductsDataActions,\r\n ProductSearchCriteria,\r\n ProductType,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { ErrorNotification, NotificationsManager } from '@msdyn365-commerce-modules/notifications-core';\r\nimport { ArrayExtensions, generateProductImageUrl, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, IPopupProps, ITelemetryContent, Popup } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport React, { useState } from 'react';\r\n\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { IItemsAddedToCartResources } from '@msdyn365-commerce/components';\r\nimport { ItemsAddedToCartDialogComponent } from '@msdyn365-commerce/components';\r\nimport { ItemSuccessfullyAddedToCartNotification } from '@msdyn365-commerce/components';\r\nimport { MultiItemsSuccessfullyAddedToCartNotification } from '@msdyn365-commerce/components';\r\nimport { OrderDetailsProduct } from '@msdyn365-commerce/components';\r\nimport { updateCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\n// import { ToastContainer, toast } from 'react-toastify';\r\nimport 'react-toastify/dist/ReactToastify.css';\r\n// import { getArtifactsByItemAsync } from '../../../../actions/extensions/DataActionExtension.g';\r\n\r\n/**\r\n * Interface for add to cart resources.\r\n */\r\nexport interface IAddToCartResources {\r\n goToCartText: string;\r\n continueShoppingText: string;\r\n closeNotificationLabel: string;\r\n headerItemOneText: string;\r\n headerItemFormatText: string;\r\n headerLinesFormatText?: string;\r\n headerMessageText: string;\r\n freePriceText: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n addedQuantityText: string;\r\n buyAgainNotificationTitle?: string;\r\n buyAgainNotificationCloseAriaLabel?: string;\r\n validationErrorMessage?: string;\r\n oneErrorText?: string;\r\n multiErrorsText?: string;\r\n}\r\n\r\n/**\r\n * Interface for add to cart components props.\r\n */\r\nexport interface IAddToCartComponentProps extends IComponentProps<{ product: SimpleProduct; price?: ProductPrice } | undefined> {\r\n className?: string;\r\n addToCartText: string;\r\n outOfStockText?: string;\r\n disabled?: boolean;\r\n quantity?: number;\r\n navigationUrl?: string;\r\n productAvailability?: ProductAvailableQuantity;\r\n getSelectedProduct?: Promise;\r\n isNavigationToCartPageDisabled?: boolean;\r\n shouldSkipSiteSettings?: boolean;\r\n addToCartArialLabel?: string;\r\n products?: { productId: number; quantity: number }[];\r\n orderDetailsProducts?: OrderDetailsProduct[];\r\n hasAvailableProducts?: boolean;\r\n imageSettings?: IImageSettings;\r\n gridSettings?: IGridSettings;\r\n\r\n isLoading?: boolean;\r\n isUpdatingDimension?: boolean;\r\n isLoadingDeliveryOptions?: boolean;\r\n isUpdatingDeliveryOptions?: boolean;\r\n isAddServiceItemToCart?: boolean;\r\n isAddEmailDeliveryItemToCart?: boolean;\r\n isPriceKeyedIn?: boolean;\r\n customPriceAmount?: number;\r\n isOrderQuantityLimitsFeatureEnabled?: boolean;\r\n\r\n dialogStrings?: IAddToCartResources;\r\n\r\n telemetryContent?: ITelemetryContent;\r\n\r\n isCustomPriceSelected?: boolean;\r\n maximumKeyInPrice?: number;\r\n minimumKeyInPrice?: number;\r\n defaultMaximumKeyInPrice?: number;\r\n defaultMinimumKeyInPrice?: number;\r\n isProductQuantityLoading?: boolean;\r\n artifactsData?: any;\r\n resourcePageURL?: string;\r\n isEdit?: boolean;\r\n cartLineID?: string;\r\n productUrl?: string;\r\n\r\n onAdd?(result: ICartActionResult): void;\r\n onError?(result: IAddToCartFailureResult): void;\r\n changeUpdatingDimension?(isUpdatingDimension: boolean): void;\r\n changeUpdatingDeliveryOptions?(isUpdatingDeliveryOptions: boolean): void;\r\n}\r\n\r\n/**\r\n * Cart action Failure reason type.\r\n */\r\nexport declare type ICartActionFailureReason =\r\n | 'EMPTYINPUT'\r\n | 'MISSINGDIMENSION'\r\n | 'OUTOFSTOCK'\r\n | 'CARTACTIONFAILED'\r\n | 'INVALIDCUSTOMAMOUNT';\r\n\r\n/**\r\n * Interface for add to cart failure result.\r\n */\r\nexport interface IAddToCartFailureResult {\r\n failureReason: ICartActionFailureReason;\r\n\r\n stockLeft?: number;\r\n cartActionResult?: ICartActionResult;\r\n missingDimensions?: ProductDimension[];\r\n}\r\n\r\n/**\r\n * This setting defines the experience when a product is added to cart. Corresponds to the configuration in Fabrikam.\r\n */\r\nexport enum AddToCartBehavior {\r\n /**\r\n * Navigate to cart page.\r\n */\r\n goToCart = 'goToCart',\r\n\r\n /**\r\n * Show item added to cart popup.\r\n */\r\n showModal = 'showModal',\r\n\r\n /**\r\n * Show mini cart popup.\r\n */\r\n showMiniCart = 'showMiniCart',\r\n\r\n /**\r\n * Show item added to cart notification.\r\n */\r\n showNotification = 'showNotification',\r\n\r\n /**\r\n * Do nothing and stay on the page.\r\n */\r\n nothing = 'nothing'\r\n}\r\n\r\nconst zero = 0;\r\nconst defaultQuantity = 1;\r\n\r\n/**\r\n * The propagate result.\r\n * @param props -- The add to cart component props.\r\n * @param result -- The cart action result.\r\n */\r\nconst propagateResult = (props: IAddToCartComponentProps, result: ICartActionResult): void => {\r\n if (props.onAdd) {\r\n props.onAdd(result);\r\n }\r\n};\r\n\r\n/**\r\n * The propagate error.\r\n * @param props -- The add to cart component props.\r\n * @param result -- The add to cart failure result.\r\n */\r\nconst propagateError = (props: IAddToCartComponentProps, result: IAddToCartFailureResult): void => {\r\n if (props.onError) {\r\n props.onError(result);\r\n }\r\n};\r\n\r\n/**\r\n * Retrieves add to cart input from the component props.\r\n * @param props - Add to cart component props.\r\n * @returns Add to cart input.\r\n */\r\nconst getAddToCartInputFromProps = async (props: IAddToCartComponentProps) => {\r\n const products = props.orderDetailsProducts?.filter(product => !ObjectExtensions.isNullOrUndefined(product.simpleProduct));\r\n const input = products?.map(product => {\r\n return {\r\n product: product.simpleProduct!,\r\n count: ObjectExtensions.isNullOrUndefined(product.salesLine.Quantity) ? defaultQuantity : product.salesLine.Quantity\r\n };\r\n });\r\n\r\n if (ArrayExtensions.hasElements(input)) {\r\n return input;\r\n }\r\n\r\n if (ArrayExtensions.hasElements(props.products)) {\r\n const actionContext = props.context.actionContext;\r\n const apiSettings = actionContext.requestContext.apiSettings;\r\n\r\n const searchCriteriaInput: ProductSearchCriteria = {\r\n Context: {\r\n ChannelId: apiSettings.channelId,\r\n CatalogId: apiSettings.catalogId\r\n },\r\n IncludeAttributes: false,\r\n Ids: props.products.map(product => product.productId)\r\n };\r\n\r\n const searchResult = await ProductsDataActions.searchByCriteriaAsync({ callerContext: actionContext }, searchCriteriaInput);\r\n const productSearchResultsWithImages = searchResult.map(productSearchResult => {\r\n const newProductSearchResult = { ...productSearchResult };\r\n const newImageUrl = generateProductImageUrl(newProductSearchResult, apiSettings);\r\n\r\n if (newImageUrl) {\r\n newProductSearchResult.PrimaryImageUrl = newImageUrl;\r\n }\r\n\r\n return newProductSearchResult;\r\n });\r\n\r\n return props.products.map(item => {\r\n const productData = productSearchResultsWithImages.find(product => product.RecordId === item.productId);\r\n let simpleProduct: SimpleProduct;\r\n if (productData) {\r\n simpleProduct = {\r\n ...productData,\r\n ProductTypeValue: ProductType.Variant,\r\n AdjustedPrice: productData.Price,\r\n BasePrice: productData.BasePrice ?? productData.Price\r\n };\r\n } else {\r\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Cast to simple product since only record id is available.\r\n simpleProduct = {\r\n RecordId: item.productId\r\n } as SimpleProduct;\r\n }\r\n\r\n return {\r\n product: simpleProduct,\r\n count: item.quantity\r\n };\r\n });\r\n }\r\n\r\n if (props.data?.product) {\r\n return [\r\n {\r\n product: props.data.product,\r\n count: props.quantity ?? defaultQuantity\r\n }\r\n ];\r\n }\r\n\r\n return [];\r\n};\r\n\r\n/**\r\n * Add one item to cart when it is not buy again.\r\n * @param props -- The props.\r\n * @param setDisabled -- The set disable call back.\r\n * @param openModal -- The open modal call back.\r\n */\r\nconst addOneItemToCart = async (\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n openModal: (opened: boolean) => void\r\n): Promise => {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n const addToCartBehavior = props.context.app.config.addToCartBehavior;\r\n const data = props.data;\r\n\r\n const addToCartInput = await getAddToCartInputFromProps(props);\r\n const product = addToCartInput[0].product;\r\n // Count can be changed in future\r\n const quantity = addToCartInput[0].count;\r\n\r\n console.log('Add single item to cart', addToCartInput);\r\n\r\n // const context: any = { callerContext: props.context.actionContext };\r\n // const artifactDataActionResult = await getArtifactsByItemAsync(context, 'NZH10');\r\n // console.log(artifactDataActionResult);\r\n\r\n const artifact = props.artifactsData;\r\n const resourcePageURL = props.resourcePageURL;\r\n\r\n // const artifact = {\r\n // ItemId: 'NZH30',\r\n // artifacts: [\r\n // {\r\n // artifactName: '123',\r\n // artifactId: 123,\r\n // artifactUrl: '123',\r\n // artifactType: 'pdf'\r\n // }\r\n // ]\r\n // };\r\n\r\n console.log('artifact data inside add to cart component: ', artifact);\r\n\r\n const cartState = await getCartState(props.context.actionContext);\r\n\r\n if (props.isEdit === true && props.cartLineID) {\r\n const input = {\r\n cartLineIds: [props.cartLineID]\r\n };\r\n await cartState.removeCartLines(input).catch(error => {\r\n console.log('Unable to Remove Cart Line');\r\n });\r\n }\r\n\r\n console.log('Cart State', cartState);\r\n let addToCartResult: any;\r\n const matchingCartLines = cartState?.cart?.CartLines?.filter(cartLine => cartLine.ItemId === product.ItemId);\r\n\r\n if (matchingCartLines?.length! <= 0) {\r\n addToCartResult = await cartState.addProductToCart({\r\n product,\r\n count: quantity,\r\n availableQuantity: props.productAvailability?.AvailableQuantity,\r\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: props.isOrderQuantityLimitsFeatureEnabled },\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n enableStockCheck: props.context.app.config.enableStockCheck,\r\n isPriceKeyedIn: props.isPriceKeyedIn,\r\n customPrice: props.customPriceAmount,\r\n isAddEmailDeliveryItemToCart: props.isAddEmailDeliveryItemToCart,\r\n shouldSkipSiteSettings: props.shouldSkipSiteSettings\r\n });\r\n } else {\r\n NotificationsManager.instance().addNotification(new ErrorNotification('Item already Added to cart', ''));\r\n propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: undefined });\r\n setDisabled(false);\r\n return;\r\n }\r\n\r\n // update cart extension properties using below method\r\n // await cartState.updateExtensionProperties({\r\n // newExtensionProperties: [{ Key: 'art001', Value: { StringValue: 'Lesson1.pdf' } }],\r\n // additionalProperties: {}\r\n // });\r\n\r\n console.log('Add to cart result', addToCartResult);\r\n\r\n if (addToCartResult?.status === 'SUCCESS') {\r\n const cartState = await getCartState(props.context.actionContext);\r\n console.log('Cart State after success', cartState);\r\n const cartLines = cartState?.cart?.CartLines;\r\n console.log('Cart Lines after success', cartLines);\r\n\r\n let cartId: string | undefined = cartState.cart.Id;\r\n //@ts-ignore\r\n const matchingLines = cartLines.filter(cartLine => cartLine.ItemId === product.ItemId);\r\n\r\n const copyCartLine: CartLine = { ...matchingLines[0] };\r\n\r\n copyCartLine.ExtensionProperties = [\r\n { Key: 'SelectedArtifacts', Value: { StringValue: JSON.stringify(artifact) } },\r\n { Key: 'ResourcePageURL', Value: { StringValue: resourcePageURL } },\r\n { Key: 'ProductURL', Value: { StringValue: props.productUrl } }\r\n ];\r\n\r\n console.log('Cart ID after success', cartId);\r\n console.log('Cart cartlines after success', copyCartLine);\r\n\r\n // update cartline extension properties using below method\r\n const updatedCartLinesResult = await updateCartLinesAsync(props.context.actionContext as any, cartId, [copyCartLine] as any);\r\n console.log('Cartline result after success', updatedCartLinesResult);\r\n const refreshCart = await cartState.refreshCart({});\r\n console.log('Refresh cart', refreshCart);\r\n\r\n if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showModal) {\r\n setDisabled(false);\r\n openModal(true);\r\n } else if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showNotification) {\r\n setDisabled(false);\r\n const notification = new ItemSuccessfullyAddedToCartNotification(\r\n props.context,\r\n props.dialogStrings,\r\n props.imageSettings,\r\n props.gridSettings,\r\n product,\r\n data?.price,\r\n quantity,\r\n props.navigationUrl,\r\n props.telemetryContent!,\r\n props.id,\r\n props.typeName\r\n );\r\n NotificationsManager.instance().addNotification(notification);\r\n } else if (\r\n MsDyn365.isBrowser &&\r\n props.navigationUrl &&\r\n !props.isNavigationToCartPageDisabled &&\r\n (addToCartBehavior === undefined || addToCartBehavior === AddToCartBehavior.goToCart)\r\n ) {\r\n window.location.assign(props.navigationUrl);\r\n } else {\r\n setDisabled(false);\r\n }\r\n propagateResult(props, addToCartResult);\r\n } else {\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n addToCartResult?.errorDetails?.LocalizedMessage ?? 'Add to cart failed',\r\n props.dialogStrings?.closeNotificationLabel ?? ''\r\n )\r\n );\r\n\r\n propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: addToCartResult });\r\n setDisabled(false);\r\n }\r\n};\r\n\r\n/**\r\n * Callback to handle success of adding to cart.\r\n * @param props - Add to cart component props.\r\n * @param setDisabled - Callback to update disabled state of the component.\r\n * @param setItemsAddedToCartDialogOpen - Callback to update disabled state of the component.\r\n * @param setErrorMessage - Callback to update error message state of the component.\r\n * @param cartState - Current cart state.\r\n * @param addToCartInput - Input used for adding to cart.\r\n * @param addToCartResult - Result of adding to cart.\r\n */\r\nconst handleAddItemsToCartSuccess = async (\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\r\n setErrorMessage: (message: string) => void,\r\n cartState: ICartState,\r\n addToCartInput: {\r\n product: SimpleProduct;\r\n count: number;\r\n }[],\r\n addToCartResult: ICartActionResult\r\n) => {\r\n // Validate cart for line errors.\r\n const validationResult: CartLineValidationResults = await CartsDataActions.validateForCheckoutAsync(\r\n { callerContext: props.context.actionContext, bypassCache: 'none' },\r\n cartState.cart.Id,\r\n cartState.cart.Version\r\n );\r\n const errorCount = (validationResult.ValidationFailuresByCartLines ?? []).length;\r\n const singleErrorCount = 1;\r\n const errorText = errorCount === singleErrorCount ? props.dialogStrings?.oneErrorText : props.dialogStrings?.multiErrorsText;\r\n const errorMessage =\r\n errorCount > zero ? format(props.dialogStrings?.validationErrorMessage ?? '', errorCount.toString(), errorText) : '';\r\n\r\n setErrorMessage(errorMessage);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n const addToCartBehavior = props.context.app.config.addToCartBehavior;\r\n\r\n if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showModal) {\r\n setDisabled(false);\r\n setItemsAddedToCartDialogOpen(true);\r\n } else if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showNotification) {\r\n setDisabled(false);\r\n const itemsAddedResource: IItemsAddedToCartResources = {\r\n viewCartButtonText: props.dialogStrings.goToCartText,\r\n closeButtonLabel: props.dialogStrings.closeNotificationLabel,\r\n itemsAddedToCartHeaderText: props.dialogStrings.headerMessageText,\r\n itemsAddedToCartFormatText: props.dialogStrings.headerItemFormatText,\r\n linesAddedToCartFormatText: props.dialogStrings.headerLinesFormatText ?? '{0}',\r\n itemsAddedValidationErrorMessage: errorMessage\r\n };\r\n\r\n const notification = new MultiItemsSuccessfullyAddedToCartNotification(\r\n props.context,\r\n itemsAddedResource,\r\n props.imageSettings,\r\n props.gridSettings,\r\n addToCartInput,\r\n props.navigationUrl,\r\n props.telemetryContent!,\r\n props.id,\r\n props.typeName\r\n );\r\n NotificationsManager.instance().addNotification(notification);\r\n } else if (\r\n MsDyn365.isBrowser &&\r\n props.navigationUrl &&\r\n !props.isNavigationToCartPageDisabled &&\r\n (addToCartBehavior === undefined || addToCartBehavior === AddToCartBehavior.goToCart)\r\n ) {\r\n window.location.assign(props.navigationUrl);\r\n } else {\r\n setDisabled(false);\r\n }\r\n propagateResult(props, addToCartResult);\r\n};\r\n\r\n/**\r\n * Add one or multi item to cart from buy again.\r\n * @param props -- The props.\r\n * @param setDisabled -- The set disable call back.\r\n * @param setItemsAddedToCartDialogOpen -- The open modal call back.\r\n * @param setErrorMessage -- The set error message call back.\r\n */\r\nconst addItemsToCart = async (\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\r\n setErrorMessage: (message: string) => void\r\n): Promise => {\r\n const addToCartInput = await getAddToCartInputFromProps(props);\r\n\r\n if (!ArrayExtensions.hasElements(addToCartInput)) {\r\n return;\r\n }\r\n\r\n console.log('Add items to cart', addToCartInput);\r\n\r\n const cartState = await getCartState(props.context.actionContext);\r\n const addToCartResult = await cartState.addProductsToCart(addToCartInput);\r\n\r\n if (addToCartResult.status === 'SUCCESS') {\r\n await handleAddItemsToCartSuccess(\r\n props,\r\n setDisabled,\r\n setItemsAddedToCartDialogOpen,\r\n setErrorMessage,\r\n cartState,\r\n addToCartInput,\r\n addToCartResult\r\n );\r\n } else {\r\n if (props.dialogStrings?.buyAgainNotificationTitle) {\r\n // For buy again show simple error notification.\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n props.dialogStrings.buyAgainNotificationTitle,\r\n props.dialogStrings.buyAgainNotificationCloseAriaLabel ?? ''\r\n )\r\n );\r\n } else {\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n addToCartResult.errorDetails?.LocalizedMessage ?? 'Add to cart failed',\r\n props.dialogStrings?.closeNotificationLabel ?? ''\r\n )\r\n );\r\n }\r\n\r\n propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: addToCartResult });\r\n setDisabled(false);\r\n }\r\n};\r\n\r\n/**\r\n * Interface for add to cart component.\r\n */\r\nexport interface IAddtoCartComponent extends IComponent {\r\n onClick(): (event: React.MouseEvent, props: IAddToCartComponentProps) => void;\r\n}\r\n\r\n/**\r\n * On click function.\r\n * @param _event - The mouse event.\r\n * @param props - The props.\r\n * @param setDisabled - Flag to define whether the element is disabled.\r\n * @param openModal - Flag to specify if it should open in a modal window.\r\n * @param setItemsAddedToCartDialogOpen - Sets items added to cart while dialog is open.\r\n * @param setErrorMessage - Error message.\r\n */\r\nconst onClick = async (\r\n _event: React.MouseEvent,\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n openModal: (opened: boolean) => void,\r\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\r\n setErrorMessage: (message: string) => void\r\n): Promise => {\r\n if (!ArrayExtensions.hasElements(props.products)) {\r\n const cartError = addToCartError(props);\r\n\r\n if (cartError) {\r\n propagateError(props, cartError);\r\n return;\r\n }\r\n\r\n setDisabled(true);\r\n }\r\n\r\n const hasOrderDetailsProducts =\r\n ArrayExtensions.hasElements(props.orderDetailsProducts) && props.orderDetailsProducts.length > defaultQuantity;\r\n const hasProducts = ArrayExtensions.hasElements(props.products) && props.products.length > defaultQuantity;\r\n\r\n const hasMultipleProducts = hasOrderDetailsProducts || hasProducts;\r\n\r\n if (props.shouldSkipSiteSettings && hasMultipleProducts) {\r\n await addItemsToCart(props, setDisabled, setItemsAddedToCartDialogOpen, setErrorMessage);\r\n } else {\r\n await addOneItemToCart(props, setDisabled, openModal);\r\n }\r\n};\r\n\r\n/**\r\n * Add to cart component action constant.\r\n */\r\nconst AddToCartComponentActions = {\r\n onClick\r\n};\r\n\r\n/**\r\n * Add to cart component.\r\n * @param props - The props.\r\n * @returns - The add to cart component.\r\n */\r\nexport const AddToCartFunctionalComponent: React.FC = (props: IAddToCartComponentProps) => {\r\n const [disabled, setDisabled] = useState(false);\r\n const [modalOpen, setModalOpen] = useState(false);\r\n const [isItemsAddedToCartDialogOpen, setItemsAddedToCartDialogOpen] = useState(false);\r\n const [errorMessage, setErrorMessage] = useState('');\r\n const [addToCartInput, setAddToCartInput] = useState<\r\n {\r\n product: SimpleProduct;\r\n count: number;\r\n }[]\r\n >([]);\r\n\r\n const onClickHandler = async (event: React.MouseEvent) => {\r\n await AddToCartComponentActions.onClick(event, props, setDisabled, setModalOpen, setItemsAddedToCartDialogOpen, setErrorMessage);\r\n // let close: HTMLElement = document.getElementsByClassName('msc-modal__close-button')[0] as HTMLElement;\r\n var quickviewDiv = document.querySelector('.ms-quickView__dialog');\r\n var closeButton = quickviewDiv?.querySelector('.msc-modal__close-button') as HTMLElement;\r\n closeButton.click();\r\n };\r\n\r\n /**\r\n * Close dialog.\r\n */\r\n const closeItemsAddedToCartDialog = React.useCallback(() => {\r\n setItemsAddedToCartDialogOpen(false);\r\n }, []);\r\n\r\n const priceComponent = props.data?.price ? (\r\n \r\n ) : (\r\n ''\r\n );\r\n\r\n const popupProps: IPopupProps = {\r\n context: props.context,\r\n className: 'msc-add-to-cart',\r\n id: props.id,\r\n typeName: props.typeName,\r\n data: { product: props.data?.product, price: props.data?.price },\r\n dialogStrings: props.dialogStrings,\r\n imageSettings: props.imageSettings,\r\n gridSettings: props.context.request.gridSettings,\r\n productQuantity: props.quantity !== undefined ? props.quantity : defaultQuantity,\r\n priceComponent,\r\n navigationUrl: props.navigationUrl,\r\n modalOpen,\r\n setModalOpen,\r\n telemetryContent: props.telemetryContent\r\n };\r\n\r\n const itemsAddedResource: IItemsAddedToCartResources = {\r\n viewCartButtonText: props.dialogStrings?.goToCartText ?? '',\r\n closeButtonLabel: props.dialogStrings?.closeNotificationLabel ?? 'Close',\r\n itemsAddedToCartHeaderText: props.dialogStrings?.headerMessageText ?? '',\r\n itemsAddedToCartFormatText: props.dialogStrings?.headerItemFormatText ?? '',\r\n linesAddedToCartFormatText: props.dialogStrings?.headerLinesFormatText ?? '{0}',\r\n itemsAddedValidationErrorMessage: errorMessage\r\n };\r\n\r\n const renderModalPopup = ;\r\n const label = getLinkText(props);\r\n const payload = getPayloadObject(TelemetryEvent.AddToCart, props.telemetryContent!, label, '');\r\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\r\n const buttonClassName = props.shouldSkipSiteSettings ? '' : 'msc-add-to-cart ';\r\n\r\n React.useEffect(() => {\r\n /**\r\n * Retrieves add to cart input and updates the state.\r\n */\r\n const retrieveAddToCartInput = async () => {\r\n const retrievedInput = await getAddToCartInputFromProps(props);\r\n setAddToCartInput(retrievedInput);\r\n };\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call async method as per the documentation of react useEffect.\r\n retrieveAddToCartInput();\r\n }, [props, setAddToCartInput]);\r\n\r\n return (\r\n <>\r\n {renderModalPopup}\r\n \r\n {props.isEdit ? 'Update Kete' : ' Add to Kete'}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\n// Set default props\r\nAddToCartFunctionalComponent.defaultProps = {\r\n quantity: defaultQuantity\r\n};\r\n\r\n/**\r\n * Resolves whether product is in stock.\r\n * @param props - The add to cart component props.\r\n * @returns Gets the link text.\r\n */\r\nconst getLinkText = (props: IAddToCartComponentProps): string => {\r\n return shouldShowOutOfStock(props, false) && props.outOfStockText ? props.outOfStockText : props.addToCartText;\r\n};\r\n\r\n/**\r\n * Resolves whether product is in stock.\r\n * @param props - The add to cart component props.\r\n * @returns The add to cart failure result.\r\n */\r\nconst addToCartError = (props: IAddToCartComponentProps): IAddToCartFailureResult | undefined => {\r\n const {\r\n data,\r\n productAvailability,\r\n isCustomPriceSelected,\r\n customPriceAmount,\r\n maximumKeyInPrice,\r\n minimumKeyInPrice,\r\n defaultMaximumKeyInPrice = 100,\r\n defaultMinimumKeyInPrice = 10\r\n } = props;\r\n\r\n if (!data || !data.product.RecordId) {\r\n // No product exists, won't be able to add to cart\r\n return { failureReason: 'EMPTYINPUT' };\r\n }\r\n\r\n if (data.product.Dimensions) {\r\n const missingDimensions = data.product.Dimensions.filter(\r\n dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value)\r\n );\r\n\r\n if (ArrayExtensions.hasElements(missingDimensions)) {\r\n // At least one dimension with no value exists on the product, won't be able to add to cart\r\n return { failureReason: 'MISSINGDIMENSION', missingDimensions };\r\n }\r\n }\r\n\r\n if (shouldShowOutOfStock(props, true)) {\r\n const defaultAvailableQuantity = 0; // Showing as out of stock if no available products found.\r\n const availableQuantity = productAvailability?.AvailableQuantity ?? defaultAvailableQuantity;\r\n const stockLeft = Math.max(availableQuantity, defaultAvailableQuantity);\r\n\r\n return { failureReason: 'OUTOFSTOCK', stockLeft };\r\n }\r\n\r\n // When Custom price is selected, if there is no keyed-in price or keyed-in price is out of limit, should return error.\r\n if (\r\n isCustomPriceSelected &&\r\n (!customPriceAmount ||\r\n customPriceAmount > (maximumKeyInPrice || defaultMaximumKeyInPrice) ||\r\n customPriceAmount < (minimumKeyInPrice || defaultMinimumKeyInPrice))\r\n ) {\r\n return { failureReason: 'INVALIDCUSTOMAMOUNT' };\r\n }\r\n\r\n // Only allow adding to cart if not showing out of stock\r\n return undefined;\r\n};\r\n\r\n/**\r\n * Resolves whether product is in stock.\r\n * @param props - The add to cart component props.\r\n * @param includeCurrentQuantity - Flag to specify whether current quantity should be included.\r\n * @returns The dialog element.\r\n */\r\nconst shouldShowOutOfStock = (props: IAddToCartComponentProps, includeCurrentQuantity: boolean): boolean => {\r\n if (props.context.app.config.enableStockCheck === undefined || props.context.app.config.enableStockCheck === false) {\r\n return false;\r\n }\r\n\r\n // When skip site settings do not need show out of stock on adding to cart\r\n if (props.shouldSkipSiteSettings) {\r\n return false;\r\n }\r\n\r\n if (\r\n props.isLoading ||\r\n props.isProductQuantityLoading ||\r\n props.isUpdatingDimension ||\r\n props.isLoadingDeliveryOptions ||\r\n props.isUpdatingDeliveryOptions ||\r\n props.isAddServiceItemToCart\r\n ) {\r\n // Out of stock turn off, don't bother showing out of stock\r\n return false;\r\n }\r\n\r\n if (!props.data || !props.data.product.RecordId) {\r\n // No product exists, don't bother showing out of stock\r\n return false;\r\n }\r\n\r\n const hasAvailableProducts = props.hasAvailableProducts ?? true;\r\n if (!hasAvailableProducts) {\r\n return true;\r\n }\r\n\r\n if (props.data.product.Dimensions) {\r\n if (props.data.product.Dimensions.find(dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value))) {\r\n // At least one dimension with no value exists on the product, so also don't show out of stock\r\n return false;\r\n }\r\n }\r\n\r\n const includedQuantityNumber = includeCurrentQuantity && props.quantity ? props.quantity : defaultQuantity;\r\n\r\n return !(\r\n props.productAvailability &&\r\n props.productAvailability.AvailableQuantity !== undefined &&\r\n props.productAvailability.AvailableQuantity >= includedQuantityNumber\r\n );\r\n};\r\n\r\nconst isIntermediateState = (props: IAddToCartComponentProps): boolean => {\r\n if (props.data?.product.Dimensions) {\r\n if (props.data.product.Dimensions.find(dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value))) {\r\n // At least one dimension with no value exists on the product, so also not in intermediate state\r\n return false;\r\n }\r\n }\r\n\r\n if (!props.isLoading && !props.isUpdatingDimension && !props.isLoadingDeliveryOptions && !props.isUpdatingDeliveryOptions) {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\n// @ts-expect-error\r\nexport const AddToCartComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride('AddToCart', { component: AddToCartFunctionalComponent, ...AddToCartComponentActions });\r\n\r\nexport default AddToCartComponent;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport MsDyn365, {\r\n IComponent,\r\n IComponentProps,\r\n IGridSettings,\r\n IImageSettings,\r\n msdyn365Commerce,\r\n TelemetryEvent\r\n} from '@msdyn365-commerce/core';\r\nimport { getCartState, ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\r\nimport {\r\n CartLine,\r\n CartLineValidationResults,\r\n CartsDataActions,\r\n format,\r\n ProductAvailableQuantity,\r\n ProductDimension,\r\n ProductPrice,\r\n ProductsDataActions,\r\n ProductSearchCriteria,\r\n ProductType,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { ErrorNotification, NotificationsManager } from '@msdyn365-commerce-modules/notifications-core';\r\nimport { ArrayExtensions, generateProductImageUrl, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, IPopupProps, ITelemetryContent, Popup } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport React, { useState } from 'react';\r\n\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { IItemsAddedToCartResources } from '@msdyn365-commerce/components';\r\nimport { ItemsAddedToCartDialogComponent } from '@msdyn365-commerce/components';\r\nimport { ItemSuccessfullyAddedToCartNotification } from '@msdyn365-commerce/components';\r\nimport { MultiItemsSuccessfullyAddedToCartNotification } from '@msdyn365-commerce/components';\r\nimport { OrderDetailsProduct } from '@msdyn365-commerce/components';\r\nimport { updateCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\n// import { ToastContainer, toast } from 'react-toastify';\r\nimport 'react-toastify/dist/ReactToastify.css';\r\n// import { getArtifactsByItemAsync } from '../../../../actions/extensions/DataActionExtension.g';\r\n\r\n/**\r\n * Interface for add to cart resources.\r\n */\r\nexport interface IAddToCartResources {\r\n goToCartText: string;\r\n continueShoppingText: string;\r\n closeNotificationLabel: string;\r\n headerItemOneText: string;\r\n headerItemFormatText: string;\r\n headerLinesFormatText?: string;\r\n headerMessageText: string;\r\n freePriceText: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n addedQuantityText: string;\r\n buyAgainNotificationTitle?: string;\r\n buyAgainNotificationCloseAriaLabel?: string;\r\n validationErrorMessage?: string;\r\n oneErrorText?: string;\r\n multiErrorsText?: string;\r\n}\r\n\r\n/**\r\n * Interface for add to cart components props.\r\n */\r\nexport interface IAddToCartComponentProps extends IComponentProps<{ product: SimpleProduct; price?: ProductPrice } | undefined> {\r\n className?: string;\r\n addToCartText: string;\r\n outOfStockText?: string;\r\n disabled?: boolean;\r\n quantity?: number;\r\n navigationUrl?: string;\r\n productAvailability?: ProductAvailableQuantity;\r\n getSelectedProduct?: Promise;\r\n isNavigationToCartPageDisabled?: boolean;\r\n shouldSkipSiteSettings?: boolean;\r\n addToCartArialLabel?: string;\r\n products?: { productId: number; quantity: number }[];\r\n orderDetailsProducts?: OrderDetailsProduct[];\r\n hasAvailableProducts?: boolean;\r\n imageSettings?: IImageSettings;\r\n gridSettings?: IGridSettings;\r\n updateKeteButtonText?: string;\r\n addToKeteButtonText?: string;\r\n\r\n isLoading?: boolean;\r\n isUpdatingDimension?: boolean;\r\n isLoadingDeliveryOptions?: boolean;\r\n isUpdatingDeliveryOptions?: boolean;\r\n isAddServiceItemToCart?: boolean;\r\n isAddEmailDeliveryItemToCart?: boolean;\r\n isPriceKeyedIn?: boolean;\r\n customPriceAmount?: number;\r\n isOrderQuantityLimitsFeatureEnabled?: boolean;\r\n\r\n dialogStrings?: IAddToCartResources;\r\n\r\n telemetryContent?: ITelemetryContent;\r\n\r\n isCustomPriceSelected?: boolean;\r\n maximumKeyInPrice?: number;\r\n minimumKeyInPrice?: number;\r\n defaultMaximumKeyInPrice?: number;\r\n defaultMinimumKeyInPrice?: number;\r\n isProductQuantityLoading?: boolean;\r\n artifactsData?: any;\r\n resourcePageURL?: string;\r\n isEdit?: boolean;\r\n cartLineID?: string;\r\n productUrl?: string;\r\n\r\n onAdd?(result: ICartActionResult): void;\r\n onError?(result: IAddToCartFailureResult): void;\r\n changeUpdatingDimension?(isUpdatingDimension: boolean): void;\r\n changeUpdatingDeliveryOptions?(isUpdatingDeliveryOptions: boolean): void;\r\n}\r\n\r\n/**\r\n * Cart action Failure reason type.\r\n */\r\nexport declare type ICartActionFailureReason =\r\n | 'EMPTYINPUT'\r\n | 'MISSINGDIMENSION'\r\n | 'OUTOFSTOCK'\r\n | 'CARTACTIONFAILED'\r\n | 'INVALIDCUSTOMAMOUNT';\r\n\r\n/**\r\n * Interface for add to cart failure result.\r\n */\r\nexport interface IAddToCartFailureResult {\r\n failureReason: ICartActionFailureReason;\r\n\r\n stockLeft?: number;\r\n cartActionResult?: ICartActionResult;\r\n missingDimensions?: ProductDimension[];\r\n}\r\n\r\n/**\r\n * This setting defines the experience when a product is added to cart. Corresponds to the configuration in Fabrikam.\r\n */\r\nexport enum AddToCartBehavior {\r\n /**\r\n * Navigate to cart page.\r\n */\r\n goToCart = 'goToCart',\r\n\r\n /**\r\n * Show item added to cart popup.\r\n */\r\n showModal = 'showModal',\r\n\r\n /**\r\n * Show mini cart popup.\r\n */\r\n showMiniCart = 'showMiniCart',\r\n\r\n /**\r\n * Show item added to cart notification.\r\n */\r\n showNotification = 'showNotification',\r\n\r\n /**\r\n * Do nothing and stay on the page.\r\n */\r\n nothing = 'nothing'\r\n}\r\n\r\nconst zero = 0;\r\nconst defaultQuantity = 1;\r\n\r\n/**\r\n * The propagate result.\r\n * @param props -- The add to cart component props.\r\n * @param result -- The cart action result.\r\n */\r\nconst propagateResult = (props: IAddToCartComponentProps, result: ICartActionResult): void => {\r\n if (props.onAdd) {\r\n props.onAdd(result);\r\n }\r\n};\r\n\r\n/**\r\n * The propagate error.\r\n * @param props -- The add to cart component props.\r\n * @param result -- The add to cart failure result.\r\n */\r\nconst propagateError = (props: IAddToCartComponentProps, result: IAddToCartFailureResult): void => {\r\n if (props.onError) {\r\n props.onError(result);\r\n }\r\n};\r\n\r\n/**\r\n * Retrieves add to cart input from the component props.\r\n * @param props - Add to cart component props.\r\n * @returns Add to cart input.\r\n */\r\nconst getAddToCartInputFromProps = async (props: IAddToCartComponentProps) => {\r\n const products = props.orderDetailsProducts?.filter(product => !ObjectExtensions.isNullOrUndefined(product.simpleProduct));\r\n const input = products?.map(product => {\r\n return {\r\n product: product.simpleProduct!,\r\n count: ObjectExtensions.isNullOrUndefined(product.salesLine.Quantity) ? defaultQuantity : product.salesLine.Quantity\r\n };\r\n });\r\n\r\n if (ArrayExtensions.hasElements(input)) {\r\n return input;\r\n }\r\n\r\n if (ArrayExtensions.hasElements(props.products)) {\r\n const actionContext = props.context.actionContext;\r\n const apiSettings = actionContext.requestContext.apiSettings;\r\n\r\n const searchCriteriaInput: ProductSearchCriteria = {\r\n Context: {\r\n ChannelId: apiSettings.channelId,\r\n CatalogId: apiSettings.catalogId\r\n },\r\n IncludeAttributes: false,\r\n Ids: props.products.map(product => product.productId)\r\n };\r\n\r\n const searchResult = await ProductsDataActions.searchByCriteriaAsync({ callerContext: actionContext }, searchCriteriaInput);\r\n const productSearchResultsWithImages = searchResult.map(productSearchResult => {\r\n const newProductSearchResult = { ...productSearchResult };\r\n const newImageUrl = generateProductImageUrl(newProductSearchResult, apiSettings);\r\n\r\n if (newImageUrl) {\r\n newProductSearchResult.PrimaryImageUrl = newImageUrl;\r\n }\r\n\r\n return newProductSearchResult;\r\n });\r\n\r\n return props.products.map(item => {\r\n const productData = productSearchResultsWithImages.find(product => product.RecordId === item.productId);\r\n let simpleProduct: SimpleProduct;\r\n if (productData) {\r\n simpleProduct = {\r\n ...productData,\r\n ProductTypeValue: ProductType.Variant,\r\n AdjustedPrice: productData.Price,\r\n BasePrice: productData.BasePrice ?? productData.Price\r\n };\r\n } else {\r\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Cast to simple product since only record id is available.\r\n simpleProduct = {\r\n RecordId: item.productId\r\n } as SimpleProduct;\r\n }\r\n\r\n return {\r\n product: simpleProduct,\r\n count: item.quantity\r\n };\r\n });\r\n }\r\n\r\n if (props.data?.product) {\r\n return [\r\n {\r\n product: props.data.product,\r\n count: props.quantity ?? defaultQuantity\r\n }\r\n ];\r\n }\r\n\r\n return [];\r\n};\r\n\r\n/**\r\n * Add one item to cart when it is not buy again.\r\n * @param props -- The props.\r\n * @param setDisabled -- The set disable call back.\r\n * @param openModal -- The open modal call back.\r\n */\r\nconst addOneItemToCart = async (\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n openModal: (opened: boolean) => void\r\n): Promise => {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n const addToCartBehavior = props.context.app.config.addToCartBehavior;\r\n const data = props.data;\r\n\r\n const addToCartInput = await getAddToCartInputFromProps(props);\r\n const product = addToCartInput[0].product;\r\n // Count can be changed in future\r\n const quantity = addToCartInput[0].count;\r\n\r\n console.log('Add single item to cart', addToCartInput);\r\n\r\n // const context: any = { callerContext: props.context.actionContext };\r\n // const artifactDataActionResult = await getArtifactsByItemAsync(context, 'NZH10');\r\n // console.log(artifactDataActionResult);\r\n\r\n const artifact = props.artifactsData;\r\n const resourcePageURL = props.resourcePageURL;\r\n\r\n // const artifact = {\r\n // ItemId: 'NZH30',\r\n // artifacts: [\r\n // {\r\n // artifactName: '123',\r\n // artifactId: 123,\r\n // artifactUrl: '123',\r\n // artifactType: 'pdf'\r\n // }\r\n // ]\r\n // };\r\n\r\n console.log('artifact data inside add to cart component: ', artifact);\r\n\r\n const cartState = await getCartState(props.context.actionContext);\r\n\r\n if (props.isEdit === true && props.cartLineID) {\r\n const input = {\r\n cartLineIds: [props.cartLineID]\r\n };\r\n await cartState.removeCartLines(input).catch(error => {\r\n console.log('Unable to Remove Cart Line');\r\n });\r\n }\r\n\r\n console.log('Cart State', cartState);\r\n let addToCartResult: any;\r\n const matchingCartLines = cartState?.cart?.CartLines?.filter(cartLine => cartLine.ItemId === product.ItemId);\r\n\r\n if (matchingCartLines?.length! <= 0) {\r\n addToCartResult = await cartState.addProductToCart({\r\n product,\r\n count: quantity,\r\n availableQuantity: props.productAvailability?.AvailableQuantity,\r\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: props.isOrderQuantityLimitsFeatureEnabled },\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n enableStockCheck: props.context.app.config.enableStockCheck,\r\n isPriceKeyedIn: props.isPriceKeyedIn,\r\n customPrice: props.customPriceAmount,\r\n isAddEmailDeliveryItemToCart: props.isAddEmailDeliveryItemToCart,\r\n shouldSkipSiteSettings: props.shouldSkipSiteSettings\r\n });\r\n } else {\r\n NotificationsManager.instance().addNotification(new ErrorNotification('Item already Added to cart', ''));\r\n propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: undefined });\r\n setDisabled(false);\r\n return;\r\n }\r\n\r\n // update cart extension properties using below method\r\n // await cartState.updateExtensionProperties({\r\n // newExtensionProperties: [{ Key: 'art001', Value: { StringValue: 'Lesson1.pdf' } }],\r\n // additionalProperties: {}\r\n // });\r\n\r\n console.log('Add to cart result', addToCartResult);\r\n\r\n if (addToCartResult?.status === 'SUCCESS') {\r\n const cartState = await getCartState(props.context.actionContext);\r\n console.log('Cart State after success', cartState);\r\n const cartLines = cartState?.cart?.CartLines;\r\n console.log('Cart Lines after success', cartLines);\r\n\r\n let cartId: string | undefined = cartState.cart.Id;\r\n //@ts-ignore\r\n const matchingLines = cartLines.filter(cartLine => cartLine.ItemId === product.ItemId);\r\n\r\n const copyCartLine: CartLine = { ...matchingLines[0] };\r\n\r\n copyCartLine.ExtensionProperties = [\r\n { Key: 'SelectedArtifacts', Value: { StringValue: JSON.stringify(artifact) } },\r\n { Key: 'ResourcePageURL', Value: { StringValue: resourcePageURL } },\r\n { Key: 'ProductURL', Value: { StringValue: props.productUrl } }\r\n ];\r\n\r\n console.log('Cart ID after success', cartId);\r\n console.log('Cart cartlines after success', copyCartLine);\r\n\r\n // update cartline extension properties using below method\r\n const updatedCartLinesResult = await updateCartLinesAsync(props.context.actionContext as any, cartId, [copyCartLine] as any);\r\n console.log('Cartline result after success', updatedCartLinesResult);\r\n const refreshCart = await cartState.refreshCart({});\r\n console.log('Refresh cart', refreshCart);\r\n\r\n if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showModal) {\r\n setDisabled(false);\r\n openModal(true);\r\n } else if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showNotification) {\r\n setDisabled(false);\r\n const notification = new ItemSuccessfullyAddedToCartNotification(\r\n props.context,\r\n props.dialogStrings,\r\n props.imageSettings,\r\n props.gridSettings,\r\n product,\r\n data?.price,\r\n quantity,\r\n props.navigationUrl,\r\n props.telemetryContent!,\r\n props.id,\r\n props.typeName\r\n );\r\n NotificationsManager.instance().addNotification(notification);\r\n } else if (\r\n MsDyn365.isBrowser &&\r\n props.navigationUrl &&\r\n !props.isNavigationToCartPageDisabled &&\r\n (addToCartBehavior === undefined || addToCartBehavior === AddToCartBehavior.goToCart)\r\n ) {\r\n window.location.assign(props.navigationUrl);\r\n } else {\r\n setDisabled(false);\r\n }\r\n propagateResult(props, addToCartResult);\r\n } else {\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n addToCartResult?.errorDetails?.LocalizedMessage ?? 'Add to cart failed',\r\n props.dialogStrings?.closeNotificationLabel ?? ''\r\n )\r\n );\r\n\r\n propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: addToCartResult });\r\n setDisabled(false);\r\n }\r\n};\r\n\r\n/**\r\n * Callback to handle success of adding to cart.\r\n * @param props - Add to cart component props.\r\n * @param setDisabled - Callback to update disabled state of the component.\r\n * @param setItemsAddedToCartDialogOpen - Callback to update disabled state of the component.\r\n * @param setErrorMessage - Callback to update error message state of the component.\r\n * @param cartState - Current cart state.\r\n * @param addToCartInput - Input used for adding to cart.\r\n * @param addToCartResult - Result of adding to cart.\r\n */\r\nconst handleAddItemsToCartSuccess = async (\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\r\n setErrorMessage: (message: string) => void,\r\n cartState: ICartState,\r\n addToCartInput: {\r\n product: SimpleProduct;\r\n count: number;\r\n }[],\r\n addToCartResult: ICartActionResult\r\n) => {\r\n // Validate cart for line errors.\r\n const validationResult: CartLineValidationResults = await CartsDataActions.validateForCheckoutAsync(\r\n { callerContext: props.context.actionContext, bypassCache: 'none' },\r\n cartState.cart.Id,\r\n cartState.cart.Version\r\n );\r\n const errorCount = (validationResult.ValidationFailuresByCartLines ?? []).length;\r\n const singleErrorCount = 1;\r\n const errorText = errorCount === singleErrorCount ? props.dialogStrings?.oneErrorText : props.dialogStrings?.multiErrorsText;\r\n const errorMessage =\r\n errorCount > zero ? format(props.dialogStrings?.validationErrorMessage ?? '', errorCount.toString(), errorText) : '';\r\n\r\n setErrorMessage(errorMessage);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n const addToCartBehavior = props.context.app.config.addToCartBehavior;\r\n\r\n if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showModal) {\r\n setDisabled(false);\r\n setItemsAddedToCartDialogOpen(true);\r\n } else if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showNotification) {\r\n setDisabled(false);\r\n const itemsAddedResource: IItemsAddedToCartResources = {\r\n viewCartButtonText: props.dialogStrings.goToCartText,\r\n closeButtonLabel: props.dialogStrings.closeNotificationLabel,\r\n itemsAddedToCartHeaderText: props.dialogStrings.headerMessageText,\r\n itemsAddedToCartFormatText: props.dialogStrings.headerItemFormatText,\r\n linesAddedToCartFormatText: props.dialogStrings.headerLinesFormatText ?? '{0}',\r\n itemsAddedValidationErrorMessage: errorMessage\r\n };\r\n\r\n const notification = new MultiItemsSuccessfullyAddedToCartNotification(\r\n props.context,\r\n itemsAddedResource,\r\n props.imageSettings,\r\n props.gridSettings,\r\n addToCartInput,\r\n props.navigationUrl,\r\n props.telemetryContent!,\r\n props.id,\r\n props.typeName\r\n );\r\n NotificationsManager.instance().addNotification(notification);\r\n } else if (\r\n MsDyn365.isBrowser &&\r\n props.navigationUrl &&\r\n !props.isNavigationToCartPageDisabled &&\r\n (addToCartBehavior === undefined || addToCartBehavior === AddToCartBehavior.goToCart)\r\n ) {\r\n window.location.assign(props.navigationUrl);\r\n } else {\r\n setDisabled(false);\r\n }\r\n propagateResult(props, addToCartResult);\r\n};\r\n\r\n/**\r\n * Add one or multi item to cart from buy again.\r\n * @param props -- The props.\r\n * @param setDisabled -- The set disable call back.\r\n * @param setItemsAddedToCartDialogOpen -- The open modal call back.\r\n * @param setErrorMessage -- The set error message call back.\r\n */\r\nconst addItemsToCart = async (\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\r\n setErrorMessage: (message: string) => void\r\n): Promise => {\r\n const addToCartInput = await getAddToCartInputFromProps(props);\r\n\r\n if (!ArrayExtensions.hasElements(addToCartInput)) {\r\n return;\r\n }\r\n\r\n console.log('Add items to cart', addToCartInput);\r\n\r\n const cartState = await getCartState(props.context.actionContext);\r\n const addToCartResult = await cartState.addProductsToCart(addToCartInput);\r\n\r\n if (addToCartResult.status === 'SUCCESS') {\r\n await handleAddItemsToCartSuccess(\r\n props,\r\n setDisabled,\r\n setItemsAddedToCartDialogOpen,\r\n setErrorMessage,\r\n cartState,\r\n addToCartInput,\r\n addToCartResult\r\n );\r\n } else {\r\n if (props.dialogStrings?.buyAgainNotificationTitle) {\r\n // For buy again show simple error notification.\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n props.dialogStrings.buyAgainNotificationTitle,\r\n props.dialogStrings.buyAgainNotificationCloseAriaLabel ?? ''\r\n )\r\n );\r\n } else {\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n addToCartResult.errorDetails?.LocalizedMessage ?? 'Add to cart failed',\r\n props.dialogStrings?.closeNotificationLabel ?? ''\r\n )\r\n );\r\n }\r\n\r\n propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: addToCartResult });\r\n setDisabled(false);\r\n }\r\n};\r\n\r\n/**\r\n * Interface for add to cart component.\r\n */\r\nexport interface IAddtoCartComponent extends IComponent {\r\n onClick(): (event: React.MouseEvent, props: IAddToCartComponentProps) => void;\r\n}\r\n\r\n/**\r\n * On click function.\r\n * @param _event - The mouse event.\r\n * @param props - The props.\r\n * @param setDisabled - Flag to define whether the element is disabled.\r\n * @param openModal - Flag to specify if it should open in a modal window.\r\n * @param setItemsAddedToCartDialogOpen - Sets items added to cart while dialog is open.\r\n * @param setErrorMessage - Error message.\r\n */\r\nconst onClick = async (\r\n _event: React.MouseEvent,\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n openModal: (opened: boolean) => void,\r\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\r\n setErrorMessage: (message: string) => void\r\n): Promise => {\r\n if (!ArrayExtensions.hasElements(props.products)) {\r\n const cartError = addToCartError(props);\r\n\r\n if (cartError) {\r\n propagateError(props, cartError);\r\n return;\r\n }\r\n\r\n setDisabled(true);\r\n }\r\n\r\n const hasOrderDetailsProducts =\r\n ArrayExtensions.hasElements(props.orderDetailsProducts) && props.orderDetailsProducts.length > defaultQuantity;\r\n const hasProducts = ArrayExtensions.hasElements(props.products) && props.products.length > defaultQuantity;\r\n\r\n const hasMultipleProducts = hasOrderDetailsProducts || hasProducts;\r\n\r\n if (props.shouldSkipSiteSettings && hasMultipleProducts) {\r\n await addItemsToCart(props, setDisabled, setItemsAddedToCartDialogOpen, setErrorMessage);\r\n } else {\r\n await addOneItemToCart(props, setDisabled, openModal);\r\n }\r\n};\r\n\r\n/**\r\n * Add to cart component action constant.\r\n */\r\nconst AddToCartComponentActions = {\r\n onClick\r\n};\r\n\r\n/**\r\n * Add to cart component.\r\n * @param props - The props.\r\n * @returns - The add to cart component.\r\n */\r\nexport const AddToCartFunctionalComponent: React.FC = (props: IAddToCartComponentProps) => {\r\n const [disabled, setDisabled] = useState(false);\r\n const [modalOpen, setModalOpen] = useState(false);\r\n const [isItemsAddedToCartDialogOpen, setItemsAddedToCartDialogOpen] = useState(false);\r\n const [errorMessage, setErrorMessage] = useState('');\r\n const [addToCartInput, setAddToCartInput] = useState<\r\n {\r\n product: SimpleProduct;\r\n count: number;\r\n }[]\r\n >([]);\r\n\r\n const onClickHandler = async (event: React.MouseEvent) => {\r\n await AddToCartComponentActions.onClick(event, props, setDisabled, setModalOpen, setItemsAddedToCartDialogOpen, setErrorMessage);\r\n // let close: HTMLElement = document.getElementsByClassName('msc-modal__close-button')[0] as HTMLElement;\r\n var quickviewDiv = document.querySelector('.ms-quickView__dialog');\r\n var closeButton = quickviewDiv?.querySelector('.msc-modal__close-button') as HTMLElement;\r\n closeButton.click();\r\n };\r\n\r\n /**\r\n * Close dialog.\r\n */\r\n const closeItemsAddedToCartDialog = React.useCallback(() => {\r\n setItemsAddedToCartDialogOpen(false);\r\n }, []);\r\n\r\n const priceComponent = props.data?.price ? (\r\n \r\n ) : (\r\n ''\r\n );\r\n\r\n const popupProps: IPopupProps = {\r\n context: props.context,\r\n className: 'msc-add-to-cart',\r\n id: props.id,\r\n typeName: props.typeName,\r\n data: { product: props.data?.product, price: props.data?.price },\r\n dialogStrings: props.dialogStrings,\r\n imageSettings: props.imageSettings,\r\n gridSettings: props.context.request.gridSettings,\r\n productQuantity: props.quantity !== undefined ? props.quantity : defaultQuantity,\r\n priceComponent,\r\n navigationUrl: props.navigationUrl,\r\n modalOpen,\r\n setModalOpen,\r\n telemetryContent: props.telemetryContent\r\n };\r\n\r\n const itemsAddedResource: IItemsAddedToCartResources = {\r\n viewCartButtonText: props.dialogStrings?.goToCartText ?? '',\r\n closeButtonLabel: props.dialogStrings?.closeNotificationLabel ?? 'Close',\r\n itemsAddedToCartHeaderText: props.dialogStrings?.headerMessageText ?? '',\r\n itemsAddedToCartFormatText: props.dialogStrings?.headerItemFormatText ?? '',\r\n linesAddedToCartFormatText: props.dialogStrings?.headerLinesFormatText ?? '{0}',\r\n itemsAddedValidationErrorMessage: errorMessage\r\n };\r\n\r\n const renderModalPopup = ;\r\n const label = getLinkText(props);\r\n const payload = getPayloadObject(TelemetryEvent.AddToCart, props.telemetryContent!, label, '');\r\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\r\n const buttonClassName = props.shouldSkipSiteSettings ? '' : 'msc-add-to-cart ';\r\n\r\n React.useEffect(() => {\r\n /**\r\n * Retrieves add to cart input and updates the state.\r\n */\r\n const retrieveAddToCartInput = async () => {\r\n const retrievedInput = await getAddToCartInputFromProps(props);\r\n setAddToCartInput(retrievedInput);\r\n };\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call async method as per the documentation of react useEffect.\r\n retrieveAddToCartInput();\r\n }, [props, setAddToCartInput]);\r\n\r\n return (\r\n <>\r\n {renderModalPopup}\r\n \r\n {props.addToCartText}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\n// Set default props\r\nAddToCartFunctionalComponent.defaultProps = {\r\n quantity: defaultQuantity\r\n};\r\n\r\n/**\r\n * Resolves whether product is in stock.\r\n * @param props - The add to cart component props.\r\n * @returns Gets the link text.\r\n */\r\nconst getLinkText = (props: IAddToCartComponentProps): string => {\r\n return shouldShowOutOfStock(props, false) && props.outOfStockText ? props.outOfStockText : props.addToCartText;\r\n};\r\n\r\n/**\r\n * Resolves whether product is in stock.\r\n * @param props - The add to cart component props.\r\n * @returns The add to cart failure result.\r\n */\r\nconst addToCartError = (props: IAddToCartComponentProps): IAddToCartFailureResult | undefined => {\r\n const {\r\n data,\r\n productAvailability,\r\n isCustomPriceSelected,\r\n customPriceAmount,\r\n maximumKeyInPrice,\r\n minimumKeyInPrice,\r\n defaultMaximumKeyInPrice = 100,\r\n defaultMinimumKeyInPrice = 10\r\n } = props;\r\n\r\n if (!data || !data.product.RecordId) {\r\n // No product exists, won't be able to add to cart\r\n return { failureReason: 'EMPTYINPUT' };\r\n }\r\n\r\n if (data.product.Dimensions) {\r\n const missingDimensions = data.product.Dimensions.filter(\r\n dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value)\r\n );\r\n\r\n if (ArrayExtensions.hasElements(missingDimensions)) {\r\n // At least one dimension with no value exists on the product, won't be able to add to cart\r\n return { failureReason: 'MISSINGDIMENSION', missingDimensions };\r\n }\r\n }\r\n\r\n if (shouldShowOutOfStock(props, true)) {\r\n const defaultAvailableQuantity = 0; // Showing as out of stock if no available products found.\r\n const availableQuantity = productAvailability?.AvailableQuantity ?? defaultAvailableQuantity;\r\n const stockLeft = Math.max(availableQuantity, defaultAvailableQuantity);\r\n\r\n return { failureReason: 'OUTOFSTOCK', stockLeft };\r\n }\r\n\r\n // When Custom price is selected, if there is no keyed-in price or keyed-in price is out of limit, should return error.\r\n if (\r\n isCustomPriceSelected &&\r\n (!customPriceAmount ||\r\n customPriceAmount > (maximumKeyInPrice || defaultMaximumKeyInPrice) ||\r\n customPriceAmount < (minimumKeyInPrice || defaultMinimumKeyInPrice))\r\n ) {\r\n return { failureReason: 'INVALIDCUSTOMAMOUNT' };\r\n }\r\n\r\n // Only allow adding to cart if not showing out of stock\r\n return undefined;\r\n};\r\n\r\n/**\r\n * Resolves whether product is in stock.\r\n * @param props - The add to cart component props.\r\n * @param includeCurrentQuantity - Flag to specify whether current quantity should be included.\r\n * @returns The dialog element.\r\n */\r\nconst shouldShowOutOfStock = (props: IAddToCartComponentProps, includeCurrentQuantity: boolean): boolean => {\r\n if (props.context.app.config.enableStockCheck === undefined || props.context.app.config.enableStockCheck === false) {\r\n return false;\r\n }\r\n\r\n // When skip site settings do not need show out of stock on adding to cart\r\n if (props.shouldSkipSiteSettings) {\r\n return false;\r\n }\r\n\r\n if (\r\n props.isLoading ||\r\n props.isProductQuantityLoading ||\r\n props.isUpdatingDimension ||\r\n props.isLoadingDeliveryOptions ||\r\n props.isUpdatingDeliveryOptions ||\r\n props.isAddServiceItemToCart\r\n ) {\r\n // Out of stock turn off, don't bother showing out of stock\r\n return false;\r\n }\r\n\r\n if (!props.data || !props.data.product.RecordId) {\r\n // No product exists, don't bother showing out of stock\r\n return false;\r\n }\r\n\r\n const hasAvailableProducts = props.hasAvailableProducts ?? true;\r\n if (!hasAvailableProducts) {\r\n return true;\r\n }\r\n\r\n if (props.data.product.Dimensions) {\r\n if (props.data.product.Dimensions.find(dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value))) {\r\n // At least one dimension with no value exists on the product, so also don't show out of stock\r\n return false;\r\n }\r\n }\r\n\r\n const includedQuantityNumber = includeCurrentQuantity && props.quantity ? props.quantity : defaultQuantity;\r\n\r\n return !(\r\n props.productAvailability &&\r\n props.productAvailability.AvailableQuantity !== undefined &&\r\n props.productAvailability.AvailableQuantity >= includedQuantityNumber\r\n );\r\n};\r\n\r\nconst isIntermediateState = (props: IAddToCartComponentProps): boolean => {\r\n if (props.data?.product.Dimensions) {\r\n if (props.data.product.Dimensions.find(dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value))) {\r\n // At least one dimension with no value exists on the product, so also not in intermediate state\r\n return false;\r\n }\r\n }\r\n\r\n if (!props.isLoading && !props.isUpdatingDimension && !props.isLoadingDeliveryOptions && !props.isUpdatingDeliveryOptions) {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nexport const AddToCartComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride<\r\n // @ts-expect-error\r\n IAddtoCartComponent\r\n>('AddToCart', { component: AddToCartFunctionalComponent, ...AddToCartComponentActions });\r\n\r\nexport default AddToCartComponent;\r\n"],"names":["AddToCartBehavior","propagateResult","props","result","onAdd","propagateError","onError","getAddToCartInputFromProps","async","_props$orderDetailsPr","_props$data","products","orderDetailsProducts","filter","product","ObjectExtensions","simpleProduct","input","map","count","salesLine","Quantity","ArrayExtensions","actionContext","context","apiSettings","requestContext","searchCriteriaInput","Context","ChannelId","channelId","CatalogId","catalogId","IncludeAttributes","Ids","productId","productSearchResultsWithImages","ProductsDataActions","callerContext","productSearchResult","newProductSearchResult","_objectSpread","newImageUrl","generateProductImageUrl","PrimaryImageUrl","item","productData","find","RecordId","_productData$BasePric","ProductTypeValue","ProductType","AdjustedPrice","Price","BasePrice","quantity","_props$quantity","data","addItemsToCart","setDisabled","setItemsAddedToCartDialogOpen","setErrorMessage","addToCartInput","console","log","cartState","getCartState","addToCartResult","addProductsToCart","status","_validationResult$Val","_props$dialogStrings2","_props$dialogStrings3","_props$dialogStrings$2","_props$dialogStrings4","errorCount","CartsDataActions","bypassCache","cart","Id","Version","ValidationFailuresByCartLines","length","errorText","dialogStrings","oneErrorText","multiErrorsText","errorMessage","format","validationErrorMessage","toString","addToCartBehavior","app","config","showModal","showNotification","_props$dialogStrings$3","itemsAddedResource","viewCartButtonText","goToCartText","closeButtonLabel","closeNotificationLabel","itemsAddedToCartHeaderText","headerMessageText","itemsAddedToCartFormatText","headerItemFormatText","linesAddedToCartFormatText","headerLinesFormatText","itemsAddedValidationErrorMessage","notification","MultiItemsSuccessfullyAddedToCartNotification","imageSettings","gridSettings","navigationUrl","telemetryContent","id","typeName","NotificationsManager","addNotification","MsDyn365","isNavigationToCartPageDisabled","undefined","goToCart","window","location","assign","handleAddItemsToCartSuccess","_props$dialogStrings5","_props$dialogStrings$4","_addToCartResult$erro2","_addToCartResult$erro3","_props$dialogStrings$5","_props$dialogStrings6","buyAgainNotificationTitle","ErrorNotification","buyAgainNotificationCloseAriaLabel","errorDetails","LocalizedMessage","failureReason","cartActionResult","AddToCartComponentActions","onClick","_event","openModal","cartError","addToCartError","hasOrderDetailsProducts","hasProducts","hasMultipleProducts","shouldSkipSiteSettings","_cartState$cart","_cartState$cart$CartL","_addToCartResult","artifact","artifactsData","resourcePageURL","isEdit","cartLineID","cartLineIds","removeCartLines","catch","error","matchingCartLines","CartLines","cartLine","ItemId","_props$productAvailab","addProductToCart","availableQuantity","productAvailability","AvailableQuantity","additionalProperties","orderQuantityLimitsFeatureIsEnabled","isOrderQuantityLimitsFeatureEnabled","enableStockCheck","isPriceKeyedIn","customPrice","customPriceAmount","isAddEmailDeliveryItemToCart","_cartState$cart2","cartLines","cartId","copyCartLine","ExtensionProperties","Key","Value","StringValue","JSON","stringify","productUrl","updatedCartLinesResult","updateCartLinesAsync","refreshCart","ItemSuccessfullyAddedToCartNotification","price","_addToCartResult$erro","_addToCartResult2","_addToCartResult2$err","_props$dialogStrings$","_props$dialogStrings","addOneItemToCart","AddToCartFunctionalComponent","_props$data2","_props$dialogStrings7","_props$dialogStrings8","_props$dialogStrings9","_props$data3","_props$data4","_props$dialogStrings$6","_props$dialogStrings10","_props$dialogStrings$7","_props$dialogStrings11","_props$dialogStrings$8","_props$dialogStrings12","_props$dialogStrings$9","_props$dialogStrings13","_props$dialogStrings$10","_props$dialogStrings14","disabled","useState","modalOpen","setModalOpen","isItemsAddedToCartDialogOpen","setAddToCartInput","closeItemsAddedToCartDialog","React","priceComponent","PriceComponent","freePriceText","originalPriceText","currentPriceText","popupProps","className","request","productQuantity","renderModalPopup","Popup","Object","label","getLinkText","payload","getPayloadObject","TelemetryEvent","attributes","getTelemetryAttributes","buttonClassName","retrievedInput","retrieveAddToCartInput","classnames","addToCartText","title","event","quickviewDiv","document","querySelector","click","isIntermediateState","shouldShowOutOfStock","ItemsAddedToCartDialogComponent","isModalOpen","onClose","defaultProps","outOfStockText","isCustomPriceSelected","maximumKeyInPrice","minimumKeyInPrice","defaultMaximumKeyInPrice","defaultMinimumKeyInPrice","Dimensions","missingDimensions","dimension","DimensionValue","_productAvailability$","defaultAvailableQuantity","stockLeft","Math","max","includeCurrentQuantity","_props$hasAvailablePr","isLoading","isProductQuantityLoading","isUpdatingDimension","isLoadingDeliveryOptions","isUpdatingDeliveryOptions","isAddServiceItemToCart","hasAvailableProducts","includedQuantityNumber","_props$data5","AddToCartComponent","msdyn365Commerce","component","_props$addToCartArial","_props$addToCartArial2","addToCartArialLabel"],"sourceRoot":""}