{"version":3,"file":"static/js/6781eddcbf67b8fa7440.bundle.js","mappings":"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","sources":["webpack://Dobbies.Commerce/./src/actions/cart-state-share.ts?609c","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/utilities/quantity/Quantity.tsx?0e68","webpack://Dobbies.Commerce/./src/themes/dobbies/views/components/product.component.tsx?de6d","webpack://Dobbies.Commerce/./src/themes/dobbies/views/custom-components/product-price-component.tsx?086b","webpack://Dobbies.Commerce/./src/validate-cart.ts?cd50"],"sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport {\r\n CacheType,\r\n createObservableDataAction,\r\n IAction,\r\n IActionContext,\r\n IActionInput,\r\n IAny,\r\n ICreateActionContext,\r\n IGeneric\r\n} from '@msdyn365-commerce/core';\r\n/**\r\n * CheckoutModulesStateShare Input Action\r\n */\r\nexport class CartModulesStateShareInput implements IActionInput {\r\n // TODO: Determine if the results of this get action should cache the results and if so provide\r\n // a cache object type and an appropriate cache key\r\n public getCacheKey = () => `cartSharedState`;\r\n public getCacheObjectType = () => 'cartSharedState';\r\n public dataCacheType = (): CacheType => 'request';\r\n}\r\n// TODO: Create a data model here or import one to capture the response of the action\r\nexport interface ICartSharedState {\r\n isCartUpdated?: boolean; // Used to display msg in delivery section\r\n isQuantityUpdated?: boolean;\r\n}\r\n/**\r\n * TODO: Use this function to create the input required to make the action call\r\n */\r\nconst createInput = (inputData: ICreateActionContext>): IActionInput => {\r\n return new CartModulesStateShareInput();\r\n};\r\n/**\r\n * TODO: Use this function to call your action and process the results as needed\r\n */\r\nexport async function updateCartStateAction(input: CartModulesStateShareInput, ctx: IActionContext): Promise {\r\n return {\r\n isCartUpdated: undefined,\r\n isQuantityUpdated: undefined\r\n };\r\n}\r\n/**\r\n * SampleState - create action\r\n */\r\nexport default createObservableDataAction({\r\n action: >updateCartStateAction,\r\n input: createInput\r\n});\r\n","/**\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 }\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 }\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 }\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 debounce from 'lodash/debounce';\r\nimport { reaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { IQuantityProps } from './Quantity.props';\r\n\r\ninterface IQuantityState {\r\n currentInput: number;\r\n}\r\n/**\r\n * Quantity Component - This component is used to add or remove quantity\r\n */\r\n@observer\r\nexport default class Quantity extends React.PureComponent {\r\n public static defaultProps: Partial = {\r\n min: 1,\r\n decrementGlyphClass: 'fas fa-minus',\r\n incrementGlyphClass: 'fas fa-plus'\r\n };\r\n\r\n private inputRef: React.RefObject = React.createRef();\r\n\r\n constructor(props: IQuantityProps) {\r\n super(props);\r\n this.state = { currentInput: props.currentCount || 1 };\r\n this._onIncrement = this._onIncrement.bind(this);\r\n this._onDecrement = this._onDecrement.bind(this);\r\n this._handleChange = this._handleChange.bind(this);\r\n }\r\n public componentDidMount(): void {\r\n reaction(\r\n () => this.props.currentCount,\r\n () => {\r\n this.setState({ currentInput: this.props.currentCount || 1 });\r\n }\r\n );\r\n }\r\n public componentDidUpdate(): void {\r\n reaction(\r\n () => this.props.currentCount,\r\n () => {\r\n this.setState({ currentInput: this.props.currentCount || 1 });\r\n }\r\n );\r\n }\r\n\r\n public render(): JSX.Element {\r\n const glyphMinusClassName: string = `${this.props.decrementGlyphClass!} quantity__controls-glyph`;\r\n const glyphPlusClassName: string = `${this.props.incrementGlyphClass!} quantity__controls-glyph`;\r\n const disabled = this.state.currentInput === this.props.min;\r\n const incDisabled = this.state.currentInput === this.props.max;\r\n const currentValue = this.state.currentInput;\r\n let extraClass = '';\r\n if (disabled) {\r\n // The quantity has reached its boundaries (max or min)\r\n extraClass = 'disabled';\r\n } else if (this.props.disabled) {\r\n // this.props.disabled shows if the state is not succeded yet\r\n extraClass = 'transition';\r\n }\r\n let extraClassInc = '';\r\n if (incDisabled) {\r\n // The quantity has reached its boundaries (max or min)\r\n extraClassInc = 'disabled';\r\n } else if (this.props.disabled) {\r\n // this.props.disabled shows if the state is not succeded yet\r\n extraClassInc = 'transition';\r\n }\r\n return (\r\n <>\r\n
\r\n {this.props.hideQuantityControls !== true && (\r\n \r\n \r\n \r\n )}\r\n \r\n {this.props.hideQuantityControls !== true && (\r\n \r\n \r\n \r\n )}\r\n
\r\n \r\n );\r\n }\r\n\r\n private _onIncrement(): void {\r\n let invokeCallback = false;\r\n const currQuantity = this.state.currentInput;\r\n let updatedQuantity: number;\r\n\r\n if (currQuantity < this.props.max) {\r\n invokeCallback = true;\r\n updatedQuantity = currQuantity + 1;\r\n } else {\r\n invokeCallback = false;\r\n updatedQuantity = this.props.max;\r\n }\r\n\r\n invokeCallback && this.props.onChange && this.props.onChange(updatedQuantity);\r\n }\r\n\r\n private _onDecrement(): void {\r\n let invokeCallback = false;\r\n const currQuantity = this.state.currentInput;\r\n let updatedQuantity: number;\r\n\r\n if (currQuantity > 1) {\r\n invokeCallback = true;\r\n updatedQuantity = currQuantity - 1;\r\n } else {\r\n invokeCallback = false;\r\n updatedQuantity = 1;\r\n }\r\n\r\n invokeCallback && this.props.onChange && this.props.onChange(updatedQuantity);\r\n }\r\n\r\n private _handleChange(e: React.ChangeEvent): void {\r\n const currentValue = parseInt(e.target.value, 10);\r\n const minValue = this.props.min === undefined ? 1 : this.props.min;\r\n const inputElement =\r\n this.inputRef && this.inputRef.current && this.inputRef.current instanceof HTMLInputElement && this.inputRef.current;\r\n\r\n if (currentValue > this.props.max) {\r\n this.setState({ currentInput: this.props.max }, () => {\r\n debounce(() => {\r\n this.props.onChange && this.props.onChange(this.state.currentInput);\r\n }, 200)();\r\n });\r\n } else {\r\n this.setState({ currentInput: currentValue }, () => {\r\n debounce(() => {\r\n if (!isNaN(this.state.currentInput) && !(this.state.currentInput < minValue)) {\r\n this.props.onChange && this.props.onChange(this.state.currentInput);\r\n\r\n if (inputElement) {\r\n inputElement.setAttribute('aria-valuenow', currentValue.toString());\r\n inputElement.setAttribute('value', currentValue.toString());\r\n }\r\n }\r\n }, 200)();\r\n });\r\n }\r\n }\r\n\r\n private _validateMin = (): void => {\r\n const minValue = this.props.min === undefined ? 1 : this.props.min;\r\n if (isNaN(this.state.currentInput) || this.state.currentInput < minValue) {\r\n this.props.onChange && this.props.onChange(minValue);\r\n } else {\r\n this.props.onChange && this.props.onChange(this.state.currentInput);\r\n }\r\n };\r\n}\r\n","import { getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n format,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n ITelemetryContent,\r\n onTelemetryClick\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { RatingComponent, AddToWishlistComponent } from '@msdyn365-commerce/components';\r\nimport { PriceComponent } from '../custom-components/product-price-component';\r\nimport { generateImageUrl, ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Quantity } from '../../utilities/quantity';\r\nimport { IDobbiesAddedProductToBundle } from '../../../../modules/dobbies-product-collection/dobbies-product-collection';\r\nimport { CartModulesStateShareInput } from '../../../../actions/cart-state-share';\r\nimport { getCartState } from '@msdyn365-commerce/global-state';\r\nimport {\r\n getDeliveryOptionsAsync\r\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { cartLineQuantityUpdatedAsync } from '@msdyn365-commerce-modules/cart-utilities';\r\nimport { ICartActionResult } from '@msdyn365-commerce/global-state';\r\n\r\nimport { getCartFromCustomer } from '@msdyn365-commerce/global-state';\r\nimport {\r\n IComponent,\r\n IComponentProps,\r\n ICoreContext,\r\n IGridSettings,\r\n IImageData,\r\n IImageSettings,\r\n Image,\r\n msdyn365Commerce,\r\n ICommerceApiSettings\r\n} from '@msdyn365-commerce/core';\r\nimport { ProductPrice, AttributeValue, DiscountLine, Cart, CommerceList, LoyaltyCard, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport React, { useRef, useState } from 'react';\r\nimport { IProductWithModes } from '../../../../modules/dobbies-search-result-container/components';\r\nimport VsiProductBadges, { badgePageType } from '../../utilities/badges/vsi-product-badges';\r\n\r\nexport interface IProductComponentProps extends IComponentProps<{ product?: IProductWithModes; discountLine?: DiscountLine }> {\r\n isNotificationModal?: boolean;\r\n className?: string;\r\n imageSettings?: IImageSettings;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n ratingAriaLabel?: string;\r\n allowBack?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n quickViewButton?: React.ReactNode;\r\n inventoryLabel?: string;\r\n isPriceMinMaxEnabled?: boolean;\r\n discountLine?: DiscountLine[] | undefined;\r\n badgeLink?: string;\r\n showProdPrice?: boolean;\r\n showDeliveryIcons?: boolean;\r\n wishlists?: CommerceList[];\r\n isMobile?: boolean;\r\n showBanner?: (prodId: number) => void;\r\n hideBanner?: (prodId: number) => void;\r\n loyalty?: LoyaltyCard;\r\n nonClubPlusDiscount?: ProductPrice;\r\n isProductAddedToBundles?: boolean; \r\n maxQuantityForBundle?: number;\r\n redirectToCartEnabled?: boolean; \r\n isProductBundles?: boolean,\r\n isQuantityUpdated?: boolean,\r\n isBundlesModal?: boolean,\r\n simpleProduct?: SimpleProduct;\r\n onQuantityChangeListener?(productId: number, newQuantity: number): void;\r\n onBundleProductCheckBoxSelected?(productId: number): void;\r\n}\r\n\r\ninterface ILocalImgData {\r\n primaryUrl: string;\r\n isPrimaryUrl: boolean;\r\n}\r\nexport interface IProductComponent extends IComponent {}\r\n\r\nconst PriceComponentActions = {};\r\n\r\nconst ProductCard: React.FC = ({\r\n data,\r\n context,\r\n imageSettings,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText,\r\n ratingAriaLabel,\r\n allowBack,\r\n typeName,\r\n id,\r\n telemetryContent,\r\n quickViewButton,\r\n wishlists,\r\n discountLine,\r\n badgeLink,\r\n showBanner,\r\n hideBanner,\r\n showDeliveryIcons = !data.product?.IsMasterProduct,\r\n isMobile,\r\n loyalty,\r\n nonClubPlusDiscount,\r\n isProductAddedToBundles,\r\n maxQuantityForBundle,\r\n redirectToCartEnabled,\r\n isProductBundles,\r\n isBundlesModal,\r\n isQuantityUpdated,\r\n simpleProduct,\r\n onQuantityChangeListener,\r\n onBundleProductCheckBoxSelected,\r\n isNotificationModal\r\n}) => {\r\n // const [displayClubPlusInfo, setDisplayClubPlusInfo] = React.useState(false);\r\n const [cartData, setCartData] = React.useState(undefined);\r\n const [updatedProductPrice, setUpdatedProductPrice] = React.useState();\r\n const [isHover, setIsHover] = useState(false); // for hover effect\r\n const productImageRef = useRef(null);\r\n const [currBundleQuantity, setCurrBundleQuantity] = React.useState(1);\r\n // const displayClubPlus = () => {\r\n // setDisplayClubPlusInfo(!displayClubPlusInfo);\r\n // }\r\n const product = data.product;\r\n if (!product) {\r\n return null;\r\n }\r\n //VSI CUSTOMIZATION -START - Task 11167: PLP hover image flip\r\n const [images, setImages] = useState({ isPrimaryUrl: false, primaryUrl: '' });\r\n React.useEffect(() => {\r\n if(isQuantityUpdated) {\r\n if(isProductBundles && isBundlesModal) {\r\n getCartState(context.actionContext).then(cartState => {\r\n const cartlines = cartState.cart?.CartLines;\r\n if(cartlines && cartlines.length) {\r\n const cl = cartlines.find(cl => cl.ProductId === product.RecordId);\r\n if (cl && cl.Quantity) {\r\n setCurrBundleQuantity(cl.Quantity);\r\n if (onQuantityChangeListener) {\r\n onQuantityChangeListener(product.RecordId, cl.Quantity);\r\n }\r\n }\r\n }\r\n }).catch(e => {});\r\n context.actionContext.update(new CartModulesStateShareInput(), {isQuantityUpdated: false});\r\n return;\r\n }\r\n if(isProductBundles && isNotificationModal) {\r\n getCartState(context.actionContext).then(cartState => {\r\n const cartlines = cartState.cart?.CartLines;\r\n if(cartlines && cartlines.length) {\r\n const cl = cartlines.find(cl => cl.ProductId === product.RecordId);\r\n if (cl && cl.Quantity) {\r\n setCurrBundleQuantity(cl.Quantity);\r\n if (onQuantityChangeListener) {\r\n onQuantityChangeListener(product.RecordId, cl.Quantity);\r\n }\r\n }\r\n }\r\n }).catch(e => {});\r\n context.actionContext.update(new CartModulesStateShareInput(), {isQuantityUpdated: false});\r\n return;\r\n }\r\n const cookies = context.actionContext.requestContext.cookies;\r\n const addedProductsToCollection = cookies.get(isNotificationModal ? 'notification_added_products' : 'added_products_bundles')?.value || [];\r\n if (Array.isArray(addedProductsToCollection)) {\r\n for (const obj of addedProductsToCollection) {\r\n if(obj['productId'] === product.RecordId) {\r\n setCurrBundleQuantity(obj['quantity']);\r\n if (onQuantityChangeListener) {\r\n onQuantityChangeListener(product.RecordId, obj['quantity']);\r\n }\r\n }\r\n }\r\n }\r\n context.actionContext.update(new CartModulesStateShareInput(), {isQuantityUpdated: false});\r\n }\r\n }, [isQuantityUpdated]);\r\n\r\n React.useEffect(() => {\r\n if(isProductAddedToBundles) {\r\n resetQuantity();\r\n }\r\n }, [isProductAddedToBundles]);\r\n\r\n const resetQuantity = async () => {\r\n if(isProductBundles){\r\n const cartState = await getCartState(context.actionContext);\r\n const cl = cartState.cart.CartLines?.find(c => c.ProductId === product.RecordId);\r\n if(cl && cl.Quantity) {\r\n if (isProductBundles && isBundlesModal) {\r\n setCurrBundleQuantity(cl.Quantity);\r\n }\r\n if (isProductBundles && isNotificationModal) {\r\n setCurrBundleQuantity(cl.Quantity);\r\n }\r\n }\r\n }\r\n };\r\n const resetQuantityOnLoad = async () => {\r\n if(isProductBundles){\r\n const cartState = await getCartState(context.actionContext);\r\n const cl = cartState.cart.CartLines?.find(c => c.ProductId === product.RecordId);\r\n if(cl && cl.Quantity) {\r\n if (isProductBundles && isBundlesModal) {\r\n setCurrBundleQuantity(cl.Quantity);\r\n } else if (!isBundlesModal){\r\n setCurrBundleQuantity(1);\r\n }\r\n if (isProductBundles && isNotificationModal) {\r\n setCurrBundleQuantity(cl.Quantity);\r\n } else if (!isBundlesModal){\r\n setCurrBundleQuantity(1);\r\n }\r\n } else {\r\n setCurrBundleQuantity(1);\r\n }\r\n }\r\n };\r\n\r\n\r\n React.useEffect(() => {\r\n if (product && product.RecordId) {\r\n const baseImgUrl = context.request.apiSettings.baseImageUrl;\r\n const imgName = `Products%2F${product.ItemId}_000_002.png`;\r\n const fullImgUrl = `${baseImgUrl}${imgName}`;\r\n if (!fullImgUrl) {\r\n return;\r\n } else {\r\n setImages({ isPrimaryUrl: false, primaryUrl: '' });\r\n }\r\n validateMediaLocaionAsync(fullImgUrl)\r\n .then(result => {\r\n if (result[1] === true) {\r\n setImages({ isPrimaryUrl: true, primaryUrl: result[0].src! });\r\n } else {\r\n setImages({ isPrimaryUrl: false, primaryUrl: '' });\r\n }\r\n })\r\n .catch(error => {\r\n context.actionContext.telemetry.exception(error);\r\n context.actionContext.telemetry.debug('Unable to validate prodcut images');\r\n });\r\n }\r\n }, [product]);\r\n //VSI CUSTOMIZATION -END - Task 11167: PLP hover image flip\r\n\r\n let productUrl = getProductPageUrlSync(product.Name || '', product.RecordId, context && context.actionContext, undefined);\r\n if (allowBack) {\r\n productUrl = updateProductUrl(productUrl, context);\r\n }\r\n\r\n const getCartData = async () => {\r\n const cart = await getCartFromCustomer(context.actionContext);\r\n setCartData(cart);\r\n await resetQuantityOnLoad();\r\n };\r\n\r\n const deSelectProduct = async () => {\r\n const cartState = await getCartState(context.actionContext);\r\n const cartlineToRemove = cartState.cart.CartLines?.find(cl => cl.ProductId === product.RecordId);\r\n if(isProductBundles && isBundlesModal) {\r\n if(cartlineToRemove) {\r\n const input = {\r\n cartLineIds: [cartlineToRemove.LineId!.toString()]\r\n };\r\n cartState.removeCartLines(input).then(() => {\r\n context.actionContext.update(new CartModulesStateShareInput(), {isCartUpdated: true});\r\n })\r\n .catch(error => {\r\n });\r\n }\r\n return;\r\n }\r\n if(isProductBundles && isNotificationModal) {\r\n if(cartlineToRemove) {\r\n const input = {\r\n cartLineIds: [cartlineToRemove.LineId!.toString()]\r\n };\r\n cartState.removeCartLines(input).then(() => {\r\n context.actionContext.update(new CartModulesStateShareInput(), {isCartUpdated: true});\r\n })\r\n .catch(error => {\r\n });\r\n }\r\n return;\r\n }\r\n const cookies = context.actionContext.requestContext.cookies;\r\n let productsAddedInBundles = cookies.get(isNotificationModal ? 'notification_added_products' : 'added_products_bundles')?.value || [];\r\n if (Array.isArray(productsAddedInBundles)) {\r\n for(let i = 0; i < productsAddedInBundles.length; i++) {\r\n if (productsAddedInBundles[i]['productId'] === product.RecordId) {\r\n delete productsAddedInBundles[i];\r\n }\r\n }\r\n const updatedProductsAddedInBundles: IDobbiesAddedProductToBundle[] = [];\r\n productsAddedInBundles.map(prod => {\r\n if(prod && prod['productId']) {\r\n const dobbiesProductData: IDobbiesAddedProductToBundle = {};\r\n dobbiesProductData.productId = prod['productId'];\r\n dobbiesProductData.quantity = prod['quantity'];\r\n dobbiesProductData.price = prod['price'];\r\n dobbiesProductData.maxQuantity = prod['maxQuantity'];\r\n updatedProductsAddedInBundles.push(dobbiesProductData);\r\n }\r\n });\r\n const cookieName = isNotificationModal ? 'notification_added_products' : 'added_products_bundles';\r\n cookies.set(cookieName, updatedProductsAddedInBundles);\r\n context.actionContext.update(new CartModulesStateShareInput(), {isCartUpdated: true});\r\n }\r\n };\r\n\r\n const onQuantityChange = async (newValue: number) => {\r\n const cartState = await getCartState(context.actionContext);\r\n const cl = cartState.cart.CartLines?.find(c => c.ProductId === product.RecordId);\r\n if(isProductBundles && isBundlesModal) {\r\n if(!cl) {\r\n if(onQuantityChangeListener) {\r\n onQuantityChangeListener(product.RecordId, newValue);\r\n }\r\n setCurrBundleQuantity(newValue);\r\n return;\r\n }\r\n if (cl && cl.Quantity && maxQuantityForBundle && simpleProduct) {\r\n if(newValue > maxQuantityForBundle) {\r\n return;\r\n }\r\n const diffInQuantity = newValue - cl.Quantity;\r\n const deliveryOptions = await getDeliveryOptionsAsync(\r\n { callerContext: context.actionContext, queryResultSettings: {} },\r\n [product.RecordId]\r\n );\r\n const emailDeliveryModeCode = context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\r\n if(diffInQuantity > 0) {\r\n const addProductToCartInput = {\r\n product: simpleProduct,\r\n quantity: diffInQuantity,\r\n enableStockCheck: context.app.config.enableStockCheck,\r\n availableQuantity: maxQuantityForBundle,\r\n isAddEmailDeliveryItemToCart:\r\n ArrayExtensions.hasElements(deliveryOptions) &&\r\n ArrayExtensions.hasElements(deliveryOptions[0].DeliveryOptions) &&\r\n deliveryOptions[0].DeliveryOptions[0].Code === emailDeliveryModeCode\r\n };\r\n cartState.addProductToCart(addProductToCartInput)\r\n .then(async result => {\r\n if (result.status === 'SUCCESS') {\r\n context.actionContext.update(new CartModulesStateShareInput(), {isCartUpdated: true});\r\n }\r\n }).catch(e => {});\r\n } else if (diffInQuantity < 0) {\r\n cartLineQuantityUpdatedAsync(\r\n true,\r\n cartState,\r\n context.actionContext.telemetry,\r\n [simpleProduct],\r\n cl,\r\n newValue\r\n )\r\n .then((cartActionResult: ICartActionResult | undefined): boolean => {\r\n if (cartActionResult?.status === 'SUCCESS') {\r\n context.actionContext.update(new CartModulesStateShareInput(), {isCartUpdated: true});\r\n return true;\r\n }\r\n return false;\r\n }).catch(e => {});\r\n }\r\n if(onQuantityChangeListener) {\r\n onQuantityChangeListener(product.RecordId, newValue);\r\n }\r\n setCurrBundleQuantity(newValue);\r\n }\r\n return;\r\n }\r\n if(isProductBundles && isNotificationModal) {\r\n if(!cl) {\r\n if(onQuantityChangeListener) {\r\n onQuantityChangeListener(product.RecordId, newValue);\r\n }\r\n setCurrBundleQuantity(newValue);\r\n return;\r\n }\r\n if (cl && cl.Quantity && maxQuantityForBundle && simpleProduct) {\r\n if(newValue > maxQuantityForBundle) {\r\n return;\r\n }\r\n const diffInQuantity = newValue - cl.Quantity;\r\n const deliveryOptions = await getDeliveryOptionsAsync(\r\n { callerContext: context.actionContext, queryResultSettings: {} },\r\n [product.RecordId]\r\n );\r\n const emailDeliveryModeCode = context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\r\n if(diffInQuantity > 0) {\r\n const addProductToCartInput = {\r\n product: simpleProduct,\r\n quantity: diffInQuantity,\r\n enableStockCheck: context.app.config.enableStockCheck,\r\n availableQuantity: maxQuantityForBundle,\r\n isAddEmailDeliveryItemToCart:\r\n ArrayExtensions.hasElements(deliveryOptions) &&\r\n ArrayExtensions.hasElements(deliveryOptions[0].DeliveryOptions) &&\r\n deliveryOptions[0].DeliveryOptions[0].Code === emailDeliveryModeCode\r\n };\r\n cartState.addProductToCart(addProductToCartInput)\r\n .then(async result => {\r\n if (result.status === 'SUCCESS') {\r\n context.actionContext.update(new CartModulesStateShareInput(), {isCartUpdated: true});\r\n }\r\n }).catch(e => {});\r\n } else if (diffInQuantity < 0) {\r\n cartLineQuantityUpdatedAsync(\r\n true,\r\n cartState,\r\n context.actionContext.telemetry,\r\n [simpleProduct],\r\n cl,\r\n newValue\r\n )\r\n .then((cartActionResult: ICartActionResult | undefined): boolean => {\r\n if (cartActionResult?.status === 'SUCCESS') {\r\n context.actionContext.update(new CartModulesStateShareInput(), {isCartUpdated: true});\r\n return true;\r\n }\r\n return false;\r\n }).catch(e => {});\r\n }\r\n if(onQuantityChangeListener) {\r\n onQuantityChangeListener(product.RecordId, newValue);\r\n }\r\n setCurrBundleQuantity(newValue);\r\n }\r\n return;\r\n }\r\n const cookies = context.actionContext.requestContext.cookies;\r\n const addedProductsToCollection = cookies.get(isNotificationModal ? 'notification_added_products' : 'added_products_bundles')?.value || [];\r\n const updatedProducts: IDobbiesAddedProductToBundle[] = [];\r\n if (Array.isArray(addedProductsToCollection)) {\r\n for (const obj of addedProductsToCollection) {\r\n if (obj['productId'] === product.RecordId) {\r\n const valueToBeUpdated = newValue;\r\n if(valueToBeUpdated > 0) {\r\n updatedProducts.push({ productId: obj['productId'], price: obj['price'], quantity: valueToBeUpdated, maxQuantity: maxQuantityForBundle });\r\n }\r\n } else {\r\n updatedProducts.push({ productId: obj['productId'], price: obj['price'], quantity: obj['quantity'], maxQuantity: obj['maxQuantity'] });\r\n }\r\n }\r\n const cookieName = isNotificationModal ? 'notification_added_products' : 'added_products_bundles';\r\n cookies.set(cookieName, updatedProducts);\r\n }\r\n setCurrBundleQuantity(newValue);\r\n context.actionContext.update(new CartModulesStateShareInput(), {isCartUpdated: true});\r\n if(onQuantityChangeListener) {\r\n onQuantityChangeListener(product.RecordId, newValue);\r\n }\r\n };\r\n\r\n const checkboxClicked = () => {\r\n if(isProductAddedToBundles) {\r\n deSelectProduct();\r\n } else if(onBundleProductCheckBoxSelected){\r\n onBundleProductCheckBoxSelected(product.RecordId);\r\n }\r\n }\r\n\r\n React.useEffect(() => {\r\n getCartData();\r\n setUpdatedProductPrice(product.Price);\r\n\r\n productImageRef.current?.addEventListener('contextmenu', e => {\r\n e.preventDefault();\r\n });\r\n }, []);\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param quickview - Quick view node.\r\n * @param item - Product id to de displayed in quickview.\r\n * @returns The product quickview component. */\r\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\r\n if (quickview === null) {\r\n return undefined;\r\n }\r\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item });\r\n }\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.RecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n //VSI CUSTOMIZATION -START - Check current loyalty tier id.\r\n const getTierId = () => {\r\n if (loyalty!?.LoyaltyGroups!?.length > 0) {\r\n const highestActiveLoyaltyCardTier = loyalty!.LoyaltyGroups![0]?.HighestActiveLoyaltyCardTier;\r\n const loyaltyCardTiers = loyalty!.LoyaltyGroups![0]?.LoyaltyCardTiers;\r\n const loyaltyCardTier = loyaltyCardTiers?.find(tier => tier.RecordId === highestActiveLoyaltyCardTier);\r\n return loyaltyCardTier?.LoyaltyTierRecordId;\r\n }\r\n return undefined;\r\n };\r\n //VSI CUSTOMIZATION -END\r\n const checkClubPlusDiscounts =\r\n discountLine && discountLine.length > 0 && discountLine?.find(x => x.OfferId === context.app.config.discountId);\r\n const checkUserLoyalty = getTierId() === context.app.config.LoyaltyTierId ? true : undefined;\r\n // cartData && cartData.AffiliationLines && cartData.AffiliationLines.find(x => x.LoyaltyTierId === context.app.config.LoyaltyTierId);\r\n // const checkNonClubPlusDiscounts = discountLine && discountLine.find(x => x.OfferId !== context.app.config.discountId);\r\n const membershipDiscount = discountLine && discountLine.find(x => x.OfferId === context.app.config.membershipDiscountId);\r\n //VSI CUSTOMIZATION -START - Task 11167: PLP hover image flip\r\n const outOfSeason =\r\n product.AttributeValues?.find(attr => attr.Name?.toLocaleLowerCase() === 'outofseason')?.TextValue?.toLowerCase() === 'yes';\r\n const getImgContainer = () => {\r\n if (!(typeName === 'dobbies-search-result-container' || images.isPrimaryUrl === false)) {\r\n return (\r\n
\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n context.request.gridSettings,\r\n product.PrimaryImageUrl,\r\n product.Name,\r\n context.request.apiSettings\r\n )}\r\n
\r\n );\r\n }\r\n return (\r\n
\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n context.request.gridSettings,\r\n product.PrimaryImageUrl,\r\n product.Name,\r\n context.request.apiSettings\r\n )}\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n context.request.gridSettings,\r\n images.primaryUrl,\r\n product.Name,\r\n context.request.apiSettings\r\n )}\r\n
\r\n );\r\n };\r\n //VSI CUSTOMIZATION -END - Task 11167: PLP hover image flip\r\n return (\r\n product.ItemId ? \r\n
setIsHover(true)} onMouseLeave={() => setIsHover(false)}>\r\n \r\n
\r\n
\r\n {isProductBundles &&\r\n
\r\n {checkboxClicked()}} />\r\n \r\n
\r\n }\r\n \r\n {/* //VSI CUSTOMIZATION -START - Task 11167: PLP hover image flip */}\r\n {getImgContainer()}\r\n {/* //VSI CUSTOMIZATION -END - Task 11167: PLP hover image flip */}\r\n \r\n\r\n \r\n
\r\n\r\n {isHover && quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\r\n\r\n {(isHover || isMobile) && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n\r\n
\r\n \r\n \r\n {/*

{product.Name}

*/}\r\n

{getProductName(product, product.Name!)}

\r\n\r\n {renderPrice(\r\n context,\r\n typeName,\r\n id,\r\n checkUserLoyalty && membershipDiscount ? product.BasePrice : nonClubPlusDiscount?.AdjustedPrice!,\r\n checkUserLoyalty && membershipDiscount ? product.Price : nonClubPlusDiscount?.CustomerContextualPrice!,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText,\r\n checkUserLoyalty && membershipDiscount ? discountLine : nonClubPlusDiscount?.DiscountLines,\r\n cartData,\r\n updatedProductPrice,\r\n getTierId,\r\n checkClubPlusDiscounts\r\n )}\r\n {/* {renderDescription(product.Description)} */}\r\n {!context.app.config.hideRating &&\r\n renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel)}\r\n\r\n {/*do not show delivery and C&C icons on plp*/}\r\n {showDeliveryIcons && (\r\n
\r\n {product!.isHomeDelivery ? (\r\n
\r\n ) : (\r\n
\r\n )}\r\n {(!product!.isHomeDelivery && outOfSeason) ?
: product!.isCnC ?
:
}\r\n
\r\n )}\r\n
\r\n
\r\n {isProductBundles &&\r\n
\r\n \r\n \r\n
\r\n }\r\n
\r\n {checkClubPlusDiscounts && checkUserLoyalty && (\r\n
\r\n

Club Plus Price

\r\n

£{product.Price.toFixed(2)}

\r\n
\r\n )}\r\n {checkClubPlusDiscounts && checkUserLoyalty === undefined && (\r\n
\r\n {product.clubPlusBanner && (\r\n
\r\n
hideBanner && hideBanner(product.RecordId)} className='product-card-club-plus-cross'>
\r\n

\r\n {/* Join Dobbies Club Plus for just £12 a year and enjoy 10% off on plants, bulbs and Seeds.{' '} */}\r\n Join Club Plus and save 10% on plants, bulbs and seeds all year round\r\n \r\n {' '}\r\n Find out more\r\n \r\n

\r\n
\r\n )}\r\n
\r\n

Club Plus Price

\r\n

£{product.Price.toFixed(2)}

\r\n
showBanner && showBanner(product.RecordId)} className='product-card-club-plus-icon'>\r\n

?

\r\n
\r\n
\r\n
\r\n )}\r\n
\r\n
: <>\r\n );\r\n};\r\n\r\nfunction getProductName(product: IProductWithModes | undefined, productName: string): string | undefined {\r\n let prodName = '';\r\n if (product && product.AttributeValues?.length == 0) {\r\n prodName = productName;\r\n } else {\r\n product &&\r\n product.AttributeValues?.map((val: AttributeValue) => {\r\n if (val.Name === 'EComName' && val.TextValue !== '') {\r\n prodName = val.TextValue!;\r\n } else {\r\n prodName = productName;\r\n }\r\n });\r\n }\r\n return prodName;\r\n}\r\n\r\nfunction renderLabel(name?: string, price?: string, rating?: number, ratingAriaLabel?: string): string {\r\n name = name || '';\r\n price = price || '';\r\n return `${name} ${price} ${getRatingAriaLabel(rating, ratingAriaLabel)}`;\r\n}\r\n\r\n// function renderDescription(description?: string): JSX.Element | null {\r\n// return

