{"version":3,"file":"static/js/1f9becbe0485c21b0822.bundle.js","mappings":"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","sources":["webpack://mattressfirm/./src/Utilities/analytics/clickTrack.ts?bce2","webpack://mattressfirm/./src/Utilities/analytics/utagCaller.ts?3814","webpack://mattressfirm/./src/Utilities/constants.ts?8bdf","webpack://mattressfirm/./src/Utilities/get-bv-attributes.ts?f55a","webpack://mattressfirm/./src/Utilities/get-delivery-by-message.tsx?05db","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 { IAnalyticsConfiguration } from './clickTrack';\r\n\r\n// Interface for 3rd-party function. AKA utag.\r\ninterface ITealium {\r\n link(data: {}): void | false;\r\n view(data: {}): void | false;\r\n data(data: {}): void | false;\r\n}\r\n\r\nexport interface IPromotionConfig {\r\n event?: string | null;\r\n event_name?: string | null;\r\n search_term?: string | null;\r\n search_type?: string | null;\r\n event_category?: string | null;\r\n event_action?: string | null;\r\n event_label?: string | null;\r\n event_type?: string | null;\r\n event_noninteraction?: string;\r\n enhanced_action?: string | null;\r\n customer_email?: string | undefined;\r\n customer_phone_number?: string | undefined;\r\n first_name?: string | undefined;\r\n last_name?: string | undefined;\r\n address1?: string | undefined;\r\n address2?: string | undefined;\r\n city?: string | undefined;\r\n state?: string | undefined;\r\n zip_code?: string | undefined;\r\n order_subtotal?: string | undefined;\r\n order_currency?: string | undefined;\r\n country?: string | undefined;\r\n // productConfig?: IProductDataConfig;\r\n checkout_step?: string;\r\n checkout_option?:(string | undefined)[];\r\n checkout_type?:(string | undefined)[];\r\n product_id?: (string | undefined)[];\r\n product_name?: (string | undefined)[];\r\n product_category?: (string | undefined)[];\r\n product_brand?: (string | undefined)[];\r\n product_variant?: (string | undefined | number)[];\r\n product_price?: (string | undefined)[];\r\n product_quantity?: (string | undefined)[];\r\n product_url?: (string | undefined)[];\r\n product_size?: (string | undefined)[];\r\n product_image_url?: (string | undefined)[];\r\n core_item_flag?: string | null;\r\n funnel_type?: string | null;\r\n ga_title?: string | null;\r\n ga_location?: string | null;\r\n}\r\n\r\ninterface IProductDataConfig {\r\n product_variant?: (string | undefined)[];\r\n product_price?: (string | undefined)[];\r\n}\r\n\r\nexport interface IAnalyticsConfigurationData {\r\n productConfig?: IProductDataConfig;\r\n}\r\n\r\n\r\n// Legacy function\r\nexport const callUtag = async (objToCall: IPromotionConfig) => {\r\n void await callUtagLink(objToCall);\r\n};\r\n\r\n/**\r\n * Tealium dispatch click tracking.\r\n * @param objToCall\r\n */\r\nexport const callUtagLink = async (objToCall: IPromotionConfig | IAnalyticsConfiguration) => {\r\n try {\r\n Object.keys(objToCall).forEach(\r\n key => {\r\n if (objToCall[key] === null) {\r\n delete objToCall[key];\r\n }\r\n }\r\n );\r\n // If utag doesn't exist in the global scope, set as false.\r\n const utag: ITealium = global.hasOwnProperty('utag') ? global[\"utag\"] : false;\r\n if(utag) { utag.link(objToCall); }\r\n\r\n } catch (e) {\r\n console.log('Utag Error', e);\r\n }\r\n};\r\n\r\n/**\r\n * Tealium dispatch view tracking.\r\n * @param objToCall\r\n */\r\nexport const callUtagView = async (objToCall: {}) => {\r\n try {\r\n // If utag doesn't exist in the global scope, set as false.\r\n const utag: ITealium = global.hasOwnProperty('utag') ? global[\"utag\"] : false;\r\n if(utag) { utag.view(objToCall); }\r\n } catch (e) {\r\n console.log('utag View Error', e);\r\n }\r\n};\r\n\r\n/**\r\n * Not currently implemented.\r\n * @param objToCall\r\n * @param dataType\r\n */\r\nexport const callUtagData = ({ productConfig = {} }: IAnalyticsConfigurationData , dataType: string) => {\r\n try {\r\n // If utag doesn't exist in the global scope, set as false.\r\n const utag: ITealium = global.hasOwnProperty('utag') ? global[\"utag\"] : false;\r\n switch (dataType) {\r\n case 'data':\r\n // @ts-ignore\r\n if(utag) { utag.data = {...utag.data, ...productConfig}; }\r\n break;\r\n case '_data':\r\n // @ts-ignore\r\n utag_data = {...utag_data , ...productConfig};\r\n break;\r\n default:\r\n null;\r\n }\r\n } catch (e) {\r\n console.log('Utag Error', e);\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 { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { IMFICLDeliveryScheduleParameters } from '../actions/CoreProductDataServiceEntities.g';\r\nimport getDeliveryMessageAction, { GetDeliveryMessageInput } from '../actions/get-delivery-message.action';\r\n\r\nconst _getDeliveryByMessage = async (request: IMFICLDeliveryScheduleParameters, context: ICoreContext>, isCached?: boolean) => {\r\n if (request) {\r\n const getDeliveryMessageActionInput = new GetDeliveryMessageInput(request, isCached);\r\n try {\r\n let result;\r\n // eslint-disable-next-line prefer-const\r\n result = await getDeliveryMessageAction(getDeliveryMessageActionInput, context.actionContext);\r\n if (result) {\r\n return result;\r\n }\r\n } catch (error) {\r\n console.log('Error', error);\r\n }\r\n }\r\n return null;\r\n};\r\n\r\nexport default _getDeliveryByMessage;\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 // TODO: Determine if the results of this get action should cache the results and if so provide\r\n // a cache object type and an appropriate cache key\r\n public getCacheKey = () => `FinancingOfferState`;\r\n public getCacheObjectType = () => 'FinancingOfferState';\r\n public dataCacheType = (): Msdyn365.CacheType => 'application';\r\n}\r\n\r\n// TODO: 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 * TODO: 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 * TODO: 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 // 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}) => {\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 :
\r\n
\r\n
: readyToShow ? priceComponent || (\r\n <>\r\n ${sellingPriceDollars}\r\n {sellingPriceCents}\r\n ) :
\r\n
\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","callUtag","async","objToCall","Object","keys","forEach","key","utag","global","hasOwnProperty","link","e","console","log","callUtagView","view","variantQueryStringName","getBVAttributeValues","attributeValues","value","find","attr","Name","trim","TextValue","Math","round","getBVAttributeValuesUnbxd","request","context","isCached","getDeliveryMessageActionInput","GetDeliveryMessageInput","result","getDeliveryMessageAction","actionContext","error","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","startMoment","replace","endMoment","startMomentFormatted","endMomentFormatted","isValid","baseUrl","apiSettings","baseImageUrl","substring","length","removed$","parsedBadgeType","toLowerCase","altText","src","alt","start","convertTimeZone","end","time","local","buildProductBadge","parsedBadgeData","React","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","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","currentOfferAccepted","noInterestFor","ceil","offerName","push","isAfter","currentOffer","specialCampaignOffer","checkoutDisplay","validCampaign","undefined","FinancingOfferStateInput","constructor","getCacheKey","getCacheObjectType","dataCacheType","Msdyn365","action","input","ctx","isOpen","id","args","getSelectedProductIdFromActionInput","inputData","variantId","app","config","queryBasedVariantSelection","getQueryParamsFromQueryByName","url","requestUrl","query","urlTokens","itemId","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","style","none","parseDimensionsFromUrl","urlParameters","parsedDimensions","dimension","localDimensionType","DimensionTypeValue","DimensionValue","RecordId","Value","parseDimensionFromUrl","ArrayExtensions","getDimensionValuesFromQuery","FinancingPerMonthComponent","sellingPrice","priceComponent","sizeValue","dimensionPrice","percentDiff","discountAmount","categoryName","activeVariantId","activeColorVariantId","selectedFinancingOffer","monthlyCost","stateUpdate","window","location","href","openModal","update","formattedMonthlyCost","cultureFormatter","formatCurrency","monthlyCostStrippedZeros","campaignRemainingCost","formattedCampaignCost","campaignCostStrippedZeros","everydayFinancingMessage","limitedFinancingMessage","limitedCampaignFinancingMessage","sellingPriceDollars","toFixed","sellingPriceCents","dimensionDollars","dimensionCents","readyToShow","promotionalPeriod","validThroughDate","onClick","stopPropagation","role"],"sourceRoot":""}