{"version":3,"file":"static/js/e3492cc387b0bf089fa8.bundle.js","mappings":"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","sources":["webpack://mattressfirm/./src/Utilities/analytics/clickTrack.ts?bce2","webpack://mattressfirm/./src/Utilities/components/BVRatingSummary.tsx?6e2e","webpack://mattressfirm/./src/Utilities/constants.ts?8bdf","webpack://mattressfirm/./src/Utilities/get-bv-attributes.ts?f55a","webpack://mattressfirm/./src/Utilities/get-product-badge.tsx?635b","webpack://mattressfirm/./src/Utilities/get-product-brand.tsx?2b65","webpack://mattressfirm/./src/Utilities/select-financing-offer.tsx?5f53","webpack://mattressfirm/./src/data-actions/financing-offer-state.action.ts?9faa","webpack://mattressfirm/./src/data-actions/utilities/utils.ts?7452","webpack://mattressfirm/./src/themes/mattressfirm/custom-components/financing-per-month-component.tsx?fa70"],"sourcesContent":["import { callUtagLink } from \"./utagCaller\";\r\n\r\nexport interface IUtagPromoConfig {\r\n promotion_impression_name?: string[];\r\n promotion_impression_id?: string[];\r\n promotion_impression_creative?: string[];\r\n promotion_impression_position?: (string | undefined)[];\r\n promotion_name?: string[];\r\n promotion_id?: string[];\r\n promotion_creative?: string[];\r\n promotion_position?: (string | undefined)[];\r\n}\r\n\r\nexport interface IUtagGeneralConfig {\r\n enhanced_action?: string | undefined;\r\n}\r\nexport interface ICustomerConfig {\r\n customer_email?: string;\r\n}\r\nexport interface IProductConfig {\r\n product_id?: string[];\r\n product_name?: string[];\r\n product_category?: (string | undefined)[];\r\n product_brand?: (string | undefined)[];\r\n product_variant?: (string | undefined)[];\r\n product_price?: (string | undefined)[];\r\n product_list_name?: string[];\r\n product_position?: (number | undefined)[];\r\n product_quantity?: (string | undefined)[];\r\n checkout_step?: string;\r\n}\r\nexport interface IProductImpressionConfig {\r\n product_impression_brand?: (string | undefined)[];\r\n product_impression_list_name?: (string | undefined)[];\r\n product_impression_id?: string[];\r\n product_impression_name?: string[];\r\n product_impression_category?: string[];\r\n product_impression_variant?: (string | undefined)[];\r\n product_impression_position?: number[];\r\n product_impression_price?: number[];\r\n}\r\nexport interface IAnalyticsConfiguration {\r\n event?: string | null;\r\n eventName?: string | null;\r\n eventCategory?: string | null;\r\n eventAction?: string | null;\r\n eventLabel?: string | null;\r\n eventType?: string | null;\r\n eventNoninteraction?: string;\r\n enhancedAction?: string | null;\r\n searchTerm?: string | undefined | null;\r\n searchType?: string | undefined | null;\r\n generalConfig?: IUtagGeneralConfig;\r\n promoConfig?: IUtagPromoConfig;\r\n productConfig?: IProductConfig;\r\n customerConfig?: ICustomerConfig;\r\n productImpressionConfig?: IProductImpressionConfig;\r\n}\r\n\r\nexport const fireAnalyticsLink = ({\r\n searchTerm = null,\r\n searchType = null,\r\n eventName = null,\r\n eventCategory = null,\r\n eventAction = null,\r\n eventLabel = null,\r\n eventType = null,\r\n eventNoninteraction = 'false',\r\n enhancedAction = null,\r\n generalConfig = {},\r\n promoConfig = {},\r\n productConfig = {},\r\n customerConfig = {},\r\n productImpressionConfig = {}\r\n}: IAnalyticsConfiguration) => {\r\n void callUtagLink({\r\n ...generalConfig,\r\n ...promoConfig,\r\n ...productConfig,\r\n ...customerConfig,\r\n ...productImpressionConfig,\r\n event: eventName,\r\n event_category: eventCategory,\r\n event_action: eventAction,\r\n event_label: eventLabel,\r\n event_type: eventType,\r\n event_noninteraction: eventNoninteraction,\r\n enhanced_action: enhancedAction,\r\n search_term: searchTerm,\r\n search_type: searchType\r\n });\r\n};","import React, { useState, useEffect, useRef } from 'react';\r\n\r\nexport const BVRatingSummary = ({\r\n itemId,\r\n onClick,\r\n variantId,\r\n hideReadReviewsButton\r\n}: {\r\n itemId: string | undefined;\r\n onClick?: () => void;\r\n variantId?: number | undefined;\r\n hideReadReviewsButton?: boolean\r\n}) => {\r\n const [dataBvProductIdAttr, setDataBvProductIdAttr] = useState(itemId);\r\n const wrapper = useRef(null);\r\n const interval = useRef(-1);\r\n const numReviews = wrapper.current?.querySelector('.bv_numReviews_text')?.innerHTML.match(/\\(([^)]+)\\)/)?.[1];\r\n\r\n useEffect(() => {\r\n setDataBvProductIdAttr(itemId);\r\n }, [itemId]);\r\n\r\n useEffect(() => {\r\n setDataBvProductIdAttr('bv-refresh');\r\n }, [variantId]);\r\n\r\n useEffect(() => {\r\n if (dataBvProductIdAttr === 'bv-refresh') {\r\n setDataBvProductIdAttr(itemId);\r\n }\r\n }, [dataBvProductIdAttr]);\r\n\r\n useEffect(() => {\r\n if (wrapper.current) {\r\n numReviews === '0' ? wrapper.current.style.display = 'none' : wrapper.current.style.display = 'flex';\r\n }\r\n }, [numReviews]);\r\n\r\n return (\r\n {\r\n if (hideReadReviewsButton) {\r\n interval.current = window.setInterval(() => {\r\n const button: Element | undefined = Array.from(document.querySelectorAll('.bv_button_buttonFull')).find((button) => {\r\n return button?.innerHTML === `Read ${numReviews} Reviews`;\r\n });\r\n if (button) {\r\n button.outerHTML = '';\r\n }\r\n });\r\n }\r\n }}\r\n onMouseLeave={() => {\r\n if (hideReadReviewsButton) {\r\n clearInterval(interval.current);\r\n }\r\n }}\r\n data-bv-show='rating_summary'\r\n data-bv-product-id={dataBvProductIdAttr}\r\n onClick={onClick}\r\n ref={wrapper}\r\n />\r\n );\r\n};\r\n","export const variantQueryStringName = 'variantid';","import { AttributeValue } from '@msdyn365-commerce/retail-proxy';\r\n\r\nexport const getBVAttributeValues = (attributeValues: AttributeValue[] | undefined, key: string): number => {\r\n const value = +(attributeValues?.find(attr => attr.Name?.trim() === key)?.TextValue || 0);\r\n return Math.round(value * 10) / 10;\r\n};\r\n\r\nexport const getBVAttributeValuesUnbxd = (attributeValues: any | undefined, key: string): number => {\r\n // eslint-disable-next-line security/detect-object-injection\r\n const value = +(attributeValues[key] ?? 0);\r\n return Math.round(value * 10) / 10;\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 { IGridSettings, IImageSettings, Image } from '@msdyn365-commerce/core';\r\nimport { AttributeValue } from '@msdyn365-commerce/retail-proxy';\r\nimport React from 'react';\r\nimport { IBrandListData } from '../modules/mfrm-buybox/mfrm-buybox.view';\r\nimport { IProductBonusWithBrandName } from '../modules/mfrm-cart/mfrm-cart';\r\nimport {hasArray} from './emtpyChecker';\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\n\r\nconst fallBackBrandAttribute = 'VENDOR BRAND';\r\n\r\n// tslint:disable-next-line: cyclomatic-complexity\r\nexport const parseBrandData = (\r\n attributes: AttributeValue[] | undefined,\r\n backendAttribute: string,\r\n gridSettings: IGridSettings,\r\n renderBrandNameOnly: Boolean = false,\r\n brandList: IBrandListData[],\r\n imageSettings?: IImageSettings\r\n): JSX.Element | undefined => {\r\n const attribute = backendAttribute || fallBackBrandAttribute;\r\n const productBrandName =\r\n attributes &&\r\n attributes.find(currAttribute => currAttribute.Name && currAttribute.Name.toLowerCase().trim() === attribute.toLowerCase().trim())\r\n ?.TextValue;\r\n\r\n if (renderBrandNameOnly) {\r\n return {productBrandName};\r\n }\r\n\r\n const selectedBrand =\r\n (brandList &&\r\n productBrandName &&\r\n brandList.find(\r\n (brand: IBrandListData) => brand && brand.brandName.toLowerCase().trim() === productBrandName.toLowerCase().trim()\r\n )) ||\r\n undefined;\r\n\r\n if (!selectedBrand) {\r\n return undefined;\r\n }\r\n\r\n const copySelectedBrand: IBrandListData = selectedBrand;\r\n // set alt text to brand name if no alt text is configured\r\n if (copySelectedBrand && _useDefaultAltText(copySelectedBrand) && copySelectedBrand.brandLogo) {\r\n copySelectedBrand.brandLogo.altText = productBrandName;\r\n }\r\n\r\n // set height to configured value or the default\r\n const height = copySelectedBrand && copySelectedBrand.logoHeight !== undefined ? copySelectedBrand.logoHeight : 22;\r\n const brandImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: `w=0&h=25&m=6`, w: 0, h: 25 },\r\n lg: { q: `w=0&h=25&m=6`, w: 0, h: 25 },\r\n xl: { q: `w=0&h=25&m=6`, w: 0, h: 25 }\r\n },\r\n lazyload: false\r\n };\r\n\r\n const brandLogo = copySelectedBrand && copySelectedBrand.brandLogo && (\r\n \r\n );\r\n // place logo inside a link if configured to\r\n const brandLink =\r\n copySelectedBrand &&\r\n copySelectedBrand.brandLink &&\r\n copySelectedBrand.brandLink.linkUrl &&\r\n copySelectedBrand.brandLink.linkUrl.destinationUrl &&\r\n copySelectedBrand.brandLink;\r\n const linkElement = brandLink && (\r\n \r\n {brandLogo}\r\n \r\n );\r\n\r\n return linkElement || brandLogo;\r\n};\r\n// get only brandName\r\nexport const parseBrandName = (attributes: AttributeValue[] | undefined, backendAttribute: string, recordId?: number): string | undefined => {\r\n const attribute = backendAttribute || fallBackBrandAttribute;\r\n let productBrandName = hasArray(attributes)?.find((currAttribute: AttributeValue) => currAttribute?.Name?.toLowerCase().trim() === attribute?.toLowerCase().trim())?.TextValue;\r\n if (!productBrandName && MsDyn365.isBrowser) {\r\n const getLocalStorage = localStorage.getItem('bonusItmesWithBrand');\r\n let bonusItemArray: IProductBonusWithBrandName[] = [];\r\n if (getLocalStorage) {\r\n bonusItemArray = JSON.parse(getLocalStorage);\r\n }\r\n const checkBrandName = bonusItemArray.find(item => item.productId === recordId)?.brandName;\r\n if(checkBrandName) {\r\n productBrandName = checkBrandName;\r\n } else {\r\n return undefined;\r\n }\r\n }\r\n return productBrandName;\r\n};\r\n\r\nexport const parseBrandNameUnbxd = (attributes: any | undefined, backendAttribute: string, recordId?: number): string | undefined => {\r\n const attribute = backendAttribute || fallBackBrandAttribute;\r\n // let productBrandName = hasArray(attributes)?.find((currAttribute: AttributeValue) => currAttribute?.Name?.toLowerCase().trim() === attribute?.toLowerCase().trim())?.TextValue;\r\n // eslint-disable-next-line security/detect-object-injection\r\n let productBrandName = attributes && attributes[attribute];\r\n if (!productBrandName && MsDyn365.isBrowser) {\r\n const getLocalStorage = localStorage.getItem('bonusItmesWithBrand');\r\n let bonusItemArray: IProductBonusWithBrandName[] = [];\r\n if (getLocalStorage) {\r\n bonusItemArray = JSON.parse(getLocalStorage);\r\n }\r\n const checkBrandName = bonusItemArray.find(item => item.productId === recordId)?.brandName;\r\n if(checkBrandName) {\r\n productBrandName = checkBrandName;\r\n } else {\r\n return undefined;\r\n }\r\n }\r\n return productBrandName;\r\n};\r\n\r\n// get only brandName\r\nexport const getBrandNameCheck = (attributes: AttributeValue[] | undefined, backendAttribute: string): string | undefined => {\r\n const productBrandName =\r\n attributes &&\r\n attributes.find(\r\n currAttribute => currAttribute.Name && currAttribute.Name.toLowerCase().trim() === backendAttribute.toLowerCase().trim()\r\n )?.TextValue;\r\n if (!productBrandName) {\r\n return undefined;\r\n }\r\n return productBrandName;\r\n};\r\n\r\n// get the appropriate image alt text\r\nconst _useDefaultAltText = (selectedBrand: IBrandListData): boolean => {\r\n const configuredAltText = selectedBrand.brandLogo?.altText;\r\n return !(configuredAltText && configuredAltText.trim() && configuredAltText !== 'No Data Available');\r\n};\r\n","import { RichText } from '@msdyn365-commerce/core';\r\n\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\nconst format = 'M/D/YYYY';\r\n\r\nexport interface IFinancingOffer {\r\n offerName?: string;\r\n noInterestFor: number;\r\n minPurchase: number;\r\n everydayFinancingOfferMessage:string,\r\n limitedFinancingOfferMessage:string,\r\n monthlyOfferDetails?: RichText;\r\n financingOfferDescription: RichText;\r\n disclaimer: RichText;\r\n offerValidStartDate?: string;\r\n offerValidEndDate?: string;\r\n specialCampaignOffer?: IFinancingOfferCampaign;\r\n checkoutDisplay?: {heading: string; details: string}\r\n}\r\n\r\nexport interface IFinancingOfferFormatted {\r\n numOfMonths: number;\r\n costPerMonth: number;\r\n startDate?: string;\r\n endDate?: string;\r\n isLTO: boolean;\r\n monthlyOfferDetails?: RichText;\r\n minPurchase: number;\r\n everydayFinancingOfferMessage:string;\r\n limitedFinancingOfferMessage:string;\r\n financingOfferDescription: RichText;\r\n disclaimer: RichText;\r\n specialCampaign?: IFinancingOfferCampaign;\r\n offerName?: string;\r\n checkoutDisplay?: {heading: string; details: string}\r\n}\r\n\r\nexport interface IFinancingOfferCampaign {\r\n initialMonthlyAmount: number;\r\n numOfDiscountedMonths: number;\r\n campaignValidStartDate: string;\r\n campaignValidEndDate: string;\r\n enableCampaign: boolean;\r\n showEverydayFlag: boolean;\r\n}\r\n\r\nexport interface ISelectFinancingOfferData {\r\n limitedTimeFinancingOffers: IFinancingOffer[];\r\n everydayFinancingOffers: IFinancingOffer[];\r\n totalPrice: number | undefined;\r\n specialFinancingOffer?: IFinancingOffer[];\r\n synchronySpecialFinancingCondition?: boolean;\r\n specialFinancingEnable?: boolean;\r\n}\r\n\r\nexport interface ICampaignRemainingCost {\r\n cost: number;\r\n months: number;\r\n}\r\n\r\nexport const getValidSpecialCampaign = (financingOffer: IFinancingOfferFormatted): IFinancingOfferCampaign | undefined => {\r\n if (\r\n financingOffer.specialCampaign &&\r\n financingOffer.specialCampaign.enableCampaign &&\r\n financingOffer.specialCampaign.initialMonthlyAmount &&\r\n financingOffer.specialCampaign.numOfDiscountedMonths &&\r\n isCampaignScheduled(financingOffer)\r\n ) {\r\n return financingOffer.specialCampaign;\r\n }\r\n\r\n return undefined;\r\n};\r\n\r\nexport const getCampaignRemainingCost = (\r\n campaign: IFinancingOfferCampaign,\r\n financingOffer: IFinancingOfferFormatted,\r\n totalPrice: number | undefined\r\n): ICampaignRemainingCost | undefined => {\r\n if (!totalPrice) {\r\n return undefined;\r\n }\r\n\r\n const initialCost = campaign.initialMonthlyAmount * campaign.numOfDiscountedMonths;\r\n const remainingCost = totalPrice - initialCost;\r\n const remainingMonths = financingOffer.numOfMonths - campaign.numOfDiscountedMonths;\r\n const monthlyCost = remainingCost / remainingMonths;\r\n\r\n return {\r\n cost: monthlyCost,\r\n months: remainingMonths\r\n };\r\n};\r\nexport const isValidLimitedTimeOffer = (offer: IFinancingOffer): boolean => {\r\n const startDate = dayjs(offer.offerValidStartDate, format);\r\n const endDate = dayjs(offer.offerValidEndDate, format).add(1, 'd');\r\n\r\n const startDateCentralTime = startDate.isValid() && dayjs(startDate.format(format), format).tz('America/Chicago').local();\r\n const endDateCentralTime = endDate.isValid() && dayjs(endDate.format(format), format).tz('America/Chicago').local();\r\n\r\n const now = dayjs();\r\n return startDateCentralTime && endDateCentralTime && now.isBetween(startDateCentralTime, endDateCentralTime);\r\n};\r\n\r\nexport const isCampaignScheduled = (offer: IFinancingOfferFormatted): boolean => {\r\n const tempOffer = Object.create(offer);\r\n if (tempOffer.specialCampaign?.campaignValidStartDate && tempOffer.specialCampaign?.campaignValidEndDate) {\r\n tempOffer.startDate = tempOffer.specialCampaign?.campaignValidStartDate;\r\n tempOffer.endDate = tempOffer.specialCampaign?.campaignValidEndDate;\r\n\r\n return isScheduled(tempOffer);\r\n }\r\n\r\n return false;\r\n};\r\n\r\nexport const isScheduled = (offer: IFinancingOfferFormatted): boolean => {\r\n const startDate = dayjs(offer.startDate, format);\r\n const endDate = dayjs(offer.endDate, format).add(1, 'd');\r\n\r\n const startDateCentralTime = startDate.isValid() && dayjs(startDate.format(format), format).tz('America/Chicago').local();\r\n const endDateCentralTime = endDate.isValid() && dayjs(endDate.format(format), format).tz('America/Chicago').local();\r\n\r\n const now = dayjs();\r\n\r\n return startDateCentralTime && endDateCentralTime && now.isBetween(startDateCentralTime, endDateCentralTime);\r\n};\r\n\r\nexport const selectFinancingOffer = ({ limitedTimeFinancingOffers = [], everydayFinancingOffers = [], totalPrice = 0, specialFinancingOffer = [], synchronySpecialFinancingCondition = false, specialFinancingEnable = false }: ISelectFinancingOfferData, returnCustomOfferArray?: boolean): IFinancingOfferFormatted | undefined => {\r\n let highestMinimumPurchase: number = 0;\r\n let bestOffer: IFinancingOfferFormatted = {\r\n numOfMonths: 0,\r\n costPerMonth: 0,\r\n isLTO: false,\r\n minPurchase: 0,\r\n everydayFinancingOfferMessage:'',\r\n limitedFinancingOfferMessage:'',\r\n monthlyOfferDetails: '',\r\n financingOfferDescription: '',\r\n disclaimer: ''\r\n };\r\n let offerFound = false;\r\n\r\n let campaignFound: IFinancingOfferFormatted | undefined;\r\n\r\n const everydayOffers: IFinancingOfferFormatted[] | undefined = [];\r\n const specialOffer: IFinancingOfferFormatted[] | undefined = [];\r\n\r\n const validLimitedTimeFinancingOffers = limitedTimeFinancingOffers.filter((offer)=>{\r\n return isValidLimitedTimeOffer(offer) && offer;\r\n });\r\n\r\n if (synchronySpecialFinancingCondition && specialFinancingEnable) {\r\n if (!offerFound || (!isScheduled(bestOffer) && specialFinancingOffer.length)) {\r\n // try default offer\r\n offerFound = false;\r\n highestMinimumPurchase = 0;\r\n specialFinancingOffer.forEach((offer: IFinancingOffer) => {\r\n const minPurchase = offer.minPurchase ? offer.minPurchase : 0;\r\n let currentOfferAccepted = false;\r\n if (totalPrice >= minPurchase && minPurchase >= highestMinimumPurchase) {\r\n bestOffer = {\r\n numOfMonths: offer.noInterestFor,\r\n costPerMonth: Math.ceil(totalPrice / offer.noInterestFor),\r\n startDate: offer.offerValidStartDate,\r\n endDate: offer.offerValidEndDate,\r\n isLTO: false,\r\n minPurchase: offer.minPurchase || 0,\r\n everydayFinancingOfferMessage:offer.everydayFinancingOfferMessage,\r\n limitedFinancingOfferMessage:offer.limitedFinancingOfferMessage,\r\n offerName: offer.offerName,\r\n financingOfferDescription: offer.financingOfferDescription,\r\n disclaimer: offer.disclaimer\r\n };\r\n highestMinimumPurchase = offer.minPurchase;\r\n offerFound = true;\r\n currentOfferAccepted = true;\r\n }\r\n if (returnCustomOfferArray && (totalPrice >= minPurchase)) {\r\n specialOffer?.push({\r\n numOfMonths: offer.noInterestFor,\r\n costPerMonth: Math.ceil(totalPrice / offer.noInterestFor),\r\n startDate: offer.offerValidStartDate,\r\n endDate: offer.offerValidEndDate,\r\n isLTO: false,\r\n minPurchase: offer.minPurchase || 0,\r\n everydayFinancingOfferMessage:offer.everydayFinancingOfferMessage,\r\n limitedFinancingOfferMessage:offer.limitedFinancingOfferMessage,\r\n financingOfferDescription: offer.financingOfferDescription,\r\n disclaimer: offer.disclaimer,\r\n offerName: offer.offerName\r\n });\r\n highestMinimumPurchase = offer.minPurchase;\r\n offerFound = true;\r\n currentOfferAccepted = true;\r\n // @ts-ignore\r\n bestOffer = specialOffer;\r\n }\r\n // Do not use default if end date is defined and has expired\r\n if (currentOfferAccepted && offer.offerValidEndDate) {\r\n const endDate = dayjs(offer.offerValidEndDate, format);\r\n const now = dayjs();\r\n if (endDate.isValid() && now.isAfter(endDate)) {\r\n offerFound = false;\r\n }\r\n }\r\n });\r\n }\r\n } else {\r\n validLimitedTimeFinancingOffers.forEach((offer: IFinancingOffer) => {\r\n const minPurchase = offer.minPurchase ? offer.minPurchase : 0;\r\n\r\n if (totalPrice >= minPurchase && minPurchase > highestMinimumPurchase) {\r\n const currentOffer: IFinancingOfferFormatted = {\r\n numOfMonths: offer.noInterestFor,\r\n costPerMonth: Math.ceil(totalPrice / offer.noInterestFor),\r\n startDate: offer.offerValidStartDate,\r\n endDate: offer.offerValidEndDate,\r\n isLTO: true,\r\n minPurchase: offer.minPurchase,\r\n everydayFinancingOfferMessage:offer.everydayFinancingOfferMessage,\r\n limitedFinancingOfferMessage:offer.limitedFinancingOfferMessage,\r\n monthlyOfferDetails: offer.monthlyOfferDetails,\r\n financingOfferDescription: offer.financingOfferDescription,\r\n disclaimer: offer.disclaimer,\r\n specialCampaign: offer.specialCampaignOffer,\r\n checkoutDisplay: offer.checkoutDisplay,\r\n offerName: offer.offerName\r\n };\r\n bestOffer = currentOffer;\r\n highestMinimumPurchase = offer.minPurchase;\r\n offerFound = true;\r\n\r\n // check if campaign schedule is scheduled, otherwise fall back to parent offer\r\n const validCampaign = getValidSpecialCampaign(currentOffer);\r\n if (validCampaign) {\r\n currentOffer.startDate = validCampaign.campaignValidStartDate;\r\n currentOffer.endDate = validCampaign.campaignValidEndDate;\r\n campaignFound = currentOffer;\r\n }\r\n else {\r\n campaignFound = undefined;\r\n }\r\n }\r\n });\r\n\r\n if (!offerFound || (!isScheduled(bestOffer) && everydayFinancingOffers.length)) {\r\n // try default offer\r\n offerFound = false;\r\n highestMinimumPurchase = 0;\r\n\r\n everydayFinancingOffers.forEach((offer: IFinancingOffer) => {\r\n const minPurchase = offer.minPurchase ? offer.minPurchase : 0;\r\n let currentOfferAccepted = false;\r\n if (totalPrice >= minPurchase && minPurchase >= highestMinimumPurchase) {\r\n bestOffer = {\r\n numOfMonths: offer.noInterestFor,\r\n costPerMonth: Math.ceil(totalPrice / offer.noInterestFor),\r\n isLTO: false,\r\n minPurchase: offer.minPurchase || 0,\r\n everydayFinancingOfferMessage: offer.everydayFinancingOfferMessage,\r\n limitedFinancingOfferMessage:offer.limitedFinancingOfferMessage,\r\n offerName: offer.offerName,\r\n monthlyOfferDetails: offer.monthlyOfferDetails,\r\n financingOfferDescription: offer.financingOfferDescription,\r\n disclaimer: offer.disclaimer\r\n };\r\n highestMinimumPurchase = offer.minPurchase;\r\n offerFound = true;\r\n currentOfferAccepted = true;\r\n }\r\n\r\n if (returnCustomOfferArray && (totalPrice >= minPurchase)) {\r\n everydayOffers?.push({\r\n numOfMonths: offer.noInterestFor,\r\n costPerMonth: Math.ceil(totalPrice / offer.noInterestFor),\r\n isLTO: false,\r\n minPurchase: offer.minPurchase || 0,\r\n everydayFinancingOfferMessage:offer.everydayFinancingOfferMessage,\r\n limitedFinancingOfferMessage:offer.limitedFinancingOfferMessage,\r\n monthlyOfferDetails: offer.monthlyOfferDetails,\r\n financingOfferDescription: offer.financingOfferDescription,\r\n disclaimer: offer.disclaimer,\r\n offerName: offer.offerName\r\n });\r\n highestMinimumPurchase = offer.minPurchase;\r\n offerFound = true;\r\n currentOfferAccepted = true;\r\n // @ts-ignore\r\n bestOffer = everydayOffers;\r\n }\r\n\r\n // Do not use default if end date is defined and has expired\r\n if (currentOfferAccepted && offer.offerValidEndDate) {\r\n const endDate = dayjs(offer.offerValidEndDate, format);\r\n const now = dayjs();\r\n if (endDate.isValid() && now.isAfter(endDate)) {\r\n offerFound = false;\r\n }\r\n }\r\n });\r\n }\r\n}\r\n\r\n if (!offerFound) {\r\n return undefined;\r\n }\r\n if (campaignFound) {\r\n return campaignFound;\r\n }\r\n return bestOffer;\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 * as Msdyn365 from '@msdyn365-commerce/core';\r\n\r\nimport { IFinancingOfferFormatted } from '../Utilities/select-financing-offer';\r\n\r\n/**\r\n * FinancingOfferState Input Action\r\n */\r\n\r\nexport class FinancingOfferStateInput implements Msdyn365.IActionInput {\r\n // Determine if the results of this get action should cache the results and if so provide\r\n // a cache object type and an appropriate cache key\r\n public getCacheKey = () => `FinancingOfferState`;\r\n public getCacheObjectType = () => 'FinancingOfferState';\r\n public dataCacheType = (): Msdyn365.CacheType => 'application';\r\n}\r\n\r\n// Create a data model here or import one to capture the response of the action\r\nexport interface IFinancingOfferStateData {\r\n isOpen: boolean;\r\n totalPrice?: number;\r\n financingOffer?: IFinancingOfferFormatted;\r\n}\r\n\r\n/**\r\n * Use this function to create the input required to make the action call\r\n */\r\nconst createInput = (args: Msdyn365.ICreateActionContext): Msdyn365.IActionInput => {\r\n return new FinancingOfferStateInput();\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 action(input: FinancingOfferStateInput, ctx: Msdyn365.IActionContext): Promise {\r\n return { isOpen: false };\r\n}\r\n\r\nexport default Msdyn365.createObservableDataAction({\r\n action: >action,\r\n id: 'FinancingOfferState',\r\n input: createInput\r\n});\r\n","/*--------------------------------------------------------------\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","/*!\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\n\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { FinancingOfferStateInput, IFinancingOfferStateData } from '../../../data-actions/financing-offer-state.action';\r\nimport { fireAnalyticsLink } from '../../../Utilities/analytics/clickTrack';\r\nimport {\r\n getCampaignRemainingCost,\r\n getValidSpecialCampaign,\r\n IFinancingOfferFormatted,\r\n selectFinancingOffer\r\n} from '../../../Utilities/select-financing-offer';\r\nimport { getQueryParamsFromQueryByName } from '../../../data-actions/utilities/utils';\r\nimport { variantQueryStringName } from '../../../Utilities/constants';\r\n\r\nexport type FinancingComponentPageType = 'PDP' | 'PLP';\r\n\r\nexport interface IFinancingPerMonthComponentProps {\r\n pageType: FinancingComponentPageType;\r\n sellingPrice: number;\r\n // tslint:disable-next-line:no-any\r\n context: ICoreContext<{ [x: string]: any }>;\r\n priceComponent?: JSX.Element;\r\n // VSI Customization - START\r\n sizeValue?: string | undefined;\r\n dimensionPrice?: number | undefined;\r\n percentDiff?: number | undefined;\r\n discountAmount?: number;\r\n categoryName?: String | undefined,\r\n activeVariantId: number | undefined,\r\n productId: number | undefined,\r\n activeColorVariantId: number | undefined,\r\n isLoadedPriceComponent?: boolean | undefined\r\n // VSI Customization - END\r\n}\r\n\r\nexport const FinancingPerMonthComponent: React.FC = ({\r\n pageType,\r\n sellingPrice,\r\n context,\r\n priceComponent,\r\n sizeValue,\r\n dimensionPrice,\r\n percentDiff,\r\n discountAmount,\r\n categoryName,\r\n activeVariantId,\r\n productId,\r\n activeColorVariantId,\r\n isLoadedPriceComponent\r\n}) => {\r\n const selectedFinancingOffer: IFinancingOfferFormatted | undefined = selectFinancingOffer({\r\n limitedTimeFinancingOffers: context.app.config.limitedTimeFinancingOffers,\r\n everydayFinancingOffers: context.app.config.everydayFinancingOffers,\r\n totalPrice: sellingPrice\r\n });\r\n\r\n if (!sellingPrice) {\r\n return null;\r\n }\r\n const monthlyCost = selectedFinancingOffer && Math.ceil(sellingPrice / selectedFinancingOffer.numOfMonths);\r\n const stateUpdate: IFinancingOfferStateData = {\r\n isOpen: true,\r\n totalPrice: sellingPrice,\r\n financingOffer: selectedFinancingOffer\r\n };\r\n const url = new URL(window.location.href.toString());\r\n const variantId = Number(getQueryParamsFromQueryByName(url, variantQueryStringName)) || undefined;\r\n const openModal = () => {\r\n fireAnalyticsLink({\r\n eventName: 'internal navigation',\r\n eventCategory: 'internal links',\r\n eventAction: 'to: Financing Per Month modal',\r\n eventLabel: `from ${pageType} Financing Per Month “Learn How” link`,\r\n eventNoninteraction: 'false'\r\n });\r\n context.actionContext.update(new FinancingOfferStateInput(), stateUpdate);\r\n };\r\n // format currency and strip trailing zeros\r\n // TODO: remove the cents portion in a dynamic way for all currencies\r\n const formattedMonthlyCost = monthlyCost && context.cultureFormatter.formatCurrency(monthlyCost);\r\n const monthlyCostStrippedZeros = formattedMonthlyCost && formattedMonthlyCost.substring(0, formattedMonthlyCost.length - 3);\r\n\r\n const campaign = selectedFinancingOffer && getValidSpecialCampaign(selectedFinancingOffer);\r\n const campaignRemainingCost =\r\n campaign && selectedFinancingOffer && getCampaignRemainingCost(campaign, selectedFinancingOffer, sellingPrice);\r\n\r\n const formattedCampaignCost =\r\n campaign && campaignRemainingCost && context.cultureFormatter.formatCurrency(Math.ceil(campaignRemainingCost.cost));\r\n const campaignCostStrippedZeros = formattedCampaignCost && formattedCampaignCost?.substring(0, formattedCampaignCost.length - 3);\r\n\r\n const everydayFinancingMessage = context.app.config.everydayFinancingMessage;\r\n const limitedFinancingMessage = context.app.config.limitedFinancingMessage;\r\n const limitedCampaignFinancingMessage = context.app.config.limitedCampaignFinancingMessage;\r\n\r\n const sellingPriceDollars = sellingPrice.toFixed(2).split('.')[0];\r\n const sellingPriceCents = sellingPrice.toFixed(2).split('.')[1];\r\n\r\n const dimensionDollars = dimensionPrice?.toFixed(2).split('.')[0];\r\n const dimensionCents = dimensionPrice?.toFixed(2).split('.')[1];\r\n const readyToShow = activeVariantId === productId || activeColorVariantId === productId || variantId === productId || pageType === \"PLP\";\r\n const promotionalPeriod = selectedFinancingOffer?.numOfMonths;\r\n const validThroughDate = selectedFinancingOffer && selectedFinancingOffer.isLTO && (promotionalPeriod === 36 || promotionalPeriod === 48 || promotionalPeriod === 60) ? '' : ` Valid thru ${selectedFinancingOffer?.endDate} `;\r\n // tslint:disable: react-this-binding-issue jsx-no-lambda react-a11y-event-has-role\r\n return pageType === 'PDP' ? (\r\n
\r\n
\r\n
0 && Number(percentDiff) < 100 && discountAmount !== 0 ? 'product-price' : 'product-price-black'}>\r\n\r\n {Number(percentDiff) > 0 && discountAmount !== 0 ? readyToShow ?\r\n <>\r\n ${sellingPriceDollars}\r\n {sellingPriceCents}\r\n \r\n \r\n ${dimensionDollars}\r\n {dimensionCents}\r\n \r\n {percentDiff && percentDiff.toFixed()}% Off\r\n \r\n : <> : readyToShow ? priceComponent || (\r\n <>\r\n ${sellingPriceDollars}\r\n {sellingPriceCents}\r\n ) : <>\r\n }\r\n
\r\n
\r\n {selectedFinancingOffer && (\r\n <>\r\n {campaign && campaignRemainingCost ? (\r\n
\r\n {/* commented as per story no 21902 */}\r\n {/*
Pay as low as
*/}\r\n
or {`$${Math.ceil(\r\n campaign.initialMonthlyAmount\r\n )}/mo for the first ${campaign.numOfDiscountedMonths} months`}
\r\n {/* tslint:disable-next-line: react-this-binding-issue jsx-no-lambda react-a11y-event-has-role*/}\r\n
e.stopPropagation()}>\r\n {/* {`Then $${Math.ceil(campaignRemainingCost.cost)}/mo for ${\r\n campaignRemainingCost?.months\r\n } months with 0% APR with Mattress Firm Credit Card.Limited Time.`} */}\r\n {limitedCampaignFinancingMessage &&\r\n limitedCampaignFinancingMessage\r\n .replace('{campaignCost}', campaignCostStrippedZeros)\r\n .replace('{campaignMonths}', campaignRemainingCost?.months)}\r\n \r\n Learn How\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n ) : (\r\n
\r\n {/* commented as per story no 21902 */}\r\n {/*
Pay as low as
*/}\r\n {/*
\r\n {pageType === 'PDP' ? `${monthlyCostStrippedZeros}/mo` : `${monthlyCostStrippedZeros} / mo`}\r\n
*/}\r\n {/* tslint:disable-next-line: react-this-binding-issue jsx-no-lambda react-a11y-event-has-role*/}\r\n
e.stopPropagation()}>\r\n {/* {pageType === 'PDP' ? `${monthlyCostStrippedZeros}/mo` : `${monthlyCostStrippedZeros} / mo`} */}\r\n {selectedFinancingOffer.isLTO\r\n ? `${limitedFinancingMessage &&\r\n limitedFinancingMessage.replace(\r\n '{numOfMonths}',\r\n selectedFinancingOffer.numOfMonths\r\n )}${(pageType === 'PDP' && validThroughDate)}`\r\n : everydayFinancingMessage &&\r\n everydayFinancingMessage\r\n .replace('{monthlyCostStrippedZeros}', monthlyCostStrippedZeros)\r\n .replace('{numOfMonths}', selectedFinancingOffer.numOfMonths)}\r\n {/* ? `0% Interest with ${\r\n selectedFinancingOffer.numOfMonths\r\n } equal monthly payments. Limited Time.${(pageType === 'PDP' &&\r\n ` Valid thru ${selectedFinancingOffer.endDate} `) ||\r\n ''}`\r\n :`Suggested payments with ${selectedFinancingOffer.numOfMonths} months special financing. `} */}\r\n \r\n Learn How\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n )}\r\n \r\n )}\r\n
\r\n ) : (\r\n
\r\n
\r\n {/* VSI Customization - START */}\r\n
{pageType === 'PLP' ? (sizeValue ? sizeValue : 'Starting at') : null}
\r\n {/* VSI Customization - END */}\r\n
{priceComponent || `${context.cultureFormatter.formatCurrency(sellingPrice)}`}
\r\n
\r\n {selectedFinancingOffer && (\r\n <>\r\n
\r\n OR\r\n
\r\n {campaign && campaignRemainingCost ? (\r\n
\r\n {/* commented as per story no 21902 */}\r\n {/*
Pay as low as
*/}\r\n
{`$${Math.ceil(\r\n campaign.initialMonthlyAmount\r\n )}/mo for the first ${campaign.numOfDiscountedMonths} months`}
\r\n {/* tslint:disable-next-line: react-this-binding-issue jsx-no-lambda react-a11y-event-has-role*/}\r\n
e.stopPropagation()}>\r\n {/* {`Then $${Math.ceil(campaignRemainingCost.cost)}/mo for ${\r\n campaignRemainingCost?.months\r\n } months with 0% APR with Mattress Firm Credit Card.Limited Time.`} */}\r\n {limitedCampaignFinancingMessage &&\r\n limitedCampaignFinancingMessage\r\n .replace('{campaignCost}', campaignCostStrippedZeros)\r\n .replace('{campaignMonths}', campaignRemainingCost?.months)}\r\n \r\n Learn How\r\n \r\n
\r\n
\r\n ) : (\r\n
\r\n {/* tslint:disable-next-line: react-this-binding-issue jsx-no-lambda react-a11y-event-has-role*/}\r\n
\r\n {pageType === 'PLP' ? `${monthlyCostStrippedZeros}/mo` : `${monthlyCostStrippedZeros} / mo`}\r\n
\r\n
e.stopPropagation()}>\r\n {selectedFinancingOffer.isLTO\r\n ? `${limitedFinancingMessage &&\r\n limitedFinancingMessage.replace(\r\n '{numOfMonths}',\r\n selectedFinancingOffer.numOfMonths\r\n ).replace('{monthlyCostStrippedZeros}', monthlyCostStrippedZeros)\r\n }`\r\n : everydayFinancingMessage &&\r\n everydayFinancingMessage\r\n .replace('{numOfMonths}', selectedFinancingOffer.numOfMonths)\r\n .replace('{monthlyCostStrippedZeros}', monthlyCostStrippedZeros)\r\n }\r\n \r\n Learn How\r\n \r\n
\r\n
\r\n )}\r\n \r\n )}\r\n
\r\n );\r\n};\r\n"],"names":["fireAnalyticsLink","searchTerm","searchType","eventName","eventCategory","eventAction","eventLabel","eventType","eventNoninteraction","enhancedAction","generalConfig","promoConfig","productConfig","customerConfig","productImpressionConfig","callUtagLink","event","event_category","event_action","event_label","event_type","event_noninteraction","enhanced_action","search_term","search_type","BVRatingSummary","itemId","onClick","variantId","hideReadReviewsButton","dataBvProductIdAttr","setDataBvProductIdAttr","useState","wrapper","useRef","interval","numReviews","current","querySelector","innerHTML","match","useEffect","style","display","React","onMouseEnter","window","setInterval","button","Array","from","document","querySelectorAll","find","outerHTML","onMouseLeave","clearInterval","ref","variantQueryStringName","getBVAttributeValues","attributeValues","key","value","attr","Name","trim","TextValue","Math","round","getBVAttributeValuesUnbxd","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","split","e","startMoment","replace","endMoment","startMomentFormatted","endMomentFormatted","isValid","baseUrl","apiSettings","baseImageUrl","substring","length","removed$","parsedBadgeType","toLowerCase","altText","src","alt","start","convertTimeZone","end","time","local","buildProductBadge","parsedBadgeData","Image","className","gridSettings","title","imageSettings","renderProductBadge","attributeName","finalizedBadges","map","badge","parsedBadge","fallBackBrandAttribute","parseBrandName","attributes","backendAttribute","recordId","attribute","productBrandName","hasArray","currAttribute","MsDyn365","getLocalStorage","localStorage","getItem","bonusItemArray","JSON","parse","checkBrandName","item","productId","brandName","parseBrandNameUnbxd","getBrandNameCheck","getValidSpecialCampaign","financingOffer","specialCampaign","enableCampaign","initialMonthlyAmount","numOfDiscountedMonths","isCampaignScheduled","getCampaignRemainingCost","campaign","totalPrice","remainingCost","remainingMonths","numOfMonths","cost","months","offer","tempOffer","Object","create","campaignValidStartDate","campaignValidEndDate","isScheduled","add","startDateCentralTime","endDateCentralTime","now","selectFinancingOffer","returnCustomOfferArray","campaignFound","limitedTimeFinancingOffers","everydayFinancingOffers","specialFinancingOffer","synchronySpecialFinancingCondition","specialFinancingEnable","highestMinimumPurchase","bestOffer","costPerMonth","isLTO","minPurchase","everydayFinancingOfferMessage","limitedFinancingOfferMessage","monthlyOfferDetails","financingOfferDescription","disclaimer","offerFound","everydayOffers","specialOffer","validLimitedTimeFinancingOffers","filter","offerValidStartDate","offerValidEndDate","isValidLimitedTimeOffer","forEach","currentOfferAccepted","noInterestFor","ceil","offerName","push","isAfter","currentOffer","specialCampaignOffer","checkoutDisplay","validCampaign","undefined","FinancingOfferStateInput","constructor","getCacheKey","getCacheObjectType","dataCacheType","Msdyn365","action","async","input","ctx","isOpen","id","args","getSelectedProductIdFromActionInput","inputData","context","app","config","queryBasedVariantSelection","getQueryParamsFromQueryByName","url","requestUrl","query","urlTokens","pageType","inputUrl","queryParamName","URL","toString","toLocaleLowerCase","searchParams","get","Number","isNaN","generateImageUrl","imageUrl","startsWith","encodeURIComponent","DimensionTypes","DimensionSwatchDisplayTypes","getFallbackImageUrl","parsedItemId","productUrl","convertProductDimensionTypeToDimensionTypes","productDimensionType","ProductDimensionType","color","configuration","size","none","parseDimensionsFromUrl","urlParameters","parsedDimensions","dimension","localDimensionType","DimensionTypeValue","DimensionValue","RecordId","Value","parseDimensionFromUrl","ArrayExtensions","getDimensionValuesFromQuery","FinancingPerMonthComponent","sellingPrice","priceComponent","sizeValue","dimensionPrice","percentDiff","discountAmount","categoryName","activeVariantId","activeColorVariantId","isLoadedPriceComponent","selectedFinancingOffer","monthlyCost","stateUpdate","location","href","openModal","actionContext","update","formattedMonthlyCost","cultureFormatter","formatCurrency","monthlyCostStrippedZeros","campaignRemainingCost","formattedCampaignCost","campaignCostStrippedZeros","everydayFinancingMessage","limitedFinancingMessage","limitedCampaignFinancingMessage","sellingPriceDollars","toFixed","sellingPriceCents","dimensionDollars","dimensionCents","readyToShow","promotionalPeriod","validThroughDate","stopPropagation","role"],"sourceRoot":""}