{"version":3,"file":"static/js/5f9d26de4c5dfc93ccc7.bundle.js","mappings":"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","sources":["webpack://Dobbies.Commerce/./src/modules/dobbies-media-gallery/dobbies-media-gallery.props.autogenerated.ts?5f17","webpack://Dobbies.Commerce/./src/modules/dobbies-media-gallery/utils/helper.ts?ee30","webpack://Dobbies.Commerce/./src/modules/dobbies-media-gallery/utils/get-valid-product-images.ts?f860","webpack://Dobbies.Commerce/./src/modules/dobbies-media-gallery/dobbies-media-gallery.tsx?c821","webpack://Dobbies.Commerce/./src/modules/dobbies-media-gallery/dobbies-media-gallery.view.tsx?9d8c","webpack://Dobbies.Commerce/./lib/dobbies-media-gallery/module-registration.js?5264","webpack://Dobbies.Commerce/external var \"React\"?0d3b","webpack://Dobbies.Commerce/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 * IDobbiesMediaGallery 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 IDobbiesMediaGalleryConfig 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 IDobbiesMediaGalleryResources {\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 IDobbiesMediaGalleryProps<T> extends Msdyn365.IModule<T> {\r\n    resources: IDobbiesMediaGalleryResources;\r\n    config: IDobbiesMediaGalleryConfig;\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\n/* eslint-disable no-duplicate-imports */\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\n/* eslint-disable no-duplicate-imports */\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<IImageData[]> {\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<IImageData[]> {\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<IImageData[]> {\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<IVideoData | undefined> {\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","/*!\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\n/* eslint-disable no-duplicate-imports */\r\nimport { Carousel, ICarouselProps, Player, IPlayerData, IPlayerOptions, IVideoMetadata } from '@msdyn365-commerce/components';\r\nimport { IImageData, IImageSettings, Image, Video } from '@msdyn365-commerce/core';\r\n// import { MediaLocation, MediaType, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { 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 { IDobbiesMediaGalleryData } from './dobbies-media-gallery.data';\r\nimport { imageSource, imageZoom, IDobbiesMediaGalleryProps, thumbnailsOrientation } from './dobbies-media-gallery.props.autogenerated';\r\nimport { getProductImages, getValidProductImages, getVideoMetadataFromApi, validateProductImages } from './utils';\r\n// import { getAltText, IMediaData } from './utils/helper';\r\nimport { IMediaData } from './utils/helper';\r\n\r\n/**\r\n * IMediaGalleryState Interface.\r\n */\r\nexport interface IMediaGalleryState {\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 IDobbiesMediaGalleryProps<IDobbiesMediaGalleryData> {\r\n    state: IMediaGalleryState;\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 * Props for carousel.\r\n */\r\ninterface IMediaGalleryCarouselItems<ItemType> {\r\n    items: ItemType[];\r\n    keys: (string | undefined)[];\r\n}\r\n\r\n/**\r\n * Media gallery component.\r\n */\r\nclass MediaGallery extends React.Component<IDobbiesMediaGalleryProps<IDobbiesMediaGalleryData>, IMediaGalleryState> {\r\n    private readonly _inlineZoomDivRef: Map<number, HTMLDivElement> = new Map();\r\n\r\n    private readonly fullScreenOverlayButtonRef: React.RefObject<HTMLAnchorElement & HTMLButtonElement> = React.createRef();\r\n    private readonly player: React.RefObject<Player> = React.createRef<Player>();\r\n    private fallbackImage?: string;\r\n    private myGalleryImages: IMediaData[] = [];\r\n    private readonly defaultGalleryImageSettings: IImageSettings = {\r\n        viewports: {\r\n            xs: { q: 'w=767&h=767&m=8', w: 0, h: 0 },\r\n            sm: { q: 'w=600&h=600&m=8', w: 0, h: 0 },\r\n            md: { q: 'w=600&h=772&m=8', w: 0, h: 0 },\r\n            lg: { q: 'h=772&m=8', w: 0, h: 0 }\r\n        },\r\n        lazyload: true,\r\n        cropFocalRegion: true\r\n    };\r\n\r\n    private readonly defaultThumbnailImageSettings: IImageSettings = {\r\n        viewports: {\r\n            xs: { q: 'w=100&m=8', w: 100, h: 0 },\r\n            lg: { q: 'w=100&m=8', w: 100, h: 0 }\r\n        },\r\n        lazyload: true,\r\n        cropFocalRegion: true\r\n    };\r\n\r\n    private sortImages(Images: IImageData[]): IImageData[] {\r\n        return Images.sort(function(a, b) {\r\n            const srcA = a?.src!.toUpperCase(); // ignore upper and lowercase\r\n            const srcB = b?.src!.toUpperCase(); // ignore upper and lowercase\r\n            if (srcA < srcB) {\r\n                return -1;\r\n            }\r\n            if (srcA > srcB) {\r\n                return 1;\r\n            }\r\n            return 0;\r\n        });\r\n    }\r\n\r\n    private hideMasterProductImages(Images: IImageData[], ItemId: string): IImageData[] {\r\n        return Images?.filter(item => {\r\n            const imagePattern = `${ItemId}_000`;\r\n            return !item.src?.includes(imagePattern);\r\n        });\r\n    }\r\n\r\n    private readonly _zoomedImageSettings: IImageSettings;\r\n\r\n    public constructor(props: IDobbiesMediaGalleryProps<IDobbiesMediaGalleryData>) {\r\n        super(props);\r\n        this._toggleModal = this._toggleModal.bind(this);\r\n        // const mediaGalleryImages = this.getImagesData();\r\n        this.state = {\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\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 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<void> {\r\n        const source = this.props.config.imageSource ?? imageSource.pageContext;\r\n        const shouldUpdateOnPartialDimensionSelection = this.props.config.shouldUpdateOnPartialDimensionSelection;\r\n        this._setRenderType();\r\n        if (!this.props.context.request.app?.config?.OmniChannelMedia) {\r\n            if (source === imageSource.pageContext) {\r\n                const imageSettings = this.props.config.thumbnailImageSettings || this.defaultThumbnailImageSettings;\r\n                // if (this.state.mediaGalleryItems === undefined && this.props.data.mediaLocationsForSelectedVariant.result) {\r\n                if (\r\n                    (this.myGalleryImages === undefined || !this.myGalleryImages.length) &&\r\n                    this.props.data.mediaLocationsForSelectedVariant.result\r\n                ) {\r\n                    // const images = await validateProductImages(\r\n                    //     this.props.data.mediaLocationsForSelectedVariant.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                    this.myGalleryImages = await validateProductImages(\r\n                        this.props.data.mediaLocationsForSelectedVariant.result,\r\n                        this.props.context.actionContext,\r\n                        imageSettings\r\n                    );\r\n                    this.myGalleryImages = this.sortImages(this.myGalleryImages);\r\n                } else if ((this.myGalleryImages === undefined || !this.myGalleryImages.length) && 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                    //     this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\r\n                    //     product.productVariant\r\n                    // );\r\n\r\n                    // await this._setImages(images);\r\n                    this.myGalleryImages = await getValidProductImages(\r\n                        this.props.data.product.result.RecordId,\r\n                        +this.props.context.request.apiSettings.channelId,\r\n                        this.props.context.actionContext,\r\n                        imageSettings\r\n                    );\r\n                    this.myGalleryImages = this.sortImages(this.myGalleryImages);\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: IDobbiesMediaGalleryProps<IDobbiesMediaGalleryData>, 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        if (this.myGalleryImages.length <= 0 && this.props.data.mediaLocationsForSelectedVariant?.result) {\r\n            this.myGalleryImages = this.props.data.mediaLocationsForSelectedVariant?.result?.map(mediaLocation => {\r\n                return {\r\n                    src: mediaLocation.Uri || '',\r\n                    altText: mediaLocation.AltText || ''\r\n                };\r\n            });\r\n            this.myGalleryImages = this.sortImages(this.myGalleryImages);\r\n\r\n            const itemId = this.props.data.product.result?.ItemId!;\r\n            const shouldHideMasterImage = this.props.config.shouldHideMasterProductImagesForVariant ?? true;\r\n            if (shouldHideMasterImage) {\r\n                // Currently returned image response is having duplicate image\r\n                // along with non-selected variant and previous selection is not getting cleared. With the help of index we\r\n                // select item from 0 index till it is having non repeating image source name ending with index number.\r\n                // Here we are keeping '.' to make sure that we are considering any digit just before '.' in image source path\r\n                this.myGalleryImages = this.hideMasterProductImages(this.myGalleryImages, itemId);\r\n            }\r\n        }\r\n\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        const viewProps: IMediaGalleryViewProps = {\r\n            ...(this.props as IDobbiesMediaGalleryProps<IDobbiesMediaGalleryData>),\r\n            state: this.state,\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<ICarouselProps>,\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<ISingleSlideCarouselProps>,\r\n                items: mediaGalleryThumbnailCarouselItems.items\r\n            }\r\n        };\r\n\r\n        return this.props.renderView(viewProps) as React.ReactElement;\r\n    }\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.myGalleryImages; // 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.myGalleryImages; //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<IMediaGalleryThumbnailItemViewProps> {\r\n        const mediaGalleryItems = this.myGalleryImages; //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<React.ReactNode> {\r\n        const mediaGalleryItems = this.myGalleryImages; //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<void> {\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            this.myGalleryImages = [...mediaItems, ...curatedImage];\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        this.myGalleryImages = [...mediaToSet, ...curatedImage];\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 (isInPopup || zoomView !== 'fullscreen') {\r\n                return <>{this._renderCarouselItemVideo(media, index, imageSettings)}</>;\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                <Video className='ms-media-gallery__player' editProps={{ key: videoData, requestContext: this.props.context.request }}>\r\n                    <Player\r\n                        ref={this.player}\r\n                        playerData={videoPlayerData}\r\n                        isEditor={this.props.context.request.params.isEditor}\r\n                        playerResources={playerResources}\r\n                        {...attributes}\r\n                    />\r\n                </Video>\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        <Image\r\n            requestContext={this.props.context.actionContext.requestContext}\r\n            className='ms-media-gallery__item'\r\n            {...image}\r\n            fallBackSrc={this.props.context.request.app?.config?.OmniChannelMedia ? '' : index === 0 ? this.fallbackImage : image.src}\r\n            gridSettings={this.props.context.request.gridSettings!}\r\n            imageSettings={imageSettings}\r\n            loadFailureBehavior='hide'\r\n            id={`${this.props.id}__carousel-item__${index}`}\r\n            shouldSkipToMainImage={isInPopup}\r\n            bypassHideOnFailure={index === 0}\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                <Image\r\n                    requestContext={this.props.context.actionContext.requestContext}\r\n                    className='ms-media-gallery__thumbnail'\r\n                    {...image}\r\n                    fallBackSrc={index === 0 ? this.fallbackImage : image.src}\r\n                    gridSettings={this.props.context.request.gridSettings!}\r\n                    imageSettings={imageSettings}\r\n                    loadFailureBehavior='hide'\r\n                    imageFallbackOptimize={this.state.shouldUseOptimizedImage}\r\n                    bypassHideOnFailure={index === 0}\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                <Image\r\n                    requestContext={this.props.context.actionContext.requestContext}\r\n                    className='ms-media-gallery__thumbnail'\r\n                    {...image}\r\n                    fallBackSrc={image.src}\r\n                    gridSettings={this.props.context.request.gridSettings!}\r\n                    imageSettings={imageSettings}\r\n                    loadFailureBehavior='hide'\r\n                    imageFallbackOptimize={this.state.shouldUseOptimizedImage}\r\n                    bypassHideOnFailure={index === 0}\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<HTMLLIElement>) => {\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            <div\r\n                className={`ms-inline-zoom ${this.state.isImageZoomed ? 'zoomed' : ''}`}\r\n                ref={this._refHandler(index)}\r\n                data-scale={this.props.config.dataScale ?? defaultDataScale}\r\n            >\r\n                <Image\r\n                    requestContext={this.props.context.actionContext.requestContext}\r\n                    className='ms-media-gallery__item'\r\n                    {...image}\r\n                    fallBackSrc={index === 0 ? this.fallbackImage : image.src}\r\n                    gridSettings={this.props.context.request.gridSettings!}\r\n                    imageSettings={imageSettings}\r\n                    loadFailureBehavior='hide'\r\n                    onClick={this._onInlineImageClick}\r\n                    onMouseOver={(this.state.isImageZoomed && this._inlineZoomImageOnHover) || undefined}\r\n                    id={`${this.props.id}__carousel-item__${index}`}\r\n                    shouldSkipToMainImage\r\n                    imageFallbackOptimize={this.state.shouldUseOptimizedImage && !this.props.config.allowFullScreen}\r\n                    bypassHideOnFailure={index === 0}\r\n                />\r\n                <Image\r\n                    role='presentation'\r\n                    requestContext={this.props.context.actionContext.requestContext}\r\n                    className='ms-inline-zoom__zoomedImg'\r\n                    {...image}\r\n                    fallBackSrc={index === 0 ? this.fallbackImage : image.src}\r\n                    onClick={this._onImageMouseOut}\r\n                    gridSettings={this.props.context.request.gridSettings!}\r\n                    imageSettings={imageSettings}\r\n                    loadFailureBehavior='hide'\r\n                    id={`${this.props.id}__zoom__${index}`}\r\n                    onMouseMove={(this.state.isImageZoomed && inlineZoomImageOnMouseMove) || undefined}\r\n                    shouldSkipToMainImage\r\n                    imageFallbackOptimize={this.state.shouldUseOptimizedImage && !this.props.config.allowFullScreen}\r\n                    bypassHideOnFailure={index === 0}\r\n                />\r\n            </div>\r\n        );\r\n    }\r\n\r\n    private _inlineZoomImageOnHover(event: React.MouseEvent<HTMLImageElement>): void {\r\n        inlineZoomImageOnHover(event, this.props.config.dataScale ?? String(defaultDataScale));\r\n    }\r\n\r\n    private _handleMobileViewZoomedImageClick(event: React.MouseEvent<HTMLImageElement>) {\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<HTMLImageElement>): 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<HTMLImageElement, 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<HTMLImageElement>): 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<HTMLImageElement>): 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            <div className='ms-containerZoom__container'>\r\n                <div\r\n                    data-scale={this.props.config.dataScale ?? defaultDataScale}\r\n                    className='ms-containerZoom__zoom-lens'\r\n                    role='presentation'\r\n                    onMouseOut={this._onMouseOutLensContainer}\r\n                    onClick={this._onMouseOutLensContainer}\r\n                    onMouseMove={(this.state.isImageZoomed && onMouseMoveLensContainer) || undefined}\r\n                />\r\n                <Image\r\n                    requestContext={this.props.context.actionContext.requestContext}\r\n                    className='ms-media-gallery__item'\r\n                    {...image}\r\n                    fallBackSrc={index === 0 ? this.fallbackImage : image.src}\r\n                    gridSettings={this.props.context.request.gridSettings!}\r\n                    onClick={this._onContainerZoomImageClick}\r\n                    imageSettings={imageSettings}\r\n                    loadFailureBehavior='hide'\r\n                    onMouseOver={(this.state.isImageZoomed && onMouseOverImageContainer) || undefined}\r\n                    id={`${this.props.id}__carousel-item__${index}`}\r\n                    shouldSkipToMainImage\r\n                    imageFallbackOptimize={this.state.shouldUseOptimizedImage && !this.props.config.allowFullScreen}\r\n                    bypassHideOnFailure={index === 0}\r\n                />\r\n            </div>\r\n        );\r\n    }\r\n\r\n    private _renderImageFullScreenOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\r\n        return (\r\n            <div className='ms-fullscreen-section'>\r\n                <Image\r\n                    requestContext={this.props.context.actionContext.requestContext}\r\n                    className='ms-media-gallery__item'\r\n                    {...image}\r\n                    fallBackSrc={index === 0 ? this.fallbackImage : image.src}\r\n                    gridSettings={this.props.context.request.gridSettings!}\r\n                    imageSettings={imageSettings}\r\n                    loadFailureBehavior='hide'\r\n                    imageFallbackOptimize={this.state.shouldUseOptimizedImage}\r\n                    bypassHideOnFailure={index === 0}\r\n                />\r\n                <div className='ms-fullscreen-section__overlay'>\r\n                    {}\r\n                    <a\r\n                        href='javascript:void(0);'\r\n                        title={this.props.resources.fullScreenTitleText}\r\n                        role='button'\r\n                        ref={this.fullScreenOverlayButtonRef}\r\n                        onClick={this.openModalDialog}\r\n                        className='ms-fullscreen-section__magnifying-glass-icon'\r\n                    />\r\n                </div>\r\n            </div>\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            <div className='ms-fullscreen-section'>\r\n                <Image\r\n                    requestContext={this.props.context.actionContext.requestContext}\r\n                    className='ms-fullscreen-section__video'\r\n                    {...image}\r\n                    fallBackSrc={image.src}\r\n                    gridSettings={this.props.context.request.gridSettings!}\r\n                    imageSettings={imageSettings}\r\n                    loadFailureBehavior='hide'\r\n                    imageFallbackOptimize={this.state.shouldUseOptimizedImage}\r\n                    bypassHideOnFailure={index === 0}\r\n                />\r\n                <div className='ms-fullscreen-section__video-overlay'>\r\n                    {}\r\n                    <button\r\n                        title={this.props.resources.fullScreenTitleText}\r\n                        role='button'\r\n                        ref={this.fullScreenOverlayButtonRef}\r\n                        onClick={this.openModalDialog}\r\n                        className='ms-fullscreen-section__video-play-icon'\r\n                    />\r\n                </div>\r\n            </div>\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            <div className='ms-media-gallery__item'>\r\n                <Image\r\n                    requestContext={this.props.context.actionContext.requestContext}\r\n                    className='ms-media-gallery__item__image'\r\n                    src='empty'\r\n                    gridSettings={this.props.context.request.gridSettings!}\r\n                    imageSettings={imageSettings ?? this.defaultGalleryImageSettings}\r\n                    loadFailureBehavior='empty'\r\n                />\r\n            </div>\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                <Image\r\n                    requestContext={this.props.context.actionContext.requestContext}\r\n                    className='ms-media-gallery__thumbnail-item__image'\r\n                    src='empty'\r\n                    gridSettings={this.props.context.request.gridSettings!}\r\n                    imageSettings={imageSettings ?? this.defaultThumbnailImageSettings}\r\n                    loadFailureBehavior='empty'\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.myGalleryImages; // 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.myGalleryImages; // 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<ICarouselProps>;\r\n        const carousel = <Carousel {...carouselprops} />;\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 {\r\n    IMediaGalleryThumbnailItemViewProps,\r\n    IMediaGalleryThumbnailsViewProps,\r\n    IMediaGalleryViewProps\r\n} from '@msdyn365-commerce-modules/media-gallery/src/modules/media-gallery/../..';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { IDobbiesMediaGalleryProps } from './dobbies-media-gallery.props.autogenerated';\r\nimport VsiProductBadges, { badgePageType } from '../../themes/dobbies/utilities/badges/vsi-product-badges';\r\nimport { IDobbiesMediaGalleryData } from './dobbies-media-gallery.data';\r\n\r\nconst MediaGalleryView: React.FC<IMediaGalleryViewProps & IDobbiesMediaGalleryProps<IDobbiesMediaGalleryData>> = props => {\r\n    const { CarouselProps, Thumbnails, MediaGallery, Modal, context } = props;\r\n    let productAvailbilityData;\r\n    if (props.data) {\r\n        productAvailbilityData = props.data.productAvailableQuantity;\r\n    }\r\n    return (\r\n        <Module {...MediaGallery}>\r\n            <Node tag='div' className='position-relative order-one'>\r\n                <Node {...CarouselProps} />\r\n                <VsiProductBadges\r\n                    mediaGalleryProduct={props.data.product.result}\r\n                    context={context}\r\n                    moduleType={badgePageType.pdp}\r\n                    productAvailableData={productAvailbilityData}\r\n                />\r\n            </Node>\r\n            {Modal}\r\n            {_renderThumbnails(Thumbnails)}\r\n        </Module>\r\n    );\r\n};\r\n\r\nconst _renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps): JSX.Element => {\r\n    const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps, items } = thumbnails;\r\n\r\n    return (\r\n        <Node {...ThumbnailsContainerProps}>\r\n            <Node {...SingleSlideCarouselComponentProps}>{items && items.map(_renderThumbnailItem)}</Node>\r\n        </Node>\r\n    );\r\n};\r\n\r\nconst _renderThumbnailItem = (thumbnail: IMediaGalleryThumbnailItemViewProps): JSX.Element => {\r\n    const { ThumbnailItemContainerProps, Picture } = thumbnail;\r\n\r\n    return <Node {...ThumbnailItemContainerProps}>{Picture}</Node>;\r\n};\r\n\r\nexport default MediaGalleryView;\r\n","const binding = { modules: {}, dataActions: {} };\n\n    const registerActionId = (actionPath) => {\n        if (binding.dataActions[actionPath] &&\n            binding.dataActions[actionPath].default &&\n            binding.dataActions[actionPath].default.prototype &&\n            binding.dataActions[actionPath].default.prototype.id) {\n            binding.dataActions[binding.dataActions[actionPath].default.prototype.id] = binding.dataActions[actionPath];\n        } else {\n            Object.keys(binding.dataActions[actionPath] || {}).forEach(exportName => {\n                if (binding.dataActions[actionPath][exportName] &&\n                    binding.dataActions[actionPath][exportName].prototype &&\n                    binding.dataActions[actionPath][exportName].prototype.Action) {\n                    binding.dataActions[binding.dataActions[actionPath][exportName].prototype.id] = binding.dataActions[actionPath][exportName];\n                }\n            })\n        }\n    };\n\n    const registerSanitizedActionPath = (sanitizedActionPath, dataAction) => {\n        if (process.env.NODE_ENV === 'development') {\n            if (!dataAction.default) {\n                throw new Error('Data action path does not have a default export');\n            }\n            if (!(dataAction.default.prototype.id && binding.dataActions[dataAction.default.prototype.id]) || !binding.dataActions[sanitizedActionPath]) {\n                binding.dataActions[sanitizedActionPath] = dataAction;\n            }\n        } else {\n            binding.dataActions[sanitizedActionPath] = dataAction;\n            if (!binding.dataActions[sanitizedActionPath].default) {\n                throw new Error('Data action path ' + sanitizedActionPath + ' does not have a default export');\n            }\n            binding.dataActions[sanitizedActionPath].default.prototype.RegistrationId = sanitizedActionPath;\n            if (binding.dataActions[sanitizedActionPath].default.prototype.id) {\n                binding.dataActions[binding.dataActions[sanitizedActionPath].default.prototype.id] = sanitizedActionPath;\n            }\n        }\n    };\n    \n\n    (binding.modules['dobbies-media-gallery'] = {\n        c: () => require('partner/modules/dobbies-media-gallery/dobbies-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},{name:'productAvailableQuantity',  path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-product-availabilities-for-selected-variant', runOn: 0}],\n        \n        iNM: false,\n        ns: '__local__',\n        n: 'dobbies-media-gallery',\n        p: '__local__',\n        \n        pdp: '',\n        \n        \n        md: 'src/modules/dobbies-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-product-availabilities-for-selected-variant';\n            let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-product-availabilities-for-selected-variant');\n            registerSanitizedActionPath(sanitizedActionPath, dataAction);\n        }\n            \n\n        {\n            const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-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|dobbies-media-gallery|dobbies-media-gallery'] = {\n                c: () => require('partner/modules/dobbies-media-gallery/dobbies-media-gallery.view.tsx'),\n                cn: '__local__-__local__-dobbies-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","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","myGalleryImages","defaultGalleryImageSettings","viewports","xs","q","w","h","sm","md","lg","lazyload","cropFocalRegion","defaultThumbnailImageSettings","onExiting","setState","animating","onExited","next","removeInlineZoomStyle","undefined","isLastItem","nextIndex","state","activeIndex","goToIndex","updateZoomedInImage","previous","images","isFirstItem","length","index","autoplay","currentIndex","mediaItems","_mediaItems","_this$player$current","mediaTypeValue","Video","current","play","_this$player$current2","pause","_renderCarouselItemVideo","mediaData","videoData","_videoData$_links","options","playerResources","resources","videoMetaData","videoId","id","title","duration","playTime","thumbnail","posterframeUrl","_links","binaryReferences","videoBinaryReferences","videoPlayerData","metaData","attributes","className","editProps","key","request","Player","Object","assign","ref","playerData","isEditor","params","_renderEmptyImage","_getCarouselItem","image","_this$props$context$r","isInPopup","arguments","Image","fallBackSrc","fallbackImage","gridSettings","loadFailureBehavior","shouldSkipToMainImage","bypassHideOnFailure","_getThumbnailItem","modifiedActiveIndex","ThumbnailItemContainerProps","tag","classnames","role","tabIndex","onClick","_generateOnThumbnailClick","onKeyDown","_generateOnThumbnailKeyDown","Picture","imageFallbackOptimize","shouldUseOptimizedImage","getVideoThumbNailItem","classes","_refHandler","divRef","set","event","which","KeyCodes","Enter","Space","preventDefault","_renderVideoThumbnail","fullScreenTitleText","openModalDialog","_toggleModal","imageModalSlider","ZoomView","data","product","result","mediaGalleryItems","_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","skipImageValidation","zoomedImageSettings","galleryImageSettings","_onImageMouseOut","_inlineZoomImageOnHover","_onInlineImageClick","_onContainerZoomImageClick","_onMouseOutLensContainer","sortImages","Images","sort","a","b","srcA","toUpperCase","srcB","hideMasterProductImages","ItemId","_item$src","imagePattern","includes","isMobile","variant","VariantType","Viewport","_this$props$config$im","_this$props$context$r2","source","pageContext","shouldUpdateOnPartialDimensionSelection","_setRenderType","thumbnailImageSettings","mediaLocationsForSelectedVariant","_setImages","RecordId","apiSettings","reaction","_product$productVaria","productVariant","_this$props$context$a","_this$props$config$th","_actionContext$reques","isPreview","response","commerceApiRequest","previewImageData","_mediaLocation$Uri","displayOrder","DisplayOrder","MediaTypeValue","_mediaLocation$Uri2","getProductImages","Name","fireImmediately","_this$props$config$th2","shouldComponentUpdate","nextProps","nextState","render","_this$props$data$medi","_this$props$context$a2","isVertical","vertical","isFullscreenAllowed","allowFullScreen","zoomViewMode","inline","container","_this$props$data$medi2","_this$props$data$prod","_this$props$config$sh","itemId","shouldHideMasterProductImagesForVariant","emptyPlaceHolderImage","placeholderImageName","_this$props$context$r3","getFallbackImageUrl","mediaGalleryCarouselItems","_getMediaGalleryItems","mediaGalleryThumbnailCarouselItems","_getMediaGalleryThumbnailItems","viewProps","_objectSpread","moduleProps","Modal","callbackToggle","callbackThumbnailClick","callbackThumbnailKeyDown","CarouselProps","indicatorAriaText","ariaLabelForSlide","keys","Thumbnails","ThumbnailsContainerProps","SingleSlideCarouselComponentProps","SingleSlideCarousel","flipperPrevLabel","flipperNextLabel","parentId","useTabList","JSON","stringify","renderView","ArrayExtensions","hasElements","lastUpdate","defaultKey","_getEmptyThumbnailItem","zoomView","curatedImage","mediaToSet","_filterMasterImageFromVariant","URL","searchParams","get","commerceVideoMetadataRequest","getVideoMetadataFromApi","element","Date","now","media","_renderImageInContainerOnZoom","_renderImageFullScreenOnZoom","_renderImageInlineOnZoom","_this$props$config$sh2","_this$props$data$prod2","_this$props$data$prod3","_this$props$data$prod4","shouldHidePrimaryImages","variantImages","isVariantProduct","ObjectExtensions","isNullOrUndefined","MasterProductId","_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","_renderThumbnails","thumbnails","Node","_renderThumbnailItem","productAvailbilityData","productAvailableQuantity","Module","VsiProductBadges","mediaGalleryProduct","moduleType","badgePageType","pdp","productAvailableData","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","Error","prototype","RegistrationId","c","require","$type","da","name","path","runOn","iNM","ns","n","p","__bindings__","viewDictionary","cn","module","exports","ReactDOM"],"sourceRoot":""}