{"version":3,"file":"static/js/fb4d4fe43562d0d251d9.bundle.js","mappings":"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","sources":["webpack://mattressfirm/./lib/media-gallery/module-registration.js?47e5","webpack://mattressfirm/./src/modules/media-gallery/utils/get-valid-product-images.ts?a364","webpack://mattressfirm/./src/modules/media-gallery/media-gallery.tsx?24d7","webpack://mattressfirm/./src/modules/media-gallery/media-gallery.view.tsx?5061","webpack://mattressfirm/external var \"React\"?0d3b","webpack://mattressfirm/external var \"ReactDOM\"?853b"],"sourcesContent":["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['media-gallery'] = {\n c: () => require('@msdyn365-commerce-modules/media-gallery/dist/lib/modules/media-gallery/media-gallery'),\n $type: 'contentModule',\n da: [{name:'mediaLocations', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-media-locations-by-id', runOn: 0},{name:'mediaLocationsForSelectedVariant', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-media-locations-for-selected-variant', runOn: 0},{name:'product', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant', runOn: 0}],\n \n iNM: true,\n ns: '@msdyn365-commerce-modules',\n n: 'media-gallery',\n p: 'media-gallery',\n \n pdp: '',\n \n \n md: 'node_modules/@msdyn365-commerce-modules/media-gallery/dist/lib/modules/media-gallery'\n });\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-media-locations-by-id';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-media-locations-by-id');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-media-locations-for-selected-variant';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-media-locations-for-selected-variant');\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 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['@msdyn365-commerce-modules|media-gallery|modules|media-gallery|media-gallery'] = {\n c: () => require('@msdyn365-commerce-modules/media-gallery/dist/lib/modules/media-gallery/media-gallery.view.js'),\n cn: '@msdyn365-commerce-modules-media-gallery-media-gallery'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getCatalogId, IActionContext, IImageData, IImageSettings } from '@msdyn365-commerce/core';\nimport { MediaLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getMediaLocationsForSelectedVariant, MediaLocationsForSelectedVariantInput } from '@msdyn365-commerce-modules/retail-actions';\n\nexport async function getValidProductImages(\n productId: number,\n channelId: number,\n actionContext: IActionContext,\n imageSettings: IImageSettings,\n selectedProduct?: SimpleProduct\n): Promise {\n const catalogId = getCatalogId(actionContext.requestContext);\n const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\n\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\n .then(mediaLocations => {\n if (mediaLocations) {\n return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocaionAsync(mediaLocation, imageSettings))).then(\n pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n }\n );\n }\n\n return [];\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\n return [];\n });\n}\n\nexport async function validateProductImages(\n mediaLocations: MediaLocation[],\n actionContext: IActionContext,\n imageSettings: IImageSettings\n): Promise {\n return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocaionAsync(mediaLocation, imageSettings)))\n .then(pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to validate prodcut images');\n return [];\n });\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-unused-vars-experimental -- .\nasync function validateMediaLocaionAsync(mediaLocation: MediaLocation, imageSettings?: IImageSettings): Promise<[IImageData, boolean]> {\n const imageData = {\n src: mediaLocation.Uri || '',\n altText: mediaLocation.AltText || ''\n };\n\n if (imageData.src === '') {\n return [imageData, false];\n }\n\n return new Promise<[IImageData, boolean]>(resolve => {\n try {\n const http = new XMLHttpRequest();\n http.open('HEAD', imageData.src, true);\n\n http.addEventListener('load', () => {\n resolve([imageData, http.status === 200 || http.status === 201]);\n });\n\n http.addEventListener('error', () => {\n resolve([imageData, false]);\n });\n\n http.send();\n } catch {\n resolve([imageData, false]);\n }\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Carousel, ICarouselProps } from '@msdyn365-commerce/components';\nimport { IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { MediaLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, getFallbackImageUrl, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n defaultDataScale,\n IComponentNodeProps,\n ImagefullView,\n IModalViewProps,\n IModuleProps,\n inlineZoomImageOnHover,\n inlineZoomImageOnMouseMove,\n inlineZoomImageOnMouseOut,\n inlineZoomInitClick,\n INodeProps,\n ISingleSlideCarouselProps,\n isMobile,\n KeyCodes,\n NodeTag,\n onContainerZoomInit,\n onMouseMoveLensContainer,\n onMouseOutLensContainer,\n onMouseOverImageContainer,\n removeContainerZoomStyle,\n removeInlineZoomStyle,\n SingleSlideCarousel,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport * as React from 'react';\n\nimport { IMediaGalleryData } from './media-gallery.data';\nimport { imageSource, imageZoom, IMediaGalleryProps, thumbnailsOrientation } from './media-gallery.props.autogenerated';\nimport { getValidProductImages, validateProductImages } from './utils';\n\n/**\n * IMediaGalleryState Interface.\n */\nexport interface IMediaGalleryState {\n animating: boolean;\n activeIndex: number;\n isImageZoomed: boolean;\n modalIsOpen: boolean;\n lastUpdate?: number;\n isMobileImageZoomed?: boolean;\n mediaGalleryItems?: IImageData[];\n isInitialLoad?: boolean;\n shouldUseOptimizedImage?: boolean;\n}\n\n/**\n * IMediaGalleryThumbnailsViewProps Interface.\n */\nexport interface IMediaGalleryThumbnailsViewProps {\n ThumbnailsContainerProps: INodeProps;\n SingleSlideCarouselComponentProps: INodeProps;\n items?: IMediaGalleryThumbnailItemViewProps[];\n}\n\n/**\n * IMediaGalleryThumbnailItemViewProps Interface.\n */\nexport interface IMediaGalleryThumbnailItemViewProps {\n ThumbnailItemContainerProps: INodeProps;\n Picture: React.ReactElement;\n}\n\n/**\n * IMediaGalleryViewProps Interface.\n */\nexport interface IMediaGalleryViewProps extends IMediaGalleryProps {\n state: IMediaGalleryState;\n MediaGallery: IModuleProps;\n CarouselProps: INodeProps;\n Thumbnails: IMediaGalleryThumbnailsViewProps;\n Modal?: React.ReactElement | null;\n callbackToggle?(): void;\n callbackThumbnailClick?(index: number): void;\n callbackThumbnailKeyDown?(index: number): void;\n}\n\n/**\n * Props for carousel.\n */\ninterface IMediaGalleryCarouselItems {\n items: ItemType[];\n keys: (string | undefined)[];\n}\n\n/**\n * Media gallery component.\n */\nclass MediaGallery extends React.Component, IMediaGalleryState> {\n private readonly _inlineZoomDivRef: Map = new Map();\n\n private readonly fullScreenOverlayButtonRef: React.RefObject = React.createRef();\n\n private mediaGalleryImages: IImageData[] = [];\n\n private fallbackImage?: string;\n\n private readonly defaultGalleryImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=767&h=767&m=8', w: 0, h: 0 },\n sm: { q: 'w=600&h=600&m=8', w: 0, h: 0 },\n md: { q: 'w=600&h=772&m=8', w: 0, h: 0 },\n lg: { q: 'h=772&m=8', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly defaultThumbnailImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=100&m=8', w: 100, h: 0 },\n lg: { q: 'w=100&m=8', w: 100, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly _zoomedImageSettings: IImageSettings;\n\n public constructor(props: IMediaGalleryProps) {\n super(props);\n this._toggleModal = this._toggleModal.bind(this);\n this.state = {\n activeIndex: 0,\n animating: false,\n isImageZoomed: false,\n modalIsOpen: false,\n isInitialLoad: true,\n shouldUseOptimizedImage: !!this.props.config.skipImageValidation\n };\n\n this._zoomedImageSettings =\n props.config.zoomedImageSettings ?? props.config.galleryImageSettings ?? this.defaultGalleryImageSettings;\n\n this._onImageMouseOut = this._onImageMouseOut.bind(this);\n this._inlineZoomImageOnHover = this._inlineZoomImageOnHover.bind(this);\n this._onInlineImageClick = this._onInlineImageClick.bind(this);\n this._onContainerZoomImageClick = this._onContainerZoomImageClick.bind(this);\n this._onMouseOutLensContainer = this._onMouseOutLensContainer.bind(this);\n }\n\n public isMobile(): boolean {\n const size = isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n return size === 'xs';\n }\n\n public async componentDidMount(): Promise {\n const source = this.props.config.imageSource ?? imageSource.pageContext;\n const shouldUpdateOnPartialDimensionSelection = this.props.config.shouldUpdateOnPartialDimensionSelection;\n this._setRenderType();\n if (source === imageSource.pageContext) {\n if (this.state.mediaGalleryItems === undefined && this.props.data.mediaLocationsForSelectedVariant.result) {\n const images = await validateProductImages(\n this.props.data.mediaLocationsForSelectedVariant.result,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\n );\n this._setImages(images);\n } else if (this.state.mediaGalleryItems === undefined && this.props.data.product.result) {\n const product = this.props.data.product.result;\n const images = await getValidProductImages(\n product.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n product.productVariant\n );\n\n this._setImages(images);\n } else {\n this._setImages([]);\n }\n\n reaction(\n () => {\n const product = this.props.data.product.result;\n if (!product) {\n return null;\n }\n\n if (!shouldUpdateOnPartialDimensionSelection || ObjectExtensions.isNullOrUndefined(product.productVariant?.RecordId)) {\n return `${product.RecordId}`;\n }\n\n return `${product.RecordId}-${product.productVariant!.RecordId}`;\n },\n async () => {\n const product = this.props.data.product.result;\n if (product) {\n const images = await getValidProductImages(\n product.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\n );\n this._setImages(images);\n } else {\n this._setImages([]);\n }\n }\n );\n }\n\n if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n const images = await validateProductImages(\n this.props.data.mediaLocations.result,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\n );\n this._setImages(images);\n }\n }\n\n public shouldComponentUpdate(nextProps: IMediaGalleryProps, nextState: IMediaGalleryState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n const { id, config, resources } = this.props;\n\n const { className, showPaginationTooltip } = config;\n\n const isVertical: boolean = config.thumbnailsOrientation === thumbnailsOrientation.vertical;\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- || is required.\n const isFullscreenAllowed: boolean = this.isMobile() || config.allowFullScreen || false;\n const zoomViewMode: string =\n config.imageZoom === imageZoom.inline ? imageZoom.inline : config.imageZoom === imageZoom.container ? imageZoom.container : '';\n const source = this.props.config.imageSource ?? imageSource.pageContext;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n const emptyPlaceHolderImage = this.props.context.app.config?.placeholderImageName as string;\n if (this.props.data.product.result) {\n this.fallbackImage = getFallbackImageUrl(this.props.data.product.result.ItemId, this.props.context.request.apiSettings);\n }\n if (emptyPlaceHolderImage && this.fallbackImage) {\n this.fallbackImage = `${this.fallbackImage},${emptyPlaceHolderImage}`;\n }\n if (this.props.config.skipImageValidation && !this.state.mediaGalleryItems && this.state.isInitialLoad) {\n let images: IImageData[] = [];\n let mediaLocations: MediaLocation[] = [];\n if (source === imageSource.pageContext && this.props.data.mediaLocationsForSelectedVariant.result) {\n mediaLocations = this.props.data.mediaLocationsForSelectedVariant.result;\n } else if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n mediaLocations = this.props.data.mediaLocations.result;\n }\n images = mediaLocations.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: mediaLocation.AltText ?? ''\n };\n });\n const curatedImages = this.props.config.images ?? [];\n this.mediaGalleryImages = [...this._filterMasterImageFromVariant(images), ...curatedImages];\n }\n const mediaGalleryCarouselItems = this._getMediaGalleryItems(isFullscreenAllowed, zoomViewMode);\n const mediaGalleryThumbnailCarouselItems = this._getMediaGalleryThumbnailItems();\n const viewProps: IMediaGalleryViewProps = {\n ...(this.props as IMediaGalleryProps),\n state: this.state,\n MediaGallery: {\n moduleProps: this.props,\n className: classnames(`ms-media-gallery ${isVertical ? 'vertical' : ''}`, className)\n },\n Modal: isFullscreenAllowed ? this.imageModalSlider(zoomViewMode) : null,\n callbackToggle: this.openModalDialog,\n callbackThumbnailClick: this._generateOnThumbnailClick,\n callbackThumbnailKeyDown: this._generateOnThumbnailKeyDown,\n CarouselProps: {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items: mediaGalleryCarouselItems.items,\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: showPaginationTooltip === true,\n indicatorAriaText: resources.ariaLabelForSlide,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n key: mediaGalleryCarouselItems.keys\n } as IComponentNodeProps,\n Thumbnails: {\n ThumbnailsContainerProps: { className: 'ms-media-gallery__thumbnails-container' },\n SingleSlideCarouselComponentProps: {\n tag: SingleSlideCarousel,\n className: 'ms-media-gallery__thumbnails',\n vertical: isVertical,\n flipperPrevLabel: resources.previousScreenshotFlipperText,\n flipperNextLabel: resources.nextScreenshotFlipperText,\n parentId: id,\n useTabList: true,\n key: JSON.stringify(mediaGalleryThumbnailCarouselItems.keys)\n } as IComponentNodeProps,\n items: mediaGalleryThumbnailCarouselItems.items\n }\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Zoomed out image on previous/next click.\n */\n public updateZoomedInImage(): void {\n this.setState({ isImageZoomed: false });\n }\n\n private readonly onExiting = () => {\n this.setState({ animating: true });\n };\n\n private readonly onExited = () => {\n this.setState({ animating: false });\n };\n\n /**\n * On click next in carousel.\n */\n private readonly next = (): void => {\n removeInlineZoomStyle();\n if (this.isLastItem() === undefined) {\n return;\n }\n\n const nextIndex = this.isLastItem() ? 0 : this.state.activeIndex + 1;\n this.goToIndex(nextIndex);\n\n this.updateZoomedInImage();\n };\n\n /**\n * On click previous in carousel.\n */\n private readonly previous = (): void => {\n removeInlineZoomStyle();\n const images = this.state.mediaGalleryItems;\n const nextIndex = this.isFirstItem() ? (images ? images.length - 1 : 0) : this.state.activeIndex - 1;\n this.goToIndex(nextIndex);\n this.updateZoomedInImage();\n };\n\n private readonly goToIndex = (index: number): void => {\n this.setState({ activeIndex: index });\n };\n\n private _getMediaGalleryThumbnailItems(): IMediaGalleryCarouselItems {\n const mediaGalleryItems = this.state.mediaGalleryItems ?? this.mediaGalleryImages;\n const thumbnailImageSettings = this.props.config.thumbnailImageSettings;\n if (thumbnailImageSettings) {\n thumbnailImageSettings.cropFocalRegion = true;\n }\n\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\n\n if (!hasMediaGalleryItems) {\n if (this.state.lastUpdate) {\n const defaultKey = 0;\n return {\n items: [this._getEmptyThumbnailItem(thumbnailImageSettings, defaultKey, this.state.activeIndex)],\n keys: ['empty']\n };\n }\n return { items: [], keys: [] };\n }\n\n return {\n items: [\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n ...mediaGalleryItems!.map((item: IImageData, index: number) =>\n this._getThumbnailItem(\n item,\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n index,\n this.state.activeIndex\n )\n )\n ],\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n keys: [...mediaGalleryItems!.map(item => item.src)]\n };\n }\n\n private _getMediaGalleryItems(isFullscreenAllowed: boolean, zoomViewMode: string): IMediaGalleryCarouselItems {\n const mediaGalleryItems = this.state.mediaGalleryItems ?? this.mediaGalleryImages;\n const galleryImageSettings = this.props.config.galleryImageSettings;\n if (galleryImageSettings) {\n galleryImageSettings.cropFocalRegion = true;\n }\n\n const zoomView = isFullscreenAllowed ? 'fullscreen' : zoomViewMode;\n\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\n\n if (!hasMediaGalleryItems) {\n if (this.state.lastUpdate) {\n return { items: [this._renderEmptyImage(galleryImageSettings)], keys: ['empty'] };\n }\n return { items: [], keys: [] };\n }\n\n return {\n items: [\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n ...mediaGalleryItems!.map((item: IImageData, index: number) =>\n this._renderCarouselItemImageView(zoomView, item, galleryImageSettings ?? this.defaultGalleryImageSettings, index)\n )\n ],\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n keys: [...mediaGalleryItems!.map(item => item.src)]\n };\n }\n\n private _setImages(images?: IImageData[]): void {\n const curatedImage = this.props.config.images ?? [];\n const shouldHidePrimaryImages = this.props.config.shouldHideMasterProductImagesForVariant ?? true;\n\n let imagesToSet = images ?? [];\n if (shouldHidePrimaryImages) {\n // Currently returned image response is having duplicate image\n // along with non-selected variant and previous selection is not getting cleared. With the help of index we\n // select item from 0 index till it is having non repeating image source name ending with index number.\n // Here we are keeping '.' to make sure that we are considering any digit just before '.' in image source path\n imagesToSet = imagesToSet.filter((item, index) => {\n let incrementedIndex = index;\n const imageIndex = `${++incrementedIndex}.`;\n return item.src?.includes(imageIndex);\n });\n }\n this.setState({\n mediaGalleryItems: [...imagesToSet, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now(),\n shouldUseOptimizedImage: false\n });\n }\n\n private _setRenderType(): void {\n this.setState({\n isInitialLoad: false\n });\n }\n\n private _renderCarouselItemImageView(\n zoomView: string,\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n isInPopup: boolean = false\n ): React.ReactNode {\n if (this.isMobile()) {\n if (isInPopup) {\n return this._renderImageInContainerOnZoom(image, this._zoomedImageSettings, index);\n }\n return this._renderImageFullScreenOnZoom(image, imageSettings, index);\n }\n\n switch (zoomView) {\n case 'container': {\n return this._renderImageInContainerOnZoom(image, this._zoomedImageSettings, index);\n }\n case 'inline': {\n return this._renderImageInlineOnZoom(image, this._zoomedImageSettings, index);\n }\n case 'fullscreen': {\n return this._renderImageFullScreenOnZoom(image, imageSettings, index);\n }\n\n // No default\n }\n return <>{this._getCarouselItem(image, imageSettings, index, isInPopup)};\n }\n\n private _filterMasterImageFromVariant(images?: IImageData[]): IImageData[] {\n const shouldHidePrimaryImages = this.props.config.shouldHideMasterProductImagesForVariant ?? true;\n let variantImages = images ?? [];\n const isVariantProduct =\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.MasterProductId) ||\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.productVariant);\n const itemId = this.props.data.product.result?.ItemId;\n if (shouldHidePrimaryImages && isVariantProduct && itemId) {\n // Currently returned image response is having duplicate image\n // along with non-selected variant and previous selection is not getting cleared. With the help of index we\n // select item from 0 index till it is having non repeating image source name ending with index number.\n // Here we are keeping '.' to make sure that we are considering any digit just before '.' in image source path\n variantImages = variantImages.filter(item => {\n const imagePattern = `${itemId}_000`;\n return !item.src?.includes(imagePattern);\n });\n if (!ArrayExtensions.hasElements(variantImages)) {\n variantImages = images ?? [];\n }\n }\n return variantImages;\n }\n\n private readonly _getCarouselItem = (\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n isInPopup: boolean = false\n ): React.ReactNode => (\n \n );\n\n private readonly _getThumbnailItem = (\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps => {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: index,\n 'aria-label': image.altText,\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\n };\n\n /**\n * Ref Handler.\n * @param index -Remove item click function.\n * @returns Set inline zoom.\n */\n private readonly _refHandler = (index: number) => (divRef: HTMLDivElement) => {\n this._inlineZoomDivRef.set(index, divRef);\n };\n\n private readonly _generateOnThumbnailKeyDown = (index: number) => {\n return (event: React.KeyboardEvent) => {\n if (event.which === KeyCodes.Enter || event.which === KeyCodes.Space) {\n event.preventDefault();\n\n this.goToIndex(index);\n }\n };\n };\n\n private readonly _generateOnThumbnailClick = (index: number) => {\n return (event: React.MouseEvent) => {\n event.preventDefault();\n\n this.goToIndex(index);\n };\n };\n\n private _renderImageInlineOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n \n \n \n \n );\n }\n\n private _inlineZoomImageOnHover(event: React.MouseEvent): void {\n inlineZoomImageOnHover(event, this.props.config.dataScale ?? String(defaultDataScale));\n }\n\n private _handleMobileViewZoomedImageClick(event: React.MouseEvent) {\n const target = this.state.shouldUseOptimizedImage ? (event.target as HTMLImageElement) : event.currentTarget;\n const mobileZoomedInImageClassName = 'msc-mobile-zoomed-in';\n if (!this.state.isMobileImageZoomed) {\n const bounds = target.getBoundingClientRect();\n const dataScale = Number(this.props.config.dataScale ?? defaultDataScale);\n\n const positionX = event.clientX - bounds.left;\n const positionY = event.clientY - bounds.top;\n const scaledPositionX = positionX * dataScale;\n const scaledPositionY = positionY * dataScale;\n\n target.style.transform = `scale(${dataScale})`;\n target.classList.add(mobileZoomedInImageClassName);\n target.parentElement!.style.overflow = 'auto';\n target.parentElement!.scrollTo(scaledPositionX - positionX, scaledPositionY - positionY);\n this.setState({\n isMobileImageZoomed: true\n });\n } else {\n target.style.transform = '';\n target.classList.remove(mobileZoomedInImageClassName);\n target.parentElement!.style.overflow = '';\n this.setState({\n isMobileImageZoomed: false\n });\n }\n }\n\n private _onInlineImageClick(event: React.MouseEvent): void {\n if (window.innerWidth <= 768) {\n // $msv-breakpoint-m\n this._handleMobileViewZoomedImageClick(event);\n return;\n }\n inlineZoomInitClick(event, this.props.config.dataScale ?? String(defaultDataScale));\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onImageMouseOut(event: React.MouseEvent): void {\n inlineZoomImageOnMouseOut(event);\n this.setState({\n isImageZoomed: false\n });\n }\n\n private _onContainerZoomImageClick(event: React.MouseEvent): void {\n if (window.innerWidth <= 768) {\n // $msv-breakpoint-m\n this._handleMobileViewZoomedImageClick(event);\n return;\n }\n\n onContainerZoomInit(event);\n\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onMouseOutLensContainer(event: React.MouseEvent): void {\n onMouseOutLensContainer(event);\n\n this.setState({\n isImageZoomed: false\n });\n }\n\n private _renderImageInContainerOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n
\n \n \n
\n );\n }\n\n private _renderImageFullScreenOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n
\n \n
\n {}\n \n
\n
\n );\n }\n\n private _mapProductToImageData(product: SimpleProduct): IImageData {\n return {\n src: product.PrimaryImageUrl ?? ''\n };\n }\n\n private _renderEmptyImage(imageSettings: IImageSettings | undefined): React.ReactNode {\n return (\n
\n \n
\n );\n }\n\n private _getEmptyThumbnailItem(\n imageSettings: IImageSettings | undefined,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: 'empty',\n 'aria-label': '',\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\n }\n\n private readonly isFirstItem = () => this.state.activeIndex === 0;\n\n private readonly isLastItem = () => {\n const images = this.state.mediaGalleryItems;\n return images && this.state.activeIndex === images.length - 1;\n };\n\n private readonly openModalDialog = (): void => {\n this._toggleModal();\n };\n\n private _toggleModal(): void {\n if (this.state.modalIsOpen) {\n this.fullScreenOverlayButtonRef.current?.focus();\n const parentDiv = this._inlineZoomDivRef.get(this.state.activeIndex);\n if (parentDiv && parentDiv.children && parentDiv.children.length >= 2) {\n const image = parentDiv.children[1].querySelector('img');\n if (image) {\n image.removeAttribute('style');\n }\n }\n this.setState({\n isImageZoomed: false\n });\n }\n this.setState({\n isImageZoomed: false,\n modalIsOpen: !this.state.modalIsOpen\n });\n removeInlineZoomStyle();\n removeContainerZoomStyle();\n }\n\n private readonly imageModalSlider = (ZoomView: string): React.ReactElement => {\n const {\n data: {\n product: { result: product }\n },\n resources\n } = this.props;\n let mediaGalleryItems = this.state.mediaGalleryItems;\n\n if (!mediaGalleryItems && product) {\n mediaGalleryItems = [this._mapProductToImageData(product)];\n }\n const carouselprops = {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items:\n mediaGalleryItems &&\n mediaGalleryItems.map((item: IImageData, index: number) =>\n this._renderCarouselItemImageView(ZoomView, item, this._zoomedImageSettings, index, true)\n ),\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: true,\n hideIndicator: false,\n keyboard: false,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n isDisabledFunctionality: this.state.isMobileImageZoomed\n } as IComponentNodeProps;\n const carousel = ;\n\n const imageModalSliderProps: IModalViewProps = {\n modalIsOpen: this.state.modalIsOpen,\n ontoggle: this._toggleModal,\n galleryCarousel: carousel,\n classNames: classnames('ms-media-gallery__modal', 'msc-modal-input-required')\n };\n return ImagefullView(imageModalSliderProps) as React.ReactElement;\n };\n}\n\nexport default MediaGallery;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IMediaGalleryThumbnailItemViewProps, IMediaGalleryThumbnailsViewProps, IMediaGalleryViewProps } from '../..';\n\nconst MediaGalleryView: React.FC = props => {\n const { CarouselProps, Thumbnails, MediaGallery, Modal } = props;\n\n return (\n \n \n {Modal}\n {_renderThumbnails(Thumbnails)}\n \n );\n};\n\nconst _renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps): JSX.Element => {\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps, items } = thumbnails;\n\n return (\n \n {items && items.map(_renderThumbnailItem)}\n \n );\n};\n\nconst _renderThumbnailItem = (thumbnail: IMediaGalleryThumbnailItemViewProps): JSX.Element => {\n const { ThumbnailItemContainerProps, Picture } = thumbnail;\n\n return {Picture};\n};\n\nexport default MediaGalleryView;\n","module.exports = React;","module.exports = ReactDOM;"],"names":["binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","Error","prototype","RegistrationId","id","c","require","$type","da","name","path","runOn","iNM","ns","n","p","pdp","md","window","__bindings__","viewDictionary","cn","async","getValidProductImages","productId","channelId","actionContext","imageSettings","selectedProduct","catalogId","getCatalogId","requestContext","actionInput","MediaLocationsForSelectedVariantInput","getMediaLocationsForSelectedVariant","then","mediaLocations","Promise","all","map","mediaLocation","validateMediaLocaionAsync","pairs","filter","pair","catch","error","telemetry","exception","debug","validateProductImages","imageData","src","Uri","altText","AltText","resolve","http","XMLHttpRequest","open","addEventListener","status","send","MediaGallery","React","constructor","props","super","_inlineZoomDivRef","Map","fullScreenOverlayButtonRef","mediaGalleryImages","defaultGalleryImageSettings","viewports","xs","q","w","h","sm","lg","lazyload","cropFocalRegion","defaultThumbnailImageSettings","onExiting","this","setState","animating","onExited","next","removeInlineZoomStyle","undefined","isLastItem","nextIndex","state","activeIndex","goToIndex","updateZoomedInImage","previous","images","mediaGalleryItems","isFirstItem","length","index","_getCarouselItem","image","isInPopup","Image","context","className","fallBackSrc","fallbackImage","gridSettings","request","loadFailureBehavior","shouldSkipToMainImage","bypassHideOnFailure","_getThumbnailItem","modifiedActiveIndex","ThumbnailItemContainerProps","tag","classnames","role","tabIndex","key","onClick","_generateOnThumbnailClick","onKeyDown","_generateOnThumbnailKeyDown","Picture","imageFallbackOptimize","shouldUseOptimizedImage","_refHandler","divRef","set","event","which","KeyCodes","preventDefault","openModalDialog","_toggleModal","imageModalSlider","ZoomView","data","product","result","resources","_mapProductToImageData","carouselprops","Carousel","items","item","_renderCarouselItemImageView","_zoomedImageSettings","interval","directionTextPrev","previousScreenshotFlipperText","directionTextNext","nextScreenshotFlipperText","onIndicatorsClickHandler","showPaginationTooltip","hideIndicator","keyboard","handleOnExited","handleOnExiting","isDisabledFunctionality","isMobileImageZoomed","carousel","imageModalSliderProps","modalIsOpen","ontoggle","galleryCarousel","classNames","ImagefullView","bind","isImageZoomed","isInitialLoad","config","skipImageValidation","zoomedImageSettings","galleryImageSettings","_onImageMouseOut","_inlineZoomImageOnHover","_onInlineImageClick","_onContainerZoomImageClick","_onMouseOutLensContainer","isMobile","variant","VariantType","source","imageSource","shouldUpdateOnPartialDimensionSelection","_setRenderType","mediaLocationsForSelectedVariant","thumbnailImageSettings","_setImages","RecordId","apiSettings","productVariant","reaction","ObjectExtensions","shouldComponentUpdate","nextProps","nextState","render","isVertical","thumbnailsOrientation","isFullscreenAllowed","allowFullScreen","zoomViewMode","imageZoom","emptyPlaceHolderImage","app","placeholderImageName","getFallbackImageUrl","ItemId","curatedImages","_filterMasterImageFromVariant","mediaGalleryCarouselItems","_getMediaGalleryItems","mediaGalleryThumbnailCarouselItems","_getMediaGalleryThumbnailItems","viewProps","moduleProps","Modal","callbackToggle","callbackThumbnailClick","callbackThumbnailKeyDown","CarouselProps","indicatorAriaText","ariaLabelForSlide","keys","Thumbnails","ThumbnailsContainerProps","SingleSlideCarouselComponentProps","SingleSlideCarousel","vertical","flipperPrevLabel","flipperNextLabel","parentId","useTabList","JSON","stringify","renderView","ArrayExtensions","lastUpdate","defaultKey","_getEmptyThumbnailItem","zoomView","_renderEmptyImage","curatedImage","imagesToSet","shouldHideMasterProductImagesForVariant","incrementedIndex","imageIndex","includes","Date","now","_renderImageInContainerOnZoom","_renderImageFullScreenOnZoom","_renderImageInlineOnZoom","shouldHidePrimaryImages","variantImages","isVariantProduct","MasterProductId","itemId","imagePattern","ref","dataScale","defaultDataScale","onMouseOver","onMouseMove","inlineZoomImageOnMouseMove","inlineZoomImageOnHover","String","_handleMobileViewZoomedImageClick","target","currentTarget","mobileZoomedInImageClassName","style","transform","classList","remove","parentElement","overflow","bounds","getBoundingClientRect","Number","positionX","clientX","left","positionY","clientY","top","scaledPositionX","scaledPositionY","add","scrollTo","innerWidth","inlineZoomInitClick","inlineZoomImageOnMouseOut","onContainerZoomInit","onMouseOutLensContainer","onMouseOut","onMouseMoveLensContainer","onMouseOverImageContainer","href","title","fullScreenTitleText","PrimaryImageUrl","current","focus","parentDiv","get","children","querySelector","removeAttribute","removeContainerZoomStyle","_renderThumbnails","thumbnails","Node","_renderThumbnailItem","thumbnail","Module","module","exports","ReactDOM"],"sourceRoot":""}