{"version":3,"file":"static/js/9ab9a50ef120364e1319.bundle.js","mappings":"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","sources":["webpack://Dobbies.Commerce/./src/themes/dobbies/utilities/badges/vsi-product-badges.tsx?c9c2","webpack://Dobbies.Commerce/./src/dotdigital-extension/PopularityDataService.g.ts?e708","webpack://Dobbies.Commerce/./src/dotdigital-extension/PopularityBannerDataAction.g.ts?334d","webpack://Dobbies.Commerce/./src/themes/dobbies/views/media-gallery.view.tsx?34b9","webpack://Dobbies.Commerce/./lib/media-gallery/module-registration.js?47e5","webpack://Dobbies.Commerce/./src/modules/media-gallery/utils/helper.ts?b895","webpack://Dobbies.Commerce/./src/modules/media-gallery/utils/get-valid-product-images.ts?a364","webpack://Dobbies.Commerce/./src/modules/media-gallery/media-gallery.tsx?24d7","webpack://Dobbies.Commerce/./src/modules/media-gallery/media-gallery.view.tsx?5061","webpack://Dobbies.Commerce/./src/modules/adventureworks/views/media-gallery.view.tsx?7624","webpack://Dobbies.Commerce/external var \"React\"?0d3b","webpack://Dobbies.Commerce/external var \"ReactDOM\"?853b"],"sourcesContent":["/**\r\n * Copyright (c) 2020 Visionet Systems, Inc\r\n */\r\nimport {\r\n getPriceForSelectedVariant,\r\n getRatingsSummary,\r\n GetRatingsSummaryInput,\r\n getRnrEndpointId,\r\n getRnrPartnerId,\r\n PriceForSelectedVariantInput\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { IActionContext, IImageData, Image } from '@msdyn365-commerce/core';\r\nimport { AttributeValue, ProductPrice, IContext } from '@msdyn365-commerce/retail-proxy';\r\nimport { getAttributeValuesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport * as React from 'react';\r\nimport { IModuleConfig, IVsiProductBadgesProps } from './vsi-product-badges.props';\r\nimport { vSIInitiateRestCallAsync } from '../../../../dotdigital-extension/PopularityBannerDataAction.g';\r\n\r\nexport enum badgePageType {\r\n plp = 'plp',\r\n pdp = 'pdp'\r\n}\r\n\r\nexport interface IVsiProductBadgeState {\r\n rating: number | undefined;\r\n productPrice: ProductPrice;\r\n productAttributes: AttributeValue[];\r\n badgeDisplay: boolean;\r\n imageBadge: boolean;\r\n showPromotionalBanner: boolean;\r\n showBannerStatus: boolean;\r\n totalProdTransaction: string;\r\n}\r\n\r\n/**\r\n *\r\n * VsiProductBadges Component is used to add badges on products\r\n * @extends {React.PureComponent}\r\n */\r\nclass VsiProductBadges extends React.PureComponent {\r\n constructor(props: IVsiProductBadgesProps) {\r\n super(props);\r\n this.state = {\r\n rating: 0,\r\n productPrice: {},\r\n productAttributes: [],\r\n badgeDisplay: false,\r\n imageBadge: false,\r\n showPromotionalBanner: true,\r\n showBannerStatus: false,\r\n totalProdTransaction: '0'\r\n };\r\n }\r\n\r\n public findBannerData = async () => {\r\n if (!this.props.mediaGalleryProduct?.ItemId) return;\r\n try {\r\n const context: IContext = { callerContext: this.props.context.actionContext };\r\n const res = await vSIInitiateRestCallAsync(\r\n context,\r\n this.props.mediaGalleryProduct?.ItemId,\r\n this.props.context.app.config.popularityBannerHours,\r\n this.props.context.app.config.popularityBannerCompany\r\n );\r\n if (res.result) {\r\n this.setState({\r\n showBannerStatus: res.result?.Status,\r\n totalProdTransaction: res.result?.NoOfTransactions\r\n });\r\n } else {\r\n this.setState({\r\n showBannerStatus: false,\r\n totalProdTransaction: '0'\r\n });\r\n }\r\n } catch (err) {\r\n console.log(err);\r\n }\r\n };\r\n\r\n public componentDidUpdate = async (prevProps: IVsiProductBadgesProps) => {\r\n if (this.props !== prevProps) {\r\n await this.getDataOnUpdate();\r\n }\r\n };\r\n\r\n public componentDidMount = async () => {\r\n if (this.props.mediaGalleryProduct !== undefined || this.props.productComponentProduct !== undefined) {\r\n await this.getDataOnUpdate();\r\n }\r\n this.findBannerData();\r\n };\r\n\r\n public render(): JSX.Element | null {\r\n // badges config from app settings\r\n const appConfig = this.props.context.app.config;\r\n const moduleConfig: IModuleConfig = {\r\n badgeFontColor: appConfig.badgeFontColor,\r\n badgeBackgroundColor: appConfig.badgeBackgroundColor,\r\n badgeFontBold: appConfig.badgeFontBold,\r\n badgeShow: appConfig.badgeShow,\r\n badgeBorderShow: appConfig.badgeBorderShow,\r\n badgeRating: appConfig.badgeRating,\r\n imageBadgeLeftAlign: appConfig.imageBadgeLeftAlign\r\n };\r\n\r\n // return null to if badges are not enabled from config\r\n if (!moduleConfig.badgeShow || (this.props.mediaGalleryProduct === undefined && this.props.productComponentProduct === undefined)) {\r\n return null;\r\n }\r\n\r\n const color = moduleConfig.badgeFontColor || 'black';\r\n const backgroundColor = moduleConfig.badgeBackgroundColor || 'lightgray';\r\n const fontWeight = moduleConfig.badgeFontBold ? 'bold' : 'normal';\r\n const border = moduleConfig.badgeBorderShow ? '1px solid #ababac' : 'none';\r\n const rightfloat = moduleConfig.imageBadgeLeftAlign ? 'right' : 'none';\r\n\r\n const badgeStyle: React.CSSProperties = {\r\n color: color,\r\n backgroundColor: backgroundColor,\r\n border: border,\r\n fontWeight: fontWeight\r\n };\r\n\r\n //Exit Popularity Banner Badge\r\n const exitBadgeStyle: React.CSSProperties = {\r\n display: 'flex',\r\n alignItems: 'flex-end',\r\n justifyContent: 'flex-end',\r\n alignContent: 'flex-end',\r\n marginRight: '10px'\r\n };\r\n\r\n const badgeHeadingStyle: React.CSSProperties = {\r\n display: 'flex',\r\n marginTop: '-10px',\r\n marginLeft: '5px',\r\n fontSize: '12px'\r\n };\r\n\r\n const badgeDescriptionStyle: React.CSSProperties = {\r\n display: 'flex',\r\n marginLeft: '5px',\r\n alignItems: 'flex-start',\r\n justifyContent: 'flex-start',\r\n alignContent: 'flex-start',\r\n marginTop: '5px',\r\n fontSize: '12px',\r\n textAlign: 'left'\r\n };\r\n\r\n const badgeStyleRight: React.CSSProperties = {\r\n color: color,\r\n /* backgroundColor: backgroundColor, */\r\n float: rightfloat\r\n };\r\n\r\n let parentClassName;\r\n const showOutofStock = this._shouldShowOutOfStock();\r\n if (this.state.badgeDisplay && this.state.imageBadge) {\r\n parentClassName = 'both';\r\n } else if (this.state.badgeDisplay && !this.state.imageBadge) {\r\n parentClassName = 'left-badge';\r\n } else if (!this.state.badgeDisplay && this.state.imageBadge) {\r\n parentClassName = 'right-badge';\r\n }\r\n const isImageBadgeInSchedule = this.shouldImageBadgeBeRenderedAsPerSchedule();\r\n const isTextBadgeInSchedule = this.shouldTextBadgeBeRenderedAsPerSchedule();\r\n\r\n return (\r\n
\r\n
\r\n {isTextBadgeInSchedule ? this._renderProductBadge(badgeStyle, showOutofStock) : <>}\r\n
\r\n {this.state.showBannerStatus &&\r\n Number(this.state.totalProdTransaction) >= this.props.context.app.config.popularityBannerThreshold &&\r\n this._renderPromotionalBanner(\r\n badgeStyle,\r\n exitBadgeStyle,\r\n badgeHeadingStyle,\r\n badgeDescriptionStyle,\r\n this.state.showPromotionalBanner,\r\n this.state.totalProdTransaction\r\n )}\r\n {isImageBadgeInSchedule ? this._renderImageBadge(badgeStyleRight, 'BadgeImage') : <>}\r\n
\r\n );\r\n }\r\n private _shouldShowOutOfStock = () => {\r\n const { productAvailableData, moduleType, mediaGalleryProduct, productComponentProduct } = this.props;\r\n //For PDP\r\n if (mediaGalleryProduct || productComponentProduct) {\r\n let recordId: number;\r\n let masterProductId: number | undefined;\r\n let productId: number;\r\n // if request is from Buybox/PDP\r\n if (this.props.moduleType === badgePageType.pdp) {\r\n const product = mediaGalleryProduct;\r\n recordId = product!.RecordId;\r\n masterProductId = product!.MasterProductId;\r\n productId = masterProductId || recordId;\r\n\r\n let attributes;\r\n if (moduleType === badgePageType.plp && this.props.productComponentProduct) {\r\n attributes = this.props.productComponentProduct.AttributeValues;\r\n } else {\r\n attributes = this.state.productAttributes;\r\n }\r\n this.getProductAttrbute(this.props.context.actionContext, productId);\r\n const attName = attributes?.find(onlystore => onlystore.Name === 'OnlyInStore');\r\n console.log('name', attName);\r\n\r\n const AttValue = attName?.TextValue?.toLocaleLowerCase();\r\n console.log('attt', AttValue);\r\n if (AttValue === 'no') {\r\n if (productAvailableData) {\r\n const { result } = productAvailableData;\r\n if (result !== undefined && result.length > 0 && !result[0].IsProductAvailable) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n private _renderImageBadge(badgeStyle: React.CSSProperties, attributeName: string): JSX.Element | null {\r\n const { moduleType } = this.props;\r\n let attributes;\r\n if (moduleType === badgePageType.plp && this.props.productComponentProduct) {\r\n attributes = this.props.productComponentProduct.AttributeValues;\r\n } else {\r\n attributes = this.state.productAttributes;\r\n }\r\n if (attributes && attributes.length > 0) {\r\n const attribute = attributes[attributes.findIndex((x: AttributeValue) => x.Name === attributeName)];\r\n if (attribute !== undefined) {\r\n const attributeValue = attribute.TextValue ? attribute.TextValue : undefined;\r\n const baseImageURL = `${this.props.context.request.apiSettings.baseImageUrl}Products/`;\r\n const badgeImage = attributeValue && attributeValue.trim().toLowerCase();\r\n\r\n if (!badgeImage || (attributeValue && attributeValue.trim().toLowerCase() === 'none')) {\r\n return null;\r\n }\r\n const imageUrl = `${baseImageURL}${badgeImage}`;\r\n const img: IImageData = {\r\n src: imageUrl,\r\n altText: ''\r\n };\r\n\r\n const imageProps = {\r\n gridSettings: this.props.context.request.gridSettings || {},\r\n imageSettings: this.props.imageSettings\r\n };\r\n this.setState({ imageBadge: true });\r\n return (\r\n
\r\n \r\n
\r\n );\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private getDateFromDateString = (dateString : string): Date => {\r\n const dateTimeSplitted = dateString.split(' ');\r\n const startDateMonth = dateTimeSplitted[0].split('/')[1];\r\n const startDateDay = dateTimeSplitted[0].split('/')[0];\r\n const startDateYear = dateTimeSplitted[0].split('/')[2];\r\n const startDateHour = dateTimeSplitted[1].split(':')[0];\r\n const startDateMinutes = dateTimeSplitted[1].split(':')[1];\r\n const GMTStr = dateTimeSplitted[dateTimeSplitted.length - 1].includes('GMT') ? dateTimeSplitted[dateTimeSplitted.length - 1] : '';\r\n const badgeDate = new Date(\r\n `${startDateMonth}-${startDateDay}-${startDateYear} ${startDateHour}:${startDateMinutes}:00 ${GMTStr}`\r\n );\r\n return badgeDate;\r\n }\r\n\r\n private shouldImageBadgeBeRenderedAsPerSchedule = ():boolean => {\r\n const moduleType = this.props.moduleType;\r\n let attributes;\r\n if (moduleType === badgePageType.plp && this.props.productComponentProduct) {\r\n attributes = this.props.productComponentProduct.AttributeValues;\r\n } else {\r\n attributes = this.state.productAttributes;\r\n }\r\n \r\n let startDateAttr = attributes?.find(attr => attr.Name?.toLowerCase() === 'badgestartdate1');\r\n let endDateAttr = attributes?.find(attr => attr.Name?.toLowerCase() === 'badgeenddate1');\r\n if(!startDateAttr || !endDateAttr) {\r\n return true;\r\n }\r\n if(!startDateAttr.TextValue) {\r\n return true;\r\n }\r\n if(!endDateAttr.TextValue) {\r\n return true;\r\n }\r\n try {\r\n const startDate = this.getDateFromDateString(startDateAttr.TextValue.trim());//new Date(startDateAttr.TextValue.trim());\r\n const endDate = this.getDateFromDateString(endDateAttr.TextValue.trim());//new Date(endDateAttr.TextValue.trim());\r\n if(!startDate || !endDate) {\r\n return true;\r\n }\r\n const now = new Date();\r\n if((now.getTime() <= endDate.getTime() && now.getTime() >= startDate.getTime())) {\r\n return true;\r\n }\r\n } catch (e) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n private shouldTextBadgeBeRenderedAsPerSchedule = ():boolean => {\r\n const moduleType = this.props.moduleType;\r\n let attributes;\r\n if (moduleType === badgePageType.plp && this.props.productComponentProduct) {\r\n attributes = this.props.productComponentProduct.AttributeValues;\r\n } else {\r\n attributes = this.state.productAttributes;\r\n }\r\n \r\n let startDateAttr = attributes?.find(attr => attr.Name?.toLowerCase() === 'textbadgestartdate');\r\n let endDateAttr = attributes?.find(attr => attr.Name?.toLowerCase() === 'textbadgeenddate');\r\n if(!startDateAttr || !endDateAttr) {\r\n return true;\r\n }\r\n if(!startDateAttr.TextValue) {\r\n return true;\r\n }\r\n if(!endDateAttr.TextValue) {\r\n return true;\r\n }\r\n try {\r\n const startDate = this.getDateFromDateString(startDateAttr.TextValue.trim());//new Date(startDateAttr.TextValue.trim());\r\n const endDate = this.getDateFromDateString(endDateAttr.TextValue.trim());//new Date(endDateAttr.TextValue.trim());\r\n if(!startDate || !endDate) {\r\n return true;\r\n }\r\n const now = new Date();\r\n if((now.getTime() <= endDate.getTime() && now.getTime() >= startDate.getTime())) {\r\n return true;\r\n }\r\n } catch (e) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n private _renderDiscountBadgePercentage(badgeStyle: React.CSSProperties): JSX.Element | null {\r\n const { moduleType } = this.props;\r\n const price = this.state.productPrice;\r\n if (price) {\r\n const { BasePrice, CustomerContextualPrice } = price;\r\n let discount = 0;\r\n if (BasePrice && CustomerContextualPrice && BasePrice > CustomerContextualPrice) {\r\n const actualPercentage = Math.round((CustomerContextualPrice / BasePrice) * 100);\r\n discount = 100 - actualPercentage;\r\n }\r\n\r\n if (discount > 0) {\r\n this.setState({ badgeDisplay: true });\r\n return (\r\n
\r\n {`-${discount}%`}\r\n
\r\n );\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private _renderRatingBadge(badgeStyle: React.CSSProperties): JSX.Element | null {\r\n const { moduleType, context } = this.props;\r\n const rating = this.state.rating;\r\n const topRating = context.app.config.badgeRating;\r\n if (rating && rating >= topRating) {\r\n this.setState({ badgeDisplay: true });\r\n let badgeRating = context.app.config.badgeRatingText;\r\n if (this.props.context.app.config.textBadgesCharacterLimit && badgeRating && badgeRating.length > this.props.context.app.config.textBadgesCharacterLimit) {\r\n // badgeRating = `${badgeRating.substring(0, this.props.context.app.config.textBadgesCharacterLimit)}`;\r\n return <>;\r\n }\r\n return (\r\n
\r\n {`${badgeRating}`}\r\n
\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private _renderOutofStockBadge(badgeStyle: React.CSSProperties): JSX.Element | null {\r\n const { moduleType } = this.props;\r\n this.setState({ badgeDisplay: true });\r\n return (\r\n
\r\n {`Out of stock`}\r\n
\r\n );\r\n }\r\n\r\n //Render Promotional Badge\r\n private _renderPromotionalBanner(\r\n badgeStyle: React.CSSProperties,\r\n exitBadgeStyle: React.CSSProperties,\r\n badgeHeadingStyle: React.CSSProperties,\r\n badgeDescriptionStyle: React.CSSProperties,\r\n showPromotionalBanner: boolean,\r\n totalProdTransaction: string\r\n ): JSX.Element | null {\r\n const { moduleType } = this.props;\r\n const _displayPromotionalBanner = () => {\r\n this.setState({\r\n showPromotionalBanner: false\r\n });\r\n };\r\n\r\n if (moduleType === badgePageType.pdp && showPromotionalBanner) {\r\n return (\r\n
\r\n

\r\n

\r\n

Trending

\r\n

\r\n {totalProdTransaction} people bought this within the past {this.props.context.app.config.popularityBannerHours}{' '}\r\n hours\r\n

\r\n
\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n // Render discountAmount badge\r\n private _renderDiscountBadgeAmount(badgeStyle: React.CSSProperties): JSX.Element | null {\r\n const { moduleType } = this.props;\r\n const price = this.state.productPrice;\r\n if (price) {\r\n const { BasePrice, CustomerContextualPrice } = price;\r\n let discount = 0;\r\n if (BasePrice && CustomerContextualPrice && BasePrice > CustomerContextualPrice) {\r\n discount = Number((BasePrice - CustomerContextualPrice).toFixed(2));\r\n }\r\n if (discount > 0) {\r\n // format price\r\n const discountWithCurrenceySign = discount && this.props.context.cultureFormatter.formatCurrency(discount.toString(), this.props.context.request.channel?.Currency);\r\n this.setState({ badgeDisplay: true });\r\n return (\r\n
\r\n {`${discountWithCurrenceySign} OFF`}\r\n
\r\n );\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n // Render custom badge\r\n private _renderCustomAttributeBadge(badgeStyle: React.CSSProperties, attributeName: string): JSX.Element | null {\r\n const { moduleType } = this.props;\r\n let attributes;\r\n if (moduleType === badgePageType.plp && this.props.productComponentProduct) {\r\n attributes = this.props.productComponentProduct.AttributeValues;\r\n } else {\r\n attributes = this.state.productAttributes;\r\n }\r\n if (attributes && attributes.length > 0) {\r\n const attribute = attributes[attributes.findIndex((x: AttributeValue) => x.Name === attributeName)];\r\n if (attribute !== undefined) {\r\n // const brandValue = attrbute && attrbute.TextValue ? attrbute.TextValue : 'SizeNotDefined';\r\n let attributeValue = attribute.TextValue ? attribute.TextValue : '';\r\n if (attributeValue.length > 0) {\r\n this.setState({ badgeDisplay: true });\r\n if (this.props.context.app.config.textBadgesCharacterLimit && attributeValue && attributeValue.length > this.props.context.app.config.textBadgesCharacterLimit) {\r\n //attributeValue = `${attributeValue.substring(0, this.props.context.app.config.textBadgesCharacterLimit)}`;\r\n return <>;\r\n }\r\n return (\r\n
\r\n {attributeValue}\r\n
\r\n );\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private renderDefaultBadge = (badgeStyle: React.CSSProperties) => {\r\n const { moduleType, productComponentProduct } = this.props;\r\n let badgeText = productComponentProduct?.discount;\r\n if (this.props.context.app.config.textBadgesCharacterLimit && badgeText && badgeText.length > this.props.context.app.config.textBadgesCharacterLimit) {\r\n //badgeText = `${badgeText.substring(0, this.props.context.app.config.textBadgesCharacterLimit)}`;\r\n return <>;\r\n }\r\n return (\r\n
\r\n {badgeText}\r\n
\r\n );\r\n };\r\n\r\n private _renderProductBadge(badgeStyle: React.CSSProperties, showOutofStock: boolean): JSX.Element | null {\r\n const { moduleType, context } = this.props;\r\n const badgeShow = context.app.config.badgeShow;\r\n let attributes;\r\n if (moduleType === badgePageType.plp && this.props.productComponentProduct) {\r\n attributes = this.props.productComponentProduct.AttributeValues;\r\n } else {\r\n attributes = this.state.productAttributes;\r\n }\r\n if (showOutofStock && badgeShow) {\r\n return this._renderOutofStockBadge(badgeStyle);\r\n }\r\n if (this.props.productComponentProduct?.discount) {\r\n return this.renderDefaultBadge(badgeStyle);\r\n }\r\n let attributeValue;\r\n if (attributes && attributes.length > 0) {\r\n const attribute =\r\n attributes[\r\n attributes.findIndex((x: AttributeValue) => {\r\n const name = x.Name && x.Name.toLowerCase();\r\n return name === 'badgetype';\r\n })\r\n ];\r\n if (attribute !== undefined) {\r\n attributeValue = attribute.TextValue ? attribute.TextValue : undefined;\r\n const BadgeType = attributeValue;\r\n\r\n if (badgeShow === true && BadgeType !== undefined) {\r\n if (BadgeType === 'DiscountAmount') {\r\n return this._renderDiscountBadgeAmount(badgeStyle);\r\n } else if (BadgeType === 'DiscountPercentage') {\r\n return this._renderDiscountBadgePercentage(badgeStyle);\r\n } else if (BadgeType === 'Rating') {\r\n return this._renderRatingBadge(badgeStyle);\r\n } else if (BadgeType === 'BadgeText' && BadgeType !== undefined) {\r\n return this._renderCustomAttributeBadge(badgeStyle, BadgeType);\r\n } else {\r\n return null;\r\n }\r\n } else {\r\n return null;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private getDataOnUpdate = async () => {\r\n const { mediaGalleryProduct, productComponentProduct, context } = this.props;\r\n\r\n if (mediaGalleryProduct || productComponentProduct) {\r\n let recordId: number;\r\n let masterProductId: number | undefined;\r\n let productId: number;\r\n // if request is from Buybox/PDP\r\n if (this.props.moduleType === badgePageType.pdp) {\r\n const product = mediaGalleryProduct;\r\n recordId = product!.RecordId;\r\n masterProductId = product!.MasterProductId;\r\n productId = masterProductId || recordId;\r\n // Get product rating\r\n const ratingInput = new GetRatingsSummaryInput(\r\n productId.toString(),\r\n getRnrPartnerId(context.actionContext),\r\n getRnrEndpointId(context.actionContext)\r\n );\r\n const ratings = await getRatingsSummary(ratingInput, context.actionContext);\r\n const ratingValue = ratings ? ratings.averageRating : 0;\r\n this.setState({ rating: ratingValue });\r\n // Get product pricing\r\n const priceInput = new PriceForSelectedVariantInput(\r\n productId,\r\n context.request.apiSettings.channelId,\r\n product,\r\n context.actionContext.requestContext.user.customerAccountNumber\r\n );\r\n // Run and await the result of the data action\r\n const productPriceResult = await getPriceForSelectedVariant(priceInput, context.actionContext);\r\n const price: ProductPrice = {\r\n // BasePrice value has been set based on higher price value among these ↓.\r\n BasePrice: Math.max(\r\n productPriceResult?.BasePrice || 0,\r\n productPriceResult?.TradeAgreementPrice || 0,\r\n productPriceResult?.AdjustedPrice || 0\r\n ),\r\n AdjustedPrice: product!.Price || 0,\r\n CustomerContextualPrice: productPriceResult!.CustomerContextualPrice || 0\r\n };\r\n this.setState({ productPrice: price });\r\n // tslint:disable-next-line: no-floating-promises\r\n this.getProductAttrbute(context.actionContext, productId);\r\n } else if (this.props.moduleType === badgePageType.plp) {\r\n const product = productComponentProduct;\r\n const price: ProductPrice = {\r\n BasePrice: (product && product.BasePrice) || 0,\r\n AdjustedPrice: (product && product.Price) || 0,\r\n CustomerContextualPrice: (product && product.Price) || 0\r\n };\r\n this.setState({ rating: productComponentProduct ? productComponentProduct.AverageRating : 0 });\r\n this.setState({ productPrice: price });\r\n // tslint:disable-next-line: no-floating-promises\r\n // this.getProductAttrbute(context.actionContext, product!.RecordId);\r\n }\r\n }\r\n };\r\n\r\n private getProductAttrbute = async (callerContext: IActionContext, productId: number) => {\r\n const productAttributeResult = await getAttributeValuesAsync(\r\n { callerContext, queryResultSettings: {} },\r\n productId,\r\n callerContext.requestContext.apiSettings.channelId,\r\n callerContext.requestContext.apiSettings.catalogId\r\n );\r\n this.setState({ productAttributes: productAttributeResult });\r\n };\r\n}\r\n\r\nexport default VsiProductBadges;\r\n","// tslint:disable\r\n/* eslint-disable security/detect-object-injection */\r\nimport * as EntityClasses from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceModels.g';\r\nimport * as Entities from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\n\r\n/**\r\n * VSIRestAPIHandler entity interface.\r\n */\r\nexport interface IVSIRestAPIHandler {\r\n Id: number;\r\n result?: {\r\n Status: boolean;\r\n NoOfTransactions: string;\r\n };\r\n ExtensionProperties?: Entities.CommerceProperty[];\r\n}\r\n\r\n/**\r\n * VSIRestAPIHandler entity class.\r\n */\r\nexport class VSIRestAPIHandlerExtensionClass implements IVSIRestAPIHandler {\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public Id: number;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public result: Object;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n public ExtensionProperties: Entities.CommerceProperty[];\r\n\r\n // Navigation properties names\r\n\r\n /**\r\n * Construct an object from odata response.\r\n * @param {any} odataObject The odata result object.\r\n */\r\n constructor(odataObject?: any) {\r\n odataObject = odataObject || {};\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.Id = odataObject.Id;\r\n\r\n var newObj = {\r\n Status: odataObject.Status,\r\n NoOfTransactions: odataObject.NoOfTransactions\r\n };\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n // this.result = odataObject.result;\r\n this.result = newObj;\r\n\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.ExtensionProperties = undefined;\r\n if (odataObject.ExtensionProperties) {\r\n this.ExtensionProperties = [];\r\n for (var i = 0; i < odataObject.ExtensionProperties.length; i++) {\r\n if (odataObject.ExtensionProperties[i]) {\r\n if (odataObject.ExtensionProperties[i]['@odata.type']) {\r\n var className: string = odataObject.ExtensionProperties[i]['@odata.type'];\r\n className = className.substr(className.lastIndexOf('.') + 1).concat('Class');\r\n if (EntityClasses[className]) {\r\n this.ExtensionProperties[i] = new EntityClasses[className](odataObject.ExtensionProperties[i]);\r\n }\r\n } else {\r\n this.ExtensionProperties[i] = new EntityClasses.CommercePropertyClass(odataObject.ExtensionProperties[i]);\r\n }\r\n } else {\r\n // @ts-ignore - TODO bug fix #23427261 - remove ts-ignore - https://microsoft.visualstudio.com/DefaultCollection/OSGS/_workitems/edit/23427261/\r\n this.ExtensionProperties[i] = undefined;\r\n }\r\n }\r\n }\r\n }\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 * THIS FILE IS AN AUTOGENERATED TYPESCRIPT PROXY EXTENSION.\r\n * TO USE THIS FILE, IT MUST BE ADDED TO A D365COMMERCE APPLICATION\r\n */\r\n// tslint:disable\r\nimport { AsyncResult, callActionOrExecute, DataServiceQuery, IContext, IDataServiceRequest } from '@msdyn365-commerce/retail-proxy';\r\n// @ts-ignore\r\nimport * as EntityClasses from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceModels.g';\r\nimport * as DataServiceEntities from './PopularityDataService.g';\r\n\r\n// @ts-ignore\r\nfunction vSIGetAPIResponseQuery(id?: number): DataServiceQuery {\r\n const key = id ? { Id: id } : null;\r\n return new DataServiceQuery('VSIGetRestAPIResponse', 'VSIRestAPIHandler', DataServiceEntities.VSIRestAPIHandlerExtensionClass, key);\r\n}\r\n\r\nexport function createVSIInitiateRestCallInput(ItemID: string, NoOfHours: string, Company: string): IDataServiceRequest {\r\n const query = vSIGetAPIResponseQuery();\r\n return query.createDataServiceRequestForOperation(\r\n 'VSI_GetNoOfTransactions',\r\n true,\r\n DataServiceEntities.VSIRestAPIHandlerExtensionClass,\r\n 'false',\r\n { bypassCache: 'get', returnEntity: 'DataServiceEntities.IVSIRestAPIHandler' },\r\n { ItemID: ItemID, NoOfHours: NoOfHours, Company: Company }\r\n );\r\n}\r\n\r\nexport function vSIInitiateRestCallAsync(\r\n context: IContext,\r\n ItemID: string,\r\n NoOfHours: string,\r\n Company: string\r\n): AsyncResult {\r\n const request = createVSIInitiateRestCallInput(ItemID, NoOfHours, Company);\r\n return callActionOrExecute(request, context.callerContext);\r\n}\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 { IMediaGalleryProps } from '../definition-extensions/media-gallery.ext.props.autogenerated';\r\nimport VsiProductBadges, { badgePageType } from '../utilities/badges/vsi-product-badges';\r\nimport { IMediaGalleryData } from './media-gallery.data';\r\n\r\nconst MediaGalleryView: React.FC> = 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 \r\n \r\n \r\n \r\n \r\n {Modal}\r\n {_renderThumbnails(Thumbnails)}\r\n \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 \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","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|dobbies|views|media-gallery'] = {\n c: () => require('partner/themes/dobbies/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(this.props.data.product.result.ItemId, this.props.context.request.apiSettings);\n }\n if (emptyPlaceHolderImage && this.fallbackImage) {\n this.fallbackImage = `${this.fallbackImage},${emptyPlaceHolderImage}`;\n }\n if (this.props.config.skipImageValidation && !this.state.mediaGalleryItems && this.state.isInitialLoad) {\n let images: IImageData[] = [];\n let mediaLocations: MediaLocation[] = [];\n if (source === imageSource.pageContext && this.props.data.mediaLocationsForSelectedVariant.result) {\n mediaLocations = this.props.data.mediaLocationsForSelectedVariant.result;\n } else if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n mediaLocations = this.props.data.mediaLocations.result;\n }\n images = mediaLocations.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: 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(props.data.product.result.ItemId, props.context.request.apiSettings);\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(props.data.product.result.ItemId, props.context.request.apiSettings);\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":["badgePageType","VSIRestAPIHandlerExtensionClass","constructor","odataObject","this","Id","newObj","Status","NoOfTransactions","result","ExtensionProperties","undefined","i","length","className","substr","lastIndexOf","concat","EntityClasses","createVSIInitiateRestCallInput","ItemID","NoOfHours","Company","id","key","DataServiceQuery","DataServiceEntities","vSIGetAPIResponseQuery","createDataServiceRequestForOperation","bypassCache","returnEntity","VsiProductBadges","React","props","super","findBannerData","async","_this$props$mediaGall","mediaGalleryProduct","ItemId","_this$props$mediaGall2","context","callerContext","actionContext","res","request","callActionOrExecute","vSIInitiateRestCallAsync","app","config","popularityBannerHours","popularityBannerCompany","_res$result","_res$result2","setState","showBannerStatus","totalProdTransaction","err","console","log","componentDidUpdate","prevProps","getDataOnUpdate","componentDidMount","productComponentProduct","_shouldShowOutOfStock","productAvailableData","moduleType","recordId","masterProductId","productId","pdp","_attributes","_attName$TextValue","product","attributes","RecordId","MasterProductId","plp","AttributeValues","state","productAttributes","getProductAttrbute","attName","find","onlystore","Name","AttValue","TextValue","toLocaleLowerCase","IsProductAvailable","getDateFromDateString","dateString","dateTimeSplitted","split","startDateMonth","startDateDay","startDateYear","startDateHour","startDateMinutes","GMTStr","includes","Date","shouldImageBadgeBeRenderedAsPerSchedule","_attributes2","_attributes3","startDateAttr","attr","_attr$Name","toLowerCase","endDateAttr","_attr$Name2","startDate","trim","endDate","now","getTime","e","shouldTextBadgeBeRenderedAsPerSchedule","_attributes4","_attributes5","_attr$Name3","_attr$Name4","renderDefaultBadge","badgeStyle","badgeText","discount","textBadgesCharacterLimit","style","ratingInput","GetRatingsSummaryInput","toString","getRnrPartnerId","getRnrEndpointId","ratings","getRatingsSummary","ratingValue","averageRating","rating","priceInput","PriceForSelectedVariantInput","apiSettings","channelId","requestContext","user","customerAccountNumber","productPriceResult","getPriceForSelectedVariant","price","BasePrice","Math","max","TradeAgreementPrice","AdjustedPrice","Price","CustomerContextualPrice","productPrice","AverageRating","productAttributeResult","getAttributeValuesAsync","queryResultSettings","catalogId","badgeDisplay","imageBadge","showPromotionalBanner","render","appConfig","moduleConfig","badgeFontColor","badgeBackgroundColor","badgeFontBold","badgeShow","badgeBorderShow","badgeRating","imageBadgeLeftAlign","color","backgroundColor","border","fontWeight","badgeStyleRight","float","parentClassName","showOutofStock","isImageBadgeInSchedule","isTextBadgeInSchedule","_renderProductBadge","Number","popularityBannerThreshold","_renderPromotionalBanner","display","alignItems","justifyContent","alignContent","marginRight","marginTop","marginLeft","fontSize","textAlign","_renderImageBadge","attributeName","attribute","findIndex","x","attributeValue","baseImageURL","baseImageUrl","badgeImage","img","src","altText","imageProps","gridSettings","imageSettings","Image","Object","assign","loadFailureBehavior","_renderDiscountBadgePercentage","round","_renderRatingBadge","topRating","badgeRatingText","_renderOutofStockBadge","exitBadgeStyle","badgeHeadingStyle","badgeDescriptionStyle","_displayPromotionalBanner","onClick","_renderDiscountBadgeAmount","toFixed","_this$props$context$r","discountWithCurrenceySign","cultureFormatter","formatCurrency","channel","Currency","_renderCustomAttributeBadge","_this$props$productCo","BadgeType","_renderThumbnails","thumbnails","ThumbnailsContainerProps","SingleSlideCarouselComponentProps","items","Node","map","_renderThumbnailItem","thumbnail","ThumbnailItemContainerProps","Picture","CarouselProps","Thumbnails","MediaGallery","Modal","productAvailbilityData","data","productAvailableQuantity","Module","tag","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","Error","prototype","RegistrationId","c","require","$type","da","name","path","runOn","iNM","ns","n","p","md","window","__bindings__","_objectSpread","viewDictionary","cn","getAltText","shouldUseCmsAltText","productName","imageAltText","_context$app","OmniChannelMedia","validateMediaLocationAsync","mediaLocation","imageData","Uri","AltText","IsApplicableForChildEntities","additionalProperties","isApplicableForChildEntities","Promise","resolve","http","XMLHttpRequest","open","addEventListener","status","send","_unused","getValidProductImages","selectedProduct","getCatalogId","actionInput","MediaLocationsForSelectedVariantInput","getMediaLocationsForSelectedVariant","then","mediaLocations","all","pairs","filter","pair","catch","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","animating","onExited","next","removeInlineZoomStyle","isLastItem","nextIndex","activeIndex","goToIndex","updateZoomedInImage","previous","images","mediaGalleryItems","isFirstItem","index","_getCarouselItem","image","isInPopup","arguments","fallBackSrc","fallbackImage","shouldSkipToMainImage","bypassHideOnFailure","_getThumbnailItem","modifiedActiveIndex","classnames","role","tabIndex","_generateOnThumbnailClick","onKeyDown","_generateOnThumbnailKeyDown","imageFallbackOptimize","shouldUseOptimizedImage","_refHandler","divRef","set","event","which","KeyCodes","Enter","Space","preventDefault","openModalDialog","_toggleModal","imageModalSlider","ZoomView","resources","_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","source","imageSource","shouldUpdateOnPartialDimensionSelection","_setRenderType","mediaLocationsForSelectedVariant","_this$props$config$th","thumbnailImageSettings","_setImages","_this$props$config$th2","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","getFallbackImageUrl","_this$props$config$im3","_this$props$data$prod","curatedImages","_filterMasterImageFromVariant","mediaGalleryCarouselItems","_getMediaGalleryItems","mediaGalleryThumbnailCarouselItems","_getMediaGalleryThumbnailItems","viewProps","moduleProps","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","_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","itemId","_item$additionalPrope","_this$props$config$da","ref","dataScale","defaultDataScale","onMouseOver","onMouseMove","inlineZoomImageOnMouseMove","_this$props$config$da2","inlineZoomImageOnHover","String","_handleMobileViewZoomedImageClick","target","currentTarget","mobileZoomedInImageClassName","transform","classList","remove","parentElement","overflow","_this$props$config$da3","bounds","getBoundingClientRect","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","title","fullScreenTitleText","_product$PrimaryImage","PrimaryImageUrl","_this$fullScreenOverl","current","focus","parentDiv","get","children","querySelector","removeAttribute","removeContainerZoomStyle","renderThumbnailItem","GetEmptyThumbnailItemComponent","_props$context$app$co2","_props$config$thumbna2","xl","renderThumbnails","getMediaGalleryItems","GetThumbnailItemComponent","imageId","_props$context$app$co","_props$config$thumbna","_props$callbackToggle","_props$callbackThumbn","call","handleKeyDown","keyCode","Button","module","exports","ReactDOM"],"sourceRoot":""}