{"version":3,"file":"static/js/539099108d73fbf478b4.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/get-bv-attributes.ts?f55a","webpack://mattressfirm/./src/Utilities/get-product-badge.tsx?635b","webpack://mattressfirm/./src/Utilities/select-financing-offer.tsx?5f53","webpack://mattressfirm/./src/common/components/error-boundary.tsx?6c0c","webpack://mattressfirm/./src/data-actions/financing-offer-state.action.ts?9faa","webpack://mattressfirm/./src/themes/mattressfirm/custom-components/CustomSkeleton/index.tsx?ef9d","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, setNumReviews] = useState();\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 useEffect(() => {\r\n const pollInterval = window.setInterval(() => {\r\n const numReviewsHTML = wrapper.current?.querySelector('.bv_numReviews_text')?.innerHTML.match(/\\(([^)]+)\\)/)?.[1];\r\n if (numReviewsHTML) {\r\n setNumReviews(numReviewsHTML);\r\n clearInterval(pollInterval);\r\n }\r\n }, 0);\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","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 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 { 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 lowCostFinancingOfferMessage: string,\r\n cashbackFinancingOfferMessage: 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; specialOffer?: string},\r\n FinancingOfferDataOnPage?: RichText;\r\n cashBackPercentageAmount?: number;\r\n cashbackBannerDetails?: RichText;\r\n}\r\nexport interface ILowCostOffer {\r\n offerName?: string;\r\n maxPurchase: number;\r\n lowCostFinancingOfferMessage: string,\r\n financingOfferDescription: RichText;\r\n disclaimer: RichText;\r\n defaultNumberOfMonths: number;\r\n lowCostOfferDetailsOnCart?: RichText;\r\n}\r\n\r\n\r\nexport interface IFinancingOfferFormatted {\r\n lowCostOfferDetailsOnCart?: RichText;\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 lowCostFinancingOfferMessage?: string;\r\n everydayFinancingOfferMessage?: string;\r\n limitedFinancingOfferMessage?: string;\r\n cashbackFinancingOfferMessage?: string;\r\n financingOfferDescription: RichText;\r\n disclaimer: RichText;\r\n specialCampaign?: IFinancingOfferCampaign;\r\n offerName?: string;\r\n checkoutDisplay?: { heading: string; details: string; specialOffer?: string },\r\n FinancingOfferDataOnPage?: RichText;\r\n isCashBack?: boolean;\r\n cashBackPercentageAmount?: number;\r\n cashbackBannerDetails?: RichText;\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 lowCostOffer?: ILowCostOffer[]\r\n totalPrice: number | undefined;\r\n specialFinancingOffer?: IFinancingOffer[];\r\n synchronySpecialFinancingCondition?: boolean;\r\n specialFinancingEnable?: boolean;\r\n checkoutShowEveryDayOffers?: boolean;\r\n cashbackFinancingEnable?: boolean;\r\n cashBackFinancingOffer?: IFinancingOffer[];\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 = [], lowCostOffer = [], totalPrice = 0, specialFinancingOffer = [], synchronySpecialFinancingCondition = false, specialFinancingEnable = false, checkoutShowEveryDayOffers, cashbackFinancingEnable = false, cashBackFinancingOffer = [] }: 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 cashbackFinancingOfferMessage: '',\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 offerName: offer.offerName,\r\n financingOfferDescription: offer.financingOfferDescription,\r\n disclaimer: offer.disclaimer,\r\n FinancingOfferDataOnPage: offer?.FinancingOfferDataOnPage,\r\n checkoutDisplay: offer?.checkoutDisplay\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 cashbackFinancingOfferMessage: offer.cashbackFinancingOfferMessage,\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 // if cashback enabled and has length check for cashback offer\r\n if (cashbackFinancingEnable && cashBackFinancingOffer?.length) {\r\n cashBackFinancingOffer.forEach((offer) => {\r\n const minPurchase = offer.minPurchase ? offer.minPurchase : 0;\r\n // if minimum purchase criteria is met, then create best offer\r\n if (totalPrice >= minPurchase) {\r\n const cashBackOffer = {\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 offerName: offer?.offerName,\r\n financingOfferDescription: offer?.financingOfferDescription,\r\n disclaimer: offer?.disclaimer,\r\n FinancingOfferDataOnPage: offer?.FinancingOfferDataOnPage,\r\n isCashBack: cashbackFinancingEnable,\r\n checkoutDisplay: offer?.checkoutDisplay,\r\n cashBackPercentageAmount: offer?.cashBackPercentageAmount,\r\n cashbackBannerDetails: offer?.cashbackBannerDetails,\r\n cashbackFinancingOfferMessage: offer?.cashbackFinancingOfferMessage\r\n };\r\n offerFound = true;\r\n bestOffer = cashBackOffer;\r\n }\r\n\r\n // check if current offer expired\r\n if (offerFound && 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 // if no offer found then check limited time financing offers\r\n if (!offerFound || !isScheduled(bestOffer)) {\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 cashbackFinancingOfferMessage: offer.cashbackFinancingOfferMessage,\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 no offer found then check everyday financing offer\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 = checkoutShowEveryDayOffers ? 0 : 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 cashbackFinancingOfferMessage: offer.cashbackFinancingOfferMessage,\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 cashbackFinancingOfferMessage: offer.cashbackFinancingOfferMessage,\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 // 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 if (lowCostOffer?.length) {\r\n lowCostOffer.forEach((offer: ILowCostOffer) => {\r\n if (totalPrice <= offer.maxPurchase && offer.offerName?.toLowerCase() === 'low cost offer') {\r\n const LCO = {\r\n offerName: offer.offerName,\r\n maxPurchase: offer.maxPurchase || 0,\r\n lowCostFinancingOfferMessage: offer.lowCostFinancingOfferMessage,\r\n financingOfferDescription: offer?.financingOfferDescription?.replace(/{defaultNumOfMonths}/g, `${offer?.defaultNumberOfMonths?.toString() || 6}`),\r\n disclaimer: offer.disclaimer,\r\n lowCostOfferDetailsOnCart: offer.lowCostOfferDetailsOnCart\r\n };\r\n highestMinimumPurchase = offer.maxPurchase;\r\n offerFound = true;\r\n // @ts-ignore\r\n bestOffer = LCO;\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","import * as React from \"react\";\r\nimport { ITelemetry } from '@msdyn365-commerce/core';\r\ninterface ErrorBoundaryState {\r\n hasError: boolean;\r\n errorMessage: string;\r\n}\r\n\r\ninterface ErrorBoundaryProps {\r\n showMessage?: boolean | string; //true to show the error message, set to string to show custom message\r\n telemetry: ITelemetry\r\n}\r\n\r\n\r\n// Put this in a child component to mock an error in order to test ErrorBoundary.\r\nexport const MockError = (props: {message?: string}) => {\r\n throw new Error(props.message);\r\n};\r\n\r\nexport class ErrorBoundary extends React.Component {\r\n constructor(props: ErrorBoundaryProps) {\r\n super(props);\r\n this.state = {\r\n hasError: false,\r\n errorMessage: \"\"\r\n };\r\n }\r\n\r\n\r\n // @ts-ignore\r\n private static getDerivedStateFromError(error: any) {\r\n // Update state so the next render will show the fallback UI.\r\n return { hasError: true, errorMessage: error.message };\r\n }\r\n\r\n// public componentDidCatch(error: any, errorInfo: any) {\r\n// // You can also log the error to an error reporting service\r\n// logErrorToMyService(error, errorInfo);\r\n// }\r\n\r\n public render() {\r\n const bgColor = \"rgba(0,0,255)\";\r\n\r\n if (this.state.hasError) {\r\n const { showMessage } = this.props;\r\n const message = typeof showMessage === 'string' ? showMessage : showMessage ? this.state.errorMessage : false;\r\n this.props?.telemetry?.error(this.state?.errorMessage);\r\n // TODO design this custom UI fallback\r\n return message ?
{message}
: null;\r\n }\r\n\r\n return this.props.children || null;\r\n }\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","import React, { FunctionComponent } from 'react';\r\n\r\n\r\ninterface Props {\r\n /** Sets the skeleton-pulse style */\r\n type?: 'text' | 'image' | 'button' | 'button-secondary';\r\n /** Sets the width of the skeleton. Default unit is px. */\r\n width?: number | string;\r\n /** Sets the height of the skeleton. Default unit is px. */\r\n height?: number | string;\r\n /** Makes the skeleton look like a circle */\r\n circle?: boolean;\r\n /** Override classNames on wrapper */\r\n className?: string;\r\n /** Override styles on wrapper */\r\n style?: object;\r\n [rest: string]: unknown; // ...rest property\r\n}\r\n\r\nconst getValidCSSInput = (input: string | number) => {\r\n switch (typeof input) {\r\n case 'undefined':\r\n case 'boolean':\r\n return null;\r\n case 'number':\r\n return `${input}px`;\r\n default:\r\n const parsedInput = parseFloat(input);\r\n const unit = input.match(/%|em/);\r\n return isNaN(parsedInput) ? '' : unit ? `${parsedInput}${unit}` : `${parsedInput}px`;\r\n }\r\n};\r\n\r\nconst CustomSkeleton: FunctionComponent = ({\r\n width,\r\n height,\r\n circle,\r\n type = 'text',\r\n className = '',\r\n style = {},\r\n ...rest\r\n}) => {\r\n const isTextType = type === 'text';\r\n const classNames = `pulse ${!className ? type : ``} ${isTextType ? 'transform' : ''} ${type === 'button-secondary' && !className ? 'button' : ''} ${circle ? 'circle' : ''} ${className}`;\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default CustomSkeleton;\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, RichTextComponent } 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\nimport CustomSkeleton from './CustomSkeleton';\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 parentCategory?: string | 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 parentCategory\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 lowCostOffer: context.app.config.lowCostFinancingOffers,\r\n cashBackFinancingOffer: context.app.config.cashBackFinancingOffer,\r\n cashbackFinancingEnable: context.app.config.cashbackFinancingEnable,\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 cashbackFinancingMessage = context.app.config?.cashbackFinancingMessage;\r\n const pdpCashbackFinancingMessage = context.app.config?.pdpCashbackFinancingMessage;\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 const offerMinPurchase =\r\n selectedFinancingOffer && context.cultureFormatter.formatCurrency(Math.ceil(selectedFinancingOffer.minPurchase));\r\n const offerMinPurchaseStrippedZeros = offerMinPurchase && offerMinPurchase?.substring(0, offerMinPurchase.length - 3);\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 ) : selectedFinancingOffer.offerName?.toLowerCase() === 'low cost offer' ?\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 {selectedFinancingOffer.lowCostFinancingOfferMessage}\r\n \r\n Learn How\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?.isCashBack ? pdpCashbackFinancingMessage &&\r\n :\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
\r\n
\r\n )\r\n :\r\n selectedFinancingOffer.offerName?.toLowerCase() === 'low cost offer' ?\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

