{"version":3,"file":"static/js/b3701989f5f015346db9.bundle.js","mappings":"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","sources":["webpack://henrys-ecommerce/./src/actions/get-all-dimensions-for-product.ts?0098","webpack://henrys-ecommerce/./src/actions/get-applicable-warranties.action.ts?6ef5","webpack://henrys-ecommerce/./src/actions/get-full-available-inventory-nearby.action.ts?562c","webpack://henrys-ecommerce/./src/actions/get-product-promotions.action.ts?ea24","webpack://henrys-ecommerce/./src/actions/getProductVariantOrMaster.ts?9116","webpack://henrys-ecommerce/./src/common/useGoogleAnalytics.tsx?0c00","webpack://henrys-ecommerce/./src/common/utilities/createCanonicalUrl.ts?7ccf","webpack://henrys-ecommerce/./src/modules/hei-buybox-v2/components/JsonLinkingData.tsx?6594","webpack://henrys-ecommerce/./src/modules/hei-buybox-v2/components/MediaGalleryOverlay.tsx?350b","webpack://henrys-ecommerce/./src/modules/hei-buybox/common/buybox-components.tsx?a5b7","webpack://henrys-ecommerce/./src/store-selector-state-manager/base-store-selector-state-manager.ts?281e","webpack://henrys-ecommerce/./src/store-selector-state-manager/map-store-selector-state-manager.ts?2ae0","webpack://henrys-ecommerce/./src/store-selector-state-manager/store-selector-state-manager-data-action.ts?bd3e"],"sourcesContent":["import { createObservableDataAction, ICreateActionContext, IAction } from '@msdyn365-commerce/core';\r\nimport {\r\n IDimensionForSelectedVariant,\r\n getDimensionsForSelectedVariantAction,\r\n getSelectedProductIdFromActionInput,\r\n GetDimensionsForSelectedVariantInput\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\n\r\nexport class GetAllDimensionsForProductInput extends GetDimensionsForSelectedVariantInput {\r\n constructor(productId: number, channelId: number) {\r\n super(productId, channelId, []);\r\n }\r\n\r\n public getCacheObjectType = () => 'HEI-AllDimensionsForProduct';\r\n}\r\n\r\nconst createAllDimensionsForProductInput = (inputData: ICreateActionContext) => {\r\n const productId = getSelectedProductIdFromActionInput(inputData);\r\n\r\n // process.env.NODE_ENV === 'development' &&\r\n // console.log('hei-get-all-dimensions-for-product', 'createAllDimensionsForProductInput', productId, inputData);\r\n\r\n if (productId) {\r\n return new GetAllDimensionsForProductInput(+productId, +inputData.requestContext.apiSettings.channelId);\r\n }\r\n\r\n throw new Error('Unable to create AllDimensionsForProductInput, no productId found on module config or query');\r\n};\r\n\r\nexport const getAllDimensionsForProductActionDataAction = createObservableDataAction({\r\n id: 'hei-get-all-dimensions-for-product',\r\n action: >getDimensionsForSelectedVariantAction,\r\n input: createAllDimensionsForProductInput\r\n});\r\n\r\nexport default getAllDimensionsForProductActionDataAction;\r\n","import * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { createObservableDataAction, IAction, IActionContext } from '@msdyn365-commerce/core';\r\nimport { ProductsDataActions, WarrantyGroup, ProductDimension } from '@msdyn365-commerce/retail-proxy';\r\nimport { getSelectedProductIdFromActionInput, getDimensionValuesFromQuery } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getProductVariantOrMaster } from './getProductVariantOrMaster';\r\n\r\nexport class getApplicableWarrantiesInput implements Msdyn365.IActionInput {\r\n public readonly recordId: number;\r\n public readonly dimensionValues: ProductDimension[];\r\n\r\n constructor(recordId: number, dimensionValues: ProductDimension[]) {\r\n this.recordId = recordId;\r\n this.dimensionValues = dimensionValues;\r\n }\r\n\r\n public getCacheKey = () => `${this.recordId}-${this.dimensionValues.map(v => v.DimensionValue?.Value ?? '').join('|')}`;\r\n public getCacheObjectType = () => 'HEI-ApplicableWarranties';\r\n public dataCacheType = (): Msdyn365.CacheType => 'application';\r\n}\r\n\r\nconst createInput = (context: Msdyn365.ICreateActionContext): Msdyn365.IActionInput => {\r\n const matchingDimensionValues = getDimensionValuesFromQuery(context.requestContext.url.requestUrl);\r\n const productId = getSelectedProductIdFromActionInput(context);\r\n if (productId) {\r\n return new getApplicableWarrantiesInput(+productId, matchingDimensionValues);\r\n } else {\r\n throw new Error('Unable to create GetProductInfoInput, no productId found on module config or query');\r\n }\r\n};\r\n\r\nexport async function getApplicableWarrantiesAction(\r\n input: getApplicableWarrantiesInput,\r\n context: IActionContext\r\n): Promise {\r\n const matchingDimensionValues = input.dimensionValues;\r\n const productVariantOrMaster = await getProductVariantOrMaster(input.recordId, matchingDimensionValues, context);\r\n\r\n const applicableWarranties = await ProductsDataActions.getApplicableWarrantiesAsync(\r\n { callerContext: context },\r\n context.requestContext.apiSettings.catalogId,\r\n [productVariantOrMaster.RecordId]\r\n );\r\n\r\n const warrantyGroup = applicableWarranties.find(aw => aw.WarrantableProductId === productVariantOrMaster.RecordId);\r\n return warrantyGroup?.WarrantyGroups;\r\n}\r\n\r\n/**\r\n * The complete createGetApplicableWarrantiesInput data action.\r\n */\r\nexport const getApplicableWarrantiesActionDataAction = createObservableDataAction({\r\n id: 'hei-get-applicable-warranties',\r\n action: >getApplicableWarrantiesAction,\r\n input: createInput\r\n});\r\n\r\nexport default getApplicableWarrantiesActionDataAction;\r\n","// base on @msdyn365-commerce-modules/retail-actions/get-full-available-inventory-nearby\r\n\r\nimport { createObservableDataAction, IAction, ICreateActionContext, IGeneric, IAny, IActionContext } from '@msdyn365-commerce/core';\r\nimport {\r\n ChannelDeliveryOption,\r\n DeliveryModeTypeFilter,\r\n ItemAvailability,\r\n OrgUnitAvailability,\r\n OrgUnitLocation,\r\n ProductWarehouseInventoryInformation,\r\n SearchArea,\r\n StoreHours,\r\n ProductsDataActions,\r\n OrgUnitsDataActions\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n getDimensionValuesFromQuery,\r\n IFullOrgUnitAvailability,\r\n DeliveryMode,\r\n IProductInventoryInformation,\r\n QueryResultSettingsProxy,\r\n createInventoryAvailabilitySearchCriteria,\r\n mapProductInventoryInformation,\r\n GetFullAvailableInventoryNearbyInput,\r\n getFeatureState,\r\n createGetFeatureStateInput\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { GetProductPromotionsInput, getProductPromotionsAction } from './get-product-promotions.action';\r\n\r\nexport const mergeBonusProductInventoryInformation = (\r\n productInventoryInformation: IProductInventoryInformation[],\r\n productId: number,\r\n bonusItemIds: number[]\r\n) => {\r\n // Merge availabilities with bonus items\r\n if (bonusItemIds.length > 0) {\r\n const mergedProductInventoryInformation = productInventoryInformation\r\n .filter(p => p.ProductAvailableQuantity.ProductId === productId)\r\n .map(p => {\r\n productInventoryInformation\r\n .filter(\r\n bonusItemInv =>\r\n bonusItemInv.InventLocationId === p.InventLocationId &&\r\n bonusItemInv.ProductAvailableQuantity.ProductId !== productId\r\n )\r\n .forEach(bonusItemInv => {\r\n if (\r\n (bonusItemInv.ProductAvailableQuantity.AvailableQuantity ?? 0) === 0 &&\r\n (p.ProductAvailableQuantity.AvailableQuantity ?? 0) > 0\r\n ) {\r\n process.env.NODE_ENV === 'development' &&\r\n console.log('getFullAvailableInventoryNearbyAction', 'missing bonus item', p, bonusItemInv);\r\n\r\n p.ProductAvailableQuantity.AvailableQuantity = bonusItemInv.ProductAvailableQuantity.AvailableQuantity;\r\n p.IsProductAvailable = false;\r\n p.StockLevelCode = bonusItemInv.StockLevelCode;\r\n p.StockLevelLabel = bonusItemInv.StockLevelLabel;\r\n }\r\n });\r\n return p;\r\n });\r\n\r\n process.env.NODE_ENV === 'development' && console.log('getFullAvailableInventoryNearbyAction', mergedProductInventoryInformation);\r\n return mergedProductInventoryInformation;\r\n }\r\n\r\n return productInventoryInformation;\r\n};\r\n\r\n/**\r\n * CreateInput method for the getSelectedVariant data action.\r\n * @param inputData - The input data passed to the createInput method.\r\n * @returns GetFullAvailableInventoryNearbyInput - The action input.\r\n */\r\nexport const createGetFullAvailableInventoryNearbyInput = (\r\n inputData: ICreateActionContext>\r\n): GetFullAvailableInventoryNearbyInput => {\r\n return new GetFullAvailableInventoryNearbyInput();\r\n};\r\n\r\n/**\r\n * Action method for the getSelectedVariant data aciton.\r\n * @param input - The action input class.\r\n * @param ctx - The action context.\r\n * @returns IFullOrgUnitAvailability - The full org unit availability.\r\n */\r\nexport async function getFullAvailableInventoryNearbyAction(\r\n input: GetFullAvailableInventoryNearbyInput,\r\n ctx: IActionContext\r\n): Promise {\r\n // No valid product we want to return undefined so module knows there are no results yet\r\n if (!input.productId) {\r\n return undefined;\r\n }\r\n\r\n if (((!input.radius && input.radius !== 0) || !input.latitude || !input.longitude) && !input.IgnoreLocation) {\r\n // No valid location we want to return empty array so module can show no locations message\r\n return [];\r\n }\r\n\r\n const searchArea: SearchArea = {\r\n Latitude: input.latitude,\r\n Longitude: input.longitude,\r\n Radius: input.radius,\r\n DistanceUnitValue: input.DistanceUnitValue || 0 // 0 is miles\r\n };\r\n\r\n const featureState = await getFeatureState(createGetFeatureStateInput({ requestContext: ctx.requestContext }), ctx);\r\n const retailMulitplePickupMFeatureState = featureState?.find(\r\n item => item.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\r\n )?.IsEnabled;\r\n\r\n const matchingDimensionValues = getDimensionValuesFromQuery(ctx.requestContext.url.requestUrl);\r\n const getProductPromotionsInput = new GetProductPromotionsInput(input.productId, matchingDimensionValues);\r\n const promotions = await getProductPromotionsAction(getProductPromotionsInput, ctx);\r\n const bonusItemIds = promotions.FreeItemProductIds ?? [];\r\n\r\n process.env.NODE_ENV === 'development' && console.log('getFullAvailableInventoryNearbyAction', bonusItemIds);\r\n\r\n const searchCriteria = createInventoryAvailabilitySearchCriteria(\r\n ctx,\r\n [input.productId, ...bonusItemIds],\r\n false,\r\n true,\r\n searchArea,\r\n DeliveryMode.pickup\r\n );\r\n return ProductsDataActions.getEstimatedAvailabilityAsync({ callerContext: ctx }, searchCriteria)\r\n .then(async (productWarehouseInformation: ProductWarehouseInventoryInformation) => {\r\n // For store selector, inventory should always come from an individual store\r\n let productInventoryInformation = mapProductInventoryInformation(\r\n ctx,\r\n productWarehouseInformation.ProductWarehouseInventoryAvailabilities\r\n );\r\n\r\n process.env.NODE_ENV === 'development' && console.log('getFullAvailableInventoryNearbyAction', productInventoryInformation);\r\n\r\n productInventoryInformation = mergeBonusProductInventoryInformation(\r\n productInventoryInformation,\r\n input.productId!,\r\n bonusItemIds\r\n );\r\n\r\n return OrgUnitsDataActions.getOrgUnitLocationsByAreaAsync(\r\n {\r\n callerContext: ctx,\r\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(ctx)\r\n },\r\n searchArea,\r\n DeliveryModeTypeFilter.Pickup\r\n )\r\n .then(async (stores: OrgUnitLocation[]) => {\r\n // Constructing a store mapping based on the InventoryId.\r\n const storeMap = new Map();\r\n stores.forEach(store => {\r\n if (store.InventoryLocationId) {\r\n storeMap.set(store.InventoryLocationId, store);\r\n }\r\n });\r\n\r\n let locationDeliveryOptions: ChannelDeliveryOption[] | undefined = [];\r\n\r\n // If multiple pickup mode is enable then call getchanneldeliveryoption\r\n if (retailMulitplePickupMFeatureState) {\r\n const orgUnitChannel = stores.map(store => store.ChannelId);\r\n locationDeliveryOptions = await _getLocationPickUpDeliveryModes(orgUnitChannel, ctx);\r\n }\r\n\r\n const availabilityPromiseList = stores.map(store => {\r\n const locationDeliveryOption = locationDeliveryOptions?.find(\r\n _channeldeliveryoption => _channeldeliveryoption.ChannelId === store.ChannelId\r\n );\r\n return _getAvailabilityWithHours(store, productInventoryInformation, storeMap, ctx, locationDeliveryOption);\r\n });\r\n\r\n return Promise.all(availabilityPromiseList);\r\n })\r\n .catch((error: Error) => {\r\n ctx.trace('[GetFullAvailableInventoryNearby] error getting Available Inventory Nearby');\r\n ctx.trace(error.message);\r\n ctx.telemetry.error(error.message);\r\n ctx.telemetry.debug('[GetFullAvailableInventoryNearby] error getting Available Inventory Nearby');\r\n return [];\r\n });\r\n })\r\n .catch((error: Error) => {\r\n ctx.trace(\r\n '[GetFullAvailableInventoryNearby][getEstimatedAvailabilityAsync] error getting availability product warehouse information.'\r\n );\r\n ctx.trace(error.message);\r\n ctx.telemetry.error(error.message);\r\n ctx.telemetry.debug(\r\n '[GetFullAvailableInventoryNearby][getEstimatedAvailabilityAsync] error getting availability product warehouse information.'\r\n );\r\n return [];\r\n });\r\n}\r\n\r\n/**\r\n * Action method that obtains the store information along with store hours and product availability.\r\n * @param orgUnitLocation - The org unit location.\r\n * @param productInventoryInformation - The product inventory information.\r\n * @param storeMap - A map that contains store information group by the inventory location id.\r\n * @param ctx The action context.\r\n * @param channelDeleiveryOptions - The channel delivery options.\r\n * @returns IFullOrgUnitAvailability - The full org unit availability.\r\n */\r\nasync function _getAvailabilityWithHours(\r\n orgUnitLocation: OrgUnitLocation,\r\n productInventoryInformation: IProductInventoryInformation[],\r\n storeMap: Map,\r\n ctx: IActionContext,\r\n channelDeleiveryOptions: ChannelDeliveryOption | undefined\r\n): Promise {\r\n if (!orgUnitLocation || !orgUnitLocation.OrgUnitNumber) {\r\n return { OrgUnitAvailability: undefined };\r\n }\r\n\r\n return OrgUnitsDataActions.getStoreHoursAsync({ callerContext: ctx }, orgUnitLocation.OrgUnitNumber)\r\n .then((hours: StoreHours) => {\r\n const itemAvailabilities: ItemAvailability[] = [];\r\n if (productInventoryInformation && storeMap) {\r\n productInventoryInformation.forEach(element => {\r\n if (\r\n element.InventLocationId &&\r\n storeMap.has(element.InventLocationId) &&\r\n element.InventLocationId === orgUnitLocation.InventoryLocationId\r\n ) {\r\n itemAvailabilities.push({ AvailableQuantity: element.ProductAvailableQuantity?.AvailableQuantity });\r\n }\r\n });\r\n }\r\n\r\n const availability: OrgUnitAvailability = {\r\n OrgUnitLocation: orgUnitLocation,\r\n ItemAvailabilities: itemAvailabilities\r\n };\r\n\r\n if (hours && !(hours instanceof Error)) {\r\n return {\r\n OrgUnitAvailability: availability,\r\n StoreHours: hours,\r\n ProductInventoryInformation: productInventoryInformation,\r\n OrgUnitPickUpDeliveryModes: channelDeleiveryOptions\r\n };\r\n }\r\n\r\n return {\r\n OrgUnitAvailability: availability,\r\n ProductInventoryInformation: productInventoryInformation,\r\n OrgUnitPickUpDeliveryModes: channelDeleiveryOptions\r\n };\r\n })\r\n .catch((error: Error) => {\r\n ctx.trace('[GetFullAvailableInventoryNearby] error getting availability with hours');\r\n ctx.trace(error.message);\r\n ctx.telemetry.exception(error);\r\n ctx.telemetry.debug('[GetFullAvailableInventoryNearby] error getting availability with hours');\r\n return { OrgUnitAvailability: {} };\r\n });\r\n}\r\n\r\n/**\r\n * Action method that obtains the channel delivery option information.\r\n * @param channelCollection - The org unit channel Id list.\r\n * @param ctx - The action context.\r\n * @returns ChannelDeliveryOption - The channel delivery option collection.\r\n */\r\nasync function _getLocationPickUpDeliveryModes(\r\n channelCollection: (number | undefined)[],\r\n ctx: IActionContext\r\n): Promise {\r\n if (channelCollection?.length === 0 || channelCollection === undefined) {\r\n return undefined;\r\n }\r\n\r\n const channelIdList: number[] = [];\r\n channelCollection?.forEach(id => {\r\n if (id !== undefined) {\r\n channelIdList.push(id);\r\n }\r\n });\r\n\r\n // To get all channel pickup delivery mode filterOption should be 4\r\n return OrgUnitsDataActions.getChannelDeliveryOptionsAsync(\r\n {\r\n callerContext: ctx,\r\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(ctx)\r\n },\r\n channelIdList,\r\n 4\r\n )\r\n .then((channelDeliveryOptions: ChannelDeliveryOption[]) => {\r\n if (channelDeliveryOptions && !(channelDeliveryOptions instanceof Error)) {\r\n return channelDeliveryOptions;\r\n }\r\n\r\n return undefined;\r\n })\r\n .catch((error: Error) => {\r\n ctx.trace(\r\n '[GetFullAvailableInventoryNearby][getChannelDeliveryOptionsAsync] error getting availability with channel delivery options'\r\n );\r\n ctx.trace(error.message);\r\n ctx.telemetry.exception(error);\r\n ctx.telemetry.debug(\r\n '[GetFullAvailableInventoryNearby] [getChannelDeliveryOptionsAsync] error getting availability with channel delivery options'\r\n );\r\n return [];\r\n });\r\n}\r\n\r\n/**\r\n * The complete getFullAvailableInventoryNearby data action.\r\n */\r\nexport const getFullAvailableInventoryNearbyActionDataAction = createObservableDataAction({\r\n id: 'hei-get-full-available-inventory-nearby',\r\n action: >getFullAvailableInventoryNearbyAction,\r\n input: createGetFullAvailableInventoryNearbyInput\r\n});\r\n\r\nexport default getFullAvailableInventoryNearbyActionDataAction;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { getSelectedProductIdFromActionInput, getDimensionValuesFromQuery } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { ProductDimension, retailAction } from '@msdyn365-commerce/retail-proxy';\r\nimport { IGetProductPromotionResponse } from './DataServiceEntities.g';\r\nimport { getProductPromotionsV2Input } from './DataActionExtension.g';\r\nimport { getProductVariantOrMaster } from './getProductVariantOrMaster';\r\n\r\n/**\r\n * GetProductPromotions Input Action\r\n */\r\nexport class GetProductPromotionsInput implements Msdyn365.IActionInput {\r\n public readonly recordId: number;\r\n public readonly dimensionValues: ProductDimension[];\r\n\r\n constructor(recordId: number, dimensionValues: ProductDimension[]) {\r\n this.recordId = recordId;\r\n this.dimensionValues = dimensionValues;\r\n }\r\n\r\n public getCacheKey = () => `${this.recordId}-${this.dimensionValues.map(v => v.DimensionValue?.Value ?? '').join('|')}`;\r\n public getCacheObjectType = () => 'HEI-ProductPromotions';\r\n public dataCacheType = (): Msdyn365.CacheType => (process.env.NODE_ENV === 'development' ? 'application' : 'none');\r\n}\r\n\r\nconst createInput = (context: Msdyn365.ICreateActionContext): Msdyn365.IActionInput => {\r\n const matchingDimensionValues = getDimensionValuesFromQuery(context.requestContext.url.requestUrl);\r\n const productId = getSelectedProductIdFromActionInput(context);\r\n if (productId) {\r\n return new GetProductPromotionsInput(+productId, matchingDimensionValues);\r\n } else {\r\n throw new Error('Unable to create GetProductPromotionsInput, no productId found on module config or query');\r\n }\r\n};\r\n\r\nexport async function getProductPromotionsAction(\r\n input: GetProductPromotionsInput,\r\n context: Msdyn365.IActionContext\r\n): Promise {\r\n const matchingDimensionValues = input.dimensionValues;\r\n process.env.NODE_ENV === 'development' && console.log('get-product-promotions.action', input.recordId, matchingDimensionValues);\r\n const productVariant = await getProductVariantOrMaster(input.recordId, matchingDimensionValues, context);\r\n\r\n const distinctProductVariantId = productVariant.RecordId;\r\n process.env.NODE_ENV === 'development' && console.log('get-product-promotions.action', input.recordId, distinctProductVariantId);\r\n const productPromotionsInput = getProductPromotionsV2Input(input.recordId, distinctProductVariantId);\r\n return retailAction(productPromotionsInput, context);\r\n}\r\n\r\nexport default Msdyn365.createObservableDataAction({\r\n action: >getProductPromotionsAction,\r\n id: 'hei-get-product-promotions',\r\n input: createInput\r\n // isBatched: true\r\n});\r\n","import * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport {\r\n QueryResultSettingsProxy,\r\n generateProductImageUrl,\r\n createInventoryAvailabilitySearchCriteria,\r\n ArrayExtensions\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n ProductDimension,\r\n ProductDimensionAvailabilitySearchCriteria,\r\n ProductsDataActions,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { IProductDimensionsWithAvailabilitiesFull } from '@msdyn365-commerce/commerce-entities';\r\n\r\n/**\r\n * Retrieves product dimensions with availabilities.\r\n * @param product - Product for which the dimensions need to be retrieved.\r\n * @param matchingDimensionValues - Selected dimensions - filter criteria for the dimensions API.\r\n * @param context - Action context.\r\n * @param catalogId - Catalog id.\r\n * @returns Array of dimensions.\r\n */\r\nconst getFullDimensions = async (\r\n product: SimpleProduct,\r\n matchingDimensionValues: ProductDimension[],\r\n context: Msdyn365.IActionContext,\r\n catalogId?: number\r\n) => {\r\n let fullDimensions: IProductDimensionsWithAvailabilitiesFull[] = [];\r\n const fullDimensionPromises = (product.Dimensions ?? []).map(dimension => {\r\n const shippingInventoryConfiguration = createInventoryAvailabilitySearchCriteria(context, [], true, undefined, undefined);\r\n const searchCriteria: ProductDimensionAvailabilitySearchCriteria = {\r\n RequestedDimensionTypeValue: dimension.DimensionTypeValue,\r\n MatchingDimensionValues: matchingDimensionValues,\r\n DefaultWarehouseOnly: shippingInventoryConfiguration.DefaultWarehouseOnly,\r\n FilterByChannelFulfillmentGroup: shippingInventoryConfiguration.FilterByChannelFulfillmentGroup,\r\n DeliveryModeTypeFilterValue: shippingInventoryConfiguration.DeliveryModeTypeFilterValue,\r\n CatalogId: catalogId\r\n };\r\n const dimensionValuesPromise = ProductsDataActions.getDimensionValuesWithEstimatedAvailabilitiesAsync(\r\n { callerContext: context, queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context) },\r\n product.MasterProductId ? product.MasterProductId : product.RecordId,\r\n searchCriteria\r\n );\r\n\r\n return dimensionValuesPromise.then(dimensionValues => {\r\n const fullDimension: IProductDimensionsWithAvailabilitiesFull = {\r\n ...dimension,\r\n dimensionValuesWithInventory: dimensionValues\r\n };\r\n return fullDimension;\r\n });\r\n });\r\n fullDimensions = await Promise.all(fullDimensionPromises);\r\n return fullDimensions;\r\n};\r\n\r\n/**\r\n * Retrieves product variant for the given input or undefined if not found.\r\n * @param input - Action input.\r\n * @param context - Action context.\r\n * @param fullDimensions - Product dimensions with availabilities.\r\n * @returns A product variant that is available or undefined.\r\n */\r\nconst getProductVariant = async (context: Msdyn365.IActionContext, fullDimensions: IProductDimensionsWithAvailabilitiesFull[]) => {\r\n let productVariant: SimpleProduct | undefined;\r\n if (\r\n ArrayExtensions.hasElements(fullDimensions) &&\r\n ArrayExtensions.hasElements(fullDimensions[0].dimensionValuesWithInventory) &&\r\n ArrayExtensions.hasElements(fullDimensions[0].dimensionValuesWithInventory[0].ProductIds)\r\n ) {\r\n const variantProductId = fullDimensions[0].dimensionValuesWithInventory[0].ProductIds[0];\r\n const result = await ProductsDataActions.getByIdsAsync(\r\n {\r\n callerContext: context,\r\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context)\r\n //bypassCache: input.bypassCache\r\n },\r\n context.requestContext.apiSettings.channelId,\r\n [variantProductId],\r\n null,\r\n context.requestContext.apiSettings.catalogId\r\n );\r\n productVariant = result[0];\r\n productVariant = { ...productVariant };\r\n const variantImageUrl = generateProductImageUrl(productVariant, context.requestContext.apiSettings);\r\n\r\n if (variantImageUrl) {\r\n productVariant.PrimaryImageUrl = variantImageUrl;\r\n }\r\n }\r\n\r\n return productVariant;\r\n};\r\n\r\n/**\r\n * Checks if given product has any unmatched dimensions.\r\n * Modifies product entity to use matched dimension values.\r\n * @param product - The product to analyze and modify.\r\n * @param matchingDimensionValues - Matched dimensions.\r\n * @returns True if has any unmatched dimension, false if all dimensions are specified.\r\n */\r\nconst checkIfHasUnmatchedDimensions = (product: SimpleProduct, matchingDimensionValues: ProductDimension[]): boolean => {\r\n let hasUnmatchedDimension: boolean = false;\r\n if (product.Dimensions) {\r\n product.Dimensions = product.Dimensions.map(dimension => {\r\n return { ...dimension };\r\n });\r\n for (const dimension of product.Dimensions) {\r\n const matchedTargetDimension = matchingDimensionValues.find(\r\n targetDimension => targetDimension.DimensionTypeValue === dimension.DimensionTypeValue\r\n );\r\n\r\n if (matchedTargetDimension) {\r\n dimension.DimensionValue = matchedTargetDimension.DimensionValue;\r\n } else {\r\n hasUnmatchedDimension = true;\r\n }\r\n }\r\n }\r\n return hasUnmatchedDimension;\r\n};\r\n\r\nconst getProductVariantOrMaster = async (\r\n productId: number,\r\n matchingDimensionValues: ProductDimension[],\r\n context: Msdyn365.IActionContext\r\n) => {\r\n const result = await ProductsDataActions.getByIdsAsync(\r\n {\r\n callerContext: context,\r\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context)\r\n // bypassCache: input.bypassCache\r\n },\r\n context.requestContext.apiSettings.channelId,\r\n [productId],\r\n null,\r\n context.requestContext.apiSettings.catalogId\r\n );\r\n\r\n let product = result[0];\r\n\r\n // Need to dereference this before editing it. Otherwise we might not\r\n // properly get the mobx events because if things aren't properly observable\r\n // they won't fire when you set them, and then if you don't deref the value in\r\n // the cache will match the value when you try to save it, so it won't detect any\r\n // changes there either\r\n product = { ...product };\r\n\r\n // Not all dimensions are selected\r\n if (matchingDimensionValues.find(dv => !dv.DimensionValue)) {\r\n return product;\r\n }\r\n\r\n const hasUnmatchedDimension = checkIfHasUnmatchedDimensions(product, matchingDimensionValues);\r\n\r\n if (hasUnmatchedDimension) {\r\n return product;\r\n }\r\n\r\n const fullDimensions: IProductDimensionsWithAvailabilitiesFull[] = await getFullDimensions(\r\n product,\r\n matchingDimensionValues,\r\n context,\r\n context.requestContext.apiSettings.catalogId\r\n );\r\n\r\n // Retrieve product variants only if matching dimensions are provided.\r\n const productVariant: SimpleProduct | undefined = ArrayExtensions.hasElements(matchingDimensionValues)\r\n ? await getProductVariant(context, fullDimensions)\r\n : undefined;\r\n\r\n return productVariant ?? product;\r\n};\r\n\r\nexport { getProductVariantOrMaster };\r\n","import * as React from 'react';\r\nimport MsDyn365, { IActionContext } from '@msdyn365-commerce/core';\r\nimport { GaPayload, pushGoogleAnalyticsEvent } from './pushGoogleAnalyticsEvent';\r\n\r\nlet lastCached = '';\r\n\r\nconst useGoogleAnalytics = (payload?: GaPayload, actionContext?: IActionContext, deps?: React.DependencyList | undefined) => {\r\n const isBrowser = MsDyn365.isBrowser;\r\n\r\n const cacheKey = React.useMemo(() => {\r\n if (payload?.event === 'view_item' && payload.ecommerce?.items) {\r\n return payload.ecommerce?.items[0]?.item_id;\r\n } else if (payload?.event === 'purchase') {\r\n return payload.ecommerce?.transaction_id;\r\n } else if (payload?.event === 'begin_checkout' && payload.ecommerce?.items) {\r\n return payload.ecommerce?.items.map(i => i.item_id).join(',');\r\n }\r\n\r\n return '';\r\n }, [payload]);\r\n\r\n if (cacheKey) {\r\n // skip if the event is unrecognized\r\n lastCached = cacheKey;\r\n }\r\n\r\n process.env.NODE_ENV === 'development' && console.log('useGoogleAnalytics', 'cacheKey', cacheKey);\r\n\r\n React.useEffect(() => {\r\n if (isBrowser) {\r\n void pushGoogleAnalyticsEvent(payload, actionContext);\r\n }\r\n }, [isBrowser, cacheKey || lastCached, ...(deps ?? [])]);\r\n};\r\n\r\nexport { useGoogleAnalytics };\r\n","import { IActionContext } from '@msdyn365-commerce/core';\r\n\r\nexport const createCanonicalUrl = (context: IActionContext, paths: string[], page: string) => {\r\n let canonicalDomainHost = `https://${context.requestContext.canonicalDomain}`;\r\n if (process.env.NODE_ENV === 'development') {\r\n canonicalDomainHost = '';\r\n }\r\n\r\n const sitePath = context.requestContext.sitePath ?? '';\r\n\r\n const url = `${canonicalDomainHost}${sitePath}/${paths\r\n .map(p => toSlug(p))\r\n .filter(s => s.length > 0)\r\n .join('/')}/${page}`;\r\n return url;\r\n};\r\n\r\nconst toSlug = (text: string) => {\r\n const slug = text\r\n .toLowerCase()\r\n .replace(/[^A-Za-z\\u00C0-\\u017F0-9]/g, '-')\r\n .replace(/--+/g, '-')\r\n .replace(/^-/, '')\r\n .replace(/-$/, '');\r\n\r\n return slug;\r\n};\r\n","import { ProductPrice, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport React from 'react';\r\nimport { IActionContext, HtmlHeadInclude } from '@msdyn365-commerce/core';\r\nimport { getProductUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { createCanonicalUrl } from '../../../common/utilities/createCanonicalUrl';\r\n\r\nconst getProductUrl = (simpleProductData: SimpleProduct, context: IActionContext) => {\r\n const productUrl = getProductUrlSync(simpleProductData, context);\r\n const canonicalDomain = context.requestContext.canonicalDomain;\r\n if (productUrl && canonicalDomain) {\r\n return `https://${canonicalDomain}${productUrl}`.toLocaleLowerCase();\r\n }\r\n\r\n return undefined;\r\n};\r\n\r\nconst JsonLinkingData = ({\r\n productInfo,\r\n actionContext,\r\n productPrice\r\n}: {\r\n productInfo?: SimpleProduct;\r\n actionContext: IActionContext;\r\n productPrice?: ProductPrice;\r\n}) => {\r\n const brand = productInfo?.ExtensionProperties?.find(ep => ep.Key === 'Brand')?.Value?.StringValue;\r\n const mfrCode = productInfo?.ExtensionProperties?.find(ep => ep.Key === 'MfrCode')?.Value?.StringValue;\r\n const request = actionContext.requestContext;\r\n\r\n if (!productInfo) {\r\n return null;\r\n }\r\n\r\n const canonicalUrl =\r\n createCanonicalUrl(actionContext, [productInfo.Name ?? ''], `${productInfo.RecordId}.p`) ||\r\n getProductUrl(productInfo, actionContext);\r\n const ld = {\r\n '@context': 'https://schema.org',\r\n '@type': 'Product',\r\n '@id': canonicalUrl,\r\n name: productInfo.Name || '',\r\n image: productInfo.PrimaryImageUrl && [productInfo.PrimaryImageUrl],\r\n description: productInfo.Description || undefined,\r\n sku: productInfo.ItemId,\r\n mpn: mfrCode,\r\n brand:\r\n (brand && {\r\n '@type': 'Brand',\r\n name: brand\r\n }) ||\r\n undefined,\r\n offers: {\r\n '@type': 'Offer',\r\n url: request.canonicalUrl || request.url.requestUrl,\r\n priceCurrency: request.channel?.Currency,\r\n price: productPrice?.CustomerContextualPrice ?? productInfo.Price\r\n }\r\n };\r\n\r\n return (\r\n \r\n {/* tslint:disable-next-line: react-no-dangerous-html */}\r\n \r\n \r\n );\r\n};\r\n\r\nexport { JsonLinkingData };\r\n","import React, { useMemo } from 'react';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\n\r\nconst MediaGalleryOverlay = ({\r\n product,\r\n resources\r\n}: {\r\n product?: SimpleProduct;\r\n resources: {\r\n usedProductImageOverlayText: string;\r\n };\r\n}) => {\r\n const isUsedSku = useMemo(() => !!product?.ExtensionProperties?.find(ep => ep.Key === 'NewSku')?.Value?.StringValue, [product]);\r\n\r\n if (!isUsedSku) {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n
{resources.usedProductImageOverlayText}
\r\n
\r\n );\r\n};\r\n\r\nexport { MediaGalleryOverlay };\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport {\r\n AddToOrderTemplateComponent,\r\n AddToWishlistComponent,\r\n IAddToCartFailureResult,\r\n IAddToCartResources,\r\n IAddToOrderTemplateDialogResources,\r\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n IItemAddedToOrderTemplateDialogResources,\r\n IOrderTemplateActionErrorResult,\r\n IOrderTemplateNameDialogResources,\r\n IWishlistActionErrorResult,\r\n PriceComponent,\r\n RatingComponent\r\n} from '@msdyn365-commerce/components';\r\nimport { getUrlSync, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\r\nimport { ProductAvailableQuantity, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions, DeliveryMode, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Alert,\r\n Button,\r\n format,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n Heading,\r\n ITelemetryContent,\r\n Node,\r\n Quantity,\r\n TelemetryConstant\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport {\r\n IBuyboxAddToCartViewProps,\r\n IBuyboxAddToOrderTemplateViewProps,\r\n IBuyboxAddToWishlistViewProps,\r\n IBuyboxCallbacks,\r\n IBuyboxCommonData,\r\n IBuyboxCommonResources,\r\n IBuyboxErrorBlockProps,\r\n IBuyboxExtentedProps,\r\n IBuyboxKeyInPriceViewProps,\r\n IBuyboxProductQuantityViewProps,\r\n IBuyboxShopSimilarLookViewProps,\r\n IBuyboxState,\r\n IProductDetails,\r\n ShopSimiliarButtonType,\r\n getConfigureErrors,\r\n getGenericError,\r\n getQuantityError\r\n} from '@msdyn365-commerce-modules/buybox';\r\nimport { AddToCartComponent } from '../components/add-to-cart.component';\r\nimport { IHeiBuyboxState } from '../hei-buybox.data';\r\n\r\nconst _getClassNamePrefix = (typeName: string): string => {\r\n return typeName.toLocaleLowerCase() === 'quickview' ? 'ms-quickView' : 'ms-buybox';\r\n};\r\n\r\nexport function getBuyBoxInventoryLabel(\r\n props: IBuyboxExtentedProps,\r\n productDetails?: IProductDetails\r\n): React.ReactElement | undefined {\r\n const { typeName } = props;\r\n\r\n // Since the data action can return no value, and the type is non-nullable due to backward compatibility reasons, the null check is required.\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\r\n const productAvailableQuantity = props.data.productAvailableQuantity?.result ?? productDetails?.productAvailableQuantity;\r\n\r\n const className = _getClassNamePrefix(typeName);\r\n if (!productAvailableQuantity || !ArrayExtensions.hasElements(productAvailableQuantity)) {\r\n return undefined;\r\n }\r\n const shippingInventory = productAvailableQuantity.find(shipping => shipping.deliveryType === DeliveryMode.shipping);\r\n\r\n if (shippingInventory) {\r\n let inventoryClassName: string;\r\n if (shippingInventory.StockLevelCode) {\r\n inventoryClassName = `${className}__inventory-label ${className}__inventory-code-${shippingInventory.StockLevelCode.toLowerCase()}`;\r\n } else {\r\n inventoryClassName = `${className}__inventory-label`;\r\n }\r\n return (\r\n
\r\n {shippingInventory.StockLevelLabel}\r\n
\r\n );\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nexport function getBuyboxProductTitle(\r\n props: IBuyboxExtentedProps,\r\n productDetails?: IProductDetails\r\n): React.ReactElement | undefined {\r\n const {\r\n config: { titleHeadingTag = 'h1' },\r\n typeName\r\n } = props;\r\n const className = _getClassNamePrefix(typeName);\r\n\r\n // Since the data action can return no value, and the type is non-nullable due to backward compatibility reasons, the null check is required.\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\r\n const product = props.data.product?.result ?? productDetails?.product ?? undefined;\r\n\r\n return product && ;\r\n}\r\n\r\nexport function getBuyboxProductDescription(\r\n props: IBuyboxExtentedProps,\r\n productDetails?: IProductDetails\r\n): React.ReactElement | undefined {\r\n const { typeName } = props;\r\n const className = _getClassNamePrefix(typeName);\r\n\r\n // Since the data action can return no value, and the type is non-nullable due to backward compatibility reasons, the null check is required.\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\r\n const product = props.data.product?.result ?? productDetails?.product ?? undefined;\r\n\r\n return product &&

{product.Description}

;\r\n}\r\n\r\n/**\r\n * Gets the react node for product unit of measure display.\r\n * @param {IBuyboxExtentedProps} props The buybox module props.\r\n * @param {IProductDetails} productDetails The product details to be displyed in buybox.\r\n * @returns {React.ReactElement} The node representing markup for unit of measure component.\r\n */\r\nexport function getBuyboxProductUnitOfMeasure(\r\n props: IBuyboxExtentedProps,\r\n productDetails?: IProductDetails\r\n): React.ReactElement | undefined {\r\n const { typeName } = props;\r\n const className = _getClassNamePrefix(typeName);\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\r\n if (\r\n props.context.app.config &&\r\n (!props.context.app.config.unitOfMeasureDisplayType || props.context.app.config.unitOfMeasureDisplayType === 'none')\r\n ) {\r\n return undefined;\r\n }\r\n\r\n // Since the data action can return no value, and the type is non-nullable due to backward compatibility reasons, the null check is required.\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\r\n const product = props.data.product?.result ?? productDetails?.product;\r\n if (!product || !product.DefaultUnitOfMeasure) {\r\n props.telemetry.warning('Missing defult unit of measureor theproduct');\r\n return undefined;\r\n }\r\n\r\n return (\r\n
\r\n {product.DefaultUnitOfMeasure}\r\n
\r\n );\r\n}\r\n\r\nlet telemetryContent: ITelemetryContent;\r\n\r\n/**\r\n * On add to cart failed function.\r\n * @param props -The buybox module props.\r\n * @param state -The buybox module state.\r\n * @param callbacks -The buybox module callbacks.\r\n * @param defaultMinimumKeyInPrice -The default minimum key in price.\r\n * @param defaultMaximumKeyInPrice -The default maximum key in price.\r\n * @param cart -The cart state.\r\n * @param product -The simple product.\r\n * @param productAvailability -The product available quantity.\r\n * @returns Update error state.\r\n */\r\nconst onAddToCartFailed = (\r\n props: IBuyboxExtentedProps,\r\n state: IBuyboxState,\r\n callbacks: IBuyboxCallbacks,\r\n defaultMinimumKeyInPrice: number,\r\n defaultMaximumKeyInPrice: number,\r\n cart: ICartState,\r\n product: SimpleProduct,\r\n productAvailability: ProductAvailableQuantity | undefined\r\n) => (result: IAddToCartFailureResult) => {\r\n let quantityErrorForState: string | undefined;\r\n let customAmountErrorForState: string | undefined;\r\n let otherErrorForState: string | undefined = getGenericError(\r\n result,\r\n cart,\r\n props.resources,\r\n props.context,\r\n product,\r\n productAvailability,\r\n undefined\r\n );\r\n\r\n if (result.failureReason === 'OUTOFSTOCK') {\r\n quantityErrorForState = result.failureReason === 'OUTOFSTOCK' ? getQuantityError(result.stockLeft, props.resources) : undefined;\r\n } else if (\r\n result.failureReason === 'CARTACTIONFAILED' &&\r\n result.cartActionResult &&\r\n (result.cartActionResult.substatus === 'MAXQUANTITY' || result.cartActionResult.substatus === 'QUANTITYLIMITS')\r\n ) {\r\n quantityErrorForState = getGenericError(result, cart, props.resources, props.context, product, productAvailability, undefined);\r\n otherErrorForState = undefined; // Prevent error duplication in otherError and quantityError\r\n }\r\n\r\n if (result.failureReason === 'INVALIDCUSTOMAMOUNT') {\r\n if (state.keyInPriceAmount === undefined || state.keyInPriceAmount < (props.config.minimumKeyInPrice || defaultMinimumKeyInPrice)) {\r\n const formatedAmountLimit = props.context.cultureFormatter.formatCurrency(\r\n props.config.minimumKeyInPrice || defaultMinimumKeyInPrice\r\n );\r\n customAmountErrorForState = props.resources.invalidSmallCustomAmountText.replace('{minAmount}', formatedAmountLimit);\r\n } else if (state.keyInPriceAmount > (props.config.maximumKeyInPrice || defaultMaximumKeyInPrice)) {\r\n const formatedAmountLimit = props.context.cultureFormatter.formatCurrency(\r\n props.config.maximumKeyInPrice || defaultMaximumKeyInPrice\r\n );\r\n customAmountErrorForState = props.resources.invalidLargeCustomAmountText.replace('{maxAmount}', formatedAmountLimit);\r\n }\r\n }\r\n\r\n callbacks.updateErrorState({\r\n errorHost: 'ADDTOCART',\r\n quantityError: quantityErrorForState,\r\n configureErrors:\r\n result.failureReason === 'MISSINGDIMENSION'\r\n ? getConfigureErrors(result.missingDimensions, props.resources, product?.IsGiftCard)\r\n : {},\r\n customAmountError: customAmountErrorForState,\r\n otherError: otherErrorForState\r\n });\r\n};\r\n\r\n/**\r\n * On Item Add To Cart function.\r\n * @param typeName -Type name.\r\n * @param callbacks -Buybox Callbacks.\r\n * @returns Change modal open.\r\n */\r\nconst onItemAddedToCart = (typeName: string, callbacks: IBuyboxCallbacks) => (result: ICartActionResult) => {\r\n if (typeName === 'quickview') {\r\n callbacks.changeModalOpen(false);\r\n }\r\n};\r\n\r\nexport function getBuyboxAddToCart(\r\n props: IBuyboxExtentedProps,\r\n state: IHeiBuyboxState,\r\n callbacks: IBuyboxCallbacks,\r\n defaultMinimumKeyInPrice: number,\r\n defaultMaximumKeyInPrice: number,\r\n productDetails?: IProductDetails,\r\n hasAvailableProducts?: boolean,\r\n bonusItemIds?: number[]\r\n): IBuyboxAddToCartViewProps {\r\n const { id, typeName, context, resources } = props;\r\n // process.env.NODE_ENV === 'development' && console.log('BuyboxView', 'getBuyboxAddToCart', bonusItemIds);\r\n\r\n // Since the data action can return no value, and the type is non-nullable due to backward compatibility reasons, the null check is required.\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\r\n const product = props.data.product?.result ?? productDetails?.product;\r\n\r\n // Since the data action can return no value, and the type is non-nullable due to backward compatibility reasons, the null check is required.\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\r\n const cart = props.data.cart?.result ?? productDetails?.cart;\r\n\r\n // Since the data action can return no value, and the type is non-nullable due to backward compatibility reasons, the null check is required.\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\r\n const productAvailableQuantity = props.data.productAvailableQuantity?.result ?? productDetails?.productAvailableQuantity;\r\n\r\n const {\r\n quantity,\r\n errorState: { configureErrors, quantityError, customAmountError, otherError, errorHost },\r\n selectedProduct,\r\n isUpdatingDimension,\r\n isUpdatingDeliveryOptions,\r\n isServiceItem\r\n } = state;\r\n\r\n const productAvailability = state.productAvailableQuantity\r\n ? state.productAvailableQuantity.ProductAvailableQuantity\r\n : productAvailableQuantity && productAvailableQuantity.length > 0\r\n ? productAvailableQuantity[0].ProductAvailableQuantity\r\n : undefined;\r\n\r\n const dialogStrings: IAddToCartResources = {\r\n goToCartText: resources.buyBoxGoToCartText,\r\n continueShoppingText: resources.buyBoxContinueShoppingText,\r\n closeNotificationLabel: resources.closeNotificationLabel,\r\n headerItemOneText: resources.buyBoxSingleItemText,\r\n headerItemFormatText: resources.buyBoxMultiLineItemFormatText,\r\n headerMessageText: resources.buyBoxHeaderMessageText,\r\n freePriceText: resources.priceFree,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText,\r\n addedQuantityText: resources.addedQuantityText\r\n };\r\n\r\n const defaultImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=240&h=240&m=6', w: 0, h: 0 },\r\n lg: { q: 'w=240&h=240&m=6', w: 0, h: 0 },\r\n xl: { q: 'w=240&h=240&m=6', w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n\r\n const isProductQuantityLoading = typeName !== 'quickview' && props.data.productAvailableQuantity.status === 'LOADING';\r\n if (isProductQuantityLoading) {\r\n callbacks.changeUpdatingDimension(false);\r\n }\r\n\r\n const isLoadingDeliveryOptions = typeName !== 'quickview' && props.data.deliveryOptions?.status === 'LOADING';\r\n if (isLoadingDeliveryOptions && callbacks.changeUpdatingDeliveryOptions) {\r\n callbacks.changeUpdatingDeliveryOptions(false);\r\n }\r\n\r\n const isBopisOnly = Boolean(product?.ExtensionProperties?.find(ep => ep.Key === 'Bopis' && ep.Value?.StringValue === 'Yes'));\r\n\r\n telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.typeName, props.telemetry);\r\n\r\n // Check if the product delivery mode is electronic\r\n const emailDeliveryModeCode = props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\r\n // from quickview we are not getting deliveryoptions in props.data hence getting it from quickview state\r\n const deliveryOptions = typeName === 'quickview' ? state.productDeliveryOptions : props.data.deliveryOptions?.result;\r\n const isEmailDelivery =\r\n ArrayExtensions.hasElements(deliveryOptions?.DeliveryOptions) && deliveryOptions!.DeliveryOptions[0].Code === emailDeliveryModeCode;\r\n const className = _getClassNamePrefix(typeName);\r\n const isDisabled = isBopisOnly || (isUpdatingDimension && typeName === 'quickview');\r\n\r\n return {\r\n ContainerProps: {\r\n className: `${className}__add-to-cart-container`\r\n },\r\n button: product && !isBopisOnly && (\r\n \r\n ),\r\n errorBlock: (\r\n \r\n )\r\n };\r\n}\r\n\r\n/**\r\n * Get the React.ReactElement contains price.\r\n * @param props - The IBuyboxExtentedProps.\r\n * @param state - The buybox state.\r\n * @returns The React.ReactElement.\r\n */\r\nexport function getBuyboxProductPrice(props: IBuyboxExtentedProps, state: IBuyboxState): React.ReactElement | undefined {\r\n const { id, typeName, context, resources } = props;\r\n\r\n return (\r\n state.productPrice && (\r\n featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\r\n )?.IsEnabled\r\n }\r\n isSalesAgreementPriceFeatureEnabled={\r\n props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSalesAgreementPriceSupportFeature'\r\n )?.IsEnabled\r\n }\r\n priceResources={{\r\n priceRangeSeparator: resources.priceRangeSeparator,\r\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\r\n salesAgreementExpirationDatePrompt: resources.salesAgreementExpirationDatePrompt,\r\n salesAgreementCommittedQuantityPrompt: resources.salesAgreementCommittedQuantityPrompt,\r\n salesAgreementRemainingQuantityPrompt: resources.salesAgreementRemainingQuantityPrompt\r\n }}\r\n freePriceText={resources.priceFree}\r\n originalPriceText={resources.originalPriceText}\r\n currentPriceText={resources.currentPriceText}\r\n />\r\n )\r\n );\r\n}\r\n\r\nexport function getBuyboxProductRating(\r\n props: IBuyboxExtentedProps,\r\n productDetails?: IProductDetails\r\n): React.ReactElement | undefined {\r\n const { id, typeName, context, resources } = props;\r\n\r\n // Since the data action can return no value, and the type is non-nullable due to backward compatibility reasons, the null check is required.\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\r\n const ratingsSummary = props.data.ratingsSummary?.result ?? productDetails?.ratingsSummary;\r\n if (!ratingsSummary || !ratingsSummary.averageRating) {\r\n return
;\r\n }\r\n const ratingComponent = (\r\n \r\n );\r\n\r\n return ratingComponent;\r\n}\r\n\r\nfunction generateAddToOrderTemplateDialogResources(resources: IBuyboxCommonResources): IAddToOrderTemplateDialogResources {\r\n return {\r\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\r\n\r\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\r\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\r\n\r\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\r\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\r\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\r\n\r\n selectTemplatesText: resources.selectTemplatesText,\r\n addToTemplateButtonText: resources.addToTemplateButtonText,\r\n lineItemsText: resources.lineItemsText\r\n };\r\n}\r\n\r\nfunction generateOrderTemplateNameDialogResources(resources: IBuyboxCommonResources): IOrderTemplateNameDialogResources {\r\n return {\r\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\r\n orderTemplateTitleLabel: resources.orderTemplateTitle,\r\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\r\n orderTemplateDescription: resources.createOrderTemplateDescription,\r\n\r\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\r\n\r\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\r\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\r\n };\r\n}\r\n\r\nfunction generateItemAddedToOrderTemplateDialogResources(resources: IBuyboxCommonResources): IItemAddedToOrderTemplateDialogResources {\r\n return {\r\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\r\n continueShoppingButtonText: resources.continueShoppingButtonText,\r\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\r\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\r\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\r\n freePriceText: resources.priceFree,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText\r\n };\r\n}\r\n\r\nfunction generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\r\n resources: IBuyboxCommonResources\r\n): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\r\n return {\r\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\r\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\r\n updateQuantityButtonText: resources.updateQuantityButtonText,\r\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\r\n };\r\n}\r\n\r\n/**\r\n * Add to order template failed function.\r\n * @param callbacks -Buybox callbacks.\r\n * @param resources -Buybox common resources.\r\n * @param product -Simple product.\r\n * @returns Update error state.\r\n */\r\nconst onAddToOrderTemplateFailed = (callbacks: IBuyboxCallbacks, resources: IBuyboxCommonResources, product: SimpleProduct | undefined) => (\r\n result: IOrderTemplateActionErrorResult\r\n) => {\r\n callbacks.updateErrorState({\r\n errorHost: 'ORDER_TEMPLATE',\r\n configureErrors:\r\n result.status === 'MISSING_DIMENSION' ? getConfigureErrors(result.missingDimensions, resources, product?.IsGiftCard) : {}\r\n });\r\n};\r\n\r\nexport function getBuyboxProductAddToOrderTemplate(\r\n props: IBuyboxExtentedProps,\r\n state: IBuyboxState,\r\n callbacks: IBuyboxCallbacks\r\n): IBuyboxAddToOrderTemplateViewProps | undefined {\r\n const {\r\n id,\r\n typeName,\r\n context,\r\n data: {\r\n orderTemplates: { result: orderTemplates },\r\n customerInformation: { result: customerInformation }\r\n },\r\n resources\r\n } = props;\r\n\r\n const product = props.data.product?.result;\r\n\r\n const {\r\n errorState: { configureErrors, quantityError, customAmountError, otherError, errorHost },\r\n quantity\r\n } = state;\r\n\r\n // If custom amount is selected, add-to-orderTemplate is disabled\r\n if (state.isCustomPriceSelected) {\r\n return undefined;\r\n }\r\n const className = _getClassNamePrefix(typeName);\r\n\r\n return {\r\n ContainerProps: {\r\n className: `${className}__add-to-order-template-container`\r\n },\r\n button: product && orderTemplates && (\r\n \r\n ),\r\n errorBlock: (\r\n \r\n )\r\n };\r\n}\r\n\r\n/**\r\n * Renders add to comparison button for the given product.\r\n * @param productComparisonButton - React element of the button.\r\n * @param product - Product information.\r\n * @param catalogId - Current catalog.\r\n * @param state - Buybox state.\r\n * @returns React element of the button.\r\n */\r\nexport function getBuyboxProductComparisonButton(\r\n productComparisonButton: React.ReactNode,\r\n product: SimpleProduct,\r\n catalogId: number,\r\n state: IBuyboxState\r\n): JSX.Element | undefined {\r\n if (state.isCustomPriceSelected) {\r\n return undefined;\r\n }\r\n\r\n validateCatalogId(catalogId);\r\n return React.cloneElement(productComparisonButton as React.ReactElement, { product, catalogId });\r\n}\r\n\r\n/**\r\n * Add to wishlist failed function.\r\n * @param callbacks -Buybox callbacks.\r\n * @param resources -Buybox resources.\r\n * @param product -Simple product.\r\n * @returns Update error state.\r\n */\r\nconst onAddToWishlistFailed = (callbacks: IBuyboxCallbacks, resources: IBuyboxCommonResources, product: SimpleProduct | undefined) => (\r\n result: IWishlistActionErrorResult\r\n) => {\r\n callbacks.updateErrorState({\r\n errorHost: 'WISHLIST',\r\n configureErrors:\r\n result.status === 'MISSINGDIMENSION' ? getConfigureErrors(result.missingDimensions, resources, product?.IsGiftCard) : {}\r\n });\r\n};\r\n\r\nexport function getBuyboxProductAddToWishlist(\r\n props: IBuyboxExtentedProps,\r\n state: IBuyboxState,\r\n callbacks: IBuyboxCallbacks,\r\n productDetails?: IProductDetails\r\n): IBuyboxAddToWishlistViewProps | undefined {\r\n const {\r\n id,\r\n typeName,\r\n context,\r\n data: {\r\n wishlists: { result: wishlists }\r\n },\r\n resources\r\n } = props;\r\n\r\n const product = props.data.product?.result ? props.data.product.result : productDetails?.product;\r\n\r\n const {\r\n errorState: { configureErrors, quantityError, customAmountError, otherError, errorHost },\r\n selectedProduct\r\n } = state;\r\n\r\n // If custom amount is selected, add-to-wishlist is disabled\r\n if (state.isCustomPriceSelected) {\r\n return undefined;\r\n }\r\n\r\n const className = _getClassNamePrefix(typeName);\r\n\r\n return {\r\n ContainerProps: {\r\n className: `${className}__add-to-wishlist-container`\r\n },\r\n button: product && (\r\n \r\n ),\r\n errorBlock: (\r\n \r\n )\r\n };\r\n}\r\n\r\n/**\r\n * On quantity change function.\r\n * @param callbacks -Buybox callbacks.\r\n * @returns Update quantity.\r\n */\r\nconst onQuantityChangeHandler = (callbacks: IBuyboxCallbacks) => (newValue: number) => {\r\n if (callbacks.updateQuantity) {\r\n callbacks.updateQuantity(newValue);\r\n }\r\n};\r\n\r\nexport function getBuyboxProductQuantity(\r\n props: IBuyboxExtentedProps,\r\n state: IBuyboxState,\r\n callbacks: IBuyboxCallbacks\r\n): IBuyboxProductQuantityViewProps {\r\n const { resources, typeName } = props;\r\n\r\n const {\r\n quantity,\r\n max,\r\n errorState: { quantityError }\r\n } = state;\r\n\r\n const className = _getClassNamePrefix(typeName);\r\n\r\n return {\r\n ContainerProps: {\r\n className: `${className}__quantity`\r\n },\r\n LabelContainerProps: {\r\n tag: 'label',\r\n className: `${className}__product-quantity-label`,\r\n htmlFor: `${className}__product-quantity-input`\r\n },\r\n heading:
{resources.productQuantityHeading}
,\r\n errors: quantityError && (\r\n \r\n \r\n ),\r\n input: (\r\n \r\n )\r\n };\r\n}\r\n\r\nexport function getBuyboxShopSimilarButton(\r\n props: IBuyboxExtentedProps,\r\n buttonType: ShopSimiliarButtonType\r\n): IBuyboxShopSimilarLookViewProps {\r\n const { resources, context, typeName } = props;\r\n const product = props.data.product?.result;\r\n\r\n const className = _getClassNamePrefix(typeName);\r\n const navigationUrl = (shopSimiliarButtonType: ShopSimiliarButtonType) => () => {\r\n const searchURL = getUrlSync('search', context && context.actionContext);\r\n const separator = searchURL!.includes('?') ? '&' : '?';\r\n document.location.href = `${searchURL}${separator}productId=${product &&\r\n product.RecordId}&recommendation=${shopSimiliarButtonType}`;\r\n };\r\n const telemetryText =\r\n buttonType === ShopSimiliarButtonType.Looks ? TelemetryConstant.ShopSimliarLooks : TelemetryConstant.ShopSimliarDescription;\r\n const payLoad = getPayloadObject('click', telemetryContent, telemetryText);\r\n const attribute = getTelemetryAttributes(telemetryContent, payLoad);\r\n const text = buttonType === ShopSimiliarButtonType.Looks ? resources.shopSimilarLooksText : resources.shopSimilarDescriptionText;\r\n\r\n return {\r\n ContainerProps: {\r\n className: `${className}__shopsimilar${buttonType}`\r\n },\r\n input: (\r\n \r\n {text}\r\n \r\n )\r\n };\r\n}\r\n\r\n/**\r\n * On price change function.\r\n * @param callbacks -Buybox callbacks.\r\n * @returns Update key in price.\r\n */\r\nconst onPriceChangeHandler = (callbacks: IBuyboxCallbacks) => (event: React.ChangeEvent) => {\r\n const value = event.currentTarget.value;\r\n callbacks.updateKeyInPrice(value.length > 0 ? Number(value) : Number.parseFloat(value));\r\n};\r\n\r\nexport function getBuyboxKeyInPrice(\r\n props: IBuyboxExtentedProps,\r\n state: IBuyboxState,\r\n callbacks: IBuyboxCallbacks\r\n): IBuyboxKeyInPriceViewProps {\r\n const { config, resources } = props;\r\n\r\n const {\r\n errorState: {}\r\n } = state;\r\n\r\n const className = _getClassNamePrefix(props.typeName);\r\n\r\n return {\r\n ContainerProps: {\r\n className: `${className}__key_in_price`\r\n },\r\n LabelContainerProps: {\r\n tag: 'label',\r\n className: `${className}__key_in_price-label`,\r\n htmlFor: `${className}__key_in_price`\r\n },\r\n heading:
{resources.buyboxKeyInPriceLabelHeading}
,\r\n input: (\r\n \r\n )\r\n };\r\n}\r\n\r\nexport const BuyboxErrorBlock: React.FC = ({\r\n showError,\r\n configureErrors,\r\n quantityError,\r\n customAmountError,\r\n otherError,\r\n resources\r\n}) => {\r\n let errorMessages: (string | undefined)[] = [];\r\n\r\n errorMessages = Object.values(configureErrors).filter(message => message !== undefined);\r\n\r\n if (quantityError) {\r\n errorMessages.push(quantityError);\r\n }\r\n\r\n if (customAmountError) {\r\n errorMessages.push(customAmountError);\r\n }\r\n\r\n if (otherError) {\r\n errorMessages.push(otherError);\r\n }\r\n\r\n return (\r\n 0} color='danger' assertive aria-label={resources.buyboxErrorMessageHeader}>\r\n \r\n {errorMessages.map((message, index) => {\r\n return (\r\n
\r\n {message}\r\n
\r\n );\r\n })}\r\n
\r\n );\r\n};\r\n\r\nexport function getQuantityLimitsMessages(\r\n props: IBuyboxExtentedProps,\r\n state: IBuyboxState\r\n): React.ReactElement | undefined {\r\n const { resources } = props;\r\n\r\n const { min, max } = state;\r\n\r\n if (!_isOrderQuantityLimitsFeatureEnabled(props)) {\r\n return undefined;\r\n }\r\n\r\n return (\r\n \r\n {_renderMaxLabel(props, max, resources.maxQuantityText)}\r\n {_renderMinLabel(props, min, resources.minQuantityText)}\r\n \r\n );\r\n}\r\n\r\nexport const RetailDefaultOrderQuantityLimitsFeatureName: string = 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature';\r\n\r\nconst _renderMaxLabel = (\r\n props: IBuyboxExtentedProps,\r\n max: number | undefined,\r\n maxQuantityText: string\r\n): React.ReactElement | undefined => {\r\n const { resources, typeName } = props;\r\n const className = _getClassNamePrefix(typeName);\r\n if (max && max !== 0 && max !== Number.MAX_VALUE) {\r\n return (\r\n

\r\n {resources.informationIconText}\r\n