{"version":3,"file":"static/js/dcee7edfdfd6ad0a266a.bundle.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-media-gallery/dlvry-media-gallery.props.autogenerated.ts?1966","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-media-gallery/utils/helper.ts?cd4c","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-media-gallery/utils/get-valid-product-images.ts?6577","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-media-gallery/dlvry-media-gallery.tsx?779b","webpack://Msdyn365.Commerce.Online/./src/modules/dlvry-media-gallery/dlvry-media-gallery.view.tsx?7045","webpack://Msdyn365.Commerce.Online/./lib/dlvry-media-gallery/module-registration.js?3946","webpack://Msdyn365.Commerce.Online/external var \"React\"?0d3b","webpack://Msdyn365.Commerce.Online/external var \"ReactDOM\"?853b"],"sourcesContent":["/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * IDlvryMediaGallery contentModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\n\r\nexport const enum imageSource {\r\n pageContext = 'pageContext',\r\n productId = 'productId'\r\n}\r\n\r\nexport const enum imageZoom {\r\n inline = 'inline',\r\n container = 'container'\r\n}\r\n\r\nexport const enum thumbnailsOrientation {\r\n vertical = 'vertical',\r\n horizontal = 'horizontal'\r\n}\r\n\r\nexport const enum altTextSource {\r\n product = 'product',\r\n cms = 'cms'\r\n}\r\n\r\nexport interface IDlvryMediaGalleryConfig extends Msdyn365.IModuleConfig {\r\n imageSource?: imageSource;\r\n images?: Msdyn365.IImageData[];\r\n productId?: string;\r\n imageZoom?: imageZoom;\r\n allowFullScreen?: boolean;\r\n dataScale?: string;\r\n zoomedImageSettings?: Msdyn365.IImageSettings;\r\n thumbnailsOrientation?: thumbnailsOrientation;\r\n thumbnailImageSettings?: Msdyn365.IImageSettings;\r\n galleryImageSettings?: Msdyn365.IImageSettings;\r\n shouldHideMasterProductImagesForVariant?: boolean;\r\n altTextSource?: altTextSource;\r\n showPaginationTooltip?: boolean;\r\n shouldUpdateOnPartialDimensionSelection?: boolean;\r\n className?: string;\r\n skipImageValidation?: boolean;\r\n autoplay?: boolean;\r\n mute?: boolean;\r\n playPauseTrigger?: boolean;\r\n controls?: boolean;\r\n clientRender?: boolean;\r\n}\r\n\r\nexport interface IDlvryMediaGalleryResources {\r\n nextScreenshotFlipperText: string;\r\n previousScreenshotFlipperText: string;\r\n fullScreenTitleText: string;\r\n ariaLabelForSlide: string;\r\n playLabel: string;\r\n pauseLabel: string;\r\n pausedLabel: string;\r\n playingLabel: string;\r\n unMuteLabel: string;\r\n muteLabel: string;\r\n fullScreenLabel: string;\r\n exitFullScreenLabel: string;\r\n seekBarLabel: string;\r\n videoTimeDurationLabel: string;\r\n closedCaptionLabel: string;\r\n optionButtonLabel: string;\r\n sliderThumbLabel: string;\r\n volumeThumbLabel: string;\r\n playVideoTitleText: string;\r\n}\r\n\r\nexport interface IDlvryMediaGalleryProps extends Msdyn365.IModule {\r\n resources: IDlvryMediaGalleryResources;\r\n config: IDlvryMediaGalleryConfig;\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { IImageData, IRequestContext, IVideoData } from '@msdyn365-commerce/core';\r\n\r\nexport enum MediaType {\r\n /**\r\n * The None.\r\n */\r\n None = 0,\r\n /**\r\n * The Image type.\r\n */\r\n Image = 1,\r\n /**\r\n * The video type.\r\n */\r\n Video = 2,\r\n /**\r\n * The file type.\r\n */\r\n File = 3\r\n}\r\n\r\nexport interface IMediaData extends IImageData {\r\n mediaTypeValue?: MediaType;\r\n displayOrder?: number;\r\n videoData?: IVideoData;\r\n}\r\n\r\n/**\r\n * Gets correct alt text for image based on configuration of site.\r\n * @param productName Product name.\r\n * @param context Current request context.\r\n * @param imageAltText Alt-text from CMS image.\r\n */\r\nexport function getAltText(\r\n context: IRequestContext,\r\n shouldUseCmsAltText: boolean,\r\n productName?: string,\r\n imageAltText?: string\r\n): string | undefined {\r\n if (!context?.app?.config?.OmniChannelMedia) {\r\n return productName;\r\n }\r\n if (shouldUseCmsAltText) {\r\n return imageAltText;\r\n }\r\n return productName;\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport {\r\n commerceApiRequest,\r\n commerceVideoMetadataRequest,\r\n getCatalogId,\r\n IActionContext,\r\n IImageData,\r\n IImageSettings,\r\n IVideoData\r\n} from '@msdyn365-commerce/core';\r\nimport { MediaLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n getMediaLocationsForSelectedVariant,\r\n MediaLocationsForSelectedVariantInput\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getAltText } from './helper';\r\n\r\nasync function validateMediaLocationAsync(mediaLocation: MediaLocation): Promise<[IImageData, boolean]> {\r\n const imageData: IImageData = {\r\n src: mediaLocation.Uri || '',\r\n altText: mediaLocation.AltText || ''\r\n };\r\n if (mediaLocation.IsApplicableForChildEntities) {\r\n imageData.additionalProperties = { isApplicableForChildEntities: 'true' };\r\n }\r\n\r\n if (imageData.src === '') {\r\n return [imageData, false];\r\n }\r\n\r\n return new Promise<[IImageData, boolean]>(resolve => {\r\n try {\r\n const http = new XMLHttpRequest();\r\n http.open('HEAD', imageData.src!, 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\r\nexport async function getValidProductImages(\r\n productId: number,\r\n channelId: number,\r\n actionContext: IActionContext,\r\n imageSettings: IImageSettings,\r\n selectedProduct?: SimpleProduct\r\n): Promise {\r\n const catalogId = getCatalogId(actionContext.requestContext);\r\n const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\r\n\r\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\r\n .then(mediaLocations => {\r\n if (mediaLocations) {\r\n return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocationAsync(mediaLocation))).then(pairs => {\r\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\r\n });\r\n }\r\n\r\n return [];\r\n })\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\n/**\r\n * Gets product variant images on dimension change of buy-box module for Omni scenario.\r\n * @param productId Product record id.\r\n * @param shouldUseCmsAltText Alt-text source to use.\r\n * @param channelId Current channel id.\r\n * @param actionContext Current action context.\r\n * @param productName Product name.\r\n * @param selectedProduct Currently selected variant product.\r\n * @returns List of images.\r\n */\r\n\r\nexport async function getProductImages(\r\n productId: number,\r\n shouldUseCmsAltText: boolean,\r\n channelId: number,\r\n actionContext: IActionContext,\r\n productName?: string,\r\n selectedProduct?: SimpleProduct\r\n): Promise {\r\n const catalogId = getCatalogId(actionContext.requestContext);\r\n if (actionContext.requestContext?.params?.isPreview) {\r\n const response = await commerceApiRequest(actionContext.requestContext, 'msdyn365-ochannel-product-info', 'post', {\r\n productId: productId,\r\n channelId: channelId,\r\n catalogId: catalogId\r\n });\r\n if (response.status !== 200) {\r\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant for preview scenario');\r\n return [];\r\n }\r\n const previewImageData = response?.data as MediaLocation[];\r\n if (previewImageData) {\r\n return previewImageData.map(mediaLocation => {\r\n return {\r\n src: mediaLocation.Uri ?? '',\r\n altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\r\n displayOrder: mediaLocation.DisplayOrder,\r\n mediaTypeValue: mediaLocation.MediaTypeValue,\r\n additionalProperties: mediaLocation.IsApplicableForChildEntities\r\n ? {\r\n isApplicableForChildEntities: 'true'\r\n }\r\n : undefined\r\n };\r\n });\r\n }\r\n return [];\r\n }\r\n const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\r\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\r\n .then(mediaLocations => {\r\n if (mediaLocations) {\r\n return mediaLocations.map(mediaLocation => {\r\n return {\r\n src: mediaLocation.Uri ?? '',\r\n altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\r\n displayOrder: mediaLocation.DisplayOrder,\r\n mediaTypeValue: mediaLocation.MediaTypeValue,\r\n additionalProperties: mediaLocation.IsApplicableForChildEntities\r\n ? {\r\n isApplicableForChildEntities: 'true'\r\n }\r\n : undefined\r\n };\r\n });\r\n }\r\n return [];\r\n })\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\nexport async function validateProductImages(\r\n mediaLocations: MediaLocation[],\r\n actionContext: IActionContext,\r\n imageSettings: IImageSettings\r\n): Promise {\r\n return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocationAsync(mediaLocation)))\r\n .then(pairs => {\r\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\r\n })\r\n .catch(error => {\r\n actionContext.telemetry.exception(error);\r\n actionContext.telemetry.debug('Unable to validate product images');\r\n return [];\r\n });\r\n}\r\n\r\n/**\r\n * GetVideoMetadataFromAPI - Makes API call to get video metadata.\r\n * @param videoId: Video Id\r\n * @param actionContext: Action context\r\n * @returns: Returns the meta data of the video.\r\n */\r\nexport async function getVideoMetadataFromApi(videoId: string, actionContext: IActionContext): Promise {\r\n let videoPlayerData: IVideoData | undefined;\r\n if (videoId) {\r\n const response = await commerceVideoMetadataRequest(actionContext.requestContext, [videoId]);\r\n\r\n if (response.status !== 200) {\r\n actionContext.telemetry.debug(`Unable to get video metadata for videoId: ${videoId}`);\r\n return;\r\n }\r\n\r\n const videoData = response.data as [];\r\n if (videoData && ArrayExtensions.hasElements(videoData)) {\r\n videoPlayerData = videoData[0];\r\n }\r\n }\r\n return videoPlayerData;\r\n}\r\n","import { Carousel, ICarouselProps, Player, IPlayerData, IPlayerOptions, IVideoMetadata } from '@msdyn365-commerce/components';\r\nimport { IImageData, IImageSettings, Image, Video } from '@msdyn365-commerce/core';\r\nimport { MediaLocation, MediaType, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions, getFallbackImageUrl, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n defaultDataScale,\r\n IComponentNodeProps,\r\n ImagefullView,\r\n IModalViewProps,\r\n IModuleProps,\r\n inlineZoomImageOnHover,\r\n inlineZoomImageOnMouseMove,\r\n inlineZoomImageOnMouseOut,\r\n inlineZoomInitClick,\r\n INodeProps,\r\n ISingleSlideCarouselProps,\r\n isMobile,\r\n KeyCodes,\r\n NodeTag,\r\n onContainerZoomInit,\r\n onMouseMoveLensContainer,\r\n onMouseOutLensContainer,\r\n onMouseOverImageContainer,\r\n removeContainerZoomStyle,\r\n removeInlineZoomStyle,\r\n SingleSlideCarousel,\r\n VariantType\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { reaction } from 'mobx';\r\nimport * as React from 'react';\r\n\r\nimport { IDlvryMediaGalleryData } from './dlvry-media-gallery.data';\r\nimport { imageSource, imageZoom, IDlvryMediaGalleryProps,thumbnailsOrientation } from './dlvry-media-gallery.props.autogenerated';\r\nimport { getProductImages, getValidProductImages, getVideoMetadataFromApi, validateProductImages } from './utils';\r\nimport { getAltText, IMediaData } from './utils/helper';\r\n\r\n\r\n/**\r\n * IMediaGalleryState Interface.\r\n */\r\nexport interface IMediaGalleryState {\r\n slideIndex: number;\r\n animating: boolean;\r\n activeIndex: number;\r\n isImageZoomed: boolean;\r\n modalIsOpen: boolean;\r\n lastUpdate?: number;\r\n isMobileImageZoomed?: boolean;\r\n mediaGalleryItems?: IMediaData[];\r\n isInitialLoad?: boolean;\r\n shouldUseOptimizedImage?: boolean;\r\n}\r\n\r\n/**\r\n * IMediaGalleryThumbnailsViewProps Interface.\r\n */\r\nexport interface IMediaGalleryThumbnailsViewProps {\r\n ThumbnailsContainerProps: INodeProps;\r\n SingleSlideCarouselComponentProps: INodeProps;\r\n items?: IMediaGalleryThumbnailItemViewProps[];\r\n}\r\n\r\n/**\r\n * IMediaGalleryThumbnailItemViewProps Interface.\r\n */\r\nexport interface IMediaGalleryThumbnailItemViewProps {\r\n ThumbnailItemContainerProps: INodeProps;\r\n Picture: React.ReactElement;\r\n}\r\n\r\n/**\r\n * IMediaGalleryViewProps Interface.\r\n */\r\nexport interface IMediaGalleryViewProps extends IDlvryMediaGalleryProps {\r\n state: IMediaGalleryState;\r\n plusSlides(n: number): void;\r\n currentSlide(n: number): void;\r\n sliderImages: JSX.Element[] | null;\r\n mediaGalleryItems: any;\r\n MediaGallery: IModuleProps;\r\n CarouselProps: INodeProps;\r\n Thumbnails: IMediaGalleryThumbnailsViewProps;\r\n Modal?: React.ReactElement | null;\r\n callbackToggle?(): void;\r\n callbackThumbnailClick?(index: number): void;\r\n callbackThumbnailKeyDown?(index: number): void;\r\n}\r\n\r\n/**\r\n * Media gallery component.\r\n */\r\ninterface IMediaGalleryCarouselItems {\r\n items: ItemType[];\r\n keys: (string | undefined)[];\r\n}\r\n\r\nclass MediaGallery extends React.Component, IMediaGalleryState> {\r\n private readonly _inlineZoomDivRef: Map = new Map();\r\n\r\n private readonly fullScreenOverlayButtonRef: React.RefObject = React.createRef();\r\n private readonly player: React.RefObject = React.createRef();\r\n private fallbackImage?: string;\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 private readonly defaultThumbnailImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { w: 66, h: 66 },\r\n sm: { w: 66, h: 66 },\r\n md: { w: 66, h: 66 },\r\n lg: { w: 66, h: 66 },\r\n xl: { w: 66, h: 66 }\r\n },\r\n lazyload: true,\r\n cropFocalRegion: true\r\n };\r\n private readonly _zoomedImageSettings: IImageSettings;\r\n public constructor(props: IDlvryMediaGalleryProps) {\r\n super(props);\r\n this._toggleModal = this._toggleModal.bind(this);\r\n const mediaGalleryImages = this.getImagesData();\r\n this.state = {\r\n slideIndex: 0,\r\n activeIndex: 0,\r\n animating: false,\r\n isImageZoomed: false,\r\n modalIsOpen: false,\r\n isInitialLoad: true,\r\n shouldUseOptimizedImage: !!this.props.config.skipImageValidation,\r\n mediaGalleryItems: mediaGalleryImages\r\n };\r\n this._zoomedImageSettings =\r\n props.config.zoomedImageSettings ?? props.config.galleryImageSettings ?? this.defaultGalleryImageSettings;\r\n\r\n this._onImageMouseOut = this._onImageMouseOut.bind(this);\r\n this._inlineZoomImageOnHover = this._inlineZoomImageOnHover.bind(this);\r\n this._onInlineImageClick = this._onInlineImageClick.bind(this);\r\n this._onContainerZoomImageClick = this._onContainerZoomImageClick.bind(this);\r\n this._onMouseOutLensContainer = this._onMouseOutLensContainer.bind(this);\r\n }\r\n\r\n public plusSlides = (n: number) => {\r\n const slideIndex = this.state.slideIndex + n;\r\n this.setState({ slideIndex: slideIndex });\r\n this.showSlides(this.state.slideIndex + n);\r\n };\r\n public currentSlide = (n: number) => {\r\n this.setState({ slideIndex: n });\r\n this.showSlides(n);\r\n };\r\n public showSlides = (n: number) => {\r\n let slideIndex = n;\r\n const slides: any = this.state.mediaGalleryItems ?? [];\r\n if (n >= slides.length) {\r\n slideIndex = 0;\r\n }\r\n if (n < 0) {\r\n slideIndex = 0;\r\n }\r\n this.setState({ slideIndex: slideIndex });\r\n };\r\n public getImageItem = (image: any, index: number) => {\r\n const imageSettings = this.props.config.galleryImageSettings;\r\n return (\r\n \r\n );\r\n };\r\n public isMobile(): boolean {\r\n const size = isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\r\n return size === 'xs';\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n const source = this.props.config.imageSource ?? imageSource.pageContext;\r\n const shouldUpdateOnPartialDimensionSelection = this.props.config.shouldUpdateOnPartialDimensionSelection;\r\n this._setRenderType();\r\n const thumbnailImageSettings = this.props.config.thumbnailImageSettings;\r\n if (thumbnailImageSettings) {\r\n thumbnailImageSettings.viewports = {\r\n xs: { w: 66, h: 66 },\r\n sm: { w: 66, h: 66 },\r\n md: { w: 66, h: 66 },\r\n lg: { w: 66, h: 66 },\r\n xl: { w: 66, h: 66 }\r\n };\r\n }\r\n if (!this.props.context.request.app?.config?.OmniChannelMedia) {\r\n if (source === imageSource.pageContext) {\r\n if (this.state.mediaGalleryItems === undefined && this.props.data.mediaLocationsForSelectedVariant.result) {\r\n const images = await validateProductImages(\r\n this.props.data.mediaLocationsForSelectedVariant.result,\r\n this.props.context.actionContext,\r\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings\r\n );\r\n await this._setImages(images);\r\n } else if (this.state.mediaGalleryItems === undefined && this.props.data.product.result) {\r\n const product = this.props.data.product.result;\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 thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\r\n product.productVariant\r\n );\r\n\r\n await this._setImages(images);\r\n } else {\r\n await this._setImages([]);\r\n }\r\n }\r\n }\r\n\r\n reaction(\r\n () => {\r\n const product = this.props.data.product.result;\r\n if (!product) {\r\n return null;\r\n }\r\n\r\n if (!shouldUpdateOnPartialDimensionSelection || !product.productVariant?.RecordId) {\r\n return `${product.RecordId}`;\r\n }\r\n\r\n return `${product.RecordId}-${product.productVariant.RecordId}`;\r\n },\r\n async () => {\r\n const product = this.props.data.product.result;\r\n let images: IImageData[] = [];\r\n if (product) {\r\n if (this.props.context.app?.config?.OmniChannelMedia) {\r\n images = await getProductImages(\r\n product.RecordId,\r\n this.shouldUseCmsAltText(),\r\n +this.props.context.request.apiSettings.channelId,\r\n this.props.context.actionContext,\r\n product.Name,\r\n shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\r\n );\r\n } else {\r\n 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 shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\r\n );\r\n }\r\n await this._setImages(images);\r\n } else {\r\n await this._setImages([]);\r\n }\r\n },\r\n { fireImmediately: true }\r\n );\r\n\r\n if (source === imageSource.productId && this.props.data.mediaLocations.result) {\r\n const images = await validateProductImages(\r\n this.props.data.mediaLocations.result,\r\n this.props.context.actionContext,\r\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\r\n );\r\n await this._setImages(images);\r\n }\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IDlvryMediaGalleryProps, nextState: IMediaGalleryState): 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 {\r\n const { id, config, resources } = this.props;\r\n\r\n const { className, showPaginationTooltip } = config;\r\n\r\n const isVertical: boolean = config.thumbnailsOrientation === thumbnailsOrientation.vertical;\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- || is required.\r\n const isFullscreenAllowed: boolean = this.isMobile() || config.allowFullScreen || false;\r\n const zoomViewMode: string =\r\n config.imageZoom === imageZoom.inline ? imageZoom.inline : config.imageZoom === imageZoom.container ? imageZoom.container : '';\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\r\n const emptyPlaceHolderImage = this.props.context.app.config?.placeholderImageName as string;\r\n if (this.props.data.product.result) {\r\n this.fallbackImage = getFallbackImageUrl(\r\n this.props.data.product.result.ItemId,\r\n this.props.context.request.apiSettings,\r\n this.props.context.request.app?.config?.OmniChannelMedia\r\n );\r\n }\r\n if (emptyPlaceHolderImage && this.fallbackImage) {\r\n this.fallbackImage = `${this.fallbackImage},${emptyPlaceHolderImage}`;\r\n }\r\n\r\n const mediaGalleryCarouselItems = this._getMediaGalleryItems(isFullscreenAllowed, zoomViewMode);\r\n const mediaGalleryThumbnailCarouselItems = this._getMediaGalleryThumbnailItems();\r\n let allIThumbnailImages = null;\r\n let allSliderImages = null;\r\n if (this.state.mediaGalleryItems) {\r\n const thumbnailImageSettings = this.props.config.thumbnailImageSettings;\r\n if (thumbnailImageSettings) {\r\n thumbnailImageSettings.viewports = {\r\n xs: { w: 66, h: 66 },\r\n sm: { w: 66, h: 66 },\r\n md: { w: 66, h: 66 },\r\n lg: { w: 66, h: 66 },\r\n xl: { w: 66, h: 66 }\r\n };\r\n }\r\n allIThumbnailImages = this.state.mediaGalleryItems.map((image, index) => {\r\n return (\r\n <>\r\n this.currentSlide(index)}\r\n alt={image.altText}\r\n loadFailureBehavior='hide'\r\n imageFallbackOptimize={true}\r\n bypassHideOnFailure={index === 0}\r\n />\r\n \r\n );\r\n });\r\n allSliderImages = this.state.mediaGalleryItems.map((image, index) => {\r\n return this.getImageItem(image, index);\r\n });\r\n }\r\n const viewProps: IMediaGalleryViewProps = {\r\n ...(this.props as IDlvryMediaGalleryProps),\r\n state: this.state,\r\n plusSlides: this.plusSlides,\r\n currentSlide: this.currentSlide,\r\n mediaGalleryItems: allIThumbnailImages,\r\n sliderImages: allSliderImages,\r\n MediaGallery: {\r\n moduleProps: this.props,\r\n className: classnames(`ms-media-gallery ${isVertical ? 'vertical' : ''}`, className)\r\n },\r\n Modal: isFullscreenAllowed ? this.imageModalSlider(zoomViewMode) : null,\r\n callbackToggle: this.openModalDialog,\r\n callbackThumbnailClick: this._generateOnThumbnailClick,\r\n callbackThumbnailKeyDown: this._generateOnThumbnailKeyDown,\r\n CarouselProps: {\r\n tag: Carousel,\r\n className: 'ms-media-gallery__carousel',\r\n items: mediaGalleryCarouselItems.items,\r\n activeIndex: this.state.activeIndex,\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 showPaginationTooltip: showPaginationTooltip === true,\r\n indicatorAriaText: resources.ariaLabelForSlide,\r\n handleOnExited: this.onExited,\r\n handleOnExiting: this.onExiting,\r\n key: mediaGalleryCarouselItems.keys\r\n } as IComponentNodeProps,\r\n Thumbnails: {\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 vertical: isVertical,\r\n flipperPrevLabel: resources.previousScreenshotFlipperText,\r\n flipperNextLabel: resources.nextScreenshotFlipperText,\r\n parentId: id,\r\n useTabList: true,\r\n key: JSON.stringify(mediaGalleryThumbnailCarouselItems.keys)\r\n } as IComponentNodeProps,\r\n items: mediaGalleryThumbnailCarouselItems.items\r\n }\r\n };\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n /**\r\n * Zoomed out image on previous/next click.\r\n */\r\n public updateZoomedInImage(): void {\r\n this.setState({ isImageZoomed: false });\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 /**\r\n * On click next in carousel.\r\n */\r\n private readonly next = (): void => {\r\n removeInlineZoomStyle();\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 this.updateZoomedInImage();\r\n };\r\n\r\n /**\r\n * On click previous in carousel.\r\n */\r\n private readonly previous = (): void => {\r\n removeInlineZoomStyle();\r\n const images = this.state.mediaGalleryItems;\r\n const nextIndex = this.isFirstItem() ? (images ? images.length - 1 : 0) : this.state.activeIndex - 1;\r\n this.goToIndex(nextIndex);\r\n this.updateZoomedInImage();\r\n };\r\n\r\n private readonly goToIndex = (index: number): void => {\r\n const { autoplay } = this.props.config;\r\n const currentIndex = this.state.activeIndex;\r\n const mediaItems = this.state.mediaGalleryItems;\r\n if (autoplay && mediaItems) {\r\n if (mediaItems[`${index}`]?.mediaTypeValue === MediaType.Video) {\r\n this.player.current?.play();\r\n } else if (mediaItems[`${currentIndex}`].mediaTypeValue === MediaType.Video) {\r\n this.player.current?.pause();\r\n }\r\n }\r\n this.setState({ activeIndex: index });\r\n };\r\n\r\n private _getMediaGalleryThumbnailItems(): IMediaGalleryCarouselItems {\r\n const mediaGalleryItems = this.state.mediaGalleryItems;\r\n const thumbnailImageSettings = this.props.config.thumbnailImageSettings;\r\n if (thumbnailImageSettings) {\r\n thumbnailImageSettings.cropFocalRegion = true;\r\n }\r\n\r\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\r\n\r\n if (!hasMediaGalleryItems) {\r\n if (this.state.lastUpdate) {\r\n const defaultKey = 0;\r\n return {\r\n items: [this._getEmptyThumbnailItem(thumbnailImageSettings, defaultKey, this.state.activeIndex)],\r\n keys: ['empty']\r\n };\r\n }\r\n return { items: [], keys: [] };\r\n }\r\n\r\n return {\r\n items: [\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\r\n ...mediaGalleryItems!.map((item: IMediaData, index: number) => {\r\n if (item.mediaTypeValue === MediaType.Video) {\r\n return this.getVideoThumbNailItem(\r\n item,\r\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\r\n index,\r\n this.state.activeIndex\r\n );\r\n } else {\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 })\r\n ],\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\r\n keys: [...mediaGalleryItems!.map(item => item.src)]\r\n };\r\n }\r\n\r\n private getImagesData = (): IImageData[] => {\r\n if (this.props.config.skipImageValidation || this.props.context.request.app?.config?.OmniChannelMedia) {\r\n const source = this.props.config.imageSource ?? imageSource.pageContext;\r\n let images: IImageData[] = [];\r\n let mediaLocations: MediaLocation[] = [];\r\n if (source === imageSource.pageContext && this.props.data.mediaLocationsForSelectedVariant.result) {\r\n mediaLocations = this.props.data.mediaLocationsForSelectedVariant.result;\r\n } else if (source === imageSource.productId && this.props.data.mediaLocations.result) {\r\n mediaLocations = this.props.data.mediaLocations.result;\r\n }\r\n images = mediaLocations.map(mediaLocation => {\r\n return {\r\n src: mediaLocation.Uri ?? '',\r\n altText: getAltText(\r\n this.props.context.actionContext.requestContext,\r\n this.shouldUseCmsAltText(),\r\n this.props.data.product.result?.Name,\r\n mediaLocation.AltText\r\n ),\r\n additionalProperties: mediaLocation.IsApplicableForChildEntities\r\n ? {\r\n isApplicableForChildEntities: 'true'\r\n }\r\n : undefined\r\n };\r\n });\r\n const curatedImages = this.props.config.images ?? [];\r\n\r\n return [...this._filterMasterImageFromVariant(images), ...curatedImages];\r\n }\r\n return [];\r\n };\r\n\r\n private _getMediaGalleryItems(isFullscreenAllowed: boolean, zoomViewMode: string): IMediaGalleryCarouselItems {\r\n const mediaGalleryItems = this.state.mediaGalleryItems;\r\n const galleryImageSettings = this.props.config.galleryImageSettings;\r\n if (galleryImageSettings) {\r\n galleryImageSettings.cropFocalRegion = true;\r\n }\r\n\r\n const zoomView = isFullscreenAllowed ? 'fullscreen' : zoomViewMode;\r\n\r\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\r\n\r\n if (!hasMediaGalleryItems) {\r\n if (this.state.lastUpdate) {\r\n return { items: [this._renderEmptyImage(galleryImageSettings)], keys: ['empty'] };\r\n }\r\n return { items: [], keys: [] };\r\n }\r\n\r\n return {\r\n items: [\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\r\n ...mediaGalleryItems!.map((item: IMediaData, index: number) => {\r\n return this._renderCarouselItemImageView(\r\n zoomView,\r\n item,\r\n galleryImageSettings ?? this.defaultGalleryImageSettings,\r\n index\r\n );\r\n })\r\n ],\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\r\n keys: [...mediaGalleryItems!.map(item => item.src)]\r\n };\r\n }\r\n\r\n private async _setImages(images?: IMediaData[]): Promise {\r\n const curatedImage = this.props.config.images || [];\r\n const mediaToSet: IMediaData[] = this._filterMasterImageFromVariant(images);\r\n\r\n void Promise.all(\r\n mediaToSet.map(async mediaData => {\r\n if (mediaData.mediaTypeValue === MediaType.Video && mediaData.src) {\r\n try {\r\n const url = new URL(mediaData.src);\r\n const videoId = url.searchParams.get('CVID');\r\n if (videoId) {\r\n mediaData.videoData = await getVideoMetadataFromApi(videoId, this.props.context.actionContext);\r\n }\r\n } catch (error) {\r\n if (this.props.telemetry) {\r\n this.props.telemetry.debug('Error while fetching videoId');\r\n }\r\n }\r\n }\r\n return mediaData;\r\n })\r\n ).then(mediaData => {\r\n const mediaItems = mediaData.filter(element => {\r\n return (\r\n element.mediaTypeValue !== MediaType.Video ||\r\n (element.mediaTypeValue === MediaType.Video && element.videoData !== undefined)\r\n );\r\n });\r\n\r\n this.setState({\r\n mediaGalleryItems: [...mediaItems, ...curatedImage],\r\n activeIndex: 0,\r\n lastUpdate: Date.now(),\r\n shouldUseOptimizedImage: false\r\n });\r\n });\r\n\r\n this.setState({\r\n mediaGalleryItems: [...mediaToSet, ...curatedImage],\r\n activeIndex: 0,\r\n lastUpdate: Date.now(),\r\n shouldUseOptimizedImage: false\r\n });\r\n }\r\n\r\n private _setRenderType(): void {\r\n this.setState({\r\n isInitialLoad: false\r\n });\r\n }\r\n\r\n private _renderCarouselItemImageView(\r\n zoomView: string,\r\n media: IMediaData,\r\n imageSettings: IImageSettings,\r\n index: number,\r\n isInPopup: boolean = false\r\n ): React.ReactNode {\r\n if (media.mediaTypeValue === MediaType.Video) {\r\n if (this.isMobile() && zoomView !== 'fullscreen') {\r\n return <>{this._renderCarouselItemVideo(media, index, imageSettings)};\r\n }\r\n\r\n return <>{this._renderVideoThumbnail(media, index, imageSettings)};\r\n } else {\r\n if (this.isMobile()) {\r\n if (isInPopup) {\r\n return this._renderImageInContainerOnZoom(media, this._zoomedImageSettings, index);\r\n }\r\n return this._renderImageFullScreenOnZoom(media, imageSettings, index);\r\n }\r\n\r\n switch (zoomView) {\r\n case 'container': {\r\n return this._renderImageInContainerOnZoom(media, this._zoomedImageSettings, index);\r\n }\r\n case 'inline': {\r\n return this._renderImageInlineOnZoom(media, this._zoomedImageSettings, index);\r\n }\r\n case 'fullscreen': {\r\n return this._renderImageFullScreenOnZoom(media, imageSettings, index);\r\n }\r\n\r\n // No default\r\n }\r\n return <>{this._getCarouselItem(media, imageSettings, index, isInPopup)};\r\n }\r\n }\r\n\r\n private _filterMasterImageFromVariant(images?: IImageData[]): IImageData[] {\r\n const shouldHidePrimaryImages = this.props.config.shouldHideMasterProductImagesForVariant ?? true;\r\n let variantImages = images ?? [];\r\n const isVariantProduct =\r\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.MasterProductId) ||\r\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.productVariant);\r\n const itemId = this.props.data.product.result?.ItemId;\r\n if (shouldHidePrimaryImages && isVariantProduct && itemId) {\r\n variantImages = variantImages.filter(item => {\r\n const isApplicableForChildEntities = item.additionalProperties?.isApplicableForChildEntities;\r\n return !isApplicableForChildEntities;\r\n });\r\n if (!ArrayExtensions.hasElements(variantImages)) {\r\n variantImages = images ?? [];\r\n }\r\n }\r\n return variantImages;\r\n }\r\n\r\n private readonly _renderCarouselItemVideo = (mediaData: IMediaData, index: number, imageSettings: IImageSettings): React.ReactNode => {\r\n const videoData = mediaData.videoData;\r\n if (videoData) {\r\n const options: IPlayerOptions = this.props.config as IPlayerOptions;\r\n const playerResources = this.props.resources;\r\n const videoMetaData: IVideoMetadata = {};\r\n videoMetaData.videoId = videoData.id;\r\n videoMetaData.title = videoData.title;\r\n videoMetaData.duration = videoData.playTime;\r\n if (videoData.thumbnail) {\r\n videoMetaData.posterframeUrl = videoData.thumbnail.src;\r\n }\r\n if (videoData._links?.binaryReferences) {\r\n videoMetaData.videoBinaryReferences = videoData._links.binaryReferences;\r\n }\r\n const videoPlayerData: IPlayerData = { options, metaData: videoMetaData };\r\n const attributes = {\r\n id: `${this.props.id}__carousel-item__${index}`\r\n };\r\n return (\r\n \r\n );\r\n }\r\n return this._renderEmptyImage(imageSettings);\r\n };\r\n\r\n private readonly _getCarouselItem = (\r\n image: IImageData,\r\n imageSettings: IImageSettings,\r\n index: number,\r\n isInPopup: boolean = false\r\n ): 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 ): IMediaGalleryThumbnailItemViewProps => {\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 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 /**\r\n * Gets the video thumbnail item to display media gallery.\r\n * @param props - The Media gallery view props from business layer.\r\n * @returns Return thumbnail view props which will be used to render video.\r\n */\r\n private readonly getVideoThumbNailItem = (\r\n mediaData: IMediaData,\r\n imageSettings: IImageSettings,\r\n index: number,\r\n modifiedActiveIndex: number\r\n ): IMediaGalleryThumbnailItemViewProps => {\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 const videoData = mediaData.videoData;\r\n let image: IImageData;\r\n if (videoData?.thumbnail) {\r\n image = videoData.thumbnail;\r\n } else {\r\n image = {\r\n src: 'empty'\r\n };\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 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 /**\r\n * Ref Handler.\r\n * @param index -Remove item click function.\r\n * @returns Set inline zoom.\r\n */\r\n private readonly _refHandler = (index: number) => (divRef: HTMLDivElement) => {\r\n this._inlineZoomDivRef.set(index, divRef);\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\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\r\n this.goToIndex(index);\r\n };\r\n };\r\n\r\n private _renderImageInlineOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _inlineZoomImageOnHover(event: React.MouseEvent): void {\r\n inlineZoomImageOnHover(event, this.props.config.dataScale ?? String(defaultDataScale));\r\n }\r\n\r\n private _handleMobileViewZoomedImageClick(event: React.MouseEvent) {\r\n const target = this.state.shouldUseOptimizedImage ? (event.target as HTMLImageElement) : event.currentTarget;\r\n const mobileZoomedInImageClassName = 'msc-mobile-zoomed-in';\r\n if (!this.state.isMobileImageZoomed) {\r\n const bounds = target.getBoundingClientRect();\r\n const dataScale = Number(this.props.config.dataScale ?? defaultDataScale);\r\n\r\n const positionX = event.clientX - bounds.left;\r\n const positionY = event.clientY - bounds.top;\r\n const scaledPositionX = positionX * dataScale;\r\n const scaledPositionY = positionY * dataScale;\r\n\r\n target.style.transform = `scale(${dataScale})`;\r\n target.classList.add(mobileZoomedInImageClassName);\r\n target.parentElement!.style.overflow = 'auto';\r\n target.parentElement!.scrollTo(scaledPositionX - positionX, scaledPositionY - positionY);\r\n this.setState({\r\n isMobileImageZoomed: true\r\n });\r\n } else {\r\n target.style.transform = '';\r\n target.classList.remove(mobileZoomedInImageClassName);\r\n target.parentElement!.style.overflow = '';\r\n this.setState({\r\n isMobileImageZoomed: false\r\n });\r\n }\r\n }\r\n\r\n private _onInlineImageClick(event: React.MouseEvent): void {\r\n if (window.innerWidth <= 768) {\r\n // $msv-breakpoint-m\r\n this._handleMobileViewZoomedImageClick(event);\r\n return;\r\n }\r\n inlineZoomInitClick(event, this.props.config.dataScale ?? String(defaultDataScale));\r\n this.setState({\r\n isImageZoomed: true\r\n });\r\n }\r\n\r\n private _onImageMouseOut(event: React.MouseEvent): void {\r\n inlineZoomImageOnMouseOut(event);\r\n this.setState({\r\n isImageZoomed: false\r\n });\r\n }\r\n\r\n private _onContainerZoomImageClick(event: React.MouseEvent): void {\r\n if (window.innerWidth <= 768) {\r\n // $msv-breakpoint-m\r\n this._handleMobileViewZoomedImageClick(event);\r\n return;\r\n }\r\n\r\n onContainerZoomInit(event);\r\n\r\n this.setState({\r\n isImageZoomed: true\r\n });\r\n }\r\n\r\n private _onMouseOutLensContainer(event: React.MouseEvent): void {\r\n onMouseOutLensContainer(event);\r\n\r\n this.setState({\r\n isImageZoomed: false\r\n });\r\n }\r\n\r\n private _renderImageInContainerOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\r\n return (\r\n
\r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n private _renderImageFullScreenOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\r\n return (\r\n
\r\n \r\n
\r\n {}\r\n \r\n
\r\n
\r\n );\r\n }\r\n\r\n /**\r\n * Render the video thumbnail in full screen.\r\n * @param mediaData - Media Data.\r\n * @param index - Index\r\n * @param imageSettings - Image settings.\r\n * @returns - JSX.Element\r\n */\r\n private readonly _renderVideoThumbnail = (mediaData: IMediaData, index: number, imageSettings: IImageSettings): React.ReactNode => {\r\n const videoData = mediaData.videoData;\r\n let image: IImageData;\r\n if (videoData?.thumbnail) {\r\n image = videoData.thumbnail;\r\n } else {\r\n image = {\r\n src: 'empty'\r\n };\r\n }\r\n\r\n return (\r\n
\r\n \r\n
\r\n {}\r\n \r\n
\r\n
\r\n );\r\n };\r\n\r\n private _mapProductToImageData(product: SimpleProduct): IImageData {\r\n return {\r\n src: product.PrimaryImageUrl ?? ''\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\n private _getEmptyThumbnailItem(\r\n imageSettings: IImageSettings | undefined,\r\n index: number,\r\n modifiedActiveIndex: number\r\n ): IMediaGalleryThumbnailItemViewProps {\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 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: 'empty',\r\n 'aria-label': '',\r\n 'aria-selected': modifiedActiveIndex === 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 isFirstItem = () => this.state.activeIndex === 0;\r\n\r\n private readonly isLastItem = () => {\r\n const images = this.state.mediaGalleryItems;\r\n return images && this.state.activeIndex === images.length - 1;\r\n };\r\n\r\n private readonly openModalDialog = (): void => {\r\n this._toggleModal();\r\n };\r\n\r\n private _toggleModal(): void {\r\n if (this.state.modalIsOpen) {\r\n this.fullScreenOverlayButtonRef.current?.focus();\r\n const parentDiv = this._inlineZoomDivRef.get(this.state.activeIndex);\r\n if (parentDiv && parentDiv.children && parentDiv.children.length >= 2) {\r\n const image = parentDiv.children[1].querySelector('img');\r\n if (image) {\r\n image.removeAttribute('style');\r\n }\r\n }\r\n this.setState({\r\n isImageZoomed: false\r\n });\r\n }\r\n this.setState({\r\n isImageZoomed: false,\r\n modalIsOpen: !this.state.modalIsOpen\r\n });\r\n removeInlineZoomStyle();\r\n removeContainerZoomStyle();\r\n }\r\n\r\n private readonly imageModalSlider = (ZoomView: string): React.ReactElement => {\r\n const {\r\n data: {\r\n product: { result: product }\r\n },\r\n resources\r\n } = this.props;\r\n let mediaGalleryItems = this.state.mediaGalleryItems;\r\n\r\n if (!mediaGalleryItems && product) {\r\n mediaGalleryItems = [this._mapProductToImageData(product)];\r\n }\r\n const carouselprops = {\r\n tag: Carousel,\r\n className: 'ms-media-gallery__carousel',\r\n items:\r\n mediaGalleryItems &&\r\n mediaGalleryItems.map((item: IImageData, index: number) =>\r\n this._renderCarouselItemImageView(ZoomView, item, this._zoomedImageSettings, index, true)\r\n ),\r\n activeIndex: this.state.activeIndex,\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 showPaginationTooltip: true,\r\n hideIndicator: false,\r\n keyboard: false,\r\n handleOnExited: this.onExited,\r\n handleOnExiting: this.onExiting,\r\n isDisabledFunctionality: this.state.isMobileImageZoomed\r\n } as IComponentNodeProps;\r\n const carousel = ;\r\n\r\n const imageModalSliderProps: IModalViewProps = {\r\n modalIsOpen: this.state.modalIsOpen,\r\n ontoggle: this._toggleModal,\r\n galleryCarousel: carousel,\r\n classNames: classnames('ms-media-gallery__modal', 'msc-modal-input-required')\r\n };\r\n return ImagefullView(imageModalSliderProps) as React.ReactElement;\r\n };\r\n\r\n private shouldUseCmsAltText = (): boolean => {\r\n if (this.props.config.altTextSource === 'product') {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n };\r\n}\r\n\r\nexport default MediaGallery;\r\n","import { IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\r\nimport {\r\n IMediaGalleryThumbnailItemViewProps,\r\n IMediaGalleryThumbnailsViewProps,\r\n IMediaGalleryViewProps\r\n} from './dlvry-media-gallery';\r\nimport { getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, KeyCodes, Module, Node, NodeTag } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport React from 'react';\r\n\r\n/**\r\n * Render the thumbnail item images.\r\n * @param thumbnail - The carousel thumbnail line props.\r\n * @returns Return HTML having thumnailcontainer props with image.\r\n */\r\nconst renderThumbnailItem = (thumbnail: IMediaGalleryThumbnailItemViewProps): JSX.Element => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\r\n const { ThumbnailItemContainerProps, Picture } = thumbnail;\r\n\r\n return {Picture};\r\n};\r\n\r\n/**\r\n * Gets the thumbnail item to display media gallery images.\r\n * @param image - The media gallery images.\r\n * @param imageSettings - Image settings for the image gallery items.\r\n * @param imageId - Image id.\r\n * @param modifiedActiveIndex - Modified Index of the images when selection changes.\r\n * @param props - The Media gallery view props from business layer.\r\n * @returns Return thumbnail view props which will be used to render images.\r\n */\r\nconst GetThumbnailItemComponent = (\r\n image: IImageData,\r\n imageSettings: IImageSettings,\r\n imageId: number,\r\n modifiedActiveIndex: number,\r\n props: IMediaGalleryViewProps\r\n): IMediaGalleryThumbnailItemViewProps => {\r\n let fallbackImage: string | undefined = '';\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\r\n const emptyPlaceHolderImage = props.context.app.config?.placeholderImageName as string;\r\n if (props.data.product.result) {\r\n fallbackImage = getFallbackImageUrl(props.data.product.result.ItemId, props.context.request.apiSettings);\r\n }\r\n if (emptyPlaceHolderImage && fallbackImage) {\r\n fallbackImage = `${fallbackImage},${emptyPlaceHolderImage}`;\r\n }\r\n\r\n /**\r\n * OnClick method of media gallery item.\r\n */\r\n const onClick = () => {\r\n props.callbackToggle?.();\r\n props.callbackThumbnailClick?.(imageId);\r\n props.state.activeIndex = imageId;\r\n };\r\n\r\n const classes = classnames(\r\n 'ms-media-gallery__thumbnail-item',\r\n modifiedActiveIndex === imageId ? 'ms-media-gallery__thumbnail-item-active' : ''\r\n );\r\n\r\n /**\r\n * Keydown event of media gallery item.\r\n * @param event - React.KeyboardEvent.\r\n */\r\n const handleKeyDown = (event: React.KeyboardEvent) => {\r\n if (event.keyCode === KeyCodes.Enter) {\r\n event.preventDefault();\r\n onClick();\r\n }\r\n };\r\n const defaultIndex = 0;\r\n return {\r\n ThumbnailItemContainerProps: {\r\n tag: 'li' as NodeTag,\r\n className: classes,\r\n role: 'presentation',\r\n key: imageId\r\n },\r\n Picture: (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n };\r\n};\r\n\r\n/**\r\n * Gets the empty thumbnail item to display media gallery images.\r\n * @param imageSettings - Image settings for the image gallery items.\r\n * @param props - The Media gallery view props from business layer.\r\n * @returns Return thumbnail view props which will be used to render empty images.\r\n */\r\nconst GetEmptyThumbnailItemComponent = (\r\n imageSettings: IImageSettings,\r\n props: IMediaGalleryViewProps\r\n): IMediaGalleryThumbnailItemViewProps => {\r\n let fallbackImage: string | undefined = '';\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\r\n const emptyPlaceHolderImage = props.context.app.config?.placeholderImageName as string;\r\n if (props.data.product.result) {\r\n fallbackImage = getFallbackImageUrl(props.data.product.result.ItemId, props.context.request.apiSettings);\r\n }\r\n if (emptyPlaceHolderImage && fallbackImage) {\r\n fallbackImage = `${fallbackImage},${emptyPlaceHolderImage}`;\r\n }\r\n return {\r\n ThumbnailItemContainerProps: {\r\n tag: 'li' as NodeTag,\r\n className: 'ms-media-gallery__thumbnail-item',\r\n role: 'tab',\r\n tabIndex: 0,\r\n key: 0,\r\n 'aria-label': '',\r\n 'aria-selected': true\r\n },\r\n Picture: (\r\n \r\n )\r\n };\r\n};\r\n\r\n/**\r\n * Update media gallery items method.\r\n * @param items - The media gallery thumbnail item view props.\r\n * @returns The IImageData array.\r\n */\r\nconst getMediaGalleryItems = (items?: IMediaGalleryThumbnailItemViewProps[]): IImageData[] | undefined => {\r\n return items?.map(item => {\r\n return {\r\n altText: item.Picture.props.altText,\r\n src: item.Picture.props.src\r\n };\r\n });\r\n};\r\n\r\nconst defaultThumbnailImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=295&h=295&q=80&m=6&f=jpg', w: 295, h: 295 },\r\n xl: { q: 'w=295&h=295&q=80&m=6&f=jpg', w: 295, h: 295 }\r\n },\r\n lazyload: true,\r\n cropFocalRegion: true\r\n};\r\n\r\n/**\r\n * Render the Media gallery thumbnails to represent images in grid view.\r\n * @param thumbnails - The thumbnail view props.\r\n * @param props - The media gallery view props.\r\n * @returns - The single slide carousel component to render as media gallery image.\r\n */\r\n// @ts-ignore\r\nconst renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps, props: IMediaGalleryViewProps): JSX.Element => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\r\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps } = thumbnails;\r\n const { state, Thumbnails } = props;\r\n const mediaGalleryItems = getMediaGalleryItems(Thumbnails.items);\r\n\r\n const items: IMediaGalleryThumbnailItemViewProps[] | undefined =\r\n // eslint-disable-next-line multiline-ternary -- need multiline for easy code reading\r\n state.lastUpdate && mediaGalleryItems && mediaGalleryItems[0].src === 'empty'\r\n ? [GetEmptyThumbnailItemComponent(defaultThumbnailImageSettings, props)]\r\n : // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery\r\n mediaGalleryItems?.map((item: IImageData, id: number) =>\r\n GetThumbnailItemComponent(item, defaultThumbnailImageSettings, id, state.activeIndex, props)\r\n );\r\n\r\n return (\r\n \r\n {items?.map(renderThumbnailItem)}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Render the Media gallery items using viewprops.\r\n * @param props - The media gallery view props.\r\n * @returns The media gallery module wrapping up images node.\r\n */\r\nconst mediaGalleryView: React.FC = props => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\r\n const { CarouselProps, MediaGallery, Modal } = props;\r\n const onClick = (index:any) => {\r\n props.callbackToggle?.();\r\n props.callbackThumbnailClick?.(index);\r\n props.state.slideIndex = index;\r\n props.state.activeIndex = index;\r\n };\r\n return (\r\n <>\r\n {props.mediaGalleryItems && props.mediaGalleryItems.length > 0 ? (\r\n \r\n \r\n {Modal}\r\n
\r\n {props.sliderImages &&\r\n props.sliderImages.map((image: any, index: number) => {\r\n return (\r\n
\r\n onClick(index)}\r\n />\r\n {image}\r\n
\r\n );\r\n })}\r\n\r\n props.plusSlides(-1)}>\r\n ❮\r\n \r\n props.plusSlides(1)}>\r\n ❯\r\n \r\n\r\n
\r\n {props.mediaGalleryItems.map((image: any, index: number) => {\r\n return (\r\n
\r\n {image}\r\n
\r\n );\r\n })}\r\n
\r\n
\r\n
\r\n\r\n ): GetEmptyThumbnailItemComponent(defaultThumbnailImageSettings, props).Picture}\r\n \r\n );\r\n};\r\n\r\nexport default mediaGalleryView;","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['dlvry-media-gallery'] = {\n c: () => require('partner/modules/dlvry-media-gallery/dlvry-media-gallery.tsx'),\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: false,\n ns: '__local__',\n n: 'dlvry-media-gallery',\n p: '__local__',\n \n pdp: '',\n \n \n md: 'src/modules/dlvry-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['__local__|__local__|modules|dlvry-media-gallery|dlvry-media-gallery'] = {\n c: () => require('partner/modules/dlvry-media-gallery/dlvry-media-gallery.view.tsx'),\n cn: '__local__-__local__-dlvry-media-gallery'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","module.exports = React;","module.exports = ReactDOM;"],"names":["imageSource","imageZoom","thumbnailsOrientation","altTextSource","MediaType","getAltText","context","shouldUseCmsAltText","productName","imageAltText","_context$app","_context$app$config","app","config","OmniChannelMedia","async","validateMediaLocationAsync","mediaLocation","imageData","src","Uri","altText","AltText","IsApplicableForChildEntities","additionalProperties","isApplicableForChildEntities","Promise","resolve","http","XMLHttpRequest","open","addEventListener","status","send","_unused","getValidProductImages","productId","channelId","actionContext","imageSettings","selectedProduct","catalogId","getCatalogId","requestContext","actionInput","MediaLocationsForSelectedVariantInput","getMediaLocationsForSelectedVariant","then","mediaLocations","all","map","pairs","filter","pair","catch","error","telemetry","exception","debug","validateProductImages","MediaGallery","React","constructor","props","_this","_ref","_props$config$zoomedI","super","this","_inlineZoomDivRef","Map","fullScreenOverlayButtonRef","player","defaultGalleryImageSettings","viewports","xs","q","w","h","sm","md","lg","lazyload","cropFocalRegion","defaultThumbnailImageSettings","xl","plusSlides","n","slideIndex","state","setState","showSlides","currentSlide","_this$state$mediaGall","mediaGalleryItems","length","getImageItem","image","index","galleryImageSettings","Image","Object","assign","className","gridSettings","request","loadFailureBehavior","id","shouldSkipToMainImage","bypassHideOnFailure","onExiting","animating","onExited","next","removeInlineZoomStyle","undefined","isLastItem","nextIndex","activeIndex","goToIndex","updateZoomedInImage","previous","images","isFirstItem","autoplay","currentIndex","mediaItems","_mediaItems","_this$player$current","mediaTypeValue","current","play","_this$player$current2","pause","getImagesData","_this$props$context$r","_this$props$context$r2","skipImageValidation","_this$props$config$im","_this$props$config$im2","source","pageContext","data","mediaLocationsForSelectedVariant","result","_mediaLocation$Uri","_this$props$data$prod","product","Name","curatedImages","_filterMasterImageFromVariant","_renderCarouselItemVideo","mediaData","videoData","_videoData$_links","options","playerResources","resources","videoMetaData","videoId","title","duration","playTime","thumbnail","posterframeUrl","_links","binaryReferences","videoBinaryReferences","videoPlayerData","metaData","attributes","Video","editProps","key","Player","ref","playerData","isEditor","params","_renderEmptyImage","_getCarouselItem","_this$props$context$r3","_this$props$context$r4","isInPopup","arguments","fallBackSrc","fallbackImage","_getThumbnailItem","modifiedActiveIndex","ThumbnailItemContainerProps","tag","classnames","role","tabIndex","onClick","_generateOnThumbnailClick","onKeyDown","_generateOnThumbnailKeyDown","Picture","imageFallbackOptimize","shouldUseOptimizedImage","getVideoThumbNailItem","classes","_refHandler","divRef","set","event","which","KeyCodes","preventDefault","_renderVideoThumbnail","fullScreenTitleText","openModalDialog","_toggleModal","imageModalSlider","ZoomView","_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","mediaGalleryImages","isImageZoomed","isInitialLoad","zoomedImageSettings","_onImageMouseOut","_inlineZoomImageOnHover","_onInlineImageClick","_onContainerZoomImageClick","_onMouseOutLensContainer","isMobile","variant","VariantType","_this$props$config$im3","_this$props$context$r5","_this$props$context$r6","shouldUpdateOnPartialDimensionSelection","_setRenderType","thumbnailImageSettings","_setImages","RecordId","apiSettings","productVariant","reaction","_product$productVaria","_this$props$context$a","_this$props$context$a2","_this$props$config$th","_actionContext$reques","_actionContext$reques2","isPreview","response","commerceApiRequest","previewImageData","displayOrder","DisplayOrder","MediaTypeValue","_mediaLocation$Uri2","getProductImages","fireImmediately","_this$props$config$th2","shouldComponentUpdate","nextProps","nextState","render","_this$props$context$a3","isVertical","vertical","isFullscreenAllowed","allowFullScreen","zoomViewMode","inline","container","emptyPlaceHolderImage","placeholderImageName","_this$props$context$r7","_this$props$context$r8","getFallbackImageUrl","ItemId","mediaGalleryCarouselItems","_getMediaGalleryItems","mediaGalleryThumbnailCarouselItems","_getMediaGalleryThumbnailItems","allIThumbnailImages","allSliderImages","alt","viewProps","_objectSpread","sliderImages","moduleProps","Modal","callbackToggle","callbackThumbnailClick","callbackThumbnailKeyDown","CarouselProps","indicatorAriaText","ariaLabelForSlide","keys","Thumbnails","ThumbnailsContainerProps","SingleSlideCarouselComponentProps","SingleSlideCarousel","flipperPrevLabel","flipperNextLabel","parentId","useTabList","JSON","stringify","renderView","ArrayExtensions","lastUpdate","defaultKey","_getEmptyThumbnailItem","zoomView","curatedImage","mediaToSet","URL","searchParams","get","commerceVideoMetadataRequest","getVideoMetadataFromApi","element","Date","now","media","_renderImageInContainerOnZoom","_renderImageFullScreenOnZoom","_renderImageInlineOnZoom","_this$props$config$sh","_this$props$data$prod2","_this$props$data$prod3","_this$props$data$prod4","shouldHidePrimaryImages","shouldHideMasterProductImagesForVariant","variantImages","isVariantProduct","ObjectExtensions","MasterProductId","itemId","_item$additionalPrope","_this$props$config$da","dataScale","defaultDataScale","onMouseOver","onMouseMove","inlineZoomImageOnMouseMove","_this$props$config$da2","inlineZoomImageOnHover","String","_handleMobileViewZoomedImageClick","target","currentTarget","mobileZoomedInImageClassName","style","transform","classList","remove","parentElement","overflow","_this$props$config$da3","bounds","getBoundingClientRect","Number","positionX","clientX","left","positionY","clientY","top","scaledPositionX","scaledPositionY","add","scrollTo","_this$props$config$da4","window","innerWidth","inlineZoomInitClick","inlineZoomImageOnMouseOut","onContainerZoomInit","onMouseOutLensContainer","_this$props$config$da5","onMouseOut","onMouseMoveLensContainer","onMouseOverImageContainer","href","_product$PrimaryImage","PrimaryImageUrl","_this$fullScreenOverl","focus","parentDiv","children","querySelector","removeAttribute","removeContainerZoomStyle","GetEmptyThumbnailItemComponent","_props$context$app$co2","_props$config$thumbna2","Module","Node","Button","_props$callbackToggle2","_props$callbackThumbn2","call","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","Error","prototype","RegistrationId","c","require","$type","da","name","path","runOn","iNM","ns","p","pdp","__bindings__","viewDictionary","cn","module","exports","ReactDOM"],"sourceRoot":""}