{"version":3,"file":"static/js/6e3035fac67440352a28.bundle.js","mappings":"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","sources":["webpack://mattressfirm/./src/Utilities/allRegex.ts?9889","webpack://mattressfirm/./src/Utilities/cart-utils.ts?6ba1","webpack://mattressfirm/./src/Utilities/constants.ts?8bdf","webpack://mattressfirm/./src/Utilities/emtpyChecker.ts?e2f5","webpack://mattressfirm/./src/Utilities/fallbackImageUrl.ts?ace7","webpack://mattressfirm/./src/Utilities/get-page-path.ts?590a","webpack://mattressfirm/./src/Utilities/get-product-badge.tsx?635b","webpack://mattressfirm/./src/Utilities/get-utag-product-category.ts?a69d","webpack://mattressfirm/./src/Utilities/get-utag-variant-id.ts?ea12","webpack://mattressfirm/./src/Utilities/get-view-port.tsx?4210","webpack://mattressfirm/./src/actions/get-unbxd-product-recommendations.action.ts?bae6","webpack://mattressfirm/./src/data-actions/buybox-get-all-variants-list.ts?6ad4","webpack://mattressfirm/./src/data-actions/get-sales-order-details-action.action.ts?5a8b","webpack://mattressfirm/./src/data-actions/utilities/utils.ts?7452","webpack://mattressfirm/./src/modules/mfrm-product-recommendation-carousel/components/unbxd-product-carousel-item.tsx?e1f8","webpack://mattressfirm/./src/modules/mfrm-product-recommendation-carousel/mfrm-product-recommendation-carousel.tsx?9766","webpack://mattressfirm/./src/Utilities/create-utag-queue.ts?1545","webpack://mattressfirm/./src/Utilities/ascendBy.ts?bcc1","webpack://mattressfirm/./src/Utilities/clear-array.ts?ce54","webpack://mattressfirm/./src/modules/mfrm-product-recommendation-carousel/mfrm-product-recommendation-carousel.view.tsx?e0c8","webpack://mattressfirm/./lib/mfrm-product-recommendation-carousel/module-registration.js?c63d","webpack://mattressfirm/external var \"React\"?0d3b","webpack://mattressfirm/external var \"ReactDOM\"?853b"],"sourcesContent":["import { ICoreContext } from '@msdyn365-commerce/core';\r\nexport const emailRegex = (emailValue: string) => {\r\n // eslint-disable-next-line security/detect-unsafe-regex\r\n const validationEmail = /^[-a-z0-9!#$%&'*+/=?^_`{|}~]+(?:\\.[-a-z0-9!#$%&'*+/=?^_`{|}~]+)*@(?:[a-z0-9]+(?:-+[a-z0-9]+)*\\.)+(?:xn--[a-z0-9]+|[a-z]{2,16})$/i;\r\n\r\n return validationEmail.test(emailValue);\r\n};\r\n\r\n/**\r\n * Method to remove special characters for product name from product URL\r\n * @param str string\r\n * @param ctx ICoreContext\r\n * @returns string\r\n */\r\n\r\nexport const removeSpecialChars = (str: string, ctx: ICoreContext): string => {\r\n if (ctx && ctx.request.app?.config.removeSpecialCharsPDP) {\r\n return str?.replace(/[^a-zA-Z0-9- ]/g, '');\r\n }\r\n return str;\r\n};\r\n\r\n\r\n/**\r\n * Method to remove special characters for product URL's path\r\n * @param str string\r\n * @param ctx ICoreContext\r\n * @returns string\r\n */\r\n\r\nexport const removeSpecialCharsFromURLPath = (str: string, ctx: ICoreContext): string => {\r\n if (ctx && ctx.request.app?.config.removeSpecialCharsPDP) {\r\n const urlPath = decodeURIComponent(str.split('.p')[0])?.replace(/[^a-zA-Z0-9-/ ]/g, '');\r\n return `${urlPath}.p`;\r\n }\r\n return str;\r\n};\r\n","import MsDyn365 from '@msdyn365-commerce/core';\r\nimport {IProductDetails,IProductBonusItems, IProductBonusWithBrandName } from '../modules/mfrm-cart/mfrm-cart';\r\nimport {IMFIBonusItemsResponse, IMFIGetBonusCouponsDetailsResponse} from '../actions/BonusItemDataServiceEntities.g';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\n\r\nexport interface IMFRMDateGroupedProducts {\r\n dateStr: string;\r\n days?: string;\r\n productVariantRecordIds: number[];\r\n productItemIds: string[];\r\n productsType: string;\r\n}\r\n\r\nexport interface IExpressFlow {\r\n paymentEdit: boolean\r\n}\r\n\r\nexport interface ICartProductPrice {\r\n variantRecordId: number;\r\n price: number;\r\n}\r\n\r\n/** interface for parcel inventory details */\r\nexport interface IParcelInventoryDetails {\r\n itemId: string | undefined;\r\n location: string | undefined;\r\n productId: string | undefined;\r\n quantity: string | undefined;\r\n}\r\n\r\nconst getSetLocalStorage = (key: string, getSet: string, valueToSet?: any, returnType?: any) => {\r\n if (MsDyn365.isBrowser) {\r\n switch (getSet) {\r\n case 'set':\r\n return localStorage.setItem(key, JSON.stringify(valueToSet || returnType));\r\n case 'get':\r\n return JSON.parse(localStorage.getItem(key) || '[]');\r\n default:\r\n return returnType;\r\n }\r\n } else {\r\n return returnType;\r\n }\r\n};\r\n\r\nexport const getSetProductData = (getSet: string, products?: IProductDetails[]) => {\r\n return getSetLocalStorage('product_details', getSet, products, []);\r\n};\r\n\r\nexport const getSetProductSpec = (getSet: string, products?: IProductDetails[]) => {\r\n return getSetLocalStorage('product_specification', getSet, products, []);\r\n};\r\n\r\nexport const getSetPromoCodeApplyList = (getSet: string) => {\r\n return getSetLocalStorage('promo_code_apply_list', getSet, [], []);\r\n};\r\n\r\nexport const getSetPromoCode = (getSet: string) => {\r\n return getSetLocalStorage('promoCode', getSet, [], []);\r\n};\r\n\r\nexport const getSetGrandTotal = (getSet: string, total?: string) => {\r\n return getSetLocalStorage('grand_total', getSet, total, 0);\r\n};\r\n\r\nexport const getSetBonusItemProd = (getSet: string, globalBonusItems?: IMFIBonusItemsResponse[])=>{\r\n return getSetLocalStorage('BonusItemProduct', getSet, globalBonusItems, []);\r\n};\r\n\r\nexport const getSetSelectedBonasItem = (getSet: string, bonusItemArray?: IProductBonusItems[]) => {\r\n return getSetLocalStorage('selectedBonasItems', getSet, bonusItemArray, []);\r\n};\r\n\r\nexport const getSetBonusCouponDetail = (getSet: string, getCoupons?: IMFIGetBonusCouponsDetailsResponse[])=>{\r\n return getSetLocalStorage('bonusCouponsDetail', getSet, getCoupons, []);\r\n};\r\n\r\nexport const getSetPrevBonasModalState = (getSet: string, previousBonasModal?: IProductBonusItems[]) => {\r\n return getSetLocalStorage('previousBonasModalState', getSet, previousBonasModal, []);\r\n};\r\n\r\nexport const getSetBonusItemBrandName = (getSet: string, bonusItemsBrandName?: IProductBonusWithBrandName[]) => {\r\n return getSetLocalStorage('bonusItmesWithBrand', getSet, bonusItemsBrandName, []);\r\n};\r\n\r\nexport const getSetDateGroupedProducts = (getSet: string, products?: IMFRMDateGroupedProducts[]) => {\r\n return getSetLocalStorage('date_grouped_products', getSet, products, []);\r\n};\r\n\r\nexport const getSetExpressFlow = (getSet: string, express?: IExpressFlow) => {\r\n return getSetLocalStorage('express_flow', getSet, express, []);\r\n};\r\nexport const getSetWmapCartLines = (getSet: string, products?: { product: SimpleProduct, count: number }[]) => {\r\n return getSetLocalStorage('wmapCartLines', getSet, products, []);\r\n};\r\n\r\nexport const getSetCartProductPrice = (getSet: string, priceDetails?: ICartProductPrice[]) => {\r\n return getSetLocalStorage('cart_product_price', getSet, priceDetails, []);\r\n};\r\nexport const getSetParcelInventoryData = (getSet: string, details?: IParcelInventoryDetails[]) => {\r\n return getSetLocalStorage('parcel_inventory_details', getSet, details, []);\r\n};","export const variantQueryStringName = 'variantid';","// tslint:disable\r\nexport const hasArray = (values: any): any[] | undefined => {\r\n return (typeof values !== 'string') && values && values.length ? values : undefined;\r\n};","import { IRequestContext } from '@msdyn365-commerce/core';\r\nimport { getFallbackImageUrl } from '../data-actions/utilities/utils';\r\n\r\nexport const urlFallBackImage = (imageUrl: string, itemId: string | undefined, apiSettings: IRequestContext) => {\r\n let fallbackImageUrl = getFallbackImageUrl(itemId, apiSettings?.apiSettings);\r\n if (imageUrl && fallbackImageUrl) {\r\n fallbackImageUrl = `${fallbackImageUrl},${imageUrl}`;\r\n }\r\n return fallbackImageUrl;\r\n};","import MsDyn365 from '@msdyn365-commerce/core';\r\n\r\nexport const getPagePath = (): string => {\r\n return MsDyn365.isBrowser\r\n ? window.location.href.split(location.host)[1].includes('?')\r\n ? window.location.href.split(location.host)[1].split('?')[0]\r\n : window.location.href.split(location.host)[1]\r\n : '';\r\n};","import { IImageSettings, Image, IRequestContext } from '@msdyn365-commerce/core';\r\nimport dayjs from 'dayjs';\r\nimport tz from 'dayjs/plugin/timezone';\r\nimport utc from 'dayjs/plugin/utc';\r\nimport isBetween from 'dayjs/plugin/isBetween';\r\ndayjs.extend(tz);\r\ndayjs.extend(utc);\r\ndayjs.extend(isBetween);\r\nimport React from 'react';\r\nimport { AttributeValue } from '@msdyn365-commerce/retail-proxy';\r\nconst format = 'M/D/YYYY H:m:s';\r\n\r\nexport interface IBadgeData {\r\n src: string;\r\n alt: string;\r\n start: dayjs.Dayjs;\r\n end: dayjs.Dayjs;\r\n}\r\n\r\nconst defaultImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: `m=6`, w: 0, h: 0 }\r\n },\r\n disableLazyLoad: true\r\n};\r\n\r\nexport const parseBadgeData = (badgeData: string, requestContext: IRequestContext): IBadgeData | undefined => {\r\n let dataSegments;\r\n let scheduleStart;\r\n let scheduleEnd;\r\n let badgeType;\r\n let parsedScheduleStart;\r\n let startDate;\r\n let startTime;\r\n let parsedScheduleEnd;\r\n let endDate;\r\n let endTime;\r\n\r\n try {\r\n // split the data into its segments\r\n dataSegments = badgeData.split('#');\r\n scheduleStart = dataSegments[0];\r\n scheduleEnd = dataSegments[1];\r\n badgeType = dataSegments[2];\r\n\r\n // parse schedule start\r\n parsedScheduleStart = scheduleStart.split('_');\r\n startDate = parsedScheduleStart[0];\r\n startTime = parsedScheduleStart[1];\r\n\r\n // parse schedule end\r\n parsedScheduleEnd = scheduleEnd.split('_');\r\n endDate = parsedScheduleEnd[0];\r\n endTime = parsedScheduleEnd[1];\r\n } catch (e) {\r\n return;\r\n }\r\n\r\n const startMoment = `${startDate} ${startTime?.replace(/-/g, \":\")}`;\r\n const endMoment = `${endDate} ${endTime?.replace(/-/g, \":\")}`;\r\n\r\n const startMomentFormatted = dayjs(startMoment?.replace(/-/g, \"/\"));\r\n const endMomentFormatted = dayjs(endMoment?.replace(/-/g, \"/\"));\r\n\r\n // check if schedule is valid\r\n if (!(startMomentFormatted.isValid() && endMomentFormatted.isValid())) {\r\n return;\r\n }\r\n\r\n // parse badge type and create image src\r\n const baseUrl = requestContext.apiSettings.baseImageUrl.substring(0, requestContext.apiSettings.baseImageUrl.length - 1);\r\n if (badgeType) {\r\n const removed$ = badgeType.substring(1, badgeType.length - 1);\r\n const parsedBadgeType = removed$?.replace(' ', '-').toLowerCase();\r\n\r\n // remove page name portion\r\n const altText = removed$.split('-')[0];\r\n\r\n const src = `${baseUrl}${parsedBadgeType}.png`;\r\n return {\r\n src: src,\r\n alt: altText,\r\n start: convertTimeZone(startMomentFormatted),\r\n end: convertTimeZone(endMomentFormatted)\r\n };\r\n } else {\r\n return;\r\n }\r\n};\r\n\r\n// convert given time to Central Time (CT)\r\nconst convertTimeZone = (time: dayjs.Dayjs): dayjs.Dayjs => {\r\n return dayjs(time.format(format), format).tz('America/Chicago').local();\r\n};\r\n\r\nexport const buildProductBadge = (parsedBadgeData: IBadgeData, requestContext: IRequestContext): JSX.Element | undefined => {\r\n // only build image if it is scheduled\r\n const isScheduled = dayjs().isBetween(parsedBadgeData.start, parsedBadgeData.end);\r\n\r\n if (isScheduled) {\r\n return (\r\n \r\n );\r\n }\r\n\r\n return undefined;\r\n};\r\n\r\nexport const renderProductBadge = (\r\n attributeName: string | undefined,\r\n requestContext: IRequestContext\r\n): JSX.Element | undefined => {\r\n const badgeData = attributeName;\r\n if (!badgeData) {\r\n return;\r\n }\r\n // split badge data into its separate badges\r\n const badges = badgeData.split(',');\r\n // parse badge data to get its schedule and image src\r\n const parsedBadges = badges.map(badge => parseBadgeData(badge, requestContext));\r\n\r\n // build product badge image components\r\n const finalizedBadges = parsedBadges.map(parsedBadge => parsedBadge && buildProductBadge(parsedBadge, requestContext));\r\n\r\n return finalizedBadges ? <>{finalizedBadges} : <>;\r\n};\r\n\r\nexport const renderProductBadgeByFilteringAttributes = (\r\n attributeName: string | undefined,\r\n attributes: AttributeValue[] | undefined,\r\n requestContext: IRequestContext\r\n): JSX.Element | undefined => {\r\n const badgeData =\r\n attributeName &&\r\n attributes?.find(\r\n currAttribute => currAttribute.Name && currAttribute.Name.toLowerCase().trim() === attributeName.toLowerCase().trim()\r\n )?.TextValue;\r\n if (!badgeData) {\r\n return;\r\n }\r\n\r\n // split badge data into its separate badges\r\n const badges = badgeData.split(',');\r\n\r\n // parse badge data to get its schedule and image src\r\n const parsedBadges = badges.map(badge => parseBadgeData(badge, requestContext));\r\n // build product badge image components\r\n const finalizedBadges = parsedBadges.map(parsedBadge => parsedBadge && buildProductBadge(parsedBadge, requestContext));\r\n\r\n return finalizedBadges && <>{finalizedBadges};\r\n};\r\n","import { getCategoryPathsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { IActionContext } from '@msdyn365-commerce/core-internal';\r\nexport const getUtagProductCategory = async (actionContext: IActionContext, channelId: number, catalogId: number = 0, RecordId: number) => {\r\n //context, channelId, catalogId, categoryPathLookups\r\n const categoryPathResults = await getCategoryPathsAsync(\r\n { callerContext: actionContext, queryResultSettings: {} },\r\n channelId,\r\n catalogId,\r\n [{ ProductId: RecordId }]\r\n );\r\n const categoryPath = categoryPathResults[0]?.CategoryPath?.[0] && categoryPathResults[0].CategoryPath[0];\r\n if (!categoryPath?.Segments?.length) {\r\n return [];\r\n }\r\n return [categoryPath.Segments[categoryPath.Segments.length - 1].CategoryName!];\r\n};\r\n","import { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport getAllProductVariants, { BuyboxGetDimensionVariantAvailabilityInput } from '../data-actions/buybox-get-all-variants-list';\r\nimport { IActionContext } from '@msdyn365-commerce/core-internal';\r\n\r\nexport const getUtagVariantId = async (\r\n MasterProductId: number,\r\n channelId: number,\r\n actionContext: IActionContext,\r\n RecordId: number,\r\n ItemId: string\r\n) => {\r\n if (MasterProductId && MasterProductId > 0) {\r\n const input = new BuyboxGetDimensionVariantAvailabilityInput(MasterProductId, channelId);\r\n const variantsResp: SimpleProduct[] = await getAllProductVariants(input, actionContext);\r\n for (let variantIter = 0; variantIter < variantsResp.length; variantIter++) {\r\n if (variantsResp[variantIter].RecordId === RecordId) {\r\n const ePropsVariant = variantsResp[variantIter].ExtensionProperties!;\r\n if (ePropsVariant?.length > 0) {\r\n for (let eIter = 0; eIter < ePropsVariant?.length; eIter++) {\r\n if (ePropsVariant[eIter].Key === 'RetailVariantId') {\r\n return [ePropsVariant[eIter].Value?.StringValue];\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n const variantofId = `V000${ItemId}`;\r\n return [variantofId?.slice(0, -1)];\r\n};\r\n\r\nexport const getUtagRetailVariantIdAndRecId = async (\r\n MasterProductId: number,\r\n channelId: number,\r\n actionContext: IActionContext,\r\n RecordId: number,\r\n ItemId: string\r\n) => {\r\n if (MasterProductId && MasterProductId > 0) {\r\n const input = new BuyboxGetDimensionVariantAvailabilityInput(MasterProductId, channelId);\r\n const variantsResp: SimpleProduct[] = await getAllProductVariants(input, actionContext);\r\n for (let variantIter = 0; variantIter < variantsResp.length; variantIter++) {\r\n if (variantsResp[variantIter].RecordId === RecordId) {\r\n const ePropsVariant = variantsResp[variantIter].ExtensionProperties!;\r\n if (ePropsVariant?.length > 0) {\r\n for (let eIter = 0; eIter < ePropsVariant?.length; eIter++) {\r\n if (ePropsVariant[eIter].Key === 'RetailVariantId') {\r\n return { 'retailVariantId': ePropsVariant[eIter].Value?.StringValue, 'recordId': RecordId };\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n const variantofId = `V000${ItemId}`;\r\n return { 'retailVariantId': variantofId?.slice(0, -1), 'recordId': RecordId };\r\n};\r\n","import MsDyn365, { ICoreContext } from '@msdyn365-commerce/core';\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\nconst _getViewPort = (context: ICoreContext): GridSize => {\r\n if (MsDyn365.isBrowser && window.innerWidth) {\r\n const gridSettings = context.request.gridSettings;\r\n if (gridSettings) {\r\n if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\r\n return 'xs';\r\n } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\r\n return 'sm';\r\n } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\r\n return 'md';\r\n } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\r\n return 'lg';\r\n } else {\r\n return 'xl';\r\n }\r\n }\r\n }\r\n return 'xs';\r\n};\r\n\r\nexport default _getViewPort;\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 Cookies from 'universal-cookie';\r\n\r\nexport interface ICategoryLevelNamesData {\r\n categoryLevelName?: string;\r\n}\r\nexport class GetUnbxdRecommendationsDataInput implements Msdyn365.IActionInput {\r\n public pageType?: string | undefined;\r\n public widgetNumber?: string | undefined;\r\n public productID?: string | undefined;\r\n public catLevels?: ICategoryLevelNamesData[] | undefined;\r\n public cartItemIDs?: (string | undefined)[] | undefined;\r\n private currentCategories: string;\r\n\r\n constructor(pageType?: string | undefined, widgetNumber?: string | undefined, productID?: string | undefined, catLevels?: ICategoryLevelNamesData[] | undefined, cartItemIDs?: (string | undefined)[] | undefined) {\r\n this.pageType = pageType;\r\n this.widgetNumber = widgetNumber;\r\n this.productID = productID;\r\n this.catLevels = catLevels;\r\n this.cartItemIDs = cartItemIDs;\r\n this.currentCategories = '';\r\n catLevels?.forEach(catLevel => {\r\n this.currentCategories = catLevel?.categoryLevelName ? this.currentCategories.concat(`${catLevel?.categoryLevelName}-`) : this.currentCategories;\r\n });\r\n }\r\n\r\n public getCacheKey = () => `Unbxd-recommendation-data-${this.pageType}-${this.widgetNumber}-${this.currentCategories}`;\r\n public getCacheObjectType = () => 'Unbxd-recommendation-data';\r\n public dataCacheType = (): Msdyn365.CacheType => 'request';\r\n}\r\n\r\n/**\r\n * Use this function to call your action and process the results as needed\r\n */\r\nasync function getUnbxdRecommendationData(input: GetUnbxdRecommendationsDataInput, ctx: Msdyn365.IActionContext): Promise {\r\n const cookies = new Cookies();\r\n const unbxdUid = cookies.get('unbxd.userId');\r\n const pageType = input?.pageType ? input.pageType.toUpperCase() : \"\";\r\n const productID = input?.productID ? input.productID : \"\";\r\n const catLevels = input?.catLevels ? input.catLevels : [];\r\n const cartItemIDs = input?.cartItemIDs ? input.cartItemIDs : [];\r\n const unbxdApiKey = ctx.requestContext.app.config.unbxdApiKey;\r\n const unbxdSiteKey = ctx.requestContext.app.config.unbxdSiteKey;\r\n\r\n if (!pageType) {\r\n return null;\r\n }\r\n try {\r\n let unbxdUrl = \"\";\r\n switch (pageType) {\r\n case \"HOME\":\r\n unbxdUrl = `https://recommendations.unbxd.io/v2.0/${unbxdApiKey}/${unbxdSiteKey}/items?pageType=${pageType}&uid=${unbxdUid}`;\r\n break;\r\n case \"CATEGORY\":\r\n const catnames = catLevels.map((catName, index) => {\r\n return `&catlevel${index + 1}Name=${catName ? catName.categoryLevelName : ''}`;\r\n }).join('');\r\n\r\n unbxdUrl = `https://recommendations.unbxd.io/v2.0/${unbxdApiKey}/${unbxdSiteKey}/items?pageType=${pageType}${catnames}&uid=${unbxdUid}`;\r\n break;\r\n case \"PRODUCT\":\r\n unbxdUrl = `https://recommendations.unbxd.io/v2.0/${unbxdApiKey}/${unbxdSiteKey}/items?pageType=${pageType}&id=${productID}&uid=${unbxdUid}`;\r\n break;\r\n case \"CART\":\r\n const productitemIds = cartItemIDs.map((itemId) => {\r\n return `&id=${itemId}`;\r\n }).join('');\r\n\r\n unbxdUrl = `https://recommendations.unbxd.io/v2.0/${unbxdApiKey}/${unbxdSiteKey}/items?pageType=${pageType}${productitemIds}&uid=${unbxdUid}`;\r\n break;\r\n default:\r\n unbxdUrl = '';\r\n }\r\n const response = await Msdyn365.sendRequest(unbxdUrl, 'get');\r\n if (response.data && response.headers) {\r\n const recsData={\r\n \"unbxdRequestId\":response.headers[\"x-request-id\"]? response.headers[\"x-request-id\"]:'',\r\n \"unbxdRecs\":response.data[input.widgetNumber!.toLowerCase()]\r\n };\r\n return recsData;\r\n }\r\n else { return null; }\r\n } catch (e) {\r\n return null;\r\n }\r\n}\r\n\r\nexport default Msdyn365.createObservableDataAction({\r\n action: >getUnbxdRecommendationData,\r\n id: 'getUnbxdRecommendationData'\r\n});\r\n","/*---------------------------------------------------------------------------------------------\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\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\nimport { getByIdAsync, getVariantsByDimensionValuesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\n\r\n// tslint:disable-next-line: completed-docs\r\nexport class BuyboxGetDimensionVariantAvailabilityInput implements IActionInput {\r\n public channelId: number;\r\n public productId: number;\r\n constructor(productId: number, channelId: number) {\r\n this.channelId = channelId;\r\n this.productId = productId;\r\n }\r\n public getCacheKey = () => `AllMFRMProductVariantIDs-${this.productId}`;\r\n public getCacheObjectType = () => 'AllMFRMProductVariantIDs';\r\n public dataCacheType = (): CacheType => 'application';\r\n}\r\n\r\nexport interface IBuyboxGetDimensionVariantAvailabilityActionData {\r\n variantID: number;\r\n dimensionRecordID: number;\r\n itemID: string;\r\n sizeValue: string;\r\n isAvailable: boolean;\r\n}\r\n\r\nconst createInput = (inputData: ICreateActionContext>): IActionInput => {\r\n if (inputData && inputData.requestContext && inputData.requestContext.query && inputData.requestContext.query.productId) {\r\n return new BuyboxGetDimensionVariantAvailabilityInput(\r\n +inputData.requestContext.query.productId,\r\n +inputData.requestContext.apiSettings.channelId\r\n );\r\n } else if (inputData && inputData.requestContext && inputData.requestContext.urlTokens && inputData.requestContext.urlTokens.itemId) {\r\n return new BuyboxGetDimensionVariantAvailabilityInput(\r\n +inputData.requestContext.urlTokens.itemId,\r\n +inputData.requestContext.apiSettings.channelId\r\n );\r\n } else if (inputData && inputData.config && inputData.config.productId) {\r\n return new BuyboxGetDimensionVariantAvailabilityInput(inputData.config.productId, inputData.requestContext.apiSettings.channelId);\r\n } else {\r\n throw new Error('Unable to create SelectedVariantInput, no productId found on module config or query');\r\n }\r\n};\r\n\r\nexport async function getAllVariantsForProduct(\r\n input: BuyboxGetDimensionVariantAvailabilityInput,\r\n ctx: IActionContext\r\n): Promise {\r\n const productResponse = await getByIdAsync(\r\n { callerContext: ctx, queryResultSettings: { Paging: { Top: 1 } } },\r\n input.productId,\r\n input.channelId\r\n );\r\n const baseProduct = Array.isArray(productResponse) ? productResponse[0] : productResponse;\r\n try {\r\n return await getVariantsByDimensionValuesAsync(\r\n { callerContext: ctx, queryResultSettings: { Paging: { Top: 500 } } },\r\n baseProduct.MasterProductId || input.productId,\r\n input.channelId,\r\n []\r\n );\r\n } catch (error) {\r\n ctx.telemetry.exception(error);\r\n throw new Error('[IBuyboxGetDimensionPricingActionData]Unable to retieve data');\r\n }\r\n}\r\n\r\nexport default createObservableDataAction({\r\n action: >getAllVariantsForProduct,\r\n input: createInput\r\n});\r\n","import { buildCacheKey, getSimpleProducts, ProductInput } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { CacheType, createObservableDataAction, IAction, IActionContext, IActionInput, ICommerceApiSettings, ICreateActionContext } from '@msdyn365-commerce/core';\r\nimport { ProductDeliveryOptions, SalesOrder, SimpleProduct, TransactionType } from '@msdyn365-commerce/retail-proxy';\r\nimport { getDeliveryOptionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { getSalesOrderDetailsBySalesIdAsync, getSalesOrderDetailsByTransactionIdAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/SalesOrdersDataActions.g';\r\n\r\ninterface ISalesOrderWithHydrations {\r\n salesOrder: SalesOrder;\r\n products: SimpleProduct[];\r\n productDeliveryOptions?: ProductDeliveryOptions[];\r\n}\r\n\r\n/**\r\n * orderTypes Types of orders\r\n */\r\nexport const enum orderTypes {\r\n salesOrder = 'salesOrder',\r\n transaction = 'transaction'\r\n}\r\n\r\n/**\r\n * Calls the Retail API and returns the sales order\r\n */\r\nconst getSalesOrder = (orderType: string = '', orderId: string = '') => async (ctx: IActionContext): Promise => {\r\n return orderType === orderTypes.salesOrder\r\n ? getSalesOrderDetailsBySalesIdAsync({ callerContext: ctx }, orderId)\r\n : // Local (1) searches the retail server database, and remote (2) searches\r\n // on the headquarters side. All (3) and none (0) are not supported.\r\n getSalesOrderDetailsByTransactionIdAsync({ callerContext: ctx }, orderId, 1);\r\n};\r\n\r\n/**\r\n * Calls the Retail API and returns the products\r\n */\r\nconst getProducts = (productIds: number[] = [], channelId?: number) => async (ctx: IActionContext): Promise => {\r\n const productInputs = productIds.map(productId => new ProductInput(productId, ctx.requestContext.apiSettings, channelId));\r\n return getSimpleProducts(productInputs, ctx);\r\n};\r\n\r\n/**\r\n * Action input\r\n */\r\nexport class GetSalesOrderWithHydrationsInput implements IActionInput {\r\n public orderType: string;\r\n public orderId: string;\r\n private apiSettings: ICommerceApiSettings;\r\n\r\n constructor(orderType: string , orderId: string, apiSettings: ICommerceApiSettings) {\r\n this.orderType = orderType;\r\n this.orderId = orderId;\r\n this.apiSettings = apiSettings;\r\n }\r\n\r\n public getCacheKey = () => buildCacheKey(`SalesOrderWithHydrations`, this.apiSettings);\r\n public getCacheObjectType = () => `SalesOrderWithHydrations-${this.orderType}-${this.orderId}`;\r\n public dataCacheType = (): CacheType => 'request';\r\n}\r\n\r\n/**\r\n * Creates the input required to make the retail api call\r\n */\r\nconst createSalesOrderWithHydrationsInput = (inputData: ICreateActionContext) => {\r\n const { salesId = '', transactionId = '' } = (inputData.requestContext.query && inputData.requestContext.query) || {};\r\n if (salesId) {\r\n return new GetSalesOrderWithHydrationsInput(orderTypes.salesOrder, salesId, inputData.requestContext.apiSettings);\r\n } else if (transactionId) {\r\n return new GetSalesOrderWithHydrationsInput(orderTypes.transaction, transactionId, inputData.requestContext.apiSettings);\r\n }\r\n throw new Error(`createSalesOrderWithHydrationsInput - No salesId or transactionId provided.`);\r\n};\r\n\r\n/**\r\n * Get sales order with hydrations action\r\n */\r\nexport async function getSalesOrderWithHydrationsAction(\r\n input: GetSalesOrderWithHydrationsInput,\r\n ctx: IActionContext\r\n): Promise {\r\n if (!ctx) {\r\n throw new Error(`getSalesOrderWithHydrationsAction - Action context cannot be null/undefined`);\r\n }\r\n\r\n const { orderType, orderId } = input;\r\n\r\n if (!orderType || !orderId) {\r\n ctx.trace(`[getSalesOrderWithHydrationsAction] No orderType or orderId provided.`);\r\n return {};\r\n }\r\n\r\n const salesOrder = await getSalesOrder(orderType, orderId)(ctx);\r\n\r\n if (!salesOrder) {\r\n ctx.trace(`[getSalesOrderWithHydrationsAction] No salesOrder found.`);\r\n return {};\r\n }\r\n\r\n // If it is salesInvoice, return salesOrder and empty products\r\n // tslint:disable-next-line:prefer-type-cast\r\n if (salesOrder.TransactionTypeValue === 15 as TransactionType.SalesInvoice) {\r\n return {\r\n salesOrder,\r\n products: []\r\n };\r\n }\r\n\r\n if (!salesOrder.SalesLines || !salesOrder.SalesLines.length) {\r\n ctx.trace(`[getSalesOrderWithHydrationsAction] No salesLine found.`);\r\n return {};\r\n }\r\n\r\n const productIds: number[] = salesOrder.SalesLines.map(salesLine => salesLine.ProductId || 0).filter(productId => productId);\r\n\r\n if (!productIds || !productIds.length) {\r\n ctx.trace(`[getSalesOrderWithHydrationsAction] No productId in saleLines found.`);\r\n return {};\r\n }\r\n\r\n const products = await getProducts(productIds, salesOrder.ChannelId)(ctx);\r\n if (!products || !products.length) {\r\n ctx.trace(`[getSalesOrderWithHydrationsAction] No product found.`);\r\n return {};\r\n }\r\n\r\n const deliveryOptions = await getDeliveryOptionsAsync({ callerContext: ctx, queryResultSettings: {} }, products.map(x => x.RecordId), {}, 4)\r\n .then(result => {\r\n return result;\r\n }).catch((error: Error) => {\r\n ctx.trace(error.message);\r\n ctx.telemetry.exception(error);\r\n ctx.telemetry.debug(`[getDeliveryOptionsForCartLineItems]Error executing action`);\r\n throw new Error('[getDeliveryOptionsForCartLineItems]Error executing action');\r\n });\r\n\r\n return {\r\n salesOrder,\r\n products,\r\n deliveryOptions\r\n };\r\n}\r\n\r\nexport const getSalesOrderWithHydrationsActionDataAction = createObservableDataAction({\r\n id: 'mfrm-get-sales-order-with-hydrations',\r\n action: >getSalesOrderWithHydrationsAction,\r\n input: createSalesOrderWithHydrationsInput\r\n});\r\n\r\nexport default getSalesOrderWithHydrationsActionDataAction;","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IAny, ICommerceApiSettings, ICoreContext, ICreateActionContext, IGeneric, IRequestContext } from '@msdyn365-commerce/core';\r\nimport {\r\n AsyncResult, CartLine, CommerceListLine, ProductDimension,\r\n ProductDimensionType, ProductSearchResult, SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { ProductDetailsCriteria, InventoryLevels, ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { variantQueryStringName } from '../../Utilities/constants';\r\n// import { parseSearchData } from '@msdyn365-commerce-modules/retail-actions/src/utilities/input-data-parser';\r\n\r\nexport const wrapInResolvedAsyncResult = (input: T | null | undefined): AsyncResult => {\r\n return >{\r\n status: 'SUCCESS',\r\n result: input,\r\n metadata: {}\r\n };\r\n};\r\n\r\nexport const wrapInRejectedAsyncResult = (input: T | null | undefined): AsyncResult => {\r\n return >{\r\n status: 'FAILED',\r\n result: input,\r\n metadata: {}\r\n };\r\n};\r\n\r\n\r\n/**\r\n * Utility function to extract the active productId in the following priority:\r\n * First query param (productId), then UrlToken (itemId), then module config.\r\n * @param inputData - The Action Input data.\r\n * @returns Productid or undefined.\r\n */\r\nexport const getSelectedProductIdFromActionInput = (inputData: ICreateActionContext>): string | undefined => {\r\n const context = inputData.requestContext;\r\n const variantId = context.app.config.queryBasedVariantSelection ? getQueryParamsFromQueryByName(context.url.requestUrl, variantQueryStringName) : undefined;\r\n\r\n if (variantId) {\r\n return variantId;\r\n } else if (context.query?.productId) {\r\n return context.query.productId;\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Exsiting code.\r\n } else if (context.urlTokens && inputData.requestContext.urlTokens.itemId && inputData.requestContext.urlTokens.pageType === 'Product') {\r\n return context.urlTokens.itemId;\r\n } else if (inputData && inputData.config && inputData.config.productId) {\r\n return inputData.config.productId;\r\n }\r\n return undefined;\r\n};\r\n\r\nexport const getQueryParamsFromQueryByName = (inputUrl: URL, queryParamName: string) => {\r\n const urlWithIgnoredCase = new URL(inputUrl.toString().toLocaleLowerCase());\r\n const urlParameters = urlWithIgnoredCase.searchParams;\r\n const value = urlParameters.get(queryParamName.trim().toLocaleLowerCase());\r\n if (!value || Number.isNaN(Number(value))) {\r\n return undefined;\r\n }\r\n return value;\r\n};\r\n/**\r\n * Generates a Image URL based on data return from retail server.\r\n * @param imageUrl The image url returned by Retail Server.\r\n * @param ctx The request context.\r\n * @param apiSettings\r\n */\r\nexport const generateImageUrl = (imageUrl: string | undefined, apiSettings: ICommerceApiSettings): string | undefined => {\r\n if (imageUrl) {\r\n // Images hosted in CMS include schema\r\n if (imageUrl.startsWith('http')) {\r\n return imageUrl;\r\n }\r\n\r\n // Images hosted in Retail Server must be encoded and joined with the base image url\r\n return apiSettings.baseImageUrl + encodeURIComponent(imageUrl);\r\n }\r\n\r\n // D365Commerce.telemetry.warning(`Unable to generate a proper Image URL for Product: ${product.RecordId}`);\r\n return undefined;\r\n\r\n};\r\n\r\n/**\r\n * Represents app configuration for dimensions.\r\n */\r\nexport interface IDimensionsConfig {\r\n dimensionsAsSwatchType?: DimensionTypes[];\r\n dimensionsInProductCard?: DimensionTypes[];\r\n inventoryLevel?: InventoryLevels;\r\n dimensionToPreSelectInProductCard?: DimensionTypes;\r\n}\r\n\r\n/**\r\n * Represents app configuration for dimensions.\r\n */\r\nexport interface IDimensionsApp {\r\n config: IDimensionsConfig;\r\n}\r\n\r\n/**\r\n * Represents product dimension types.\r\n */\r\nexport enum DimensionTypes {\r\n none = 'none',\r\n color = 'color',\r\n configuration = 'configuration',\r\n size = 'size',\r\n style = 'style'\r\n}\r\n\r\n/**\r\n * Defines display configuration types.\r\n */\r\nexport enum DimensionSwatchDisplayTypes {\r\n default = 'default',\r\n productCard = 'productCard'\r\n}\r\n\r\n/**\r\n * Checks if rendering the particular dimensions is allowed.\r\n * @param dimensionType - Dimension to be displayed.\r\n * @param context - Core application context.\r\n * @param displayType - The swatch location, the component from which it comes from.\r\n * @returns Updates the state with new product page url.\r\n */\r\nexport const checkIfShouldDisplayAsSwatch = (\r\n dimensionType: DimensionTypes,\r\n context: ICoreContext,\r\n displayType: DimensionSwatchDisplayTypes = DimensionSwatchDisplayTypes.default): boolean => {\r\n\r\n // Additional checks for the product card since it has a separate config setting.\r\n if (displayType === DimensionSwatchDisplayTypes.productCard) {\r\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\r\n if (!ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) ||\r\n dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) ||\r\n !dimensionsToDisplayOnProductCard.includes(dimensionType)) {\r\n return false;\r\n }\r\n }\r\n\r\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\r\n return ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\r\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none) &&\r\n dimensionsToDisplayAsSwatch.includes(dimensionType);\r\n};\r\n\r\n/**\r\n * Generates an image URL for a swatch.\r\n * @param imageUrl - The image url returned by Retail Server.\r\n * @param apiSettings - The request context.\r\n * @returns Full image url.\r\n */\r\nexport const generateSwatchImageUrl = (imageUrl: string, apiSettings: ICommerceApiSettings): string => {\r\n if (imageUrl.startsWith('http')) {\r\n return imageUrl;\r\n }\r\n\r\n return apiSettings.baseImageUrl + encodeURIComponent(imageUrl);\r\n};\r\n\r\n/**\r\n * Generates a Image URL for a product based on data return from retail server.\r\n * @param product The Product returned by Retail Server.\r\n * @param ctx The request context.\r\n * @param apiSettings\r\n */\r\nexport const generateProductImageUrl = (\r\n product: SimpleProduct | ProductSearchResult,\r\n apiSettings: ICommerceApiSettings\r\n): string | undefined => {\r\n return generateImageUrl(product.PrimaryImageUrl, apiSettings);\r\n};\r\n\r\n/**\r\n * Creates a CartLine object from the passed data.\r\n * @param product The product.\r\n * @param quantity The quantity.\r\n * @param catalogId The catalog.\r\n */\r\nexport const buildCartLine = (product: SimpleProduct, quantity?: number, catalogId?: number): CartLine => {\r\n return {\r\n CatalogId: catalogId || 0,\r\n Description: product.Description,\r\n\r\n // TODO: Investigate this value and what it represents\r\n EntryMethodTypeValue: 3,\r\n ItemId: product.ItemId,\r\n ProductId: product.RecordId,\r\n Quantity: quantity || 1,\r\n TrackingId: '',\r\n UnitOfMeasureSymbol: product.DefaultUnitOfMeasure\r\n };\r\n};\r\n\r\n/**\r\n * Creates a CommerceListLine (also know as WishlistLine) object from the passed data.\r\n * @param productId The RecordId of the Product to be added.\r\n * @param customerId The account number of the customer.\r\n * @param wishlistId The Id of the commerce list.\r\n */\r\nexport const buildWishlistLine = (productId: number, customerId: string, wishlistId: number): CommerceListLine => {\r\n return {\r\n CommerceListId: wishlistId,\r\n ProductId: productId,\r\n CustomerId: customerId\r\n };\r\n};\r\n\r\n/**\r\n * Utility function to prepare the product details criteria before getting full product:\r\n * @param inputData The Action Input data\r\n */\r\nexport const getProductDetailsCriteriaFromActionInput = (inputData: ICreateActionContext>): ProductDetailsCriteria => {\r\n if (inputData && inputData.config) {\r\n return {\r\n getPrice: !inputData.config.hidePrice,\r\n getRating: !inputData.config.hideRating\r\n };\r\n }\r\n return {\r\n getPrice: true,\r\n getRating: true\r\n };\r\n};\r\n\r\n/**\r\n * Transforms search text into the expected 'search terms' format, expected by refiner APIs.\r\n * @param searchText Free-form text used for searching for products or categories of products.\r\n */\r\nexport const ensureSearchTextIsFormedProperly = (searchText: string): string => {\r\n const prefix = searchText.startsWith('\\'') ? '' : '\\'';\r\n const suffix = searchText.endsWith('\\'') ? '' : '\\'';\r\n return `${prefix}${searchText}${suffix}`;\r\n};\r\n\r\nexport const ensureSafeSearchText = (searchText: string): string => {\r\n return searchText?.replace(/[^\\d\\sA-Za-z]+/g, '');\r\n};\r\n\r\nexport const buildCacheKey = (base: string, apiSettings: ICommerceApiSettings, locale?: string): string => {\r\n return `${base}-chanId:${apiSettings.channelId}-catId:${apiSettings.catalogId}${locale ? `-${locale}` : ''}`;\r\n};\r\n\r\nexport const buildCacheKeyWithUrlTokens = (base: string, requestContext: IRequestContext): string => {\r\n const urlTokens = requestContext.urlTokens;\r\n const defaultCacheKey = buildCacheKey(base, requestContext.apiSettings, requestContext.locale);\r\n return urlTokens ? `${defaultCacheKey}-${urlTokens.itemId}-${urlTokens.recordId}-${urlTokens.pageType}` : defaultCacheKey;\r\n};\r\n\r\n/**\r\n * Generates a key from set of arguments as inputs.\r\n *\r\n * @param args Argument list of pivots to generate key from.\r\n * @param handler Handler function for null/undefined values.\r\n */\r\n\r\ntype TKeyTypes = string | number | boolean | null | undefined;\r\ninterface IGenerateKeyOptions {\r\n separator?: string;\r\n handler?(input: null | undefined): string;\r\n}\r\nexport const generateKey = (args: TKeyTypes[], options?: IGenerateKeyOptions): string => {\r\n const { handler, separator }: IGenerateKeyOptions = { ...{ separator: '-', handler: undefined }, ...(options || {}) };\r\n return args\r\n .map(arg => {\r\n if (arg === null || arg === undefined) {\r\n if (handler) {\r\n return handler(arg);\r\n }\r\n }\r\n return arg;\r\n })\r\n .join(separator);\r\n};\r\n\r\n/**\r\n * Gets the fall back image url for a variant image.\r\n * @param itemId Item id of a product.\r\n * @param apiSettings Api setting from request context.\r\n */\r\nexport const getFallbackImageUrl = (itemId: string | undefined, apiSettings: ICommerceApiSettings): string | undefined => {\r\n if (!itemId) {\r\n return '';\r\n }\r\n\r\n const parsedItemId = itemId.trim().split(' ')[0];\r\n\r\n const productUrl = `Products/${parsedItemId}_000_001.png`;\r\n return generateImageUrl(productUrl, apiSettings);\r\n};\r\n\r\n/**\r\n * Converts retail proxy product dimension type to display dimension type.\r\n * @param productDimensionType - Product dimension type from retail proxy.\r\n * @returns Local dimension type.\r\n */\r\nexport const convertProductDimensionTypeToDimensionTypes = (productDimensionType: ProductDimensionType): DimensionTypes => {\r\n switch (productDimensionType) {\r\n case ProductDimensionType.Color:\r\n return DimensionTypes.color;\r\n case ProductDimensionType.Configuration:\r\n return DimensionTypes.configuration;\r\n case ProductDimensionType.Size:\r\n return DimensionTypes.size;\r\n case ProductDimensionType.Style:\r\n return DimensionTypes.style;\r\n default:\r\n return DimensionTypes.none;\r\n }\r\n};\r\n\r\n/**\r\n * Converts display dimension type to retail proxy product dimension type.\r\n * @param dimensionType - Local dimension type.\r\n * @returns Product dimension type from retail proxy.\r\n */\r\nexport const convertDimensionTypeToProductDimensionType = (dimensionType: DimensionTypes): ProductDimensionType => {\r\n switch (dimensionType) {\r\n case DimensionTypes.color:\r\n return ProductDimensionType.Color;\r\n case DimensionTypes.configuration:\r\n return ProductDimensionType.Configuration;\r\n case DimensionTypes.size:\r\n return ProductDimensionType.Size;\r\n case DimensionTypes.style:\r\n return ProductDimensionType.Style;\r\n default:\r\n return ProductDimensionType.None;\r\n }\r\n};\r\n\r\n/**\r\n * Sets dimensions to url.\r\n * @param inputUrl - Url to update.\r\n * @param productDimensions - Dimensions to set.\r\n */\r\nexport const setDimensionValuesToQuery = (inputUrl: URL, productDimensions: ProductDimension[]): void => {\r\n for (const dimension of productDimensions) {\r\n inputUrl.searchParams.set(\r\n convertProductDimensionTypeToDimensionTypes(dimension.DimensionTypeValue), dimension.DimensionValue?.Value ?? '');\r\n }\r\n\r\n window.history?.replaceState(window.history.state, '', inputUrl.toString()?.replace(inputUrl.host, window.location.host));\r\n};\r\n\r\n/**\r\n * Retrieves dimension value stored in url.\r\n * @param urlParameters - Url parameters.\r\n * @param productDimensionType - The dimension type to retrieve.\r\n * @returns Product dimension item.\r\n */\r\nconst parseDimensionFromUrl = (urlParameters: URLSearchParams, productDimensionType: ProductDimensionType): ProductDimension | undefined => {\r\n const localDimensionType = convertProductDimensionTypeToDimensionTypes(productDimensionType);\r\n const value = urlParameters.get(localDimensionType);\r\n if (!value) {\r\n return undefined;\r\n }\r\n return {\r\n DimensionTypeValue: productDimensionType,\r\n DimensionValue: {\r\n RecordId: 0,\r\n Value: value\r\n }\r\n };\r\n};\r\n\r\n/**\r\n * Retrieves all dimensions from URL.\r\n * @param urlParameters - Url parameters.\r\n * @returns Product dimensions stored in url.\r\n */\r\nconst parseDimensionsFromUrl = (urlParameters: URLSearchParams): ProductDimension[] => {\r\n const dimensionsToParse: ProductDimensionType[] = [\r\n ProductDimensionType.Color,\r\n ProductDimensionType.Configuration,\r\n ProductDimensionType.Size,\r\n ProductDimensionType.Style\r\n ];\r\n const parsedDimensions = dimensionsToParse.map(dimension => parseDimensionFromUrl(urlParameters, dimension));\r\n return ArrayExtensions.validValues(parsedDimensions);\r\n};\r\n\r\n/**\r\n * Utility function to extract the dimension values from input url querystring.\r\n * @param inputUrl - The request url.\r\n * @returns The selected dimension values.\r\n */\r\nexport const getDimensionValuesFromQuery = (inputUrl: URL): ProductDimension[] => {\r\n const urlWithIgnoredCase = new URL(inputUrl.toString().toLocaleLowerCase());\r\n const urlParameters = urlWithIgnoredCase.searchParams;\r\n const dimensions: ProductDimension[] = parseDimensionsFromUrl(urlParameters);\r\n return dimensions;\r\n};\r\n","import * as React from 'react';\r\nimport { ProductPrice } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ICoreContext,\r\n IRequestContext\r\n} from '@msdyn365-commerce/core';\r\nimport { format } from '@msdyn365-commerce-modules/utilities';\r\nimport { RatingComponent } from '@msdyn365-commerce/components';\r\nimport { buildProductBadge, parseBadgeData } from '../../../Utilities/get-product-badge';\r\nimport {\r\n IGridSettings,\r\n IImageData,\r\n IImageSettings,\r\n Image\r\n} from '@msdyn365-commerce/core';\r\nimport { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { useInView } from 'react-intersection-observer';\r\nimport { urlFallBackImage } from '../../../Utilities/fallbackImageUrl';\r\n\r\nexport interface IUnbxdProductCarouselItemProps {\r\n context: ICoreContext\r\n productUrl: string,\r\n product: any,\r\n position: number\r\n ratingAriaLabel: string,\r\n startingAtText: string,\r\n callUnbxdClickEvent: any,\r\n brandName?: string,\r\n onView?(position: number): void,\r\n emptyPlaceHolderImage: string\r\n}\r\nexport const UnbxdProductCarouselItem: React.FC = ({\r\n context,\r\n productUrl,\r\n product,\r\n position,\r\n brandName,\r\n ratingAriaLabel,\r\n startingAtText,\r\n callUnbxdClickEvent,\r\n onView,\r\n emptyPlaceHolderImage\r\n}) => {\r\n\r\n function renderProductBadge(\r\n attributeName: string | undefined,\r\n requestContext: IRequestContext\r\n ): JSX.Element | undefined {\r\n const badgeData = attributeName;\r\n if (!badgeData) {\r\n return;\r\n }\r\n // split badge data into its separate badges\r\n const badges = badgeData.split(',');\r\n // parse badge data to get its schedule and image src\r\n const parsedBadges = badges.map(badge => parseBadgeData(badge, requestContext));\r\n\r\n // build product badge image components\r\n const finalizedBadges = parsedBadges.map(parsedBadge => parsedBadge && buildProductBadge(parsedBadge, requestContext));\r\n\r\n return finalizedBadges ? <>{finalizedBadges} : <>;\r\n }\r\n function 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 function renderRecsImage(\r\n imageSettings?: IImageSettings,\r\n gridSettings?: IGridSettings,\r\n imageUrl?: string,\r\n fallbackImageUrl?: string,\r\n altText?: string\r\n ): JSX.Element | null {\r\n if (!fallbackImageUrl || !gridSettings || !imageSettings) {\r\n return null;\r\n }\r\n const img: IImageData = {\r\n src: imageUrl ? imageUrl : fallbackImageUrl,\r\n altText: altText ? altText : '',\r\n fallBackSrc: fallbackImageUrl\r\n };\r\n const imageProps = {\r\n gridSettings,\r\n imageSettings,\r\n fallbackImageUrl\r\n };\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n return ;\r\n }\r\n function 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 const numRatings = (totalRatings && totalRatings.toString()) || '0';\r\n if (avgRating && avgRating !== 0) {\r\n const ratingAriaLabel = getRatingAriaLabel(avgRating, ariaLabel);\r\n return (\r\n \r\n );\r\n } else {\r\n return null;\r\n }\r\n }\r\n function renderPrice(\r\n basePrice?: number,\r\n lowest_variant_adjustedPrice?: number,\r\n CustomerContextualPrice?: number\r\n ): JSX.Element | null {\r\n const price: ProductPrice = {\r\n BasePrice: basePrice,\r\n AdjustedPrice: lowest_variant_adjustedPrice,\r\n CustomerContextualPrice: CustomerContextualPrice\r\n };\r\n\r\n return basePrice ? (\r\n
\r\n

{startingAtText}

\r\n {price.AdjustedPrice && price.CustomerContextualPrice && price.CustomerContextualPrice < price.AdjustedPrice ? <>\r\n ${price.CustomerContextualPrice}\r\n \r\n \r\n ${price.AdjustedPrice}\r\n \r\n \r\n :\r\n \r\n ${price.BasePrice}\r\n }\r\n
\r\n ) : null;\r\n }\r\n const imageUrl = generateImageUrl(product.PrimaryImageUrl, context.request.apiSettings);\r\n const fallBackImageUrl = urlFallBackImage(emptyPlaceHolderImage, product?.uniqueId, context.actionContext.requestContext);\r\n const defaultImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: `w=0&h=210&m=6`, w: 0, h: 0 },\r\n lg: { q: `w=0&h=210&m=6`, w: 0, h: 0 },\r\n xl: { q: `w=0&h=210&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n\r\n const [mscProductRef, inView] = useInView({\r\n threshold: .6,\r\n triggerOnce: true //This doesn't work reliably - the children in the carousel remount unexpectedly\r\n });\r\n React.useEffect(() => {\r\n if (inView && onView) {\r\n onView(position);\r\n }\r\n }, [inView]);\r\n\r\n return (\r\n
\r\n {\r\n e.preventDefault();\r\n callUnbxdClickEvent(productUrl, product.uniqueId, position + 1);\r\n }}\r\n >\r\n
\r\n {renderProductBadge(product.Attr_5637149147, context.request)}\r\n
\r\n
\r\n {renderRecsImage(\r\n defaultImageSettings,\r\n context.request.gridSettings,\r\n imageUrl,\r\n fallBackImageUrl,\r\n product.ProductName)}\r\n
\r\n
\r\n \r\n \r\n {`${brandName} ${product.ProductName}`}\r\n \r\n
\r\n {renderPrice(\r\n product.BasePrice,\r\n product.lowest_variant_adjustedPrice,\r\n product.CustomerContextualPrice)}\r\n
\r\n
\r\n
\r\n {renderRating(context, \"mfrm-product-recommendation-carousel\", `${product.uniqueId}`, product.AverageRatingOverall, product.AverageRatingCountOverall, ratingAriaLabel)}\r\n
\r\n
\r\n Shop Now\r\n
\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nexport default UnbxdProductCarouselItem;","/*!\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 React from 'react';\r\nimport { IMfrmProductRecommendationCarouselData } from './mfrm-product-recommendation-carousel.data';\r\nimport { IMfrmProductRecommendationCarouselProps } from './mfrm-product-recommendation-carousel.props.autogenerated';\r\n\r\nimport getUnbxdRecommendationData, { GetUnbxdRecommendationsDataInput } from '../../actions/get-unbxd-product-recommendations.action';\r\nimport { getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { UnbxdProductCarouselItem } from './components/unbxd-product-carousel-item';\r\nimport { addThrottledEvent } from '@msdyn365-commerce-modules/utilities';\r\nimport _getViewPort from '../../Utilities/get-view-port';\r\nimport MsDyn365, { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { SimpleProduct, SalesLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { getPagePath } from '../../Utilities/get-page-path';\r\nimport { getActivePricesAsync, getAttributeValuesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport partialRight from 'lodash/partialRight';\r\nimport { getUtagProductCategory } from '../../Utilities/get-utag-product-category';\r\nimport { getUtagVariantId } from '../../Utilities/get-utag-variant-id';\r\nimport { createUtagQueue } from '../../Utilities/create-utag-queue';\r\nimport { hasArray } from \"../../Utilities/emtpyChecker\";\r\nimport { getSetWmapCartLines } from \"../../Utilities/cart-utils\";\r\nimport { removeSpecialChars } from '../../Utilities/allRegex';\r\n\r\n\r\nexport interface IMfrmProductRecommendationCarouselViewProps extends IMfrmProductRecommendationCarouselProps {\r\n carouselItems: React.ReactNode[] | null;\r\n carouselHeading?: string;\r\n isMobile: boolean;\r\n currentPageName: string;\r\n}\r\ninterface IMfrmProductRecommendationCarouselState {\r\n unbxdRecommendationData: any[] | undefined;\r\n widgetTitle?: string | undefined;\r\n count?: number | undefined;\r\n isMobile: boolean;\r\n unbxdRequestId: string;\r\n}\r\nexport const getProductURLForUnbxd = (product: SimpleProduct | undefined, context: ICoreContext, wmapPageUrlSuffix: string): string => {\r\n let productUrl = getProductPageUrlSync(removeSpecialChars(product?.Name!, context) || '', product?.RecordId || 0, context?.actionContext, undefined);\r\n productUrl = productUrl?.replace(`/${wmapPageUrlSuffix}`, '');\r\n return `${context.request.url.requestUrl.origin}${productUrl}?variantid=${product?.RecordId}`;\r\n};\r\nclass MfrmProductRecommendationCarousel extends React.PureComponent, IMfrmProductRecommendationCarouselState> {\r\n private resizeThrottledEventHandler?: (event: Event) => void;\r\n private viewedItems: any[];\r\n private utagQueue: object[] | undefined;\r\n private stopQueuing: (() => void) | undefined;\r\n private currentPageType: string;\r\n constructor(props: IMfrmProductRecommendationCarouselProps & IMfrmProductRecommendationCarouselState) {\r\n super(props);\r\n this.state = {\r\n count: 0,\r\n unbxdRecommendationData: [],\r\n widgetTitle: \"\",\r\n isMobile: false,\r\n unbxdRequestId: ''\r\n };\r\n this.viewedItems = [];\r\n this.currentPageType = \"\";\r\n const createUtagQueueResult = createUtagQueue('product_impression_position', 1000);\r\n if (createUtagQueueResult) {\r\n this.utagQueue = createUtagQueueResult.utagQueue;\r\n this.stopQueuing = createUtagQueueResult.stopQueuing;\r\n }\r\n }\r\n public async componentDidMount(): Promise {\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.currentPageType = getPagePath()?.split('/')[1].toLowerCase();\r\n void this._getUnbxdRecommendationsData();\r\n if (MsDyn365.isBrowser) {\r\n this.updateViewPort(this.props.context);\r\n }\r\n }\r\n public async componentDidUpdate(): Promise {\r\n if (MsDyn365.isBrowser) {\r\n this.resizeThrottledEventHandler = addThrottledEvent(window, 'resize', () => this.updateViewPort(this.props.context));\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.isBrowser) {\r\n window.removeEventListener('resize', this.resizeThrottledEventHandler!, false);\r\n this.stopQueuing!();\r\n }\r\n }\r\n\r\n private isWmap = (): boolean => {\r\n const pathName = this.props.context.request && this.props.context.request.url.requestUrl.pathname?.toLowerCase().split('/');\r\n const makeaPaymentLink = this.props.context?.app.config.wmapPageUrlSuffix?.toLowerCase();\r\n return pathName && makeaPaymentLink && pathName?.includes(makeaPaymentLink);\r\n };\r\n private updateViewPort = (context: ICoreContext): void => {\r\n const viewport = _getViewPort(context);\r\n if (viewport === 'xs' || viewport === 'sm') {\r\n this.setState({\r\n isMobile: true\r\n });\r\n } else {\r\n this.setState({\r\n isMobile: false\r\n });\r\n }\r\n };\r\n\r\n private handleUnbxdClickEvent = async (productUrl: string, productID: string, position: number, product: any) => {\r\n const { config: { productListPage } } = this.props;\r\n const productSpecificationData = await getAttributeValuesAsync(\r\n { callerContext: this.props.context.actionContext, queryResultSettings: {} },\r\n product.MasterProductId,\r\n this.props.context.request.apiSettings.channelId,\r\n this.props.context.request.apiSettings.catalogId || 0\r\n );\r\n const brand = productSpecificationData.find(attr => attr.Name === 'Brand')?.TextValue;\r\n const pageType = this.props.context.actionContext.requestContext.urlTokens.pageType;\r\n\r\n //@ts-ignore\r\n utag.link({\r\n 'event': 'product-click',\r\n 'enhanced_action': 'product_click',\r\n 'event_category': 'ecommerce',\r\n 'event_action': 'product click',\r\n 'event_label': `${productID}: ${product.ProductName}`,\r\n 'event_noninteraction': 'false',\r\n 'product_list_name': [`Recommended Products: ${productListPage ? productListPage.trim() : this.isWmap() ? 'WMAP' : pageType === 'Product' ? 'Product' : pageType === 'Category' ? 'Category' : this.currentPageType}`], //for list name use ‘Recommended Products: Cart’ on the cart page and ‘Recommended Products: Order Confirmation’ on the order complete page\r\n 'product_position': [`${position}`],\r\n 'product_id': [`${product.uniqueId}`],\r\n 'product_name': [`${product.ProductName}`],\r\n 'product_category': [`${await getUtagProductCategory(\r\n this.props.context.actionContext,\r\n this.props.context.request.apiSettings.channelId,\r\n this.props.context.request.apiSettings.catalogId,\r\n product.Unbxd_DefaultVariantID)\r\n }`],\r\n 'product_brand': [`${brand}`],\r\n 'product_variant': [`${await getUtagVariantId(\r\n product.MasterProductId,\r\n this.props.context.request.apiSettings.channelId,\r\n this.props.context.actionContext,\r\n Number(product.Unbxd_DefaultVariantID), `${productID}`)}`],\r\n // adding the below variables for unbxd\r\n 'unbxd_page_type': this.props.config.pageType.toUpperCase(),\r\n 'unbxd_experience_widget': this.props.config.widgetNumber?.toUpperCase(),\r\n 'd365_product_id': [`${product.MasterProductId}`],\r\n 'd365_product_variant': [`${product.Unbxd_DefaultVariantID}`]\r\n });\r\n\r\n this.currentPageType === 'orderconfirmation' ? window.open(productUrl, \"_blank\") : window.location.href = productUrl;\r\n };\r\n\r\n private handleViewEvent = async (position: number, product: any, products: any[]) => {\r\n const productID = product.uniqueId;\r\n const unbxd_DefaultVariantID = product.Unbxd_DefaultVariantID;\r\n const getUtagProductCategoryProps = {\r\n actionContext: this.props.context.actionContext,\r\n channelId: this.props.context.request.apiSettings.channelId,\r\n catalogId: this.props.context.request.apiSettings.catalogId,\r\n RecordId: unbxd_DefaultVariantID\r\n };\r\n const widgetNumber = this.props.config.widgetNumber;\r\n const unbxdPageType = this.props.config.pageType;\r\n\r\n\r\n if (!this.viewedItems.includes(product.Unbxd_DefaultVariantID)) {\r\n this.viewedItems.push(product.Unbxd_DefaultVariantID);\r\n\r\n const productSpecificationData = await getAttributeValuesAsync(\r\n { callerContext: this.props.context.actionContext, queryResultSettings: {} },\r\n product.MasterProductId,\r\n this.props.context.request.apiSettings.channelId,\r\n this.props.context.request.apiSettings.catalogId || 0\r\n );\r\n const brand = productSpecificationData.find(attr => attr.Name === 'Brand')?.TextValue;\r\n const variant = await getUtagVariantId(product.MasterProductId, getUtagProductCategoryProps.channelId, getUtagProductCategoryProps.actionContext, Number(getUtagProductCategoryProps.RecordId), `${productID}`);\r\n const prices = await getActivePricesAsync(\r\n { callerContext: this.props.context.actionContext },\r\n {\r\n ChannelId: this.props.context.actionContext.requestContext.apiSettings.channelId,\r\n CatalogId: this.props.context.actionContext.requestContext.apiSettings.catalogId\r\n },\r\n [Number(product.Unbxd_DefaultVariantID)],\r\n new Date(),\r\n null,\r\n [],\r\n true\r\n );\r\n const pageType = this.props.context.actionContext.requestContext.urlTokens.pageType;\r\n const { config: { productListPage } } = this.props;\r\n\r\n this.utagQueue!.push({\r\n 'event': 'product-impression',\r\n 'event_category': 'ecommerce',\r\n 'event_action': 'product impression',\r\n 'enhanced_action': 'product_impression',\r\n 'event_label': `${getPagePath()}`,\r\n 'event_noninteraction': 'true',\r\n 'product_impression_list_name': [`Recommended Products: ${productListPage ? productListPage.trim() : this.isWmap() ? 'WMAP' : pageType === 'Product' ? 'Product' : pageType === 'Category' ? 'Category' : this.currentPageType}`],\r\n 'product_impression_position': [`${position + 1}`],\r\n 'product_impression_id': [`${productID}`],\r\n 'product_impression_name': [product.ProductName],\r\n 'product_impression_category': [\r\n `${await getUtagProductCategory(\r\n getUtagProductCategoryProps.actionContext,\r\n getUtagProductCategoryProps.channelId,\r\n getUtagProductCategoryProps.catalogId,\r\n Number(getUtagProductCategoryProps.RecordId)\r\n )}`\r\n ],\r\n 'product_impression_brand': [brand],\r\n 'product_impression_variant': [`${variant}`],\r\n 'product_impression_price': prices.map(price => `${price.CustomerContextualPrice}`),\r\n // // adding the below variables for unbxd\r\n 'unbxd_page_type': `${unbxdPageType.toUpperCase()}`,\r\n 'unbxd_experience_widget': `${widgetNumber?.toUpperCase()}`,\r\n 'd365_product_id': [`${product.MasterProductId}`],\r\n 'd365_product_variant': [`${getUtagProductCategoryProps.RecordId}`]\r\n });\r\n }\r\n };\r\n\r\n private _getUnbxdRecommendationsData = async (): Promise => {\r\n const {\r\n config: {\r\n pageType,\r\n widgetNumber,\r\n categoryLevelNames\r\n },\r\n data: {\r\n cart: { result }\r\n }\r\n } = this.props;\r\n const wmapCartItemIDs = getSetWmapCartLines('get');\r\n const cartLineItems = result?.cart.CartLines;\r\n const productItemID = this.props.data.product.result?.ItemId;\r\n let cartItemIDs = hasArray(cartLineItems)?.map((item) => {\r\n return item.ItemId;\r\n });\r\n if (!productItemID && wmapCartItemIDs?.length && this.isWmap()) {\r\n cartItemIDs = wmapCartItemIDs;\r\n }\r\n\r\n if (this.currentPageType === 'orderconfirmation') {\r\n const salesLines = (await this.props.data.mfrmSalesOrderDetails).salesOrder.SalesLines;\r\n cartItemIDs = hasArray(salesLines)?.map((item: SalesLine) => {\r\n return item.ItemId;\r\n });\r\n }\r\n try {\r\n getUnbxdRecommendationData(new GetUnbxdRecommendationsDataInput(pageType, widgetNumber, productItemID, categoryLevelNames, cartItemIDs), this.props.context.actionContext)\r\n .then((responseData: any) => {\r\n if (responseData) {\r\n this.setState({\r\n count: responseData.unbxdRecs.count,\r\n unbxdRecommendationData: responseData.unbxdRecs.recommendations,\r\n widgetTitle: responseData.unbxdRecs.widgetTitle,\r\n unbxdRequestId: responseData.unbxdRequestId ? responseData.unbxdRequestId : ''\r\n });\r\n }\r\n }).catch((e: any) => console.log(e));\r\n\r\n } catch (error) {\r\n console.log('Unbxd API error', Error);\r\n }\r\n };\r\n public render(): JSX.Element | null {\r\n const { carouselHeading } = this.props.config;\r\n const { unbxdRecommendationData } = this.state;\r\n\r\n const viewProps: IMfrmProductRecommendationCarouselViewProps = {\r\n ...(this.props as IMfrmProductRecommendationCarouselProps),\r\n carouselItems: unbxdRecommendationData ? this._getCarouselItems(unbxdRecommendationData) : null,\r\n carouselHeading: carouselHeading ? carouselHeading : '',\r\n isMobile: this.state.isMobile,\r\n currentPageName: this.currentPageType\r\n };\r\n return this.props.renderView(viewProps);\r\n }\r\n\r\n private _getCarouselItems = (products: any[]): React.ReactNode[] | null => {\r\n if (products.length === 0 || products.length < 4) {\r\n return null;\r\n }\r\n const { context, app: { config: { wmapPageUrlSuffix, placeholderImageName } } } = this.props;\r\n const { ratingAriaLabel, startingAtText } = this.props.resources;\r\n return products.map((product, index) => {\r\n const unbxd_DefaultVariantID = product.Unbxd_DefaultVariantID;\r\n let productUrl = getProductPageUrlSync(removeSpecialChars(product?.ProductName!, context) || '', product.MasterProductId, context && this.props.context.actionContext, undefined);\r\n productUrl = productUrl?.replace(`/${wmapPageUrlSuffix}`, '');\r\n const variantIdQueryParams = unbxd_DefaultVariantID !== 0 && (productUrl.includes('?') ? `&variantid=${unbxd_DefaultVariantID}` : `?variantid=${unbxd_DefaultVariantID}`) || '';\r\n productUrl += variantIdQueryParams;\r\n const brandName = product && product.Attr_5637145355;\r\n return (\r\n \r\n );\r\n });\r\n };\r\n}\r\n\r\nexport default MfrmProductRecommendationCarousel;\r\n","import { ascendBy } from './ascendBy';\r\nimport { clearArray } from './clear-array';\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\n\r\ninterface createUtagQueueResult {\r\n utagQueue: object[],\r\n stopQueuing: () => void;\r\n}\r\n\r\nexport const createUtagQueue = (sortBy: string, batchingInterval: number):createUtagQueueResult|undefined => {\r\n const utagQueue: object[] = [];\r\n if (MsDyn365.isBrowser) {\r\n const id = window.setInterval(() => {\r\n if (utagQueue.length) {\r\n //@ts-ignore\r\n utag.link(\r\n utagQueue.sort(ascendBy(sortBy)).reduce((fullUtagObject, singleItemUtagObject) => {\r\n Object.entries(singleItemUtagObject).forEach(([prop, val]) => {\r\n if (typeof val === 'string') {\r\n fullUtagObject[prop] = val;\r\n } else if (Array.isArray(val)) {\r\n if (typeof fullUtagObject[prop] === 'undefined') {\r\n fullUtagObject[prop] = [];\r\n }\r\n fullUtagObject[prop].push(val[0]);\r\n }\r\n });\r\n\r\n return fullUtagObject;\r\n }, {})\r\n );\r\n clearArray(utagQueue);\r\n }\r\n }, batchingInterval);\r\n const stopQueuing = () => {\r\n window.clearInterval(id);\r\n };\r\n return { utagQueue, stopQueuing };\r\n }\r\n return;\r\n};\r\n","export const ascendBy = (propName: string) => (a: object, b: object) => a[propName] - b[propName];","export const clearArray = (array: any[]) => {\r\n while (array.length > 0) {\r\n array.pop();\r\n }\r\n};","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport * as React from 'react';\r\nimport { IMfrmProductRecommendationCarouselViewProps } from './mfrm-product-recommendation-carousel';\r\nimport Carousel from 'mfcl/Carousel';\r\n\r\nexport default (props: IMfrmProductRecommendationCarouselViewProps) => {\r\n const { carouselHeading, carouselItems, isMobile, currentPageName } = props;\r\n if (!carouselItems) {\r\n props.context.telemetry.error('Product Recommendations is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n return (\r\n carouselItems ?
\r\n
\r\n

{carouselHeading}

\r\n
\r\n
\r\n {isMobile ? (\r\n
\r\n \r\n {carouselItems}\r\n \r\n
\r\n ) : (\r\n \r\n {carouselItems}\r\n \r\n )}\r\n
\r\n
\r\n : <>\r\n );\r\n};\r\n","const binding = { modules: {}, dataActions: {} };\n\n const registerActionId = (actionPath) => {\n if (binding.dataActions[actionPath] &&\n binding.dataActions[actionPath].default &&\n binding.dataActions[actionPath].default.prototype &&\n binding.dataActions[actionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[actionPath].default.prototype.id] = binding.dataActions[actionPath];\n } else {\n Object.keys(binding.dataActions[actionPath] || {}).forEach(exportName => {\n if (binding.dataActions[actionPath][exportName] &&\n binding.dataActions[actionPath][exportName].prototype &&\n binding.dataActions[actionPath][exportName].prototype.Action) {\n binding.dataActions[binding.dataActions[actionPath][exportName].prototype.id] = binding.dataActions[actionPath][exportName];\n }\n })\n }\n };\n\n const registerSanitizedActionPath = (sanitizedActionPath, dataAction) => {\n if (process.env.NODE_ENV === 'development') {\n if (!dataAction.default) {\n throw new Error('Data action path does not have a default export');\n }\n if (!(dataAction.default.prototype.id && binding.dataActions[dataAction.default.prototype.id]) || !binding.dataActions[sanitizedActionPath]) {\n binding.dataActions[sanitizedActionPath] = dataAction;\n }\n } else {\n binding.dataActions[sanitizedActionPath] = dataAction;\n if (!binding.dataActions[sanitizedActionPath].default) {\n throw new Error('Data action path ' + sanitizedActionPath + ' does not have a default export');\n }\n binding.dataActions[sanitizedActionPath].default.prototype.RegistrationId = sanitizedActionPath;\n if (binding.dataActions[sanitizedActionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[sanitizedActionPath].default.prototype.id] = sanitizedActionPath;\n }\n }\n };\n \n\n (binding.modules['mfrm-product-recommendation-carousel'] = {\n c: () => require('partner/modules/mfrm-product-recommendation-carousel/mfrm-product-recommendation-carousel.tsx'),\n $type: 'contentModule',\n da: [{name:'cart', path:'@msdyn365-commerce/global-state/dist/lib/data-actions/cart-state-data-action', runOn: 0},{name:'mfrmSalesOrderDetails', path:'data-actions/get-sales-order-details-action.action', runOn: 0},{name:'product', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant', runOn: 0}],\n \n iNM: false,\n ns: '__local__',\n n: 'mfrm-product-recommendation-carousel',\n p: '__local__',\n \n pdp: '',\n \n \n md: 'src/modules/mfrm-product-recommendation-carousel'\n });\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce/global-state/dist/lib/data-actions/cart-state-data-action';\n let dataAction = require('@msdyn365-commerce/global-state/dist/lib/data-actions/cart-state-data-action');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'data-actions/get-sales-order-details-action.action';\n let dataAction = require('partner/data-actions/get-sales-order-details-action.action');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n \n window.__bindings__ = window.__bindings__ || {};\n window.__bindings__.modules = {\n ...window.__bindings__.modules || {},\n ...binding.modules\n };\n \n window.__bindings__.dataActions = {\n ...window.__bindings__.dataActions || {},\n ...binding.dataActions\n };\n export const viewDictionary = {};\n viewDictionary['__local__|__local__|modules|mfrm-product-recommendation-carousel|mfrm-product-recommendation-carousel'] = {\n c: () => require('partner/modules/mfrm-product-recommendation-carousel/mfrm-product-recommendation-carousel.view.tsx'),\n cn: '__local__-__local__-mfrm-product-recommendation-carousel'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","module.exports = React;","module.exports = ReactDOM;"],"names":["emailRegex","emailValue","test","removeSpecialChars","str","ctx","request","app","config","removeSpecialCharsPDP","replace","removeSpecialCharsFromURLPath","decodeURIComponent","split","getSetLocalStorage","key","getSet","valueToSet","returnType","MsDyn365","localStorage","setItem","JSON","stringify","parse","getItem","getSetProductData","products","getSetProductSpec","getSetPromoCodeApplyList","getSetPromoCode","getSetGrandTotal","total","getSetBonusItemProd","globalBonusItems","getSetSelectedBonasItem","bonusItemArray","getSetBonusCouponDetail","getCoupons","getSetPrevBonasModalState","previousBonasModal","getSetBonusItemBrandName","bonusItemsBrandName","getSetDateGroupedProducts","getSetExpressFlow","express","getSetWmapCartLines","getSetCartProductPrice","priceDetails","getSetParcelInventoryData","details","variantQueryStringName","hasArray","values","length","undefined","urlFallBackImage","imageUrl","itemId","apiSettings","fallbackImageUrl","getFallbackImageUrl","getPagePath","window","location","href","host","includes","dayjs","tz","utc","isBetween","format","defaultImageSettings","viewports","xs","q","w","h","disableLazyLoad","parseBadgeData","badgeData","requestContext","dataSegments","scheduleStart","scheduleEnd","badgeType","parsedScheduleStart","startDate","startTime","parsedScheduleEnd","endDate","endTime","e","startMoment","endMoment","startMomentFormatted","endMomentFormatted","isValid","baseUrl","baseImageUrl","substring","removed$","src","toLowerCase","alt","start","convertTimeZone","end","time","local","buildProductBadge","parsedBadgeData","React","Image","className","gridSettings","altText","title","imageSettings","renderProductBadge","attributeName","finalizedBadges","map","badge","parsedBadge","getUtagProductCategory","async","actionContext","channelId","catalogId","RecordId","categoryPathResults","getCategoryPathsAsync","callerContext","queryResultSettings","ProductId","categoryPath","CategoryPath","Segments","CategoryName","getUtagVariantId","MasterProductId","ItemId","input","BuyboxGetDimensionVariantAvailabilityInput","variantsResp","getAllProductVariants","variantIter","ePropsVariant","ExtensionProperties","eIter","Key","Value","StringValue","variantofId","slice","context","innerWidth","sm","md","lg","GetUnbxdRecommendationsDataInput","constructor","pageType","widgetNumber","productID","catLevels","cartItemIDs","getCacheKey","this","currentCategories","getCacheObjectType","dataCacheType","forEach","catLevel","categoryLevelName","concat","Msdyn365","action","unbxdUid","Cookies","get","toUpperCase","unbxdApiKey","unbxdSiteKey","unbxdUrl","catName","index","join","response","data","headers","id","productId","getAllVariantsForProduct","productResponse","getByIdAsync","Paging","Top","baseProduct","Array","isArray","getVariantsByDimensionValuesAsync","error","telemetry","exception","Error","createObservableDataAction","inputData","query","urlTokens","orderTypes","GetSalesOrderWithHydrationsInput","orderType","orderId","buildCacheKey","getSalesOrderWithHydrationsAction","trace","salesOrder","getSalesOrderDetailsBySalesIdAsync","getSalesOrderDetailsByTransactionIdAsync","getSalesOrder","TransactionTypeValue","SalesLines","productIds","salesLine","filter","productInputs","ProductInput","getSimpleProducts","getProducts","ChannelId","deliveryOptions","getDeliveryOptionsAsync","x","then","result","catch","message","debug","getSalesOrderWithHydrationsActionDataAction","salesId","transactionId","transaction","getSelectedProductIdFromActionInput","variantId","queryBasedVariantSelection","getQueryParamsFromQueryByName","url","requestUrl","inputUrl","queryParamName","value","URL","toString","toLocaleLowerCase","searchParams","trim","Number","isNaN","generateImageUrl","startsWith","encodeURIComponent","DimensionTypes","DimensionSwatchDisplayTypes","parsedItemId","convertProductDimensionTypeToDimensionTypes","productDimensionType","ProductDimensionType","color","configuration","size","style","none","parseDimensionsFromUrl","urlParameters","parsedDimensions","dimension","localDimensionType","DimensionTypeValue","DimensionValue","parseDimensionFromUrl","ArrayExtensions","getDimensionValuesFromQuery","UnbxdProductCarouselItem","productUrl","product","position","brandName","ratingAriaLabel","startingAtText","callUnbxdClickEvent","onView","emptyPlaceHolderImage","PrimaryImageUrl","fallBackImageUrl","uniqueId","xl","lazyload","mscProductRef","inView","useInView","threshold","triggerOnce","ref","ProductName","onClick","preventDefault","Attr_5637149147","img","fallBackSrc","imageProps","cropFocalRegion","imageFallbackOptimize","loadFailureBehavior","renderRecsImage","basePrice","lowest_variant_adjustedPrice","CustomerContextualPrice","price","BasePrice","AdjustedPrice","renderPrice","typeName","avgRating","totalRatings","ariaLabel","numRatings","rating","roundedRating","toFixed","getRatingAriaLabel","RatingComponent","Math","round","ratingCount","readOnly","renderRating","AverageRatingOverall","AverageRatingCountOverall","getProductURLForUnbxd","wmapPageUrlSuffix","getProductPageUrlSync","Name","origin","MfrmProductRecommendationCarousel","props","super","isWmap","pathName","pathname","makeaPaymentLink","updateViewPort","viewport","_getViewPort","setState","isMobile","handleUnbxdClickEvent","productListPage","brand","getAttributeValuesAsync","find","attr","TextValue","utag","link","currentPageType","Unbxd_DefaultVariantID","open","handleViewEvent","unbxd_DefaultVariantID","getUtagProductCategoryProps","unbxdPageType","viewedItems","push","variant","prices","getActivePricesAsync","CatalogId","Date","utagQueue","_getUnbxdRecommendationsData","categoryLevelNames","cart","wmapCartItemIDs","cartLineItems","CartLines","productItemID","item","salesLines","mfrmSalesOrderDetails","getUnbxdRecommendationData","responseData","count","unbxdRecs","unbxdRecommendationData","recommendations","widgetTitle","unbxdRequestId","console","log","_getCarouselItems","placeholderImageName","resources","variantIdQueryParams","Attr_5637145355","partialRight","state","createUtagQueueResult","sortBy","batchingInterval","setInterval","propName","sort","a","b","reduce","fullUtagObject","singleItemUtagObject","Object","entries","prop","val","array","pop","clearArray","stopQueuing","clearInterval","createUtagQueue","resizeThrottledEventHandler","addThrottledEvent","componentWillUnmount","removeEventListener","render","carouselHeading","viewProps","carouselItems","currentPageName","renderView","Carousel","itemsToShow","hideIndicators","hideControls","controlStyle","controlClass","layoutGap","infinite","disableEndButtons","variableWidth","responsive","breakpoint","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","prototype","RegistrationId","c","require","$type","da","name","path","runOn","iNM","ns","n","p","pdp","__bindings__","viewDictionary","cn","module","exports","ReactDOM"],"sourceRoot":""}