{description}

;\r\n// }\r\n\r\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\r\n if (rating && ratingAriaLabel) {\r\n const roundedRating = rating.toFixed(2);\r\n return format(ratingAriaLabel || '', roundedRating, '5');\r\n }\r\n return '';\r\n}\r\n\r\nfunction updateProductUrl(productUrl: string, context: ICoreContext): string {\r\n const srcUrl = new URL(productUrl, context.request.apiSettings.baseUrl);\r\n const queryString = `back=true`;\r\n if (srcUrl.search) {\r\n srcUrl.search += `&${queryString}`;\r\n } else {\r\n srcUrl.search += queryString;\r\n }\r\n\r\n const updatedUrl = new URL(srcUrl.href);\r\n return updatedUrl.pathname + srcUrl.search;\r\n}\r\n\r\nfunction renderRating(\r\n context: ICoreContext,\r\n typeName: string,\r\n id: string,\r\n avgRating?: number,\r\n totalRatings?: number,\r\n ariaLabel?: string\r\n): JSX.Element | null {\r\n if (!avgRating) {\r\n return null;\r\n // display empty box to match the design of when rating isnt there on product component\r\n }\r\n\r\n const numRatings = (totalRatings && totalRatings.toString()) || undefined;\r\n const ratingAriaLabel = getRatingAriaLabel(avgRating, ariaLabel);\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\nfunction renderPrice(\r\n context: ICoreContext,\r\n typeName: string,\r\n id: string,\r\n basePrice?: number,\r\n adjustedPrice?: number,\r\n savingsText?: string,\r\n freePriceText?: string,\r\n originalPriceText?: string,\r\n currentPriceText?: string,\r\n discountLine?: DiscountLine[] | undefined,\r\n cartData?: Cart | undefined,\r\n updatedPrice?: number,\r\n getTierId?: () => number | undefined,\r\n clubPlusDiscountsOfferId?: DiscountLine | undefined | false\r\n): JSX.Element | null {\r\n const price: ProductPrice = {\r\n BasePrice: basePrice,\r\n AdjustedPrice: adjustedPrice,\r\n CustomerContextualPrice: adjustedPrice\r\n };\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\n//VSI CUSTOMIZATION -START - Task 11167: PLP hover image flip\r\nasync function validateMediaLocaionAsync(uri: string): Promise<[IImageData, boolean]> {\r\n const imageData = {\r\n src: uri || '',\r\n altText: ''\r\n };\r\n if (imageData.src === '') {\r\n return [imageData, false];\r\n }\r\n return new Promise<[IImageData, boolean]>(resolve => {\r\n try {\r\n const http = new XMLHttpRequest();\r\n http.open('HEAD', imageData.src, true);\r\n http.addEventListener('load', () => {\r\n resolve([imageData, http.status === 200 || http.status === 201]);\r\n });\r\n http.addEventListener('error', () => {\r\n resolve([imageData, false]);\r\n });\r\n http.send();\r\n } catch {\r\n resolve([imageData, false]);\r\n }\r\n });\r\n}\r\n//VSI CUSTOMIZATION -END - Task 11167: PLP hover image flip\r\nfunction renderProductPlacementImage(\r\n imageSettings?: IImageSettings,\r\n gridSettings?: IGridSettings,\r\n imageUrl?: string,\r\n altText?: string,\r\n apiSettings?: ICommerceApiSettings\r\n): JSX.Element | null {\r\n if (!imageUrl || !gridSettings || !imageSettings || !apiSettings) {\r\n return null;\r\n }\r\n\r\n const newImageUrl = generateImageUrl(imageUrl, apiSettings);\r\n\r\n const img: IImageData = {\r\n src: newImageUrl ? newImageUrl : '',\r\n altText: altText ? altText : ''\r\n };\r\n const imageProps = {\r\n gridSettings: gridSettings,\r\n imageSettings: imageSettings\r\n };\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n\r\n // debugger;\r\n return ;\r\n}\r\n\r\n// @ts-ignore\r\nexport const ProductComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride<\r\n IProductComponent\r\n>('Product', { component: ProductCard, ...PriceComponentActions });\r\n\r\nexport default ProductComponent;\r\n","import classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\n/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport { ProductPrice, DiscountLine, Cart } from '@msdyn365-commerce/retail-proxy';\r\n\r\nexport interface IPriceComponentProps extends IComponentProps<{ price: ProductPrice }> {\r\n className?: string;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n discountLine?: DiscountLine[] | undefined;\r\n cartData?: Cart;\r\n updatedPrice?: number;\r\n currencyCode?: string;\r\n getTierId?: () => number | undefined;\r\n clubPlusDiscountsOfferId?: DiscountLine | undefined | false;\r\n}\r\nexport interface IPriceComponent extends IComponent {}\r\n\r\nconst PriceComponentActions = {};\r\n\r\nconst Price: React.FC = (props: IPriceComponentProps) => {\r\n // CustomerContextualPrice could be 0\r\n if (props.data.price.CustomerContextualPrice === undefined) {\r\n return null;\r\n }\r\n\r\n //loyalty &&\r\n\r\n return (\r\n \r\n {showStrikethroughPricing(props) ? renderCurrentPriceWithOriginalPrice(props) : renderCurrentPrice(props)}\r\n \r\n );\r\n};\r\n\r\nconst showStrikethroughPricing = (props: IPriceComponentProps) => {\r\n const originalPrice = getOriginalPrice(props);\r\n\r\n if (originalPrice && props.data.price.CustomerContextualPrice) {\r\n return originalPrice > props.data.price.CustomerContextualPrice;\r\n }\r\n\r\n return false;\r\n};\r\n\r\nconst getOriginalPrice = (props: IPriceComponentProps) => {\r\n return Math.max(props.data.price.BasePrice || 0, props.data.price.TradeAgreementPrice || 0, props.data.price.AdjustedPrice || 0);\r\n};\r\n\r\nconst renderCurrentPrice = (props: IPriceComponentProps, clubPlusDiscountsOfferId?: DiscountLine, checkUserLoyalty?: boolean): JSX.Element | undefined => {\r\n const initialPrice = formatCurrency(props, props.data.price.CustomerContextualPrice);\r\n return (\r\n \r\n {initialPrice}\r\n \r\n );\r\n};\r\n\r\nconst formatCurrency = (props: IPriceComponentProps, price: number | undefined): string | undefined => {\r\n if (price === undefined) {\r\n return undefined;\r\n }\r\n\r\n if (price === 0 && props.freePriceText) {\r\n return props.freePriceText;\r\n }\r\n\r\n return props.context.cultureFormatter.formatCurrency(price, props.currencyCode);\r\n};\r\n\r\nconst renderCurrentPriceWithOriginalPrice = (props: IPriceComponentProps): JSX.Element | null => {\r\n const originalPrice = getOriginalPrice(props);\r\n const initialPrice = formatCurrency(props, originalPrice);\r\n\r\n const checkClubPlusDiscounts = props.discountLine && props.discountLine.find(x => x.OfferId === props.context.app.config.discountId);\r\n const checkUserLoyalty = props.getTierId && props.getTierId() === props.context.app.config.LoyaltyTierId ? true : undefined;\r\n // props.cartData &&\r\n // props.cartData.AffiliationLines &&\r\n // props.cartData.AffiliationLines.find(x => x.LoyaltyTierId === props.context.app.config.LoyaltyTierId);\r\n const checkNonClubPlusDiscounts = props.discountLine && props.discountLine.find(x => x.OfferId !== props.context.app.config.discountId);\r\n\r\n const clubPlusFormatCurrency = (\r\n props: IPriceComponentProps,\r\n price: number | undefined,\r\n nonClubPlusPrice: number | undefined\r\n ): string | undefined => {\r\n if (price === undefined) {\r\n return undefined;\r\n }\r\n if (price === 0 && props.freePriceText) {\r\n return props.freePriceText;\r\n }\r\n\r\n if (nonClubPlusPrice === undefined) {\r\n return undefined;\r\n }\r\n if (nonClubPlusPrice === 0 && props.freePriceText) {\r\n return props.freePriceText;\r\n }\r\n\r\n return props.context.cultureFormatter.formatCurrency(nonClubPlusPrice, props.context.request.channel?.Currency);\r\n };\r\n\r\n const renderClubPlusCurrentPrice = (props: IPriceComponentProps): JSX.Element | undefined => {\r\n const initialPrice = clubPlusFormatCurrency(props, props.data.price.CustomerContextualPrice, props.updatedPrice);\r\n return (\r\n \r\n {initialPrice}\r\n \r\n );\r\n };\r\n\r\n return (\r\n <>\r\n {checkClubPlusDiscounts && checkUserLoyalty ? (\r\n <>\r\n \r\n {' '}\r\n {props.originalPriceText} {initialPrice} {props.currentPriceText} {renderCurrentPrice(props)}\r\n \r\n {/* VSI Customization - Start - 23/10/2020 */}\r\n {/* Displayed discounted price on the left, Actual price on the right */}\r\n\r\n \r\n \r\n ) : checkClubPlusDiscounts && checkNonClubPlusDiscounts && checkUserLoyalty === undefined ? (\r\n <>\r\n \r\n {' '}\r\n {props.originalPriceText} {initialPrice} {props.currentPriceText} {renderCurrentPrice(props)}\r\n \r\n {/* VSI Customization - Start - 23/10/2020 */}\r\n {/* Displayed discounted price on the left, Actual price on the right */}\r\n \r\n \r\n {/* VSI - Customization - End */}\r\n {props.savingsText && {props.savingsText}}\r\n \r\n ) : checkClubPlusDiscounts && checkUserLoyalty === undefined ? (\r\n <>\r\n \r\n {' '}\r\n {props.originalPriceText} {initialPrice} {props.currentPriceText} {renderCurrentPrice(props)}\r\n \r\n {/* VSI Customization - Start - 23/10/2020 */}\r\n {/* Displayed discounted price on the left, Actual price on the right */}\r\n\r\n \r\n \r\n ) : (\r\n <>\r\n \r\n {' '}\r\n {props.originalPriceText} {initialPrice} {props.currentPriceText} {renderCurrentPrice(props)}\r\n \r\n {/* VSI Customization - Start - 23/10/2020 */}\r\n {/* Displayed discounted price on the left, Actual price on the right */}\r\n \r\n {props.clubPlusDiscountsOfferId && checkUserLoyalty ? (\r\n \r\n ) : (\r\n \r\n )}\r\n {/* VSI - Customization - End */}\r\n {props.savingsText && {props.savingsText}}\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\n// @ts-ignore\r\nexport const PriceComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride(\r\n 'Price',\r\n { component: Price, ...PriceComponentActions }\r\n);\r\n\r\nexport default PriceComponent;\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICoreContext } from '@msdyn365-commerce/core';\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\nimport {\n AsyncResult,\n CartLine,\n CartLineValidationResults,\n CartLineValidationResultsByLineId,\n CartsDataActions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\n\nimport { ITelemetry } from '@msdyn365-commerce/telemetry-internal';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Validate the cart.\n * @param isQuantityLimitsFeatureEnabled -- Is the quantity limits feature enabled.\n * @param cart -- The cart state to validate.\n * @param telemetry -- The telemetry.\n * @param propsContext -- The props context.\n * @param shouldRetry -- Should retry.\n * @returns A list of line data validation failures.\n */\nexport async function validateCartAsync(\n isQuantityLimitsFeatureEnabled: boolean | undefined,\n cart: AsyncResult,\n telemetry: ITelemetry,\n propsContext: ICoreContext,\n shouldRetry: boolean = true\n): Promise {\n if (!isQuantityLimitsFeatureEnabled) {\n return AsyncResult.resolve();\n }\n\n let cartResult: ICartState;\n let cartVersion: number | undefined;\n try {\n cartResult = await cart;\n cartVersion = cartResult.cart.Version;\n } catch (error) {\n telemetry.warning(error);\n telemetry.debug('Unable to get cart or cart version.');\n return AsyncResult.resolve();\n }\n\n if (cartVersion) {\n try {\n const validationResult: CartLineValidationResults = await CartsDataActions.validateForCheckoutAsync(\n { callerContext: propsContext.actionContext, bypassCache: 'none' },\n cartResult.cart.Id,\n cartVersion\n );\n\n return await AsyncResult.resolve(validationResult.ValidationResultsByLineId ?? undefined);\n } catch (error) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- error type is not defined.\n if (shouldRetry && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\n try {\n await cartResult.refreshCart({});\n } catch (refreshError) {\n telemetry.warning(refreshError);\n telemetry.debug('Unable to refresh Cart');\n return AsyncResult.resolve();\n }\n try {\n await validateCartAsync(isQuantityLimitsFeatureEnabled, cart, telemetry, propsContext, false);\n return AsyncResult.resolve();\n } catch (validateError) {\n telemetry.warning(validateError);\n telemetry.debug('Unable to validate Cart');\n return AsyncResult.resolve();\n }\n }\n\n telemetry.warning(error);\n telemetry.debug('Unable to validate Cart');\n return AsyncResult.resolve();\n }\n } else {\n telemetry.warning('Cart version not found for Cart validation request.');\n return AsyncResult.resolve();\n }\n}\n\n/**\n * Check if cart line quantity update is success.\n * @param isQuantityLimitsFeatureEnabled -- Is quantity limits feature enabled.\n * @param cartResult -- The cart result.\n * @param telemetry -- The telemetry.\n * @param products -- The products.\n * @param cartLineToUpdate -- The cart line to update.\n * @param quantity -- The quantity.\n * @returns Boolean to indicate if the cart line quantity is updated.\n */\nexport async function isCartLineQuantityUpdatedAsync(\n isQuantityLimitsFeatureEnabled: boolean | undefined,\n cartResult: ICartState | undefined,\n telemetry: ITelemetry,\n products: SimpleProduct[] | undefined,\n cartLineToUpdate: CartLine,\n quantity: number\n): Promise {\n if (cartResult) {\n let isUsingDefaultOrderSettingsMax: boolean = false;\n if (ArrayExtensions.hasElements(products) && isQuantityLimitsFeatureEnabled) {\n const modifiedProduct: SimpleProduct | undefined = products.find(\n (product: SimpleProduct) => product.RecordId === cartLineToUpdate.ProductId\n );\n isUsingDefaultOrderSettingsMax = !!modifiedProduct && !!modifiedProduct.Behavior?.MaximumQuantity;\n } else {\n isUsingDefaultOrderSettingsMax = false;\n }\n\n const input = {\n cartLineId: cartLineToUpdate.LineId!.toString(),\n newQuantity: quantity,\n additionalProperties: { isUsingDefaultOrderSettingsMax }\n };\n\n try {\n const updateLineResult: ICartActionResult = await cartResult.updateCartLineQuantity(input);\n return await AsyncResult.resolve(updateLineResult.status === 'SUCCESS');\n } catch (error) {\n telemetry.warning((error as Error).message);\n telemetry.debug('Unable to update Cart Line quantity');\n }\n }\n\n return AsyncResult.resolve(false);\n}\n\n/**\n * Update cart line with cart action result.\n * @param isQuantityLimitsFeatureEnabled -- Is quantity limits feature enabled.\n * @param cartResult -- The cart result.\n * @param telemetry -- The telemetry.\n * @param products -- The products.\n * @param cartLineToUpdate -- The cart line to update.\n * @param quantity -- The quantity.\n * @returns Boolean to indicate if the cart line quantity is updated.\n */\nexport async function cartLineQuantityUpdatedAsync(\n isQuantityLimitsFeatureEnabled: boolean | undefined,\n cartResult: ICartState | undefined,\n telemetry: ITelemetry,\n products: SimpleProduct[] | undefined,\n cartLineToUpdate: CartLine,\n quantity: number\n): Promise {\n if (cartResult) {\n let isUsingDefaultOrderSettingsMax: boolean = false;\n if (ArrayExtensions.hasElements(products) && isQuantityLimitsFeatureEnabled) {\n const modifiedProduct: SimpleProduct | undefined = products.find(\n (product: SimpleProduct) => product.RecordId === cartLineToUpdate.ProductId\n );\n isUsingDefaultOrderSettingsMax = !!modifiedProduct && !!modifiedProduct.Behavior?.MaximumQuantity;\n } else {\n isUsingDefaultOrderSettingsMax = false;\n }\n\n const input = {\n cartLineId: cartLineToUpdate.LineId!.toString(),\n newQuantity: quantity,\n additionalProperties: { isUsingDefaultOrderSettingsMax }\n };\n\n try {\n const updateLineResult: ICartActionResult = await cartResult.updateCartLineQuantity(input);\n return await AsyncResult.resolve(updateLineResult);\n } catch (error) {\n telemetry.warning((error as Error).message);\n telemetry.debug('Unable to update Cart Line quantity');\n }\n }\n\n return AsyncResult.resolve();\n}\n"],"names":["CartModulesStateShareInput","constructor","getCacheKey","getCacheObjectType","dataCacheType","async","updateCartStateAction","input","ctx","isCartUpdated","undefined","isQuantityUpdated","createObservableDataAction","action","inputData","badgePageType","VSIRestAPIHandlerExtensionClass","odataObject","this","Id","newObj","Status","NoOfTransactions","result","ExtensionProperties","i","length","className","substr","lastIndexOf","concat","EntityClasses","createVSIInitiateRestCallInput","ItemID","NoOfHours","Company","id","key","DataServiceQuery","DataServiceEntities","vSIGetAPIResponseQuery","createDataServiceRequestForOperation","bypassCache","returnEntity","VsiProductBadges","React","props","super","findBannerData","_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","substring","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","Quantity","inputRef","_validateMin","minValue","min","isNaN","currentInput","onChange","currentCount","_onIncrement","bind","_onDecrement","_handleChange","reaction","glyphMinusClassName","decrementGlyphClass","glyphPlusClassName","incrementGlyphClass","disabled","incDisabled","currentValue","extraClass","extraClassInc","hideQuantityControls","title","decrementButtonAriaLabel","tabIndex","type","pattern","value","onBlur","inputQuantityAriaLabel","role","ref","disabledInput","incrementButtonAriaLabel","invokeCallback","currQuantity","updatedQuantity","parseInt","target","inputElement","current","HTMLInputElement","debounce","setAttribute","defaultProps","__decorate","observer","getProductName","productName","_product$AttributeVal2","prodName","_product$AttributeVal3","map","val","renderLabel","name","ratingAriaLabel","getRatingAriaLabel","roundedRating","format","renderProductPlacementImage","imageUrl","newImageUrl","generateImageUrl","cropFocalRegion","ProductComponent","msdyn365Commerce","createComponentOverride","_objectSpread","component","_ref","_data$product","_product$AttributeVal","_context$request$chan","data","savingsText","freePriceText","originalPriceText","currentPriceText","allowBack","typeName","telemetryContent","quickViewButton","wishlists","discountLine","badgeLink","showBanner","hideBanner","showDeliveryIcons","IsMasterProduct","isMobile","loyalty","nonClubPlusDiscount","isProductAddedToBundles","maxQuantityForBundle","redirectToCartEnabled","isProductBundles","isBundlesModal","simpleProduct","onQuantityChangeListener","onBundleProductCheckBoxSelected","isNotificationModal","cartData","setCartData","updatedProductPrice","setUpdatedProductPrice","isHover","setIsHover","useState","productImageRef","useRef","currBundleQuantity","setCurrBundleQuantity","images","setImages","isPrimaryUrl","primaryUrl","_cookies$get","getCartState","then","cartState","_cartState$cart","cartlines","cart","CartLines","cl","ProductId","catch","update","_cartState$cart2","addedProductsToCollection","cookies","get","Array","isArray","obj","resetQuantity","_cartState$cart$CartL","c","fullImgUrl","uri","imageData","Promise","resolve","http","XMLHttpRequest","open","addEventListener","status","send","_unused","validateMediaLocaionAsync","error","telemetry","exception","debug","productUrl","getProductPageUrlSync","srcUrl","URL","baseUrl","queryString","search","href","pathname","updateProductUrl","getCartData","getCartFromCustomer","_cartState$cart$CartL2","resetQuantityOnLoad","checkboxClicked","_cartState$cart$CartL3","_cookies$get2","cartlineToRemove","cartLineIds","LineId","removeCartLines","productsAddedInBundles","updatedProductsAddedInBundles","prod","dobbiesProductData","quantity","maxQuantity","push","cookieName","set","deSelectProduct","_productImageRef$curr","preventDefault","payLoad","getPayloadObject","getTelemetryAttributes","getTierId","_loyalty$LoyaltyGroup","LoyaltyGroups","_loyalty$LoyaltyGroup2","_loyalty$LoyaltyGroup3","highestActiveLoyaltyCardTier","HighestActiveLoyaltyCardTier","loyaltyCardTiers","LoyaltyCardTiers","loyaltyCardTier","tier","LoyaltyTierRecordId","checkClubPlusDiscounts","OfferId","discountId","checkUserLoyalty","LoyaltyTierId","membershipDiscount","membershipDiscountId","outOfSeason","onMouseOver","onMouseLeave","onTelemetryClick","position","checked","xmlns","width","height","viewBox","d","stroke","fill","outline","PrimaryImageUrl","quickview","item","selectedProductId","renderQuickView","AddToWishlistComponent","addToWishlistButtonText","removeFromWishlistButtonText","addToWishlistMessage","removedFromWishlistMessage","addItemToWishlistError","removeItemFromWishlistError","nameOfWishlist","ariaRole","basePrice","adjustedPrice","updatedPrice","clubPlusDiscountsOfferId","PriceComponent","renderPrice","DiscountLines","hideRating","avgRating","totalRatings","ariaLabel","numRatings","RatingComponent","ratingCount","readOnly","renderRating","TotalRatings","isHomeDelivery","isCnC","_cartState$cart$CartL4","_cookies$get3","newValue","_context$actionContex","diffInQuantity","deliveryOptions","getDeliveryOptionsAsync","emailDeliveryModeCode","EmailDeliveryModeCode","addProductToCartInput","enableStockCheck","availableQuantity","isAddEmailDeliveryItemToCart","ArrayExtensions","hasElements","DeliveryOptions","Code","addProductToCart","cartLineQuantityUpdatedAsync","cartActionResult","_context$actionContex2","updatedProducts","valueToBeUpdated","clubPlusBanner","showStrikethroughPricing","originalPrice","getOriginalPrice","renderCurrentPrice","initialPrice","itemProp","currencyCode","renderCurrentPriceWithOriginalPrice","checkNonClubPlusDiscounts","clubPlusFormatCurrency","nonClubPlusPrice","_props$context$reques","renderClubPlusCurrentPrice","classnames","validateCartAsync","isQuantityLimitsFeatureEnabled","propsContext","cartResult","cartVersion","shouldRetry","arguments","AsyncResult","Version","warning","_validationResult$Val","validationResult","CartsDataActions","ValidationResultsByLineId","refreshCart","refreshError","validateError","products","cartLineToUpdate","isUsingDefaultOrderSettingsMax","_modifiedProduct$Beha2","modifiedProduct","Behavior","MaximumQuantity","cartLineId","newQuantity","additionalProperties","updateLineResult","updateCartLineQuantity","message"],"sourceRoot":""}