{selectedFinancingOffer.lowCostFinancingOfferMessage?.replace('.', '.\\n')}

\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?.isCashBack ? cashbackFinancingMessage &&\r\n :\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
\r\n
\r\n )}\r\n \r\n )}\r\n
\r\n );\r\n};\r\n"],"names":["fireAnalyticsLink","_ref","searchTerm","searchType","eventName","eventCategory","eventAction","eventLabel","eventType","eventNoninteraction","enhancedAction","generalConfig","promoConfig","productConfig","customerConfig","productImpressionConfig","callUtagLink","_objectSpread","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","setNumReviews","useEffect","pollInterval","window","setInterval","_wrapper$current","numReviewsHTML","current","querySelector","innerHTML","match","clearInterval","style","display","React","onMouseEnter","button","Array","from","document","querySelectorAll","find","outerHTML","onMouseLeave","ref","getBVAttributeValues","attributeValues","key","_attributeValues$find","value","attr","_attr$Name","Name","trim","TextValue","Math","round","getBVAttributeValuesUnbxd","_attributeValues$key","dayjs","tz","utc","isBetween","format","defaultImageSettings","viewports","xs","q","w","h","disableLazyLoad","parseBadgeData","badgeData","requestContext","_startTime","_endTime","dataSegments","scheduleStart","scheduleEnd","badgeType","parsedScheduleStart","startDate","startTime","parsedScheduleEnd","endDate","endTime","split","e","startMoment","replace","endMoment","startMomentFormatted","endMomentFormatted","isValid","baseUrl","apiSettings","baseImageUrl","substring","length","removed$","src","toLowerCase","alt","start","convertTimeZone","end","time","local","buildProductBadge","parsedBadgeData","Image","className","gridSettings","altText","title","imageSettings","renderProductBadge","attributeName","finalizedBadges","map","badge","parsedBadge","getValidSpecialCampaign","financingOffer","specialCampaign","enableCampaign","initialMonthlyAmount","numOfDiscountedMonths","isCampaignScheduled","getCampaignRemainingCost","campaign","totalPrice","remainingCost","remainingMonths","numOfMonths","cost","months","offer","_tempOffer$specialCam","_tempOffer$specialCam2","tempOffer","Object","create","_tempOffer$specialCam3","_tempOffer$specialCam4","campaignValidStartDate","campaignValidEndDate","isScheduled","add","startDateCentralTime","endDateCentralTime","now","selectFinancingOffer","returnCustomOfferArray","campaignFound","limitedTimeFinancingOffers","everydayFinancingOffers","lowCostOffer","specialFinancingOffer","synchronySpecialFinancingCondition","specialFinancingEnable","checkoutShowEveryDayOffers","cashbackFinancingEnable","cashBackFinancingOffer","highestMinimumPurchase","bestOffer","costPerMonth","isLTO","minPurchase","everydayFinancingOfferMessage","limitedFinancingOfferMessage","cashbackFinancingOfferMessage","monthlyOfferDetails","financingOfferDescription","disclaimer","offerFound","everydayOffers","specialOffer","validLimitedTimeFinancingOffers","filter","offerValidStartDate","offerValidEndDate","isValidLimitedTimeOffer","forEach","currentOfferAccepted","noInterestFor","ceil","offerName","FinancingOfferDataOnPage","checkoutDisplay","push","isAfter","cashBackOffer","isCashBack","cashBackPercentageAmount","cashbackBannerDetails","currentOffer","specialCampaignOffer","validCampaign","undefined","_offer$offerName","maxPurchase","_offer$financingOffer","_offer$defaultNumberO","LCO","lowCostFinancingOfferMessage","defaultNumberOfMonths","toString","lowCostOfferDetailsOnCart","ErrorBoundary","constructor","props","super","this","state","hasError","errorMessage","error","message","render","_this$props","_this$state","showMessage","telemetry","background","padding","color","children","FinancingOfferStateInput","getCacheKey","getCacheObjectType","dataCacheType","Msdyn365","action","async","input","ctx","isOpen","id","args","getValidCSSInput","parsedInput","parseFloat","unit","isNaN","_getValidCSSInput","_getValidCSSInput2","width","height","circle","type","rest","_objectWithoutProperties","_excluded","classNames","assign","borderRadius","FinancingPerMonthComponent","_context$app$config","_context$app$config2","_limitedCampaignFinan","_selectedFinancingOff","_pdpCashbackFinancing","_everydayFinancingMes","_limitedCampaignFinan2","_selectedFinancingOff2","_selectedFinancingOff3","_cashbackFinancingMes","_limitedFinancingMess","_everydayFinancingMes2","pageType","sellingPrice","context","priceComponent","sizeValue","dimensionPrice","percentDiff","discountAmount","categoryName","activeVariantId","productId","activeColorVariantId","isLoadedPriceComponent","parentCategory","selectedFinancingOffer","app","config","lowCostFinancingOffers","monthlyCost","stateUpdate","url","URL","location","href","Number","getQueryParamsFromQueryByName","variantQueryStringName","openModal","actionContext","update","formattedMonthlyCost","cultureFormatter","formatCurrency","monthlyCostStrippedZeros","campaignRemainingCost","formattedCampaignCost","campaignCostStrippedZeros","cashbackFinancingMessage","pdpCashbackFinancingMessage","everydayFinancingMessage","limitedFinancingMessage","limitedCampaignFinancingMessage","sellingPriceDollars","toFixed","sellingPriceCents","dimensionDollars","dimensionCents","readyToShow","promotionalPeriod","validThroughDate","offerMinPurchase","offerMinPurchaseStrippedZeros","CustomSkeleton","stopPropagation","role","RichTextComponent","text"],"sourceRoot":""}