{"version":3,"file":"static/js/fa2523385612612c8400.bundle.js","mappings":"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","sources":["webpack://bju-press/./src/themes/base/views/custom-components/look-inside.component.tsx?80c8","webpack://bju-press/./src/themes/base/views/media-gallery.view.tsx?c964","webpack://bju-press/./src/utilities/class-name-helper.ts?dd10","webpack://bju-press/./src/utilities/parallel-promises.tsx?b217","webpack://bju-press/./lib/media-gallery/module-registration.js?47e5","webpack://bju-press/./src/modules/media-gallery/utils/helper.ts?b895","webpack://bju-press/./src/modules/media-gallery/utils/get-valid-product-images.ts?a364","webpack://bju-press/./src/modules/media-gallery/media-gallery.tsx?24d7","webpack://bju-press/./src/modules/media-gallery/media-gallery.view.tsx?5061","webpack://bju-press/./src/modules/adventureworks/views/media-gallery.view.tsx?7624","webpack://bju-press/external var \"React\"?0d3b","webpack://bju-press/external var \"ReactDOM\"?853b"],"sourcesContent":["//==============================================================================\r\n// Look Inside\r\n//\r\n// Opens a modal with a select set of book pages that the customer can look\r\n// through before purchasing.\r\n//==============================================================================\r\nimport * as React from 'react';\r\nimport { observable } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport classnames from 'classnames';\r\n\r\nimport { clsHelper } from '../../../../utilities/class-name-helper';\r\nimport { promiseAllN } from '../../../../utilities/parallel-promises';\r\n\r\nimport { sendRequest } from '@msdyn365-commerce/core';\r\nimport { Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\r\n\r\nimport { IMediaGalleryResources } from '../../definition-extensions/media-gallery.ext.props.autogenerated';\r\n\r\n//==============================================================================\r\n// INTERFACES\r\n//==============================================================================\r\nexport interface ILookInsideProps {\r\n resources: IMediaGalleryResources;\r\n imageUrl: string;\r\n productId: string;\r\n productName?: string;\r\n productPrice?: string;\r\n maxCount?: number;\r\n}\r\n\r\ninterface PageConfig {\r\n id: string;\r\n lookupString: string;\r\n title: string;\r\n maxPages: number;\r\n}\r\n\r\ninterface PageConfigIndexed extends PageConfig {\r\n index: number;\r\n}\r\n\r\n//==============================================================================\r\n// CLASS NAME UTILITY\r\n//==============================================================================\r\nconst BASE_CLASS = 'look-inside';\r\nconst cls = (fragment?: string) => clsHelper(BASE_CLASS, fragment);\r\n\r\n//==============================================================================\r\n// CLASS DEFINITION\r\n//==============================================================================\r\n/**\r\n * LookInside component\r\n * @extends {React.Component}\r\n */\r\n//==============================================================================\r\n@observer\r\nclass LookInside extends React.Component {\r\n //==========================================================================\r\n // VARIABLES\r\n //==========================================================================\r\n public lookInsideRef: React.RefObject;\r\n @observable private isOpen: boolean = false;\r\n @observable private pageIndex: number = 0;\r\n private readonly resources: IMediaGalleryResources = this.props.resources;\r\n private readonly lookupStringPrefix: string = '_000';\r\n private readonly lookupStringExt: string = '.jpg';\r\n private readonly pages: PageConfig[] = [\r\n { id: 'frontCover', lookupString: '_f', title: this.resources.lookInside_titleFrontCover, maxPages: 1 },\r\n { id: 'frontFlap', lookupString: '_ff', title: this.resources.lookInside_titleFrontFlap, maxPages: 1 },\r\n { id: 'titlePage', lookupString: '_t', title: this.resources.lookInside_titleTitlePage, maxPages: 1 },\r\n { id: 'copyright', lookupString: '_cp', title: this.resources.lookInside_titleCopyright, maxPages: 2 },\r\n { id: 'tableOfContents', lookupString: '_c', title: this.resources.lookInside_titleTableOfContents, maxPages: 15 },\r\n { id: 'preface', lookupString: '_pp', title: this.resources.lookInside_titlePreface, maxPages: 10 },\r\n { id: 'dedication', lookupString: '_d', title: this.resources.lookInside_titleDedication, maxPages: 1 },\r\n { id: 'introduction', lookupString: '_i', title: this.resources.lookInside_titleIntroduction, maxPages: 25 },\r\n { id: 'lessonPlanOverview', lookupString: '_o', title: this.resources.lookInside_titleLessonPlanOverview, maxPages: 60 },\r\n { id: 'sampleChapter', lookupString: '_p', title: this.resources.lookInside_titleSampleChapter, maxPages: this.props.maxCount || 5 },\r\n { id: 'sample', lookupString: '_s', title: this.resources.lookInside_titleSample, maxPages: this.props.maxCount || 5 },\r\n { id: 'acknowledgements', lookupString: '_a', title: this.resources.lookInside_titleAcknowledgements, maxPages: 3 },\r\n { id: 'backFlap', lookupString: '_bf', title: this.resources.lookInside_titleBackFlap, maxPages: 1 },\r\n { id: 'backCover', lookupString: '_b', title: this.resources.lookInside_titleBackCover, maxPages: 1 },\r\n { id: 'photoCredits', lookupString: '_pc', title: this.resources.lookInside_titlePhotoCredits, maxPages: 10 }\r\n ];\r\n @observable private imageRefs: string[] = [];\r\n private readonly defaultPageStart: number = 1;\r\n private readonly defaultPageLookup: string = `${this.pages[0].lookupString}${String(this.defaultPageStart)}`;\r\n\r\n //==========================================================================\r\n // PUBLIC METHODS\r\n //==========================================================================\r\n //------------------------------------------------------\r\n // Constructor\r\n //------------------------------------------------------\r\n constructor(props: ILookInsideProps) {\r\n super(props);\r\n this.lookInsideRef = React.createRef();\r\n }\r\n\r\n //------------------------------------------------------\r\n // Invoked immediately after component is mounted\r\n //------------------------------------------------------\r\n public async componentDidMount(): Promise {\r\n const { imageUrl, productId } = this.props;\r\n const enableLookInside = await this._checkMainImage(imageUrl, productId, this.defaultPageLookup);\r\n if (enableLookInside) {\r\n this._getImages(imageUrl, productId);\r\n }\r\n }\r\n\r\n //------------------------------------------------------\r\n // Render function\r\n //------------------------------------------------------\r\n public render(): JSX.Element | null {\r\n const { resources, productName, productPrice } = this.props;\r\n const pageConfig = this._createConfig();\r\n const defaultPageIndex = this._findPage(this.defaultPageLookup);\r\n const enableLookInside = !!this.imageRefs.length;\r\n\r\n // Do not return component if default page image does not exist\r\n if (!enableLookInside) {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n\r\n {/* Modal button */}\r\n \r\n\r\n {/* Modal window */}\r\n \r\n \r\n \r\n
\r\n\r\n {/* Sidebar column*/}\r\n
\r\n\r\n {/* Cover image */}\r\n
\r\n {productName}\r\n
\r\n\r\n {/* Product info */}\r\n
\r\n
\r\n {productName}\r\n
\r\n
\r\n {productPrice}\r\n
\r\n
\r\n\r\n {/* Table of contents */}\r\n
\r\n
\r\n {resources.lookInside_headingTableOfContents}\r\n
\r\n
\r\n {pageConfig.map(page => (\r\n \r\n {page.title}\r\n \r\n ))}\r\n
\r\n
\r\n\r\n
\r\n\r\n {/* Content column */}\r\n
\r\n\r\n {/* Page nav */}\r\n
\r\n \r\n {resources.lookInside_pagePrevious}\r\n \r\n \r\n {resources.lookInside_pageNext}\r\n \r\n
\r\n\r\n {/* Page image */}\r\n
\r\n \r\n {productName}\r\n \r\n
\r\n\r\n {/* Copyright text */}\r\n
\r\n {resources.lookInside_copyright}\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 // PRIVATE METHODS\r\n //==========================================================================\r\n //------------------------------------------------------\r\n // Toggle modal\r\n //------------------------------------------------------\r\n private readonly _toggle = (): void => {\r\n this.isOpen = !this.isOpen;\r\n };\r\n\r\n //------------------------------------------------------\r\n // Set page index\r\n //------------------------------------------------------\r\n private readonly _setPageIndex = (index: number) => (): void => {\r\n this.pageIndex = index;\r\n };\r\n\r\n //------------------------------------------------------\r\n // Format lookup string\r\n //------------------------------------------------------\r\n private readonly _formatLookupString = (lookupString: string): string => {\r\n return `${this.lookupStringPrefix}${lookupString}${this.lookupStringExt}`;\r\n };\r\n\r\n //------------------------------------------------------\r\n // Finds page index with provided lookup string\r\n //------------------------------------------------------\r\n private readonly _findPage = (lookupString: string): number => {\r\n return this.imageRefs.findIndex((imageURL: string) => imageURL.includes(lookupString));\r\n };\r\n\r\n //------------------------------------------------------\r\n // Creates filtered page config based on images present\r\n //------------------------------------------------------\r\n private readonly _createConfig = (): PageConfigIndexed[] => {\r\n return this.pages.map(page => ({\r\n ...page,\r\n index: this._findPage(this._formatLookupString(`${page.lookupString}${String(this.defaultPageStart)}`))\r\n })).filter(page => page.index !== -1);\r\n };\r\n\r\n //------------------------------------------------------\r\n // Build image URL\r\n //------------------------------------------------------\r\n private readonly _getImageUrl = (baseImageUrl: string, productId: string, lookupString: string): string => {\r\n return `${baseImageUrl}Products%2F${productId}${this.lookupStringPrefix}${lookupString}${this.lookupStringExt}`\r\n };\r\n\r\n //------------------------------------------------------\r\n // Checks main image before getting the rest of the\r\n // images\r\n //------------------------------------------------------\r\n private readonly _checkMainImage = async (baseImageUrl: string, productId: string, lookupString: string): Promise => {\r\n const imageUrl = this._getImageUrl(baseImageUrl, productId, lookupString);\r\n const imageResponse = await sendRequest(imageUrl, 'get');\r\n if (imageResponse?.status === 200) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n //------------------------------------------------------\r\n // Builds array of images\r\n //------------------------------------------------------\r\n private readonly _getImages = async (baseImageUrl: string, productId: string): Promise => {\r\n const imageUrls: string[] = [];\r\n this.pages.forEach(page => {\r\n for (let i = 1; i <= page.maxPages; i++) {\r\n imageUrls.push(this._getImageUrl(baseImageUrl, productId, `${page.lookupString}${String(i)}`));\r\n }\r\n });\r\n this.pages.map(page => {\r\n this._getImageUrl(baseImageUrl, productId, page.lookupString);\r\n });\r\n const imageQueries: string[] = [];\r\n const imageRequesters: (() => Promise)[] = [];\r\n imageUrls.forEach(ref => {\r\n imageRequesters.push(() => sendRequest(ref, 'get'));\r\n });\r\n\r\n // Make image requests in parallel for improved speed\r\n const imageResponses = await promiseAllN(imageRequesters, 20);\r\n\r\n imageResponses.forEach((imageRequest: any) => {\r\n if (imageRequest?.status === 200) {\r\n imageQueries.push(imageRequest?.config?.url);\r\n }\r\n });\r\n\r\n // Return manual image search\r\n this.imageRefs = imageQueries;\r\n };\r\n}\r\n\r\nexport default LookInside;\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IMediaGalleryThumbnailItemViewProps, IMediaGalleryThumbnailsViewProps, IMediaGalleryViewProps } from '@msdyn365-commerce-modules/media-gallery';\r\n\r\n//----------------------------------------------------------\r\n// @CUSTOM: Added imports for customizations\r\n//----------------------------------------------------------\r\nimport { IMediaGalleryData } from '@msdyn365-commerce-modules/media-gallery';\r\nimport { IMediaGalleryProps } from '../definition-extensions/media-gallery.ext.props.autogenerated';\r\nimport LookInside from './custom-components/look-inside.component';\r\n//----------------------------------------------------------\r\n\r\nconst MediaGalleryView: React.FC> = props => { // @CUSTOM: Added extended definition props\r\n const { CarouselProps, Thumbnails, MediaGallery, Modal, config, context, resources } = props; // @CUSTOM: Added config, context, resources from extended definition props\r\n\r\n //------------------------------------------------------\r\n // @CUSTOM: Variables to pass to LookInside component\r\n //------------------------------------------------------\r\n const product = (MediaGallery.moduleProps.data as IMediaGalleryData).product.result;\r\n const formattedPrice = product && context.cultureFormatter.formatCurrency(product.Price);\r\n //------------------------------------------------------\r\n\r\n return (\r\n \r\n \r\n {Modal}\r\n {_renderThumbnails(Thumbnails)}\r\n {/* @CUSTOM: Render LookInside custom component below if enabled in config */}\r\n {config.enableLookInside && product && product.ItemId &&\r\n \r\n }\r\n \r\n );\r\n};\r\n\r\n// @CUSTOM: Adjusted result type to include null when only one product image or less\r\nconst _renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps): JSX.Element | null => {\r\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps, items } = thumbnails;\r\n\r\n //------------------------------------------------------\r\n // @CUSTOM: If there's only one product image or less,\r\n // do not render thumbnails\r\n //------------------------------------------------------\r\n if (items && items.length <= 1) {\r\n return null;\r\n }\r\n //------------------------------------------------------\r\n\r\n return (\r\n \r\n {items && items.map(_renderThumbnailItem)}\r\n \r\n );\r\n};\r\n\r\nconst _renderThumbnailItem = (thumbnail: IMediaGalleryThumbnailItemViewProps): JSX.Element => {\r\n const { ThumbnailItemContainerProps, Picture } = thumbnail;\r\n\r\n return {Picture};\r\n};\r\n\r\nexport default MediaGalleryView;\r\n","//==============================================================================\r\n// Class Name Helper\r\n//\r\n// Tool to standardize CSS class naming in module components and elements\r\n//==============================================================================\r\n\r\nexport function clsHelper(baseClass: string, fragment?: string, separator: string = '__'): string | undefined {\r\n return fragment ? `${baseClass}${separator}${fragment}` : undefined;\r\n}\r\n","//==============================================================================\r\n// Performs an arbitrary list of actions in parallel, but limits the number\r\n// running concurrently.\r\n//==============================================================================\r\n\r\n//==========================================================\r\n// Performs a list actions, throttling to a maximum\r\n// number of concurrent processes.\r\n//\r\n// Type is the result of a single action\r\n// IN: Array of functions that return a promise\r\n// OUT: A promise that resolves when all actions resolve.\r\n//\r\n// Rejects and stops initiating actions if any action rejects.\r\n//==========================================================\r\nexport function promiseAllN(collection: (() => Promise)[], maxConcurrency: number = 100): Promise {\r\n let index = 0;\r\n let jobsLeft = collection.length;\r\n let rejected = false;\r\n const outcome: any = [];\r\n\r\n const pendingPromise: Promise = new Promise(function (resolve, reject) {\r\n\r\n // Guard clause\r\n if (collection.length === 0) {\r\n return resolve([]);\r\n }\r\n\r\n // Execute the j'th thunk\r\n function runJob(j: number) {\r\n if (!rejected) {\r\n collection[j]().then((result: any) => {\r\n\r\n // If an operation failed, early out. Don't start any more jobs.\r\n if (rejected) { return; }\r\n\r\n outcome[j] = result;\r\n\r\n // If the last job just completed, resolve. We're done!\r\n if (--jobsLeft <= 0) {\r\n resolve(outcome);\r\n }\r\n // We're not done. Are there are jobs that haven't started yet? If so, start one.\r\n else if (index < collection.length) {\r\n runJob(index++);\r\n }\r\n }).catch((e: any) => {\r\n if (rejected) { return; }\r\n\r\n rejected = true; // Let any currently running jobs know to ignore their results\r\n reject(e);\r\n });\r\n }\r\n }\r\n\r\n // Bootstrap, while handling cases where the length of the given array is smaller than maxConcurrent jobs\r\n while (index < Math.min(collection.length, maxConcurrency)) {\r\n\r\n // Added a check to see if a job insta-rejected\r\n if (!rejected) {\r\n runJob(index++);\r\n }\r\n }\r\n });\r\n\r\n return pendingPromise;\r\n}\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['media-gallery'] = {\n c: () => require('@msdyn365-commerce-modules/media-gallery/dist/lib/modules/media-gallery/media-gallery'),\n $type: 'contentModule',\n da: [{name:'mediaLocations', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-media-locations-by-id', runOn: 0},{name:'mediaLocationsForSelectedVariant', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-media-locations-for-selected-variant', runOn: 0},{name:'product', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant', runOn: 0}],\n \n iNM: true,\n ns: '@msdyn365-commerce-modules',\n n: 'media-gallery',\n p: 'media-gallery',\n \n pdp: '',\n \n \n md: 'node_modules/@msdyn365-commerce-modules/media-gallery/dist/lib/modules/media-gallery'\n });\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-media-locations-by-id';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-media-locations-by-id');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-media-locations-for-selected-variant';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-media-locations-for-selected-variant');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n \n window.__bindings__ = window.__bindings__ || {};\n window.__bindings__.modules = {\n ...window.__bindings__.modules || {},\n ...binding.modules\n };\n \n window.__bindings__.dataActions = {\n ...window.__bindings__.dataActions || {},\n ...binding.dataActions\n };\n export const viewDictionary = {};\n viewDictionary['__local__|__local__|themes|base|views|media-gallery'] = {\n c: () => require('partner/themes/base/views/media-gallery.view.tsx'),\n cn: '__local__-__local__-media-gallery'\n };\nviewDictionary['@msdyn365-commerce-modules|media-gallery|modules|media-gallery|media-gallery'] = {\n c: () => require('@msdyn365-commerce-modules/media-gallery/dist/lib/modules/media-gallery/media-gallery.view.js'),\n cn: '@msdyn365-commerce-modules-media-gallery-media-gallery'\n };\nviewDictionary['@msdyn365-commerce-theme|adventureworks-theme-kit|modules|adventureworks|views|media-gallery'] = {\n c: () => require('@msdyn365-commerce-theme/adventureworks-theme-kit/dist/lib/modules/adventureworks/views/media-gallery.view.js'),\n cn: '@msdyn365-commerce-theme-adventureworks-theme-kit-media-gallery'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IRequestContext } from '@msdyn365-commerce/core';\n\n/**\n * Gets correct alt text for image based on configuration of site.\n * @param productName Product name.\n * @param context Current request context.\n * @param imageAltText Alt-text from CMS image.\n */\nexport function getAltText(\n context: IRequestContext,\n shouldUseCmsAltText: boolean,\n productName?: string,\n imageAltText?: string\n): string | undefined {\n if (!context?.app?.config?.OmniChannelMedia) {\n return productName;\n }\n if (shouldUseCmsAltText) {\n return imageAltText;\n }\n return productName;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { commerceApiRequest, getCatalogId, IActionContext, IImageData, IImageSettings } from '@msdyn365-commerce/core';\nimport { MediaLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getMediaLocationsForSelectedVariant, MediaLocationsForSelectedVariantInput } from '@msdyn365-commerce-modules/retail-actions';\nimport { getAltText } from './helper';\n\nasync function validateMediaLocationAsync(mediaLocation: MediaLocation): Promise<[IImageData, boolean]> {\n const imageData: IImageData = {\n src: mediaLocation.Uri || '',\n altText: mediaLocation.AltText || ''\n };\n if (mediaLocation.IsApplicableForChildEntities) {\n imageData.additionalProperties = { isApplicableForChildEntities: 'true' };\n }\n\n if (imageData.src === '') {\n return [imageData, false];\n }\n\n return new Promise<[IImageData, boolean]>(resolve => {\n try {\n const http = new XMLHttpRequest();\n http.open('HEAD', imageData.src!, true);\n\n http.addEventListener('load', () => {\n resolve([imageData, http.status === 200 || http.status === 201]);\n });\n\n http.addEventListener('error', () => {\n resolve([imageData, false]);\n });\n\n http.send();\n } catch {\n resolve([imageData, false]);\n }\n });\n}\n\nexport async function getValidProductImages(\n productId: number,\n channelId: number,\n actionContext: IActionContext,\n imageSettings: IImageSettings,\n selectedProduct?: SimpleProduct\n): Promise {\n const catalogId = getCatalogId(actionContext.requestContext);\n const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\n\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\n .then(mediaLocations => {\n if (mediaLocations) {\n return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocationAsync(mediaLocation))).then(pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n });\n }\n\n return [];\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\n return [];\n });\n}\n\n/**\n * Gets product variant images on dimension change of buy-box module for Omni scenario.\n * @param productId Product record id.\n * @param shouldUseCmsAltText Alt-text source to use.\n * @param channelId Current channel id.\n * @param actionContext Current action context.\n * @param productName Product name.\n * @param selectedProduct Currently selected variant product.\n * @returns List of images.\n */\n\nexport async function getProductImages(\n productId: number,\n shouldUseCmsAltText: boolean,\n channelId: number,\n actionContext: IActionContext,\n productName?: string,\n selectedProduct?: SimpleProduct\n): Promise {\n const catalogId = getCatalogId(actionContext.requestContext);\n if (actionContext.requestContext?.params?.isPreview) {\n const response = await commerceApiRequest(actionContext.requestContext, 'msdyn365-ochannel-product-info', 'post', {\n productId: productId,\n channelId: channelId,\n catalogId: catalogId\n });\n if (response.status !== 200) {\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant for preview scenario');\n return [];\n }\n const previewImageData = response?.data as MediaLocation[];\n if (previewImageData) {\n return previewImageData.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\n additionalProperties: mediaLocation.IsApplicableForChildEntities\n ? {\n isApplicableForChildEntities: 'true'\n }\n : undefined\n };\n });\n }\n return [];\n }\n const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\n .then(mediaLocations => {\n if (mediaLocations) {\n return mediaLocations.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\n additionalProperties: mediaLocation.IsApplicableForChildEntities\n ? {\n isApplicableForChildEntities: 'true'\n }\n : undefined\n };\n });\n }\n return [];\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\n return [];\n });\n}\n\nexport async function validateProductImages(\n mediaLocations: MediaLocation[],\n actionContext: IActionContext,\n imageSettings: IImageSettings\n): Promise {\n return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocationAsync(mediaLocation)))\n .then(pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to validate product images');\n return [];\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Carousel, ICarouselProps } from '@msdyn365-commerce/components';\nimport { IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { MediaLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, getFallbackImageUrl, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n defaultDataScale,\n IComponentNodeProps,\n ImagefullView,\n IModalViewProps,\n IModuleProps,\n inlineZoomImageOnHover,\n inlineZoomImageOnMouseMove,\n inlineZoomImageOnMouseOut,\n inlineZoomInitClick,\n INodeProps,\n ISingleSlideCarouselProps,\n isMobile,\n KeyCodes,\n NodeTag,\n onContainerZoomInit,\n onMouseMoveLensContainer,\n onMouseOutLensContainer,\n onMouseOverImageContainer,\n removeContainerZoomStyle,\n removeInlineZoomStyle,\n SingleSlideCarousel,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport * as React from 'react';\n\nimport { IMediaGalleryData } from './media-gallery.data';\nimport { imageSource, imageZoom, IMediaGalleryProps, thumbnailsOrientation } from './media-gallery.props.autogenerated';\nimport { getProductImages, getValidProductImages, validateProductImages } from './utils';\nimport { getAltText } from './utils/helper';\n\n/**\n * IMediaGalleryState Interface.\n */\nexport interface IMediaGalleryState {\n animating: boolean;\n activeIndex: number;\n isImageZoomed: boolean;\n modalIsOpen: boolean;\n lastUpdate?: number;\n isMobileImageZoomed?: boolean;\n mediaGalleryItems?: IImageData[];\n isInitialLoad?: boolean;\n shouldUseOptimizedImage?: boolean;\n}\n\n/**\n * IMediaGalleryThumbnailsViewProps Interface.\n */\nexport interface IMediaGalleryThumbnailsViewProps {\n ThumbnailsContainerProps: INodeProps;\n SingleSlideCarouselComponentProps: INodeProps;\n items?: IMediaGalleryThumbnailItemViewProps[];\n}\n\n/**\n * IMediaGalleryThumbnailItemViewProps Interface.\n */\nexport interface IMediaGalleryThumbnailItemViewProps {\n ThumbnailItemContainerProps: INodeProps;\n Picture: React.ReactElement;\n}\n\n/**\n * IMediaGalleryViewProps Interface.\n */\nexport interface IMediaGalleryViewProps extends IMediaGalleryProps {\n state: IMediaGalleryState;\n MediaGallery: IModuleProps;\n CarouselProps: INodeProps;\n Thumbnails: IMediaGalleryThumbnailsViewProps;\n Modal?: React.ReactElement | null;\n callbackToggle?(): void;\n callbackThumbnailClick?(index: number): void;\n callbackThumbnailKeyDown?(index: number): void;\n}\n\n/**\n * Props for carousel.\n */\ninterface IMediaGalleryCarouselItems {\n items: ItemType[];\n keys: (string | undefined)[];\n}\n\n/**\n * Media gallery component.\n */\nclass MediaGallery extends React.Component, IMediaGalleryState> {\n private readonly _inlineZoomDivRef: Map = new Map();\n\n private readonly fullScreenOverlayButtonRef: React.RefObject = React.createRef();\n\n private mediaGalleryImages: IImageData[] = [];\n\n private fallbackImage?: string;\n\n private readonly defaultGalleryImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=767&h=767&m=8', w: 0, h: 0 },\n sm: { q: 'w=600&h=600&m=8', w: 0, h: 0 },\n md: { q: 'w=600&h=772&m=8', w: 0, h: 0 },\n lg: { q: 'h=772&m=8', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly defaultThumbnailImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=100&m=8', w: 100, h: 0 },\n lg: { q: 'w=100&m=8', w: 100, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly _zoomedImageSettings: IImageSettings;\n\n public constructor(props: IMediaGalleryProps) {\n super(props);\n this._toggleModal = this._toggleModal.bind(this);\n this.state = {\n activeIndex: 0,\n animating: false,\n isImageZoomed: false,\n modalIsOpen: false,\n isInitialLoad: true,\n shouldUseOptimizedImage: !!this.props.config.skipImageValidation\n };\n\n this._zoomedImageSettings =\n props.config.zoomedImageSettings ?? props.config.galleryImageSettings ?? this.defaultGalleryImageSettings;\n\n this._onImageMouseOut = this._onImageMouseOut.bind(this);\n this._inlineZoomImageOnHover = this._inlineZoomImageOnHover.bind(this);\n this._onInlineImageClick = this._onInlineImageClick.bind(this);\n this._onContainerZoomImageClick = this._onContainerZoomImageClick.bind(this);\n this._onMouseOutLensContainer = this._onMouseOutLensContainer.bind(this);\n }\n\n public isMobile(): boolean {\n const size = isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n return size === 'xs';\n }\n\n public async componentDidMount(): Promise {\n const source = this.props.config.imageSource ?? imageSource.pageContext;\n const shouldUpdateOnPartialDimensionSelection = this.props.config.shouldUpdateOnPartialDimensionSelection;\n this._setRenderType();\n if (!this.props.context.request.app?.config?.OmniChannelMedia) {\n if (source === imageSource.pageContext) {\n if (this.state.mediaGalleryItems === undefined && this.props.data.mediaLocationsForSelectedVariant.result) {\n const images = await validateProductImages(\n this.props.data.mediaLocationsForSelectedVariant.result,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\n );\n this._setImages(images);\n } else if (this.state.mediaGalleryItems === undefined && this.props.data.product.result) {\n const product = this.props.data.product.result;\n const images = await getValidProductImages(\n product.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n product.productVariant\n );\n\n this._setImages(images);\n } else {\n this._setImages([]);\n }\n }\n }\n\n reaction(\n () => {\n const product = this.props.data.product.result;\n if (!product) {\n return null;\n }\n\n if (!shouldUpdateOnPartialDimensionSelection || !product.productVariant?.RecordId) {\n return `${product.RecordId}`;\n }\n\n return `${product.RecordId}-${product.productVariant.RecordId}`;\n },\n async () => {\n const product = this.props.data.product.result;\n let images: IImageData[] = [];\n if (product) {\n if (this.props.context.app?.config?.OmniChannelMedia) {\n images = await getProductImages(\n product.RecordId,\n this.shouldUseCmsAltText(),\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n product.Name,\n shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\n );\n } else {\n images = await getValidProductImages(\n product.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\n );\n }\n this._setImages(images);\n } else {\n this._setImages([]);\n }\n },\n { fireImmediately: true }\n );\n\n if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n const images = await validateProductImages(\n this.props.data.mediaLocations.result,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\n );\n this._setImages(images);\n }\n }\n\n public shouldComponentUpdate(nextProps: IMediaGalleryProps, nextState: IMediaGalleryState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n const { id, config, resources } = this.props;\n\n const { className, showPaginationTooltip } = config;\n\n const isVertical: boolean = config.thumbnailsOrientation === thumbnailsOrientation.vertical;\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- || is required.\n const isFullscreenAllowed: boolean = this.isMobile() || config.allowFullScreen || false;\n const zoomViewMode: string =\n config.imageZoom === imageZoom.inline ? imageZoom.inline : config.imageZoom === imageZoom.container ? imageZoom.container : '';\n const source = this.props.config.imageSource ?? imageSource.pageContext;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n const emptyPlaceHolderImage = this.props.context.app.config?.placeholderImageName as string;\n if (this.props.data.product.result) {\n this.fallbackImage = getFallbackImageUrl(\n this.props.data.product.result.ItemId,\n this.props.context.request.apiSettings,\n this.props.context.request.app?.config?.OmniChannelMedia\n );\n }\n if (emptyPlaceHolderImage && this.fallbackImage) {\n this.fallbackImage = `${this.fallbackImage},${emptyPlaceHolderImage}`;\n }\n if (this.props.config.skipImageValidation && !this.state.mediaGalleryItems && this.state.isInitialLoad) {\n let images: IImageData[] = [];\n let mediaLocations: MediaLocation[] = [];\n if (source === imageSource.pageContext && this.props.data.mediaLocationsForSelectedVariant.result) {\n mediaLocations = this.props.data.mediaLocationsForSelectedVariant.result;\n } else if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n mediaLocations = this.props.data.mediaLocations.result;\n }\n images = mediaLocations.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(\n this.props.context.actionContext.requestContext,\n this.shouldUseCmsAltText(),\n this.props.data.product.result?.Name,\n mediaLocation.AltText\n )\n };\n });\n const curatedImages = this.props.config.images ?? [];\n this.mediaGalleryImages = [...this._filterMasterImageFromVariant(images), ...curatedImages];\n }\n const mediaGalleryCarouselItems = this._getMediaGalleryItems(isFullscreenAllowed, zoomViewMode);\n const mediaGalleryThumbnailCarouselItems = this._getMediaGalleryThumbnailItems();\n const viewProps: IMediaGalleryViewProps = {\n ...(this.props as IMediaGalleryProps),\n state: this.state,\n MediaGallery: {\n moduleProps: this.props,\n className: classnames(`ms-media-gallery ${isVertical ? 'vertical' : ''}`, className)\n },\n Modal: isFullscreenAllowed ? this.imageModalSlider(zoomViewMode) : null,\n callbackToggle: this.openModalDialog,\n callbackThumbnailClick: this._generateOnThumbnailClick,\n callbackThumbnailKeyDown: this._generateOnThumbnailKeyDown,\n CarouselProps: {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items: mediaGalleryCarouselItems.items,\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: showPaginationTooltip === true,\n indicatorAriaText: resources.ariaLabelForSlide,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n key: mediaGalleryCarouselItems.keys\n } as IComponentNodeProps,\n Thumbnails: {\n ThumbnailsContainerProps: { className: 'ms-media-gallery__thumbnails-container' },\n SingleSlideCarouselComponentProps: {\n tag: SingleSlideCarousel,\n className: 'ms-media-gallery__thumbnails',\n vertical: isVertical,\n flipperPrevLabel: resources.previousScreenshotFlipperText,\n flipperNextLabel: resources.nextScreenshotFlipperText,\n parentId: id,\n useTabList: true,\n key: JSON.stringify(mediaGalleryThumbnailCarouselItems.keys)\n } as IComponentNodeProps,\n items: mediaGalleryThumbnailCarouselItems.items\n }\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Zoomed out image on previous/next click.\n */\n public updateZoomedInImage(): void {\n this.setState({ isImageZoomed: false });\n }\n\n private readonly onExiting = () => {\n this.setState({ animating: true });\n };\n\n private readonly onExited = () => {\n this.setState({ animating: false });\n };\n\n /**\n * On click next in carousel.\n */\n private readonly next = (): void => {\n removeInlineZoomStyle();\n if (this.isLastItem() === undefined) {\n return;\n }\n\n const nextIndex = this.isLastItem() ? 0 : this.state.activeIndex + 1;\n this.goToIndex(nextIndex);\n\n this.updateZoomedInImage();\n };\n\n /**\n * On click previous in carousel.\n */\n private readonly previous = (): void => {\n removeInlineZoomStyle();\n const images = this.state.mediaGalleryItems;\n const nextIndex = this.isFirstItem() ? (images ? images.length - 1 : 0) : this.state.activeIndex - 1;\n this.goToIndex(nextIndex);\n this.updateZoomedInImage();\n };\n\n private readonly goToIndex = (index: number): void => {\n this.setState({ activeIndex: index });\n };\n\n private _getMediaGalleryThumbnailItems(): IMediaGalleryCarouselItems {\n const mediaGalleryItems = this.state.mediaGalleryItems ?? this.mediaGalleryImages;\n const thumbnailImageSettings = this.props.config.thumbnailImageSettings;\n if (thumbnailImageSettings) {\n thumbnailImageSettings.cropFocalRegion = true;\n }\n\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\n\n if (!hasMediaGalleryItems) {\n if (this.state.lastUpdate) {\n const defaultKey = 0;\n return {\n items: [this._getEmptyThumbnailItem(thumbnailImageSettings, defaultKey, this.state.activeIndex)],\n keys: ['empty']\n };\n }\n return { items: [], keys: [] };\n }\n\n return {\n items: [\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n ...mediaGalleryItems!.map((item: IImageData, index: number) =>\n this._getThumbnailItem(\n item,\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n index,\n this.state.activeIndex\n )\n )\n ],\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n keys: [...mediaGalleryItems!.map(item => item.src)]\n };\n }\n\n private _getMediaGalleryItems(isFullscreenAllowed: boolean, zoomViewMode: string): IMediaGalleryCarouselItems {\n const mediaGalleryItems = this.state.mediaGalleryItems ?? this.mediaGalleryImages;\n const galleryImageSettings = this.props.config.galleryImageSettings;\n if (galleryImageSettings) {\n galleryImageSettings.cropFocalRegion = true;\n }\n\n const zoomView = isFullscreenAllowed ? 'fullscreen' : zoomViewMode;\n\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\n\n if (!hasMediaGalleryItems) {\n if (this.state.lastUpdate) {\n return { items: [this._renderEmptyImage(galleryImageSettings)], keys: ['empty'] };\n }\n return { items: [], keys: [] };\n }\n\n return {\n items: [\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n ...mediaGalleryItems!.map((item: IImageData, index: number) =>\n this._renderCarouselItemImageView(zoomView, item, galleryImageSettings ?? this.defaultGalleryImageSettings, index)\n )\n ],\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n keys: [...mediaGalleryItems!.map(item => item.src)]\n };\n }\n\n private _setImages(images?: IImageData[]): void {\n const curatedImage = this.props.config.images || [];\n const imagesToSet = this._filterMasterImageFromVariant(images);\n\n this.setState({\n mediaGalleryItems: [...imagesToSet, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now(),\n shouldUseOptimizedImage: false\n });\n }\n\n private _setRenderType(): void {\n this.setState({\n isInitialLoad: false\n });\n }\n\n private _renderCarouselItemImageView(\n zoomView: string,\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n isInPopup: boolean = false\n ): React.ReactNode {\n if (this.isMobile()) {\n if (isInPopup) {\n return this._renderImageInContainerOnZoom(image, this._zoomedImageSettings, index);\n }\n return this._renderImageFullScreenOnZoom(image, imageSettings, index);\n }\n\n switch (zoomView) {\n case 'container': {\n return this._renderImageInContainerOnZoom(image, this._zoomedImageSettings, index);\n }\n case 'inline': {\n return this._renderImageInlineOnZoom(image, this._zoomedImageSettings, index);\n }\n case 'fullscreen': {\n return this._renderImageFullScreenOnZoom(image, imageSettings, index);\n }\n\n // No default\n }\n return <>{this._getCarouselItem(image, imageSettings, index, isInPopup)};\n }\n\n private _filterMasterImageFromVariant(images?: IImageData[]): IImageData[] {\n const shouldHidePrimaryImages = this.props.config.shouldHideMasterProductImagesForVariant ?? true;\n let variantImages = images ?? [];\n const isVariantProduct =\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.MasterProductId) ||\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.productVariant);\n const itemId = this.props.data.product.result?.ItemId;\n if (shouldHidePrimaryImages && isVariantProduct && itemId) {\n variantImages = variantImages.filter(item => {\n const isApplicableForChildEntities = item.additionalProperties?.isApplicableForChildEntities;\n return !isApplicableForChildEntities;\n });\n if (!ArrayExtensions.hasElements(variantImages)) {\n variantImages = images ?? [];\n }\n }\n return variantImages;\n }\n\n private readonly _getCarouselItem = (\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n isInPopup: boolean = false\n ): React.ReactNode => (\n \n );\n\n private readonly _getThumbnailItem = (\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps => {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: index,\n 'aria-label': image.altText,\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\n };\n\n /**\n * Ref Handler.\n * @param index -Remove item click function.\n * @returns Set inline zoom.\n */\n private readonly _refHandler = (index: number) => (divRef: HTMLDivElement) => {\n this._inlineZoomDivRef.set(index, divRef);\n };\n\n private readonly _generateOnThumbnailKeyDown = (index: number) => {\n return (event: React.KeyboardEvent) => {\n if (event.which === KeyCodes.Enter || event.which === KeyCodes.Space) {\n event.preventDefault();\n\n this.goToIndex(index);\n }\n };\n };\n\n private readonly _generateOnThumbnailClick = (index: number) => {\n return (event: React.MouseEvent) => {\n event.preventDefault();\n\n this.goToIndex(index);\n };\n };\n\n private _renderImageInlineOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n \n \n \n \n );\n }\n\n private _inlineZoomImageOnHover(event: React.MouseEvent): void {\n inlineZoomImageOnHover(event, this.props.config.dataScale ?? String(defaultDataScale));\n }\n\n private _handleMobileViewZoomedImageClick(event: React.MouseEvent) {\n const target = this.state.shouldUseOptimizedImage ? (event.target as HTMLImageElement) : event.currentTarget;\n const mobileZoomedInImageClassName = 'msc-mobile-zoomed-in';\n if (!this.state.isMobileImageZoomed) {\n const bounds = target.getBoundingClientRect();\n const dataScale = Number(this.props.config.dataScale ?? defaultDataScale);\n\n const positionX = event.clientX - bounds.left;\n const positionY = event.clientY - bounds.top;\n const scaledPositionX = positionX * dataScale;\n const scaledPositionY = positionY * dataScale;\n\n target.style.transform = `scale(${dataScale})`;\n target.classList.add(mobileZoomedInImageClassName);\n target.parentElement!.style.overflow = 'auto';\n target.parentElement!.scrollTo(scaledPositionX - positionX, scaledPositionY - positionY);\n this.setState({\n isMobileImageZoomed: true\n });\n } else {\n target.style.transform = '';\n target.classList.remove(mobileZoomedInImageClassName);\n target.parentElement!.style.overflow = '';\n this.setState({\n isMobileImageZoomed: false\n });\n }\n }\n\n private _onInlineImageClick(event: React.MouseEvent): void {\n if (window.innerWidth <= 768) {\n // $msv-breakpoint-m\n this._handleMobileViewZoomedImageClick(event);\n return;\n }\n inlineZoomInitClick(event, this.props.config.dataScale ?? String(defaultDataScale));\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onImageMouseOut(event: React.MouseEvent): void {\n inlineZoomImageOnMouseOut(event);\n this.setState({\n isImageZoomed: false\n });\n }\n\n private _onContainerZoomImageClick(event: React.MouseEvent): void {\n if (window.innerWidth <= 768) {\n // $msv-breakpoint-m\n this._handleMobileViewZoomedImageClick(event);\n return;\n }\n\n onContainerZoomInit(event);\n\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onMouseOutLensContainer(event: React.MouseEvent): void {\n onMouseOutLensContainer(event);\n\n this.setState({\n isImageZoomed: false\n });\n }\n\n private _renderImageInContainerOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n
\n \n \n
\n );\n }\n\n private _renderImageFullScreenOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n
\n \n
\n {}\n \n
\n
\n );\n }\n\n private _mapProductToImageData(product: SimpleProduct): IImageData {\n return {\n src: product.PrimaryImageUrl ?? ''\n };\n }\n\n private _renderEmptyImage(imageSettings: IImageSettings | undefined): React.ReactNode {\n return (\n
\n \n
\n );\n }\n\n private _getEmptyThumbnailItem(\n imageSettings: IImageSettings | undefined,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: 'empty',\n 'aria-label': '',\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\n }\n\n private readonly isFirstItem = () => this.state.activeIndex === 0;\n\n private readonly isLastItem = () => {\n const images = this.state.mediaGalleryItems;\n return images && this.state.activeIndex === images.length - 1;\n };\n\n private readonly openModalDialog = (): void => {\n this._toggleModal();\n };\n\n private _toggleModal(): void {\n if (this.state.modalIsOpen) {\n this.fullScreenOverlayButtonRef.current?.focus();\n const parentDiv = this._inlineZoomDivRef.get(this.state.activeIndex);\n if (parentDiv && parentDiv.children && parentDiv.children.length >= 2) {\n const image = parentDiv.children[1].querySelector('img');\n if (image) {\n image.removeAttribute('style');\n }\n }\n this.setState({\n isImageZoomed: false\n });\n }\n this.setState({\n isImageZoomed: false,\n modalIsOpen: !this.state.modalIsOpen\n });\n removeInlineZoomStyle();\n removeContainerZoomStyle();\n }\n\n private readonly imageModalSlider = (ZoomView: string): React.ReactElement => {\n const {\n data: {\n product: { result: product }\n },\n resources\n } = this.props;\n let mediaGalleryItems = this.state.mediaGalleryItems;\n\n if (!mediaGalleryItems && product) {\n mediaGalleryItems = [this._mapProductToImageData(product)];\n }\n const carouselprops = {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items:\n mediaGalleryItems &&\n mediaGalleryItems.map((item: IImageData, index: number) =>\n this._renderCarouselItemImageView(ZoomView, item, this._zoomedImageSettings, index, true)\n ),\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: true,\n hideIndicator: false,\n keyboard: false,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n isDisabledFunctionality: this.state.isMobileImageZoomed\n } as IComponentNodeProps;\n const carousel = ;\n\n const imageModalSliderProps: IModalViewProps = {\n modalIsOpen: this.state.modalIsOpen,\n ontoggle: this._toggleModal,\n galleryCarousel: carousel,\n classNames: classnames('ms-media-gallery__modal', 'msc-modal-input-required')\n };\n return ImagefullView(imageModalSliderProps) as React.ReactElement;\n };\n\n private shouldUseCmsAltText = (): boolean => {\n if (this.props.config.altTextSource === 'product') {\n return false;\n } else {\n return true;\n }\n };\n}\n\nexport default MediaGallery;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IMediaGalleryThumbnailItemViewProps, IMediaGalleryThumbnailsViewProps, IMediaGalleryViewProps } from '../..';\n\nconst MediaGalleryView: React.FC = props => {\n const { CarouselProps, Thumbnails, MediaGallery, Modal } = props;\n\n return (\n \n \n {Modal}\n {_renderThumbnails(Thumbnails)}\n \n );\n};\n\nconst _renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps): JSX.Element => {\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps, items } = thumbnails;\n\n return (\n \n {items && items.map(_renderThumbnailItem)}\n \n );\n};\n\nconst _renderThumbnailItem = (thumbnail: IMediaGalleryThumbnailItemViewProps): JSX.Element => {\n const { ThumbnailItemContainerProps, Picture } = thumbnail;\n\n return {Picture};\n};\n\nexport default MediaGalleryView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport {\n IMediaGalleryThumbnailItemViewProps,\n IMediaGalleryThumbnailsViewProps,\n IMediaGalleryViewProps\n} from '@msdyn365-commerce-modules/media-gallery';\nimport { getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, KeyCodes, Module, Node, NodeTag } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\n\n/**\n * Render the thumbnail item images.\n * @param thumbnail - The carousel thumbnail line props.\n * @returns Return HTML having thumnailcontainer props with image.\n */\nconst renderThumbnailItem = (thumbnail: IMediaGalleryThumbnailItemViewProps): JSX.Element => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\n const { ThumbnailItemContainerProps, Picture } = thumbnail;\n\n return {Picture};\n};\n\n/**\n * Gets the thumbnail item to display media gallery images.\n * @param image - The media gallery images.\n * @param imageSettings - Image settings for the image gallery items.\n * @param imageId - Image id.\n * @param modifiedActiveIndex - Modified Index of the images when selection changes.\n * @param props - The Media gallery view props from business layer.\n * @returns Return thumbnail view props which will be used to render images.\n */\nconst GetThumbnailItemComponent = (\n image: IImageData,\n imageSettings: IImageSettings,\n imageId: number,\n modifiedActiveIndex: number,\n props: IMediaGalleryViewProps\n): IMediaGalleryThumbnailItemViewProps => {\n let fallbackImage: string | undefined = '';\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n const emptyPlaceHolderImage = props.context.app.config?.placeholderImageName as string;\n if (props.data.product.result) {\n fallbackImage = getFallbackImageUrl(\n props.data.product.result.ItemId,\n props.context.request.apiSettings,\n props.context.request.app?.config?.OmniChannelMedia\n );\n }\n if (emptyPlaceHolderImage && fallbackImage) {\n fallbackImage = `${fallbackImage},${emptyPlaceHolderImage}`;\n }\n\n /**\n * OnClick method of media gallery item.\n */\n const onClick = () => {\n props.callbackToggle?.();\n props.callbackThumbnailClick?.(imageId);\n props.state.activeIndex = imageId;\n };\n\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === imageId ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n /**\n * Keydown event of media gallery item.\n * @param event - React.KeyboardEvent.\n */\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.keyCode === KeyCodes.Enter) {\n event.preventDefault();\n onClick();\n }\n };\n const defaultIndex = 0;\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'presentation',\n key: imageId\n },\n Picture: (\n \n \n \n \n \n \n \n \n )\n };\n};\n\n/**\n * Gets the empty thumbnail item to display media gallery images.\n * @param imageSettings - Image settings for the image gallery items.\n * @param props - The Media gallery view props from business layer.\n * @returns Return thumbnail view props which will be used to render empty images.\n */\nconst GetEmptyThumbnailItemComponent = (\n imageSettings: IImageSettings,\n props: IMediaGalleryViewProps\n): IMediaGalleryThumbnailItemViewProps => {\n let fallbackImage: string | undefined = '';\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n const emptyPlaceHolderImage = props.context.app.config?.placeholderImageName as string;\n if (props.data.product.result) {\n fallbackImage = getFallbackImageUrl(\n props.data.product.result.ItemId,\n props.context.request.apiSettings,\n props.context.request.app?.config?.OmniChannelMedia\n );\n }\n if (emptyPlaceHolderImage && fallbackImage) {\n fallbackImage = `${fallbackImage},${emptyPlaceHolderImage}`;\n }\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: 'ms-media-gallery__thumbnail-item',\n role: 'tab',\n tabIndex: 0,\n key: 0,\n 'aria-label': '',\n 'aria-selected': true\n },\n Picture: (\n \n )\n };\n};\n\n/**\n * Update media gallery items method.\n * @param items - The media gallery thumbnail item view props.\n * @returns The IImageData array.\n */\nconst getMediaGalleryItems = (items?: IMediaGalleryThumbnailItemViewProps[]): IImageData[] | undefined => {\n return items?.map(item => {\n return {\n altText: item.Picture.props.altText,\n src: item.Picture.props.src\n };\n });\n};\n\nconst defaultThumbnailImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=295&h=295&q=80&m=6&f=jpg', w: 295, h: 295 },\n xl: { q: 'w=295&h=295&q=80&m=6&f=jpg', w: 295, h: 295 }\n },\n lazyload: true,\n cropFocalRegion: true\n};\n\n/**\n * Render the Media gallery thumbnails to represent images in grid view.\n * @param thumbnails - The thumbnail view props.\n * @param props - The media gallery view props.\n * @returns - The single slide carousel component to render as media gallery image.\n */\nconst renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps, props: IMediaGalleryViewProps): JSX.Element => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps } = thumbnails;\n const { state, Thumbnails } = props;\n const mediaGalleryItems = getMediaGalleryItems(Thumbnails.items);\n\n const items: IMediaGalleryThumbnailItemViewProps[] | undefined =\n // eslint-disable-next-line multiline-ternary -- need multiline for easy code reading\n state.lastUpdate && mediaGalleryItems && mediaGalleryItems[0].src === 'empty'\n ? [GetEmptyThumbnailItemComponent(defaultThumbnailImageSettings, props)]\n : // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery\n mediaGalleryItems?.map((item: IImageData, id: number) =>\n GetThumbnailItemComponent(item, defaultThumbnailImageSettings, id, state.activeIndex, props)\n );\n\n return (\n \n {items?.map(renderThumbnailItem)}\n \n );\n};\n\n/**\n * Render the Media gallery items using viewprops.\n * @param props - The media gallery view props.\n * @returns The media gallery module wrapping up images node.\n */\nconst mediaGalleryView: React.FC = props => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\n const { CarouselProps, Thumbnails, MediaGallery, Modal } = props;\n return (\n \n \n {Modal}\n {renderThumbnails(Thumbnails, props)}\n \n );\n};\n\nexport default mediaGalleryView;\n","module.exports = React;","module.exports = ReactDOM;"],"names":["BASE_CLASS","cls","fragment","clsHelper","LookInside","React","constructor","props","super","isOpen","pageIndex","resources","this","lookupStringPrefix","lookupStringExt","pages","id","lookupString","title","lookInside_titleFrontCover","maxPages","lookInside_titleFrontFlap","lookInside_titleTitlePage","lookInside_titleCopyright","lookInside_titleTableOfContents","lookInside_titlePreface","lookInside_titleDedication","lookInside_titleIntroduction","lookInside_titleLessonPlanOverview","lookInside_titleSampleChapter","maxCount","lookInside_titleSample","lookInside_titleAcknowledgements","lookInside_titleBackFlap","lookInside_titleBackCover","lookInside_titlePhotoCredits","imageRefs","defaultPageStart","defaultPageLookup","String","_toggle","_setPageIndex","index","_formatLookupString","_findPage","findIndex","imageURL","includes","_createConfig","map","page","_objectSpread","filter","_getImageUrl","baseImageUrl","productId","_checkMainImage","async","imageUrl","imageResponse","sendRequest","status","_getImages","imageUrls","forEach","i","push","imageQueries","imageRequesters","ref","promiseAllN","imageRequest","_imageRequest$config","config","url","lookInsideRef","render","productName","productPrice","pageConfig","defaultPageIndex","length","className","onClick","lookInside_button","Modal","autoFocus","fade","returnFocusRef","toggle","horizontalPosition","verticalPosition","ModalHeader","ModalBody","src","alt","lookInside_headingTableOfContents","key","role","classnames","lookInside_pagePrevious","lookInside_pageNext","lookInside_copyright","ModalFooter","__decorate","observable","observer","_renderThumbnails","thumbnails","ThumbnailsContainerProps","SingleSlideCarouselComponentProps","items","Node","Object","assign","_renderThumbnailItem","thumbnail","ThumbnailItemContainerProps","Picture","CarouselProps","Thumbnails","MediaGallery","context","product","moduleProps","data","result","formattedPrice","cultureFormatter","formatCurrency","Price","Module","enableLookInside","ItemId","request","apiSettings","Name","lookInsideMaxPages","baseClass","separator","arguments","undefined","collection","maxConcurrency","jobsLeft","rejected","outcome","pendingPromise","Promise","resolve","reject","runJob","j","then","catch","e","Math","min","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","Error","prototype","RegistrationId","c","require","$type","da","name","path","runOn","iNM","ns","n","p","pdp","md","window","__bindings__","viewDictionary","cn","getAltText","shouldUseCmsAltText","imageAltText","_context$app","app","OmniChannelMedia","validateMediaLocationAsync","mediaLocation","imageData","Uri","altText","AltText","IsApplicableForChildEntities","additionalProperties","isApplicableForChildEntities","http","XMLHttpRequest","open","addEventListener","send","_unused","getValidProductImages","channelId","actionContext","imageSettings","selectedProduct","catalogId","getCatalogId","requestContext","actionInput","MediaLocationsForSelectedVariantInput","getMediaLocationsForSelectedVariant","mediaLocations","all","pairs","pair","error","telemetry","exception","debug","validateProductImages","_this","_ref","_props$config$zoomedI","_inlineZoomDivRef","Map","fullScreenOverlayButtonRef","mediaGalleryImages","defaultGalleryImageSettings","viewports","xs","q","w","h","sm","lg","lazyload","cropFocalRegion","defaultThumbnailImageSettings","onExiting","setState","animating","onExited","next","removeInlineZoomStyle","isLastItem","nextIndex","state","activeIndex","goToIndex","updateZoomedInImage","previous","images","mediaGalleryItems","isFirstItem","_getCarouselItem","image","isInPopup","Image","fallBackSrc","fallbackImage","gridSettings","loadFailureBehavior","shouldSkipToMainImage","bypassHideOnFailure","_getThumbnailItem","modifiedActiveIndex","tag","tabIndex","_generateOnThumbnailClick","onKeyDown","_generateOnThumbnailKeyDown","imageFallbackOptimize","shouldUseOptimizedImage","_refHandler","divRef","set","event","which","KeyCodes","Enter","Space","preventDefault","openModalDialog","_toggleModal","imageModalSlider","ZoomView","_mapProductToImageData","carouselprops","Carousel","item","_renderCarouselItemImageView","_zoomedImageSettings","interval","directionTextPrev","previousScreenshotFlipperText","directionTextNext","nextScreenshotFlipperText","onIndicatorsClickHandler","showPaginationTooltip","hideIndicator","keyboard","handleOnExited","handleOnExiting","isDisabledFunctionality","isMobileImageZoomed","carousel","imageModalSliderProps","modalIsOpen","ontoggle","galleryCarousel","classNames","ImagefullView","altTextSource","bind","isImageZoomed","isInitialLoad","skipImageValidation","zoomedImageSettings","galleryImageSettings","_onImageMouseOut","_inlineZoomImageOnHover","_onInlineImageClick","_onContainerZoomImageClick","_onMouseOutLensContainer","isMobile","variant","VariantType","Viewport","_this$props$config$im","_this$props$context$r","source","imageSource","shouldUpdateOnPartialDimensionSelection","_setRenderType","mediaLocationsForSelectedVariant","_this$props$config$th","thumbnailImageSettings","_setImages","_this$props$config$th2","RecordId","productVariant","reaction","_product$productVaria","_this$props$context$a","_this$props$config$th3","_actionContext$reques","params","isPreview","response","commerceApiRequest","previewImageData","_mediaLocation$Uri","_mediaLocation$Uri2","getProductImages","fireImmediately","_this$props$config$th4","shouldComponentUpdate","nextProps","nextState","_this$props$config$im2","_this$props$context$a2","isVertical","thumbnailsOrientation","isFullscreenAllowed","allowFullScreen","zoomViewMode","imageZoom","emptyPlaceHolderImage","placeholderImageName","_this$props$context$r2","getFallbackImageUrl","_this$props$config$im3","_this$props$data$prod","curatedImages","_filterMasterImageFromVariant","mediaGalleryCarouselItems","_getMediaGalleryItems","mediaGalleryThumbnailCarouselItems","_getMediaGalleryThumbnailItems","viewProps","callbackToggle","callbackThumbnailClick","callbackThumbnailKeyDown","indicatorAriaText","ariaLabelForSlide","keys","SingleSlideCarousel","vertical","flipperPrevLabel","flipperNextLabel","parentId","useTabList","JSON","stringify","renderView","_this$state$mediaGall","ArrayExtensions","hasElements","lastUpdate","defaultKey","_getEmptyThumbnailItem","_this$state$mediaGall2","zoomView","_renderEmptyImage","curatedImage","imagesToSet","Date","now","_renderImageInContainerOnZoom","_renderImageFullScreenOnZoom","_renderImageInlineOnZoom","_this$props$config$sh","_this$props$data$prod2","_this$props$data$prod3","_this$props$data$prod4","shouldHidePrimaryImages","shouldHideMasterProductImagesForVariant","variantImages","isVariantProduct","ObjectExtensions","isNullOrUndefined","MasterProductId","itemId","_item$additionalPrope","_this$props$config$da","dataScale","defaultDataScale","onMouseOver","onMouseMove","inlineZoomImageOnMouseMove","_this$props$config$da2","inlineZoomImageOnHover","_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","innerWidth","inlineZoomInitClick","inlineZoomImageOnMouseOut","onContainerZoomInit","onMouseOutLensContainer","_this$props$config$da5","onMouseOut","onMouseMoveLensContainer","onMouseOverImageContainer","href","fullScreenTitleText","_product$PrimaryImage","PrimaryImageUrl","_this$fullScreenOverl","current","focus","parentDiv","get","children","querySelector","removeAttribute","removeContainerZoomStyle","renderThumbnailItem","GetEmptyThumbnailItemComponent","_props$context$app$co2","_props$config$thumbna2","_props$context$reques2","xl","renderThumbnails","getMediaGalleryItems","GetThumbnailItemComponent","imageId","_props$context$app$co","_props$config$thumbna","_props$context$reques","_props$callbackToggle","_props$callbackThumbn","call","handleKeyDown","keyCode","Button","module","exports","ReactDOM"],"sourceRoot":""}