{"version":3,"file":"static/js/80bf162a39e80cd44329.bundle.js","mappings":"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","sources":["webpack://msdyn365.commerce.online/./src/modules/c-quickview/utilities/get-valid-product-images.ts?ca7b","webpack://msdyn365.commerce.online/./src/modules/c-quickview/c-quickview.tsx?e528","webpack://msdyn365.commerce.online/./src/modules/c-quickview/utilities/get-product-details.ts?73aa","webpack://msdyn365.commerce.online/./src/modules/c-quickview/c-quickview.view.tsx?5a7a","webpack://msdyn365.commerce.online/./lib/c-quickview/module-registration.js?6665","webpack://msdyn365.commerce.online/external var \"React\"?0d3b","webpack://msdyn365.commerce.online/external var \"ReactDOM\"?853b"],"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\n/* eslint-disable no-duplicate-imports */\r\nimport { IActionContext, IImageData, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { MediaLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { getMediaLocationsForSelectedVariant, MediaLocationsForSelectedVariantInput } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\nexport async function getValidProductImages(\r\n productId: number, channelId: number,\r\n actionContext: IActionContext, imageSettings: IImageSettings,\r\n selectedProduct?: SimpleProduct): Promise {\r\n const actionInput = new MediaLocationsForSelectedVariantInput(\r\n productId,\r\n channelId,\r\n selectedProduct\r\n );\r\n\r\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\r\n .then(mediaLocations => {\r\n if (mediaLocations) {\r\n return Promise.all(mediaLocations.map(async (mediaLocation) => validateMediaLocaionAsync(mediaLocation, imageSettings)))\r\n .then(pairs => {\r\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\r\n });\r\n }\r\n return [];\r\n }).catch(error => {\r\n actionContext.telemetry.exception(error);\r\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\r\n return [];\r\n });\r\n}\r\n\r\nasync function validateMediaLocaionAsync(mediaLocation: MediaLocation, imageSettings: IImageSettings): Promise<[IImageData, boolean]> {\r\n const imageData = {\r\n src: mediaLocation.Uri || '',\r\n altText: mediaLocation.AltText || ''\r\n };\r\n\r\n const imageSettingsVal = ((imageSettings.viewports.lg!.q!).replace(/[\"']+/g, ''));\r\n\r\n if (imageData.src === '') {\r\n return [imageData, false];\r\n }\r\n\r\n const imageConcatVal = `${imageData.src}` + '&' + `${imageSettingsVal}`;\r\n\r\n return new Promise<[IImageData, boolean]>((resolve) => {\r\n try {\r\n const http = new XMLHttpRequest();\r\n http.open('HEAD', imageConcatVal, true);\r\n\r\n http.addEventListener('load', () => {\r\n resolve([imageData, http.status === 200 || http.status === 201]);\r\n });\r\n\r\n http.addEventListener('error', () => {\r\n resolve([imageData, false]);\r\n });\r\n\r\n http.send();\r\n } catch {\r\n resolve([imageData, false]);\r\n }\r\n });\r\n}\r\n","/* eslint-disable security/detect-object-injection */\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\n/* eslint-disable no-duplicate-imports */\r\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\r\nimport { Carousel, ICarouselProps } from '@msdyn365-commerce/components';\r\nimport { IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\r\nimport {\r\n ProductDeliveryOptions,\r\n ProductDimension,\r\n ProductDimensionValue,\r\n ProductPrice,\r\n ReleasedProductType,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n FinitePromiseQueue,\r\n FinitePromiseQueueError,\r\n getDeliveryOptionsForSelectedVariant,\r\n GetDeliveryOptionsForSelectedVariantInput,\r\n getDimensionsForSelectedVariant,\r\n GetDimensionsForSelectedVariantInput,\r\n getPriceForSelectedVariant,\r\n getProductAvailabilitiesForSelectedVariant,\r\n getProductPageUrlSync,\r\n getSelectedVariant,\r\n IProductInventoryInformation,\r\n IPromiseQueue,\r\n ISelectedProduct,\r\n ObjectExtensions,\r\n PriceForSelectedVariantInput,\r\n ProductAvailabilitiesForSelectedVariantInput,\r\n SelectedVariantInput\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Button,\r\n format,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n IComponentNodeProps,\r\n IModuleProps,\r\n IncrementalQuantity,\r\n INodeProps,\r\n ISingleSlideCarouselProps,\r\n isMobile,\r\n ITelemetryContent,\r\n KeyCodes,\r\n Modal,\r\n ModalBody,\r\n ModalFooter,\r\n ModalHeader,\r\n NodeTag,\r\n onTelemetryClick,\r\n SingleSlideCarousel,\r\n TelemetryConstant,\r\n VariantType\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { Spinner, SpinnerSize } from 'office-ui-fabric-react';\r\nimport React, { ReactNode } from 'react';\r\n\r\nimport {\r\n getBuyboxAddToCart,\r\n getBuyBoxInventoryLabel,\r\n getBuyboxKeyInPrice,\r\n getBuyboxProductAddToWishlist,\r\n getBuyboxProductDescription,\r\n getBuyboxProductPrice,\r\n getBuyboxProductRating,\r\n getBuyboxProductTitle,\r\n getBuyboxProductUnitOfMeasure,\r\n getQuantityLimitsMessages,\r\n RetailDefaultOrderQuantityLimitsFeatureName\r\n} from './../c-buybox/components/c-buybox-component';\r\nimport {\r\n IBuyboxAddToCartViewProps,\r\n IBuyboxAddToOrderTemplateViewProps,\r\n IBuyboxAddToWishlistViewProps,\r\n IBuyboxCallbacks,\r\n IBuyboxCommonData,\r\n IBuyboxCommonResources,\r\n IBuyboxExtentedProps,\r\n IBuyboxKeyInPriceViewProps,\r\n IBuyboxProductConfigureViewProps,\r\n IBuyboxProductQuantityViewProps,\r\n IBuyboxState,\r\n IErrorState,\r\n IProductDetails\r\n} from '../c-buybox/components/c-buyboxInterface';\r\nimport { getBuyboxProductConfigure } from './../c-buybox/components/c-buybox-product-configure';\r\nimport { ICQuickviewData } from './c-quickview.data';\r\nimport { ICQuickviewProps, ICQuickviewResources } from './c-quickview.props.autogenerated';\r\nimport { getProductDetails } from './utilities/get-product-details';\r\nimport { getValidProductImages } from './utilities/get-valid-product-images';\r\nimport { ICBuyboxProps, ICBuyboxData } from '../c-buybox';\r\nimport { IDropdownOnSelectionChangeNotification } from '../../common/components/dropdown';\r\n\r\n/**\r\n * QuickView props Interface.\r\n */\r\nexport interface IQuickviewViewProps extends ICQuickviewProps {\r\n quickView: IModuleProps;\r\n quickViewButton: React.ReactNode;\r\n ModalContainer: IModuleProps;\r\n ModalHeaderContainer: INodeProps;\r\n ModalHeaderContent: React.ReactNode;\r\n ModalFooterContainer: INodeProps;\r\n ModalBodyContainer: INodeProps;\r\n cartContainerProps: INodeProps;\r\n state: IBuyboxState;\r\n ModuleProps?: IModuleProps;\r\n ProductInfoContainerProps: INodeProps;\r\n MediaGalleryContainerProps: INodeProps;\r\n callbacks?: IBuyboxCallbacks;\r\n title?: React.ReactNode;\r\n description?: React.ReactNode;\r\n configure?: IBuyboxProductConfigureViewProps;\r\n inventoryLabel?: React.ReactNode;\r\n rating?: React.ReactNode;\r\n price?: React.ReactNode;\r\n addToCart?: IBuyboxAddToCartViewProps;\r\n addToOrderTemplate?: IBuyboxAddToOrderTemplateViewProps;\r\n addToWishlist?: IBuyboxAddToWishlistViewProps;\r\n max: number | undefined;\r\n keyInPrice?: IBuyboxKeyInPriceViewProps;\r\n quantity?: IBuyboxProductQuantityViewProps;\r\n quantityLimitsMessages?: React.ReactNode;\r\n CarouselProps: INodeProps;\r\n Thumbnails: IQuickViewThumbnailsViewProps;\r\n seeDetailsbutton: React.ReactNode;\r\n isModalOpen: boolean;\r\n loading?: React.ReactNode;\r\n unitOfMeasure?: React.ReactNode;\r\n productDetails?: IProductDetails | undefined;\r\n isMobileDevice?: boolean;\r\n}\r\n\r\n/**\r\n * QuickView extend props Interface.\r\n */\r\nexport interface IQuickviewExtentedProps extends ICQuickviewProps {\r\n selectedProductId?: number;\r\n selectedDimensions?: ProductDimension[];\r\n}\r\n\r\n/**\r\n * QuickView thumbnails props Interface.\r\n */\r\nexport interface IQuickViewThumbnailsViewProps {\r\n ThumbnailsContainerProps: INodeProps;\r\n SingleSlideCarouselComponentProps: INodeProps;\r\n items?: IQuickViewThumbnailItemViewProps[];\r\n}\r\n\r\n/**\r\n * QuickView thumbnail item view props Interface.\r\n */\r\nexport interface IQuickViewThumbnailItemViewProps {\r\n ThumbnailItemContainerProps: INodeProps;\r\n Picture: React.ReactElement;\r\n}\r\n\r\n/**\r\n * QuickView state Interface.\r\n */\r\nexport interface IQuickViewState extends IBuyboxState {\r\n isDataLoaded: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * Quickview component.\r\n * @extends {React.Component>}\r\n */\r\nclass Quickview extends React.Component, IQuickViewState> {\r\n /**\r\n * A queue of tasks of processing the changes in the dimensions.\r\n * Limit to two processes:\r\n * 1 - for the current process, which is under execution at the moment.\r\n * 2 - next process, which will process the latest version of data.\r\n * @remark Enqueueing new promises will discard the previous ones (except the one which is under processing).\r\n */\r\n private readonly dimensionUpdateQueue: IPromiseQueue = new FinitePromiseQueue(2);\r\n\r\n private dimensions: { [id: number]: string } = {};\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private productDetails: IProductDetails | undefined;\r\n\r\n private readonly quickViewCallbacks: IBuyboxCallbacks = {\r\n updateQuantity: (newQuantity: number): boolean => {\r\n const errorState = { ...this.state.errorState };\r\n errorState.quantityError = undefined;\r\n errorState.otherError = undefined;\r\n\r\n this.setState({ quantity: newQuantity, errorState });\r\n return true;\r\n },\r\n updateErrorState: (newErrorState: IErrorState): void => {\r\n this.setState({ errorState: newErrorState });\r\n },\r\n updateSelectedProduct: (\r\n newSelectedProduct: Promise,\r\n newInventory: IProductInventoryInformation | undefined,\r\n newPrice: ProductPrice | undefined,\r\n newDeliveryOptions: ProductDeliveryOptions | undefined\r\n ): void => {\r\n this.setState({\r\n selectedProduct: newSelectedProduct,\r\n productAvailableQuantity: newInventory,\r\n productDeliveryOptions: newDeliveryOptions\r\n });\r\n this._updatePrice(newPrice);\r\n },\r\n dimensionSelectedAsync: async (selectedDimensionId: number, selectedDimensionValueId: string): Promise => {\r\n this.dimensions[selectedDimensionId] = selectedDimensionValueId;\r\n return this.dimensionUpdateQueue\r\n .enqueue(async () => {\r\n return this._updateDimensions();\r\n })\r\n .catch((error: any) => {\r\n // Ignore discarded processes.\r\n if (error !== FinitePromiseQueueError.ProcessWasDiscardedFromTheQueue) {\r\n throw error;\r\n }\r\n });\r\n },\r\n getDropdownName: (dimensionType: number, resources: IBuyboxCommonResources & ICQuickviewResources): string => {\r\n return this._getDropdownName(dimensionType, resources);\r\n },\r\n changeModalOpen: (isModalOpen: boolean): void => {\r\n this._hideQuickViewDialog();\r\n },\r\n changeUpdatingDimension: (isUpdatingDimension: boolean): void => {\r\n this.setState({ isUpdatingDimension });\r\n },\r\n updateKeyInPrice: (customPrice: number): void => {\r\n // Remove custom amount error when updating the custom price\r\n const errorState = { ...this.state.errorState };\r\n errorState.customAmountError = undefined;\r\n\r\n this.setState({ isPriceKeyedIn: true, keyInPriceAmount: customPrice, errorState });\r\n this._updatePrice(this.state.productPrice, customPrice);\r\n },\r\n handleIsDimensionSelected: (): void => {\r\n this.setState({\r\n isDimensionSelected: true\r\n });\r\n },\r\n handleSelectedDimension: (dimension: IDropdownOnSelectionChangeNotification): void => {\r\n this.setState({ currentSelectedDimension: dimension });\r\n }\r\n };\r\n\r\n private readonly defaultGalleryImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=767&h=767&m=8', w: 0, h: 0 },\r\n sm: { q: 'w=600&h=600&m=8', w: 0, h: 0 },\r\n md: { q: 'w=600&h=772&m=8', w: 0, h: 0 },\r\n lg: { q: 'h=772&m=8', w: 0, h: 0 }\r\n },\r\n lazyload: true,\r\n cropFocalRegion: true\r\n };\r\n\r\n private readonly defaultThumbnailImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=100&m=8', w: 100, h: 0 },\r\n lg: { q: 'w=100&m=8', w: 100, h: 0 }\r\n },\r\n lazyload: true,\r\n cropFocalRegion: true\r\n };\r\n\r\n public constructor(props: ICQuickviewProps) {\r\n super(props);\r\n this.state = {\r\n modalOpen: false,\r\n quantity: 1,\r\n min: undefined,\r\n max: undefined,\r\n errorState: {\r\n configureErrors: {}\r\n },\r\n selectedProduct: undefined,\r\n productPrice: undefined,\r\n productDeliveryOptions: undefined,\r\n isUpdatingDimension: false,\r\n activeIndex: 0,\r\n animating: false,\r\n mediaGalleryItems: undefined,\r\n isDataLoaded: false,\r\n loadOOSMessage: false,\r\n isDimensionSelected: false,\r\n currentSelectedDimension: undefined\r\n };\r\n\r\n this._quickViewCloseButtonclick = this._quickViewCloseButtonclick.bind(this);\r\n this.telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\r\n }\r\n\r\n /**\r\n * React should component udpate function.\r\n * @param nextProps - Next Props.\r\n * @param nextState - Next State.\r\n * @returns Boolean - Whether the module will rerender or not.\r\n */\r\n public shouldComponentUpdate(nextProps: ICQuickviewProps, nextState: IBuyboxState): boolean {\r\n if (this.state === nextState && this.props.data === nextProps.data) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const {\r\n config: { className = '' },\r\n resources\r\n } = this.props;\r\n const { max } = this.state;\r\n const product = this.productDetails?.product ? this.productDetails.product : undefined;\r\n const props = this.props as IBuyboxExtentedProps;\r\n const defaultMinimumKeyInPrice = 10;\r\n const defaultMaximumKeyInPrice = 100;\r\n const buyboxProps = (this.props as unknown) as ICBuyboxProps;\r\n // var buyboxConfig: ICBuyboxProps;\r\n const isMobileDevice = isMobile({ variant: VariantType.Viewport, context: this.props.context.request }) === 'xs';\r\n const viewprops: IQuickviewViewProps = {\r\n ...(this.props as IQuickviewExtentedProps),\r\n state: this.state,\r\n productDetails: this.productDetails,\r\n isModalOpen: this.state.modalOpen!,\r\n quickView: {\r\n moduleProps: this.props,\r\n className: classnames('ms-quickView', className),\r\n tag: 'div'\r\n },\r\n isMobileDevice,\r\n quickViewButton: (\r\n \r\n ),\r\n ModalContainer: {\r\n moduleProps: this.props,\r\n tag: Modal,\r\n className: 'ms-quickView__dialog',\r\n isOpen: this.state.modalOpen,\r\n 'aria-label': format(resources.quickViewAriaLabel, this.productDetails?.product?.Name),\r\n toggle: this._quickViewCloseButtonclick,\r\n modalTransition: { timeout: 0 },\r\n shouldUpdateFocusToFirstElement: this.state.isDataLoaded\r\n },\r\n ModalHeaderContainer: {\r\n tag: ModalHeader,\r\n className: 'ms-quickView__header',\r\n toggle: this._quickViewCloseButtonclick\r\n },\r\n ModalFooterContainer: {\r\n tag: ModalFooter,\r\n className: 'ms-quickView__footer'\r\n },\r\n ModalHeaderContent: '',\r\n ModalBodyContainer: {\r\n tag: ModalBody,\r\n className: 'ms-quickView__body'\r\n },\r\n cartContainerProps: {\r\n className: 'ms-quickView__product-add-to-cart'\r\n },\r\n ProductInfoContainerProps: {\r\n className: 'ms-quickView__content'\r\n },\r\n MediaGalleryContainerProps: {\r\n className: 'ms-quickView__media-gallery'\r\n },\r\n seeDetailsbutton: this._renderSeeDetailButton(product),\r\n loading: !this.state.isDataLoaded && (\r\n \r\n ),\r\n callbacks: this.quickViewCallbacks,\r\n title: this.state.isDataLoaded && getBuyboxProductTitle(props, this.productDetails),\r\n description: this.state.isDataLoaded && getBuyboxProductDescription(props, this.productDetails),\r\n configure: this.state.isDataLoaded\r\n ? getBuyboxProductConfigure(\r\n props,\r\n this.state,\r\n this.quickViewCallbacks,\r\n buyboxProps,\r\n this.productDetails,\r\n this.props.selectedDimensions\r\n )\r\n : undefined,\r\n // // getBuyboxProductConfigure(props, this.state, this.quickViewCallbacks, this.props): undefined,\r\n price: this.state.isDataLoaded && getBuyboxProductPrice(props, this.state),\r\n unitOfMeasure: this.state.isDataLoaded && getBuyboxProductUnitOfMeasure(props, this.productDetails),\r\n rating:\r\n this.state.isDataLoaded && !this.props.context.app.config.hideRating && getBuyboxProductRating(props, this.productDetails),\r\n addToCart: this.state.isDataLoaded\r\n ? getBuyboxAddToCart(\r\n props,\r\n this.state,\r\n this.quickViewCallbacks,\r\n defaultMinimumKeyInPrice,\r\n defaultMaximumKeyInPrice,\r\n this.productDetails\r\n )\r\n : undefined,\r\n keyInPrice:\r\n this.state.isDataLoaded && this.props.config.enableKeyInPrice && this.state.isCustomPriceSelected\r\n ? getBuyboxKeyInPrice(props, this.state, this.quickViewCallbacks)\r\n : undefined,\r\n quantity: product?.IsGiftCard ? undefined : this._renderQuantity(this.props, this.state, this.quickViewCallbacks),\r\n inventoryLabel: this.state.isDataLoaded && getBuyBoxInventoryLabel(props, this.productDetails),\r\n addToWishlist: this.state.isDataLoaded\r\n ? getBuyboxProductAddToWishlist(props, this.state, this.quickViewCallbacks, this.productDetails)\r\n : undefined,\r\n quantityLimitsMessages: this.state.isDataLoaded && getQuantityLimitsMessages(props, this.state),\r\n max,\r\n CarouselProps: this._renderCarousel(),\r\n Thumbnails: this._renderThumbnails()\r\n };\r\n\r\n return this.props.renderView(viewprops) as React.ReactElement;\r\n }\r\n\r\n /**\r\n * Method to render detail button on quick view.\r\n * @param product - Simple product object.\r\n * @returns JSX element.\r\n */\r\n private readonly _renderSeeDetailButton = (product: SimpleProduct | undefined): JSX.Element => {\r\n const { config } = this.props;\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.seeDetails, '');\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n\r\n return (\r\n \r\n {config.seeDetailsLinkText}\r\n \r\n );\r\n };\r\n\r\n /**\r\n * Method to return carousel.\r\n * @returns Node props.\r\n */\r\n private readonly _renderCarousel = (): INodeProps => {\r\n const { config, resources } = this.props;\r\n let mediaGalleryItems: ReactNode[];\r\n let keys: (string | undefined)[];\r\n const galleryImageSettings = config.galleryImageSettings;\r\n if (galleryImageSettings) {\r\n galleryImageSettings.cropFocalRegion = true;\r\n }\r\n\r\n if (ArrayExtensions.hasElements(this.state.mediaGalleryItems)) {\r\n mediaGalleryItems = this.state.mediaGalleryItems.map((item: IImageData, index: number) => {\r\n return this._renderCarouselItemImageView(item, galleryImageSettings || this.defaultGalleryImageSettings, index);\r\n });\r\n keys = [...this.state.mediaGalleryItems.map(item => item.src)];\r\n } else {\r\n mediaGalleryItems = [this._renderEmptyImage(galleryImageSettings)];\r\n keys = ['empty'];\r\n }\r\n\r\n const props: IComponentNodeProps = {\r\n tag: Carousel,\r\n className: 'ms-media-gallery__carousel',\r\n items: mediaGalleryItems,\r\n activeIndex: this.state.activeIndex ?? 0,\r\n next: this.next,\r\n previous: this.previous,\r\n interval: false,\r\n directionTextPrev: resources.previousScreenshotFlipperText,\r\n directionTextNext: resources.nextScreenshotFlipperText,\r\n onIndicatorsClickHandler: this.goToIndex,\r\n handleOnExited: this.onExited,\r\n handleOnExiting: this.onExiting,\r\n key: keys\r\n };\r\n\r\n return props;\r\n };\r\n\r\n /**\r\n * Method to render thumbnails.\r\n * @returns QuickView Thumbnails view props.\r\n */\r\n private readonly _renderThumbnails = (): IQuickViewThumbnailsViewProps => {\r\n const { config, id, resources } = this.props;\r\n\r\n const thumbnailImageSettings = config.thumbnailImageSettings;\r\n if (thumbnailImageSettings) {\r\n thumbnailImageSettings.cropFocalRegion = true;\r\n }\r\n\r\n let mediaGalleryItems: IQuickViewThumbnailItemViewProps[];\r\n let keys: (string | undefined)[];\r\n if (ArrayExtensions.hasElements(this.state.mediaGalleryItems)) {\r\n mediaGalleryItems = this.state.mediaGalleryItems.map((item: IImageData, index: number) => {\r\n return this._getThumbnailItem(\r\n item,\r\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\r\n index,\r\n this.state.activeIndex!\r\n );\r\n });\r\n keys = [...this.state.mediaGalleryItems.map(item => item.src)];\r\n } else {\r\n mediaGalleryItems = [];\r\n keys = [];\r\n }\r\n\r\n return {\r\n ThumbnailsContainerProps: { className: 'ms-media-gallery__thumbnails-container' },\r\n SingleSlideCarouselComponentProps: {\r\n tag: SingleSlideCarousel,\r\n className: 'ms-media-gallery__thumbnails',\r\n flipperPrevLabel: resources.previousScreenshotFlipperText,\r\n flipperNextLabel: resources.nextScreenshotFlipperText,\r\n parentId: id,\r\n useTabList: true,\r\n key: JSON.stringify(keys)\r\n } as IComponentNodeProps,\r\n items: mediaGalleryItems\r\n };\r\n };\r\n\r\n private _updateMediaItems(lastUpdatedTime: number): void {\r\n const product = this.productDetails?.product;\r\n if (!this.state.mediaGalleryItems && product?.PrimaryImageUrl) {\r\n this.setState({\r\n mediaGalleryItems: [this._mapProductToImageData(product)],\r\n lastUpdate: lastUpdatedTime\r\n });\r\n }\r\n }\r\n\r\n private _updatePrice(newPrice: ProductPrice | undefined, customPrice: number | undefined = this.state.keyInPriceAmount): void {\r\n if (this.state.isCustomPriceSelected && newPrice) {\r\n newPrice.CustomerContextualPrice = customPrice;\r\n }\r\n this.setState({ productPrice: newPrice });\r\n }\r\n\r\n private readonly _updateDimensions = async (): Promise => {\r\n const {\r\n context: {\r\n actionContext,\r\n request: {\r\n apiSettings: { channelId }\r\n }\r\n }\r\n } = this.props;\r\n\r\n const { product, productDimensions } = this.productDetails!;\r\n\r\n if (!product || !productDimensions) {\r\n return;\r\n }\r\n\r\n const dimensionsToUpdate: { [id: number]: string } = { ...this.dimensions };\r\n this.setState({ isUpdatingDimension: true });\r\n\r\n // Step 1: Clear error state to display relevant errors\r\n if (this.state.errorState.otherError || this.state.errorState.quantityError) {\r\n const clearErrorState = { ...this.state.errorState };\r\n clearErrorState.otherError = undefined;\r\n if (this.state.errorState.errorHost === 'ADDTOCART') {\r\n clearErrorState.quantityError = undefined;\r\n clearErrorState.errorHost = undefined;\r\n }\r\n this.setState({ errorState: clearErrorState });\r\n }\r\n\r\n // Step 2: Clear any errors indicating the dimension wasn't selected\r\n for (const key of Object.keys(dimensionsToUpdate)) {\r\n if (this.state.errorState.configureErrors[key]) {\r\n const errorState = { ...this.state.errorState };\r\n errorState.configureErrors[key] = undefined;\r\n\r\n this.setState({ errorState });\r\n }\r\n }\r\n\r\n // Step 3, Build the actually selected dimensions, prioritizing the information in state\r\n // over the information in data\r\n const mappedDimensions = productDimensions\r\n .map(dimension => {\r\n return {\r\n DimensionTypeValue: dimension.DimensionTypeValue,\r\n DimensionValue:\r\n this._updateDimensionValue(dimension, dimensionsToUpdate[dimension.DimensionTypeValue]) || dimension.DimensionValue,\r\n ExtensionProperties: dimension.ExtensionProperties\r\n };\r\n })\r\n .filter(dimension => {\r\n return dimension && dimension.DimensionValue;\r\n });\r\n\r\n // Step 4. Use these dimensions hydrate the product. Wrap this in a promise\r\n // so that places like add to cart can await it\r\n const selectedProduct = new Promise(async resolve => {\r\n const newProduct = await getSelectedVariant(\r\n new SelectedVariantInput(product.MasterProductId ? product.MasterProductId : product.RecordId, channelId, mappedDimensions),\r\n actionContext\r\n );\r\n if (newProduct) {\r\n // @ts-expect-error\r\n this.productDetails.productDimensions = await getDimensionsForSelectedVariant(\r\n new GetDimensionsForSelectedVariantInput(\r\n newProduct.MasterProductId ? newProduct.MasterProductId : newProduct.RecordId,\r\n channelId,\r\n mappedDimensions\r\n ),\r\n actionContext\r\n );\r\n }\r\n\r\n resolve(newProduct);\r\n });\r\n\r\n this.setState({ selectedProduct });\r\n const variantProduct = await selectedProduct;\r\n\r\n if (variantProduct && this.productDetails) {\r\n // Step 5. Use these dimensions hydrate the inventory. Wrap this in a promise\r\n // so that places like add to cart can await it\r\n this.productDetails.product = variantProduct;\r\n const images = await getValidProductImages(\r\n this.productDetails.product.RecordId || 0,\r\n +this.props.context.request.apiSettings.channelId,\r\n this.props.context.actionContext,\r\n this.props.config.thumbnailImageSettings || this.defaultThumbnailImageSettings,\r\n variantProduct.productVariant ?? variantProduct\r\n );\r\n this.setState({\r\n mediaGalleryItems: [...images],\r\n activeIndex: 0,\r\n lastUpdate: Date.now()\r\n });\r\n\r\n const newAvailableQuantity = await getProductAvailabilitiesForSelectedVariant(\r\n new ProductAvailabilitiesForSelectedVariantInput(variantProduct.RecordId, channelId),\r\n actionContext\r\n );\r\n\r\n this.productDetails.productAvailableQuantity = newAvailableQuantity!;\r\n\r\n const isCustompriceSelected = variantProduct.Dimensions?.find(\r\n dimension => dimension.DimensionTypeValue === 4 && dimension.DimensionValue?.Value?.toLowerCase() === 'custom'\r\n );\r\n\r\n if (isCustompriceSelected) {\r\n this.setState({ isCustomPriceSelected: true });\r\n } else {\r\n // Remove custom amount error when unselect the custom amount\r\n const errorState = { ...this.state.errorState };\r\n errorState.customAmountError = undefined;\r\n\r\n this.setState({ isCustomPriceSelected: false, isPriceKeyedIn: false, errorState });\r\n }\r\n\r\n if (newAvailableQuantity && newAvailableQuantity.length > 0) {\r\n this.setState({ productAvailableQuantity: newAvailableQuantity[0] });\r\n } else {\r\n this.setState({ productAvailableQuantity: undefined });\r\n }\r\n\r\n // Step 6. Use these dimensions hydrate the product price.\r\n const newPrice = await getPriceForSelectedVariant(\r\n new PriceForSelectedVariantInput(variantProduct.RecordId, channelId),\r\n actionContext\r\n );\r\n\r\n if (newPrice) {\r\n this._updatePrice(newPrice);\r\n }\r\n\r\n const RetailMulitplePickupMFeatureState = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\r\n );\r\n\r\n // Step 7. Use these dimensions hydrate the product delivery options.\r\n const newDeliveryOptions = await getDeliveryOptionsForSelectedVariant(\r\n new GetDeliveryOptionsForSelectedVariantInput(\r\n variantProduct.RecordId,\r\n channelId,\r\n undefined,\r\n undefined,\r\n RetailMulitplePickupMFeatureState?.IsEnabled\r\n ),\r\n actionContext\r\n );\r\n\r\n if (newDeliveryOptions) {\r\n this.setState({ productDeliveryOptions: newDeliveryOptions });\r\n }\r\n\r\n this.setState({ isUpdatingDimension: false });\r\n await this._updateQuantitiesInState(variantProduct);\r\n }\r\n };\r\n\r\n private _getProductURL(product: SimpleProduct | undefined): string {\r\n if (product) {\r\n let producturl = ' ';\r\n producturl = getProductPageUrlSync(\r\n product.Name || '',\r\n product.RecordId,\r\n this.props.context && this.props.context.actionContext,\r\n undefined\r\n );\r\n return producturl;\r\n }\r\n return '';\r\n }\r\n\r\n private async _updateQuantitiesInState(product: SimpleProduct): Promise {\r\n const isOrderQuantityLimitsFeatureEnabled = await this._isOrderQuantityLimitsFeatureEnabled();\r\n const defaultQuantity = 1;\r\n const defaultMaxQuantity = 10;\r\n if (isOrderQuantityLimitsFeatureEnabled && product) {\r\n // For some of the products the DefaultQuantity is zero\r\n this.setState({\r\n quantity: product.Behavior?.DefaultQuantity || defaultQuantity,\r\n min: product.Behavior?.MinimumQuantity || defaultQuantity,\r\n\r\n // If max by feature in default order settings is not defined then use max from site settings or default max 10.\r\n max:\r\n product.Behavior?.MaximumQuantity && product.Behavior?.MaximumQuantity > 0\r\n ? product.Behavior?.MaximumQuantity\r\n : this.props.context.app.config.maxQuantityForCartLineItem || defaultMaxQuantity\r\n });\r\n } else {\r\n this.setState({\r\n min: 1,\r\n max: this.props.context.app.config.maxQuantityForCartLineItem || 10\r\n });\r\n }\r\n }\r\n\r\n private readonly _updateDimensionValue = (\r\n productDimensionFull: ProductDimensionFull,\r\n newValueId: string | undefined\r\n ): ProductDimensionValue | undefined => {\r\n if (newValueId && productDimensionFull.DimensionValues) {\r\n return productDimensionFull.DimensionValues.find(dimension => dimension.RecordId === +newValueId);\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n private readonly _getDropdownName = (dimensionType: number, resources: ICQuickviewResources): string => {\r\n const isGiftCard = this.productDetails?.product?.IsGiftCard;\r\n\r\n switch (dimensionType) {\r\n case 1: // ProductDimensionType.Color\r\n return resources.productDimensionTypeColor;\r\n case 2: // ProductDimensionType.Configuration\r\n return resources.productDimensionTypeConfiguration;\r\n case 3: // ProductDimensionType.Size\r\n return resources.productDimensionTypeSize;\r\n case 4: // ProductDimensionType.Style\r\n return isGiftCard ? resources.productDimensionTypeAmount : resources.productDimensionTypeStyle;\r\n default:\r\n return '';\r\n }\r\n };\r\n\r\n private async _isOrderQuantityLimitsFeatureEnabled(): Promise {\r\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context.request.app.platform?.enableDefaultOrderQuantityLimits;\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\r\n return false;\r\n }\r\n\r\n const featureStatuses = await this.props.data.featureState;\r\n const isFeatureEnabledInHq = featureStatuses.find(featureState => featureState.Name === RetailDefaultOrderQuantityLimitsFeatureName)\r\n ?.IsEnabled;\r\n if (!isFeatureEnabledInHq) {\r\n return false;\r\n }\r\n\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\r\n return true;\r\n }\r\n let customerInfo;\r\n try {\r\n customerInfo = await this.props.data.customerInformation;\r\n } catch (error) {\r\n //@ts-ignore\r\n this.props.telemetry.information(error);\r\n this.props.telemetry.debug('Unable to receive Customer Information. May be user is not authorized');\r\n return false;\r\n }\r\n\r\n return (\r\n customerInfo !== undefined &&\r\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\r\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\r\n );\r\n }\r\n\r\n private readonly onExiting = () => {\r\n this.setState({ animating: true });\r\n };\r\n\r\n private readonly onExited = () => {\r\n this.setState({ animating: false });\r\n };\r\n\r\n private readonly next = (): void => {\r\n if (this.isLastItem() === undefined) {\r\n return;\r\n }\r\n\r\n const nextIndex = this.isLastItem() ? 0 : this.state.activeIndex! + 1;\r\n this.goToIndex(nextIndex);\r\n };\r\n\r\n private readonly previous = (): void => {\r\n const nextIndex = this.isFirstItem()\r\n ? this.state.mediaGalleryItems\r\n ? this.state.mediaGalleryItems.length - 1\r\n : 0\r\n : this.state.activeIndex! - 1;\r\n this.goToIndex(nextIndex);\r\n };\r\n\r\n private readonly goToIndex = (index: number): void => {\r\n this.setState({ activeIndex: index });\r\n };\r\n\r\n private _renderCarouselItemImageView(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\r\n return <>{this._getCarouselItem(image, imageSettings, index)};\r\n }\r\n\r\n private readonly _getCarouselItem = (image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode => (\r\n \r\n );\r\n\r\n private readonly _getThumbnailItem = (\r\n image: IImageData,\r\n imageSettings: IImageSettings,\r\n index: number,\r\n modifiedActiveIndex: number\r\n ): IQuickViewThumbnailItemViewProps => {\r\n const classes = classnames(\r\n 'ms-media-gallery__thumbnail-item',\r\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\r\n );\r\n\r\n return {\r\n ThumbnailItemContainerProps: {\r\n tag: 'li' as NodeTag,\r\n className: classes,\r\n role: 'tab',\r\n tabIndex: 0,\r\n key: index,\r\n 'aria-label': image.altText,\r\n 'aria-selected': modifiedActiveIndex === index,\r\n 'aria-controls': `${this.props.id}__carousel-item__${index}`,\r\n onClick: this._generateOnThumbnailClick(index),\r\n onKeyDown: this._generateOnThumbnailKeyDown(index)\r\n },\r\n Picture: (\r\n \r\n )\r\n };\r\n };\r\n\r\n private readonly _generateOnThumbnailKeyDown = (index: number) => {\r\n return (event: React.KeyboardEvent) => {\r\n if (event.which === KeyCodes.Enter || event.which === KeyCodes.Space) {\r\n event.preventDefault();\r\n this.goToIndex(index);\r\n }\r\n };\r\n };\r\n\r\n private readonly _generateOnThumbnailClick = (index: number) => {\r\n return (event: React.MouseEvent) => {\r\n event.preventDefault();\r\n this.goToIndex(index);\r\n };\r\n };\r\n\r\n private _mapProductToImageData(product: SimpleProduct): IImageData {\r\n return {\r\n src: product.PrimaryImageUrl || '',\r\n altText: product.Name\r\n };\r\n }\r\n\r\n private readonly isFirstItem = () => this.state.activeIndex === 0;\r\n\r\n private readonly isLastItem = () => this.state.mediaGalleryItems && this.state.activeIndex === this.state.mediaGalleryItems.length - 1;\r\n\r\n private readonly onClickHandler = async (event: React.MouseEvent) => {\r\n return this._onClick(event, this.props);\r\n };\r\n\r\n private readonly _onClick = async (_event: React.MouseEvent, props: IQuickviewExtentedProps) => {\r\n if (!ObjectExtensions.isNullOrUndefined(props.selectedProductId)) {\r\n const {\r\n context: {\r\n actionContext,\r\n request: {\r\n apiSettings: { channelId }\r\n }\r\n }\r\n } = this.props;\r\n\r\n if (this.props.selectedProductId) {\r\n this.setState({ modalOpen: true });\r\n const productId = this.props.selectedProductId;\r\n const selectedDimensions = this.props.selectedDimensions;\r\n this.productDetails = await getProductDetails(productId, channelId, actionContext, selectedDimensions);\r\n const { product, productPrice } = this.productDetails;\r\n const currentTime: number = Date.now();\r\n this._updateMediaItems(currentTime);\r\n if (productPrice) {\r\n this._updatePrice(productPrice);\r\n }\r\n\r\n if (product) {\r\n // Check if the product is service or not by product type\r\n if (product.ItemTypeValue === ReleasedProductType.Service) {\r\n this.setState({ isServiceItem: true });\r\n }\r\n await this._updateQuantitiesInState(product);\r\n const images = await getValidProductImages(\r\n product.RecordId,\r\n +this.props.context.request.apiSettings.channelId,\r\n this.props.context.actionContext,\r\n this.props.config.thumbnailImageSettings || this.defaultThumbnailImageSettings,\r\n product.productVariant ?? product\r\n );\r\n\r\n this.setState({\r\n mediaGalleryItems: [...images],\r\n activeIndex: 0,\r\n lastUpdate: currentTime\r\n });\r\n }\r\n this.setState({ isDataLoaded: true });\r\n }\r\n }\r\n };\r\n\r\n private readonly _quickViewCloseButtonclick = () => {\r\n this._hideQuickViewDialog();\r\n };\r\n\r\n private _hideQuickViewDialog(): void {\r\n this.dimensions = [];\r\n this.setState({\r\n modalOpen: false,\r\n quantity: 1,\r\n min: undefined,\r\n max: undefined,\r\n errorState: {\r\n configureErrors: {}\r\n },\r\n selectedProduct: undefined,\r\n productPrice: undefined,\r\n productDeliveryOptions: undefined,\r\n isUpdatingDimension: false,\r\n productAvailableQuantity: undefined,\r\n lastUpdate: undefined,\r\n activeIndex: undefined,\r\n animating: undefined,\r\n mediaGalleryItems: [],\r\n isDataLoaded: false\r\n });\r\n }\r\n\r\n /**\r\n * Quantity Change Handler.\r\n * @param callbacks -Buybox callbacks.\r\n * @returns Update quantity.\r\n */\r\n private readonly onChangeHandler = (callbacks: IBuyboxCallbacks) => (newValue: number): boolean => {\r\n if (callbacks.updateQuantity) {\r\n return callbacks.updateQuantity(newValue);\r\n }\r\n return true;\r\n };\r\n\r\n private readonly _renderQuantity = (\r\n props: IQuickviewExtentedProps,\r\n state: IBuyboxState,\r\n callbacks: IBuyboxCallbacks\r\n ): IBuyboxProductQuantityViewProps => {\r\n const { resources } = props;\r\n\r\n const {\r\n quantity,\r\n max,\r\n errorState: { quantityError }\r\n } = state;\r\n\r\n return {\r\n ContainerProps: {\r\n className: 'ms-quickView__quantity'\r\n },\r\n LabelContainerProps: {\r\n tag: 'label',\r\n className: 'ms-quickView__product-quantity-label',\r\n htmlFor: 'ms-quickView__product-quantity-input'\r\n },\r\n heading:
{resources.productQuantityHeading}
,\r\n errors: quantityError && (\r\n \r\n \r\n ),\r\n input: (\r\n \r\n )\r\n };\r\n };\r\n\r\n private _renderEmptyImage(imageSettings: IImageSettings | undefined): React.ReactNode {\r\n return (\r\n
\r\n \r\n
\r\n );\r\n }\r\n}\r\nexport default Quickview;\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\n/* eslint-disable no-duplicate-imports */\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { getCartStateData, GetCartStateDataInput } from '@msdyn365-commerce/global-state';\r\nimport { ProductDimension } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n getDimensionsForSelectedVariant, GetDimensionsForSelectedVariantInput, getPriceForSelectedVariant, getProductAvailabilitiesForSelectedVariant, getRatingsSummary, GetRatingsSummaryInput,\r\n getRnrEndpointId, getRnrPartnerId, getSelectedVariant, PriceForSelectedVariantInput, ProductAvailabilitiesForSelectedVariantInput,\r\n SelectedVariantInput\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\n\r\nimport { IProductDetails } from '@msdyn365-commerce-modules/buybox';\r\n\r\n/**\r\n * Calls the Retail API and returns the product details.\r\n * @param productId\r\n * @param channelId\r\n * @param ctx\r\n * @param selectedDimensions - Dimensions previously selected for the product variant.\r\n */\r\nexport async function getProductDetails(\r\n productId: number, channelId: number, ctx: IActionContext, selectedDimensions?: ProductDimension[]): Promise {\r\n const productDetails: IProductDetails = {};\r\n\r\n if (productId > 0 && channelId > 0) {\r\n const tenantId = getRnrPartnerId(ctx);\r\n const serviceEndPoint = getRnrEndpointId(ctx);\r\n\r\n // Get Product Details\r\n await getSelectedVariant(\r\n new SelectedVariantInput(productId, channelId, selectedDimensions, 'get'),\r\n ctx\r\n ).then(async productResult => {\r\n if (productResult) {\r\n productDetails.product = productResult;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n });\r\n\r\n // Get Product Availability\r\n await getProductAvailabilitiesForSelectedVariant(\r\n new ProductAvailabilitiesForSelectedVariantInput(\r\n productId,\r\n channelId\r\n ),\r\n ctx\r\n ).then(productAvailabilities => {\r\n if (productAvailabilities) {\r\n productDetails.productAvailableQuantity = productAvailabilities;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n });\r\n\r\n // Get Product Price\r\n await getPriceForSelectedVariant(\r\n new PriceForSelectedVariantInput(productId, channelId, undefined),\r\n ctx\r\n ).then(productPrice => {\r\n if (productPrice) {\r\n productDetails.productPrice = productPrice;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n });\r\n\r\n // Get product dimensions\r\n await getDimensionsForSelectedVariant(\r\n new GetDimensionsForSelectedVariantInput(productId, channelId, selectedDimensions),\r\n ctx\r\n ).then(productDimensions => {\r\n if (productDimensions) {\r\n productDetails.productDimensions = productDimensions;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n });\r\n\r\n // Get Cart State\r\n await getCartStateData(\r\n new GetCartStateDataInput(ctx.requestContext.apiSettings),\r\n ctx\r\n ).then(cartState => {\r\n productDetails.cart = cartState;\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n });\r\n\r\n // Get Product Ratings\r\n if (tenantId && serviceEndPoint) {\r\n await getRatingsSummary(\r\n new GetRatingsSummaryInput(productId.toString(), tenantId, serviceEndPoint),\r\n ctx\r\n ).then(ratingsSummaryData => {\r\n if (ratingsSummaryData) {\r\n productDetails.ratingsSummary = ratingsSummaryData;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n });\r\n }\r\n\r\n }\r\n\r\n return productDetails;\r\n}\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { IBuyboxAddToCartViewProps, IBuyboxAddToWishlistViewProps, IBuyboxKeyInPriceViewProps, IBuyboxProductConfigureDropdownViewProps, IBuyboxProductConfigureViewProps, IBuyboxProductQuantityViewProps } from '../c-buybox/components/c-buyboxInterface';\r\nimport { IQuickviewViewProps } from './c-quickview';\r\nimport { ICQuickviewProps } from \"./c-quickview.props.autogenerated\";\r\n\r\nconst _renderAddToCart = (addToCart: IBuyboxAddToCartViewProps): JSX.Element => {\r\n const { ContainerProps, errorBlock, button } = addToCart;\r\n\r\n return (\r\n \r\n {errorBlock}\r\n {button}\r\n \r\n );\r\n};\r\n\r\nconst _renderAddToWishlist = (addToWishlist: IBuyboxAddToWishlistViewProps): JSX.Element => {\r\n const { ContainerProps, errorBlock, button } = addToWishlist;\r\n\r\n return (\r\n \r\n {errorBlock}\r\n {button}\r\n \r\n );\r\n};\r\n\r\nconst _renderConfigureDropdown = (dropdown: IBuyboxProductConfigureDropdownViewProps): JSX.Element => {\r\n const { ContainerProps, LabelContainerProps, heading, errors, select } = dropdown;\r\n return (\r\n \r\n \r\n {heading}\r\n {errors}\r\n \r\n {select}\r\n \r\n );\r\n};\r\n\r\nconst _renderQuickViewPopup = (props: IQuickviewViewProps): JSX.Element => {\r\n const { ModalContainer, ModalHeaderContainer, ModalFooterContainer, ModalHeaderContent, ModalBodyContainer, addToWishlist, addToCart,\r\n cartContainerProps } = props;\r\n return (\r\n \r\n \r\n {ModalHeaderContent}\r\n \r\n \r\n {_renderBodyContent(props)}\r\n \r\n \r\n \r\n {addToCart && _renderAddToCart(addToCart)}\r\n {addToWishlist && _renderAddToWishlist(addToWishlist)}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderQuantity = (quantity: IBuyboxProductQuantityViewProps, quantityLimitsMessages: React.ReactNode): JSX.Element => {\r\n const { ContainerProps, LabelContainerProps, heading, input, errors } = quantity;\r\n\r\n return (\r\n \r\n \r\n {heading}\r\n {errors}\r\n \r\n {input}\r\n {quantityLimitsMessages}\r\n \r\n );\r\n};\r\n\r\nconst _renderKeyInPrice = (keyInPrice: IBuyboxKeyInPriceViewProps): JSX.Element => {\r\n const { ContainerProps, LabelContainerProps, heading, input } = keyInPrice;\r\n\r\n return (\r\n \r\n \r\n {heading}\r\n \r\n {input}\r\n \r\n );\r\n};\r\n\r\nconst _renderConfigure = (configure: IBuyboxProductConfigureViewProps): JSX.Element => {\r\n const { ContainerProps, dropdowns, messageBox } = configure;\r\n\r\n return (\r\n \r\n {dropdowns.map(_renderConfigureDropdown)}\r\n {messageBox}\r\n \r\n );\r\n};\r\n\r\nconst _renderBodyContent = (props: IQuickviewViewProps & ICQuickviewProps<{}>): JSX.Element => {\r\n const { title, price, keyInPrice, quantity, configure, inventoryLabel, quantityLimitsMessages, seeDetailsbutton, loading,\r\n ProductInfoContainerProps, MediaGalleryContainerProps, CarouselProps, unitOfMeasure } = props;\r\n if (loading) {\r\n return (\r\n <>\r\n {loading}\r\n \r\n );\r\n }\r\n\r\n if (typeof window !== 'undefined') {\r\n React.useEffect(() => {\r\n\r\n const url = window.location.href;\r\n const script = document.createElement('script');\r\n url.indexOf(\"dynamics.com/uk\") > -1 ? script.src = \"https://apps.bazaarvoice.com/deployments/peruvianconnectionuk/main_site/staging/en_GB/bv.js\"\r\n : url.indexOf(\"dynamics.com/de\") > -1 ? script.src = \"https://apps.bazaarvoice.com/deployments/peruvianconnectionde/main_site/staging/de_DE/bv.js\"\r\n : url.indexOf(\"peruvianconnection.com\") > -1 ? script.src = \"https://apps.bazaarvoice.com/deployments/peruvianconnection/main_site/production/en_US/bv.js\"\r\n : url.indexOf(\"peruvianconnection.co.uk\") > -1 ? script.src = \"https://apps.bazaarvoice.com/deployments/peruvianconnectionuk/main_site/production/en_GB/bv.js\"\r\n : url.indexOf(\"peruvianconnection.de\") > -1 ? script.src = \"https://apps.bazaarvoice.com/deployments/peruvianconnectionde/main_site/production/de_DE/bv.js\"\r\n : script.src = \"https://apps.bazaarvoice.com/deployments/peruvianconnection/main_site/staging/en_US/bv.js\"\r\n script.async = true;\r\n document.getElementsByClassName(\"ms-quickView__content\")[0].appendChild(script);\r\n return () => {\r\n document.getElementsByClassName(\"ms-quickView__content\")[0].removeChild(script);\r\n }\r\n \r\n }, [])\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n {/* {props.mediaGallery} */}\r\n \r\n \r\n {title}\r\n {price}\r\n {unitOfMeasure}\r\n {_renderBVRatingSummary(props)}\r\n {/* {rating} */}\r\n {configure && _renderConfigure(configure)}\r\n {keyInPrice && _renderKeyInPrice(keyInPrice)}\r\n {quantity && _renderQuantity(quantity, quantityLimitsMessages)}\r\n {seeDetailsbutton}\r\n {inventoryLabel}\r\n \r\n \r\n );\r\n\r\n};\r\n\r\n/**\r\n * Functional component which renders quick view button and popup based by the given props file.\r\n * @param {IQuickviewViewProps} props - Configuration for the quick view component.\r\n * @returns {React.FC} - Functional component of the quick view.\r\n */\r\nexport const QuickViewFunctionalComponent: React.FC> = (props: IQuickviewViewProps & ICQuickviewProps<{}>) => {\r\n const { quickView, quickViewButton, isModalOpen, isMobileDevice } = props;\r\n return (\r\n \r\n {!isMobileDevice && quickViewButton}\r\n {isModalOpen && _renderQuickViewPopup(props)}\r\n \r\n );\r\n};\r\n\r\nconst _renderBVRatingSummary = (props: IQuickviewViewProps & ICQuickviewProps<{}>) => {\r\n \r\n return(\r\n
\r\n );\r\n}\r\n\r\nexport default QuickViewFunctionalComponent;\r\n","const binding = { modules: {}, dataActions: {} };\n\n const registerActionId = (actionPath) => {\n if (binding.dataActions[actionPath] &&\n binding.dataActions[actionPath].default &&\n binding.dataActions[actionPath].default.prototype &&\n binding.dataActions[actionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[actionPath].default.prototype.id] = binding.dataActions[actionPath];\n } else {\n Object.keys(binding.dataActions[actionPath] || {}).forEach(exportName => {\n if (binding.dataActions[actionPath][exportName] &&\n binding.dataActions[actionPath][exportName].prototype &&\n binding.dataActions[actionPath][exportName].prototype.Action) {\n binding.dataActions[binding.dataActions[actionPath][exportName].prototype.id] = binding.dataActions[actionPath][exportName];\n }\n })\n }\n };\n\n const registerSanitizedActionPath = (sanitizedActionPath, dataAction) => {\n if (process.env.NODE_ENV === 'development') {\n if (!dataAction.default) {\n throw new Error('Data action path does not have a default export');\n }\n if (!(dataAction.default.prototype.id && binding.dataActions[dataAction.default.prototype.id]) || !binding.dataActions[sanitizedActionPath]) {\n binding.dataActions[sanitizedActionPath] = dataAction;\n }\n } else {\n binding.dataActions[sanitizedActionPath] = dataAction;\n if (!binding.dataActions[sanitizedActionPath].default) {\n throw new Error('Data action path ' + sanitizedActionPath + ' does not have a default export');\n }\n binding.dataActions[sanitizedActionPath].default.prototype.RegistrationId = sanitizedActionPath;\n if (binding.dataActions[sanitizedActionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[sanitizedActionPath].default.prototype.id] = sanitizedActionPath;\n }\n }\n };\n \n\n (binding.modules['c-quickview'] = {\n c: () => require('partner/modules/c-quickview/c-quickview.tsx'),\n $type: 'containerModule',\n da: [{name:'cart', path:'@msdyn365-commerce/global-state/dist/lib/data-actions/cart-state-data-action', runOn: 0},{name:'customerInformation', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-customer', runOn: 0},{name:'deliveryOptions', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-delivery-options-for-selected-variant', runOn: 0},{name:'featureState', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-feature-state', runOn: 0},{name:'orderTemplates', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/order-templates/get-order-templates-preview', runOn: 1},{name:'product', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant', runOn: 0},{name:'productAvailableQuantity', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-product-availabilities-for-selected-variant', runOn: 0},{name:'productDimensions', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-dimensions-for-selected-variant', runOn: 0},{name:'productPrice', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-price-for-selected-variant', runOn: 0},{name:'ratingsSummary', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-ratings-summary', runOn: 1},{name:'storeSelectorStateManager', path:'@msdyn365-commerce-modules/bopis-utilities/dist/lib/store-selector-state-manager/store-selector-state-manager-data-action', runOn: 0},{name:'wishlists', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-wishlist-by-customer-id', runOn: 0}],\n \n iNM: false,\n ns: '__local__',\n n: 'c-quickview',\n p: '__local__',\n \n pdp: '',\n \n \n md: 'src/modules/c-quickview'\n });\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/bopis-utilities/dist/lib/store-selector-state-manager/store-selector-state-manager-data-action';\n let dataAction = require('@msdyn365-commerce-modules/bopis-utilities/dist/lib/store-selector-state-manager/store-selector-state-manager-data-action');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-customer';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-customer');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-delivery-options-for-selected-variant';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-delivery-options-for-selected-variant');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-dimensions-for-selected-variant';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-dimensions-for-selected-variant');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-feature-state';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-feature-state');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-price-for-selected-variant';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-price-for-selected-variant');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-product-availabilities-for-selected-variant';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-product-availabilities-for-selected-variant');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-ratings-summary';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-ratings-summary');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-wishlist-by-customer-id';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-wishlist-by-customer-id');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/order-templates/get-order-templates-preview';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/order-templates/get-order-templates-preview');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce/global-state/dist/lib/data-actions/cart-state-data-action';\n let dataAction = require('@msdyn365-commerce/global-state/dist/lib/data-actions/cart-state-data-action');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n \n window.__bindings__ = window.__bindings__ || {};\n window.__bindings__.modules = {\n ...window.__bindings__.modules || {},\n ...binding.modules\n };\n \n window.__bindings__.dataActions = {\n ...window.__bindings__.dataActions || {},\n ...binding.dataActions\n };\n export const viewDictionary = {};\n viewDictionary['__local__|__local__|modules|c-quickview|c-quickview'] = {\n c: () => require('partner/modules/c-quickview/c-quickview.view.tsx'),\n cn: '__local__-__local__-c-quickview'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","module.exports = React;","module.exports = ReactDOM;"],"names":["async","getValidProductImages","productId","channelId","actionContext","imageSettings","selectedProduct","actionInput","MediaLocationsForSelectedVariantInput","getMediaLocationsForSelectedVariant","then","mediaLocations","Promise","all","map","mediaLocation","imageData","src","Uri","altText","AltText","imageSettingsVal","viewports","lg","q","replace","imageConcatVal","resolve","http","XMLHttpRequest","open","addEventListener","status","send","validateMediaLocaionAsync","pairs","filter","pair","catch","error","telemetry","exception","debug","Quickview","React","constructor","props","super","dimensionUpdateQueue","FinitePromiseQueue","dimensions","quickViewCallbacks","updateQuantity","newQuantity","errorState","this","state","quantityError","undefined","otherError","setState","quantity","updateErrorState","newErrorState","updateSelectedProduct","newSelectedProduct","newInventory","newPrice","newDeliveryOptions","productAvailableQuantity","productDeliveryOptions","_updatePrice","dimensionSelectedAsync","selectedDimensionId","selectedDimensionValueId","enqueue","_updateDimensions","FinitePromiseQueueError","ProcessWasDiscardedFromTheQueue","getDropdownName","dimensionType","resources","_getDropdownName","changeModalOpen","isModalOpen","_hideQuickViewDialog","changeUpdatingDimension","isUpdatingDimension","updateKeyInPrice","customPrice","customAmountError","isPriceKeyedIn","keyInPriceAmount","productPrice","handleIsDimensionSelected","isDimensionSelected","handleSelectedDimension","dimension","currentSelectedDimension","defaultGalleryImageSettings","xs","w","h","sm","md","lazyload","cropFocalRegion","defaultThumbnailImageSettings","_renderSeeDetailButton","product","config","payLoad","getPayloadObject","telemetryContent","TelemetryConstant","seeDetails","attributes","getTelemetryAttributes","Button","className","onClick","onTelemetryClick","seeDetailsLinkText","href","_getProductURL","_renderCarousel","mediaGalleryItems","keys","galleryImageSettings","ArrayExtensions","hasElements","item","index","_renderCarouselItemImageView","_renderEmptyImage","tag","Carousel","items","activeIndex","next","previous","interval","directionTextPrev","previousScreenshotFlipperText","directionTextNext","nextScreenshotFlipperText","onIndicatorsClickHandler","goToIndex","handleOnExited","onExited","handleOnExiting","onExiting","key","_renderThumbnails","id","thumbnailImageSettings","_getThumbnailItem","ThumbnailsContainerProps","SingleSlideCarouselComponentProps","SingleSlideCarousel","flipperPrevLabel","flipperNextLabel","parentId","useTabList","JSON","stringify","context","request","apiSettings","productDimensions","productDetails","dimensionsToUpdate","clearErrorState","errorHost","Object","configureErrors","mappedDimensions","DimensionTypeValue","DimensionValue","_updateDimensionValue","ExtensionProperties","newProduct","getSelectedVariant","SelectedVariantInput","MasterProductId","RecordId","getDimensionsForSelectedVariant","GetDimensionsForSelectedVariantInput","variantProduct","images","productVariant","lastUpdate","Date","now","newAvailableQuantity","getProductAvailabilitiesForSelectedVariant","ProductAvailabilitiesForSelectedVariantInput","Dimensions","find","Value","toLowerCase","isCustomPriceSelected","length","getPriceForSelectedVariant","PriceForSelectedVariantInput","RetailMulitplePickupMFeatureState","data","featureState","result","Name","getDeliveryOptionsForSelectedVariant","GetDeliveryOptionsForSelectedVariantInput","IsEnabled","_updateQuantitiesInState","productDimensionFull","newValueId","DimensionValues","isGiftCard","IsGiftCard","productDimensionTypeColor","productDimensionTypeConfiguration","productDimensionTypeSize","productDimensionTypeAmount","productDimensionTypeStyle","animating","isLastItem","nextIndex","isFirstItem","_getCarouselItem","image","Image","requestContext","gridSettings","loadFailureBehavior","role","modifiedActiveIndex","ThumbnailItemContainerProps","classnames","tabIndex","_generateOnThumbnailClick","onKeyDown","_generateOnThumbnailKeyDown","Picture","event","which","KeyCodes","Enter","Space","preventDefault","onClickHandler","_onClick","_event","ObjectExtensions","isNullOrUndefined","selectedProductId","modalOpen","selectedDimensions","ctx","tenantId","getRnrPartnerId","serviceEndPoint","getRnrEndpointId","productResult","productAvailabilities","getCartStateData","GetCartStateDataInput","cartState","cart","getRatingsSummary","GetRatingsSummaryInput","toString","ratingsSummaryData","ratingsSummary","getProductDetails","currentTime","_updateMediaItems","ItemTypeValue","ReleasedProductType","Service","isServiceItem","isDataLoaded","_quickViewCloseButtonclick","onChangeHandler","callbacks","newValue","_renderQuantity","max","ContainerProps","LabelContainerProps","htmlFor","heading","productQuantityHeading","errors","input","IncrementalQuantity","currentCount","onChange","inputQuantityAriaLabel","decrementButtonAriaLabel","incrementButtonAriaLabel","minQuantityText","maxQuantityText","disabled","min","loadOOSMessage","bind","getTelemetryObject","telemetryPageName","friendlyName","shouldComponentUpdate","nextProps","nextState","render","buyboxProps","isMobileDevice","isMobile","variant","VariantType","Viewport","viewprops","quickView","moduleProps","quickViewButton","quickViewbuttonText","ModalContainer","Modal","isOpen","format","quickViewAriaLabel","toggle","modalTransition","timeout","shouldUpdateFocusToFirstElement","ModalHeaderContainer","ModalHeader","ModalFooterContainer","ModalFooter","ModalHeaderContent","ModalBodyContainer","ModalBody","cartContainerProps","ProductInfoContainerProps","MediaGalleryContainerProps","seeDetailsbutton","loading","Spinner","label","loadingText","size","SpinnerSize","large","title","getBuyboxProductTitle","description","getBuyboxProductDescription","configure","getBuyboxProductConfigure","price","getBuyboxProductPrice","unitOfMeasure","getBuyboxProductUnitOfMeasure","rating","app","hideRating","getBuyboxProductRating","addToCart","getBuyboxAddToCart","keyInPrice","enableKeyInPrice","getBuyboxKeyInPrice","inventoryLabel","getBuyBoxInventoryLabel","addToWishlist","getBuyboxProductAddToWishlist","quantityLimitsMessages","getQuantityLimitsMessages","CarouselProps","Thumbnails","renderView","lastUpdatedTime","PrimaryImageUrl","_mapProductToImageData","CustomerContextualPrice","producturl","getProductPageUrlSync","_isOrderQuantityLimitsFeatureEnabled","Behavior","DefaultQuantity","MinimumQuantity","MaximumQuantity","maxQuantityForCartLineItem","defaultOrderQuantityLimitsFeatureConfig","platform","enableDefaultOrderQuantityLimits","RetailDefaultOrderQuantityLimitsFeatureName","customerInfo","customerInformation","information","IsB2b","_renderConfigureDropdown","dropdown","select","Node","_renderQuickViewPopup","Module","_renderBodyContent","errorBlock","button","_renderAddToCart","_renderAddToWishlist","window","url","location","script","document","createElement","indexOf","getElementsByClassName","appendChild","removeChild","_renderBVRatingSummary","dropdowns","messageBox","_renderConfigure","_renderKeyInPrice","QuickViewFunctionalComponent","ItemId","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","Error","prototype","RegistrationId","c","require","$type","da","name","path","runOn","iNM","ns","n","p","pdp","__bindings__","viewDictionary","cn","module","exports","ReactDOM"],"sourceRoot":""}