{"version":3,"sources":["utils.js","Helpers/summaryconstants.js","stories/helpers/httpRequest.js","Services/ApiService.js","Services/Cache.js","Services/PostCache.js","Services/TcciService.js","Helpers/gtmHelper.js","Services/OcaService.js","financeUtils.js","Helpers/summarycalculator.js","Helpers/BuildHelper.js","Helpers/navhelper.js","Helpers/helpers.js","Components/1_Atoms/Svg/Svg.js","Components/3_Organisms/Nav/Nav.js","Components/3_Organisms/Modal/Modal.js","Components/1_Atoms/Button/Button.js","Components/2_Molecules/Tabs/TabsMenu.js","Components/3_Organisms/Modal/Modal_50_50.js","Helpers/tooltipHelper.js","Components/1_Atoms/Tooltip/Tooltip.js","Components/2_Molecules/AccessoryCard/AccessoryCard.js","Components/2_Molecules/Collapse/CollapseLegal.js","Components/3_Organisms/Pricing/Pricing.js","Components/3_Organisms/Modal/PreOrderModal.js","Components/3_Organisms/Alert/Alert.js","Components/3_Organisms/AccessoriesList/AccessoriesList.js","Components/2_Molecules/Jelly/Jelly.js","Components/5_Pages/Vehicles/Vehicles.js","Components/2_Molecules/360View/360View.js","Components/2_Molecules/360InteriorView/360InteriorView.js","Components/3_Organisms/360Container/360Container.js","Components/2_Molecules/Collapse/Collapse.js","Components/3_Organisms/TrimList/TrimList.js","Components/5_Pages/Trim/Trim.js","Components/2_Molecules/Collapse/CollapseList.js","Components/3_Organisms/Modal/OcaModal.js","Components/3_Organisms/Modal/ReserveModal.js","Components/3_Organisms/Financial/Financial.js","Components/2_Molecules/SpecsItem/SpecsItem.js","Components/3_Organisms/BuildSpecs/BuildSpecs.js","Components/3_Organisms/Accessories/Accessories.js","Components/2_Molecules/Collapse/CollapseSpecs.js","Components/3_Organisms/FeaturedSpecs/FeaturedSpecs.js","Components/3_Organisms/Packs/Packs.js","Components/5_Pages/Summary/Summary.js","Components/2_Molecules/EngineCard/EngineCard.js","Components/2_Molecules/PackageCard/PackageCard.js","Components/5_Pages/Option/Option.js","Components/2_Molecules/ColourCard/ColourCard.js","Components/5_Pages/Colours/Colours.js","Components/2_Molecules/WheelCard/WheelCard.js","Components/3_Organisms/WheelsList/WheelsList.js","Components/3_Organisms/WheelsImageContainer/WheelsImageContainer.js","Components/5_Pages/Wheels/Wheels.js","Components/5_Pages/Connectivity/Connectivity.js","Components/2_Molecules/Collapse/CollapseFinance.js","Components/2_Molecules/FinanceOptions/FinanceOptions.js","Components/2_Molecules/Collapse/CollapseLease.js","Components/2_Molecules/Collapse/CollapseLeaseMileage.js","Components/2_Molecules/LeaseOptions/LeaseOptions.js","Components/2_Molecules/CashOptions/CashOptions.js","Components/3_Organisms/Modal/TradeInModal.js","Components/2_Molecules/PricePayment/PricePayment.js","Components/5_Pages/Payments/Payments.js","Components/5_Pages/Protection/Protection.js","App.js","reportWebVitals.js","i18n.js","index.js"],"names":["getLang","document","querySelector","content","getProvince","window","location","href","includes","sessionStorage","getItem","dealerVars","JSON","parse","dealerProvinceCode","setCursorWaiting","isWaiting","style","cursor","getLoading","isLoading","t","bnp_under_maintenance","className","ReactHtmlParser","getMazdaFeesAndLeviesDetailTitle","title","getParams","str","queryString","keyValPairs","params","replace","length","pairNum","split","key","push","getApiBaseUrl","host","indexOf","process","getBaseUrl","protocol","get360Data","visual","exterior","interior","extCode","code","interiors","default_exterior","intCode","exteriors","baseAssetPath","file_path","imageAmount","end_index","filename_prefix","imageName","include_in_360","imagePath","find","currInt","filename","imagePathInterior","formatPrice","amount","noRounding","undefined","isNaN","fractions","locale","Number","toLocaleString","currency","minimumFractionDigits","maximumFractionDigits","convertNum","num","getFinanceWeekly","rate","term","testRate","result","Math","pow","getLeaseBiWeeklyFromOptions","ceil","getLeaseBiWeeklyFromMsrp","financialObj","subtotal","adminServiceFees","endValueLease","residual","element","goToTop","body","scrollTop","documentElement","getIncentiveDisplayName","incentive","type","getDisplayableProvinceName","toLowerCase","buildLegalContent","legalContentObject","legalIncentiveObject","legalContent","map","item","copy","hideCmsHiddenBlock","shownBlocks","querySelectorAll","forEach","e","classList","remove","add","hiddenBlocks","hideCmsFooterHiddenBlock","getCmsAwardsBlockFromCMS","year","carline","outerHTML","updateLanguageLink","languageLink","getElementById","hash","newLanguage","text","hashIndexPosition","substring","newHash","SummaryConstants","handleRequest","url","data","a","axios","method","headers","responseData","handleJsonRequest","ApiService","language","province","mockedModels","some","startsWith","mock","require","Object","assign","financial","this","model_years","model","insertMockData","url_slug","dataToReturn","trims","trim","models","option","packageCode","based_on","model_code","optionCode","fullModelCode","requestData","stringify","buildId","dealerId","NodeCache","Cache","_cache","stdTTL","cache","flushAll","res","queryParams","bodyParams","ReferenceError","Array","isArray","TypeError","queryObject","bodyObject","req","config","keys","elem","set","get","PostCache","cachedUrls","_axios","_cachedUrls","cacheable","cached","Promise","resolve","status","statusText","request","providerCalls","post","response","queryKeys","TcciService","postCache","summaryCalculator","SelectedColourExterior","SelectedColourInterior","totalAccessoriesResidualValue","entries","SelectedAccessories","accessory","residualValue","residual_value","round","Identifier","QuoteResponse","setCachedUrls","requestOptions","console","log","withFees","withRebates","productKey","loyaltyChecked","graduateChecked","militaryChecked","firstTimeOwnerChecked","selectedAnnualMileage","SelectedModel","FinancialInfo","mazdaCashIncentive","incentive_programs","filter","fee","price","loyaltyPriceRate","LoyaltyChecked","x","rate_value","loyaltyPrice","cash_value","graduatePrice","GraduateChecked","value","militaryPrice","MilitaryChecked","firstTimeOwnerPrice","FirstTimeOwnerChecked","incentives","calculatedFinance","specialIncentives","modelCode","SelectedPackage","option_code","annualMileage","baseMSRP","msrp","options","SelectedWheel","SelectedNonModelPackage","SelectedWarrantyPackage","SelectedConnectedVehiclePackage","SelectedAddedProtectionPackage","SelectedAppearanceProtectionPlansPackage","accessories","total","totalMSRP","exciseTax","freight","pde","acTax","amvic","omvic","tireStewardshipFee","oil","tradeInVal","parseInt","_tradeInValue","maxDownPayment","DownPaymentValue","downPaymentValue","TradeInValue","IncludeFees","balanceToFinance","calculatedLease","leaseEndValue","balanceToFinanceNoFees","leaseEndValueNoFees","parseFloat","toFixed","getResidualTotal","_downPaymentValue","leaseServiceFees","firstTimeOwner","buildBodyJson","leaseObject","weekly","Lease","Quote","WeeklyPayment","biWeekly","BiWeeklyPayment","monthly","MonthlyPayment","weeklyWithTaxes","WeeklyPaymentWithTaxes","biWeeklyWithTaxes","BiWeeklyPaymentWithTaxes","monthlyWithTaxes","MonthlyPaymentWithTaxes","leaseRate","LeaseRate","Freight","Pde","airConditioningTax","AirConditioningTax","omvicFee","OmvicFee","amvicFee","AmvicFee","TireStewardshipFee","oilFilterFee","OilFilterFee","ppsa","Ppsa","leaseDealerServiceFee","LeaseDealerServiceFee","leaseRateDiscounted","LeaseRateDiscounted","isLoyaltyCustomer","IsLoyaltyCustomer","hasError","HasError","capitalizedCost","CapitalizedCost","residualAmount","ResidualAmount","loanObject","Loan","costOfBorrowing","CostOfBorrowingWithoutTaxes","costOfBorrowingWithTaxes","CostOfBorrowing","aprRate","AprRate","loanPeriod","LoanPeriod","aprRateDiscounted","AprRateDiscounted","loanAmount","LoanAmount","gstAmount","GstAmount","pstAmount","PstAmount","GTMHelper","pushToGTMDataLayer","dataLayer","err","isSimple","showPrevious","selectedVehicle","steps","GTMData","step","action","CurrentStep","event","previous","PreviousStep","engine","_selectedColourInterior","_selectedColourExterior","wheel","_selectedWheel","_selectedAccessories","name","calculatedCash","OcaService","lease","loan","ocaRetry","NaN","oca_url","delay","ms","setTimeout","financeType","default360","_selectedExteriorColour","_colours","static_content_base_path","_current360Rotation","filename_suffix","_ocaService","cashPrice","_language","payment","balanceToFinanceWithFeesTaxed","Program_End_datetime","downPayment","apr","sellingPrice","monthlyDepreciation","totalInterestCost","interestFactor","baseMonthlyPayment","gstHSTRate","gstHSTAmountOnRental","totalMonthlyPayment","adjustedCapitalizedCost","PSTRate","PSTAmount","gtmHelper","updateSingleLineFromFinancialProvider","trackingID","cookie","pop","shift","trackingParam","bnsParam","at","balanceToFinanceWithFeesWithRebatesTaxed","balanceToLeaseWithFeesWithRebatesTaxed","setGTM","payload","vehicle","exitUrl","open","RATE","periods","present","future","guess","y0","y1","x0","epsMax","x1","f","i","abs","exp","SummaryCalculator","_allDataIsLoaded","_apiService","_tcciService","Date","getFullYear","selectedLanguage","_availableTrims","_selectedModelYear","_selectedTrim","_selectedTrimIndex","_loyaltyChecked","_militaryChecked","_graduateChecked","_firstTimeOwnerChecked","_accessoriesValue","_annualMileage","_financeTerm","_leaseTerm","_financeTermIndex","_leaseTermIndex","_pstRate","_gstRate","_financialInfo","_initialFinancial","_engineAndDrivetrain","_selectedModelIndex","_selectedModel","_packages","_selectedPackage","_selectedNonModelPackage","_selectedWarrantyPackage","_selectedConnectedVehiclePackage","_selectedAddedProtectionPackage","_selectedAppearanceProtectionPackage","_selectedPackageIndex","_selectedNonModelPackageIndex","_selectedWarrantyIndex","_selectedConnectedVehicleIndex","_selectedAddedProtectionIndex","_selectedAppearanceProtectionIndex","_selectedAppearanceProtectionPlanPackageIndex","_selectedColourInteriorIndex","_selectedColourExteriorIndex","_allowedColoursExterior","_wheels","_selectedWheelIndex","_accessories","_categories","_selectedCategory","_incentives","_includeFees","_includeTaxes","_includeRebates","_currentStep","_previousStep","_showFinancePrice","_currentCalculatedCash","_currentPurchaseMethod","_instance","setItem","Constants","SelectedTrim","getFinanceObjectWithCalculations","tempValue","SelectedTrimIndex","AvailableTrim","trim_type","setSelectedModelIndex","EngineAndDrivetrain","finance","loadEngineAndDrivetrain","SelectedModelIndex","loadPackages","loadColours","loadWheels","loadAccessories","loadPayments","loadSummary","loadSpecsData","SelectedAppearanceProtectionIndex","loanVals","leaseVals","setOcaData","financeValues","financeTerm","leaseValues","leaseTerm","ocaField","bnsValues","QuoteItems","Key","Value","hasData","financeTermToBeDisplayed","leaseTermToBeDisplayed","forceContactDealer","loanHasError","getLoanResponsesHasError","leaseHasError","getLeaseResponsesHasError","objectsArray","every","obj","hasCommunicationError","hasDataError","updateAllLineFromFinancialProvider","FinanceTerm","FinanceTermIndex","LeaseTerm","LeaseTermIndex","updateSingleLeaseLineItem","updateSingleLoanLineItem","sendDataToService","IncludeRebates","AnnualMileage","getTemporaryLeaseResponse","GstPercentage","PstRate","extractLeaseData","extraDataResponse","downPaymentLeaseEndValue","getResidualAmountFromLeaseData","getTemporaryLoanResponse","extractLoanData","updateAllLoanLinesFromFinancialProvider","updateAllLeaseLinesFromFinancialProvider","all","financeElement","extractedData","index","findIndex","newObject","catch","leaseElement","packages","Packages","default_option","pack","SelectedPackageIndex","universalPackages","SelectedNonModelPackageIndex","warrantyPackages","package_type","SelectedWarrantyIndex","connectivityPackage","connected_services","subscription","subscriptionindex","SelectedConnectedVehicleIndex","added_protection","plans","planIndex","SelectedAddedProtectionIndex","appearanceProtectionPlan","appearance_protection","SelectedAppearanceProtectionPlansIndex","packageIndex","appearanceProtectionPlansPackage","SelectedColourInteriorIndex","Colours","SelectedColourExteriorIndex","InitialFinancial","Wheels","wheels","SelectedWheelIndex","SelectedCategory","toString","removeItem","IncludeTaxes","isProvinceAllowedToIncludeRebates","Current360Rotation","toLocaleLowerCase","reset","isRetailerMode","RecalculateFinancialInfo","Incentives","getIncentives","defaultTrimIndex","loadTrims","getDefaultTrimIndex","trimIndex","setSelectedTrimIndex","modelIndex","setSelectedPackageIndex","getBuildDataById","build_data","tradeInValue","includeTaxes","includeFees","includeRebates","selectedNonModelPackageIndex","selectedWarrantyIndex","selectedConnectedVehicleIndex","selectedAddedProtectionIndex","selectedAppearanceProtectionIndex","selectedAppearanceProtectionPlanPackageIndex","loadVehicleData","getAccessories","accessoriesData","parsed","parseAccessoriesData","All","acc","part_number","msg","reject","getVehicles","then","error","getTrims","trimData","SelectedModelYear","model_year","getEngineAndDrivetrain","getPackages","allowedExteriors","id","getColours","defaultInteriorColour","defaultExteriorColour","Colour","AllowedColoursExterior","getAllowedExteriorsIds","allowed_exteriors","getWheels","Accessories","getPayments","foundIndex","getSummary","colours","connectivity","protection","payments","summary","reloadStoredData","vehicles","getSpecificationsData","specifications","hasDefaultInteriorColorSelected","selectedInteriorColour","hasDefaultExteriorColorSelected","selectedExteriorColour","showWarningMessage","xs","reduce","rv","plainTitle","mazda","yearName","modelName","trimName","sup","toUpperCase","RegExp","loadFromFinancialProvider","financeTermIndex","leaseTermIndex","accessoriesValue","package","warranty","connectedVehicle","addedProtection","appearanceProtection","fees","cashCalculator","loanCalculator","leaseCalculator","minDownPayment","getMaxDownPayment","tempIncentives","cashObj","tax","getTax","getOptions","feesAndLevies","getFeesAndLeaves","getIncentivesObj","mazdaRetailCash","mazda_retail_cash","evRebates","getEvRebate","mazdaPrice","displayedTotal","nonTaxableInc","nonTaxable","taxableInc","taxable","evRebate","cash","subTotal","subtotalTaxed","subtotalTaxes","subtotalFees","subtotalWithFees","subtotalWithFeesTaxed","subtotalWithFeesTaxes","incentiveRebates","subtotalWithIncentiveRebates","subtotalWithIncentiveRebatesAndEvRebates","subtotalWithIncentiveRebatesAndEvRebatesTaxed","subtotalWithIncentiveRebatesAndEvRebatesTaxes","feesRebates","subtotalWithFeesWithRebates","subtotalWithFeesWithRebatesAndEvRebates","subtotalWithFeesWithRebatesTaxed","subtotalWithFeesWithRebatesTaxes","leaseObj","rewards","getRewardsList","downPaymentTax","kilometersLeaseValue","subtotalWithRebates","subtotalWithRebatesTaxed","balanceToLease","balanceToLeaseWithFees","balanceToLeaseWithRebates","balanceToLeaseWithFeesWithRebates","resudualObj","moneyFactor","money_factor","moneyFactorObj","financeObj","subtotalWithoutTradInAndDownPayment","balanceToFinanceTaxed","balanceToFinanceWithFees","balanceToFinanceWithRebates","balanceToFinanceWithRebatesTaxed","balanceToFinanceWithFeesWithRebates","ExteriorColorInParam","InteriorColorInParam","accessoriesObj","accessorie","total_residual_value","detail","selectedWheel","selectedPackage","selectedNonModelPackage","selectedWarrantyPackage","selectedConnectedVehiclePackage","interiorColour","exteriorColour","model_option_package","universal_package","warranty_package","connected_vehicle_package","selectedPackageIndex","tpms","install_cost","inCashCalculation","leaseMode","feesObj","feeAndLevies","that","el","getSupValueFromFee","feesObjFiltered","incentivesList","loyalty","checked","grad_award","military","first_time_owner","rewardsList","incentivesKeysNonTaxable","isCashCalculation","incentivesKeysTaxable","incentivesObj","details","incentiveKey","getGstRate","getPstRate","ev_rebates","rebate","filteredLeaseItems","leaseItem","leaseProRatedRebate","filteredFinanceItems","financeItem","financeProRatedRebate","calculateTaxes","hasEvFinancingTaxes","tax_cash","lease_federal_tax","lease_provincial_tax","lease_tax","popularData","formatedData","popular","groupBy","adminFees","retailCash","bnp_retailer_mode","urlParams","getDealerDataById","dealerData","dealerName","provinceCode","province_code","create","getPrototypeOf","getOwnPropertyDescriptors","shallowClone","isPreOrder","preOrder","modelOption","BuildHelper","cookies","Cookies","useEffect","clear","loadVehicleDataByBuildId","path","encode","String","reload","navigateUrl","origin","pathname","loadPreBuildData","NavHelper","returnDef","getDealerId","currentStep","lang","navTranslation","getUrlSlug","openModal","targetId","modal","setAttribute","focus","titleCase","word","charAt","slice","join","Svg","size","colour","svg_list","svgColour","svg_classname","Nav","nav","props","useTranslation","i18n","useParams","React","useState","ShowFinancePrice","navHelper","setStep","isOpen","setIsOpen","tabList","getNavContent","tabs","setTabs","tab","active","activeTab","setActiveTab","innerWidth","isMobile","setIsMobile","navRef","useRef","navigate","useNavigate","useSearchParams","setSearchParams","reloadTabs","current","contains","mzMenu","triggerStickySubmenu","mzFunc","mzTabs","waitForEl","components","init","subNav","adjustActiveTabPosition","scrollY","alertAni","play","permAlertAni","menuAni","handleTabClick","tabIndex","uri","HandleSelectAVehicleClick","preventDefault","selectVehiclesLinkLink","addEventListener","ref","onClick","textDesktop","role","textMobile","allow_oca","handleOcaClick","width","getCurrentActiveTabIndex","showNav","Modal","modalContent","modalId","handleClose","defaultProps","Button","primary","backgroundColor","label","disabled","icon","iconBefore","iconAfter","svg_className","rotation","mode","disabling","before","after","displayIcon","btnBackground","TabsMenu","menus","menuItems","sort","y","v","menu","Modal_50_50","image","imageMobile","imageAlt","setIsModalOpen","setModalImage","src","alt","TooltipHelper","tooltip","tooltips","Tooltip","TooltipName","TooltipText","TooltipClasses","toggle","setToggle","tooltipHeight","setTooltipHeight","isTop","setTop","isAnimating","setIsAnimating","didInit","setInit","toolRef","tooltipHelper","tooltipText","getTooltip","toggleCollapse","time","initHeight","tooltipCont","tooltipWidth","left","top","tooltipLeft","getBoundingClientRect","tooltipBottom","bottom","tooltipRight","pricingHeight","offsetHeight","innerHeight","gsap","transformOrigin","fromTo","autoAlpha","height","onUpdate","enableAni","to","onComplete","parentElement","right","onMouseEnter","matchMedia","matches","onMouseLeave","AccessoryCard","Accessory","Selected","HandleSelectedAccessory","HandleLearnMore","isPopular","showFinancePrice","modalOpen","setModalOpen","price_week","totalCost","installationText","totalPriceText","base_msrp","getTooltipText","description","CollapseLegal","ColCarText1","ColBoxText","Pricing","builtLabel","buttonLabel","builtPrice","loanLabel","loanPrice","leaseLabel","financeLabel","HandleNextClick","setLegalModalOpen","HandleShowFinanceClick","saveLabel","setPreorderModalOpen","financialInfo","setFinancialInfo","setShowFinancePrice","app","resizeObserver","ResizeObserver","calculatePriceBarPosition","mazdaFooter","mazdaPricing","scrollElement","update","setForceUpdate","isFooterOnViewport","clientHeight","getComputedStyle","transform","distance","vHeight","scrollPosition","pageYOffset","offsetTop","offsetParent","howMuchFooterIsVisible","handleTogglePrice","toggleType","handlePreOrderClick","handleContactDealerLinkClick","targetModal","heading","textContent","removeEventListener","unobserve","observe","getLoanRate","getResponsesHasError","loanElement","getLeaseRate","getLoanWeekly","weeklyPayment","getLeaseWeekly","handleQCEVD_LinkClick","target","contactRoute","getCashPrice","financePricing","cashPricing","CurrentCalculatedCash","random","isSelectionPreOrder","hasBreak","PreOrderModal","isReactFormsAppLoaded","initReactFormsApp","message","dealer_code","Alert","Id","Desc","textDisplayed","setTextDisplayed","setTooltipCont","alertRef","tempHtml","incentives_banner","getTextDisplay","splice","AccessoriesList","setNav","tabsRef","setVisibleLeftArrow","setVisibleRightArrow","legalModalOpen","setAccessories","categories","setCategories","selectedAccessories","setSelectedAccessories","selectedCategory","setSelectedCategory","preorderOpen","setTabsNextAndPrevButtons","offsetWidth","scrollWidth","scrollLeft","clientWidth","b","bandA","bandB","comparison","handleSelectedAccessory","rawData","hasAlertBar","isDataLoaded","Categories","toRender","VehicleTitle","category","isactive","decodeURI","search","Jelly","topLabel","carName","carModel","carPrice","carFeatures","carImg","carImgHover","jellieHaveIcons","icon1","icon2","icon3","btnLabel","isComingSoon","displayFeatures","feature","iconType","icon_type","VehiclePage","setResponse","vehicleLegal","setVehicleLegal","tabsContainerRef","loading","setLoading","visibleTab","setVisibleTab","loadVehicles","requestResponse","loadVehiclesLegal","requestLegalResponse","newLocation","history","pushState","executeTasks","Cats","previous_model","previusModelTab","Model","stripedHtml","CategoryNumb","cat","carCont","display","is_coming_soon","coming_soon_data","top_copy","setTopLabel","highlighted_features","URLSearchParams","handleModelClick","onMouseOver","handleModelOver","onMouseOut","handleModelOut","jelly_path","jelly","jelly_hover","providerRetry","currentLocation","urlWithoutQueryParams","replaceState","closest","jellySib","HasFinancialProviderError","class","ApiUrl","ThreeSixtyView","imageList","setImageList","ts","trigger","setTrigger","imageCount","setImageCount","draggableIsReady","setDraggableIsReady","preventScroll","stopPropagation","set360Height","container","subnav","pricing","imageCont","controls","incentivebar","alert","offsetAlert","permAlert","offsetPermAlert","viewHeight","dataset","images","getImages","setInterval","Draggable","clearInterval","lockAxis","force3D","zIndexBoost","currentPos","minimumMovement","onDragStart","onDrag","isDragging","deltaX","vars","onDragEnd","ThreeSixtyInteriorView","panoramaIsReady","offsetMenu","PhotoSphereViewer","interiorEl","innerHTML","fullScreen","createElement","appendChild","mzImage360","showPanorama","enablePanorama","ThreeSixtyContainer","imageIsLoading","vehicleTrimName","setTrimName","active360","setActive360","setIsLoading","activeView","toggleView","Collapse","ColCarText1Button","ColCarText2","ColCarText3","ColCarImg","isExpanded","setExpandedIndex","LegalContent","showCheck","collapseRef","mzAnimator","setHeight","animateHeight","heightOrigin","$el","collapseTarget","scrollWindow","topScroll","scroll","behavior","TrimList","setSelectedTrim","selectedTrim","trimsData","setTrimsData","expandedIndex","listRef","handleTrimClick","getAttribute","setListMaxHeight","maxHeight","submenu","pricingBar","foundLeaseTermIndex","foundFinanceIndex","setTermIndex","displayWarning","trimContent","highlitedfeatureList","featureItem","featureListTitle","feature_list_title","featureList","feature_list","getTrimDataContent","thumbnail","jellyContents","isJellyPathConform","getImage","button","getTrimButton","legalArr","legal","getLegalContent","alert_features","hideLeaseInCard","is_popular","TrimsPage","setImages","is360Loading","setIs360Loading","firstEmptyDataLoad","setFirstEmptyDataLoad","fromTrimSelection","setFromTrimSelection","dataNeedUpdate","setDataNeedUpdate","selectedTrimIndex","set360images","SetSelectedColorsFromParams","extArray","nextStep","SelectedTrimUrlSlug","DefaultTrimUrlSlug","handleSelectTrim","handleShowFinanceClick","toHideBlocks","hideShownCmsBlock","vehiclePageUri","getContent","CollapseList","CollapseClasses","ColClassPrice","ColPrices","collapse","OcaModal","ocaService","ReserveModal","getDealerVars","Financial","openCollapsable","setOpenCollapsable","reserveOpen","setReserveModalOpen","ocaOpen","setOcaModalOpen","setFinanceType","pathToPayment","feesChecked","setFeesChecked","taxesChecked","setTaxesChecked","rebatesChecked","setRebatesChecked","dataDisplayed","selectedBox","setSelectedBox","setFinanceTermIndex","setLeaseTermIndex","currentIncentives","inclusionCheck","Obj","handleReserveYoursClick","PurchaseMethod","CurrentPurchaseMethod","openGetLocal","financeClick","isEnglish","provinceName","en","fr","scrollIntoView","executeTask","defaultChecked","htmlFor","hasLoanRatePercentageDiscount","getLoanBiWeekly","getLoanMonthly","getLoanInformationalAprRate","hasLeaseRatePercentageDiscount","mileage","kmFormat","convertKM","getAnnualMileageText","getLeaseBiWeekly","getLeaseMonthly","getLeaseInformationalAprRate","optionList","getOptionList","floor","getWheelsDetails","getWheelsPrice","connectedPrice","getConnectivityDetails","list","getAccessoriesDetails","getAccessoriesTooltipText","getAccessoriesPrice","SelectedAppearanceProtectionPlan","getProtectionDetails","feesAndLeviesToDisplay","getMazdaFeesAndLeviesDetails","getCreditsDetails","SpecsItem","SpecsItemModelStriped","SpecsItemName","SpecsItemModel","SpecsItemEditUrl","useHTML","isPackage","BuildSpecs","componentRef","defaultEngineUrl","defaultPackageUrl","defaultDrivetrain","setDefaultDrivetrain","defaultEngine","setDefaultEngine","defaultPackages","setDefaultPackage","selectedTrimUrl","selectedModel","selectedModelUrl","selectedPackageUrl","selectedColoursInt","selectedColoursExt","selectedColoursUrl","selectedWheelUrl","selectedConnectivity","selectedAddedProtection","selectedAppearanceProtection","isWide","drivetrain","defaultEngineRequest","defaultPackagesRequest","packageName","getPackageName","handleAddAccessoriesClick","availableAccessories","List","Index","EditButton","CollapseSpecs","currID","FeaturedSpecs","show_brochure","showBrochure","specsPDF","genereatePDFURL","brochurePDF","isSpec","pdfType","innerAttr","tableHtml","table","Title","Data","getTableSpecs","Packs","shortLang","SummaryPage","buildSpecsRef","hasScrolled","setHasScrolled","openSpecificationCollapsable","dealerID","setDealerID","setIsRetailerMode","showCmsFooterHiddenBlock","isFindDealerForm","formEl","block","selectedExterior","selectedInterior","intervalRef","generateStaticVehicleImg","offsetY","duration","scrollTo","marginTop","imagePlaceHolder","EngineCard","HandleSelectedModel","modelData","engineCost","short_description","transmission","dangerouslySetInnerHTML","__html","PackageCard","Package","PopContent","ButContent","ButStyle","ButSelectedContent","HandleSelectedPackage","SelectedIndex","HandleRemovePackage","HasCollapse","isUniversal","displayPriceCalculation","displayConnectedServicePriceCalculation","packageData","setPackageData","packageCost","getPackageDesc","packageDesc","packageArr","features","setSelectedPackage","removeSelectedPackage","subtitle","spanCont","showPrice","Options","selectedModelIndex","updateAddressBar","urlPrefix","hostname","handleSelectedPackage","handleRemovePackage","handleSelectedModel","ColourCard","Disabled","HandleSelectedColour","isExterior","colourData","API_URL_BASE_PATH","new","selectedColourInteriorIndex","setSelectedColourInteriorIndex","selectedColourExteriorIndex","setSelectedColourExteriorIndex","handleSelectedColourInterior","defaultExteriorId","handleSelectedColourExterior","showWarning","overflow","WheelCard","Wheel","HandleSelectedWheel","languageText","basePrice","tpmsText","installText","totalText","WheelsList","DisabledIndexes","defaultWheelSize","parceWheelsData","wheelsData","setWheelsData","sizes","initWheelTab","selectedWheelsSize","setSelectedWheelsSize","getWarningMessage","warningMessage","setWarningMessage","handleSelectedWheel","newSize","newMessage","selected","HASDEFAULTWHEELSIZE","defaultSize","hasDefaultWheelSize","getWheelSizeSuffix","suffix","WheelsImageContainer","imageBackgroundCar","imageForegroundWheel","selectedWheelObject","bgImage","setbgImage","fgImage","setfgImage","selectedWheelIndex","setSelectedWheelIndex","selectedColor","useMemo","storageColor","yearSlug","carlineSlug","trimSlug","wheelImageBaseURL","bgImagePath","replaceAll","fgImagePath","overlay_image_suffix","default_wheels_size","Connectivity","connectModalOpen","setConnectModalOpen","carouselInit","setCarouselInit","setSelectedConnectedVehicleIndex","setConnectivityPackage","baseTarget","contentHeight","visibleHeight","handleSelectedConnectedVehiclePackage","handleRemoveConnectedVehiclelPackage","image_folder","image_extension","getConnectivityImagePath","mzCarousel","carousel_cta_text","slideContent","carousel","setBullets","getModalImagePath","set5050","setSlides","setCarousel","CollapseFinance","dropdownCallback","selectCallback","setSelectedFinanceOption","collapseOpenContent","setCollapseOpenContent","isCollapsed","setIsCollapsed","hasRatePercentageDiscount","getFinanceOptions","onChange","itemClick","discount","getDisplayedRate","FinanceOptions","showDetailedPricing","toggleShowDetailedPricing","financeDetailRef1","financeDetailRef2","financeDetailRef3","setCurrentIncentives","fromClick","collapse1","collapse2","collapse3","financeDropdown","financeTermSelect","hasResponseError","getInformationalRate","warrantyPrice","getCostOfBorrowing","CollapseLease","setSelectedLeaseOption","getLeaseOptions","CollapseLeaseMileage","callback","setSelectedLeasesMileage","collapseClosedContent","setCollapseClosedContent","setCurrentAnnuelMileage","ClosedContent","LeaseOptions","leaseDetailRef1","leaseDetailRef2","leaseDetailRef3","leaseDropdown","leaseTermSelect","leaseMileageItemClick","annualMileageValue","currentTarget","getDisplayedFee","firstPaymentTaxes","getWeeklyPrice","getBiWeeklyPrice","getMonthlyPrice","totalPayable","getTotalPayable","firstPayment","getFirstPayment","totalDue","getTotalDue","CashOptions","TradeInModal","checkTradeInValue","PricePayment","setDownPaymentInput","onBlurDownPaymentInput","setTradeInInput","onBlurTradeInInput","setLoyaltyChecked","setGraduateChecked","setMilitaryChecked","setFirstTimeOwnerChecked","tradeInLink","isTradeOpen","setIsTradeOpen","isFirstTimeOwnerGreyOut","isLoyaltyGreyOut","placeholder","onBlur","setMoneyInput","PaymentsPage","selectedFinanceOption","selectedLeaseOption","includeFeesChecked","setIncludeFeesChecked","includeTaxesChecked","setIncludeTaxesChecked","includeRebatesChecked","setIncludeRebatesChecked","setTradeInValue","setDownPaymentValue","searchParams","DEBUG_MODE","val","tempVal","delete","paymentCats","paymentTabs","paymentBlocks","paymentTabsContent","price_payments_callout","disclaimerMessage","getAdminFeeDisclaimerSection","Protection","baseURL","collapseRefProtection","collapseRefAppearance","protectionExpanded","setProtectionExpanded","appearanceExpanded","setAppearanceExpanded","setSelectedAddedProtectionIndex","addedProtectionSection","setAddedProtectionSection","appearanceDropDown","setAppearanceDropDown","appearanceSelection","setAppearanceSelection","prepareAddedProtectionSection","addedProtectionPackageList","plan","handleSelectedAddedProtectionPackage","getAddedProtectionPackage","handleRemoveAddedProtectionPackage","getCurrentAddedProtectionPackage","setSelectedAppearanceProtectionIndex","setSelectedAppearanceProtectionPlansIndex","getAppearanceProtectionSection","getAppearanceProtectionTermsDropDown","getAppearanceProtectionList","handleRemoveAppearanceProtectionPlansPackage","setExpand","innerContent","expandToggle","terms","appearanceProtectionPlans","term_dropdown_label","defaultValue","handleAppearanceProtectionTerms","fontSize","handleAppearanceProtectionPlansPackage","scrollToID","autoKill","collapseProt","collapseApp","getAddedProtectionIcons","accordion_title","selected_plan_text","iconList","icons","getAppearanceProtectionIcons","App","param","values","build","savedCarline","savedCarYear","currentProvince","requestedProvince","prov_code","getProvinceInUrl","encodeURIComponent","decodeURIComponent","handleSelectChange","select","newProvince","waitScreen","forceReloadVehicle","provCodePattern","updatedUrl","submit","handleLanguageChange","cssFile","scriptFile","rel","head","carYearHash","carlineHash","exact","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","resources","general","GENERAL_EN","VEHICLES_EN","TRIMS_EN","OPTIONS_EN","CONNECTIVITY_EN","PACKAGES_EN","COLOURS_EN","WHEELS_EN","ACCESSORIES_EN","PROTECTION_EN","PAYMENTS_EN","SUMMARY_EN","evGrid","EVGRID_EN","VEHICLES_FR","TRIMS_FR","OPTIONS_FR","PACKAGES_FR","CONNECTIVITY_FR","COLOURS_FR","WHEELS_FR","ACCESSORIES_FR","PROTECTION_FR","PAYMENTS_FR","SUMMARY_FR","EVGRID_FR","use","LanguageDetector","initReactI18next","lng","fallbackLng","debug","whitelist","transKeepBasicHtmlNodesFor","interpolation","escapeValue","ReactDOM","render","StrictMode"],"mappings":"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","file":"static/js/main.e491edd3.chunk.js","sourcesContent":["import ReactHtmlParser from 'react-html-parser';\r\n\r\n//export const lang = document.querySelector('meta[name=\"data-language\"]') ? document.querySelector('meta[name=\"data-language\"]').content === 'en' ? 'en' : 'fr' : 'en';\r\nexport function getLang() {\r\n return document.querySelector('meta[name=\"data-language\"]') ? document.querySelector('meta[name=\"data-language\"]').content === 'en' ? 'en' : 'fr' : 'en';\r\n}\r\n\r\n//export const province = document.querySelector('meta[name=\"data-region\"]') ? document.querySelector('meta[name=\"data-region\"]').content : 'on';\r\nexport function getProvince() {\r\n // This is used in the case of retailer\r\n if ((window.location.href.includes(\"retailer\") || window.location.href.includes(\"localhost\")) \r\n && sessionStorage.getItem('bnp_dealerVars')) {\r\n const dealerVars = JSON.parse(sessionStorage.getItem('bnp_dealerVars'));\r\n\r\n if(dealerVars && dealerVars.dealerProvinceCode)\r\n return dealerVars.dealerProvinceCode;\r\n }\r\n\r\n // Fallback from the cms\r\n return document.querySelector('meta[name=\"data-region\"]') ? document.querySelector('meta[name=\"data-region\"]').content : 'on'; \r\n}\r\n\r\n// DEPRECATED, TCCI return it in the API response\r\n/*export function getPPSA(term) {\r\n const ppsaTable = JSON.parse(sessionStorage.getItem('financialObj')).PPSA;\r\n\r\n let ppsa = 0;\r\n const sortedPpsa = ppsaTable.sort((a, b) => a.term > b.term)\r\n sortedPpsa.forEach(ppsaItem => {\r\n if (ppsaItem.term === term)\r\n ppsa = ppsaItem.rate;\r\n });\r\n\r\n if (!ppsa) {\r\n for (const ppsaItem of sortedPpsa) {\r\n if (ppsaItem.term > term) {\r\n ppsa = ppsaItem.rate;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return ppsa;\r\n}*/\r\n\r\nexport function setCursorWaiting(isWaiting) {\r\n if (isWaiting)\r\n document.querySelector(\"html\").style.cursor = \"wait\";\r\n else\r\n document.querySelector(\"html\").style.cursor = \"\";\r\n}\r\n\r\nexport function getLoading(isLoading, t) {\r\n if (!window.bnp_under_maintenance) {\r\n return (\r\n <div className={`loading ${isLoading ? 'visible' : ''}`}>\r\n <h1>{t(\"general:loading\")}</h1>\r\n </div>\r\n )\r\n } else {\r\n return (\r\n <div className={`loading ${isLoading ? 'visible' : ''}`}>\r\n <h5>{ReactHtmlParser(t(\"general:retryMessage\"))}</h5>\r\n </div>\r\n )\r\n }\r\n}\r\n\r\nexport function getMazdaFeesAndLeviesDetailTitle(title, t) {\r\n switch (title) {\r\n case \"Administration Fee\":\r\n return t(\"general:admin_service_fees\"); //\"Administration Fee\"; \r\n case \"Lease Service Fees\":\r\n return t(\"general:lease_service_fees\"); //\"Lease Dealer Service Fee\";\r\n case \"A/C Tax\":\r\n return t(\"general:ac_tax\"); //\"Air Conditioning Tax\";\r\n case \"OMVIC\":\r\n return t(\"general:omvic\"); //\"OMVIC Fee\";\r\n case \"AMVIC\":\r\n return t(\"general:amvic\"); //\"AMVIC Fee\";\r\n case \"Oil\":\r\n return t(\"general:oil\"); //\"Oil Filter Fee\";\r\n case \"Tire Shewardship Fee\":\r\n case \"Tire\":\r\n return t(\"general:tire\"); //\"Tire Stewardship Fee\";\r\n case \"PDE\":\r\n return t(\"general:pde\"); //\"Pre Delivery Inspection Fee\";\r\n case \"Federal Excise Tax\":\r\n return t(\"general:federal_excise_tax\");\r\n case \"Freight\":\r\n return t(\"general:freight\");\r\n case \"ppsa\":\r\n return t(\"general:ppsa\");\r\n\r\n default:\r\n return title;\r\n }\r\n}\r\n\r\nexport function getParams(str) {\r\n var queryString = str || window.location.href || '';\r\n var keyValPairs = [];\r\n var params = {};\r\n queryString = queryString.replace(/.*?\\?/, \"\");\r\n\r\n if (queryString.length) {\r\n keyValPairs = queryString.split('&');\r\n for (let pairNum in keyValPairs) {\r\n var key = keyValPairs[pairNum].split('=')[0];\r\n if (!key.length) continue;\r\n if (typeof params[key] === 'undefined')\r\n params[key] = [];\r\n params[key].push(keyValPairs[pairNum].split('=')[1]);\r\n }\r\n }\r\n return params;\r\n}\r\n\r\n/*\r\n * Return the API Base URL according to which environement we are on.\r\n */\r\nexport function getApiBaseUrl() {\r\n if (window.location.host.indexOf(\"localhost\") !== -1)\r\n return process.env.REACT_APP_API_PATH_DEV;\r\n else if (window.location.host.indexOf(\"dev\") !== -1)\r\n return process.env.REACT_APP_API_PATH_DEV;\r\n else if (window.location.host.indexOf(\"mzca02mstrs16bzs001.dxcloud.episerver.net\") !== -1)\r\n return process.env.REACT_APP_API_PATH_PREPROD;\r\n else if (window.location.host.indexOf(\"preprod\") !== -1)\r\n return process.env.REACT_APP_API_PATH_PREPROD;\r\n else if (window.location.host.indexOf(\"preprod2\") !== -1)\r\n return process.env.REACT_APP_API_PATH_PREPROD2;\r\n else\r\n return process.env.REACT_APP_API_PATH_PROD;\r\n}\r\n\r\nexport function getBaseUrl() {\r\n if (window.location.host.indexOf(\"localhost\") !== -1)\r\n return \"https://preprod.mazda.ca\";\r\n else if (window.location.host.indexOf(\"mzca02mstrs16bzs001.dxcloud.episerver.net\") !== -1)\r\n return \"https://preprod.mazda.ca\";\r\n else\r\n return window.location.protocol + '//' + window.location.host;\r\n}\r\n\r\nexport function get360Data(visual, exterior = null, interior = null) {\r\n //console.log(visual, exterior, interior);\r\n\r\n if (visual) {\r\n const extCode = exterior ? exterior.code : visual.interiors[0].default_exterior.code;\r\n const intCode = interior ? interior.code : visual.interiors[0].code;\r\n if (!visual.exteriors[extCode]) {\r\n return {\r\n 'imagePlaceHolder': getBaseUrl() + process.env.REACT_APP_IMAGE_PLACEHOLDER_PATH\r\n };\r\n }\r\n\r\n const baseAssetPath = getBaseUrl() + process.env.REACT_APP_BASIC_CONTENT_PATH;\r\n const { file_path, end_index: imageAmount, filename_prefix } = visual.exteriors[extCode][360];\r\n const imageName = interior && interior.include_in_360 ? `${filename_prefix.replace(\" \", \"-\")}${intCode}-{index}.png` : `${filename_prefix.replace(\" \", \"-\")}{index}.png`;\r\n const imagePath = baseAssetPath + file_path.replace(\" \", \"-\");\r\n const { filename } = visual.interiors.find((currInt) => currInt.code === intCode);\r\n\r\n //const realFileName = interior.include_in_360 ? filename.replace(\".png\",\"\") + intCode + \".png\" : filename;\r\n //console.log(realFileName);\r\n const imagePathInterior = baseAssetPath + filename;\r\n\r\n return {\r\n imagePathInterior,\r\n imagePath,\r\n imageAmount,\r\n imageName,\r\n };\r\n } else {\r\n return {\r\n 'imagePlaceHolder': getBaseUrl() + process.env.REACT_APP_IMAGE_PLACEHOLDER_PATH\r\n };\r\n }\r\n\r\n}\r\n\r\nexport function getUrlParamsObject() {\r\n if (window.location.search.length)\r\n return decodeURI(window.location.search)\r\n .replace('?', '')\r\n .split('&')\r\n .map(param => param.split('='))\r\n .reduce((values, [key, value]) => {\r\n values[key] = value\r\n return values\r\n }, {});\r\n\r\n return {};\r\n}\r\n\r\nexport function getUrlParams(paramsObject) {\r\n return Object.keys(paramsObject)\r\n .map(key => `${key}=${paramsObject[key]}`)\r\n .join('&');\r\n}\r\n\r\nexport function getThumbnail(visual, model) {\r\n return;\r\n}\r\n\r\nexport function formatPrice(amount, noRounding) {\r\n if (amount === undefined || isNaN(amount))\r\n return '';\r\n\r\n const fractions = noRounding ? 2 : 0;\r\n\r\n const locale = getLang() === 'fr' ? 'fr-CA' : 'en-CA';\r\n return Number(amount).toLocaleString(locale, { style: 'currency', currency: 'CAD', minimumFractionDigits: fractions, maximumFractionDigits: fractions })\r\n}\r\nexport const convertKM = (distance) => {\r\n const locale = getLang() === 'fr' ? 'fr-CA' : 'en-CA';\r\n const kmFormat = getLang() === 'fr' ? ' km' : 'KM';\r\n return Number(distance).toLocaleString(locale, { minimumFractionDigits: 0, maximumFractionDigits: 0 }) + kmFormat;\r\n}\r\nexport const convertNum = (num, fractions) => {\r\n fractions = fractions === undefined ? 0 : fractions;\r\n const locale = getLang() === 'fr' ? 'fr-CA' : 'en-CA';\r\n return Number(num).toLocaleString(locale, { minimumFractionDigits: fractions, maximumFractionDigits: fractions });\r\n}\r\n\r\nexport function getBareWeekly(amount, term) {\r\n const numberYears = term / 12;\r\n const numberWeeks = numberYears * 52;\r\n const result = formatPrice(amount / numberWeeks);\r\n\r\n if (result === '$NaN')\r\n return \"\";\r\n else\r\n return result;\r\n}\r\n\r\nexport function getFinanceWeekly(amount, rate, term) {\r\n const testRate = rate / 100;\r\n const result = formatPrice((amount * (testRate / 52)) / (1 - Math.pow((1 + (testRate / 52)), -((term / 12) * (52)))));\r\n\r\n //console.log('getFinanceWeekly', amount, rate, term, result);\r\n\r\n if (result === '$NaN')\r\n return \"\";\r\n else\r\n return result;\r\n}\r\n\r\nexport function getLeaseBiWeeklyFromOptions(amount, rate, term) {\r\n let result;\r\n\r\n result = formatPrice(Math.ceil(amount / term * 12 / 26));\r\n\r\n if (result === '$NaN')\r\n return \"\";\r\n else\r\n return result;\r\n}\r\n\r\nexport function getLeaseBiWeeklyFromMsrp(amount, rate, term) {\r\n let result;\r\n\r\n const financialObj = JSON.parse(sessionStorage.getItem('financialObj'));\r\n \r\n const subtotal = amount + financialObj.adminServiceFees;\r\n const residual = financialObj.residual.find(element => element.term === term).rate;\r\n const kilometersLeaseValue = 0;\r\n const endValueLease = (subtotal) * ((residual + kilometersLeaseValue) / 100);\r\n\r\n result = formatPrice(Math.ceil(subtotal - endValueLease) / (term / 12 * 26));\r\n\r\n if (result === '$NaN')\r\n return \"\";\r\n else\r\n return result;\r\n}\r\n\r\nexport function goToTop() {\r\n document.body.scrollTop = 0;\r\n document.documentElement.scrollTop = 0;\r\n}\r\n\r\n\r\nexport function getIncentiveDisplayName(incentive) {\r\n switch (incentive) {\r\n case \"loyalty\":\r\n return getLang() === 'fr' ? \"Programme renouvellement de fidélité Mazda\" : \"Mazda Owner Loyalty Program\";\r\n case \"military\":\r\n return getLang() === 'fr' ? \"Programme Mazda pour militaires\" : \"Mazda Military Program\";\r\n case \"grad_award\":\r\n return getLang() === 'fr' ? \"Programme de diplômés Mazda\" : \"Mazda Graduate Program Award\";\r\n case \"first_time_owner\":\r\n return getLang() === 'fr' ? \"Programme Mazda pour premier propriétaire\" : \"Mazda First Owner Program\"; \r\n default:\r\n return incentive.type;\r\n }\r\n }\r\n\r\nexport function getDisplayableProvinceName() {\r\n switch(getProvince().toLowerCase()) {\r\n case 'on': \r\n return getLang() === 'en' ? \"Ontario\" : \"de l'Ontario\"\r\n case 'qc':\r\n return getLang() === 'en' ? 'Quebec' : \"du Québec\"\r\n case 'ab':\r\n return getLang() === 'en' ? 'Alberta' : \"de l'Alberta\"\r\n case 'bc':\r\n return getLang() === 'en' ? 'British Columbia' : \"de la Colombie Britanique\"\r\n case 'mb':\r\n return getLang() === 'en' ? 'Manitoba' : \"du Manitoba\"\r\n case 'nb':\r\n return getLang() === 'en' ? 'New Brunswick' : \"du Nouveau-Brunswick\"\r\n case 'nl':\r\n return getLang() === 'en' ? 'Newfoundland' : 'de Terre-Neuve'\r\n case 'nt':\r\n return getLang() === 'en' ? 'North-West Territories' : 'du Territoires du nord-ouest'\r\n case 'ns':\r\n return getLang() === 'en' ? 'Nova Scotia' : 'de la Nouvelle-Écosse'\r\n case 'nu':\r\n return getLang() === 'en' ? 'Nunavut' : \"du Nanavut\"\r\n case 'pe':\r\n return getLang() === 'en' ? 'Prince Edward Island' : \"de l'ÃŽle-du-Prince-Édouard\"\r\n case 'sk':\r\n return getLang() === 'en' ? 'Saskatchewan' : \"du Saskatchewan\"\r\n case 'yt':\r\n return getLang() === 'en' ? 'Yukon' : 'du Yukon'\r\n default:\r\n return '';\r\n }\r\n}\r\n\r\nexport function buildLegalContent(legalContentObject, legalIncentiveObject) {\r\n let legalContent = '';\r\n if (legalContentObject) {\r\n legalContentObject.map(item => {\r\n legalContent += item.copy\r\n });\r\n }\r\n\r\n // Append incentive legal\r\n if(legalIncentiveObject) {\r\n legalIncentiveObject.map(item => {\r\n legalContent += item.copy\r\n });\r\n }\r\n\r\n return legalContent;\r\n}\r\n\r\nexport function hideCmsHiddenBlock() {\r\n let shownBlocks = document.querySelectorAll('#Awards > .visually-shown');\r\n\r\n if (shownBlocks) {\r\n shownBlocks.forEach(function (e) {\r\n e.classList.remove('visually-shown');\r\n e.classList.add('visually-hidden');\r\n });\r\n }\r\n\r\n hideCmsFooterHiddenBlock();\r\n}\r\n\r\nexport function showCmsHiddenBlock(carline) {\r\n let hiddenBlocks = document.querySelectorAll('#BNP_AWARDS > .visually-hidden')//('#Awards > .'+carline+'.visually-hidden');\r\n\r\n if (hiddenBlocks) {\r\n hiddenBlocks.forEach(function (e) {\r\n e.classList.remove('visually-hidden');\r\n e.classList.add('visually-shown');\r\n });\r\n }\r\n}\r\n\r\nexport function hideCmsFooterHiddenBlock() {\r\n let hiddenBlocks = document.querySelectorAll('.mz-footer.mz-footer--container');\r\n\r\n if (hiddenBlocks) {\r\n hiddenBlocks.forEach(function (e) {\r\n e.classList.remove('visually-shown');\r\n e.classList.add('visually-hidden');\r\n });\r\n }\r\n}\r\n\r\nexport function showCmsFooterHiddenBlock() {\r\n let hiddenBlocks = document.querySelectorAll('.mz-footer.mz-footer--container');\r\n\r\n if (hiddenBlocks) {\r\n hiddenBlocks.forEach(function (e) {\r\n e.classList.remove('visually-hidden');\r\n e.classList.add('visually-shown');\r\n });\r\n }\r\n}\r\n\r\nexport function getCmsAwardsBlockFromCMS(year, carline) {\r\n if(!year || !carline) {\r\n return \"\";\r\n }\r\n\r\n let hiddenBlocks = document.querySelector(`#Awards > .${carline}-${year}.visually-hidden`);//('#Awards > .'+carline+'.visually-hidden');\r\n\r\n if (hiddenBlocks) {\r\n let text = hiddenBlocks.outerHTML.replace('visually-hidden', '');\r\n \r\n // Regular expression to replace src with data-src // fix for the hotlink that doesnt load the lazy load\r\n const regex = /<img\\s+src=\"([^\"]+)\"\\s+data-src=\"([^\"]+)\"([^>]*)>/g;\r\n\r\n // Replace src with data-src\r\n const toReturn = text.replace(regex, '<img src=\"$2\" data-src=\"$2\"$3>');\r\n //console.log(toReturn);\r\n\r\n return toReturn;\r\n }\r\n\r\n return \"\";\r\n}\r\n\r\nexport function customRound(value, decimals) {\r\n const factor = Math.pow(10, decimals);\r\n return Math.ceil(value * factor) / factor;\r\n}\r\n\r\nexport function updateLanguageLink() {\r\n const languageLink = document.getElementById('region-language-link');\r\n\r\n // Update the language link (From any submit return)\r\n if (window.location.hash && languageLink) {\r\n const newLanguage = languageLink.text;\r\n\r\n const langCodePattern = /lang_code=[^&]*/;\r\n\r\n // Remove the old hash\r\n if (languageLink.href.indexOf('#') !== -1) {\r\n const hashIndexPosition = languageLink.href.indexOf('#');\r\n\r\n languageLink.href = languageLink.href.substring(0, hashIndexPosition);\r\n }\r\n\r\n // Replace the lang_code parameter\r\n let newHash = window.location.hash.replace(langCodePattern, `lang_code=${newLanguage}`);\r\n languageLink.href = languageLink.href + newHash;\r\n \r\n //languageLink.href = languageLink.href.replace(langCodePattern, `lang_code=${newLanguage}`);\r\n }\r\n}\r\n\r\n","export const SummaryConstants = {\r\n DEBUG: 'DEBUG',\r\n CurrentStep: 'CurrentStep',\r\n\tPreviousStep: 'PreviousStep',\r\n\r\n\tCurrent360Rotation: 'Current360Rotation',\r\n SelectedExteriorColour: 'selectedExteriorColour',\r\n SelectedInteriorColour: 'selectedInteriorColour',\r\n SelectedColourExteriorIndex: 'SelectedColourExteriorIndex',\r\n SelectedColourInteriorIndex: 'SelectedColourInteriorIndex',\r\n\r\n EngineAndDrivetrain: 'EngineAndDrivetrain',\r\n SelectedModelIndex: 'SelectedModelIndex',\r\n Packages: 'Packages',\r\n\r\n Wheels: 'Wheels',\r\n SelectedWheel: 'selectedWheel',\r\n SelectedWheelIndex: 'SelectedWheelIndex',\r\n SelectedAccessories: 'selectedAccessories',\r\n SelectedWheelSize: 'SelectedWheelSize',\r\n Accessories: 'Accessories',\r\n\r\n Colours: 'Colours',\r\n DefaultExteriorColour: 'defaultExteriorColour',\r\n DefaultInteriorColour: 'defaultInteriorColour',\r\n\r\n AllowedColoursExterior: 'AllowedColoursExterior',\r\n\r\n SelectedModelYear: 'selectedModelYear',\r\n SelectedTrim: 'selectedTrim',\r\n SelectedTrimIndex: 'selectedTrimIndex',\r\n FinancialObj: 'financialObj',\r\n SelectedModel: 'selectedModel',\r\n VehicleTitle: 'vehicleTitle',\r\n\r\n SelectedPackage: 'selectedPackage',\r\n SelectedNonModelPackage: 'selectedNonModelPackage',\r\n SelectedWarrantyPackage: 'selectedWarrantyPackage',\r\n SelectedConnectedVehiclePackage: 'selectedConnectedVehiclePackage',\r\n SelectedAddedProtectionPackage: 'selectedAddedProtectionPackage',\r\n SelectedAppearanceProtectionPackage: 'selectedAppearanceProtectionPackage',\r\n SelectedAppearanceProtectionPlansPackage: 'selectedAppearanceProtectionPlansPackage',\r\n\r\n SelectedPackageIndex: 'selectedPackageIndex',\r\n SelectedNonModelPackageIndex: 'selectedNonModelPackageIndex',\r\n SelectedWarrantyIndex: 'selectedWarrantyIndex',\r\n SelectedConnectedVehicleIndex: 'selectedConnectedVehicleIndex',\r\n SelectedAddedProtectionIndex: 'selectedAddedProtectionIndex',\r\n SelectedAppearanceProtectionIndex: 'selectedAppearanceProtectionIndex',\r\n SelectedAppearanceProtectionPlanPackageIndex: 'selectedAppearanceProtectionPlanPackageIndex',\r\n\r\n IncludeFees: 'includeFees',\r\n IncludeRebates: 'includeRebates',\r\n IncludeTaxes: 'includeTaxes',\r\n\r\n ShowFinancePrice: 'showFinancePrice',\r\n\r\n UrlSlugObjectTrims: 'urlSlugObjectTrims',\r\n UrlSlugObjectEngineAndDrivetrain: 'urlSlugObjectEngineAndDrivetrain',\r\n UrlSlugObjectPackage: 'urlSlugObjectPackage',\r\n UrlSlugObjectColour: 'urlSlugObjectColour',\r\n UrlSlugObjectWheels: 'urlSlugObjectWheels',\r\n UrlSlugObjectAccessories: 'urlSlugObjectAccessories',\r\n UrlSlugObjectPayments: 'urlSlugObjectPayments',\r\n\r\n FinanceTermIndex: 'FinanceTermIndex',\r\n LeaseTermIndex: 'LeaseTermIndex',\r\n FinanceTerm: 'FinanceTerm',\r\n LeaseTerm: 'LeaseTerm',\r\n\r\n\r\n LoyaltyChecked: 'LoyaltyChecked',\r\n GraduateChecked: 'GraduateChecked',\r\n MilitaryChecked: 'MilitaryChecked',\r\n FirstTimeOwnerChecked: 'FirstTimeOwnerChecked',\r\n\r\n TradeInValue: 'TradeInValue',\r\n DownPaymentValue: 'DownPaymentValue',\r\n \r\n LegalVehicles: 'LegalVehicles',\r\n LegalTrims: 'LegalTrims',\r\n LegalEngineAndDrivetrain: 'LegalEngineAndDrivetrain',\r\n LegalOption: 'LegalOption',\r\n LegalPackage: 'LegalPackage',\r\n LegalConnectivity: 'LegalConnectivity',\r\n LegalColours: 'LegalColours',\r\n LegalWheels: 'LegalWheels',\r\n LegalAccessories: 'LegalAccessories',\r\n LegalProtections: 'LegalProtections',\r\n LegalPaymentInformation: 'LegalPaymentInformation',\r\n LegalSummary: 'LegalSummary',\r\n SpecificationData: 'SpecificationData',\r\n\r\n InitialFinance: 'InitialFinance',\r\n SelectedVehicle: 'SelectedVehicle',\r\n AvailableTrim: 'AvailableTrim',\r\n\r\n PPSA: 'PPSA',\r\n AllDataIsLoaded: 'AllDataIsLoaded',\r\n\r\n HasFinancialProviderError: 'HasFinancialProviderError',\r\n AnnualMileage : 'AnnualMileage'\r\n}","import axios from 'axios';\r\n\r\nexport async function handleRequest(type, url, data) {\r\n const responseData = await axios({\r\n method: type,\r\n url: url,\r\n data: data,\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',\r\n }\r\n });\r\n\r\n return responseData.data;\r\n}\r\n\r\nexport async function handleJsonRequest(type, url, data) {\r\n const responseData = await axios({\r\n method: type,\r\n url: url,\r\n data: data,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n }\r\n });\r\n\r\n return responseData.data;\r\n}","import { handleRequest, handleJsonRequest } from '../stories/helpers/httpRequest';\r\nimport { getApiBaseUrl } from '../utils';\r\n\r\nexport default class ApiService {\r\n language = \"\";\r\n province = \"\";\r\n\r\n insertMockData(year, carline, data) {\r\n const mockedModels = [...window.mockedModels];\r\n \r\n const startsWithAny = mockedModels.some(str => carline.startsWith(str) && year === \"2025\");\r\n\r\n if (startsWithAny) {\r\n const mock = require('./financialMock.json');\r\n Object.assign(data.financial, mock);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n constructor() {\r\n }\r\n\r\n /*\r\n * Step 1 - Get vehicles\r\n */\r\n async getVehicles() {\r\n const url = `${getApiBaseUrl()}/api/ModelYears?prov_code=${this.province}&lang_code=${this.language}`;\r\n\r\n const data = await handleRequest('get', url, {});\r\n\r\n // FOR MOCK \r\n data.data.model_years.forEach(model => {\r\n this.insertMockData(model.year.url_slug, model.carline.url_slug, model);\r\n })\r\n\r\n return data.data;\r\n }\r\n\r\n /*\r\n * Step 2 - Get trims\r\n */\r\n async getTrims(year, carline) {\r\n\r\n const url = `${getApiBaseUrl()}/api/Trims/${year}/${carline}/?prov_code=${this.province}&lang_code=${this.language}`;\r\n\r\n const data = await handleRequest('get', url, {});\r\n\r\n let dataToReturn = data.data;\r\n // FOR MOCK \r\n data.data.trims.forEach(trim => { \r\n this.insertMockData(year, carline, trim);\r\n })\r\n\r\n return dataToReturn;\r\n }\r\n\r\n /*\r\n * Step 3 - Get engine and drivetrain\r\n */\r\n async getEngineAndDrivetrain(year, carline, trim) {\r\n const url = `${getApiBaseUrl()}/api/EngineModels/${year}/${carline}/${trim}/?prov_code=${this.province}&lang_code=${this.language}`;\r\n\r\n const data = await handleRequest('get', url, {});\r\n // FOR MOCK \r\n this.insertMockData(year, carline,data.data.trim);\r\n\r\n data.data.models.forEach(model => {\r\n this.insertMockData(year, carline, model);\r\n })\r\n\r\n\r\n return data.data;\r\n }\r\n\r\n /*\r\n * Step 4 - Get packages\r\n */\r\n async getPackages(model, option) {\r\n\r\n const url = `${getApiBaseUrl()}/api/Packages/${model}/${option}/?prov_code=${this.province}&lang_code=${this.language}`;\r\n\r\n let data = await handleRequest('get', url, {});\r\n\r\n //Object.assign(data.data, mockProtection);\r\n\r\n return data.data;\r\n }\r\n\r\n /*\r\n * Step 5 - Get colours\r\n */\r\n async getColours(model, packageCode) {\r\n const url = `${getApiBaseUrl()}/api/Colors/${model}/${packageCode}?prov_code=${this.province}&lang_code=${this.language}`;\r\n\r\n const data = await handleRequest('get', url, {});\r\n // FOR MOCK \r\n this.insertMockData(data.data.year.url_slug, data.data.carline.url_slug, data.data);\r\n\r\n return data.data;\r\n }\r\n\r\n /*\r\n * Step 6 - Get wheels\r\n */\r\n async getWheels(model, packageCode) {\r\n const url = `${getApiBaseUrl()}/api/Wheels/${model}/${packageCode}?prov_code=${this.province}&lang_code=${this.language}`;\r\n\r\n const data = await handleRequest('get', url, {});\r\n this.insertMockData(data.data.year.url_slug, data.data.carline.url_slug, data.data); \r\n\r\n return data.data;\r\n }\r\n\r\n /*\r\n * Step 7 - Get accessories\r\n */\r\n async getAccessories(model, packageCode) {\r\n const url = `${getApiBaseUrl()}/api/Accessories/${model}/${packageCode}?prov_code=${this.province}&lang_code=${this.language}`;\r\n\r\n const data = await handleRequest('get', url, {});\r\n this.insertMockData(data.data.year.url_slug, data.data.carline.url_slug, data.data);\r\n\r\n return data.data;\r\n }\r\n\r\n /*\r\n * Step 8 - Get payments\r\n */\r\n async getPayments(model, packageCode) {\r\n const url = `${getApiBaseUrl()}/api/Financial/${model}/${packageCode}?prov_code=${this.province}&lang_code=${this.language}`;\r\n\r\n const data = await handleRequest('get', url, {});\r\n\r\n const mockedModels = [...window.mockedModels];\r\n \r\n const startsWithAny = mockedModels.some(str => data.data.based_on.model_code.startsWith(str));\r\n\r\n if (startsWithAny) {\r\n // FOR MOCK\r\n const mock = require('./financialMock.json');\r\n Object.assign(data, mock);\r\n } \r\n\r\n\r\n return data.data;\r\n\r\n }\r\n\r\n /*\r\n * Step 9 - Get summary\r\n */\r\n async getSummary(model, packageCode) {\r\n const url = `${getApiBaseUrl()}/api/BuildSummaryLegal/${model}/${packageCode}?prov_code=${this.province}&lang_code=${this.language}`;\r\n\r\n const data = await handleRequest('get', url, {});\r\n\r\n return data.data;\r\n }\r\n\r\n /*\r\n * Complement Data - Get model specfication data\r\n */\r\n async getSpecificationsData(model, optionCode) {\r\n const url = `${getApiBaseUrl()}/api/specs?lang_code=${this.language}`;\r\n\r\n var fullModelCode = model + \"/\" + optionCode;\r\n const requestData = JSON.stringify({ \"cars\": [fullModelCode] });\r\n\r\n const data = await handleJsonRequest('POST', url, requestData);\r\n\r\n return data.data;\r\n\r\n }\r\n\r\n /*\r\n * Get build data by build id.\r\n */\r\n async getBuildDataById(buildId) {\r\n const url = `${getApiBaseUrl()}/api/BuildYourMazda/${buildId}`;\r\n const data = await handleJsonRequest('GET', url, {});\r\n return data;\r\n }\r\n\r\n\r\n /*\r\n * Get the dealer data by dealer id.\r\n */\r\n async getDealerDataById(dealerId) {\r\n const url = `${getApiBaseUrl()}/api/Dealers/${dealerId}`;\r\n const data = await handleJsonRequest('GET', url, {});\r\n return data;\r\n }\r\n\r\n}","const NodeCache = require('node-cache');\r\n\r\nexport default class Cache {\r\n _cache;\r\n\r\n constructor() {\r\n this._cache = new NodeCache({\r\n stdTTL: 900 // standard in seconds\r\n });\r\n }\r\n\r\n flushAll () {\r\n this.cache.flushAll()\r\n }\r\n\r\n set (res, queryParams, bodyParams, url) {\r\n if (!res) {\r\n throw new ReferenceError('you must pass a response object')\r\n }\r\n \r\n if (Array.isArray(queryParams) && typeof queryParams !== 'undefined') {\r\n throw new TypeError('queryParams must be an object or unset')\r\n }\r\n \r\n if (!Array.isArray(bodyParams) && typeof bodyParams !== 'undefined') {\r\n throw new TypeError('bodyParams must be an array or unset')\r\n }\r\n \r\n // if (res.config.url[0] !== '/') {\r\n // res.config.url = '/' + res.config.url\r\n // }\r\n \r\n if (!Array.isArray(queryParams) || Array.isArray(bodyParams)) {\r\n const queryObject = {}\r\n const bodyObject = {}\r\n const req = res.data\r\n \r\n \r\n if (!Array.isArray(queryParams) && res.config.params) {\r\n Object.keys(queryParams).forEach(key => {\r\n queryObject[key] = res.config.params[key]\r\n })\r\n }\r\n \r\n if (Array.isArray(bodyParams)) {\r\n bodyParams.forEach(elem => {\r\n bodyObject[elem] = req[elem]\r\n })\r\n }\r\n \r\n this._cache.set(url + '-' + bodyParams[0], res.data)\r\n \r\n } else {\r\n this._cache.set(url, res.data)\r\n }\r\n \r\n }\r\n \r\n get (url, body, config, queryParams, bodyParams) {\r\n if (!url) {\r\n throw new ReferenceError('you must pass a response object')\r\n }\r\n \r\n if ((Array.isArray(body) || typeof body !== 'object') && typeof body !== 'undefined') {\r\n throw new TypeError('body must be an object or unset')\r\n }\r\n \r\n if ((Array.isArray(config) || typeof config !== 'object') && typeof config !== 'undefined') {\r\n throw new TypeError('config must be an object or unset')\r\n }\r\n \r\n if (Array.isArray(queryParams) && typeof queryParams !== 'undefined') {\r\n throw new TypeError('queryParams must be an object or unset')\r\n }\r\n \r\n if (!Array.isArray(bodyParams) && typeof bodyParams !== 'undefined') {\r\n throw new TypeError('bodyParams must be an array or unset')\r\n }\r\n \r\n // if (url[0] !== '/') {\r\n // url = '/' + url\r\n // }\r\n \r\n if (!Array.isArray(queryParams) || Array.isArray(bodyParams)) {\r\n const queryObject = {}\r\n const bodyObject = {}\r\n \r\n \r\n if (!Array.isArray(queryParams) && config && config.params) {\r\n Object.keys(queryParams).forEach(key => {\r\n queryObject[key] = config.params[key]\r\n })\r\n }\r\n \r\n if (Array.isArray(bodyParams) && body) {\r\n bodyParams.forEach(elem => {\r\n bodyObject[elem] = body[elem]\r\n })\r\n }\r\n return this._cache.get(url + '-' + bodyParams[0])\r\n } else if (!config && typeof url === 'object') {\r\n return this._cache.get(url.url)\r\n }\r\n \r\n return this._cache.get(url)\r\n \r\n } \r\n}","import Cache from './Cache';\r\n\r\nexport default class PostCache {\r\n _axios = null;\r\n _cachedUrls = null;\r\n _cache = null;\r\n\r\n constructor(axios, cachedUrls) {\r\n this._axios = axios;\r\n this._cache = new Cache();\r\n\r\n if (!axios) {\r\n throw new ReferenceError('You must pass axios or axios instance')\r\n }\r\n\r\n\r\n }\r\n\r\n setCachedUrls(cachedUrls) {\r\n this._cachedUrls = cachedUrls;\r\n\r\n if (!cachedUrls) {\r\n throw new ReferenceError('c\\'mon, man')\r\n }\r\n\r\n if (!Array.isArray(cachedUrls)) {\r\n throw new TypeError('the cached urls must be an array')\r\n }\r\n\r\n if (cachedUrls.some(elem => {\r\n if (!elem) {\r\n return true\r\n }\r\n\r\n if (Array.isArray(elem)) {\r\n return true\r\n }\r\n\r\n if (typeof elem === 'object') {\r\n if (!elem.url) {\r\n return true\r\n }\r\n } else if (typeof elem !== 'string') {\r\n return true\r\n }\r\n })) {\r\n throw new TypeError('Please, provide only objects (with a url) or a string')\r\n }\r\n }\r\n\r\n async post(url, body, config) {\r\n if (!body) {\r\n throw ReferenceError('You must provide a body for a post request (even if it is empty)')\r\n }\r\n\r\n if (typeof body !== 'object' || Array.isArray(body)) {\r\n throw TypeError('The body must be an object (even if it is empty)')\r\n }\r\n\r\n let cacheable = false\r\n\r\n this._cachedUrls.forEach(elem => {\r\n if (typeof elem === 'string') {\r\n if (url.includes(elem)) {\r\n cacheable = elem\r\n }\r\n } else {\r\n if (url.includes(elem.url)) {\r\n cacheable = elem\r\n }\r\n }\r\n })\r\n\r\n if (cacheable) {\r\n let cached = null\r\n\r\n if (typeof cacheable === 'string') {\r\n cached = this._cache.get(cacheable)\r\n } else {\r\n cached = this._cache.get(cacheable.url, body, config, cacheable.queryParams, cacheable.bodyParams)\r\n }\r\n\r\n if (cached) {\r\n return Promise.resolve({\r\n data: cached,\r\n status: 200,\r\n statusText: 'OK',\r\n headers: {},\r\n request: {}\r\n })\r\n } else {\r\n\r\n if(!window.providerCalls)\r\n window.providerCalls = 1;\r\n else\r\n window.providerCalls += 1;\r\n \r\n //console.log(`PROVIDER # OF CALLS SO FAR ${window.providerCalls}`);\r\n \r\n const response = await this._axios.post(url, body, config)\r\n this._cache.set(response, cacheable.queryParams, cacheable.bodyParams, url)\r\n\r\n return response\r\n }\r\n }\r\n\r\n return this._axios.post(url, body, config)\r\n }\r\n\r\n async get(url, config) {\r\n\r\n let cacheable = false\r\n\r\n this._cachedUrls.forEach(elem => {\r\n if (typeof elem === 'string') {\r\n if (url.includes(elem)) {\r\n cacheable = elem\r\n }\r\n } else {\r\n if (url.includes(elem.url)) {\r\n cacheable = elem\r\n }\r\n }\r\n })\r\n\r\n if (cacheable) {\r\n let cached = null\r\n const queryKeys = {}\r\n\r\n if (typeof cacheable === 'string') {\r\n cached = this._cache.get(cacheable)\r\n } else {\r\n\r\n if (cacheable.queryParams) {\r\n if (Array.isArray(cacheable.queryParams) && config) {\r\n cacheable.queryParams.forEach(elem => {\r\n queryKeys[elem] = config.params[elem]\r\n })\r\n } else if (config) {\r\n throw new TypeError('QueryParams must be an array')\r\n }\r\n }\r\n if (Object.keys(queryKeys).length > 0) {\r\n cached = this._cache.get(url, undefined, config, queryKeys, undefined)\r\n } else {\r\n cached = this._cache.get(cacheable)\r\n }\r\n }\r\n\r\n if (cached) {\r\n return Promise.resolve({\r\n data: cached,\r\n status: 200,\r\n statusText: 'OK, cached',\r\n headers: {},\r\n request: {}\r\n })\r\n } else {\r\n const response = await this._axios.get(url, config)\r\n if (Object.keys(queryKeys).length > 0) {\r\n this._cache.set(response, queryKeys, undefined, url)\r\n } else {\r\n this._cache.set(response)\r\n }\r\n return response\r\n }\r\n }\r\n\r\n return this._axios.get(url, config)\r\n }\r\n\r\n flushAll() {\r\n this._cache.flushAll()\r\n }\r\n}","import axios from 'axios';\r\nimport PostCache from './PostCache';\r\nimport { getBaseUrl } from '../utils';\r\nimport { SummaryConstants as Constants } from '../Helpers/summaryconstants';\r\n\r\nexport default class TcciService {\r\n language = \"\";\r\n province = \"\";\r\n postCache = null;\r\n\r\n constructor() {\r\n this.postCache = new PostCache(axios);\r\n }\r\n\r\n\r\n /*\r\n Calculate the total residual value on the color and accessories\r\n */\r\n getResidualTotal(summaryCalculator) {\r\n if (!summaryCalculator.SelectedColourExterior || !summaryCalculator.SelectedColourInterior) {\r\n return 0;\r\n }\r\n\r\n //let extColorValue = summaryCalculator.SelectedColourExterior.price ? summaryCalculator.SelectedColourExterior.price : 0;\r\n //let intColorValue = summaryCalculator.SelectedColourInterior.price ? summaryCalculator.SelectedColourInterior.price : 0;\r\n\r\n let totalAccessoriesResidualValue = 0;\r\n\r\n let accesories = Object.entries(summaryCalculator.SelectedAccessories);\r\n accesories.forEach((accessory) => {\r\n const residualValue = Number(accessory[1].residual_value ? accessory[1].residual_value : 0);\r\n\r\n // Fix arithmetic error when adding accessories residual value and we ended up with a bunch of 0000000001 at the end\r\n totalAccessoriesResidualValue = Math.round((Number(totalAccessoriesResidualValue) + residualValue) * 100) / 100;\r\n })\r\n\r\n let residualTotal = Math.round((totalAccessoriesResidualValue) * 100) / 100;\r\n \r\n //console.log(residualTotal, extColorValue, intColorValue, accessoriesValue);\r\n return residualTotal;\r\n }\r\n\r\n /*\r\n Handle the reqest sent to provider and has a post cache object to not send multiple time the same post \r\n */\r\n async handleRequest(url, data) {\r\n const mockedModels = [...window.mockedModels];\r\n\r\n const startsWithAny = mockedModels.some(str => data.Identifier.startsWith(str));\r\n\r\n if (startsWithAny) {\r\n const mock = require('./tcciMock.json');\r\n return mock.QuoteResponse;\r\n }\r\n\r\n const cachedUrls = [\r\n {\r\n url: url,\r\n bodyParams: [JSON.stringify(data)],\r\n },\r\n ]\r\n this.postCache.setCachedUrls(cachedUrls);\r\n\r\n const requestOptions = {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'x-requested-with': 'XMLHttpRequest'\r\n },\r\n body: JSON.stringify(data)\r\n };\r\n\r\n try {\r\n const responseData = await this.postCache.post(url, data, requestOptions);\r\n\r\n return responseData.data.QuoteResponse;\r\n } catch (err) {\r\n console.log('Failed to fetch data from payment provider:', err);\r\n\r\n return {}; //return await this.handleRequest(url, data);\r\n }\r\n }\r\n\r\n\r\n /*\r\n build the body to be sent to provider to retrieve the information\r\n\r\n it depends of the summarycalculator object, note that some parameter has started to be decoupled from the summarycalculator object in preparation for the refactoring\r\n\r\n productKey param can be both / loan / lease\r\n */\r\n buildBodyJson(summaryCalculator, withFees, withRebates, productKey, term, loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked, selectedAnnualMileage = 0) {\r\n if (!summaryCalculator) {\r\n return {}\r\n }\r\n\r\n if (!summaryCalculator.SelectedModel) {\r\n return {}\r\n }\r\n\r\n const financialObj = summaryCalculator.FinancialInfo;\r\n\r\n const mazdaCashIncentive = financialObj.incentive_programs.filter((fee) => fee.title === 'mazda_retail_cash').length ? summaryCalculator.FinancialInfo.incentive_programs.filter((fee) => fee.title === 'mazda_retail_cash')[0].price : 0;\r\n\r\n const loyaltyPriceRate = (loyaltyChecked ? loyaltyChecked : summaryCalculator.LoyaltyChecked) ? financialObj.incentive_programs.find(x => x.type === \"loyalty\").rate_value : 0;\r\n const loyaltyPrice = (loyaltyChecked ? loyaltyChecked : summaryCalculator.LoyaltyChecked) ? financialObj.incentive_programs.find(x => x.type === \"loyalty\").cash_value : 0;\r\n const graduatePrice = (graduateChecked ? graduateChecked : summaryCalculator.GraduateChecked) ? financialObj.incentive_programs.find(x => x.type === \"grad_award\").value : 0;\r\n const militaryPrice = (militaryChecked ? militaryChecked : summaryCalculator.MilitaryChecked) ? financialObj.incentive_programs.find(x => x.type === \"military\").value : 0;\r\n const firstTimeOwnerPrice = (firstTimeOwnerChecked ? firstTimeOwnerChecked : summaryCalculator.FirstTimeOwnerChecked) ? financialObj.incentive_programs.find(x => x.type === \"first_time_owner\").value : 0;\r\n\r\n // DO NOT ADD THE EV RABATE INCENTIVE IN, THIS IS CALCULATED BY THE FLAG ISEV ON PROVIDER SIDE\r\n const incentives = mazdaCashIncentive + graduatePrice + militaryPrice + firstTimeOwnerPrice + financialObj.calculatedFinance.specialIncentives;\r\n\r\n const modelCode = summaryCalculator.SelectedModel.model_code;\r\n const packageCode = summaryCalculator.SelectedPackage.option_code;\r\n\r\n //content += `<li class=\"mz-finance-options__financial-element\"><span><label for=\"annualMileage\">${t(\"annual_km_16000\")}</label><input type=\"hidden\" name=\"annualMileage\" value=\"3\"} id=\"ultra_kilometer_lease\"/></span></li>`;\r\n //content += `<li class=\"mz-finance-options__financial-element\"><span><label for=\"annualMileage\">${t(\"annual_km_20000\")}</label><input type=\"hidden\" name=\"annualMileage\" value=\"2\"} id=\"low_kilometer_lease\"/></span></li>`;\r\n //content += `<li class=\"mz-finance-options__financial-element\"><span><label for=\"annualMileage\">${t(\"annual_km_24000\")}</label><input type=\"hidden\" name=\"annualMileage\" value=\"0\"} id=\"standard_kilometer_lease\"/></span></li>`;\r\n // TODO : MOVE THIS INTO THE UTILITY CLASS FOR REUSABILITY WITH LEASE OPTIONS\r\n let annualMileage = '24000';\r\n switch (selectedAnnualMileage) {\r\n case 3:\r\n annualMileage = '16000';\r\n break;\r\n case 2:\r\n annualMileage = '20000';\r\n break;\r\n case 0:\r\n default:\r\n annualMileage = '24000';\r\n }\r\n\r\n const baseMSRP = Math.round((summaryCalculator.SelectedModel.financial.msrp \r\n + summaryCalculator.SelectedPackage.financial.msrp\r\n + (summaryCalculator.SelectedColourExterior ? summaryCalculator.SelectedColourExterior.price : 0)\r\n + (summaryCalculator.SelectedColourInterior ? summaryCalculator.SelectedColourInterior.price : 0)) * 100) / 100;\r\n\r\n const options = summaryCalculator.SelectedWheel ? summaryCalculator.SelectedWheel.price : 0 //financialObj.calculatedFinance.options.total // Wheels\r\n + summaryCalculator.SelectedNonModelPackage.financial.msrp\r\n + summaryCalculator.SelectedWarrantyPackage.financial.msrp // Warranty \r\n + summaryCalculator.SelectedConnectedVehiclePackage.financial.msrp // Connected Vehicle \r\n + summaryCalculator.SelectedAddedProtectionPackage.financial.msrp // Added Protection\r\n + summaryCalculator.SelectedAppearanceProtectionPlansPackage.financial.msrp // Appearance Protection\r\n + financialObj.calculatedFinance.accessories.total; // Accesories \r\n\r\n const totalMSRP = summaryCalculator.SelectedModel.financial.msrp\r\n + summaryCalculator.SelectedPackage.financial.msrp // Actual Car packages \r\n + options\r\n + financialObj.exciseTax + financialObj.freight + financialObj.pde\r\n + (withFees ? financialObj.acTax + financialObj.amvic + financialObj.omvic + financialObj.tireStewardshipFee + financialObj.oil : 0);\r\n\r\n // TODO: MOVE THIS LOGIC INTO THE SUMMARYCALCULATOR BUSINESS LOGIC CLASS\r\n // Validate that trade-in value doesn't exceed max amount\r\n let tradeInVal = parseInt(summaryCalculator._tradeInValue, 10);\r\n // Tradein : Min: 0 , Max: (TotalMSRP-10000) \r\n if (parseInt(tradeInVal) > financialObj.maxDownPayment) {\r\n tradeInVal = financialObj.maxDownPayment;\r\n summaryCalculator.DownPaymentValue = 0;\r\n } else if (parseInt(tradeInVal) + financialObj.downPaymentValue > financialObj.maxDownPayment) {\r\n summaryCalculator.DownPaymentValue = financialObj.maxDownPayment - parseInt(tradeInVal);\r\n }\r\n\r\n if (typeof tradeInVal === 'string' && tradeInVal.length > 0) {\r\n summaryCalculator.TradeInValue = `$${tradeInVal}`;\r\n } else {\r\n summaryCalculator.TradeInValue = tradeInVal;\r\n }\r\n\r\n // Check if the balance is under 7500$, if so update the downpayment\r\n if (summaryCalculator.IncludeFees ? (financialObj.calculatedFinance.balanceToFinance < 7500 || financialObj.calculatedLease.leaseEndValue < 3000) : (financialObj.calculatedFinance.balanceToFinanceNoFees < 7500 || financialObj.calculatedLease.leaseEndValueNoFees < 3000)) {\r\n summaryCalculator.TradeInValue = 0;\r\n summaryCalculator.DownPaymentValue = 0;\r\n }\r\n\r\n return {\r\n \"Identifier\": `${modelCode}${packageCode}`, //`VXLP84AA00`\r\n \"BaseMSRP\": Number.parseFloat(Number.parseFloat(baseMSRP).toFixed(2)),\r\n \"ConfiguredOptions\": Number.parseFloat(Number.parseFloat(options).toFixed(2)),\r\n \"TotalMSRP\": Number.parseFloat(Number.parseFloat(totalMSRP).toFixed(2)),\r\n \"Province\": `${this.province}`,\r\n \"TotalResidualizedOptions\": Number.parseFloat(Number.parseFloat(this.getResidualTotal(summaryCalculator)).toFixed(2)),\r\n \"Parameters\": {\r\n \"ProductKey\": productKey, //\"both/loan/lease\",\r\n \"Downpayment\": Number.parseFloat(Number.parseFloat(summaryCalculator._downPaymentValue).toFixed(2)),\r\n \"TradeInValue\": Number.parseFloat(Number.parseFloat(summaryCalculator._tradeInValue).toFixed(2)),\r\n \"TradeInOwed\": 0,\r\n \"LeaseTerm\": productKey === 'lease' ? Number.parseInt(term) : 0,\r\n \"LoanTerm\": productKey === 'loan' ? Number.parseInt(term) : 0,\r\n \"AnnualMileage\": Number.parseFloat(annualMileage),\r\n \"Freight\": Number.parseFloat(financialObj.freight),\r\n \"PDE\": Number.parseFloat(Number.parseFloat(financialObj.pde).toFixed(2)),\r\n \"ACTax\": withFees ? Number.parseFloat(financialObj.acTax) : 0,\r\n \"FederalExciseTax\": Number.parseFloat(financialObj.exciseTax), //`${withFees ? exciseTax : 0}\r\n \"LeaseServiceFees\": productKey === 'lease' ? Number.parseFloat(financialObj.leaseServiceFees) : 0,\r\n \"FinanceAdminFee\": productKey === 'loan' ? (withFees ? Number.parseFloat(financialObj.adminServiceFees) : 0) : 0,\r\n \"AMVICFee\": withFees ? Number.parseFloat(Number.parseFloat(financialObj.amvic).toFixed(2)) : 0,\r\n \"OMVICFee\": withFees ? Number.parseFloat(Number.parseFloat(financialObj.omvic).toFixed(2)) : 0,\r\n \"TireStewardshipFee\": withFees ? Number.parseFloat(Number.parseFloat(financialObj.tireStewardshipFee).toFixed(2)) : 0,\r\n \"OilFilterFee\": withFees ? Number.parseFloat(Number.parseFloat(financialObj.oil).toFixed(2)) : 0,\r\n \"IsEV\": withRebates,\r\n \"CashIncentive\": Number.parseFloat(Number.parseFloat(incentives).toFixed(2)),\r\n \"WeeklyPayment\": true,\r\n \"BiWeeklyPayment\": true,\r\n \"MonthlyPayment\": true,\r\n \"MazdaAddedProtection\": 0,\r\n \"MazdaWearProtection\": 0,\r\n \"IsLoyaltyCustomer\": loyaltyChecked ? true : false,\r\n \"LoyaltyRateReduction\": loyaltyChecked ? Number.parseFloat(loyaltyPriceRate) : 0,\r\n \"LoyaltyCashIncentive\": loyaltyChecked ? Number.parseFloat(Number.parseFloat(loyaltyPrice).toFixed(2)) : 0,\r\n }\r\n }\r\n }\r\n\r\n /*\r\n Send the data to the retrieval http service and handle some basic status error.\r\n \r\n TODO : Handle all the returned error during the refactoring phase\r\n */\r\n async sendDataToService(summaryCalculator, withFees, withRebates, productKey, term, loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwner, selectedAnnualMileage) {\r\n const url = `${getBaseUrl()}${process.env.REACT_APP_TCCI_API_PATH}`;\r\n const data = this.buildBodyJson(summaryCalculator, withFees, withRebates, productKey, term, loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwner, selectedAnnualMileage);\r\n\r\n if (Object.keys(data).length === 0) {\r\n console.log('No data to send to the TCCI service');\r\n return {};\r\n }\r\n\r\n const response = await this.handleRequest(url, data);\r\n\r\n return response;\r\n }\r\n\r\n /*\r\n Extract the lease data from the response\r\n */\r\n async extractLeaseData(response) {\r\n const leaseObject = {};\r\n\r\n leaseObject.weekly = response[0].Lease.Quote.WeeklyPayment;\r\n leaseObject.biWeekly = response[0].Lease.Quote.BiWeeklyPayment;\r\n leaseObject.monthly = response[0].Lease.Quote.MonthlyPayment;\r\n leaseObject.weeklyWithTaxes = response[0].Lease.Quote.WeeklyPaymentWithTaxes;\r\n leaseObject.biWeeklyWithTaxes = response[0].Lease.Quote.BiWeeklyPaymentWithTaxes;\r\n leaseObject.monthlyWithTaxes = response[0].Lease.Quote.MonthlyPaymentWithTaxes;\r\n\r\n // Generic information\r\n leaseObject.leaseRate = response[0].Lease.Quote.LeaseRate\r\n leaseObject.freight = response[0].Lease.Quote.Freight;\r\n leaseObject.pde = response[0].Lease.Quote.Pde;\r\n leaseObject.airConditioningTax = response[0].Lease.Quote.AirConditioningTax;\r\n leaseObject.omvicFee = response[0].Lease.Quote.OmvicFee;\r\n leaseObject.amvicFee = response[0].Lease.Quote.AmvicFee;\r\n leaseObject.tireStewardshipFee = response[0].Lease.Quote.TireStewardshipFee;\r\n leaseObject.oilFilterFee = response[0].Lease.Quote.OilFilterFee;\r\n leaseObject.ppsa = response[0].Lease.Quote.Ppsa;\r\n leaseObject.leaseDealerServiceFee = response[0].Lease.Quote.LeaseDealerServiceFee;\r\n leaseObject.leaseRateDiscounted = response[0].Lease.Quote.LeaseRateDiscounted;\r\n leaseObject.isLoyaltyCustomer = response[0].Lease.Quote.IsLoyaltyCustomer;\r\n leaseObject.hasError = response[0].Lease.HasError;\r\n leaseObject.capitalizedCost = response[0].Lease.Quote.CapitalizedCost;\r\n leaseObject.residualAmount = response[0].Lease.Quote.ResidualAmount;\r\n\r\n return leaseObject;\r\n }\r\n\r\n /*\r\n Extract the loan data from the response\r\n */\r\n async extractLoanData(response) {\r\n const loanObject = {};\r\n\r\n loanObject.weekly = response[0].Loan.Quote.WeeklyPayment;\r\n loanObject.biWeekly = response[0].Loan.Quote.BiWeeklyPayment;\r\n loanObject.monthly = response[0].Loan.Quote.MonthlyPayment;\r\n loanObject.weeklyWithTaxes = response[0].Loan.Quote.WeeklyPaymentWithTaxes;\r\n loanObject.biWeeklyWithTaxes = response[0].Loan.Quote.BiWeeklyPaymentWithTaxes;\r\n loanObject.monthlyWithTaxes = response[0].Loan.Quote.MonthlyPaymentWithTaxes;\r\n loanObject.costOfBorrowing = Number(response[0].Loan.Quote.CostOfBorrowingWithoutTaxes);\r\n loanObject.costOfBorrowingWithTaxes = Number(response[0].Loan.Quote.CostOfBorrowing);\r\n\r\n // GENERIC\r\n loanObject.freight = response[0].Loan.Quote.Freight;\r\n loanObject.pde = response[0].Loan.Quote.Pde;\r\n loanObject.airConditioningTax = response[0].Loan.Quote.AirConditioningTax;\r\n loanObject.omvicFee = response[0].Loan.Quote.OmvicFee;\r\n loanObject.amvicFee = response[0].Loan.Quote.AmvicFee;\r\n loanObject.tireStewardshipFee = response[0].Loan.Quote.TireStewardshipFee;\r\n loanObject.oilFilterFee = response[0].Loan.Quote.OilFilterFee;\r\n loanObject.ppsa = response[0].Loan.Quote.Ppsa;\r\n loanObject.aprRate = response[0].Loan.Quote.AprRate;\r\n //loanObject.aprRate = this.FinancialInfo.calculatedFinance.financeValues[this.FinanceTermIndex].aprRate ? Number(this.FinancialInfo.calculatedFinance.financeValues[this.FinanceTermIndex].aprRate).toFixed(2) : \"\";\r\n loanObject.loanPeriod = response[0].Loan.Quote.LoanPeriod; // TERM\r\n loanObject.aprRateDiscounted = response[0].Loan.Quote.AprRateDiscounted;\r\n //loanObject.aprRateDiscounted = this.FinancialInfo.calculatedFinance.financeValues[this.FinanceTermIndex].aprRateDiscounted ? Number(this.FinancialInfo.calculatedFinance.financeValues[this.FinanceTermIndex].aprRateDiscounted).toFixed(2) : \"\";\r\n loanObject.isLoyaltyCustomer = response[0].Loan.Quote.IsLoyaltyCustomer;\r\n loanObject.loanAmount = response[0].Loan.Quote.LoanAmount;\r\n loanObject.hasError = response[0].Loan.Quote.HasError;\r\n\r\n loanObject.gstAmount = response[0].Loan.Quote.GstAmount;\r\n loanObject.pstAmount = response[0].Loan.Quote.PstAmount;\r\n\r\n return loanObject;\r\n }\r\n\r\n getResidualAmountFromLeaseData(response) {\r\n if(response && response.length > 0)\r\n return response[0].Lease.Quote.ResidualAmount;\r\n else\r\n return 0;\r\n }\r\n}","/* global dataLayer */\r\n\r\nimport { useTranslation } from \"react-i18next\";\r\nimport SummaryCalculator from './summarycalculator';\r\n\r\nexport default class GTMHelper {\r\n\tpushToGTMDataLayer\t= (data) =>{\r\n\t\ttry {\r\n\t window.dataLayer.push(data);\r\n\t } catch (err) {\r\n\t console.log('Error: dataLayer is not found in pushToGTMDataLayer().', data)\r\n\t }\r\n\t}\r\n setGTM(data, isSimple, showPrevious) {\r\n\t\t// UNIT TEST CASE : Don't run the GTM.\r\n\t\tif(!window.summaryCalculator)\r\n\t\t\treturn;\r\n\r\n\t\tconst summaryCalculator = window.summaryCalculator;\r\n\t\tconst selectedVehicle = summaryCalculator.selectedVehicle;\r\n\t\tconst steps = [\r\n\t\t\t'vehicles',\r\n\t\t\t'trim',\r\n\t\t\t'options',\r\n\t\t\t'colour',\r\n\t\t\t'wheels',\r\n\t\t\t'connectivity',\r\n\t\t\t'accessories',\r\n\t\t\t'protections',\r\n\t\t\t'payments',\r\n\t\t\t'summary'\r\n\t\t]\r\n\t\tconst GTMData = data;\r\n\r\n\t\tGTMData.step = GTMData.action === 'Next Step' ? steps[summaryCalculator.CurrentStep+1] : steps[summaryCalculator.CurrentStep];\r\n\t\tif(GTMData.action === 'Step'){\r\n\t\t\tGTMData.event = 'BnP - Step ' + GTMData.step;\r\n\t\t} else {\r\n\t\t\tGTMData.event = 'BnP - ' + GTMData.action;\r\n\t\t}\r\n\t\tif(showPrevious) GTMData.previous = steps[summaryCalculator.PreviousStep]\r\n\t\tif(!isSimple){\r\n\t\t\tGTMData.model = selectedVehicle.model;\r\n\t\t\tGTMData.trim = selectedVehicle.trim;\r\n\t\t\tGTMData.model = selectedVehicle.carline;\r\n\t\t\tGTMData.engine = selectedVehicle.model;\r\n\t\t\tGTMData.year = selectedVehicle.year;\r\n\t\t\tGTMData.interior = summaryCalculator._selectedColourInterior?.code !== undefined ? summaryCalculator._selectedColourInterior?.code : '';\r\n\t\t\tGTMData.exterior = summaryCalculator._selectedColourExterior?.code !== undefined ? summaryCalculator._selectedColourExterior?.code : '';\r\n\t\t\tGTMData.wheel = summaryCalculator._selectedWheel?.title !== undefined ? summaryCalculator._selectedWheel?.title : '';\r\n\t\t\tif(steps[summaryCalculator.PreviousStep] === 'wheels' && GTMData.wheel === '') GTMData.wheel = 'No Selection';\r\n\t\t\tGTMData.accessories = summaryCalculator._selectedAccessories.length > 0 ? summaryCalculator._selectedAccessories.map(({ name }) => name) : '';\r\n\t\t\tif(summaryCalculator.FinancialInfo) GTMData.price = summaryCalculator.FinancialInfo.calculatedCash.subtotal;\r\n\t\t}\r\n\t\tdelete GTMData.action;\r\n\t\tthis.pushToGTMDataLayer(GTMData)\r\n }\r\n\r\n}","import axios from 'axios';\r\nimport PostCache from './PostCache';\r\nimport { getBaseUrl } from '../utils';\r\n\r\nimport GTMHelper from '../Helpers/gtmHelper';\r\n\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nexport default class OcaService {\r\n lease = {};\r\n loan = {};\r\n province = \"\";\r\n postCache = null;\r\n\r\n constructor() {\r\n this.postCache = new PostCache(axios);\r\n }\r\n\r\n /*\r\n Handle the reqest sent to OCA and has a post cache object to not send the same post multiple times\r\n */\r\n async handleRequest(url, data) {\r\n const cachedUrls = []; \r\n this.postCache.setCachedUrls(cachedUrls);\r\n\r\n const requestOptions = {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'x-requested-with': 'XMLHttpRequest'\r\n },\r\n body: JSON.stringify(data)\r\n };\r\n\r\n // TEMPORARY MESURE UNTIL BNS HAS FOUND THE BUG\r\n try\r\n {\r\n const responseData = await this.postCache.post(url, data, requestOptions);\r\n\r\n window.ocaRetry === undefined || window.ocaRetry === NaN ? window.ocaRetry = 0: window.ocaRetry++;\r\n \r\n // Do we have data, if so reset the retry counter \r\n if (responseData.data && responseData.data.oca_url.length > 0) {\r\n window.ocaRetry = 0\r\n return responseData.data;\r\n }\r\n\r\n if (window.ocaRetry < 15) {\r\n const delay = ms => new Promise(res => setTimeout(res, ms));\r\n console.log('try again because it failed');\r\n\r\n await delay(500);\r\n\r\n return await this.handleRequest(url, data); \r\n }\r\n } catch {\r\n console.log('try again because it failed');\r\n\r\n return await this.handleRequest(url, data);\r\n } \r\n }\r\n\r\n /*\r\n build the body to be sent to OCA to retrieve url\r\n\r\n endpoint requirements can be found here...\r\n https://confluence.uhub.biz/pages/resumedraft.action?draftId=516591718&draftShareId=cf0565da-a3f2-45c0-b0de-811b21a89d2b&\r\n */\r\n buildBodyJson(summaryCalculator, financeType) {\r\n\r\n if (!summaryCalculator) {\r\n return {}\r\n }\r\n\r\n const default360 = summaryCalculator._selectedExteriorColour['360'];\r\n const financialInfo = summaryCalculator.FinancialInfo;\r\n\r\n if(financeType === 'loan'){\r\n return {\r\n \"data\": {\r\n \"payload\": {\r\n \"vehicle\":{\r\n \"year\":Number(summaryCalculator.selectedVehicle.year), // consider that half years exists for mazda\r\n \"make\":\"Mazda\",\r\n \"model\":ReactHtmlParser(sessionStorage.getItem('plainTitle')),\r\n \"trim\":summaryCalculator.selectedVehicle.trim,\r\n \"imageUrl\": `${summaryCalculator._colours.visual.static_content_base_path}${default360.file_path}${default360.filename_prefix}${summaryCalculator._current360Rotation}${default360.filename_suffix}`, // same image as the one on the summary page\r\n \"buildLink\": `https://www.mazda.ca/en/shopping/build-and-price/#/${summaryCalculator._colours.carline.url_slug}/${summaryCalculator._colours.year.url_slug}/`,\r\n \"msrp\":summaryCalculator._ocaService.loan.cashPrice\r\n },\r\n \"tradeIn\":{\r\n \"tradeInValue\":summaryCalculator._tradeInValue,\r\n \"amountOwedOnTrade\":0\r\n },\r\n \"loanType\": financeType, // lease or loan\r\n \"language\": summaryCalculator._language + \"-CA\",\r\n \"loan\":{\r\n \"cashPrice\":summaryCalculator._ocaService.loan.cashPrice,\r\n \"rate\": summaryCalculator._ocaService.loan.rate,\r\n \"term\":Number(summaryCalculator._ocaService.loan.term),\r\n \"payment\": Number(summaryCalculator._ocaService.loan.payment),\r\n \"financeAmount\":Number(summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceWithFeesTaxed),\r\n \"programEndDateTime\":summaryCalculator._ocaService.loan.Program_End_datetime,\r\n \"downPayment\": Number(summaryCalculator._ocaService.loan.downPayment),\r\n \"apr\":Number(summaryCalculator._ocaService.loan.apr)\r\n }\r\n },\r\n \"expiration\": \"600s\"\r\n }\r\n }\r\n }else{\r\n return {\r\n \"data\": {\r\n \"payload\": {\r\n \"vehicle\":{\r\n \"year\":Number(summaryCalculator.selectedVehicle.year),\r\n \"make\":\"Mazda\",\r\n \"model\":ReactHtmlParser(sessionStorage.getItem('plainTitle')),\r\n \"trim\":summaryCalculator.selectedVehicle.trim,\r\n \"imageUrl\": `${summaryCalculator._colours.visual.static_content_base_path}${default360.file_path}${default360.filename_prefix}${summaryCalculator._current360Rotation}${default360.filename_suffix}`,\r\n \"buildLink\": `https://www.mazda.ca/en/shopping/build-and-price/#/${summaryCalculator._colours.carline.url_slug}/${summaryCalculator._colours.year.url_slug}/`,\r\n \"msrp\":summaryCalculator._ocaService.lease.sellingPrice\r\n },\r\n \"tradeIn\":{\r\n \"tradeInValue\":summaryCalculator._tradeInValue,\r\n \"amountOwedOnTrade\":0\r\n },\r\n \"loanType\": financeType, // lease or loan\r\n \"language\": summaryCalculator._language + \"-CA\",\r\n \"lease\":{\r\n \"sellingPrice\": summaryCalculator._ocaService.lease.sellingPrice,\r\n \"residualValue\": summaryCalculator._ocaService.lease.residualValue,\r\n \"term\":Number(summaryCalculator._ocaService.lease.term),\r\n \"monthlyDepreciation\":summaryCalculator._ocaService.lease.monthlyDepreciation,\r\n \"totalInterestCost\":summaryCalculator._ocaService.lease.totalInterestCost * summaryCalculator._ocaService.lease.term,\r\n \"interestFactor\":summaryCalculator._ocaService.lease.interestFactor,\r\n \"baseMonthlyPayment\":summaryCalculator._ocaService.lease.baseMonthlyPayment * summaryCalculator._ocaService.lease.term,\r\n \"gstHSTRate\": summaryCalculator._ocaService.lease.gstHSTRate,\r\n \"gstHSTAmountOnRental\": summaryCalculator._ocaService.lease.gstHSTAmountOnRental,\r\n \"totalMonthlyPayment\":summaryCalculator._ocaService.lease.totalMonthlyPayment,\r\n \"adjustedCapitalizedCost\":summaryCalculator._ocaService.lease.adjustedCapitalizedCost,\r\n \"PSTRate\": summaryCalculator._ocaService.lease.PSTRate,\r\n \"PSTAmount\":summaryCalculator._ocaService.lease.PSTAmount,\r\n \"programEndDateTime\":summaryCalculator._ocaService.lease.Program_End_datetime,\r\n \"downPayment\": Number(summaryCalculator._ocaService.lease.downPayment),\r\n \"apr\":Number(summaryCalculator._ocaService.lease.apr.toFixed(2))\r\n }\r\n },\r\n \"expiration\": \"600s\"\r\n }\r\n }\r\n }\r\n }\r\n \r\n /*\r\n Send the data to the retrieval http service and handle some basic status error.\r\n \r\n TODO : Handle all the returned error during the refactoring phase\r\n */\r\n async sendDataToService(summaryCalculator, financeType) {\r\n const gtmHelper = new GTMHelper();\r\n\r\n //get current loan/lease vals\r\n await summaryCalculator.updateSingleLineFromFinancialProvider();\r\n\r\n const url = `${getBaseUrl()}${process.env.REACT_APP_OCA_API_PATH}`;\r\n const data = this.buildBodyJson(summaryCalculator, financeType);\r\n const response = await this.handleRequest(url, data);\r\n\r\n if (response.oca_url.length > 0) {\r\n const hardcodedCid = `cid=mazda-credit-application`;\r\n const trackingID = document.cookie.split('; _ga=').pop().split(';').shift(); \r\n const trackingParam = trackingID.length > 1 ? `&gcid=${trackingID}`:'';\r\n const bnsParam = `&appid=${response.oca_url.split('/').at(-1)}`;\r\n\r\n const price = financeType === 'loan' ? summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceWithFeesWithRebatesTaxed : summaryCalculator.FinancialInfo.calculatedLease.balanceToLeaseWithFeesWithRebatesTaxed\r\n //gtm tracking\r\n gtmHelper.setGTM({'action':`OCA - Modal Submit ${financeType === 'loan' ? 'Finance' : 'Lease'}`,'year': data.data.payload.vehicle.year,'model': ReactHtmlParser(summaryCalculator.selectedVehicle.carline), 'trim': data.data.payload.vehicle.trim, 'price' : Math.round(price), 'application ID' : response.oca_url.split('/').at(-1)}, true, false);\r\n\r\n const exitUrl=`${response.oca_url}?${hardcodedCid}${trackingParam}${bnsParam}`;\r\n setTimeout(() => {\r\n window.open(exitUrl, '_blank');\r\n })\r\n }else{\r\n console.log('**** FAILED TO SEND DATA TO OCA ****', response);\r\n }\r\n }\r\n\r\n}\r\n","import ReactHtmlParser from 'react-html-parser';\r\n\r\n/**\r\n * Calculates the interest rate given the number of periods, payment, present value, future value, and type of interest.\r\n * \r\n * @param {number} periods - The number of periods.\r\n * @param {number} payment - The payment made each period.\r\n * @param {number} present - The present value, i.e. the initial amount borrowed.\r\n * @param {number} future - The future value, i.e. the amount to be paid back.\r\n * @param {number} type - The type of interest, where 0 is nominal, 1 is effective.\r\n * @param {number} [guess] - The initial guess for the interest rate.\r\n * @returns {number} The interest rate.\r\n */\r\nexport function RATE(periods, payment, present, future, type, guess) {\r\n guess = (guess === undefined) ? 0.01 : guess; // Set the initial guess\r\n future = (future === undefined) ? 0 : future; // Set the future value\r\n type = (type === undefined) ? 0 : type; // Set the type of interest\r\n\r\n // Set maximum epsilon for end of iteration\r\n var epsMax = 1e-10;\r\n\r\n // Set maximum number of iterations\r\n var iterMax = 10;\r\n\r\n // Implement Newton's method\r\n var y, y0, y1, x0, x1 = 0, // Initialise variables\r\n f = 0,\r\n i = 0;\r\n var rate = guess;\r\n if (Math.abs(rate) < epsMax) {\r\n y = present * (1 + periods * rate) + payment * (1 + rate * type) * periods + future;\r\n } else {\r\n f = Math.exp(periods * Math.log(1 + rate));\r\n y = present * f + payment * (1 / rate + type) * (f - 1) + future;\r\n }\r\n y0 = present + payment * periods + future;\r\n y1 = present * f + payment * (1 / rate + type) * (f - 1) + future;\r\n i = x0 = 0;\r\n x1 = rate;\r\n while ((Math.abs(y0 - y1) > epsMax) && (i < iterMax)) {\r\n rate = (y1 * x0 - y0 * x1) / (y1 - y0);\r\n x0 = x1;\r\n x1 = rate;\r\n if (Math.abs(rate) < epsMax) {\r\n y = present * (1 + periods * rate) + payment * (1 + rate * type) * periods + future;\r\n } else {\r\n f = Math.exp(periods * Math.log(1 + rate));\r\n y = present * f + payment * (1 / rate + type) * (f - 1) + future;\r\n }\r\n y0 = y1;\r\n y1 = y;\r\n ++i;\r\n }\r\n return rate;\r\n};\r\n\r\n/**\r\n * Calculates the payment amount per period based on the interest rate, number of payments, present value, future value, and type of interest.\r\n *\r\n * @param {number} rate_per_period - The interest rate per period.\r\n * @param {number} number_of_payments - The total number of payments.\r\n * @param {number} present_value - The initial amount borrowed.\r\n * @param {number} future_value - The future value to be paid back.\r\n * @param {number} type - The type of interest (0 for nominal, 1 for effective).\r\n * @return {number} The payment amount per period.\r\n */\r\nexport function PMT(rate_per_period, number_of_payments, present_value, future_value, type){\r\n future_value = typeof future_value !== 'undefined' ? future_value : 0;\r\n type = typeof type !== 'undefined' ? type : 0;\r\n\r\n\tif(rate_per_period != 0.0){\r\n\t\t// Interest rate exists\r\n\t\tvar q = Math.pow(1 + rate_per_period, number_of_payments);\r\n\t\treturn -(rate_per_period * (future_value + (q * present_value))) / ((-1 + q) * (1 + rate_per_period * (type)));\r\n\r\n\t} else if(number_of_payments != 0.0){\r\n\t\t// No interest rate, but number of payments exists\r\n\t\treturn -(future_value + present_value) / number_of_payments;\r\n\t}\r\n\r\n\treturn 0;\r\n}","import React from 'react';\r\nimport { SummaryConstants as Constants } from './summaryconstants';\r\nimport ApiService from '../Services/ApiService';\r\nimport TcciService from '../Services/TcciService';\r\nimport OcaService from '../Services/OcaService';\r\nimport { getLang, getProvince, formatPrice, getParams, buildLegalContent, customRound } from '../utils';\r\nimport { RATE } from '../financeUtils';\r\nimport GTMHelper from './gtmHelper';\r\n\r\n// import format currency\r\n\r\n/*\r\nTODO: THERE IS A MIX OF THREE KIND OF LAYER HERE THAT NEED TO BE SPLITTED\r\n- STRING MANIPULATION UTILS\r\n- JSON PARSING\r\n- OBJECT MODEL WITH BROWSER RULES (SESSION STORAGE)\r\n\r\nREFACTOR:\r\n- PROVINCE RETRIEVAL AND INSERT INTO THE CLASS OBJECT INSTEAD OF SINGLE METHOD\r\n*/\r\nexport default class SummaryCalculator {\r\n _myInstance;\r\n _allDataIsLoaded = false;\r\n\r\n _apiService = null;\r\n _tcciService = null;\r\n\r\n selectedVehicle = {\r\n year: new Date().getFullYear(),\r\n carline: '',\r\n trim: '',\r\n model: null,\r\n packageCode: null,\r\n }\r\n selectedLanguage = \"\";\r\n\r\n _availableTrims = null;\r\n _selectedModelYear = null;\r\n\r\n _selectedTrim = null;\r\n _selectedTrimIndex = 0;\r\n\r\n _tradeInValue = 0;\r\n _downPaymentValue = 0;\r\n _loyaltyChecked = false;\r\n _militaryChecked = false;\r\n _graduateChecked = false;\r\n _firstTimeOwnerChecked = false;\r\n _accessoriesValue = 0;\r\n _annualMileage = 0;\r\n _financeTerm = null;\r\n _leaseTerm = null;\r\n _financeTermIndex = 0;\r\n _leaseTermIndex = 0;\r\n\r\n _pstRate = 0;\r\n _gstRate = 0;\r\n\r\n _financialInfo = null;\r\n _initialFinancial = null;\r\n\r\n _engineAndDrivetrain = null;\r\n _selectedModelIndex = 0;\r\n _selectedModel = null;\r\n _packages = null;\r\n _selectedPackage = {\r\n financial: {\r\n msrp: 0\r\n }\r\n };\r\n _selectedNonModelPackage = {\r\n financial: {\r\n msrp: 0\r\n }\r\n };\r\n _selectedWarrantyPackage = {\r\n financial: {\r\n msrp: 0\r\n }\r\n };\r\n _selectedConnectedVehiclePackage = {\r\n financial: {\r\n msrp: 0\r\n }\r\n };\r\n _selectedAddedProtectionPackage = {\r\n financial: {\r\n msrp: 0\r\n }\r\n };\r\n _selectedAppearanceProtectionPackage = {\r\n financial: {\r\n msrp: 0\r\n }\r\n };\r\n\r\n _selectedPackageIndex = null;\r\n _selectedNonModelPackageIndex = null;\r\n _selectedWarrantyIndex = null;\r\n _selectedConnectedVehicleIndex = null;\r\n _selectedAddedProtectionIndex= null;\r\n _selectedAppearanceProtectionIndex = 0;\r\n _selectedAppearanceProtectionPlanPackageIndex = null;\r\n\r\n _current360Rotation = 18;\r\n _colours = null;\r\n _selectedColourInterior = null;\r\n _selectedColourInteriorIndex = -1;\r\n _selectedColourExterior = null;\r\n _selectedColourExteriorIndex = -1;\r\n _allowedColoursExterior = [];\r\n _wheels = null;\r\n _selectedWheel = null;\r\n _selectedWheelIndex = null;\r\n _accessories = null;\r\n _selectedAccessories = [];\r\n _categories = null;\r\n _selectedCategory = null;\r\n\r\n _incentives = null;\r\n _annualMileage = 2;\r\n _includeFees = true;\r\n _includeTaxes = false;\r\n _includeRebates = false;\r\n\r\n _currentStep = 0;\r\n _previousStep = -1;\r\n\r\n _language = \"en\";\r\n\r\n _showFinancePrice = true;\r\n _currentCalculatedCash = 0;\r\n\r\n _currentPurchaseMethod = null;\r\n\r\n constructor() {\r\n // Create a singleton pattern\r\n if (SummaryCalculator._instance) {\r\n return SummaryCalculator._instance\r\n }\r\n SummaryCalculator._instance = this;\r\n\r\n this._language = getLang();\r\n\r\n this._apiService = new ApiService();\r\n this._apiService.language = this._language;\r\n this._apiService.province = getProvince();\r\n\r\n this._tcciService = new TcciService();\r\n this._tcciService.language = this._language;\r\n this._tcciService.province = getProvince();\r\n\r\n this._ocaService = new OcaService();\r\n this._ocaService.province = getProvince();\r\n }\r\n\r\n get ShowFinancePrice() {\r\n return this._showFinancePrice;\r\n }\r\n\r\n set ShowFinancePrice(value) {\r\n this._showFinancePrice = value;\r\n sessionStorage.setItem(Constants.ShowFinancePrice, JSON.stringify(this._showFinancePrice));\r\n }\r\n\r\n get CurrentCalculatedCash() {\r\n return this._currentCalculatedCash;\r\n }\r\n\r\n set CurrentCalculatedCash(value) {\r\n this._currentCalculatedCash = value;\r\n }\r\n\r\n //for sending Get local price specific button select to dealer (Finance/Lease/Cash)\r\n get CurrentPurchaseMethod() {\r\n return this._currentPurchaseMethod;\r\n }\r\n\r\n set CurrentPurchaseMethod(value) {\r\n this._currentPurchaseMethod = value;\r\n }\r\n\r\n get CurrentStep() {\r\n return this._currentStep;\r\n }\r\n get PreviousStep() {\r\n return this._previousStep;\r\n }\r\n\r\n set CurrentStep(value) {\r\n const gtmHelper = new GTMHelper();\r\n\r\n this._currentStep = value;\r\n sessionStorage.setItem(Constants.CurrentStep, this._currentStep);\r\n if (this._previousStep != this._currentStep) {\r\n gtmHelper.setGTM({ 'action': 'Step' }, false, true);\r\n this._previousStep = this._currentStep;\r\n sessionStorage.setItem(Constants.PreviousStep, this._previousStep);\r\n }\r\n }\r\n\r\n get Current360Rotation() {\r\n return this._current360Rotation;\r\n }\r\n\r\n set Current360Rotation(value) {\r\n this._current360Rotation = value;\r\n sessionStorage.setItem(Constants.Current360Rotation, this._current360Rotation);\r\n }\r\n\r\n get AvailableTrim() {\r\n return this._availableTrims;\r\n }\r\n\r\n set AvailableTrim(value) {\r\n this._availableTrims = value;\r\n sessionStorage.setItem(Constants.AvailableTrim, JSON.stringify(value));\r\n }\r\n\r\n get SelectedModelYear() {\r\n return this._selectedModelYear;\r\n }\r\n\r\n set SelectedModelYear(value) {\r\n this._selectedModelYear = value;\r\n sessionStorage.setItem(Constants.SelectedModelYear, JSON.stringify(this._selectedModelYear));\r\n }\r\n\r\n get SelectedTrim() {\r\n return this._selectedTrim;\r\n }\r\n\r\n set SelectedTrim(value) {\r\n this._selectedTrim = value;\r\n sessionStorage.setItem(Constants.SelectedTrim, JSON.stringify(this._selectedTrim));\r\n }\r\n\r\n get SelectedTrimIndex() {\r\n return this._selectedTrimIndex;\r\n }\r\n\r\n set SelectedTrimIndex(value) {\r\n this._selectedTrimIndex = value;\r\n sessionStorage.setItem(Constants.SelectedTrimIndex, value);\r\n\r\n this.SelectedTrim = this._availableTrims.trims[this._selectedTrimIndex];\r\n sessionStorage.setItem(Constants.UrlSlugObjectTrims, JSON.stringify({ 'year': this.selectedVehicle.carline, 'carline': this.selectedVehicle.carline }));\r\n\r\n const financial = this._availableTrims.trims[this._selectedTrimIndex].financial;\r\n this.FinancialInfo = this.getFinanceObjectWithCalculations(financial, '', '', false, false, false, false, null, null);\r\n }\r\n\r\n /*\r\n * This is the entry method that prefetch all the remaining data\r\n */\r\n async setSelectedTrimIndex(value) {\r\n //this._selectedTrimIndex = value?value:this._selectedTrimIndex;\r\n const tempValue = value !== null ? value : this._selectedTrimIndex;\r\n\r\n this.SelectedTrimIndex = tempValue;\r\n\r\n sessionStorage.setItem(Constants.UrlSlugObjectTrims, JSON.stringify({ 'year': this.selectedVehicle.year, 'carline': this.selectedVehicle.carline }));\r\n\r\n this.selectedVehicle.trim = this.AvailableTrim.trims[tempValue].trim_type.url_slug;\r\n this.selectedVehicle.model = this.AvailableTrim.trims[tempValue].financial.based_on.model_code;\r\n this.selectedVehicle.packageCode = this.AvailableTrim.trims[tempValue].financial.based_on.option_code;\r\n sessionStorage.setItem(Constants.SelectedVehicle, JSON.stringify(tempValue));\r\n\r\n await this.setSelectedModelIndex(0);\r\n\r\n await this.updateSingleLineFromFinancialProvider();\r\n }\r\n\r\n get FinancialInfo() {\r\n return this._financialInfo;\r\n }\r\n\r\n set FinancialInfo(value) {\r\n this._financialInfo = value;\r\n sessionStorage.setItem(Constants.FinancialObj, JSON.stringify(value));\r\n }\r\n\r\n get SelectedTrimUrlSlug() {\r\n return this._availableTrims.trims[this._selectedTrimIndex].trim_type.url_slug;\r\n }\r\n\r\n get DefaultTrimUrlSlug() {\r\n return this._availableTrims.trims[0]?.trim_type?.name;\r\n }\r\n\r\n get DefaultTrim() {\r\n return this._availableTrims.trims[0];\r\n }\r\n\r\n get EngineAndDrivetrain() {\r\n return this._engineAndDrivetrain;\r\n }\r\n\r\n set EngineAndDrivetrain(value) {\r\n this._engineAndDrivetrain = value;\r\n\r\n sessionStorage.setItem(Constants.EngineAndDrivetrain, JSON.stringify(value));\r\n }\r\n\r\n get SelectedModelIndex() {\r\n return this._selectedModelIndex;\r\n }\r\n\r\n get SelectedModel() {\r\n return this._selectedModel;\r\n }\r\n\r\n set SelectedModel(value) {\r\n this._selectedModel = value;\r\n\r\n sessionStorage.setItem(Constants.SelectedModel, JSON.stringify(value));\r\n\r\n sessionStorage.setItem(Constants.VehicleTitle, this.SelectedModel.title);\r\n }\r\n\r\n set SelectedModelIndex(value) {\r\n this._selectedModelIndex = value;\r\n sessionStorage.setItem(Constants.SelectedModelIndex, value);\r\n\r\n this.SelectedModel = this.EngineAndDrivetrain.models[this._selectedModelIndex];\r\n\r\n const finance = this.SelectedModel.financial;\r\n this.FinancialInfo = this.getFinanceObjectWithCalculations(finance, '', '', false, false, false, false, null, null);\r\n }\r\n\r\n async setSelectedModelIndex(value) {\r\n await this.loadEngineAndDrivetrain(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim);\r\n\r\n this.SelectedModelIndex = value;\r\n\r\n await this.loadPackages(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n await this.loadColours(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n await this.loadWheels(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n await this.loadAccessories(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n await this.loadPayments(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n await this.loadSummary(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n await this.loadSpecsData(this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n // RESET THE APPEARANCE PROTECTION DROP DOWN\r\n if(!this.SelectedAppearanceProtectionIndex) {\r\n this.SelectedAppearanceProtectionIndex = 0;\r\n }\r\n\r\n sessionStorage.setItem(Constants.AllDataIsLoaded, this._allDataIsLoaded = true);\r\n }\r\n\r\n //store some values from BNS call to send back to BNS OCA\r\n setOcaValues(loanVals, leaseVals) {\r\n let key;\r\n\r\n //loan / finance values\r\n if (loanVals !== null) {\r\n this.setOcaData('loan', 'cashPrice', loanVals, 'TotalMsrp');\r\n this.setOcaData('loan', 'rate', loanVals, 'AprRate');\r\n this._ocaService.loan.rate = this.FinancialInfo.calculatedFinance.financeValues[this.FinancialInfo.financeTerm].rate * 100;\r\n this.setOcaData('loan', 'term', loanVals, 'LoanPeriod');\r\n this.setOcaData('loan', 'payment', loanVals, 'MonthlyPaymentWithTaxes');\r\n this.setOcaData('loan', 'financeAmount', loanVals, 'LoanAmount');\r\n this._ocaService.loan.Program_End_datetime = loanVals.Program_End_datetime;\r\n this.setOcaData('loan', 'downPayment', loanVals, 'DownPayment');\r\n this.setOcaData('loan', 'apr', loanVals, 'AprRate');\r\n }\r\n\r\n //lease values\r\n if (leaseVals !== null) {\r\n this.setOcaData('lease', 'sellingPrice', leaseVals, 'TotalMsrp');\r\n this.setOcaData('lease', 'residualValue', leaseVals, 'ResidualAmount');\r\n this.setOcaData('lease', 'term', leaseVals, 'Term');\r\n this.setOcaData('lease', 'monthlyDepreciation', leaseVals, 'MonthlyDepriciation');\r\n this.setOcaData('lease', 'totalInterestCost', leaseVals, 'MonthlyInterestCost');\r\n this.setOcaData('lease', 'interestFactor', leaseVals, 'InterestFactor');\r\n this.setOcaData('lease', 'baseMonthlyPayment', leaseVals, 'MonthlyPayment');\r\n this.setOcaData('lease', 'gstHSTRate', leaseVals, 'GstAmount');\r\n this.setOcaData('lease', 'gstHSTAmountOnRental', leaseVals, 'GstAmount');\r\n this.setOcaData('lease', 'totalMonthlyPayment', leaseVals, 'MonthlyPaymentWithTaxes');\r\n this.setOcaData('lease', 'adjustedCapitalizedCost', leaseVals, 'CapitalizedCost');\r\n this.setOcaData('lease', 'PSTRate', leaseVals, 'PstRate');\r\n this.setOcaData('lease', 'PSTAmount', leaseVals, 'PstAmount');\r\n this._ocaService.lease.Program_End_datetime = leaseVals.Program_End_datetime;\r\n this.setOcaData('lease', 'downPayment', leaseVals, 'DownPayment');\r\n //this.setOcaData('loan', 'apr', leaseVals, 'AprRate');\r\n //this._ocaService.lease.apr = this.getInformationalLeaseAprRate(true);\r\n this._ocaService.lease.apr = this.FinancialInfo.calculatedLease.leaseValues[this.FinancialInfo.leaseTerm].rate * 100;\r\n }\r\n }\r\n setOcaData(financeType, ocaField, bnsValues, key) {\r\n this._ocaService[financeType][ocaField] = bnsValues.QuoteItems.filter(filterByID)[0].Value;\r\n\r\n function filterByID(item) {\r\n if (item.Key == key) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n hasFinancialProviderData() {\r\n var hasData = true;\r\n const financeTermToBeDisplayed = [12, 24, 36, 48, 60, 72, 84];\r\n const leaseTermToBeDisplayed = [36, 39, 42, 45, 48, 51, 54, 57, 60];\r\n\r\n this.FinancialInfo.calculatedFinance.financeValues.forEach((element) => {\r\n if (financeTermToBeDisplayed.includes(element.term)) {\r\n if (!element.weekly) {\r\n hasData = false;\r\n }\r\n }\r\n });\r\n\r\n this.FinancialInfo.calculatedLease.leaseValues.forEach((element) => {\r\n if (leaseTermToBeDisplayed.includes(element.term)) {\r\n if (!element.biWeekly) {\r\n hasData = false;\r\n }\r\n }\r\n });\r\n\r\n return hasData;\r\n }\r\n\r\n /*\r\n Return the temporary loan response\r\n */ \r\n getTemporaryLoanResponse() {\r\n const mock = require('./loanMock.json');\r\n return mock;\r\n }\r\n\r\n /*\r\n Return the temporary lease response\r\n */\r\n getTemporaryLeaseResponse() {\r\n const mock = require('./leaseMock.json');\r\n return mock;\r\n }\r\n\r\n /*\r\n Return has an error for both loan and lease and also\r\n when the window.forceContactDealer is set\r\n */ \r\n getResponsesHasError() {\r\n if (window.forceContactDealer)\r\n return true;\r\n else {\r\n const loanHasError = this.getLoanResponsesHasError();\r\n const leaseHasError = this.getLeaseResponsesHasError();\r\n\r\n return (loanHasError || leaseHasError);\r\n }\r\n }\r\n\r\n /*\r\n Look in the array if there is any data error by comparing all the biweekly values\r\n\r\n Note: There is a special case in the array when the data are not fetched yet, so we include the missing biWeekly property\r\n */ \r\n hasDataError(objectsArray) {\r\n return objectsArray.every(obj => {\r\n return obj.monthly === objectsArray[0].monthly || !('monthly' in obj)\r\n });\r\n }\r\n\r\n /*\r\n Return if the loan response has an error\r\n\r\n This include communication and data errors\r\n */ \r\n getLoanResponsesHasError() {\r\n const hasCommunicationError = this.FinancialInfo.calculatedFinance.financeValues.some(element => element.hasError);\r\n const hasDataError = this.hasDataError(this.FinancialInfo.calculatedFinance.financeValues);\r\n\r\n //console.log(hasAnyError, hasDataError);\r\n return hasCommunicationError || hasDataError;\r\n }\r\n\r\n /*\r\n Return if the lease response has an error\r\n\r\n This include communication and data errors\r\n */ \r\n getLeaseResponsesHasError() {\r\n const hasCommunicationError = this.FinancialInfo.calculatedLease.leaseValues.some(element => element.hasError);\r\n const hasDataError = this.hasDataError(this.FinancialInfo.calculatedLease.leaseValues);\r\n\r\n //console.log(hasAnyError, hasDataError);\r\n return hasCommunicationError || hasDataError;\r\n }\r\n\r\n /*\r\n Update the data from financial provider for both loan and lease\r\n */\r\n async loadFromFinancialProvider() {\r\n // Load data\r\n await this.updateAllLineFromFinancialProvider();\r\n }\r\n\r\n /*\r\n Update the data from financial provider for the selected Finance / Lease term\r\n */\r\n async updateSingleLineFromFinancialProvider() {\r\n this.FinanceTerm = this.FinancialInfo.apr[this.FinanceTermIndex].term;\r\n this.LeaseTerm = this.FinancialInfo.lease[this.LeaseTermIndex].term;\r\n\r\n await this.updateSingleLeaseLineItem();\r\n\r\n await this.updateSingleLoanLineItem();\r\n\r\n this.FinancialInfo = this.FinancialInfo; \r\n }\r\n\r\n /*\r\n Update the data from financial provider for the selected Lease term\r\n */ \r\n async updateSingleLeaseLineItem() {\r\n if(!this.FinancialInfo || !this.FinancialInfo.calculatedLease || !this.FinancialInfo.calculatedLease.leaseValues)\r\n return;\r\n\r\n let response = await this._tcciService.sendDataToService(this, this.IncludeFees, this.IncludeRebates, \"lease\", this.LeaseTerm, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.AnnualMileage);\r\n\r\n // Skip unforseen error by return a temporary empty response\r\n if (!response || Object.keys(response).length === 0) {\r\n console.log('Response was empty returning temporary lease response');\r\n response = this.getTemporaryLeaseResponse();\r\n }\r\n\r\n // Set taxes on refresh\r\n sessionStorage.setItem('FinancialProvider_GST', response[0].Lease.Quote.GstPercentage);\r\n this._gstRate = response[0].Lease.Quote.GstPercentage;\r\n \r\n sessionStorage.setItem('FinancialProvider_PST', response[0].Lease.Quote.PstRate)\r\n this._pstRate = response[0].Lease.Quote.PstRate;\r\n\r\n this.FinancialInfo.calculatedLease.leaseValues[this.LeaseTermIndex] = {...this.FinancialInfo.calculatedLease.leaseValues[this.LeaseTermIndex], ...await this._tcciService.extractLeaseData(response)};\r\n\r\n if (this.AnnualMileage !== 0) {\r\n const extraDataResponse = await this._tcciService.sendDataToService(this, this.IncludeFees, this.IncludeRebates, \"lease\", this.LeaseTerm, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, 0);\r\n \r\n this.FinancialInfo.calculatedLease.leaseValues[this.LeaseTermIndex].downPaymentLeaseEndValue = this._tcciService.getResidualAmountFromLeaseData(extraDataResponse);\r\n } else {\r\n this.FinancialInfo.calculatedLease.leaseValues[this.LeaseTermIndex].downPaymentLeaseEndValue = this._tcciService.getResidualAmountFromLeaseData(response);\r\n }\r\n }\r\n\r\n /*\r\n Update the data from financial provider for the selected Loan term\r\n */ \r\n async updateSingleLoanLineItem() {\r\n if(!this.FinancialInfo || !this.FinancialInfo.calculatedFinance || !this.FinancialInfo.calculatedFinance.financeValues)\r\n return;\r\n\r\n let response = await this._tcciService.sendDataToService(this, this.IncludeFees, this.IncludeRebates, \"loan\", this.FinanceTerm, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.AnnualMileage);\r\n\r\n // Skip unforseen error by return a temporary empty response\r\n if (!response || Object.keys(response).length === 0) {\r\n console.log('Response was empty returning temporary loan response');\r\n response = this.getTemporaryLoanResponse();\r\n }\r\n \r\n this.FinancialInfo.calculatedFinance.financeValues[this.FinanceTermIndex] = {...this.FinancialInfo.calculatedFinance.financeValues[this.FinanceTermIndex], ...await this._tcciService.extractLoanData(response)};\r\n\r\n // TODO: SET OCA, NOT IN THE FIRST DELIVERY OF TCCI\r\n //this.setOcaValues(response[0].Loan, leaseReponse[0].Lease);\r\n }\r\n\r\n /*\r\n Update all the line from the financial provider with an specific array term. Do not change array term, it has been selected by marketing team\r\n\r\n NOTE: This function is recommended instead of single line update for UI performance reason\r\n */\r\n async updateAllLineFromFinancialProvider() {\r\n await this.updateAllLoanLinesFromFinancialProvider();\r\n await this.updateAllLeaseLinesFromFinancialProvider();\r\n }\r\n\r\n /*\r\n Update all the lines for loans from the financial provider\r\n */\r\n async updateAllLoanLinesFromFinancialProvider() {\r\n const financeTermToBeDisplayed = [24, 36, 48, 60, 72, 84];\r\n\r\n if(!this.FinancialInfo || !this.FinancialInfo.calculatedFinance || !this.FinancialInfo.calculatedFinance.financeValues)\r\n return;\r\n\r\n // Do Financing differently from Leasing as the term can be different between the two\r\n await Promise.all(this.FinancialInfo.calculatedFinance.financeValues.map(async (financeElement) => {\r\n if (!financeTermToBeDisplayed.includes(financeElement.term))\r\n return; // skip those that we don't need the data, ultimate hack to save the day\r\n\r\n let response = await this._tcciService.sendDataToService(this, this.IncludeFees, this.IncludeRebates, \"loan\", financeElement.term, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.AnnualMileage);\r\n\r\n // Look for error from non data from Payment provider\r\n if (!response || Object.keys(response).length === 0) {\r\n console.log('Response was empty returning temporary loan response');\r\n response = this.getTemporaryLoanResponse();\r\n }\r\n\r\n let extractedData = await this._tcciService.extractLoanData(response);\r\n\r\n //this.setOcaValues(response[0].Loan, null);\r\n\r\n // BUGFIX:Update the array. Do not use return, for some reason the array doesn't get updated.\r\n const index = this.FinancialInfo.calculatedFinance.financeValues.findIndex(x => x.term === financeElement.term);\r\n const newObject = {...financeElement, ...extractedData};\r\n this.FinancialInfo.calculatedFinance.financeValues[index] = newObject;\r\n }))\r\n .catch(function (err) {\r\n console.log('A promise failed to resolve while fetching financial provider service financing data', err);\r\n });\r\n }\r\n\r\n /*\r\n Update all the lines for leases from the financial provider\r\n */\r\n async updateAllLeaseLinesFromFinancialProvider() {\r\n const leaseTermToBeDisplayed = [36, 42, 48, 54, 60];\r\n\r\n if(!this.FinancialInfo || !this.FinancialInfo.calculatedLease || !this.FinancialInfo.calculatedLease.leaseValues)\r\n return;\r\n\r\n await Promise.all(this.FinancialInfo.calculatedLease.leaseValues.map(async (leaseElement) => {\r\n if (!leaseTermToBeDisplayed.includes(leaseElement.term))\r\n return; // skip those that we don't need the data, ultimate hack to save the day\r\n \r\n let extractedData = {};\r\n\r\n // Request for 24000 km used in informational apr (this.AnnualMileage as 0 is 24000 please refer to the annual mileagedrop down)\r\n if (this.AnnualMileage !== 0) {\r\n const extraDataResponse = await this._tcciService.sendDataToService(this, this.IncludeFees, this.IncludeRebates, \"lease\", leaseElement.term, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, 0);\r\n \r\n extractedData.downPaymentLeaseEndValue = this._tcciService.getResidualAmountFromLeaseData(extraDataResponse)\r\n }\r\n\r\n // BUGFIX:Update the array. Do not use return, for some reason the array doesn't get updated.\r\n const index = this.FinancialInfo.calculatedLease.leaseValues.findIndex(x => x.term === leaseElement.term);\r\n const newObject = {...leaseElement, ...extractedData};\r\n this.FinancialInfo.calculatedLease.leaseValues[index] = newObject;\r\n }));\r\n\r\n await Promise.all(this.FinancialInfo.calculatedLease.leaseValues.map(async (leaseElement) => {\r\n if (!leaseTermToBeDisplayed.includes(leaseElement.term))\r\n return; // skip those that we don't need the data, ultimate hack to save the day\r\n\r\n let response = await this._tcciService.sendDataToService(this, this.IncludeFees, this.IncludeRebates, \"lease\", leaseElement.term, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.AnnualMileage);\r\n\r\n // Look for error from non data from Payment provider\r\n if (!response || Object.keys(response).length === 0) {\r\n console.log('Response was empty returning temporary lease response');\r\n response = this.getTemporaryLeaseResponse();\r\n }\r\n\r\n // Set taxes\r\n sessionStorage.setItem('FinancialProvider_GST', response[0].Lease.Quote.GstPercentage)\r\n this._gstRate = response[0].Lease.Quote.GstPercentage;\r\n\r\n sessionStorage.setItem('FinancialProvider_PST', response[0].Lease.Quote.PstRate)\r\n this._pstRate = response[0].Lease.Quote.PstRate;\r\n\r\n let extractedData = await this._tcciService.extractLeaseData(response);\r\n \r\n if (this.AnnualMileage === 0) {\r\n extractedData.downPaymentLeaseEndValue = this._tcciService.getResidualAmountFromLeaseData(response);\r\n }\r\n\r\n // TODO: SET OCA, NOT IN THE FIRST DELIVERY OF TCCI\r\n //this.setOcaValues(null, response[0].Lease);\r\n\r\n // BUGFIX:Update the array. Do not use return, for some reason the array doesn't get updated.\r\n const index = this.FinancialInfo.calculatedLease.leaseValues.findIndex(x => x.term === leaseElement.term);\r\n const newObject = {...leaseElement, ...extractedData};\r\n this.FinancialInfo.calculatedLease.leaseValues[index] = newObject;\r\n }))\r\n .catch(function (err) {\r\n // log that I have an error, return the entire array;\r\n console.log('A promise failed to resolve while fetching financial provider leasing data', err);\r\n });\r\n }\r\n\r\n get Packages() {\r\n return this._packages;\r\n }\r\n\r\n set Packages(value) {\r\n this._packages = value;\r\n\r\n this._packages.packages.forEach((x, index) => {\r\n if (x.type === 'model_option_package') {\r\n this._packages.packages[index].financial.msrp = this._packages.packages[index].financial.msrp - this._financialInfo.msrp;\r\n }\r\n });\r\n\r\n sessionStorage.setItem(Constants.Packages, JSON.stringify(this._packages));\r\n }\r\n\r\n get SelectedPackage() {\r\n return this._selectedPackage;\r\n }\r\n\r\n set SelectedPackage(value) {\r\n if (value) {\r\n this._selectedPackage = value;\r\n\r\n this.selectedVehicle.packageCode = value.option_code;\r\n sessionStorage.setItem(Constants.SelectedVehicle, JSON.stringify(this.selectedVehicle));\r\n } else {\r\n this._selectedPackage = {\r\n option_code: this.Packages.default_option.option_code,\r\n financial: {\r\n msrp: 0\r\n }\r\n };\r\n\r\n this.selectedVehicle.packageCode = this.Packages.default_option.option_code\r\n sessionStorage.setItem(Constants.SelectedVehicle, JSON.stringify(this.selectedVehicle));\r\n }\r\n\r\n sessionStorage.setItem(Constants.SelectedPackage, JSON.stringify(this._selectedPackage));\r\n }\r\n\r\n get SelectedPackageIndex() {\r\n return this._selectedPackageIndex;\r\n }\r\n\r\n set SelectedPackageIndex(index) {\r\n this._selectedPackageIndex = index;\r\n sessionStorage.setItem(Constants.SelectedPackageIndex, this._selectedPackageIndex);\r\n\r\n if (index !== null && this.Packages.packages.filter(pack => pack.type === 'model_option_package')[index] ?.type === 'model_option_package') {\r\n this.SelectedPackage = this.Packages.packages.filter(pack => pack.type === 'model_option_package')[index];\r\n } else {\r\n this.SelectedPackage = null;\r\n }\r\n\r\n this.FinancialInfo = this.getFinanceObjectWithCalculations(this.FinancialInfo, this.TradeInValue, this.DownPaymentValue, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.FinanceTermIndex, this.LeaseTermIndex, this.AnnualMileage);\r\n\r\n\r\n }\r\n\r\n /*\r\n Async method has been added to support financial provider response\r\n */ \r\n async setSelectedPackageIndex(index) {\r\n this.SelectedPackageIndex = index;\r\n\r\n await this.loadColours(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n await this.loadWheels(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n await this.loadAccessories(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n await this.updateSingleLineFromFinancialProvider();\r\n }\r\n\r\n get SelectedNonModelPackageIndex() {\r\n return this._selectedNonModelPackageIndex;\r\n }\r\n\r\n async setSelectedNonModelPackageIndex(index) {\r\n this.SelectedNonModelPackageIndex = index;\r\n\r\n await this.updateSingleLineFromFinancialProvider();\r\n }\r\n\r\n set SelectedNonModelPackageIndex(index) {\r\n this._selectedNonModelPackageIndex = index;\r\n sessionStorage.setItem(Constants.SelectedNonModelPackageIndex, index);\r\n\r\n const universalPackages = this.Packages.packages.filter(pack => pack.type === 'universal_package');\r\n if (index !== null && universalPackages) {\r\n this.SelectedNonModelPackage = universalPackages[index];\r\n } else {\r\n this.SelectedNonModelPackage = {\r\n financial: {\r\n msrp: 0\r\n }\r\n };\r\n }\r\n\r\n this.FinancialInfo = this.getFinanceObjectWithCalculations(this.FinancialInfo, this.TradeInValue, this.DownPaymentValue, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.FinanceTermIndex, this.LeaseTermIndex, this.AnnualMileage);\r\n }\r\n\r\n get SelectedNonModelPackage() {\r\n return this._selectedNonModelPackage;\r\n }\r\n\r\n set SelectedNonModelPackage(value) {\r\n this._selectedNonModelPackage = value;\r\n\r\n sessionStorage.setItem(Constants.SelectedNonModelPackage, JSON.stringify(value));\r\n }\r\n\r\n /* Selected Warranty Index */\r\n get SelectedWarrantyIndex() {\r\n return this._selectedWarrantyIndex;\r\n }\r\n\r\n async setSelectedWarrantyIndex(index) {\r\n this.SelectedWarrantyIndex = index;\r\n\r\n await this.updateSingleLineFromFinancialProvider();\r\n }\r\n\r\n set SelectedWarrantyIndex(index) {\r\n this._selectedWarrantyIndex = index;\r\n sessionStorage.setItem(Constants.SelectedWarrantyIndex, index);\r\n\r\n const warrantyPackages = this.Packages.packages.filter(pack => pack.type === 'universal_package' && (pack.package_type === 'Warranty' || pack.package_type === 'Garantie'));\r\n if (index !== null && warrantyPackages) {\r\n this.SelectedWarrantyPackage = warrantyPackages[index];\r\n } else {\r\n this.SelectedWarrantyPackage = {\r\n financial: {\r\n msrp: 0\r\n }\r\n };\r\n }\r\n\r\n this.FinancialInfo = this.getFinanceObjectWithCalculations(this.FinancialInfo, this.TradeInValue, this.DownPaymentValue, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.FinanceTermIndex, this.LeaseTermIndex, this.AnnualMileage);\r\n }\r\n\r\n get SelectedWarrantyPackage() {\r\n return this._selectedWarrantyPackage;\r\n }\r\n\r\n set SelectedWarrantyPackage(value) {\r\n this._selectedWarrantyPackage = value;\r\n\r\n sessionStorage.setItem(Constants.SelectedWarrantyPackage, JSON.stringify(value));\r\n }\r\n\r\n /* Selected Connected Vehicle Index */\r\n get SelectedConnectedVehicleIndex() {\r\n return this._selectedConnectedVehicleIndex;\r\n }\r\n\r\n async setSelectedConnectedVehicleIndex(index) {\r\n this.SelectedConnectedVehicleIndex = index;\r\n\r\n await this.updateSingleLineFromFinancialProvider();\r\n }\r\n\r\n set SelectedConnectedVehicleIndex(index) {\r\n this._selectedConnectedVehicleIndex = index;\r\n sessionStorage.setItem(Constants.SelectedConnectedVehicleIndex, index);\r\n\r\n const connectivityPackage = this.Packages.connected_services[0];\r\n\r\n this.SelectedConnectedVehiclePackage = {\r\n financial: {\r\n msrp: 0\r\n }\r\n };\r\n\r\n if(!connectivityPackage)\r\n return;\r\n\r\n Object.entries(connectivityPackage.subscription).map(([key, value], subscriptionindex) => {\r\n if(subscriptionindex === index) {\r\n //console.log('setting subscriptionindex', subscriptionindex);\r\n this.SelectedConnectedVehiclePackage = value;\r\n }\r\n });\r\n \r\n this.FinancialInfo = this.getFinanceObjectWithCalculations(this.FinancialInfo, this.TradeInValue, this.DownPaymentValue, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.FinanceTermIndex, this.LeaseTermIndex, this.AnnualMileage);\r\n }\r\n\r\n get SelectedConnectedVehiclePackage() {\r\n return this._selectedConnectedVehiclePackage;\r\n }\r\n\r\n set SelectedConnectedVehiclePackage(value) {\r\n this._selectedConnectedVehiclePackage = value;\r\n\r\n sessionStorage.setItem(Constants.SelectedConnectedVehiclePackage, JSON.stringify(value));\r\n }\r\n\r\n /* Added Protection */\r\n get SelectedAddedProtectionIndex() {\r\n return this._selectedAddedProtectionIndex;\r\n }\r\n\r\n async setSelectedAddedProtectionIndex(index) {\r\n this.SelectedAddedProtectionIndex = index;\r\n\r\n await this.updateSingleLineFromFinancialProvider();\r\n }\r\n\r\n set SelectedAddedProtectionIndex(index) {\r\n this._selectedAddedProtectionIndex = index;\r\n sessionStorage.setItem(Constants.SelectedAddedProtectionIndex, index);\r\n\r\n this.SelectedAddedProtectionPackage = {\r\n financial: {\r\n msrp: 0\r\n }\r\n } \r\n\r\n Object.entries(this.Packages.added_protection[0].plans).map(([key, value], planIndex) => {\r\n if(planIndex === index) {\r\n //console.log('setting subscriptionindex', subscriptionindex);\r\n this.SelectedAddedProtectionPackage = value;\r\n }\r\n });\r\n \r\n\r\n this.FinancialInfo = this.getFinanceObjectWithCalculations(this.FinancialInfo, this.TradeInValue, this.DownPaymentValue, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.FinanceTermIndex, this.LeaseTermIndex, this.AnnualMileage);\r\n }\r\n\r\n get SelectedAddedProtectionPackage() {\r\n return this._selectedAddedProtectionPackage;\r\n }\r\n \r\n set SelectedAddedProtectionPackage(value) {\r\n this._selectedAddedProtectionPackage = value;\r\n\r\n sessionStorage.setItem(Constants.SelectedAddedProtectionPackage, JSON.stringify(value));\r\n }\r\n /* Added Protection */\r\n\r\n /* Appearance Protection */\r\n get SelectedAppearanceProtectionPlan() {\r\n let appearanceProtectionPlan;\r\n\r\n Object.entries(this.Packages.appearance_protection[0].plans).map(([key, value], planIndex) => {\r\n if(planIndex === Number(this.SelectedAppearanceProtectionIndex)) {\r\n appearanceProtectionPlan = value;\r\n }\r\n });\r\n\r\n return appearanceProtectionPlan;\r\n }\r\n\r\n get SelectedAppearanceProtectionIndex() {\r\n return this._selectedAppearanceProtectionIndex;\r\n }\r\n\r\n setSelectedAppearanceProtectionIndex(index) {\r\n this._selectedAppearanceProtectionIndex = index;\r\n }\r\n\r\n set SelectedAppearanceProtectionIndex(index) {\r\n this._selectedAppearanceProtectionIndex = index;\r\n sessionStorage.setItem(Constants.SelectedAppearanceProtectionIndex, index);\r\n\r\n this.SelectedAppearanceProtectionPlansIndex = null;\r\n }\r\n\r\n\r\n get SelectedAppearanceProtectionPlansIndex() {\r\n return this._selectedAppearanceProtectionPlanPackageIndex;\r\n }\r\n\r\n async setSelectedAppearanceProtectionPlansIndex(index) {\r\n this.SelectedAppearanceProtectionPlansIndex = index;\r\n\r\n await this.updateSingleLineFromFinancialProvider();\r\n }\r\n\r\n set SelectedAppearanceProtectionPlansIndex(index) {\r\n this._selectedAppearanceProtectionPlanPackageIndex = index;\r\n sessionStorage.setItem(Constants.SelectedAppearanceProtectionPlanPackageIndex, index);\r\n \r\n if (index !== null) {\r\n Object.entries(this.Packages.appearance_protection[0].plans).map(([key, value], planIndex) => {\r\n if(planIndex === Number(this.SelectedAppearanceProtectionIndex)) {\r\n\r\n Object.entries(value.packages).map(([key, appearanceProtectionPlansPackage], packageIndex) => {\r\n if(packageIndex === Number(index)) {\r\n this.SelectedAppearanceProtectionPlansPackage = appearanceProtectionPlansPackage; \r\n this.SelectedAppearanceProtectionPlansPackage.key = key; \r\n }\r\n });\r\n \r\n }\r\n })\r\n\r\n //const appearanceProtectionPlansPackage = this.Packages.appearance_protection.plans[this._selectedAppearanceProtectionIndex].packages[index];\r\n //this.SelectedAppearanceProtectionPlansPackage = appearanceProtectionPlansPackage;\r\n } else {\r\n this.SelectedAppearanceProtectionPlansPackage = {\r\n financial: {\r\n msrp: 0\r\n }\r\n };\r\n }\r\n\r\n this.FinancialInfo = this.getFinanceObjectWithCalculations(this.FinancialInfo, this.TradeInValue, this.DownPaymentValue, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.FinanceTermIndex, this.LeaseTermIndex, this.AnnualMileage);\r\n }\r\n\r\n get SelectedAppearanceProtectionPlansPackage() {\r\n return this._selectedAppearanceProtectionPackage;\r\n }\r\n\r\n set SelectedAppearanceProtectionPlansPackage(value) {\r\n this._selectedAppearanceProtectionPackage = value;\r\n sessionStorage.setItem(Constants.SelectedAppearanceProtectionPlansPackage, JSON.stringify(value));\r\n }\r\n /* Appearance Protection */\r\n\r\n get Colours() {\r\n return this._colours;\r\n }\r\n set Colours(value) {\r\n this._colours = value;\r\n sessionStorage.setItem(Constants.Colours, JSON.stringify(value));\r\n\r\n const financial = value.financial;\r\n this.FinancialInfo = this.getFinanceObjectWithCalculations(financial, this._tradeInValue, this._downPaymentValue, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.FinanceTermIndex, this.LeaseTermIndex, this.AnnualMileage);\r\n }\r\n\r\n set InitialFinancial(value) {\r\n this._initialFinancial = value;\r\n sessionStorage.setItem(Constants.InitialFinance, JSON.stringify(value));\r\n }\r\n get InitialFinancial() {\r\n if (sessionStorage.getItem(Constants.InitialFinance)) {\r\n this._initialFinancial = JSON.parse(sessionStorage.getItem(Constants.InitialFinance));\r\n }\r\n return this._initialFinancial;\r\n }\r\n\r\n set SelectedColourInterior(value) {\r\n this._selectedColourInterior = value;\r\n sessionStorage.setItem(Constants.SelectedInteriorColour, JSON.stringify(value));\r\n\r\n this.FinancialInfo = this.getFinanceObjectWithCalculations(this.FinancialInfo, this._tradeInValue, this._downPaymentValue, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.FinanceTermIndex, this.LeaseTermIndex, this.AnnualMileage);\r\n }\r\n\r\n get SelectedColourInterior() {\r\n return this._selectedColourInterior;\r\n }\r\n\r\n async setSelectedColourInteriorIndex(value) {\r\n this.SelectedColourInteriorIndex = value;\r\n\r\n await this.updateSingleLineFromFinancialProvider();\r\n }\r\n\r\n set SelectedColourInteriorIndex(value) {\r\n this._selectedColourInteriorIndex = value;\r\n sessionStorage.setItem(Constants.SelectedColourInteriorIndex, value);\r\n this.SelectedColourInterior = this.Colours.visual.interiors[value];\r\n }\r\n\r\n get SelectedColourInteriorIndex() {\r\n return this._selectedColourInteriorIndex;\r\n }\r\n\r\n get SelectedColourExterior() {\r\n return this._selectedColourExterior;\r\n }\r\n set SelectedColourExterior(value) {\r\n this._selectedColourExterior = value;\r\n sessionStorage.setItem(Constants.SelectedExteriorColour, JSON.stringify(this._selectedColourExterior));\r\n }\r\n\r\n /*\r\n Async methods has been added to support UI interaction which need to wait for the financial provider response\r\n */\r\n async setSelectedColourExteriorIndex(value) {\r\n this.SelectedColourExteriorIndex = value;\r\n\r\n await this.updateSingleLineFromFinancialProvider();\r\n }\r\n\r\n set SelectedColourExteriorIndex(value) {\r\n this._selectedColourExteriorIndex = value;\r\n sessionStorage.setItem(Constants.SelectedColourExteriorIndex, value);\r\n this.SelectedColourExterior = Object.entries(this.Colours.visual.exteriors)[value][1];\r\n\r\n this.FinancialInfo = this.getFinanceObjectWithCalculations(this.FinancialInfo, this._tradeInValue, this._downPaymentValue, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.FinanceTermIndex, this.LeaseTermIndex, this.AnnualMileage);\r\n }\r\n\r\n get SelectedColourExteriorIndex() {\r\n return this._selectedColourExteriorIndex;\r\n }\r\n\r\n set AllowedColoursExterior(value) {\r\n this._allowedColoursExterior = value;\r\n sessionStorage.setItem(Constants.AllowedColoursExterior, JSON.stringify(this._allowedColoursExterior));\r\n }\r\n get AllowedColoursExterior() {\r\n return this._allowedColoursExterior;\r\n }\r\n\r\n set Wheels(value) {\r\n this._wheels = value;\r\n sessionStorage.setItem(Constants.Wheels, JSON.stringify(value));\r\n\r\n const financial = value.financial;\r\n this.FinancialInfo = this.getFinanceObjectWithCalculations(financial, this._tradeInValue, this._downPaymentValue, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.FinanceTermIndex, this.LeaseTermIndex, this.AnnualMileage);\r\n }\r\n get Wheels() {\r\n return this._wheels;\r\n }\r\n\r\n set SelectedWheel(value) {\r\n this._selectedWheel = value;\r\n sessionStorage.setItem(Constants.SelectedWheel, JSON.stringify(value));\r\n\r\n const financial = this.InitialFinancial;\r\n this.FinancialInfo = this.getFinanceObjectWithCalculations(financial, this._tradeInValue, this._downPaymentValue, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.FinanceTermIndex, this.LeaseTermIndex, this.AnnualMileage);\r\n }\r\n\r\n get SelectedWheel() {\r\n return this._selectedWheel;\r\n }\r\n\r\n set SelectedWheelIndex(value) {\r\n this._selectedWheelIndex = value;\r\n sessionStorage.setItem(Constants.SelectedWheelIndex, value);\r\n\r\n if (value !== null) {\r\n this.SelectedWheel = Object.entries(this.Wheels.wheels)[value][1];\r\n } else {\r\n this.SelectedWheel = null;\r\n }\r\n }\r\n\r\n /*\r\n Async method has been added to interact from the UI which need to wait for financial provider\r\n */\r\n async setSelectedWheelIndex(value) {\r\n this.SelectedWheelIndex = value;\r\n\r\n await this.updateSingleLineFromFinancialProvider();\r\n }\r\n\r\n get SelectedWheelIndex() {\r\n return this._selectedWheelIndex;\r\n }\r\n\r\n get Accessories() {\r\n return this._accessories;\r\n }\r\n\r\n set Accessories(value) {\r\n this._accessories = value;\r\n\r\n sessionStorage.setItem(Constants.Accessories, JSON.stringify(this._accessories));\r\n }\r\n\r\n get SelectedAccessories() {\r\n /*if(!this._selectedAccessories)\r\n this._selectedAccessories = [];*/\r\n return this._selectedAccessories;\r\n }\r\n\r\n async setSelectedAccessories(value) {\r\n this.SelectedAccessories = value;\r\n\r\n await this.updateSingleLineFromFinancialProvider();\r\n }\r\n\r\n set SelectedAccessories(value) {\r\n this._selectedAccessories = value;\r\n\r\n sessionStorage.setItem(Constants.SelectedAccessories, JSON.stringify(value));\r\n\r\n const financial = this.InitialFinancial;\r\n this.FinancialInfo = this.getFinanceObjectWithCalculations(financial, '', '', false, false, false, false, null, null);\r\n\r\n const gtmHelper = new GTMHelper();\r\n gtmHelper.setGTM({ 'action': 'Selected Accessories' }, false, false);\r\n }\r\n\r\n get Categories() {\r\n return this._categories;\r\n }\r\n\r\n set Categories(value) {\r\n this._categories = value;\r\n }\r\n\r\n get SelectedCategory() {\r\n return this._selectedCategory;\r\n }\r\n\r\n\r\n async setSelectedCategory(value) {\r\n this.SelectedCategory = value;\r\n }\r\n\r\n set SelectedCategory(value) {\r\n this._selectedCategory = value;\r\n }\r\n\r\n get TradeInValue() {\r\n return formatPrice(this._tradeInValue);\r\n }\r\n\r\n set TradeInValue(value) {\r\n this._tradeInValue = value !== '' ? parseInt(value.toString().replace('$', '')) : 0;\r\n sessionStorage.setItem(Constants.TradeInValue, JSON.stringify(this._tradeInValue));\r\n }\r\n\r\n\r\n get DownPaymentValue() {\r\n return formatPrice(this._downPaymentValue);\r\n }\r\n\r\n set DownPaymentValue(value) {\r\n this._downPaymentValue = value !== '' ? parseInt(value.toString().replace('$', '')) : 0;\r\n sessionStorage.setItem(Constants.DownPaymentValue, JSON.stringify(this._downPaymentValue));\r\n }\r\n\r\n\r\n get LoyaltyChecked() {\r\n return this._loyaltyChecked;\r\n }\r\n\r\n set LoyaltyChecked(value) {\r\n this._loyaltyChecked = value;\r\n sessionStorage.setItem(Constants.LoyaltyChecked, JSON.stringify(value));\r\n }\r\n\r\n get GraduateChecked() {\r\n return this._graduateChecked;\r\n }\r\n\r\n set GraduateChecked(value) {\r\n this._graduateChecked = value;\r\n sessionStorage.setItem(Constants.GraduateChecked, JSON.stringify(value));\r\n }\r\n\r\n get MilitaryChecked() {\r\n return this._militaryChecked;\r\n }\r\n\r\n set MilitaryChecked(value) {\r\n this._militaryChecked = value;\r\n sessionStorage.setItem(Constants.MilitaryChecked, JSON.stringify(value));\r\n }\r\n\r\n get FirstTimeOwnerChecked() {\r\n return this._firstTimeOwnerChecked;\r\n }\r\n\r\n set FirstTimeOwnerChecked(value) {\r\n this._firstTimeOwnerChecked = value;\r\n sessionStorage.setItem(Constants.FirstTimeOwnerChecked, JSON.stringify(value));\r\n } \r\n\r\n get FinanceTermIndex() {\r\n return this._financeTermIndex;\r\n }\r\n\r\n set FinanceTermIndex(value) {\r\n this._financeTermIndex = value;\r\n sessionStorage.setItem(Constants.FinanceTermIndex, value);\r\n }\r\n\r\n get FinanceTerm() {\r\n return this._financeTerm;\r\n }\r\n\r\n set FinanceTerm(value) {\r\n if (isNaN(value)) {\r\n this._financeTerm = null;\r\n sessionStorage.removeItem(Constants.FinanceTerm);\r\n } else {\r\n this._financeTerm = value;\r\n sessionStorage.setItem(Constants.FinanceTerm, value);\r\n }\r\n }\r\n\r\n get LeaseTermIndex() {\r\n return this._leaseTermIndex;\r\n }\r\n\r\n set LeaseTermIndex(value) {\r\n this._leaseTermIndex = value;\r\n sessionStorage.setItem(Constants.LeaseTermIndex, value);\r\n }\r\n\r\n get LeaseTerm() {\r\n return this._leaseTerm;\r\n }\r\n\r\n set LeaseTerm(value) {\r\n if (isNaN(value)) {\r\n this._leaseTerm = null;\r\n sessionStorage.removeItem(Constants.LeaseTerm);\r\n } else {\r\n this._leaseTerm = value;\r\n sessionStorage.setItem(Constants.LeaseTerm, value);\r\n }\r\n }\r\n\r\n get Incentives() {\r\n return this._incentives;\r\n }\r\n\r\n set Incentives(value) {\r\n this._incentives = value;\r\n }\r\n\r\n get AnnualMileage() {\r\n return this._annualMileage;\r\n }\r\n\r\n set AnnualMileage(value) {\r\n this._annualMileage = value;\r\n sessionStorage.setItem(Constants.AnnualMileage, value);\r\n }\r\n\r\n get IncludeFees() {\r\n return this._includeFees;\r\n }\r\n\r\n set IncludeFees(value) {\r\n this._includeFees = value;\r\n sessionStorage.setItem(Constants.IncludeFees, value);\r\n }\r\n\r\n get IncludeTaxes() {\r\n return this._includeTaxes;\r\n }\r\n\r\n set IncludeTaxes(value) {\r\n this._includeTaxes = value;\r\n sessionStorage.setItem(Constants.IncludeTaxes, value);\r\n }\r\n\r\n get IncludeRebates() {\r\n return this._includeRebates;\r\n }\r\n\r\n set IncludeRebates(value) {\r\n this._includeRebates = value;\r\n sessionStorage.setItem(Constants.IncludeRebates, value)\r\n }\r\n\r\n /**\r\n * Reset\r\n */\r\n reset(all = false) {\r\n this._currentStep = 0;\r\n const gtmHelper = new GTMHelper();\r\n if (all) gtmHelper.setGTM({ 'action': 'Reset' }, false, true);\r\n this._previousStep = 0;\r\n\r\n this._selectedTrim = null;\r\n this._selectedTrimIndex = 0;\r\n\r\n this._tradeInValue = 0;\r\n this._downPaymentValue = 0;\r\n this._loyaltyChecked = false;\r\n this._militaryChecked = false;\r\n this._graduateChecked = false;\r\n this._firstTimeOwnerChecked = true;\r\n this._accessoriesValue = 0;\r\n this._annualMileage = 2;\r\n\r\n this._financialInfo = null;\r\n this._initialFinancial = null;\r\n\r\n this._engineAndDrivetrain = null;\r\n this._selectedModelIndex = 0;\r\n this._selectedModel = null;\r\n this._packages = null;\r\n\r\n this._selectedPackageIndex = null;\r\n this._selectedNonModelPackageIndex = null;\r\n this._selectedWarrantyIndex = null;\r\n this._selectedConnectedVehicleIndex = null;\r\n this._selectedAddedProtectionIndex= null;\r\n this._selectedAppearanceProtectionIndex = 0;\r\n \r\n this._selectedPackage = {\r\n financial: {\r\n msrp: 0\r\n }\r\n };\r\n this._selectedNonModelPackage = {\r\n financial: {\r\n msrp: 0\r\n }\r\n };\r\n this._selectedWarrantyPackage = {\r\n financial: {\r\n msrp: 0\r\n }\r\n };\r\n this._selectedConnectedVehiclePackage = {\r\n financial: {\r\n msrp: 0\r\n }\r\n };\r\n this._selectedAddedProtectionPackage = {\r\n financial: {\r\n msrp: 0\r\n }\r\n };\r\n this._selectedAppearanceProtectionPackage = {\r\n financial: {\r\n msrp: 0\r\n }\r\n }; \r\n\r\n this._colours = null;\r\n this._selectedColourInterior = null;\r\n this._selectedColourInteriorIndex = -1;\r\n this._selectedColourExterior = null;\r\n this._selectedColourExteriorIndex = -1;\r\n this._allowedColoursExterior = [];\r\n this._wheels = null;\r\n this._selectedWheel = null;\r\n this._selectedWheelIndex = null;\r\n this._accessories = null;\r\n this._selectedAccessories = [];\r\n this._categories = null;\r\n this._selectedCategory = null;\r\n\r\n this._incentives = null;\r\n this._annualMileage = 2;\r\n\r\n this.IncludeFees = true;\r\n\r\n this.IncludeTaxes = false;\r\n\r\n if(this.isProvinceAllowedToIncludeRebates())\r\n this.IncludeRebates = true;\r\n else\r\n this.IncludeRebates = false;\r\n\r\n\r\n this._showFinancePrice = true;\r\n\r\n if (all) {\r\n this.Current360Rotation = 18;\r\n\r\n this._selectedModelYear = null;\r\n sessionStorage.removeItem(Constants.SelectedModelYear);\r\n\r\n this._availableTrims = null;\r\n sessionStorage.removeItem(Constants.AvailableTrim);\r\n sessionStorage.removeItem(Constants.LegalTrims);\r\n\r\n this._financeTermIndex = 0;\r\n this._leaseTermIndex = 0;\r\n sessionStorage.removeItem(Constants.LeaseTermIndex);\r\n sessionStorage.removeItem(Constants.FinanceTermIndex);\r\n\r\n this._allDataIsLoaded = false;\r\n sessionStorage.removeItem(Constants.AllDataIsLoaded);\r\n\r\n sessionStorage.removeItem(Constants.SelectedAddedProtectionIndex);\r\n sessionStorage.removeItem(Constants.SelectedAppearanceProtectionIndex);\r\n sessionStorage.removeItem(Constants.SelectedAppearanceProtectionPlanPackageIndex);\r\n\r\n this.LeaseTerm = null;\r\n this.FinanceTerm = null;\r\n this.AnnualMileage = 2;\r\n }\r\n sessionStorage.removeItem(Constants.Colours);\r\n sessionStorage.removeItem(Constants.CurrentStep);\r\n sessionStorage.removeItem(Constants.PreviousStep);\r\n sessionStorage.removeItem(Constants.SelectedExteriorColour);\r\n sessionStorage.removeItem(Constants.SelectedWheel);\r\n sessionStorage.removeItem(Constants.SelectedWheelIndex);\r\n sessionStorage.removeItem(Constants.SelectedModel);\r\n sessionStorage.removeItem(Constants.FinancialObj);\r\n sessionStorage.removeItem(Constants.Packages);\r\n\r\n sessionStorage.removeItem(Constants.SelectedPackageIndex);\r\n sessionStorage.removeItem(Constants.SelectedNonModelPackageIndex);\r\n sessionStorage.removeItem(Constants.SelectedWarrantyIndex);\r\n sessionStorage.removeItem(Constants.SelectedConnectedVehicleIndex);\r\n \r\n \r\n sessionStorage.setItem(Constants.SelectedPackage, JSON.stringify(this._selectedPackage));\r\n sessionStorage.setItem(Constants.SelectedNonModelPackage, JSON.stringify(this._selectedNonModelPackage));\r\n sessionStorage.setItem(Constants.SelectedWarrantyPackage, JSON.stringify(this._selectedWarrantyPackage));\r\n sessionStorage.setItem(Constants.SelectedConnectedVehiclePackage, JSON.stringify(this._selectedConnectedVehiclePackage));\r\n sessionStorage.setItem(Constants.SelectedAddedProtectionPackage, JSON.stringify(this._selectedAddedProtectionPackage));\r\n sessionStorage.setItem(Constants.SelectedAppearanceProtectionPackage, JSON.stringify(this._selectedAppearanceProtectionPackage));\r\n\r\n sessionStorage.removeItem(Constants.SelectedTrim);\r\n sessionStorage.removeItem(Constants.SelectedTrimIndex);\r\n sessionStorage.removeItem(Constants.SelectedInteriorColour);\r\n sessionStorage.removeItem(Constants.UrlSlugObjectTrims);\r\n sessionStorage.removeItem(Constants.UrlSlugObjectEngineAndDrivetrain);\r\n sessionStorage.removeItem(Constants.UrlSlugObjectPackage);\r\n sessionStorage.removeItem(Constants.UrlSlugObjectColour);\r\n sessionStorage.removeItem(Constants.UrlSlugObjectWheels);\r\n sessionStorage.removeItem(Constants.UrlSlugObjectAccessories);\r\n sessionStorage.removeItem(Constants.UrlSlugObjectPayments);\r\n sessionStorage.removeItem(Constants.VehicleTitle);\r\n sessionStorage.removeItem(Constants.SelectedAccessories);\r\n sessionStorage.removeItem(Constants.TradeInValue);\r\n sessionStorage.removeItem(Constants.DownPaymentValue);\r\n sessionStorage.removeItem(Constants.AllowedColoursExterior);\r\n sessionStorage.removeItem(Constants.LoyaltyChecked);\r\n sessionStorage.removeItem(Constants.GraduateChecked);\r\n sessionStorage.removeItem(Constants.MilitaryChecked);\r\n sessionStorage.removeItem(Constants.FirstTimeOwnerChecked);\r\n sessionStorage.removeItem(Constants.Accessories);\r\n sessionStorage.removeItem(Constants.DefaultExteriorColour);\r\n sessionStorage.removeItem(Constants.DefaultInteriorColour);\r\n sessionStorage.removeItem(Constants.LegalEngineAndDrivetrain);\r\n sessionStorage.removeItem(Constants.LegalPackage);\r\n sessionStorage.removeItem(Constants.LegalColours);\r\n sessionStorage.removeItem(Constants.LegalWheels);\r\n sessionStorage.removeItem(Constants.LegalAccessories);\r\n sessionStorage.removeItem(Constants.LegalPaymentInformation);\r\n sessionStorage.removeItem(Constants.LegalSummary);\r\n sessionStorage.removeItem(Constants.EngineAndDrivetrain);\r\n sessionStorage.removeItem(Constants.SelectedModelIndex);\r\n sessionStorage.removeItem(Constants.Wheels);\r\n sessionStorage.removeItem(Constants.SpecificationData);\r\n sessionStorage.removeItem(Constants.SelectedColourInteriorIndex);\r\n sessionStorage.removeItem(Constants.SelectedColourExteriorIndex);\r\n sessionStorage.removeItem(Constants.SelectedVehicle);\r\n sessionStorage.removeItem(Constants.SelectedWheelSize);\r\n sessionStorage.removeItem(Constants.InitialFinance);\r\n sessionStorage.removeItem(Constants.PPSA);\r\n sessionStorage.setItem(Constants.ShowFinancePrice, JSON.stringify(this._showFinancePrice));\r\n }\r\n\r\n /**\r\n * is data loaded\r\n */\r\n isDataLoaded() {\r\n var toReturn = this._selectedTrim && this._selectedPackage && this._colours && this._allowedColoursExterior && this._selectedAccessories && this._financialInfo && this._allDataIsLoaded;\r\n //console.log(\"data is loaded\", toReturn);\r\n return toReturn;\r\n }\r\n\r\n /**\r\n * validate with the url params and if it's different reset the session storage\r\n */\r\n hasParamsDifferentThanCurrentSelection(year, carline, trim, model, option) {\r\n if (this.SelectedTrim === null || this.SelectedModel === null)\r\n return true;\r\n else if (this.SelectedTrim.trim_type.url_slug.toLocaleLowerCase() !== trim.toLocaleLowerCase()) {\r\n this.reset(false);\r\n this._allDataIsLoaded = false;\r\n sessionStorage.setItem(Constants.AllDataIsLoaded, this._allDataIsLoaded);\r\n sessionStorage.removeItem('province');\r\n console.log('has reset from different param');\r\n return true;\r\n } else if (this.SelectedModel.model_code.toLocaleLowerCase() !== model.toLocaleLowerCase()) {\r\n this.reset(false);\r\n this._allDataIsLoaded = false;\r\n sessionStorage.setItem(Constants.AllDataIsLoaded, this._allDataIsLoaded);\r\n sessionStorage.removeItem('province');\r\n console.log('has reset from different param');\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * reload stored data\r\n */\r\n reloadStoredData() {\r\n // Fire this first as it might take more time to resolve\r\n (async() => {\r\n const isRetailerMode = await this.isRetailerMode();\r\n //console.log('FINISHED LOADING DATA FOR IS RETAILER MODE', isRetailerMode, this.getDealerVars());\r\n })();\r\n\r\n if (sessionStorage.getItem(Constants.AllDataIsLoaded)) {\r\n this._allDataIsLoaded = JSON.parse(sessionStorage.getItem(Constants.AllDataIsLoaded));\r\n }\r\n if (sessionStorage.getItem(Constants.SelectedVehicle)) {\r\n this.selectedVehicle = JSON.parse(sessionStorage.getItem(Constants.SelectedVehicle));\r\n }\r\n if (sessionStorage.getItem(Constants.CurrentStep)) {\r\n this._currentStep = JSON.parse(sessionStorage.getItem(Constants.CurrentStep));\r\n }\r\n if (sessionStorage.getItem(Constants.PreviousStep)) {\r\n this._previousStep = JSON.parse(sessionStorage.getItem(Constants.PreviousStep));\r\n }\r\n if (sessionStorage.getItem(Constants.SelectedModelYear)) {\r\n this._selectedModelYear = JSON.parse(sessionStorage.getItem(Constants.SelectedModelYear));\r\n }\r\n if (sessionStorage.getItem(Constants.SelectedTrim)) {\r\n this._selectedTrim = JSON.parse(sessionStorage.getItem(Constants.SelectedTrim));\r\n }\r\n if (sessionStorage.getItem(Constants.SelectedTrimIndex)) {\r\n this._selectedTrimIndex = parseInt(sessionStorage.getItem(Constants.SelectedTrimIndex));\r\n }\r\n if (sessionStorage.getItem(Constants.Packages)) {\r\n this._packages = JSON.parse(sessionStorage.getItem(Constants.Packages));\r\n }\r\n if (sessionStorage.getItem(Constants.SelectedPackage)) {\r\n this._selectedPackage = JSON.parse(sessionStorage.getItem(Constants.SelectedPackage));\r\n }\r\n if (sessionStorage.getItem(Constants.SelectedNonModelPackage)) {\r\n this._selectedNonModelPackage = JSON.parse(sessionStorage.getItem(Constants.SelectedNonModelPackage));\r\n }\r\n if (sessionStorage.getItem(Constants.SelectedWarrantyPackage)) {\r\n this._selectedWarrantyPackage = JSON.parse(sessionStorage.getItem(Constants.SelectedWarrantyPackage));\r\n }\r\n if (sessionStorage.getItem(Constants.SelectedConnectedVehiclePackage)) {\r\n this._selectedConnectedVehiclePackage = JSON.parse(sessionStorage.getItem(Constants.SelectedConnectedVehiclePackage));\r\n }\r\n if (sessionStorage.getItem(Constants.SelectedAddedProtectionPackage)) {\r\n this._selectedAddedProtectionPackage = JSON.parse(sessionStorage.getItem(Constants.SelectedAddedProtectionPackage));\r\n } \r\n if (sessionStorage.getItem(Constants.SelectedAppearanceProtectionPlansPackage)) {\r\n this._selectedAppearanceProtectionPackage = JSON.parse(sessionStorage.getItem(Constants.SelectedAppearanceProtectionPlansPackage));\r\n }\r\n\r\n if (sessionStorage.getItem(Constants.SelectedPackageIndex)) {\r\n this._selectedPackageIndex = JSON.parse(sessionStorage.getItem(Constants.SelectedPackageIndex)); // Allow null\r\n }\r\n if (sessionStorage.getItem(Constants.SelectedNonModelPackageIndex)) {\r\n this._selectedNonModelPackageIndex = JSON.parse(sessionStorage.getItem(Constants.SelectedNonModelPackageIndex)); // Allow null\r\n }\r\n if (sessionStorage.getItem(Constants.SelectedWarrantyIndex)) {\r\n this._selectedWarrantyIndex = JSON.parse(sessionStorage.getItem(Constants.SelectedWarrantyIndex)); // Allow null\r\n }\r\n if (sessionStorage.getItem(Constants.SelectedConnectedVehicleIndex)) {\r\n this._selectedConnectedVehicleIndex = JSON.parse(sessionStorage.getItem(Constants.SelectedConnectedVehicleIndex)); // Allow null\r\n }\r\n if (sessionStorage.getItem(Constants.SelectedAddedProtectionIndex)) {\r\n this._selectedAddedProtectionIndex = JSON.parse(sessionStorage.getItem(Constants.SelectedAddedProtectionIndex)); // Allow null\r\n }\r\n if (sessionStorage.getItem(Constants.SelectedAppearanceProtectionIndex)) {\r\n this._selectedAppearanceProtectionIndex = JSON.parse(sessionStorage.getItem(Constants.SelectedAppearanceProtectionIndex)); // Allow null\r\n } \r\n if (sessionStorage.getItem(Constants.SelectedAppearanceProtectionPlanPackageIndex)) {\r\n this._selectedAppearanceProtectionPlanPackageIndex = JSON.parse(sessionStorage.getItem(Constants.SelectedAppearanceProtectionPlanPackageIndex)); // Allow null\r\n }\r\n \r\n if (sessionStorage.getItem(Constants.SelectedWheel)) {\r\n this._selectedWheel = JSON.parse(sessionStorage.getItem(Constants.SelectedWheel));\r\n }\r\n if (sessionStorage.getItem(Constants.SelectedWheelIndex)) {\r\n this._selectedWheelIndex = parseInt(sessionStorage.getItem(Constants.SelectedWheelIndex));\r\n }\r\n if (sessionStorage.getItem(Constants.Wheels)) {\r\n this._wheels = JSON.parse(sessionStorage.getItem(Constants.Wheels));\r\n }\r\n this._engineAndDrivetrain = JSON.parse(sessionStorage.getItem(Constants.EngineAndDrivetrain));\r\n if (sessionStorage.getItem(Constants.SelectedModel)) {\r\n this._selectedModel = JSON.parse(sessionStorage.getItem(Constants.SelectedModel));\r\n }\r\n if (sessionStorage.getItem(Constants.SelectedModelIndex)) {\r\n this._selectedModelIndex = parseInt(sessionStorage.getItem(Constants.SelectedModelIndex));\r\n }\r\n this._colours = JSON.parse(sessionStorage.getItem(Constants.Colours));\r\n this._selectedColourExterior = JSON.parse(sessionStorage.getItem(Constants.DefaultExteriorColour));\r\n this._selectedColourInterior = JSON.parse(sessionStorage.getItem(Constants.DefaultInteriorColour));\r\n if (sessionStorage.getItem(Constants.SelectedExteriorColour)) {\r\n this._selectedColourExterior = JSON.parse(sessionStorage.getItem(Constants.SelectedExteriorColour));\r\n }\r\n if (sessionStorage.getItem(Constants.SelectedInteriorColour)) {\r\n this._selectedColourInterior = JSON.parse(sessionStorage.getItem(Constants.SelectedInteriorColour));\r\n }\r\n if (sessionStorage.getItem(Constants.AllowedColoursExterior)) {\r\n this._allowedColoursExterior = JSON.parse(sessionStorage.getItem(Constants.AllowedColoursExterior));\r\n }\r\n if (sessionStorage.getItem(Constants.SelectedColourExteriorIndex)) {\r\n this._selectedColourExteriorIndex = parseInt(sessionStorage.getItem(Constants.SelectedColourExteriorIndex));\r\n }\r\n if (sessionStorage.getItem(Constants.SelectedColourInteriorIndex)) {\r\n this._selectedColourInteriorIndex = parseInt(sessionStorage.getItem(Constants.SelectedColourInteriorIndex));\r\n }\r\n if (sessionStorage.getItem(Constants.SelectedAccessories)) {\r\n this._selectedAccessories = JSON.parse(sessionStorage.getItem(Constants.SelectedAccessories));\r\n }\r\n if (sessionStorage.getItem(Constants.InitialFinance)) {\r\n this._initialFinancial = JSON.parse(sessionStorage.getItem(Constants.InitialFinance));\r\n }\r\n if (sessionStorage.getItem(Constants.FinancialObj)) {\r\n this._financialInfo = JSON.parse(sessionStorage.getItem(Constants.FinancialObj));\r\n }\r\n if (sessionStorage.getItem(Constants.LeaseTermIndex)) {\r\n this._leaseTermIndex = parseInt(sessionStorage.getItem(Constants.LeaseTermIndex));\r\n }\r\n if (sessionStorage.getItem(Constants.FinanceTermIndex)) {\r\n this._financeTermIndex = parseInt(sessionStorage.getItem(Constants.FinanceTermIndex));\r\n }\r\n if (sessionStorage.getItem(Constants.LoyaltyChecked)) {\r\n this._loyaltyChecked = JSON.parse(sessionStorage.getItem(Constants.LoyaltyChecked));\r\n }\r\n if (sessionStorage.getItem(Constants.GraduateChecked)) {\r\n this._graduateChecked = JSON.parse(sessionStorage.getItem(Constants.GraduateChecked));\r\n }\r\n if (sessionStorage.getItem(Constants.MilitaryChecked)) {\r\n this._militaryChecked = JSON.parse(sessionStorage.getItem(Constants.MilitaryChecked));\r\n }\r\n if (sessionStorage.getItem(Constants.FirstTimeOwnerChecked)) {\r\n this._firstTimeOwnerChecked = JSON.parse(sessionStorage.getItem(Constants.FirstTimeOwnerChecked));\r\n } \r\n if (sessionStorage.getItem(Constants.TradeInValue)) {\r\n this._tradeInValue = JSON.parse(sessionStorage.getItem(Constants.TradeInValue));\r\n }\r\n if (sessionStorage.getItem(Constants.DownPaymentValue)) {\r\n this._downPaymentValue = JSON.parse(sessionStorage.getItem(Constants.DownPaymentValue));\r\n }\r\n if (sessionStorage.getItem(Constants.AnnualMileage)) {\r\n this._annualMileage = parseInt(sessionStorage.getItem(Constants.AnnualMileage));\r\n }\r\n if (sessionStorage.getItem(Constants.Accessories)) {\r\n this._accessories = JSON.parse(sessionStorage.getItem(Constants.Accessories));\r\n }\r\n if (sessionStorage.getItem(Constants.IncludeFees)) {\r\n this._includeFees = JSON.parse(sessionStorage.getItem(Constants.IncludeFees));\r\n }\r\n if (sessionStorage.getItem(Constants.IncludeRebates)) {\r\n this._includeRebates = JSON.parse(sessionStorage.getItem(Constants.IncludeRebates));\r\n }\r\n if (sessionStorage.getItem(Constants.IncludeTaxes)) {\r\n this._includeTaxes = JSON.parse(sessionStorage.getItem(Constants.IncludeTaxes));\r\n }\r\n if (sessionStorage.getItem(Constants.AvailableTrim)) {\r\n this._availableTrims = JSON.parse(sessionStorage.getItem(Constants.AvailableTrim));\r\n }\r\n if (sessionStorage.getItem(Constants.FinanceTerm)) {\r\n this._financeTerm = parseInt(sessionStorage.getItem(Constants.FinanceTerm));\r\n }\r\n if (sessionStorage.getItem(Constants.LeaseTerm)) {\r\n this._leaseTerm = parseInt(sessionStorage.getItem(Constants.LeaseTerm));\r\n }\r\n \r\n this.RecalculateFinancialInfo();\r\n if (this.FinancialInfo)\r\n this.Incentives = this.getIncentives(this.FinancialInfo);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set the default trim index to another one. This function has been introduced to hardcode the GS not beeing available on the the CX-90. HARDCODING IS BAD! \r\n */\r\n getDefaultTrimIndex(year, carline, trim, model, packageCode) {\r\n let defaultTrimIndex = 0;\r\n\r\n if (year === \"2024\" && (carline === 'CX-90-MHEV' || carline === 'CX-90-PHEV'))\r\n defaultTrimIndex = 1;\r\n\r\n if (year === \"2023\" && (carline === 'CX-5'))\r\n defaultTrimIndex = 1;\r\n\r\n return defaultTrimIndex;\r\n }\r\n\r\n /**\r\n * Method that cascade and load all the data\r\n */\r\n async loadVehicleData(year, carline, trim, model, packageCode) {\r\n await this.loadTrims(year, carline);\r\n\r\n const defaultTrimIndex = this.getDefaultTrimIndex(year, carline, trim, model, packageCode);\r\n\r\n if (trim) {\r\n const trimIndex = this.AvailableTrim.trims.findIndex(x => x.trim_type.url_slug.toLocaleLowerCase() === trim.toLocaleLowerCase());\r\n await this.setSelectedTrimIndex(trimIndex > -1 ? trimIndex : defaultTrimIndex);\r\n } else {\r\n await this.setSelectedTrimIndex(defaultTrimIndex);\r\n }\r\n\r\n if (model) {\r\n const modelIndex = this.EngineAndDrivetrain.models.findIndex(x => x.model_code.toLocaleLowerCase() === model.toLocaleLowerCase());\r\n await this.setSelectedModelIndex(modelIndex > -1 ? modelIndex : 0);\r\n }\r\n\r\n if (packageCode) {\r\n const packageIndex = this.Packages.packages.findIndex(x => x.option_code.toLocaleLowerCase() === packageCode.toLocaleLowerCase());\r\n // HOTFIX! PackageIndex variable need to be null to not force a package selection.\r\n await this.setSelectedPackageIndex(packageIndex > -1 ? packageIndex : null);\r\n }\r\n }\r\n\r\n /**\r\n * Method that cascade and load all the data by build id.\r\n */\r\n async loadVehicleDataByBuildId(buildId) {\r\n\r\n const data = await this._apiService.getBuildDataById(buildId);\r\n if (data.status === 200 && data.data) {\r\n\r\n const { year, carline, trim, tradeInValue, downPaymentValue, loyaltyChecked, militaryChecked, firstTimeOwnerChecked, graduateChecked, annualMileage, financeTerm, leaseTerm, accessories, modelCode, optionCode, includeTaxes, includeFees, includeRebates, SelectedWheelIndex, SelectedColourExteriorIndex, SelectedColourInteriorIndex, selectedNonModelPackageIndex, selectedWarrantyIndex, selectedConnectedVehicleIndex, selectedAddedProtectionIndex, selectedAppearanceProtectionIndex, selectedAppearanceProtectionPlanPackageIndex } = data.data.build_data;\r\n\r\n this.selectedVehicle.year = year;\r\n this.selectedVehicle.carline = carline;\r\n this.selectedVehicle.trim = trim;\r\n\r\n await this.loadVehicleData(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim);\r\n\r\n await this.loadPackages(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n // USING PARSE TO FIX THE 'NULL' instead of NULL \r\n if (JSON.parse(selectedNonModelPackageIndex))\r\n this.SelectedNonModelPackageIndex = JSON.parse(selectedNonModelPackageIndex);\r\n\r\n if (selectedWarrantyIndex)\r\n this.SelectedWarrantyIndex = selectedWarrantyIndex;\r\n\r\n /*if (JSON.parse(selectedConnectedVehicleIndex))\r\n this.SelectedConnectedVehicleIndex = JSON.parse(selectedConnectedVehicleIndex);\r\n\r\n if (JSON.parse(selectedAddedProtectionIndex))\r\n this.SelectedAddedProtectionIndex = JSON.parse(selectedAddedProtectionIndex);\r\n\r\n if (JSON.parse(selectedAppearanceProtectionIndex) && JSON.parse(selectedAppearanceProtectionPlanPackageIndex)) {\r\n this.SelectedAppearanceProtectionIndex = JSON.parse(selectedAppearanceProtectionIndex);\r\n this.SelectedAppearanceProtectionPlanPackageIndex = JSON.parse(selectedAppearanceProtectionPlanPackageIndex);\r\n }*/\r\n\r\n await this.loadColours(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n this.SelectedColourExteriorIndex = SelectedColourExteriorIndex;\r\n this.SelectedColourInteriorIndex = SelectedColourInteriorIndex;\r\n\r\n await this.loadWheels(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n if (SelectedWheelIndex) this.SelectedWheelIndex = SelectedWheelIndex;\r\n\r\n await this.loadAccessories(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n const accessoriesData = await this._apiService.getAccessories(modelCode, optionCode);\r\n if (accessoriesData.accessories && accessories && accessories.length > 0) {\r\n const parsed = this.parseAccessoriesData(accessoriesData.accessories.accessories);\r\n if (parsed && parsed.All) {\r\n this.SelectedAccessories = parsed.All.filter(acc => accessories.includes(acc.part_number));\r\n }\r\n }\r\n\r\n this.FinancialInfo = await this.getFinanceObjectWithCalculations(\r\n this.FinancialInfo, this.TradeInValue, this.DownPaymentValue,\r\n this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, \r\n this.FinanceTermIndex, this.LeaseTermIndex, annualMileage\r\n );\r\n\r\n this.TradeInValue = tradeInValue;\r\n this.DownPaymentValue = downPaymentValue;\r\n this.LoyaltyChecked = loyaltyChecked;\r\n this.GraduateChecked = graduateChecked;\r\n this.MilitaryChecked = militaryChecked;\r\n this.FirstTimeOwnerChecked = firstTimeOwnerChecked;\r\n this.FinanceTermIndex = financeTerm;\r\n this.LeaseTermIndex = leaseTerm;\r\n if (annualMileage) this.AnnualMileage = annualMileage;\r\n if (includeTaxes) this.IncludeTaxes = includeTaxes;\r\n if (includeFees) this.IncludeFees = includeFees;\r\n if (includeRebates) this.IncludeRebates = includeRebates;\r\n\r\n await this.loadPayments(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.SelectedModel.model_code, this.SelectedModel.option_code);\r\n\r\n await this.updateSingleLineFromFinancialProvider();\r\n\r\n return data.data.build_data;\r\n } else {\r\n console.log('Error: ', data.msg)\r\n }\r\n }\r\n\r\n /**\r\n * Presentation page - Select a vehicles\r\n */\r\n loadVehicles() {\r\n return new Promise((resolve, reject) => {\r\n if (window.bnp_under_maintenance) {\r\n if (getLang() === \"en\") {\r\n const mock = require('../Services/vehiclesMockEn.json');\r\n resolve(mock.data);\r\n } else {\r\n const mock = require('../Services/vehiclesMockFr.json');\r\n resolve(mock.data);\r\n }\r\n } else {\r\n this._apiService.getVehicles()\r\n .then((data) => {\r\n resolve(data);\r\n }).catch(error => {\r\n console.log(error);\r\n reject(error);\r\n });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Load Step 1 - Select a trim\r\n */\r\n async loadTrims(year, carline) {\r\n this.selectedVehicle.year = year;\r\n this.selectedVehicle.carline = carline;\r\n sessionStorage.setItem(Constants.SelectedVehicle, JSON.stringify(this.selectedVehicle));\r\n\r\n const trimData = await this._apiService.getTrims(this.selectedVehicle.year, this.selectedVehicle.carline);\r\n\r\n // Added this patch to redirect to vehicle landing page when we don't receive any trim data array\r\n if (!trimData || trimData.length === 0) {\r\n if (this.language === 'fr')\r\n window.location = '/fr/magasiner/construction-et-prix/';\r\n else\r\n window.location = '/en/shopping/build-and-price/';\r\n }\r\n\r\n this.SelectedModelYear = trimData.model_year;\r\n\r\n this.AvailableTrim = trimData;\r\n }\r\n\r\n /**\r\n * Load Step 2 - Select an engine and drivetrain\r\n */\r\n async loadEngineAndDrivetrain(year, carline, trim) {\r\n this.selectedVehicle.year = year;\r\n this.selectedVehicle.carline = carline;\r\n this.selectedVehicle.trim = trim;\r\n sessionStorage.setItem(Constants.SelectedVehicle, JSON.stringify(this.selectedVehicle));\r\n\r\n const data = await this._apiService.getEngineAndDrivetrain(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim);\r\n\r\n this.EngineAndDrivetrain = data;\r\n\r\n sessionStorage.setItem(Constants.UrlSlugObjectEngineAndDrivetrain, JSON.stringify({ 'year': year, 'carline': carline, 'trim': trim }));\r\n }\r\n\r\n /**\r\n * Load Step 3 - Select a package\r\n */\r\n async loadPackages(year, carline, trim, model, packageCode) {\r\n this.selectedVehicle.year = year;\r\n this.selectedVehicle.carline = carline;\r\n this.selectedVehicle.trim = trim;\r\n this.selectedVehicle.model = model;\r\n this.selectedVehicle.packageCode = packageCode;\r\n sessionStorage.setItem(Constants.SelectedVehicle, JSON.stringify(this.selectedVehicle));\r\n\r\n const data = await this._apiService.getPackages(this.selectedVehicle.model, this.selectedVehicle.packageCode);\r\n\r\n this.Packages = data;\r\n this.SelectedPackageIndex = null;\r\n this.SelectedNonModelPackageIndex = null;\r\n this.SelectedConnectedVehicleIndex = null;\r\n this.SelectedWarrantyIndex = null;\r\n\r\n sessionStorage.setItem(Constants.UrlSlugObjectPackage, JSON.stringify({ 'year': year, 'carline': carline, 'trim': trim, 'model': model, 'packageCode': packageCode }));\r\n }\r\n\r\n getAllowedExteriorsIds(exteriors) {\r\n let allowedExteriors = [];\r\n exteriors.forEach(exterior => {\r\n allowedExteriors.push(exterior.id);\r\n });\r\n return allowedExteriors;\r\n }\r\n\r\n /**\r\n * Load Step 4 - Select the exterior and interior color\r\n */\r\n async loadColours(year, carline, trim, model, packageCode) {\r\n this.selectedVehicle.year = year;\r\n this.selectedVehicle.carline = carline;\r\n this.selectedVehicle.trim = trim;\r\n this.selectedVehicle.model = model;\r\n this.selectedVehicle.packageCode = packageCode;\r\n sessionStorage.setItem(Constants.SelectedVehicle, JSON.stringify(this.selectedVehicle));\r\n\r\n const data = await this._apiService.getColours(this.selectedVehicle.model, this.selectedVehicle.packageCode)\r\n\r\n this.InitialFinancial = data.financial;\r\n this.Incentives = this.getIncentives(this.InitialFinancial);\r\n this.Colours = data;\r\n sessionStorage.setItem(Constants.UrlSlugObjectColour, JSON.stringify({ 'year': year, 'carline': carline, 'trim': trim, 'model': model, 'packageCode': packageCode }));\r\n\r\n const defaultInteriorColour = this.Colours.visual.interiors[0];\r\n const defaultExteriorColour = defaultInteriorColour.default_exterior;\r\n sessionStorage.setItem(Constants.DefaultInteriorColour, JSON.stringify(defaultInteriorColour));\r\n sessionStorage.setItem(Constants.DefaultExteriorColour, JSON.stringify(defaultExteriorColour));\r\n\r\n this.Colours.visual.interiors.map((Colour, index) => {\r\n if (defaultInteriorColour.id === Colour.id)\r\n this.SelectedColourInteriorIndex = index;\r\n });\r\n\r\n Object.entries(this.Colours.visual.exteriors).map((Colour, index) => {\r\n if (defaultExteriorColour.id === Colour[1]['id'])\r\n this.SelectedColourExteriorIndex = index;\r\n });\r\n\r\n this.AllowedColoursExterior = this.getAllowedExteriorsIds(this.Colours.visual.interiors[this.SelectedColourInteriorIndex].allowed_exteriors);\r\n }\r\n\r\n /**\r\n * Load Step 5 - Select a wheel\r\n */\r\n async loadWheels(year, carline, trim, model, packageCode) {\r\n this.selectedVehicle.year = year;\r\n this.selectedVehicle.carline = carline;\r\n this.selectedVehicle.trim = trim;\r\n this.selectedVehicle.model = model;\r\n this.selectedVehicle.packageCode = packageCode;\r\n sessionStorage.setItem(Constants.SelectedVehicle, JSON.stringify(this.selectedVehicle));\r\n\r\n const data = await this._apiService.getWheels(model, packageCode);\r\n //console.log(data);\r\n\r\n this.InitialFinancial = data.financial;\r\n this.Wheels = data;\r\n sessionStorage.setItem(Constants.UrlSlugObjectWheels, JSON.stringify({ 'year': year, 'carline': carline, 'trim': trim, 'model': model, 'packageCode': packageCode }));\r\n }\r\n\r\n /**\r\n * Load Step 6 - Select one or many accessory\r\n */\r\n async loadAccessories(year, carline, trim, model, packageCode) {\r\n this.selectedVehicle.year = year;\r\n this.selectedVehicle.carline = carline;\r\n this.selectedVehicle.trim = trim;\r\n this.selectedVehicle.model = model;\r\n this.selectedVehicle.packageCode = packageCode;\r\n sessionStorage.setItem(Constants.SelectedVehicle, JSON.stringify(this.selectedVehicle));\r\n\r\n const data = await this._apiService.getAccessories(model, packageCode);\r\n\r\n this.InitialFinancial = data.financial;\r\n\r\n this.FinancialInfo = this.getFinanceObjectWithCalculations(data.financial, '', '', false, false, false, false, null, null);\r\n this.Accessories = {\r\n 'data': this.parseAccessoriesData(data.accessories.accessories),\r\n 'title': data.title,\r\n 'rawData': Object.entries(data.accessories.accessories)\r\n };\r\n sessionStorage.setItem(Constants.UrlSlugObjectAccessories, JSON.stringify({ 'year': year, 'carline': carline, 'trim': trim, 'model': model, 'packageCode': packageCode }));\r\n }\r\n\r\n /**\r\n * Load Step 7 - Payment information\r\n */\r\n async loadPayments(year, carline, trim, model, packageCode) {\r\n this.selectedVehicle.year = year;\r\n this.selectedVehicle.carline = carline;\r\n this.selectedVehicle.trim = trim;\r\n this.selectedVehicle.model = model;\r\n this.selectedVehicle.packageCode = packageCode;\r\n sessionStorage.setItem(Constants.SelectedVehicle, JSON.stringify(this.selectedVehicle));\r\n\r\n // Preload missing data to set the payment\r\n if (!this.InitialFinancial) {\r\n await this.loadColours(this.selectedVehicle.year, this.selectedVehicle.carline, this.selectedVehicle.trim, this.selectedVehicle.model, this.selectedVehicle.packageCode);\r\n }\r\n\r\n const data = await this._apiService.getPayments(model, packageCode);\r\n\r\n const financial = this.InitialFinancial;\r\n this.FinancialInfo = this.getFinanceObjectWithCalculations(financial, '', '', false, false, false, false, null, null);\r\n sessionStorage.setItem(Constants.UrlSlugObjectPayments, JSON.stringify({ 'year': year, 'carline': carline, 'trim': trim, 'model': model, 'packageCode': packageCode }));\r\n\r\n // Reset the value\r\n if(getParams()['tve'] === undefined){\r\n this.TradeInValue = 0;\r\n } else {\r\n this.TradeInValue = getParams()['tve'][0];\r\n }\r\n\r\n this.DownPaymentValue = 0;\r\n this.LoyaltyChecked = false;\r\n this.GraduateChecked = false;\r\n this.MilitaryChecked = false;\r\n\r\n // SET DEFAULT VALUE for first time owner when it has a value. Part of a campaign\r\n this.FirstTimeOwnerChecked = false; //this.FinancialInfo.incentive_programs.find(x => x.type === \"first_time_owner\").value;\r\n\r\n\r\n\r\n // Make sure that we have a lease term index value or we set the highest one\r\n if (this.LeaseTerm) {\r\n let foundIndex = this.FinancialInfo.lease.findIndex(x => x.term === this.LeaseTerm);\r\n\r\n if (foundIndex > -1)\r\n this.LeaseTermIndex = foundIndex;\r\n else\r\n this.LeaseTermIndex = this.FinancialInfo.lease.length - 1;\r\n\r\n } else {\r\n // HARDCODED RULES ADDED FOR QUEBEC\r\n if (carline === 'CX-90-PHEV' && getProvince() === 'QC') {\r\n this.LeaseTermIndex = this.FinancialInfo.lease.findIndex(x => x.term === 36);\r\n } else {\r\n this.LeaseTermIndex = this.FinancialInfo.lease.length - 1;\r\n }\r\n }\r\n\r\n if (this.FinanceTerm) {\r\n let foundIndex = this.FinancialInfo.apr.findIndex(x => x.term === this.FinanceTerm);\r\n if (foundIndex > -1)\r\n this.FinanceTermIndex = foundIndex;\r\n else\r\n this.FinanceTermIndex = this.FinancialInfo.apr.length - 1;\r\n } else {\r\n this.FinanceTermIndex = this.FinancialInfo.apr.length - 1;\r\n }\r\n\r\n this.Incentives = this.getIncentives(this.FinancialInfo);\r\n }\r\n\r\n /**\r\n * Load Step 8 - Load the summary. This function should be sooner or later deprecated because we have thw hole object\r\n */\r\n async loadSummary(year, carline, trim, model, packageCode) {\r\n this.selectedVehicle.year = year;\r\n this.selectedVehicle.carline = carline;\r\n this.selectedVehicle.trim = trim;\r\n this.selectedVehicle.model = model;\r\n this.selectedVehicle.packageCode = packageCode;\r\n sessionStorage.setItem(Constants.SelectedVehicle, JSON.stringify(this.selectedVehicle));\r\n\r\n const data = await this._apiService.getSummary(model, packageCode);\r\n \r\n // Set new legal\r\n sessionStorage.setItem(Constants.LegalTrims, JSON.stringify(buildLegalContent(data.trims, data.incentives)));\r\n sessionStorage.setItem(Constants.LegalOption, JSON.stringify(buildLegalContent(data.options, data.incentives)));\r\n sessionStorage.setItem(Constants.LegalColours, JSON.stringify(buildLegalContent(data.colours, data.incentives)));\r\n sessionStorage.setItem(Constants.LegalWheels, JSON.stringify(buildLegalContent(data.wheels, data.incentives)));\r\n sessionStorage.setItem(Constants.LegalConnectivity, JSON.stringify(buildLegalContent(data.connectivity, data.incentives)));\r\n sessionStorage.setItem(Constants.LegalAccessories, JSON.stringify(buildLegalContent(data.accessories, data.incentives))); \r\n sessionStorage.setItem(Constants.LegalProtections, JSON.stringify(buildLegalContent(data.protection, data.incentives)));\r\n sessionStorage.setItem(Constants.LegalPaymentInformation, JSON.stringify(buildLegalContent(data.payments, data.incentives)));\r\n sessionStorage.setItem(Constants.LegalSummary, JSON.stringify(buildLegalContent(data.summary)));\r\n \r\n this.reloadStoredData();\r\n }\r\n\r\n /**\r\n * Load Step 8 - Load the summary. This function should be sooner or later deprecated because we have thw hole object\r\n */\r\n async loadVehiclesLegal(modelCode, packageCode) {\r\n if (window.bnp_under_maintenance) {\r\n if (getLang() === \"en\") {\r\n const mock = require('../Services/vehiclesLegalMockEn.json');\r\n return mock.data.vehicles;\r\n } else {\r\n const mock = require('../Services/vehiclesLegalMockFr.json');\r\n return mock.data.vehicles;\r\n }\r\n } else {\r\n // HARDCODING MODEL AND PACKAGE CODE AS IT DOESN'T MATTER FOR THE VEHICLE LANDING PAGE LEGAL\r\n const data = await this._apiService.getSummary(modelCode, packageCode);\r\n\r\n // Set new legal\r\n sessionStorage.setItem(Constants.LegalVehicles, JSON.stringify(buildLegalContent(data.vehicles)));\r\n\r\n return data.vehicles;\r\n }\r\n } \r\n\r\n async loadSpecsData(model, packageCode) {\r\n const data = await this._apiService.getSpecificationsData(model, packageCode);\r\n\r\n sessionStorage.setItem(Constants.SpecificationData, JSON.stringify(data[0].specifications));\r\n }\r\n\r\n hasDefaultInteriorColorSelected() {\r\n let hasDefaultInteriorColorSelected = false;\r\n\r\n const selectedInteriorColour = JSON.parse(sessionStorage.getItem(Constants.SelectedInteriorColour));\r\n if (this.Colours && selectedInteriorColour) {\r\n // Look if the interior colour isn't a default selection\r\n const defaultInteriorColour = this.Colours.visual.interiors[0];\r\n if (defaultInteriorColour.id === selectedInteriorColour.id)\r\n hasDefaultInteriorColorSelected = true;\r\n }\r\n\r\n return hasDefaultInteriorColorSelected;\r\n }\r\n\r\n hasDefaultExteriorColorSelected() {\r\n let hasDefaultExteriorColorSelected = false;\r\n\r\n const selectedExteriorColour = JSON.parse(sessionStorage.getItem(Constants.SelectedExteriorColour));\r\n if (this.Colours && selectedExteriorColour) {\r\n const defaultInteriorColour = this.Colours.visual.interiors[0];\r\n const defaultExteriorColour = defaultInteriorColour.default_exterior;\r\n if (defaultExteriorColour.id === selectedExteriorColour.id)\r\n hasDefaultExteriorColorSelected = true;\r\n }\r\n\r\n return hasDefaultExteriorColorSelected;\r\n }\r\n\r\n displayWarning() {\r\n let showWarningMessage = false;\r\n\r\n switch (this.CurrentStep) {\r\n case 1: // TRIM\r\n case 2: // ENGINE AND DRIVETRAIN\r\n if (this.SelectedPackageIndex != null || this.SelectedNonModelPackageIndex != null || this.SelectedWarrantyIndex != null || this.SelectedConnectedVehicleIndex != null)\r\n showWarningMessage = true;\r\n\r\n if (this.hasDefaultExteriorColorSelected() && this.hasDefaultInteriorColorSelected()) {\r\n // console.log('no default color selected');\r\n } else {\r\n showWarningMessage = true;\r\n }\r\n\r\n if (this.SelectedAccessories && this.SelectedAccessories.length > 0)\r\n showWarningMessage = true;\r\n\r\n if (this.SelectedWheel)\r\n showWarningMessage = true;\r\n break;\r\n case 3: // PACKAGES\r\n case 4: // COLORS\r\n case 5: // WHEELS:\r\n case 6: // ACCESSORIES\r\n default:\r\n showWarningMessage = false;\r\n }\r\n\r\n // if (this._selectedModelIndex > 0 || this._selectedPackageIndex != null || this.SelectedNonModelPackageIndex != null|| this._selectedColourExteriorIndex > 0 || this._selectedColourInteriorIndex > 0)\r\n // showWarningMessage = true;\r\n\r\n return showWarningMessage;\r\n }\r\n\r\n\r\n // todo move to utility class\r\n groupBy(xs, key) {\r\n return xs.reduce(function (rv, x) {\r\n (rv[x[key].title] = rv[x[key].title] || []).push(x);\r\n return rv;\r\n }, {});\r\n };\r\n\r\n get VehicleTitle() {\r\n let title;\r\n let plainTitle;\r\n let mazda = '';\r\n const yearName = this.EngineAndDrivetrain ?.model_year ?.year ?.title;\r\n const modelName = this.EngineAndDrivetrain ?.model_year ?.carline ?.title;\r\n const trimName = this.EngineAndDrivetrain ?.trim ?.trim_type ?.name\r\n switch (this.CurrentStep) {\r\n case 7: // payment\r\n case 1: // trim\r\n case 2: // engine & drivetrain\r\n case 3: // packages\r\n case 4: // colours\r\n case 5: // wheels\r\n case 6: // accessories\r\n default:\r\n let sup = '';\r\n if (modelName ?.includes('CX-90') && trimName == 'GS' && yearName === '2024') {\r\n sup = '<sup>✦</sup>';\r\n }\r\n if (modelName ?.includes('Mazda CX-50 Hybrid') && trimName == 'GS-L' && yearName === '2025') {\r\n sup = '<sup>†</sup>';\r\n } \r\n\r\n if (title && !(modelName.toUpperCase().includes(\"MAZDA\")))\r\n mazda = 'MAZDA';\r\n if (this._language === \"en\") {\r\n title = `${yearName} ${mazda} ${modelName} ${trimName}${sup} `;\r\n\r\n } else { // assume that it's french\r\n if (modelName === undefined) {\r\n title = ``;\r\n } else {\r\n title = `${mazda} ${modelName} ${trimName} ${yearName}${sup}`; //this.EngineAndDrivetrain?.trim?.title;\r\n //plainTitle = `${mazda} ${modelName} ${trimName} ${yearName}`;\r\n plainTitle = `${modelName}`;\r\n }\r\n }\r\n // set title without any other bells and whistles\r\n plainTitle = `${modelName}`;\r\n sessionStorage.setItem('plainTitle', plainTitle.replace(new RegExp('mazda ', 'ig'), ''));\r\n break;\r\n }\r\n\r\n if (!title)\r\n title = sessionStorage.getItem(Constants.VehicleTitle); // Hack for not showing undefined when switching trim\r\n if (title !== '' && (title === null || title.includes('undefined')))\r\n return '';\r\n else\r\n return title;\r\n }\r\n\r\n /**\r\n * Recalculate the object FinancialInfo used at many place\r\n */\r\n async RecalculateFinancialInfo() {\r\n await this.loadFromFinancialProvider();\r\n\r\n if (this.FinancialInfo) {\r\n this.FinancialInfo = this.getFinanceObjectWithCalculations(this.FinancialInfo, this._tradeInValue, this._downPaymentValue, this.LoyaltyChecked, this.GraduateChecked, this.MilitaryChecked, this.FirstTimeOwnerChecked, this.FinanceTermIndex, this.LeaseTermIndex, this.AnnualMileage);\r\n }\r\n return this.FinancialInfo;\r\n }\r\n\r\n /**\r\n * getFinanceObjectWithCalculations\r\n */\r\n getFinanceObjectWithCalculations(financialObj, tradeInValue, downPaymentValue, loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked, financeTermIndex, leaseTermIndex, annualMileage) {\r\n // Save the financial object initial states in storage for later fetching PPSA\r\n sessionStorage.setItem(Constants.FinancialObj, JSON.stringify(financialObj)); \r\n\r\n let accessories = 0;\r\n if (typeof annualMileage === \"undefined\") {\r\n annualMileage = 0;\r\n } else {\r\n annualMileage = parseInt(annualMileage);\r\n }\r\n if (!tradeInValue) tradeInValue = '0';\r\n tradeInValue = tradeInValue !== '' ? parseInt(tradeInValue.toString().replace('$', '')) : 0;\r\n if (!downPaymentValue) downPaymentValue = '0';\r\n downPaymentValue = downPaymentValue !== '' ? parseInt(downPaymentValue.toString().replace('$', '')) : 0;\r\n\r\n financialObj.tradeInValue = parseInt(tradeInValue);\r\n financialObj.downPaymentValue = parseInt(downPaymentValue);\r\n financialObj.loyaltyChecked = loyaltyChecked;\r\n financialObj.militaryChecked = militaryChecked;\r\n financialObj.graduateChecked = graduateChecked;\r\n financialObj.firstTimeOwnerChecked = firstTimeOwnerChecked;\r\n financialObj.accessoriesValue = accessories;\r\n financialObj.annualMileage = annualMileage;\r\n financialObj.financeTerm = financeTermIndex !== null ? financeTermIndex : financialObj.apr.length - 1;\r\n financialObj.leaseTerm = leaseTermIndex !== null ? leaseTermIndex : financialObj.lease.length - 1;\r\n financialObj.incentive_programs = financialObj.incentive_programs ? financialObj.incentive_programs : [];\r\n financialObj.package = this.SelectedPackage;\r\n financialObj.warranty = this.SelectedWarrantyPackage;\r\n financialObj.connectedVehicle = this.SelectedConnectedVehiclePackage;\r\n financialObj.addedProtection = this.SelectedAddedProtectionPackage;\r\n financialObj.appearanceProtection = this.SelectedAppearanceProtectionPlansPackage;\r\n \r\n \r\n // FEES EXTRACTION\r\n\r\n financialObj.freight = financialObj.fees.filter((fee) => fee.title === 'Freight').length ? financialObj.fees.filter((fee) => fee.title === 'Freight')[0].price : 0;\r\n financialObj.pde = financialObj.fees.filter((fee) => fee.title === 'PDE').length ? financialObj.fees.filter((fee) => fee.title === 'PDE')[0].price : 0;\r\n financialObj.acTax = financialObj.fees.filter((fee) => fee.title === 'A/C Tax').length ? financialObj.fees.filter((fee) => fee.title === 'A/C Tax')[0].price : 0;\r\n financialObj.exciseTax = financialObj.fees.filter((fee) => fee.title === 'Federal Excise Tax').length ? financialObj.fees.filter((fee) => fee.title === 'Federal Excise Tax')[0].price : 0;\r\n financialObj.amvic = financialObj.fees.filter((fee) => fee.title === 'AMVIC').length ? financialObj.fees.filter((fee) => fee.title === 'AMVIC')[0].price : 0;\r\n financialObj.omvic = financialObj.fees.filter((fee) => fee.title === 'OMVIC').length ? financialObj.fees.filter((fee) => fee.title === 'OMVIC')[0].price : 0;\r\n financialObj.tireStewardshipFee = financialObj.fees.filter((fee) => fee.title === 'Tire Shewardship Fee').length ? financialObj.fees.filter((fee) => fee.title === 'Tire Shewardship Fee')[0].price : 0;\r\n financialObj.oil = financialObj.fees.filter((fee) => fee.title === 'Oil').length ? financialObj.fees.filter((fee) => fee.title === 'Oil')[0].price : 0;\r\n\r\n // LEASE AND ADMIN SERVICE FEES ARE THE SAME STARTING 1ST JANUARY 2024 // 595\r\n financialObj.leaseServiceFees = financialObj.fees.filter((fee) => fee.title === 'Administration Fee').length ? financialObj.fees.filter((fee) => fee.title === 'Administration Fee')[0].price : 0;\r\n financialObj.adminServiceFees = financialObj.fees.filter((fee) => fee.title === 'Administration Fee').length ? financialObj.fees.filter((fee) => fee.title === 'Administration Fee')[0].price : 0;\r\n\r\n financialObj.mazdaCashIncentive = financialObj.incentive_programs.filter((fee) => fee.type === 'mazda_retail_cash').length ? financialObj.incentive_programs.filter((fee) => fee.type === 'mazda_retail_cash')[0].value : 0;\r\n\r\n financialObj.calculatedCash = this.cashCalculator(financialObj, tradeInValue, downPaymentValue, loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked);\r\n financialObj.calculatedFinance = this.loanCalculator(financialObj, tradeInValue, downPaymentValue, loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked);\r\n financialObj.calculatedLease = this.leaseCalculator(financialObj, tradeInValue, downPaymentValue, loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked, annualMileage);\r\n \r\n financialObj.minDownPayment = 0;\r\n financialObj.maxDownPayment = this.getMaxDownPayment(financialObj);\r\n sessionStorage.setItem(Constants.FinancialObj, JSON.stringify(financialObj));\r\n\r\n return financialObj;\r\n }\r\n\r\n /**\r\n * cashCalculator\r\n */\r\n cashCalculator(financialObj, tradeInValue, downPaymentValue, loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked) {\r\n let tempIncentives = financialObj.incentive_programs.find(element => element.type === \"incentive\");\r\n\r\n const cashObj = {};\r\n cashObj.tax = this.getTax();\r\n cashObj.accessories = this.getAccessories();\r\n cashObj.options = this.getOptions();\r\n cashObj.feesAndLevies = this.getFeesAndLeaves(true, false);\r\n cashObj.incentives = this.getIncentivesObj(loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked, true);\r\n cashObj.mazdaRetailCash = this.getIncentives(financialObj) ?.mazda_retail_cash ?.value || 0;\r\n cashObj.specialIncentives = tempIncentives ? tempIncentives.value != null ? tempIncentives.value : 0 : 0;\r\n\r\n cashObj.evRebates = this.getEvRebate(financialObj);\r\n cashObj.tradeInValue = parseInt(tradeInValue);\r\n cashObj.downPaymentValue = parseInt(downPaymentValue);\r\n\r\n cashObj.mazdaPrice = financialObj.msrp + \r\n /*financialObj.package.financial.msrp + \r\n //financialObj.connectedVehicle.financial.msrp + \r\n /*financialObj.warranty.financial.msrp + */\r\n //financialObj.addedProtection.financial.msrp + \r\n //financialObj.appearanceProtection.financial.msrp +\r\n cashObj.options.displayedTotal + \r\n //cashObj.accessories.total + \r\n financialObj.freight +\r\n financialObj.pde +\r\n financialObj.adminServiceFees;\r\n\r\n const nonTaxableInc = cashObj.incentives.nonTaxable.total + financialObj.mazdaCashIncentive;\r\n const taxableInc = cashObj.incentives.taxable.total;\r\n const evRebate = cashObj.evRebates.total.cash;\r\n\r\n const subTotal = financialObj.msrp \r\n + cashObj.options.total \r\n + cashObj.accessories.total \r\n - cashObj.tradeInValue \r\n - cashObj.downPaymentValue \r\n - cashObj.specialIncentives \r\n - taxableInc \r\n + financialObj.freight \r\n + financialObj.pde\r\n + financialObj.adminServiceFees;\r\n cashObj.subtotal = subTotal - nonTaxableInc;\r\n cashObj.subtotalTaxed = subTotal + (subTotal * cashObj.tax) - nonTaxableInc;\r\n cashObj.subtotalTaxes = subTotal * cashObj.tax;\r\n\r\n const subtotalFees = subTotal;\r\n cashObj.subtotalWithFees = subtotalFees - nonTaxableInc + cashObj.feesAndLevies.total;\r\n cashObj.subtotalWithFeesTaxed = subtotalFees + (subtotalFees * cashObj.tax) - nonTaxableInc + cashObj.feesAndLevies.total;\r\n cashObj.subtotalWithFeesTaxes = subtotalFees * cashObj.tax;\r\n\r\n const incentiveRebates = subTotal;\r\n cashObj.subtotalWithIncentiveRebates = incentiveRebates - nonTaxableInc;\r\n cashObj.subtotalWithIncentiveRebatesAndEvRebates = incentiveRebates - evRebate - nonTaxableInc;\r\n cashObj.subtotalWithIncentiveRebatesAndEvRebatesTaxed = incentiveRebates + (incentiveRebates * cashObj.tax) - evRebate - nonTaxableInc;\r\n cashObj.subtotalWithIncentiveRebatesAndEvRebatesTaxes = incentiveRebates * cashObj.tax;\r\n\r\n const feesRebates = subTotal;\r\n cashObj.subtotalWithFeesWithRebates = feesRebates - nonTaxableInc;\r\n cashObj.subtotalWithFeesWithRebatesAndEvRebates = feesRebates - nonTaxableInc - evRebate +cashObj.feesAndLevies.total;\r\n cashObj.subtotalWithFeesWithRebatesTaxed = feesRebates + (feesRebates * cashObj.tax) - evRebate - nonTaxableInc + cashObj.feesAndLevies.total;\r\n cashObj.subtotalWithFeesWithRebatesTaxes = feesRebates * cashObj.tax;\r\n\r\n return cashObj;\r\n }\r\n\r\n /**\r\n * leaseCalculator\r\n */\r\n leaseCalculator(financialObj, tradeInValue, downPaymentValue, loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked, annualMileage) {\r\n let tempIncentives = financialObj.incentive_programs.find(element => element.type === \"incentive\");\r\n\r\n const leaseObj = {};\r\n leaseObj.tax = this.getTax();\r\n leaseObj.accessories = this.getAccessories();\r\n leaseObj.options = this.getOptions();\r\n leaseObj.feesAndLevies = this.getFeesAndLeaves(true, true);\r\n leaseObj.incentives = this.getIncentivesObj(loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked);\r\n leaseObj.rewards = this.getRewardsList(loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked);\r\n leaseObj.mazdaRetailCash = this.getIncentives(financialObj)?.mazda_retail_cash?.value || 0;\r\n leaseObj.specialIncentives = tempIncentives ? tempIncentives.value != null ? tempIncentives.value : 0 : 0;\r\n\r\n leaseObj.evRebates = this.getEvRebate(financialObj);\r\n leaseObj.tradeInValue = parseInt(tradeInValue);\r\n leaseObj.downPaymentValue = parseInt(downPaymentValue);\r\n leaseObj.downPaymentTax = leaseObj.downPaymentValue * leaseObj.tax;\r\n leaseObj.kilometersLeaseValue = annualMileage;\r\n \r\n if (!financialObj.calculatedLease || !financialObj.calculatedLease.leaseValues)\r\n leaseObj.leaseValues = [...financialObj.lease];\r\n else\r\n leaseObj.leaseValues = financialObj.calculatedLease.leaseValues;\r\n\r\n leaseObj.subtotal = financialObj.msrp\r\n + financialObj.addedProtection.financial.msrp \r\n + financialObj.appearanceProtection.financial.msrp\r\n + financialObj.warranty.financial.msrp\r\n + financialObj.connectedVehicle.financial.msrp\r\n + leaseObj.options.total\r\n + leaseObj.accessories.total\r\n - leaseObj.tradeInValue\r\n - leaseObj.specialIncentives\r\n - leaseObj.incentives.taxable.total\r\n + leaseObj.leaseValues[this.LeaseTermIndex].ppsa\r\n + financialObj.freight\r\n + financialObj.pde;\r\n \r\n\r\n //total.federal_tax\r\n //leaseObj.subtotalTaxed = leaseObj.subtotal + (leaseObj.subtotal * leaseObj.tax);\r\n leaseObj.subtotalWithFees = leaseObj.subtotal + leaseObj.feesAndLevies.total + financialObj.adminServiceFees;\r\n leaseObj.subtotalWithFeesTaxed = leaseObj.subtotalWithFees + (leaseObj.subtotalWithFees * leaseObj.tax);\r\n leaseObj.subtotalWithRebates = leaseObj.subtotal - leaseObj.incentives.taxable.total - (leaseObj?.evRebates?.total?.lease ?? 0);\r\n leaseObj.subtotalWithRebatesTaxed = leaseObj.subtotalWithRebates + (leaseObj.subtotalWithRebates * leaseObj.tax);\r\n leaseObj.subtotalWithFeesWithRebates = leaseObj.subtotal + leaseObj.feesAndLevies.total + financialObj.adminServiceFees - leaseObj.incentives.taxable.total - (leaseObj?.evRebates?.total?.lease ?? 0);\r\n leaseObj.subtotalWithFeesWithRebatesTaxed = leaseObj.subtotalWithFeesWithRebates + (leaseObj.subtotalWithFeesWithRebates * leaseObj.tax);\r\n\r\n leaseObj.balanceToLease = leaseObj.subtotal - leaseObj.incentives.nonTaxable.total - leaseObj.downPaymentValue;\r\n //leaseObj.balanceToLeaseTaxed = leaseObj.subtotalTaxed - leaseObj.incentives.nonTaxable.total - leaseObj.downPaymentValue;\r\n leaseObj.balanceToLeaseWithFees = leaseObj.subtotalWithFees - leaseObj.incentives.nonTaxable.total - leaseObj.downPaymentValue;\r\n //leaseObj.balanceToLeaseWithFeesTaxed = leaseObj.subtotalWithFeesTaxed - leaseObj.incentives.nonTaxable.total - leaseObj.downPaymentValue;\r\n leaseObj.balanceToLeaseWithRebates = leaseObj.subtotalWithRebates - leaseObj.incentives.nonTaxable.total - leaseObj.downPaymentValue;\r\n //leaseObj.balanceToLeaseWithRebatesTaxed = leaseObj.subtotalWithRebatesTaxed - leaseObj.incentives.nonTaxable.total - leaseObj.downPaymentValue;+\r\n leaseObj.balanceToLeaseWithFeesWithRebates = leaseObj.subtotalWithFeesWithRebates - leaseObj.incentives.nonTaxable.total - leaseObj.downPaymentValue;\r\n\r\n // Used in the price bar\r\n leaseObj.balanceToLeaseWithFeesWithRebatesTaxed = leaseObj.subtotalWithFeesWithRebatesTaxed - leaseObj.incentives.nonTaxable.total - leaseObj.downPaymentValue;\r\n\r\n\r\n leaseObj.leaseValues.forEach(leaseElement => {\r\n leaseElement.residual = financialObj.residual.filter((resudualObj) => resudualObj.term === leaseElement.term)[0].rate;\r\n \r\n leaseElement.moneyFactor = financialObj.money_factor.filter((moneyFactorObj) => moneyFactorObj.term === leaseElement.term)[0].rate;\r\n leaseElement.leaseEndValueNoFees = leaseElement.residualAmount;\r\n leaseElement.leaseEndValue = leaseElement.residualAmount;\r\n });\r\n\r\n return leaseObj;\r\n }\r\n\r\n /**\r\n * loanCalculator\r\n */\r\n loanCalculator(financialObj, tradeInValue, downPaymentValue, loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked) {\r\n let tempIncentives = financialObj.incentive_programs.find(element => element.type === \"incentive\");\r\n\r\n const financeObj = {};\r\n financeObj.tax = this.getTax();\r\n financeObj.accessories = this.getAccessories();\r\n financeObj.options = this.getOptions();\r\n financeObj.feesAndLevies = this.getFeesAndLeaves(true, false);\r\n financeObj.incentives = this.getIncentivesObj(loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked);\r\n financeObj.evRebates = this.getEvRebate(financialObj);\r\n financeObj.rewards = this.getRewardsList(loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked);\r\n financeObj.mazdaRetailCash = this.getIncentives(financialObj)?.mazda_retail_cash?.value || 0;\r\n financeObj.specialIncentives = tempIncentives ? tempIncentives.value != null ? tempIncentives.value : 0 : 0;\r\n financeObj.tradeInValue = parseInt(tradeInValue);\r\n financeObj.downPaymentValue = parseInt(downPaymentValue);\r\n\r\n if (!financialObj.calculatedFinance || !financialObj.calculatedFinance.financeValues)\r\n financeObj.financeValues = [...financialObj.apr];\r\n else\r\n financeObj.financeValues = financialObj.calculatedFinance.financeValues;\r\n\r\n // Do not remove this line below, used in Financial Provider!!!\r\n financeObj.subtotalWithoutTradInAndDownPayment = financialObj.msrp + financialObj.package.financial.msrp + financialObj.warranty.financial.msrp + financialObj.connectedVehicle.financial.msrp + financeObj.options.total + financeObj.accessories.total;\r\n\r\n financeObj.subtotal = financialObj.msrp \r\n /*+ financialObj.package.financial.msrp **/ \r\n + financialObj.addedProtection.financial.msrp \r\n + financialObj.appearanceProtection.financial.msrp \r\n + financialObj.connectedVehicle.financial.msrp \r\n + financialObj.warranty.financial.msrp \r\n + financeObj.options.total \r\n + financeObj.accessories.total \r\n - financeObj.tradeInValue \r\n - financeObj.specialIncentives \r\n - financeObj.incentives.taxable.total \r\n + financialObj.freight \r\n + financialObj.pde\r\n + financeObj.financeValues[this.FinanceTermIndex].ppsa\r\n financeObj.subtotalTaxed = financeObj.subtotal + (financeObj.financeValues[this.FinanceTermIndex].gstAmount + financeObj.financeValues[this.FinanceTermIndex].pstAmount);\r\n financeObj.subtotalTaxes = financeObj.financeValues[this.FinanceTermIndex].gstAmount + financeObj.financeValues[this.FinanceTermIndex].pstAmount;\r\n\r\n financeObj.subtotalWithFees = financeObj.subtotal + financeObj.feesAndLevies.total + financialObj.adminServiceFees;\r\n financeObj.subtotalWithFeesTaxed = financeObj.subtotalWithFees + financeObj.subtotalTaxes\r\n //financeObj.subtotalWithFeesTaxes = financeObj.subtotalWithFees * financeObj.tax;\r\n\r\n financeObj.subtotalWithRebates = financeObj.subtotal;\r\n financeObj.subtotalWithRebatesTaxed = financeObj.subtotalWithRebates + financeObj.subtotalTaxes\r\n //financeObj.subtotalWithRebatesTaxes = financeObj.subtotalWithRebates * financeObj.tax;\r\n\r\n financeObj.subtotalWithFeesWithRebates = financeObj.subtotalWithFees;\r\n financeObj.subtotalWithFeesWithRebatesTaxed = financeObj.subtotalWithFeesWithRebates + financeObj.subtotalTaxes\r\n //financeObj.subtotalWithFeesWithRebatesTaxes = financeObj.subtotalWithFeesWithRebates * financeObj.tax;\r\n\r\n financeObj.balanceToFinance = financeObj.subtotal - financeObj.incentives.nonTaxable.total - financeObj.downPaymentValue - financeObj.evRebates.total.finance;\r\n financeObj.balanceToFinanceTaxed = financeObj.subtotalTaxed - financeObj.incentives.nonTaxable.total - financeObj.downPaymentValue;\r\n financeObj.balanceToFinanceWithFees = financeObj.subtotalWithFees - financeObj.incentives.nonTaxable.total - financeObj.downPaymentValue;\r\n financeObj.balanceToFinanceWithFeesTaxed = financeObj.subtotalWithFeesTaxed - financeObj.incentives.nonTaxable.total - financeObj.downPaymentValue;\r\n financeObj.balanceToFinanceWithRebates = financeObj.subtotalWithRebates - financeObj.incentives.nonTaxable.total - financeObj.downPaymentValue - financeObj.evRebates.total.finance;\r\n financeObj.balanceToFinanceWithRebatesTaxed = financeObj.subtotalWithRebatesTaxed - financeObj.incentives.nonTaxable.total - financeObj.downPaymentValue - financeObj.evRebates.total.finance;\r\n financeObj.balanceToFinanceWithFeesWithRebates = financeObj.subtotalWithFeesWithRebates - financeObj.incentives.nonTaxable.total - financeObj.downPaymentValue - financeObj.evRebates.total.finance;\r\n financeObj.balanceToFinanceWithFeesWithRebatesTaxed = financeObj.subtotalWithFeesWithRebatesTaxed - financeObj.incentives.nonTaxable.total - financeObj.downPaymentValue - financeObj.evRebates.total.finance;\r\n\r\n return financeObj;\r\n }\r\n\r\n get ExteriorColorInParam() {\r\n let exterior;\r\n\r\n const params = getParams();\r\n\r\n if (params['exterior'] && params['exterior'][0])\r\n exterior = params['exterior'][0];\r\n\r\n return exterior;\r\n }\r\n\r\n get InteriorColorInParam() {\r\n let interior;\r\n\r\n const params = getParams();\r\n\r\n if (params['interior'] && params['interior'][0])\r\n interior = params['interior'][0];\r\n\r\n return interior;\r\n }\r\n\r\n SetSelectedColorsFromParams() {\r\n if (this.ExteriorColorInParam !== null && (this.SelectedColourExterior === null || this.SelectedColourExterior.code !== this.ExteriorColorInParam)) {\r\n //console.log('exteriorColor:', this.ExteriorColorInParam);\r\n Object.entries(this.Colours.visual.exteriors).map((Colour, index) => {\r\n if (Colour[1]['code'] === this.ExteriorColorInParam) {\r\n this.SelectedColourExteriorIndex = index;\r\n //console.log('found the matched ext color!');\r\n }\r\n });\r\n }\r\n\r\n if (this.InteriorColorInParam !== null && (this.SelectedColourInterior === null || this.SelectedColourInterior.code !== this.InteriorColorInParam)) {\r\n //console.log('interiorColor:', this.InteriorColorInParam);\r\n this.Colours.visual.interiors.map((Colour, index) => {\r\n if (Colour.code === this.InteriorColorInParam) {\r\n this.SelectedColourInteriorIndex = index;\r\n //console.log('found the matched int color!');\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * getAccessories\r\n */\r\n getAccessories() {\r\n const accessoriesObj = JSON.parse(sessionStorage.getItem(Constants.SelectedAccessories));\r\n let accessories = {};\r\n accessories.total = Math.round((accessoriesObj !== null ? accessoriesObj.reduce((total, accessorie) => total + accessorie.price, 0) : 0) * 100) / 100;\r\n accessories.total_residual_value = Math.round((accessoriesObj !== null ? accessoriesObj.reduce((total, accessorie) => total + accessorie.residual_value, 0) : 0) * 100) / 100;\r\n accessories.detail = accessoriesObj !== null ? { ...accessoriesObj } : {};\r\n return accessories;\r\n }\r\n\r\n /**\r\n * getOptions\r\n */\r\n getOptions() {\r\n // TODO: WHY ARE WE LOADING FROM SESSION STORAGE WHEN THIS OBJECT HOLDS AND LOAD IT ALREADY ? \r\n const selectedWheel = JSON.parse(sessionStorage.getItem(Constants.SelectedWheel)) || {};\r\n let selectedExteriorColour = JSON.parse(sessionStorage.getItem(Constants.DefaultExteriorColour));\r\n let selectedInteriorColour = JSON.parse(sessionStorage.getItem(Constants.DefaultInteriorColour));\r\n if (sessionStorage.getItem(Constants.SelectedExteriorColour)) {\r\n selectedExteriorColour = JSON.parse(sessionStorage.getItem(Constants.SelectedExteriorColour));\r\n }\r\n if (sessionStorage.getItem(Constants.SelectedInteriorColour)) {\r\n selectedInteriorColour = JSON.parse(sessionStorage.getItem(Constants.SelectedInteriorColour));\r\n }\r\n\r\n const selectedPackage = this.SelectedPackage;\r\n const selectedNonModelPackage = this.SelectedNonModelPackage;\r\n const selectedWarrantyPackage = this.SelectedWarrantyPackage;\r\n const selectedConnectedVehiclePackage = this.SelectedConnectedVehiclePackage;\r\n\r\n let options = {};\r\n // displayedTotal is used in the mazdaPrice\r\n options.displayedTotal = (selectedInteriorColour?.price ? selectedInteriorColour.price : 0) \r\n + (selectedExteriorColour?.price ? selectedExteriorColour.price : 0)\r\n + (selectedNonModelPackage?.financial?.msrp ? selectedNonModelPackage.financial.msrp : 0) \r\n + (selectedWarrantyPackage?.financial?.msrp ? selectedWarrantyPackage.financial.msrp : 0) \r\n + (selectedConnectedVehiclePackage?.financial?.msrp ? selectedConnectedVehiclePackage.financial.msrp : 0);\r\n\r\n options.total = (selectedWheel.price ? selectedWheel.price : 0) +\r\n + (selectedExteriorColour && selectedExteriorColour.price ? selectedExteriorColour.price : 0)\r\n + (selectedInteriorColour && selectedInteriorColour.price ? selectedInteriorColour.price : 0);\r\n\r\n options.wheels = selectedWheel;\r\n options.interiorColour = selectedInteriorColour;\r\n options.exteriorColour = selectedExteriorColour;\r\n options.model_option_package = selectedPackage;\r\n options.universal_package = selectedNonModelPackage;\r\n options.warranty_package = selectedWarrantyPackage;\r\n options.connected_vehicle_package = selectedConnectedVehiclePackage;\r\n return options;\r\n\r\n }\r\n\r\n /**\r\n * getDetailedOptions\r\n * \r\n * This version is for the calculated cash which has a separated entry for protection, accessories, connectivty\r\n */\r\n getDetailedOptions() {\r\n const selectedWheel = JSON.parse(sessionStorage.getItem(Constants.SelectedWheel)) || {};\r\n let selectedExteriorColour = JSON.parse(sessionStorage.getItem(Constants.DefaultExteriorColour));\r\n let selectedInteriorColour = JSON.parse(sessionStorage.getItem(Constants.DefaultInteriorColour));\r\n if (sessionStorage.getItem(Constants.SelectedExteriorColour)) {\r\n selectedExteriorColour = JSON.parse(sessionStorage.getItem(Constants.SelectedExteriorColour));\r\n }\r\n if (sessionStorage.getItem(Constants.SelectedInteriorColour)) {\r\n selectedInteriorColour = JSON.parse(sessionStorage.getItem(Constants.SelectedInteriorColour));\r\n }\r\n let selectedPackageIndex = JSON.parse(sessionStorage.getItem(Constants.SelectedPackageIndex));\r\n let selectedPackage = this.Packages?.packages.filter(pack => pack.type === 'model_option_package');\r\n if(selectedPackageIndex !== null)\r\n selectedPackage = selectedPackage[selectedPackageIndex];\r\n\r\n let selectedNonModelPackageIndex = JSON.parse(sessionStorage.getItem(Constants.SelectedNonModelPackageIndex));\r\n let selectedNonModelPackage = this.Packages?.packages.filter(pack => pack.type === 'universal_package');\r\n if(selectedNonModelPackageIndex !== null)\r\n selectedNonModelPackage = selectedNonModelPackage[selectedNonModelPackageIndex];\r\n\r\n let selectedWarrantyIndex = JSON.parse(sessionStorage.getItem(Constants.SelectedWarrantyIndex));\r\n let selectedWarrantyPackage = this.Packages?.packages.filter(pack => pack.type === 'universal_package' && (pack.package_type === 'Warranty' || pack.package_type === 'Garantie'));\r\n if(selectedWarrantyIndex !== null)\r\n selectedWarrantyPackage = selectedNonModelPackage[selectedWarrantyIndex]; \r\n\r\n let selectedConnectedVehicleIndex = JSON.parse(sessionStorage.getItem(Constants.SelectedConnectedVehicleIndex));\r\n let selectedConnectedVehiclePackage = this.Packages?.packages.filter(pack => pack.type === 'universal_package' && (pack.package_type === 'Connected Vehicle' || pack.package_type === 'Véhicule Connecté'));\r\n if(selectedConnectedVehicleIndex !== null)\r\n selectedConnectedVehiclePackage = selectedConnectedVehiclePackage[selectedConnectedVehicleIndex]; \r\n\r\n let options = {};\r\n options.displayedTotal = (selectedInteriorColour?.price ? selectedInteriorColour.price : 0) \r\n + (selectedExteriorColour?.price ? selectedExteriorColour.price : 0) \r\n + /*(selectedPackage?.financial?.msrp ? selectedPackage.financial.msrp : 0) +*/ (selectedNonModelPackage?.financial?.msrp ? selectedNonModelPackage.financial.msrp : 0) \r\n\r\n options.total = (selectedInteriorColour?.price ? selectedInteriorColour.price : 0) \r\n + (selectedExteriorColour?.price ? selectedExteriorColour.price : 0) \r\n + (selectedWheel.price ? selectedWheel.price : 0) \r\n + (selectedWheel.tpms ? selectedWheel.tpms : 0)\r\n + (selectedWheel.install_cost ? selectedWheel.install_cost : 0);\r\n //+ (selectedConnectedVehiclePackage?.financial?.msrp ? selectedConnectedVehiclePackage.financial.msrp : 0);\r\n\r\n options.wheels = selectedWheel;\r\n options.interiorColour = selectedInteriorColour;\r\n options.exteriorColour = selectedExteriorColour;\r\n options.model_option_package = selectedPackage;\r\n options.universal_package = selectedNonModelPackage;\r\n options.warranty_package = selectedWarrantyPackage;\r\n options.connected_vehicle_package = selectedConnectedVehiclePackage; \r\n return options;\r\n\r\n }\r\n\r\n /**\r\n * getSupValueFromFee\r\n */\r\n getSupValueFromFee(fee) {\r\n let sup = null;\r\n\r\n switch (fee) {\r\n case 'A/C Tax':\r\n sup = '3';\r\n break;\r\n case 'Tire':\r\n sup = '6';\r\n break;\r\n case 'OMVIC':\r\n sup = '4';\r\n break;\r\n case 'AMVIC':\r\n sup = '5';\r\n break;\r\n case 'Administration Fee':\r\n sup = '9';\r\n break;\r\n default:\r\n sup = null;\r\n break;\r\n }\r\n return sup;\r\n }\r\n\r\n /**\r\n * getFeesAndLeaves\r\n */\r\n getFeesAndLeaves(inCashCalculation, leaseMode) {\r\n let feesObj = JSON.parse(sessionStorage.getItem(Constants.FinancialObj)) ?.fees || {};\r\n let feeAndLevies = {};\r\n const that = this;\r\n if (feesObj.length) {\r\n // Filter and remove freight from the fees calculation\r\n feesObj = feesObj.filter(function (fee) {\r\n return fee.title !== 'Freight' && fee.title !== 'Administration Fee' && fee.title !== 'PDE'\r\n });\r\n\r\n // Hardcode the sup value to the label - or TRY TO add it to the JSON data.\r\n feesObj.forEach((el, index) => {\r\n feesObj[index] = { ...el, 'sup': that.getSupValueFromFee(el.title) }\r\n })\r\n\r\n // Add <sup> value to\r\n if (inCashCalculation) {\r\n // Filter and remove PDE from the fees calculation in cash calculation and leaving the feesObj intact as it's used for displaying also.\r\n const feesObjFiltered = feesObj.filter(function (fee) {\r\n return fee.title !== 'PDE'\r\n });\r\n feeAndLevies.total = feesObjFiltered.reduce((total, fee) => total + fee.price, 0);\r\n } else {\r\n feeAndLevies.total = feesObj.reduce((total, fee) => total + fee.price, 0);\r\n }\r\n\r\n feeAndLevies.detail = [...feesObj];\r\n } else {\r\n feeAndLevies.total = 0;\r\n }\r\n return feeAndLevies;\r\n }\r\n\r\n /**\r\n * getRewardsList\r\n */\r\n getRewardsList(loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked) {\r\n const financialObj = JSON.parse(sessionStorage.getItem('financialObj')) || {};\r\n const rewardKeys = [/*\"loyalty\", */'military', 'grad_award', 'first_time_owner'];\r\n\r\n // Grab the whole list of current incentives\r\n let incentivesList = this.getIncentives(financialObj);\r\n // console.log('[getRewardsList] incentivesList', incentivesList);\r\n\r\n // Add checked value to corresponding incentives(reward)\r\n if (loyaltyChecked) {\r\n incentivesList.loyalty.checked = true;\r\n }\r\n if (graduateChecked) {\r\n incentivesList.grad_award.checked = true;\r\n }\r\n if (militaryChecked) {\r\n incentivesList.military.checked = true;\r\n }\r\n if (firstTimeOwnerChecked) {\r\n incentivesList.first_time_owner.checked = true;\r\n } \r\n\r\n let rewardsList = [];\r\n\r\n // Keep the `rewards` incentives only - filter out the rest\r\n rewardKeys.forEach(key => {\r\n if (incentivesList[key] && incentivesList[key].checked === true) {\r\n rewardsList.push(incentivesList[key]);\r\n }\r\n });\r\n // console.log('[getRewardsObj] rewardsList', rewardsList);\r\n\r\n return rewardsList;\r\n }\r\n\r\n /**\r\n * getIncentivesObj\r\n */\r\n getIncentivesObj(loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked, isCashCalculation = false) {\r\n const financialObj = JSON.parse(sessionStorage.getItem('financialObj')) || {};\r\n const incentivesKeysTaxable = ['connect'];\r\n let incentivesKeysNonTaxable;\r\n\r\n // BUSINESS RULE: Loyalty is calculated on cash discount but in financing and leasing it's calculated by TCCI so we exclude it\r\n if(isCashCalculation)\r\n incentivesKeysNonTaxable = [\"military\", 'grad_award', \"loyalty\", \"first_time_owner\"];\r\n else\r\n incentivesKeysNonTaxable = [\"military\", 'grad_award', /*\"loyalty\",*/ \"first_time_owner\"];\r\n\r\n let incentives = this.getIncentives(financialObj);\r\n let incentivesObj = {};\r\n incentivesObj.taxable = {};\r\n incentivesObj.taxable.details = [];\r\n incentivesObj.taxable.total = 0;\r\n incentivesObj.nonTaxable = {};\r\n incentivesObj.nonTaxable.details = [];\r\n incentivesObj.nonTaxable.total = 0;\r\n if (loyaltyChecked) {\r\n incentives.loyalty.checked = true;\r\n }\r\n if (graduateChecked) {\r\n incentives.grad_award.checked = true;\r\n }\r\n if (militaryChecked) {\r\n incentives.military.checked = true;\r\n }\r\n if (firstTimeOwnerChecked) {\r\n incentives.first_time_owner.checked = true;\r\n }\r\n\r\n incentivesKeysTaxable.map(incentiveKey => {\r\n if (incentives[incentiveKey] && incentives[incentiveKey].checked === true) {\r\n incentivesObj.taxable.details.push(incentives[incentiveKey]);\r\n incentivesObj.taxable.total += incentives[incentiveKey].cash_value ? incentives[incentiveKey].cash_value : incentives[incentiveKey].value;\r\n }\r\n });\r\n\r\n incentivesKeysNonTaxable.map(incentiveKey => {\r\n if (incentives[incentiveKey] && incentives[incentiveKey].checked === true) {\r\n incentivesObj.nonTaxable.details.push(incentives[incentiveKey]);\r\n incentivesObj.nonTaxable.total += incentives[incentiveKey].cash_value ? incentives[incentiveKey].cash_value : incentives[incentiveKey].value;\r\n }\r\n });\r\n\r\n return incentivesObj;\r\n }\r\n\r\n /**\r\n * getEvRebate\r\n */\r\n getEvRebate(financeObj) {\r\n const tax = this.getTax(); \r\n const federalTax = this.getGstRate();\r\n const provincialTax = this.getPstRate();\r\n\r\n let evRebates = {};\r\n evRebates.total = {\r\n 'cash': 0,\r\n 'lease': 0,\r\n 'finance': 0,\r\n 'federal_tax': 0,\r\n 'provincial_tax': 0,\r\n 'tax': 0,\r\n 'lease_federal_tax': 0,\r\n 'lease_provincial_tax': 0,\r\n 'lease_tax': 0\r\n }\r\n\r\n if (!financeObj.apr || !financeObj.lease)\r\n return evRebates;\r\n\r\n evRebates.details = [];\r\n\r\n const evRebateObj = financeObj.ev_rebates;\r\n\r\n evRebateObj.map(rebate => {\r\n if(rebate.lease.length === 0 || rebate.apr.length === 0)\r\n return;\r\n\r\n const filteredLeaseItems = rebate.lease.filter(leaseItem => Number(leaseItem.term) === Number(this._leaseTerm));\r\n const leaseProRatedRebate = filteredLeaseItems.length > 0 ? filteredLeaseItems[0].rate : 0;\r\n \r\n const filteredFinanceItems = rebate.apr.filter(financeItem => Number(financeItem.term) === Number(this._financeTerm));\r\n const financeProRatedRebate = filteredFinanceItems.length > 0 ? filteredFinanceItems[0].rate : 0;\r\n\r\n const calculateTaxes = this.hasEvFinancingTaxes(getProvince());\r\n const evRebate = {\r\n cash: rebate.cash,\r\n tax_cash: calculateTaxes ? rebate.cash - (rebate.cash / (1 + tax)) : 0,\r\n lease: rebate.cash * leaseProRatedRebate,\r\n finance: rebate.cash * financeProRatedRebate,\r\n title: rebate.province\r\n }\r\n evRebates.details.push(evRebate);\r\n\r\n evRebates.total.cash += evRebate.cash; // this is with taxe include;\r\n evRebates.total.finance += evRebate.finance; // this is with taxe include;\r\n evRebates.total.lease += evRebate.lease; // this is with taxe include;\r\n\r\n if (rebate.province === \"federal\")\r\n evRebates.total.lease_federal_tax += Math.round((evRebates.total.lease * tax) * 100) / 100;\r\n else\r\n evRebates.total.lease_provincial_tax += Math.round((rebate.cash * leaseProRatedRebate * tax) * 100) / 100;\r\n });\r\n\r\n\r\n // Calulate the taxes on the sums of all the ev rebates\r\n evRebates.total.lease_tax = (evRebates.total.lease * tax);\r\n\r\n return evRebates;\r\n }\r\n\r\n /**\r\n * get incentive list associated with the financial object\r\n */\r\n getIncentives(financialObj) {\r\n let incentives = {};\r\n if (financialObj.incentive_programs)\r\n financialObj.incentive_programs.forEach(incentive => {\r\n incentives[incentive.type] = incentive;\r\n });\r\n return incentives;\r\n }\r\n\r\n /**\r\n * parseAccessoriesData\r\n */\r\n parseAccessoriesData(accessoriesData) {\r\n var data = [];\r\n const popularData = [];\r\n let formatedData = {};\r\n\r\n for (const index in accessoriesData) {\r\n data.push(accessoriesData[index]);\r\n }\r\n\r\n data.forEach((accessory, index) => {\r\n accessory.index = index;\r\n if (accessory.popular === true) {\r\n popularData.push(accessory);\r\n }\r\n })\r\n\r\n if (data.length) {\r\n formatedData = this.groupBy(data, 'category');\r\n formatedData['All'] = data;\r\n if (popularData.length > 0) {\r\n formatedData['Popular'] = popularData;\r\n }\r\n }\r\n return (formatedData);\r\n }\r\n\r\n /**\r\n * getTax - returns the HST from PST and GST\r\n */\r\n getTax() {\r\n const result = this.getGstRate() + this.getPstRate();\r\n return result;\r\n }\r\n\r\n /**\r\n * getGstRate - return the gst tax rate\r\n */\r\n getGstRate() {\r\n if (this._gstRate === 0) \r\n this._gstRate = Number(sessionStorage.getItem('FinancialProvider_GST'));\r\n \r\n const result = Number(this._gstRate) / 100;\r\n return result;\r\n }\r\n\r\n\r\n /**\r\n * getPstRate - return the provincial tax\r\n */\r\n getPstRate() {\r\n if (this._pstRate === 0) \r\n this._pstRate = Number(sessionStorage.getItem('FinancialProvider_PST'));\r\n\r\n const result = Number(this._pstRate) / 100;\r\n return result;\r\n }\r\n\r\n /*\r\n * This is the new version of the Loan Informational APR calculation.\r\n */\r\n getLoanInformationalAprRate() {\r\n const financeElement = this.FinancialInfo.calculatedFinance.financeValues[this.FinanceTermIndex];\r\n\r\n const term = financeElement.term;\r\n \r\n const monthly = financeElement.monthly;\r\n \r\n const capitalizedCost = financeElement.loanAmount;\r\n\r\n const adminFees = getProvince() === \"QC\" ? this.FinancialInfo.adminServiceFees : 0; \r\n\r\n const result = RATE(term, monthly, -capitalizedCost +adminFees, 0, 0);\r\n\r\n const toReturn = Number(result * 12 * 100);\r\n\r\n return toReturn;\r\n //return customRound(result * 12 * 100, 2);\r\n }\r\n\r\n\r\n \r\n /*\r\n * This is the new version of the Lease Informational APR calculation.\r\n */\r\n getLeaseInformationalAprRate() {\r\n const leaseElement = this.FinancialInfo.calculatedLease.leaseValues[this.LeaseTermIndex];\r\n\r\n const term = leaseElement.term;\r\n \r\n const monthly = leaseElement.monthly;\r\n \r\n const capitalizedCost = leaseElement.capitalizedCost;\r\n\r\n const adminFees = getProvince() === \"QC\" ? this.FinancialInfo.adminServiceFees : 0;\r\n\r\n const retailCash = this.FinancialInfo.calculatedLease.mazdaRetailCash;\r\n\r\n const leaseEndValue = leaseElement.leaseEndValue;\r\n\r\n const result = RATE(term, monthly, -capitalizedCost +adminFees + retailCash, Number(leaseEndValue), 1);\r\n\r\n //return customRound(result * 12 * 100, 2);\r\n return Number(result * 12 * 100);\r\n }\r\n\r\n /*\r\n * getMaxDownPayment / tradeIn\r\n *\r\n */\r\n getMaxDownPayment(financialObj) {\r\n if(!this.FinancialInfo)\r\n return 0;\r\n\r\n if(!this.SelectedModel)\r\n return 0;\r\n\r\n if(!this.SelectedPackage)\r\n return 0;\r\n\r\n const freight = this.FinancialInfo.fees.filter((fee) => fee.title === 'Freight').length ? this.FinancialInfo.fees.filter((fee) => fee.title === 'Freight')[0].price : 0;\r\n const pde = this.FinancialInfo.fees.filter((fee) => fee.title === 'PDE').length ? this.FinancialInfo.fees.filter((fee) => fee.title === 'PDE')[0].price : 0;\r\n const acTax = this.FinancialInfo.fees.filter((fee) => fee.title === 'A/C Tax').length ? this.FinancialInfo.fees.filter((fee) => fee.title === 'A/C Tax')[0].price : 0;\r\n const exciseTax = this.FinancialInfo.fees.filter((fee) => fee.title === 'Federal Excise Tax').length ? this.FinancialInfo.fees.filter((fee) => fee.title === 'Federal Excise Tax')[0].price : 0;\r\n const amvic = this.FinancialInfo.fees.filter((fee) => fee.title === 'AMVIC').length ? this.FinancialInfo.fees.filter((fee) => fee.title === 'AMVIC')[0].price : 0;\r\n const omvic = this.FinancialInfo.fees.filter((fee) => fee.title === 'OMVIC').length ? this.FinancialInfo.fees.filter((fee) => fee.title === 'OMVIC')[0].price : 0;\r\n const tireStewardshipFee = this.FinancialInfo.fees.filter((fee) => fee.title === 'Tire Shewardship Fee').length ? this.FinancialInfo.fees.filter((fee) => fee.title === 'Tire Shewardship Fee')[0].price : 0;\r\n const oil = this.FinancialInfo.fees.filter((fee) => fee.title === 'Oil').length ? this.FinancialInfo.fees.filter((fee) => fee.title === 'Oil')[0].price : 0;\r\n\r\n const mazdaCashIncentive = this.FinancialInfo.incentive_programs.filter((fee) => fee.title === 'mazda_retail_cash').length ? this.FinancialInfo.incentive_programs.filter((fee) => fee.title === 'mazda_retail_cash')[0].price : 0;\r\n\r\n // LEASE AND ADMIN SERVICE FEES ARE THE SAME STARTING 1ST JANUARY 2024 // 595\r\n //const leaseServiceFees = summaryCalculator.FinancialInfo.fees.filter((fee) => fee.title === 'Administration Fee').length ? summaryCalculator.FinancialInfo.fees.filter((fee) => fee.title === 'Administration Fee')[0].price : 0;\r\n const adminServiceFees = this.FinancialInfo.fees.filter((fee) => fee.title === 'Administration Fee').length ? this.FinancialInfo.fees.filter((fee) => fee.title === 'Administration Fee')[0].price : 0;\r\n \r\n // Loyalty can be percentage or cash amount reduction. Excluding for now\r\n const loyaltyValue = this.LoyaltyChecked ? this.FinancialInfo.incentive_programs.find(x => x.type === \"loyalty\").cash_value : 0;\r\n const graduatePrice = this.GraduateChecked ? this.FinancialInfo.incentive_programs.find(x => x.type === \"grad_award\").value : 0;\r\n const militaryPrice= this.MilitaryChecked ? this.FinancialInfo.incentive_programs.find(x => x.type === \"military\").value : 0;\r\n const firstTimeOwnerPrice = this.FirstTimeOwnerChecked ? this.FinancialInfo ? this.FinancialInfo.incentive_programs.find(x => x.type === \"first_time_owner\").value : 0 : 0;\r\n\r\n const incentives = mazdaCashIncentive + graduatePrice + militaryPrice + firstTimeOwnerPrice + this.FinancialInfo.calculatedFinance.specialIncentives;\r\n\r\n const options = financialObj.calculatedFinance.options.total // Colors +Wheels\r\n //+ this.SelectedNonModelPackage.financial.msrp\r\n //+ this.SelectedWarrantyPackage.financial.msrp // Warranty \r\n //+ this.SelectedConnectedVehiclePackage.financial.msrp // Connected Vehicle \r\n + financialObj.calculatedFinance.accessories.total; // Accessories\r\n\r\n const totalMSRP = this.SelectedModel.financial.msrp\r\n + this.SelectedPackage.financial.msrp // Actual Car packages \r\n + options\r\n + exciseTax + freight + pde // Excise is 100$ hardcoded in the excel sheet, freight can vary. \r\n + (this.IncludeFees ? acTax + amvic + omvic + tireStewardshipFee + oil : 0);\r\n\r\n // Fetch residual value from the calls\r\n const element = financialObj.calculatedLease.leaseValues.find(x => x.term === 36);\r\n\r\n const maxDownPayment = totalMSRP\r\n + adminServiceFees\r\n + element.ppsa\r\n - incentives\r\n - this.FinancialInfo.calculatedLease.evRebates.total.lease\r\n - (element.downPaymentLeaseEndValue ? element.downPaymentLeaseEndValue : 0) // Use this variable for the 24000 km annual mileage\r\n - 100;\r\n\r\n console.log(\"maxDownPayment\", maxDownPayment);\r\n return maxDownPayment;\r\n } \r\n \r\n /*\r\n * isRetailerMode - checks if we are in a retailer mode\r\n *\r\n */ \r\n async isRetailerMode() {\r\n if(!window.bnp_retailer_mode) {\r\n // FLUSH THE DEALER VARS (Fix issue of dealer map stuck with the dealer vars one)\r\n sessionStorage.removeItem('bnp_dealerVars');\r\n \r\n return false;\r\n }\r\n\r\n const urlParams = getParams();\r\n if (urlParams['DealerID']) {\r\n // Fix use case that we switch from different iframe session from switching dealers website\r\n if(sessionStorage.getItem('bnp_dealerVars')) {\r\n const dealerVars = JSON.parse(sessionStorage.getItem('bnp_dealerVars'));\r\n if(dealerVars.dealerId !== urlParams['DealerID'][0])\r\n sessionStorage.removeItem('bnp_dealerVars');\r\n }\r\n\r\n if(!sessionStorage.getItem('bnp_dealerVars')) {\r\n const dealerId = urlParams['DealerID'][0];\r\n const dealerData = await this._apiService.getDealerDataById(dealerId);\r\n if (dealerData.data) {\r\n const dealerName = dealerData.data.name;\r\n const provinceCode = dealerData.data.province.province_code;\r\n\r\n console.log(dealerId, dealerName, provinceCode);\r\n const dealerVars = JSON.stringify({dealerId: dealerId, dealerName: dealerName, dealerProvinceCode: provinceCode})\r\n sessionStorage.setItem('bnp_dealerVars', dealerVars);\r\n\r\n this.province = provinceCode;\r\n this._apiService.province = provinceCode;\r\n this._tcciService.province = provinceCode;\r\n }\r\n }\r\n } else {\r\n // FLUSH THE DEALER VARS (Fix issue of dealer map stuck with the dealer vars one)\r\n sessionStorage.removeItem('bnp_dealerVars');\r\n }\r\n\r\n return window.bnp_retailer_mode;\r\n }\r\n\r\n getDealerVars() {\r\n if (sessionStorage.getItem('bnp_dealerVars')) {\r\n return JSON.parse(sessionStorage.getItem('bnp_dealerVars'));\r\n } else {\r\n //console.log('something went wrong with DealerVars')\r\n return null;\r\n }\r\n }\r\n \r\n // TODO : move to utils class\r\n shallowClone(obj) {\r\n return Object.create(\r\n Object.getPrototypeOf(obj),\r\n Object.getOwnPropertyDescriptors(obj)\r\n );\r\n }\r\n\r\n /*\r\n * This has been added as a patch as the use state doesnt reflect update the object correctly in its memory reference\r\n */\r\n getInstance() {\r\n return this.shallowClone(this);\r\n }\r\n\r\n /**\r\n * is province allowed to include EV rebates\r\n * @returns {boolean}\r\n */\r\n isProvinceAllowedToIncludeRebates() {\r\n const province = getProvince();\r\n switch(province) {\r\n case \"BC\":\r\n case \"AB\":\r\n case \"SK\":\r\n case \"MB\":\r\n case \"ON\":\r\n case \"QC\":\r\n //return true; // RECOMMENTED AS PER TICKET WTCANMAZDAINT-4030\r\n case \"NB\":\r\n case \"NS\":\r\n case \"PE\":\r\n case \"NL\":\r\n case \"YT\":\r\n case \"NT\":\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Return if the financed EV is taxable in that province\r\n */\r\n hasEvFinancingTaxes(province) {\r\n console.log(\"hasEvFinancingTaxes province\", province);\r\n\r\n switch (province) {\r\n case \"QC\":\r\n return false;\r\n case \"BC\":\r\n default:\r\n return true;\r\n }\r\n } \r\n \r\n isSelectionPreOrder() {\r\n let isPreOrder = false;\r\n\r\n if( !this.SelectedModel || !this.SelectedPackage )\r\n return isPreOrder;\r\n\r\n const model_code = this.SelectedModel.model_code;\r\n const option_code = this.SelectedPackage.option_code;\r\n\r\n if(window.preOrder) {\r\n window.preOrder.forEach((item) => {\r\n if (item.modelCode === model_code && item.modelOption === option_code) {\r\n isPreOrder = true;\r\n } \r\n });\r\n }\r\n\r\n return isPreOrder;\r\n }\r\n\r\n async forceReloadVehicle(value) {\r\n //this._needReload = value\r\n\r\n if (this.selectedVehicle.carline) {\r\n // Trigger the whole vehicle reload\r\n await this.loadVehicleData(this.selectedVehicle.year, \r\n this.selectedVehicle.carline, \r\n this.selectedVehicle.trim, \r\n this.selectedVehicle.model, \r\n this.selectedVehicle.packageCode);\r\n\r\n await this.loadFromFinancialProvider();\r\n\r\n // Force the reset\r\n window.SummaryCalculator = this;\r\n }\r\n }\r\n}\r\n","import React, { useEffect } from 'react'\r\nimport PropTypes from 'prop-types'\r\nimport SummaryCalculator from './summarycalculator';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport Cookies from 'universal-cookie';\r\n\r\n// Load build data by build id and redirect to Summary page.\r\nfunction BuildHelper({ buildId }) {\r\n //const navigate = useNavigate();\r\n const cookies = new Cookies();\r\n\r\n useEffect(() => {\r\n // Load build data if \"build\" param is passed.\r\n const loadPreBuildData = async (buildId) => {\r\n try {\r\n const summaryCalculator = new SummaryCalculator();\r\n summaryCalculator.reset(true);\r\n\t\t sessionStorage.clear();\r\n const data = await summaryCalculator.loadVehicleDataByBuildId(buildId);\r\n if (data) {\r\n const { year, carline, trim, modelCode, optionCode, province } = data;\r\n\r\n if (province !== sessionStorage.getItem('province')) {\r\n // mdp7-pref\r\n console.log(`setting the mdp7-pref to p=${province}`);\r\n cookies.remove('mdp7-pref');\r\n cookies.set('mdp7-pref' ,`p=${province}`, {\r\n path: '/',\r\n encode: String\r\n });\r\n sessionStorage.setItem('province', province);\r\n window.location.reload();\r\n }\r\n\r\n const navigateUrl = `${window.origin}${window.location.pathname}#/${year}/${carline}/${trim}/${modelCode}/${optionCode}/summary`;\r\n window.location.href = navigateUrl;\r\n return false;\r\n }\r\n console.log('failed to retrieve vehicle data from build id ', buildId);\r\n const navigateUrl = `${window.origin}${window.location.pathname}#/`;\r\n window.location.href = navigateUrl;\r\n return false;\r\n } catch (err) {\r\n console.log(err);\r\n }\r\n }\r\n\r\n loadPreBuildData(buildId);\r\n }, [])\r\n\r\n return <div className=\"mz-spinner\">LOADING ...</div>;\r\n}\r\n\r\nBuildHelper.propTypes = {\r\n buildId: PropTypes.string.isRequired\r\n}\r\n\r\nexport default BuildHelper","import ReactHtmlParser from 'react-html-parser';\r\nimport { getLang, getProvince } from '../utils';\r\n\r\nexport default class NavHelper {\r\n\tgetDealerId() {\r\n\t\t//summaryCalculator.getDealerVars() ? summaryCalculator.getDealerVars().dealerId : null;\r\n\t\tif (window.bnp_retailer_mode && sessionStorage.getItem('bnp_dealerVars')) {\r\n\t\t\tconst dealerVars = JSON.parse(sessionStorage.getItem('bnp_dealerVars'));\r\n\t\t\treturn dealerVars.dealerId;\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t}\r\n\tgetUrlSlug(returnDef) {\r\n\t\tlet summaryCalculator = window.summaryCalculator;\r\n\r\n\t\tconst year = returnDef ? '' : summaryCalculator.selectedVehicle.year;\r\n\t\tconst carline = returnDef ? '' : summaryCalculator.selectedVehicle.carline;\r\n\t\tconst trim = returnDef ? '' : summaryCalculator.selectedVehicle.trim ?? summaryCalculator.AvailableTrim.trims[0].trim_type.url_slug;\r\n\t\tconst dealerId = this.getDealerId();\r\n\t\tlet model = '';\r\n\t\tlet packageCode = '';\r\n\t\t\r\n\t\tmodel = summaryCalculator.selectedVehicle.model === null ? '' : summaryCalculator.selectedVehicle.model;\r\n\t\t//model = model === '' ? summaryCalculator.AvailableTrim.trims[0].financial.based_on.model_code : '';\r\n\r\n\t\tpackageCode = summaryCalculator.selectedVehicle.packageCode === null ? '' : summaryCalculator.selectedVehicle.packageCode;\r\n\t\t//packageCode = packageCode === '' ? summaryCalculator.selectedVehicle.packageCode : '';\r\n\r\n\t\t//return `/${year}/${carline}?prov_code=${province}&lang_code=${lang}`; // trim\r\n\t\treturn `/${year}/${carline}/${trim}?prov_code=${getProvince()}&lang_code=${getLang()}${dealerId ? `&DealerID=${dealerId}` : ''}`; // engine and drivetrain\r\n\t\treturn `/${year}/${carline}/${trim}/${model}/${packageCode}?prov_code=${getProvince()}&lang_code=${getLang()}`; // package\r\n\t}\r\n\tgetNavContent( t, returnDef){\r\n\t\tlet summaryCalculator = window.summaryCalculator;\r\n\r\n\t\tconst currentStep = returnDef ? '' : summaryCalculator.CurrentStep;\r\n\t\tconst year = returnDef ? '' : summaryCalculator.selectedVehicle.year;\r\n\t\tconst carline = returnDef ? '' : summaryCalculator.selectedVehicle.carline;\r\n\t\tconst trim = returnDef ? '' : summaryCalculator.selectedVehicle.trim ?? summaryCalculator.AvailableTrim.trims[0].trim_type.url_slug;\r\n\r\n\t\tlet model = '';\r\n\t\tlet packageCode = '';\r\n\t\t\r\n\t\tmodel = summaryCalculator.selectedVehicle.model === null ? '' : summaryCalculator.selectedVehicle.model;\r\n\t\t//model = model === '' ? summaryCalculator.AvailableTrim.trims[0].financial.based_on.model_code : '';\r\n\r\n\t\tpackageCode = summaryCalculator.selectedVehicle.packageCode === null ? '' : summaryCalculator.selectedVehicle.packageCode;\r\n\t\t//packageCode = packageCode === '' ? summaryCalculator.selectedVehicle.packageCode : '';\r\n\r\n\t\tconst province = getProvince();\r\n\t\tconst lang = getLang();\r\n\t\tconst dealerId = this.getDealerId();\r\n\t\t\r\n\t\tconst navTranslation = [\r\n\t\t\t\"general:nav_trim\",\r\n\t\t\t\"general:nav_options\",\r\n\t \"general:nav_colour\",\r\n\t\t\t\"general:nav_wheels\",\r\n\t\t\t\"general:nav_connectivity\",\r\n\t\t\t\"general:nav_accessories\",\r\n\t\t\t\"general:nav_protection\",\r\n\t \"general:nav_payments\",\r\n\t \"general:nav_summary\",\r\n\t \"general:nav_start_over\",\r\n\t \"general:nav_start_over_mobile\"\r\n\t ];\r\n\t\tconst tabs = {\r\n\t\t\t'tabList': [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"text\": ReactHtmlParser(t(navTranslation[0])),\r\n\t\t\t\t\t\"active\": currentStep === 1,\r\n\t\t\t\t\t\"uri\": `/${year}/${carline}?prov_code=${province}&lang_code=${lang}${dealerId ? `&DealerID=${dealerId}` : ''}`\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"text\": ReactHtmlParser(t(navTranslation[1])),\r\n\t\t\t\t\t\"active\": currentStep === 2,\r\n\t\t\t\t\t\"uri\": this.getUrlSlug(returnDef)\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"text\": ReactHtmlParser(t(navTranslation[2])),\r\n\t\t\t\t\t\"active\": currentStep === 3,\r\n\t\t\t\t\t\"uri\": `/${year}/${carline}/${trim}/${model}/${packageCode}/colours?prov_code=${province}&lang_code=${lang}${dealerId ? `&DealerID=${dealerId}` : ''}`\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"text\": ReactHtmlParser(t(navTranslation[3])),\r\n\t\t\t\t\t\"active\": currentStep === 4,\r\n\t\t\t\t\t\"uri\": `/${year}/${carline}/${trim}/${model}/${packageCode}/wheels?prov_code=${province}&lang_code=${lang}${dealerId ? `&DealerID=${dealerId}` : ''}`\r\n\t\t\t\t},\r\n/*\t\t\t\t{\r\n\t\t\t\t\t\"text\": ReactHtmlParser(t(navTranslation[4])),\r\n\t\t\t\t\t\"active\": currentStep === 5,\r\n\t\t\t\t\t\"uri\": `/${year}/${carline}/${trim}/${model}/${packageCode}/connectivity?prov_code=${province}&lang_code=${lang}`\r\n\t\t\t\t},*/\r\n\t\t\t\t{\r\n\t\t\t\t\t\"text\": ReactHtmlParser(t(navTranslation[5])),\r\n\t\t\t\t\t\"active\": currentStep === 6,\r\n\t\t\t\t\t\"uri\": `/${year}/${carline}/${trim}/${model}/${packageCode}/accessories?prov_code=${province}&lang_code=${lang}${dealerId ? `&DealerID=${dealerId}` : ''}`\r\n\t\t\t\t},\r\n/*\t\t\t\t{\r\n\t\t\t\t\t\"text\": ReactHtmlParser(t(navTranslation[6])),\r\n\t\t\t\t\t\"active\": currentStep === 7,\r\n\t\t\t\t\t\"uri\": `/${year}/${carline}/${trim}/${model}/${packageCode}/protections?prov_code=${province}&lang_code=${lang}`\r\n\t\t\t\t},*/\r\n\t\t\t\t{\r\n\t\t\t\t\t\"text\": ReactHtmlParser(t(navTranslation[7])),\r\n\t\t\t\t\t\"active\": currentStep === 8,\r\n\t\t\t\t\t\"uri\": `/${year}/${carline}/${trim}/${model}/${packageCode}/payments?prov_code=${province}&lang_code=${lang}${dealerId ? `&DealerID=${dealerId}` : ''}`\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"text\": ReactHtmlParser(t(navTranslation[8])),\r\n\t\t\t\t\t\"active\": currentStep === 9,\r\n\t\t\t\t\t\"uri\": `/${year}/${carline}/${trim}/${model}/${packageCode}/summary?prov_code=${province}&lang_code=${lang}${dealerId ? `&DealerID=${dealerId}` : ''}`\r\n\t\t\t\t},\r\n\t\t\t],\r\n\r\n\t\t\t\"selectVehiclesLinkLink\": {\r\n\t\t\t\t\"textDesktop\": t(navTranslation[9]),\r\n\t\t\t\t\"textMobile\": t(navTranslation[9]),\r\n\t\t\t\t\"uri\": `/${dealerId ? `&DealerID=${dealerId}` : ''}`\r\n\t\t\t}\r\n\r\n\t\t}\r\n\t\treturn tabs;\r\n\t}\r\n}","\r\n// Open a modal.\r\nexport const openModal = (targetId, content) => {\r\n const modal = document.getElementById(targetId);\r\n if (modal) {\r\n modal.setAttribute('aria-hidden', 'false');\r\n // Focus the first element within the modal.\r\n const focusable_selectors = 'a[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), *[tabindex]';\r\n modal.querySelector(focusable_selectors).focus();\r\n // Make the body unscrollable.\r\n document.body.classList.add('disabled');\r\n }\r\n}\r\n\r\n// Scroll to element using gsap (loaded in Core)\r\nexport const scrollTo = (options) => {\r\n if (window.gsap) {\r\n window.gsap.to(window, {\r\n duration: .5,\r\n scrollTo: options\r\n });\r\n } else {\r\n console.error('gsap is not found in scrollTo()');\r\n }\r\n}\r\n\r\n// Convert text to title case.\r\nexport const titleCase = (str) => {\r\n if (!str) return;\r\n return str.toLowerCase().split(' ').map(function(word) {\r\n return (word.charAt(0).toUpperCase() + word.slice(1));\r\n }).join(' ');\r\n}\r\n","import React from 'react';\r\n\r\nexport const Svg = ({ size, colour, svg_list, svg_classname, ...props }) => {\r\n const svgColour = colour != undefined ? `mz-svg--${colour}` : null;\r\n \r\n return (\r\n <i style={{'fontSize': (size) + 'rem'}} className={['mz-svg', svgColour, `mz-svg-${svg_list}`].join(' ')}></i>\r\n );\r\n};","/* global mzFunc, mzMenu, mzTabs */\r\n\r\nimport React from 'react';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport PropTypes from 'prop-types';\r\nimport { useNavigate, useParams, useSearchParams } from 'react-router-dom';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport NavHelper from '../../../Helpers/navhelper';\r\nimport { openModal, scrollTo } from '../../../Helpers/helpers';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nimport { Svg } from '../../1_Atoms/Svg/Svg';\r\nimport { updateLanguageLink } from '../../../utils';\r\n\r\nexport const Nav = ({ summaryCalculator = window.summaryCalculator, nav, ...props }) => {\r\n const { t, i18n } = useTranslation(['general', 'summary']);\r\n\r\n const { year, carline, trim, model, packageCode } = useParams();\r\n const [showFinancePrice, setShowFinancePrice] = React.useState(summaryCalculator.ShowFinancePrice);\r\n \r\n const gtmHelper = new GTMHelper();\r\n \r\n const navHelper = new NavHelper();\r\n const [step, setStep] = React.useState(summaryCalculator.CurrentStep)\r\n const [isOpen, setIsOpen] = React.useState(false);\r\n const [tabs, setTabs] = React.useState(nav != null ? nav.tabList : navHelper.getNavContent(t, true).tabList);\r\n const [activeTab, setActiveTab] = React.useState(tabs ?.filter(tab => tab.active === true)[0]);\r\n const [isMobile, setIsMobile] = React.useState(window.innerWidth < 1024);\r\n const navRef = React.useRef(null);\r\n const navigate = useNavigate();\r\n const [searchParams, setSearchParams] = useSearchParams();\r\n\r\n React.useEffect(() => {\r\n try {\r\n // When Nav is re-mounted, run sticky submenu init function in Core\r\n // unless it's already processed by Core/menu.js .\r\n const isStickySubmenuProcessed = navRef.current.classList.contains('js-processed');\r\n if (!isStickySubmenuProcessed) {\r\n if (window.mzMenu && window.mzMenu.triggerStickySubmenu !== undefined) {\r\n window.mzMenu.triggerStickySubmenu();\r\n }\r\n }\r\n } catch (err) {\r\n console.error(err)\r\n }\r\n if(typeof mzFunc === 'object' && typeof mzTabs === 'object'){\r\n mzFunc.waitForEl('.mzBuildandPrice nav .mz-tabs').then(function(components){\r\n mzTabs.init(components);\r\n setTimeout(()=>{\r\n const subNav = document.querySelector('.App-container nav .mz-tabs-menu')\r\n if(subNav)\r\n mzTabs.adjustActiveTabPosition(subNav, subNav.querySelector('.active'));\r\n },500)\r\n });\r\n }\r\n reloadTabs();\r\n }, [nav])\r\n\r\n function reloadTabs() {\r\n //console.log('load data', nav)\r\n //if(summaryCalculator._allDataIsLoaded) setNav(navHelper.getNavContent(t)); // nav from parameter\r\n setTabs(nav != null ? nav.tabList : navHelper.getNavContent(t, true).tabList);\r\n setStep(summaryCalculator.CurrentStep);\r\n }\r\n\r\n\r\n React.useEffect(() => {\r\n reloadTabs();\r\n }, [summaryCalculator._allDataIsLoaded])\r\n\r\n React.useEffect(() => {\r\n reloadTabs();\r\n if(typeof mzMenu === 'object' && window.scrollY === 0){\r\n mzMenu.alertAni?.play();\r\n mzMenu.permAlertAni?.play();\r\n mzMenu.menuAni?.play();\r\n }\r\n //updateLanguageLink();\r\n }, [summaryCalculator.CurrentStep])\r\n\r\n function showNav() {\r\n //const selectVehiclesLinkLink = tabs;\r\n updateLanguageLink();\r\n \r\n const handleTabClick = (tabIndex) => {\r\n tabs.map(function (tab, index) {\r\n if (index === tabIndex) {\r\n tab.active = true;\r\n\r\n\r\n } else {\r\n tab.active = false;\r\n }\r\n return tab;\r\n });\r\n\r\n setTabs(tabs);\r\n setActiveTab(tabs.filter(tab => tab.active === true)[0]);\r\n if (isMobile) {\r\n if (isOpen) {\r\n setIsOpen(false);\r\n document.querySelector('body').classList.remove('disabled');\r\n } else {\r\n setIsOpen(true);\r\n document.querySelector('body').classList.add('disabled');\r\n }\r\n }\r\n\r\n if (tabs[tabIndex])\r\n navigate(tabs[tabIndex].uri);\r\n else // Gracefully recover to home /\r\n navigate('/');\r\n \r\n //HandleTabClick(tabs[tabIndex].uri)\r\n }\r\n const HandleClose = () => {\r\n setIsOpen(false);\r\n document.querySelector('body').classList.remove('disabled');\r\n }\r\n const handleResize = () => {\r\n setIsMobile(window.innerWidth < 1024);\r\n setIsOpen(false);\r\n document.querySelector('body').classList.remove('disabled');\r\n }\r\n\r\n window.addEventListener('resize', handleResize)\r\n\r\n const getCurrentActiveTabIndex = (tabs, activeTab) => {\r\n if (!tabs && !tabs.length > 0) return 0;\r\n return tabs.indexOf(activeTab) + 1;\r\n }\r\n\r\n function HandleSelectAVehicleClick(e) {\r\n e.preventDefault();\r\n document.querySelector('body').classList.remove('disabled');\r\n navigate(nav.selectVehiclesLinkLink.uri);\r\n }\r\n\r\n const handleOcaClick = (e) => {\r\n e.preventDefault();\r\n setIsOpen(false);\r\n document.querySelector('body').classList.remove('disabled');\r\n \r\n if (window.location.href.indexOf('/payments') > 0) {\r\n setSearchParams({'oca':''});\r\n setTimeout(() => {\r\n setSearchParams({'oca':'1'});\r\n }, 10);\r\n }else{\r\n navigate(nav.tabList[6].uri + '&oca=1');\r\n }\r\n const price = summaryCalculator._showFinancePrice ? summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceWithFeesWithRebatesTaxed : summaryCalculator.FinancialInfo.calculatedLease.balanceToLeaseWithFeesWithRebatesTaxed;\r\n gtmHelper.setGTM({'action':`OCA - Mobile Nav`,'year': year,'model': carline, 'trim': summaryCalculator.selectedVehicle.trim ?? summaryCalculator.AvailableTrim.trims[0].trim_type.url_slug, 'price' : Math.round(price)}, true, false);\r\n }\r\n\r\n return (\r\n <nav\r\n className={isOpen ? 'mz-navigation mz-sticky-submenu mz-navigation__open' : 'mz-navigation mz-sticky-submenu'}\r\n ref={navRef}\r\n {...props}\r\n >\r\n <div className=\"mz-container mz-navigation__wrapper\">\r\n <div className=\"mz-full-width mz-navigation__inner\">\r\n <div className=\"mz-navigation__reload\">\r\n <a className=\"mz-navigation__reload-link\" onClick={(e) => {\r\n HandleSelectAVehicleClick(e);\r\n }} >\r\n <Svg\r\n colour=\"grey\"\r\n size={1.3}\r\n svg_list=\"refresharrow\"\r\n />\r\n <span className=\"mz-navigation__reload-text\" onClick={(e) => {\r\n HandleSelectAVehicleClick(e);\r\n }}>{nav !== null ? nav.selectVehiclesLinkLink.textDesktop : navHelper.getNavContent(t, true).selectVehiclesLinkLink.textDesktop}</span>\r\n </a>\r\n </div>\r\n {!isMobile &&\r\n <>\r\n <div className=\"mz-tabs\">\r\n <div className=\"mz-tabs-menu\">\r\n <div className=\"mz-tabs-menu-container\">\r\n <div className=\"mz-tabs-menu-inner\">\r\n {tabs.map((tab, index) => {\r\n return (<a key={index} role=\"tab\" className={tab.active ? \"mz-tabs-tab active nav--sm\" : \"mz-tabs-tab nav--sm\"} onClick={() => handleTabClick(index)}>\r\n {tab.text}\r\n </a>)\r\n })}\r\n </div>\r\n <div className=\"mz-tabs-menu--left\"><i className=\"mz-svg mz-svg--grey mz-svg-chevron mz-svg--rotate180\"></i></div>\r\n <div className=\"mz-tabs-menu--right\"><i className=\"mz-svg mz-svg--grey mz-svg-chevron\"></i></div>\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n }\r\n\r\n {isMobile &&\r\n <><li role=\"tab\" className=\"mz-navigation__navlist-tab mz-navigation__navlist-tab-close\" onClick={() => HandleClose()}>\r\n {t(\"close\")}\r\n <Svg\r\n colour=\"black\"\r\n size={1}\r\n svg_list=\"chevron_small\"\r\n />\r\n </li>\r\n \r\n <ul className=\"mz-navigation__navlist\">\r\n <li role=\"tab\" className=\"mz-navigation__navlist-tab mz-navigation__navlist-tab-select-vehicle\" onClick={(e) => HandleSelectAVehicleClick(e)}>{nav ?.selectVehiclesLinkLink ?.textMobile}\r\n </li>\r\n {tabs.map((tab, index) => {\r\n return (<li key={index} role=\"tab\" className={tab.active ? \"mz-navigation__navlist-tab mz-navigation__navlist-tab-selected\" : \"mz-navigation__navlist-tab\"} onClick={() => handleTabClick(index)}>\r\n {tab.text}\r\n {tab.active ? <Svg\r\n colour=\"black\"\r\n size={1}\r\n svg_list=\"chevron_small\"\r\n /> : null}\r\n </li>);\r\n })\r\n }\r\n {window.allow_oca ?\r\n <li className=\"mz-navigation__oca-tab\" onClick={(e) => handleOcaClick(e)} title={t('summary:btn_apply_for_financing')}>\r\n <div>\r\n <Svg\r\n colour=\"grey\"\r\n size={1.2}\r\n svg_list=\"applytofinance\"\r\n />\r\n <span>{ReactHtmlParser(t('general:ocaPriceBar'))}</span>\r\n </div>\r\n </li>: null}\r\n </ul>\r\n </>}\r\n </div>\r\n <div className=\"mz-navigation__progress\">\r\n <div style={{ width: `${(getCurrentActiveTabIndex(tabs, activeTab) / nav ?.tabList ?.length) * 100}%` }}></div>\r\n </div>\r\n </div>\r\n </nav>\r\n );\r\n\r\n }\r\n return (<>{showNav()}</>)\r\n};\r\n\r\n// Nav.propTypes = {\r\n// HandleTabClick: PropTypes.func,\r\n// }\r\n\r\n// Nav.defaultProps = {\r\n// HandleTabClick: (uri) => {\r\n// },\r\n// };","import React from 'react';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { Svg } from '../../1_Atoms/Svg/Svg';\r\nimport PropTypes from 'prop-types';\r\n\r\nexport const Modal = ({modalContent, isOpen, modalId, handleClose, ...props }) => {\r\n const [isModalOpen, setIsModalOpen] = React.useState(isOpen);\r\n return (\r\n <div className=\"mz-modal modal\" id={modalId} aria-hidden={!isOpen}>\r\n <div className=\"wrapper\">\r\n <div className=\"mz-modal__container\">\r\n <div className=\"mz-modal__content\">\r\n <button className=\"mz-modal__close\" aria-label=\"Close Modal\" onClick={() => {\r\n\t\t\t\t\t\t\tdocument.querySelector('body').classList.remove('disabled');\r\n\t\t\t\t\t\t\thandleClose(false)\r\n\t\t\t\t\t\t}}>\r\n <Svg\r\n colour=\"grey\"\r\n size={1.93}\r\n svg_list=\"x\"\r\n />\r\n </button>\r\n <div className=\"mz-modal__text-container\">\r\n { ReactHtmlParser (modalContent) }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nModal.propTypes = {\r\n HandleTabClick: PropTypes.func,\r\n}\r\n\r\nModal.defaultProps = {\r\n handleClose: () => {\r\n },\r\n};","import React from 'react';\r\nimport { Svg } from '../Svg/Svg';\r\nimport PropTypes from 'prop-types';\r\n\r\nexport const Button = ({ primary, backgroundColor, label, disabled, icon, iconBefore, iconAfter, svg_className, colour, rotation, size, svg_list, ...props }) => {\r\n const mode = primary ? 'mz-btn--primary' : 'mz-btn--secondary';\r\n const disabling = disabled ? true : false;\r\n const before = iconBefore ? true : false;\r\n const after = iconAfter ? true : false;\r\n const displayIcon = icon ? true : false;\r\n // const iconBtn = icon ? true : false;\r\n //mz-link-icon-positon--right\r\n \r\n const btnBackground = backgroundColor != undefined ? `mz-btn--${backgroundColor}` : null ;\r\n return (\r\n <button\r\n type=\"button\"\r\n className={['mz-btn', btnBackground, mode].join(' ')}\r\n disabled={disabling}\r\n\r\n {...props}\r\n > \r\n <span className={displayIcon && before ? 'mz-link-icon-positon--left' : displayIcon && after ? 'mz-link-icon-positon--right': null}>\r\n {displayIcon && before \r\n ? <Svg \r\n colour={colour}\r\n rotation={rotation}\r\n size={size}\r\n svg_list={svg_list}\r\n /> : ''}\r\n {label}\r\n {displayIcon && after \r\n ? <Svg \r\n colour={colour}\r\n rotation={rotation}\r\n size={size}\r\n svg_list={svg_list}\r\n /> : ''}\r\n </span>\r\n \r\n </button>\r\n );\r\n};\r\n\r\nButton.propTypes = {\r\n primary: PropTypes.bool,\r\n backgroundColor: PropTypes.string,\r\n icon: PropTypes.bool,\r\n iconBefore: PropTypes.bool,\r\n iconAfter: PropTypes.bool,\r\n label: PropTypes.string.isRequired,\r\n onClick: PropTypes.func,\r\n colour: PropTypes.string,\r\n size: PropTypes.number,\r\n svg_list: PropTypes.string,\r\n};\r\n \r\nButton.defaultProps = {\r\n backgroundColor: null,\r\n icon: false,\r\n iconBefore: false,\r\n iconAfter: false,\r\n primary: true,\r\n onClick: undefined,\r\n disabled: false,\r\n};\r\n \r\n \r\nexport default Button;","import React, { useEffect, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\n// Tabs that has the same HTML as the CORE's tabs\r\n// to use JS attached to it in Core.\r\nexport const TabsMenu = ({ className, menus }) => {\r\n const ref = useRef(null)\r\n\tconst { t, i18n } = useTranslation(['general']);\r\n\r\n\tlet menuItems = menus;\r\n menuItems.sort(function(x,y){ return x.label == 'Popular' ? -1 : y.label == 'Popular' ? 1 : 0; });\r\n\r\n useEffect(() => {\r\n // Init the tabs using mzTabs.init() from Core.\r\n if (window.mzTabs && typeof window.mzTabs.init === 'function') {\r\n if (ref.current) {\r\n window.mzTabs.init([ref.current]);\r\n }\r\n }\r\n }, [])\r\n\r\n\tfor (let v of menuItems){\r\n\t\tif(v.label === 'Popular') v.label=t('popular');\r\n\t\tif(v.label === 'All') v.label=t('all');\r\n\t}\r\n\r\n return (\r\n <div className={`mz-tabs ${className}`} ref={ref}>\r\n <div className=\"mz-tabs-menu\">\r\n <div className=\"mz-tabs-menu-container\">\r\n <div className=\"mz-tabs-menu-inner\">\r\n {\r\n menuItems.map((menu) => (\r\n <a\r\n key={menu.id}\r\n className={`mz-tabs-tab interactive ${menu['isactive'] ==='true' ? 'active' : ''}`}\r\n {...menu}\r\n >\r\n {menu.label}\r\n </a>\r\n ))\r\n }\r\n </div>\r\n </div>\r\n <div className=\"mz-tabs-menu--left\"><i className=\"mz-svg mz-svg--grey mz-svg-chevroncarousel mz-svg--rotate180\"></i></div>\r\n <div className=\"mz-tabs-menu--right\"><i className=\"mz-svg mz-svg--grey mz-svg-chevroncarousel\"></i></div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nTabsMenu.propTypes = {\r\n menus: PropTypes.array.isRequired,\r\n className: PropTypes.string,\r\n}","import React from 'react';\r\nimport ReactHtmlParser from 'react-html-parser'; \r\nimport { Svg } from '../../1_Atoms/Svg/Svg';\r\nimport { getBaseUrl } from '../../../utils';\r\n\r\nexport const Modal_50_50 = ({title, copy, image, imageMobile, imageAlt, isOpen, modalId, setIsModalOpen, ...props }) => {\r\n const [modalImage, setModalImage] = React.useState(window.innerWidth < 768?imageMobile:image);\r\n const imagePath = getBaseUrl() + process.env.REACT_APP_BASIC_CONTENT_PATH;\r\n const handleResize = () =>{\r\n if(window.innerWidth < 768){\r\n setModalImage(imageMobile);\r\n } else {\r\n setModalImage(image);\r\n }\r\n }\r\n window.addEventListener('resize', handleResize);\r\n \r\n return (\r\n <div className=\"mz-modal mz-modal--non-sticky-top mz-modal-fifty-fifty\" id={modalId} aria-hidden={!isOpen}>\r\n <div className=\"mz-modal__inner mz-container\">\r\n <div className=\"mz-modal__wrapper mz-full-width\">\r\n <div className=\"mz-modal__close\">\r\n <button\r\n className=\"mz-modal-close-button reset\"\r\n aria-label=\"Close Modal\"\r\n onClick={() => {\r\n document.querySelector('html').classList.remove('inactive');\r\n setIsModalOpen(false)\r\n }}\r\n >\r\n <Svg\r\n colour=\"grey\"\r\n size={1.875}\r\n svg_list=\"x\"\r\n />\r\n </button>\r\n </div>\r\n <div className=\"mz-modal__content\">\r\n <div className=\"mz-5050\">\r\n <div className=\"mz-container unconstrained mz-5050-container full-width no-gutter-between-cols\">\r\n <div className=\"mz-5050-left mz-5050-content\">\r\n <div className=\"mz-image-nolazy mz-image\">\r\n <img src={`${imagePath}/accessories/${image}`} alt={imageAlt}/>\r\n </div>\r\n </div>\r\n <div className=\"mz-5050-right mz-5050-content\">\r\n <div className=\"mz-5050-text-wrapper text--left\">\r\n <h3 className=\"mz-5050__title\">{title}</h3>\r\n <div className=\"paragraph\">{ ReactHtmlParser (copy) }</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default Modal_50_50;","import ReactHtmlParser from 'react-html-parser';\r\nimport { getLang } from '../utils';\r\n\r\nexport default class TooltipHelper {\r\n getTooltip(tooltip, incentives, vehicle, rate) {\r\n const language = getLang();\r\n\r\n const tooltips = {\r\n\t\t\t\"purchase_price\":{\r\n\t\t \"en\":`Price shown includes delivery charges (charge includes freight and pre-delivery inspection), dealer administration fee, levies, fees, and all applicable charges (excluding HST and/or GST/PST). Payments shown do not include applicable taxes. To see the vehicle’s total price or payments with sales tax, please click “include taxes in price option†in the payment breakdown or summary page. Charges may vary by Dealer. Please contact your <a href=\"/en/shopping/find-a-retailer/\">local retailer</a> for more information.`,\r\n\t\t \"fr\":`Le prix indiqué comprend les frais de livraison (pour le transport et l’inspection avant livraison), les frais de gestion du détaillant, les redevances, les droits et tous les frais applicables (à l’exception de la TVH et/ou de la TPS/TVP). Les versements indiqués ne comprennent pas les taxes applicables. Pour voir le prix total du véhicule ou les versements incluant la taxe de vente, veuillez cliquer sur l’option « Inclure les taxes dans le prix » sur la page des détails du prix ou du récapitulatif. Les frais peuvent varier selon le détaillant. Veuillez contacter <a href=\"/fr/shopping/Trouver-un-concessionnaire/\">votre détaillant</a> pour plus d’informations.`\r\n\t\t },\r\n\t\t \"downpayment\":{\r\n\t\t \"en\":\"Lease down payment (with trade-in) may not reduce Capitalized Cost lower than $3,000 over Residual Value. Minimum balance to finance is $7,500.\",\r\n\t\t \"fr\":\"Pour une location (avec échange), l'acompte ne peut réduire le coût en capital plus bas que <span class=nowrap>3 000 $</span> au-dessus de la valeur résiduelle. Le solde minimum à financer est de 7 500 $.\"\r\n\t\t },\r\n\t\t\t\"detailedprice_mazdaprice\":{\r\n\t\t\t \"en\":\"This is the price of your vehicle. It includes any chosen options, plus any accessories you have selected. It excludes fees, levies, credits, down payment and taxes. This price is for informational purposes only and is not an offer. Certain changes (including specifications, prices and availability) may not be reflected. Price will include general freight (cost to move vehicle from factory to dealership) and PDI (Pre-Delivery Inspection - this includes inspection, washes and any top-ups of fluids). Your Mazda retailer may sell for less and is the best source for complete and current information.\",\r\n\t\t\t \"fr\":\"Il s'agit du prix de votre véhicule incluant les options choisies ainsi que les accessoires que vous avez sélectionnés. Il exclut les frais, les prélèvements, les crédits, l'acompte et les taxes. Ce prix est fourni à titre d'information seulement et ne constitue pas une offre. Certains changements (incluant les spécifications, les prix et la disponibilité) peuvent ne pas être reflétés. Le prix comprend les coûts de transport du véhicule de l'usine au détaillant et l'inspection prélivraison (incluant l'inspection finale, les lavages et les remplissages de liquides). Votre détaillant Mazda peut vendre à un prix inférieur et constitue la meilleure source d'information complète et à jour.\"\r\n\t\t },\r\n\t\t \"detailedprice_feesandlevies\":{\r\n\t\t\t\t\"en\":\"These are some of the fees and levies charged by Mazda and other regulators associated with your vehicle purchase. Your local retailer may charge additional fees, insurance, licence, sales taxes and, if applicable, lien registration as well as other fees and are not included.\",\r\n\t\t\t\t\"fr\":\"Il s'agit de certains des frais et prélèvements facturés par Mazda et d'autre organismes de réglementation associés à l'achat de votre véhicule. Votre détaillant pourrait exiger des frais supplémentaires. L'assurance, l'immatriculation, les taxes de vente et, le cas échéant, l'enregistrement de privilège ainsi que d'autres frais ne sont pas inclus.\"\t\t\t \r\n\t\t\t},\r\n\t\t\t\"detailedprice_taxes\":{\r\n\t\t\t \"en\":`Applicable sales tax included in the payment breakdown or summary are based on your location selection. Applicable taxes may vary. Please contact your <a href=\"/en/shopping/find-a-retailer/\">local retailer</a> for more information.`,\r\n\t\t\t \"fr\":`Les taxes de vente applicables incluses dans les détails du prix ou le récapitulatif varient selon l’emplacement sélectionné. Les taxes applicables peuvent varier. Veuillez contacter <a href=\"/fr/shopping/Trouver-un-concessionnaire/\">votre détaillant</a> pour plus d’informations.`\r\n\t\t\t},\r\n\t\t\t\"detailedprice_credit\":{\r\n\t\t\t \"en\":\"Amounts in this section contribute to reducing the purchase price of your vehicle. Additionally, when you trade in a vehicle, you will receive a tax benefit as the amount you receive for your trade-in is used to reduce the purchase price before sales tax is applied.\",\r\n\t\t\t \"fr\":\"Les montants indiqués dans cette section contribuent à réduire le prix d'achat de votre véhicule. De plus, lorsque vous échangez un véhicule, vous bénéficiez d'un avantage fiscal, dans la mesure où le montant que vous recevez en échange de votre véhicule est utilisé pour réduire le prix d'achat avant l'application de la taxe de vente.\"\r\n\t\t\t},\r\n\t\t\t\"detailedprice_downpayment\":{\r\n\t\t\t \"en\":\"A down payment is the money you can choose to pay up front that will reduce the amount of money borrowed on a lease or finance purchase. The larger the down payment, the lower your individual payments will be.\",\r\n\t\t\t \"fr\":\"Un acompte est une somme d'argent que vous pouvez choisir de payer à l'avance et qui réduira le montant de l'argent emprunté pour une location ou un achat financé. Plus le montant de l'acompte est élevé, plus vos paiements individuels seront bas.\"\r\n\t\t },\r\n\t\t \"ev_rebate_federal\":{\r\n\t\t\t \"en\": `Federal Rebate: <a href=\"https://tc.canada.ca/en/road-transportation/innovative-technologies/zero-emission-vehicles/incentives-purchasing-zero-emission-vehicles\" target=\"_blank\">Incentives for Zero-Emission Vehicles Program (iZEV)</a>: Get up to ${incentives} towards the purchase of new ${vehicle}.`,\r\n\t\t\t \"fr\": `Rabais du gouvernement fédéral : <a href=\"https://tc.canada.ca/fr/transport-routier/technologies-novatrices/vehicules-zero-emission/incitatifs-achat-vehicules-zero-emission\" target=\"_blank\">Incitatif pour le programme des véhicules zéro émissions (IVZE)</a> : Obtenez jusqu'à ${incentives} pour l'achat d'un nouveau ${vehicle}.`\r\n\t\t },\r\n\t\t\t\"ev_rebates_BC\":{\r\n\t\t\t\t\"en\": `Provincial Rebate: <a href=\"https://goelectricbc.gov.bc.ca/\" target=\"_blank\">CleanBC Go Electric Vehicle Rebate Program</a>: Get up to ${incentives} towards the purchase of a new ${vehicle}, and up to $350 to install a level 2 home charging station in a single-family home. <br>Provincial Rebate:<a href=\"https://electricvehicles.bchydro.com/incentives/charger-rebates/home\" target=\"_blank\">BC Hydro EV Charger Rebate Program</a>: Up to $350 towards the purchase and installation of a level 2 home charging station.`,\r\n\t\t\t\t\"fr\": `Rabais du gouvernement provincial : <a href=\"https://goelectricbc.gov.bc.ca/\" target=\"_blank\">Programme de rabais CleanBC Go Electric</a>: Obtenez jusqu'à ${incentives} pour l'achat d'un nouveau ${vehicle}, et jusqu’à 350 $ pour installer une borne de recharge résidentielle de niveau 2 dans une maison unifamiliale.<br>Rabais du gouvernement provincial : <a href=\"https://electricvehicles.bchydro.com/incentives/charger-rebates/home\" target=\"_blank\">BC Hydro EV Charger Rebate Program</a> : Jusqu'à 350 $ pour l'achat et l'installation d'une borne de recharge à domicile de niveau 2.`\r\n\t\t \t},\r\n\t\t \t\"ev_rebates_NB\":{\r\n\t\t\t\t\"en\": `Provincial Rebate: <a href=\"https://www.nbpower.com/en/products-services/electric-vehicles/plug-in-nb/electric-vehicle-rebates/\" target=\"_blank\">Plug-In NB Rebate Program</a>: Get up to ${incentives} towards the purchase of a new ${vehicle}. <br>Residents who receive a vehicle rebate through the Plug-In NB Rebate Program are eligible to claim 50% of the cost to purchase and install one new level 2 EV charger, up to a maximum of $750.`,\r\n\t\t \t\t\"fr\": `Rabais provincial : <a href=\"https://www.nbpower.com/fr/products-services/electric-vehicles/plug-in-nb/electric-vehicle-rebates/\" target=\"_blank\">Programme NBranché</a> : Obtenez jusqu’à <nobr>${incentives}</nobr> de rabais à l’achat d’un ${vehicle} neuf.<br> Les résidents qui bénéficient d’un rabais dans le cadre du programme NBranché peuvent également réclamer 50 % du coût d’achat et d’installation d’une borne de recharge à domicile de niveau 2 neuve, jusqu’à un maximum de <nobr>750 $</nobr>. `\r\n\t\t\t},\r\n\t\t\t\"ev_rebates_NL\":{\r\n\t\t\t\t\"en\": `Provincial Rebate: <a href=\"https://takechargenl.ca/evs/choosing-an-ev/available-incentives/\" target=\"_blank\">NL Hydro EV Rebate Program</a>: Get up to ${incentives} towards the purchase of a new ${vehicle}.`,\r\n\t\t \t\t\"fr\": `Rabais provincial : <a href=\"https://takechargenl.ca/evs/choosing-an-ev/available-incentives/\" target=\"_blank\">Programme de rabais pour VÉ de NL Hydro</a> : Obtenez jusqu’à ${incentives} de rabais à l’achat d’un ${vehicle} neuf.`\r\n\t\t\t},\r\n\t\t\t\"ev_rebates_NS\":{\r\n\t\t\t\t\"en\": `Provincial Rebate: <a href=\"https://evassist.ca/rebates/\" target=\"_blank\">The Electrify Nova Scotia Rebate Program</a>: Get up to ${incentives} towards the purchase of a new ${vehicle}.`,\r\n\t\t \t\t\"fr\": `Rabais provincial : <a href=\"https://evassist.ca/rebates/\" target=\"_blank\">Programme d’électrification de la Nouvelle-Écosse</a> : Obtenez jusqu’à ${incentives} de rabais à l’achat d’un ${vehicle} neuf.`\r\n\t\t\t},\r\n\t\t\t\"ev_rebates_PE\":{\r\n\t\t\t\t\"en\": `Provincial Rebate: <a href=\"https://www.princeedwardisland.ca/en/information/environment-energy-and-climate-action/electric-vehicle-incentive\" target=\"_blank\">PEI Universal EV Incentive</a>: Get up to ${incentives} towards the purchase of a new ${vehicle}, as well as a free level 2 charger (installation not included).`,\r\n\t\t \t\t\"fr\": `Rabais provincial : <a href=\"https://www.princeedwardisland.ca/fr/information/environnement-energie-et-action-climatique/electric-vehicle-incentive\" target=\"_blank\">Incitatif universel pour VÉ de l’Île-du-Prince-Édouard</a> : Obtenez jusqu’à <nobr>${incentives}</nobr> de rabais à l’achat d’un ${vehicle} neuf, ainsi qu’une borne de recharge de niveau 2 gratuite (installation non comprise).`\r\n\t\t\t},\r\n\t\t \t\"ev_rebates_QC\":{\r\n\t\t\t\t\"en\": `<div><a href=\"https://www.quebec.ca/en/transports/electric-transportation/financial-assistance-electric-vehicle/new-vehicle/eligible-new-vehicles\" target=\"_blank\">Roulez Vert Program</a>: Get up to ${incentives} towards the purchase of a new ${vehicle} and up to $600 to install a home charging station. </div><br><div><a href=\"https://www.quebec.ca/en/transports/electric-transportation/financial-assistance-electric-vehicle/charging/home-charging-station/choose\" target=\"_blank\">Home Charging Station Rebate</a>: Up to $600 towards the purchase and installation of a level 2 home charging station.</div>`,\r\n\t\t\t\t\"fr\": `<div><a href=\"https://www.quebec.ca/transports/transport-electrique/aide-financiere-vehicule-electrique/vehicule-neuf/vehicules-admissibles\" target=\"_blank\">Programme Roulez vert</a>: Obtenez jusqu'à ${incentives} pour l'achat d'un nouveau ${vehicle} et jusqu’à 600 $ pour installer une borne de recharge résidentielle.</div><br><div><a href=\"https://www.quebec.ca/transports/transport-electrique/aide-financiere-vehicule-electrique/recharge/borne-domicile/choix-bornes-admissibles\" target=\"_blank\">Remboursement pour une borne à domicile</a> : Jusqu'à 600 $ pour l'achat et l'installation d'une borne de recharge à domicile de niveau.</div>`\r\n\t\t\t},\r\n\t\t\t\"ev_rebates_MB\":{\r\n\t\t\t\t\"en\": `<div><a href=\"https://evrebate.mpi.mb.ca/?lang=en\" target=\"_blank\">Manitoba Electric Vehicle Rebate Program</a>: Get up to $4,000 towards the purchase of a new ${vehicle}</div>`,\r\n\t\t\t\t\"fr\": `<div><a href=\"https://evrebate.mpi.mb.ca/?lang=fr\" target=\"_blank\">Programme de remboursement à l’achat ou à la location d’un véhicule électrique du Manitoba</a>: Obtenez jusqu’à 4 000 $ de rabais à l’achat d’un ${vehicle} neuf.</div>`\r\n\t\t\t},\r\n\t\t\t\"ev_rebates_YT\":{\r\n\t\t\t\t\"en\": `Provincial Rebate: Get up to ${incentives} towards the purchase of a new ${vehicle}.`,\r\n\t\t \t\t\"fr\": `Rabais provincial : Obtenez jusqu’à ${incentives} de rabais à l’achat d’un ${vehicle} neuf.`\r\n\t\t\t},\r\n\t\t \"incentives\":{\r\n\t\t\t \"en\": `Payments shown include a $${incentives} Current Incentive. Contact your <a href=\"/en/shopping/find-a-retailer/\">local Mazda retailer</a> for details.`,\r\n\t\t\t \"fr\": `Les paiements indiqués incluent l\\'offre incitatives actuelle de ${incentives} $. Communiquez avec <a href=\"/fr/shopping/Trouver-un-concessionnaire/\">votre détaillant Mazda </a> pour les détails.`\r\n\t\t },\r\n\t\t \"mazda_cash_incentive\": {\r\n\t\t\t\"en\": `Mazda Retail Cash is applicable to cash purchase deals only and: (i) cannot be combined with lease or finance offers; (ii) will be deducted from the negotiated vehicle price before taxes; (iii) has no cash surrender or other value; and (iv) cannot be applied to past transactions. Conditions apply.`,\r\n\t\t\t\"fr\": `L’incitatif au comptant de Mazda s’applique uniquement aux transactions d’achat au comptant et : (i) ne peut être combiné à des offres à la location ou au financement; (ii) sera déduit du prix négocié du véhicule avant taxes; (iii) n’a aucune valeur de rachat en espèces ni autre valeur; et (iv) ne peut être appliqué aux transactions passées. Des conditions s’appliquent.`\r\n\t\t },\r\n\t\t \"ownerloyaltyprogram\":{\r\n\t\t\t\t\"en\": `Current Mazda owners may be eligible to receive up to a ${rate}% rate discount off finance rates, up to a ${rate}% rate discount off lease rates, or up to a ${incentives} cash discount. The most advantageous Mazda Owner Loyalty Program discount (as determined by Mazda) will be automatically applied below. Please contact your <a href=\"/en/shopping/find-a-retailer/\">local Mazda retailer</a> for more details.`,\r\n\t\t\t\t\"fr\": `Les propriétaires actuels d’un véhicule Mazda peuvent bénéficier d’une réduction du taux de financement à l’achat allant jusqu’à ${rate} %, d’une réduction du taux à la location allant jusqu’à ${rate} % ou d’un rabais au comptant allant jusqu’à ${incentives}. La réduction la plus avantageuse du Programme de fidélité du propriétaire Mazda (telle que déterminée par Mazda) sera automatiquement appliquée ci-dessous. Contactez <a href=\"/fr/shopping/Trouver-un-concessionnaire/\">votre détaillant Mazda</a> pour plus de détails.`\r\n\t\t },\r\n\t\t \"graduate\":{\r\n\t\t \"en\":`Recent graduates from an eligible university or college are eligible to receive a discount on the purchase of a new, unused or certified pre-owned vehicle. <a href=\"https://www.mazda.ca/en/shopping-tools/programs/graduate/\" target=\"_blank\">View eligible schools.</a>`,\r\n\t\t \"fr\":`Les nouveaux diplômés de certains collèges ou universités accrédités sont admissibles à recevoir un rabais à l'achat d'un véhicule neuf ou non encore utilisé, ou d'un véhicule d'occasion certifié. <a href=\"https://www.mazda.ca/fr/magasiner/incitatifs-programmes-speciaux/diplome/\" target=\"_blank\">Voir les écoles accréditées.</a>`\r\n\t\t },\r\n\t\t \"military\":{\r\n\t\t \"en\":`Active military personnel, veterans, reservists may be eligible to receive a discount on a new Mazda vehicle. Contact your <a href=\"/en/shopping/find-a-retailer/\">local Mazda retailer</a> for full details.`,\r\n\t\t \"fr\":`Le personnel militaire en activité, les anciens combattants et les réservistes, pourraient être admissibles à un rabais sur un véhicule Mazda neuf. Communiquez avec <a href=\"/fr/shopping/Trouver-un-concessionnaire/\">votre détaillant Mazda </a> pour plus de détails.`\r\n\t\t },\r\n\t\t \"first_time_owner\":{\r\n\t\t \"en\":`$750 Upgrade to Mazda incentive (“<strong>Incentive</strong>â€) is available on new and previously unregistered 2024 CX-5 models that are purchased or financed/leased (on approved credit) from an authorized Mazda dealer in Canada. Certain conditions apply. See Mazda.ca or your local Mazda dealer for details.<sup>10</sup>`,\r\n\t\t \"fr\":`L’incitatif de 750 $ pour passer à Mazda (« <strong>incitatif</strong> ») est offert sur les modèles CX-5 2024 neufs et non immatriculés précédemment achetés ou financés/loués (sur approbation du crédit) auprès d’un détaillant Mazda autorisé au Canada. Certaines conditions s’appliquent. Détails sur Mazda.ca ou auprès de votre détaillant Mazda.<sup>10</sup>` \r\n\t\t },\r\n\t\t\t\"promo_apr\":{\r\n\t\t\t\t\"en\": `The rate selected is a special promotional rate. Alternatively, you can take advantage of cash purchase incentives that cannot be combined with the special promotional rate and your Informational APR would be as outlined above.`,\r\n\t\t\t\t\"fr\": `Le taux sélectionné est un taux promotionnel spécial. Si vous profitez plutôt des offres à l’achat au comptant qui ne peuvent être combinées avec le taux promotionnel spécial, votre TAP informatif serait celui indiqué ci-dessus.`\r\n\t\t\t}\r\n\r\n\r\n }\r\n\r\n\t\tif(tooltips[tooltip] !== undefined){\r\n \treturn ReactHtmlParser(tooltips[tooltip][language]);\r\n\t\t}else{\r\n\t\t\treturn tooltip + ' no tooltip found.';\r\n\t\t}\r\n }\r\n}","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { useRef, useEffect, useState } from 'react';\r\n\r\nimport TooltipHelper from '../../../Helpers/tooltipHelper';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nexport const Tooltip = ({ TooltipName, TooltipText, incentives, vehicle, rate, TooltipClasses, ...props }) => {\r\n\tconst [toggle, setToggle] = useState(false);\r\n\tconst [tooltipHeight, setTooltipHeight] = useState(null)\r\n\tconst [isTop, setTop] = useState(null);\r\n\tconst [isAnimating, setIsAnimating] = useState(false)\r\n\tconst [didInit, setInit] = useState(false);\r\n\tconst toolRef = useRef();\r\n\tconst tooltipHelper = new TooltipHelper();\r\n\tconst gtmHelper = new GTMHelper();\r\n\r\n\tconst tooltipText = TooltipName ? tooltipHelper.getTooltip(TooltipName, incentives, vehicle, rate) : TooltipText;\r\n\t\r\n\tuseEffect(() =>{\r\n\t\tconst tooltip = toolRef.current;\r\n\t\tif(typeof window.gsap === 'object' && !didInit && !tooltipHeight && tooltip && toggle){\r\n\t\t\tconst initHeight=tooltip.querySelector('.mz-tooltip__text').offsetHeight;\r\n\t\t\tsetTooltipHeight(initHeight)\r\n\t\t\tsetInit(true);\r\n\t\t\ttoggleCollapse(tooltip, 0.3, initHeight);\r\n }else if(didInit){\r\n toggleCollapse(tooltip, 0.3);\r\n }\r\n\t}, [toggle]);\r\n\r\n\tfunction toggleCollapse(tooltip, time, initHeight=tooltipHeight){\r\n\t\tif(!isAnimating){\r\n\t\t\tconst tooltipCont = tooltip.querySelector('.mz-tooltip__text');\r\n\t\t\tconst tooltipWidth = 300;\r\n\t\t\ttooltipCont.style.left='';\r\n\t\t\ttooltipCont.style.top='';\r\n\t\t\tconst tooltipLeft = tooltipCont.getBoundingClientRect().left;\r\n\t\t\tconst tooltipBottom = tooltipCont.getBoundingClientRect().bottom;\r\n\t\t\tconst tooltipRight = tooltipLeft + tooltipWidth;\r\n\r\n\t\t\tconst pricingHeight = document.querySelector('.mz-pricing') !== null ? document.querySelector('.mz-pricing').offsetHeight : 0;\r\n\r\n\t\t\tif(toggle){\r\n\t\t\t\tif(tooltipBottom + initHeight > (window.innerHeight - pricingHeight)){\r\n\t\t\t\t\ttooltip.classList.add('reverse');\r\n\t\t\t\t\twindow.gsap.set(tooltipCont,{top:-10, transformOrigin:'bottom center'})\r\n\t\t\t\t\twindow.gsap.fromTo(tooltipCont, time,{autoAlpha:0, height:0},{autoAlpha:1, height:initHeight, onUpdate: function(){\r\n\t\t\t\t\t\t\tif(parseInt(tooltipCont.style.top, 10) <= -(initHeight - 20)){\r\n\t\t\t\t\t\t\t\ttooltipCont.style.top = -(initHeight - 10)+ 'px'\r\n\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\ttooltipCont.style.top = -(tooltipCont.offsetHeight + 10)+ 'px';\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})\r\n\t\t\t\t\tsetTop(true);\r\n\t\t\t\t}else{\r\n\t\t\t\t\ttooltip.classList.remove('reverse');\r\n\t\t\t\t\twindow.gsap.set(tooltipCont,{top:'6px', transformOrigin:'top center'})\r\n\t\t\t\t\twindow.gsap.fromTo(tooltipCont, time,{autoAlpha:0, height:0},{autoAlpha:1,height:initHeight})\r\n\t\t\t\t\tsetTop(false);\r\n\t\t\t\t}\r\n\t\t\t}else{\r\n\t\t\t\tsetIsAnimating(true)\r\n\t\t\t\tif(isTop){\r\n\t\t\t\t\t\twindow.gsap.to(tooltipCont, time,{autoAlpha:0, height:0, onComplete:enableAni, transformOrigin:'bottom center', onUpdate: function(){\r\n\t\t\t\t\t\t\tif(parseInt(tooltipCont.style.top, 10) >= -10){\r\n\t\t\t\t\t\t\t\ttooltipCont.style.top = '-10px'\r\n\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\ttooltipCont.style.top = -(tooltipCont.offsetHeight + (tooltip.parentElement.offsetHeight *2)) + 'px';\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})\r\n\t\t\t\t}else{\r\n\t\t\t\t\twindow.gsap.to(tooltipCont, time,{autoAlpha:0, height:0, onComplete:enableAni, transformOrigin:'top center'})\r\n\t\t\t\t}\r\n\t\t\t\tfunction enableAni(){\r\n\t\t\t\t\tsetIsAnimating(false);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif(tooltipRight > window.innerWidth){\r\n\t\t\t\ttooltipCont.style.left='auto';\r\n\t\t\t\ttooltipCont.style.right= '-20px';\r\n\t\t\t}else if(tooltipLeft < 0){\r\n\t\t\t\ttooltipCont.style.left='-20px';\r\n\t\t\t\ttooltipCont.style.right= 'auto';\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tconst toolClick = (e)=>{\r\n\t\tif(!isAnimating){\r\n\t\t\tsetToggle(!toggle);\r\n\t\t}\r\n\t}\r\n\r\n\t\r\n\r\n\treturn (\r\n\t\ttooltipText !== undefined &&\r\n\t\t\t<div className={\r\n\t\t\t\ttoggle\r\n\t\t\t\t? \"mz-tooltip is-expanded\"\r\n\t\t\t\t: \"mz-tooltip\"\r\n\t\t\t}\r\n\t\t\t{...props}\r\n\t\t\tref={toolRef}\r\n\t\t\tonClick={(e) => {\r\n\t\t\t\ttoolClick(e);\r\n\t\t\t\tgtmHelper.setGTM({'action':'Tooltip', 'Tooltip': TooltipName}, true, false);\r\n\t\t\t}}\r\n\t\t\tonMouseEnter={(e)=>{\r\n\t\t\t\tif(window.matchMedia(\"(min-width: 1025px)\").matches){\r\n\t\t\t\t\tif(!isAnimating){\r\n\t\t\t\t\t\tsetToggle(true);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tgtmHelper.setGTM({'action':'Tooltip', 'Tooltip': TooltipName}, true, false);\r\n\t\t\t\t}\r\n\t\t\t}}\r\n\t\t\tonMouseLeave={(e) =>{\r\n\t\t\t\tif(window.matchMedia(\"(min-width: 1025px)\").matches){\r\n\t\t\t\t\tif(!isAnimating){\r\n\t\t\t\t\t\tsetToggle(false);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}}>\r\n\t\t\t\t{TooltipClasses &&\r\n\t\t\t\t\t<i className={TooltipClasses + ' mz-svg mz-svg-info'}></i>\r\n\t\t\t\t}\r\n\t\t\t\t{!TooltipClasses &&\r\n\t\t\t\t\t<i className=\"mz-svg mz-svg--grey mz-svg-info\"></i>\r\n\t\t\t\t}\r\n\t\t\t\t<span className=\"mz-tooltip__text label label--tight\" >\r\n\t\t\t\t\t<div>\r\n\t\t\t\t\t\t{tooltipText}\r\n\t\t\t\t\t\t<div onClick={() => setToggle(!toggle)} className=\"mz-tooltip__close\">\r\n\t\t\t\t\t\t<i className=\"mz-svg mz-svg-x\"></i>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</span>\r\n\t\t\t</div>\r\n\t);\r\n};\r\n\r\nTooltip.propTypes = {\r\n\tTooltipText: PropTypes.string,\r\n\tTooltipClasses: PropTypes.string,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Modal_50_50 from '../../3_Organisms/Modal/Modal_50_50';\r\nimport { getLang, formatPrice, getBaseUrl, getFinanceWeekly, getLeaseBiWeeklyFromOptions, pushToGTMDataLayer } from '../../../utils';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { titleCase } from '../../../Helpers/helpers';\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\nimport { Tooltip } from '../../1_Atoms/Tooltip/Tooltip';\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nexport const AccessoryCard = ({ Accessory, Selected, HandleSelectedAccessory, HandleLearnMore, isPopular, showFinancePrice, ...props }) => {\r\n\tconst [modalOpen, setModalOpen] = React.useState(false);\r\n const { t, i18n } = useTranslation(['accessories', 'general']);\r\n\tconst gtmHelper = new GTMHelper();\r\n\r\n //const [selected] = React.useState(Selected);\r\n const financial = JSON.parse(sessionStorage.getItem(Constants.FinancialObj));\r\n const financeTermIndex = parseInt(sessionStorage.getItem(Constants.FinanceTermIndex));\r\n const leaseTermIndex = parseInt(sessionStorage.getItem(Constants.LeaseTermIndex));\r\n const financeTerm = parseInt(sessionStorage.getItem(Constants.FinanceTerm));\r\n const leaseTerm = parseInt(sessionStorage.getItem(Constants.LeaseTerm));\r\n\r\n function setSelectedAccessory() {\r\n HandleSelectedAccessory(Accessory.index)\r\n }\r\n\r\n const imagePath = getBaseUrl() + process.env.REACT_APP_BASIC_CONTENT_PATH;\r\n\r\n function HandleLearnMore() {\r\n setModalOpen(!modalOpen);\r\n document.querySelector('html').classList.add('inactive');\r\n\t\tgtmHelper.setGTM({'action':'Open Modal','modal': 'Accessory Learn More'}, true, false);\r\n }\r\n\r\n function closeModal() {\r\n setModalOpen(false);\r\n }\r\n\r\n function getTooltipText(Accessory) {\r\n const lang = getLang();\r\n const totalCost = formatPrice(Accessory.price, true);\r\n const priceIncludesText = lang == 'en' ? 'Includes' : 'Contient';\r\n const installationText = lang === 'en' ? 'Installation cost' : 'Coûts d\\'installation';\r\n const totalPriceText = lang === 'en' ? 'Total price' : 'Prix totaux';\r\n \r\n let text = `${priceIncludesText}:`;\r\n text += `<br>${Accessory.name}: ${formatPrice(Accessory.base_msrp, true)}`;\r\n text += Accessory.install_cost ? `<br>${installationText}: ${formatPrice(Accessory.install_cost, true)}` : '';\r\n text += `<hr>${totalPriceText}:${totalCost}`;\r\n return text;\r\n }\r\n\r\n function accessoryTotalCost(){\r\n return Accessory.price + Accessory.install_cost ? Accessory.price + Accessory.install_cost : 0;\r\n }\r\n\r\n return (\r\n <>\r\n {Accessory ? <>\r\n <div className={`accessory-card ${Selected?'accessory-card-selected':''}`}>\r\n <div className=\"accessory-card__content\">\r\n\t\t\t\t{Accessory.popular === true && !isPopular ? <p className=\"accessory-card__popular label\">{t(\"popular\")}</p> : null}\r\n <img className=\"accessory-card__img\" alt={Accessory.name} src={`${imagePath}/accessories/${Accessory.image}`} onClick={() => HandleLearnMore()} />\r\n <span className={ Selected ? \"accessory-card__selected-indicator selected\" : \"accessory-card__selected-indicator\"}><i className=\"mz-svg mz-svg--white mz-svg-checkmark\"></i></span>\r\n <div className=\"accessory-card__info\">\r\n <h3 className=\"accessory-card__title\">{titleCase(Accessory.name)}</h3>\r\n </div>\r\n\t\t\t\t<div className=\"accessory-card__CTAs\">\r\n <p className=\"accessory-card__price\">{Accessory.price!==0?`+ ${formatPrice(Accessory.price)}`:''} {Accessory.price_week !== null ? <span>{Accessory.price!==0?\r\n `(${showFinancePrice?\r\n `${getFinanceWeekly(Accessory.price, financial.calculatedFinance.financeValues[financeTermIndex].aprRate, financial.calculatedFinance.financeValues[financeTermIndex].term)}${t(\"general:week\")}`:\r\n `${getLeaseBiWeeklyFromOptions(Accessory.price, financial.calculatedLease.leaseValues[leaseTermIndex].leaseRate, financial.calculatedLease.leaseValues[leaseTermIndex].term)}${t(\"general:bi_week\")}`})`:''}<sup>1</sup><Tooltip TooltipText={ReactHtmlParser(getTooltipText(Accessory))} /></span> : t(\"with_installation\")}\r\n \r\n </p>\r\n\t\t\t\t\t<button className={Selected ? 'mz-btn mz-btn--primary accessory-card__select-button':'mz-btn mz-btn--primary accessory-card__select-button mz-btn--red'} onClick={() => setSelectedAccessory()}><span>{ Selected ? t(\"remove\"): t(\"accessories:add_to_build\")}</span></button>\r\n\t\t\t\t\t<div className=\"accessory-card__learn-more-button\"> <a className=\"mz-link label text--grey\" onClick={() => HandleLearnMore()}>{t(\"accessories:learn_more\")}</a></div>\r\n\t\t\t\t</div>\r\n </div>\r\n </div>\r\n <Modal_50_50 title={Accessory.name} copy={Accessory.description} image={Accessory.image} imageMobile={Accessory.image} imageAlt={Accessory.name} modalId={Accessory.id} isOpen={modalOpen} setIsModalOpen={closeModal} />\r\n </>: null}</>\r\n )\r\n\r\n}\r\n\r\n\r\nexport default AccessoryCard;\r\n\r\nAccessoryCard.propTypes = {\r\n HandleSelectedAccessory: PropTypes.func,\r\n HandleLearnMore: PropTypes.func,\r\n}\r\n\r\nAccessoryCard.defaultProps = {\r\n HandleSelectedAccessory: () => { },\r\n HandleLearnMore: () => { },\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nexport const CollapseLegal = ({ColCarText1, ColBoxText, key, ...props }) => {\r\n\tconst gtmHelper = new GTMHelper();\r\n\t\r\n const [toggle, setToggle] = React.useState(false);\r\n\r\n return (\r\n <div className=\"mz-collapse mz-collapse--legal\" key={key}>\r\n <button\r\n onClick={() =>{\r\n\t\t\t\t\t setToggle(!toggle)\r\n\t\t\t\t\t gtmHelper.setGTM({'action':'Collapse', 'type': 'Legal', 'value': toggle}, true , false);\r\n\t\t\t\t }}\r\n className=\"mz-collapse__button\"\r\n >\r\n <div className=\"mz-collapse__cartext-container\">\r\n <p className=\"mz-collapse__text\">{ColCarText1}</p>\r\n <i className={ toggle ? \"mz-svg mz-svg-chevron open\" : \"mz-svg mz-svg-chevron\"}></i>\r\n </div>\r\n </button>\r\n <div className={ toggle ? \"mz-collapse__box visible\" : \"mz-collapse__box\"}>{ ReactHtmlParser (ColBoxText) }</div>\r\n </div>\r\n )\r\n}\r\n\r\nCollapseLegal.propTypes = {\r\n ColCarText1: PropTypes.string,\r\n ColBoxText: PropTypes.string,\r\n}\r\n\r\nCollapseLegal.defaultProps = {\r\n ColCarText1: 'Legal',\r\n ColBoxText: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.',\r\n}\r\n\r\nexport default CollapseLegal;","import React, { useState, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useNavigate, useParams, useSearchParams } from 'react-router-dom';\r\n\r\nimport { formatPrice, getLang, convertNum, getProvince } from '../../../utils'\r\n\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport NavHelper from '../../../Helpers/navhelper';\r\nimport { openModal, scrollTo } from '../../../Helpers/helpers';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nimport Button from '../../1_Atoms/Button/Button';\r\n\r\nexport const Pricing = ({ builtLabel, builtPrice, loanLabel, loanPrice, buttonLabel, leaseLabel, financeLabel, HandleNextClick, setLegalModalOpen, HandleShowFinanceClick, saveLabel, summaryCalculator = window.summaryCalculator, setPreorderModalOpen, ...props }) => {\r\n //const summaryCalculator = window.summaryCalculator;\r\n const { year, carline, trim, model, packageCode } = useParams();\r\n\r\n const lang= getLang();\r\n const navigate = useNavigate();\r\n const navHelper = new NavHelper();\r\n\r\n const [financialInfo, setFinancialInfo] = React.useState(summaryCalculator.FinancialInfo);\r\n const [showFinancePrice, setShowFinancePrice] = React.useState(summaryCalculator.ShowFinancePrice);\r\n const [currentMileage] = React.useState(summaryCalculator.AnnualMileage);\r\n const includeFees = sessionStorage.getItem(Constants.IncludeFees) === 'true';\r\n const includeRebates = sessionStorage.getItem(Constants.IncludeRebates) === 'true';\r\n const includeTaxes = sessionStorage.getItem(Constants.IncludeTaxes) === 'true';\r\n const app = document.querySelector('.App');\r\n const { t, i18n } = useTranslation(['general']);\r\n const resizeObserver = new ResizeObserver(() => {\r\n calculatePriceBarPosition();\r\n })\r\n const mazdaFooter = document.querySelector('.mz-footer');\r\n const mazdaPricing = document.querySelector('.mz-pricing');\r\n const scrollElement = document.querySelector('.scroll-content');\r\n\tconst gtmHelper = new GTMHelper();\r\n\r\n const [ocaOpen, setOcaModalOpen] = React.useState(false);\r\n const [financeType, setFinanceType] = React.useState(false);\r\n \r\n const [searchParams, setSearchParams] = useSearchParams();\r\n\r\n const [update, setForceUpdate] = useState('');\r\n\r\n window.removeEventListener('scroll', calculatePriceBarPosition);\r\n window.removeEventListener('resize', calculatePriceBarPosition);\r\n\r\n if (resizeObserver && app)\r\n resizeObserver.unobserve(app);\r\n\r\n if (mazdaFooter && mazdaPricing) {\r\n window.addEventListener('scroll', calculatePriceBarPosition, false);\r\n window.addEventListener('resize', calculatePriceBarPosition, false);\r\n resizeObserver.observe(app);\r\n }\r\n\r\n function calculatePriceBarPosition(e) {\r\n if (!scrollElement) {\r\n if (!isFooterOnViewport()) {\r\n mazdaPricing.style.bottom = \"0px\";\r\n } else {\r\n mazdaPricing.style.bottom = `${howMuchFooterIsVisible()}px`;\r\n }\r\n } else {\r\n if (isFooterOnViewport()) {\r\n mazdaPricing.style.bottom = `${mazdaFooter.offsetHeight}px`;\r\n } else {\r\n mazdaPricing.style.bottom = `${scrollElement.clientHeight - window.innerHeight - parseFloat(window.getComputedStyle(scrollElement).transform.split(\", \")[5].replace(')', '')) * -1}px`;\r\n }\r\n }\r\n\r\n }\r\n\r\n\r\n function handleTogglePrice(e) {\r\n e.preventDefault();\r\n //const auxshowFinancePrice = !showFinancePrice\r\n summaryCalculator.ShowFinancePrice = !showFinancePrice;\r\n setShowFinancePrice(summaryCalculator.ShowFinancePrice);\r\n\r\n\r\n if(HandleShowFinanceClick)\r\n HandleShowFinanceClick(summaryCalculator.ShowFinancePrice);\r\n\r\n\t\tconst toggleType = summaryCalculator.ShowFinancePrice === false ? 'lease':'finance'\r\n\t\tgtmHelper.setGTM({'action':'Switch Financing','finance type': toggleType}, true, false);\r\n }\r\n\r\n function isFooterOnViewport() {\r\n const { top, bottom } = mazdaFooter.getBoundingClientRect()\r\n const vHeight = (window.innerHeight || document.documentElement.clientHeight);\r\n\r\n return (\r\n (top > 0 || bottom > 0) &&\r\n top < vHeight\r\n );\r\n }\r\n\r\n function howMuchFooterIsVisible() {\r\n var distance = 0;\r\n let elem = document.querySelector('.mz-footer');\r\n const vHeight = window.innerHeight;\r\n const scrollPosition = window.pageYOffset | document.body.scrollTop;\r\n do {\r\n distance += elem.offsetTop;\r\n elem = elem.offsetParent;\r\n } while (elem);\r\n\r\n if (scrollPosition > (distance - vHeight)) {\r\n return scrollPosition - (distance - vHeight);\r\n } else {\r\n return 0;\r\n }\r\n }\r\n\r\n function handlePreOrderClick() {\r\n document.querySelector('body').classList.add('disabled');\r\n setPreorderModalOpen(true);\r\n \r\n }\r\n\r\n function handleContactDealerLinkClick(e) {\r\n e.preventDefault();\r\n console.log(lang)\r\n gtmHelper.setGTM({'action':'Open Modal','modal': 'Contact Dealer'}, true, false);\r\n const targetModal = document.getElementById('mz-react-send-build-to-dealer-modal');\r\n if (targetModal && summaryCalculator) {\r\n if (summaryCalculator.SelectedColourExteriorIndex !== 'null' && summaryCalculator.Colours !== null) {\r\n const heading = targetModal.querySelector('.mz-send-build-to-dealer__vehicle-name');\r\n if (heading) {\r\n heading.textContent = lang === 'en' ? summaryCalculator._selectedModelYear.year.title + ' ' + ReactHtmlParser(summaryCalculator._selectedModelYear.carline.title) : ReactHtmlParser(summaryCalculator._selectedModelYear.carline.title) + ' ' + summaryCalculator._selectedModelYear.year.title;\r\n }\r\n }\r\n openModal('mz-react-send-build-to-dealer-modal');\r\n }\r\n }\r\n\r\n const handleOcaClick = (e) => {\r\n e.preventDefault();\r\n document.querySelector('body').classList.remove('disabled');\r\n if (window.location.href.indexOf('/payments') > 0) {\r\n setSearchParams({'oca':''});\r\n setTimeout(() => {\r\n setSearchParams({'oca':'1'});\r\n }, 10);\r\n }else{\r\n navigate(navHelper.getNavContent(t).tabList[5].uri + '&oca=1');\r\n }\r\n const price = summaryCalculator._showFinancePrice ? summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceWithFeesWithRebatesTaxed : summaryCalculator.FinancialInfo.calculatedLease.balanceToLeaseWithFeesWithRebatesTaxed;\r\n gtmHelper.setGTM({'action':`OCA - Footer`,'year': year, 'model': carline, 'trim': summaryCalculator.selectedVehicle.trim ?? summaryCalculator.AvailableTrim.trims[0].trim_type.url_slug, 'price' : Math.round(price)}, true, false);\r\n }\r\n\r\n const getLoanRate = () => {\r\n if(summaryCalculator.getResponsesHasError())\r\n return '-'; \r\n\r\n const loanElement = summaryCalculator.FinancialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex];\r\n if (Number.parseFloat(loanElement.aprRate) !== Number.parseFloat(loanElement.aprRateDiscounted))\r\n return convertNum(loanElement.aprRateDiscounted,2) + '%';\r\n else\r\n return convertNum(loanElement.aprRate,2) + '%';\r\n }\r\n\r\n const getLeaseRate = () => {\r\n if(summaryCalculator.getResponsesHasError())\r\n return '-';\r\n\r\n const leaseElement = summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex];\r\n if (Number.parseFloat(leaseElement.leaseRate) !== Number.parseFloat(leaseElement.leaseRateDiscounted))\r\n return convertNum(leaseElement.leaseRateDiscounted,2) + '%';\r\n else\r\n return convertNum(leaseElement.leaseRate,2) + '%';\r\n }\r\n\r\n const getLoanWeekly = () => {\r\n if(summaryCalculator.getResponsesHasError())\r\n return '-';\r\n\r\n const loanElement = financialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex];\r\n const weeklyPayment = loanElement[summaryCalculator.IncludeTaxes ? 'weeklyWithTaxes' : 'weekly'];\r\n\r\n if( weeklyPayment === 0 || weeklyPayment === '0')\r\n return '-';\r\n\r\n return formatPrice(weeklyPayment);\r\n }\r\n\r\n const getLeaseWeekly = () => {\r\n if(summaryCalculator.getResponsesHasError())\r\n return '-';\r\n \r\n const leaseElement = financialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex]\r\n const weeklyPayment = leaseElement[summaryCalculator.IncludeTaxes ? 'biWeeklyWithTaxes' : 'biWeekly'];\r\n\r\n if( weeklyPayment === 0 || weeklyPayment === '0')\r\n return '-';\r\n\r\n return formatPrice(weeklyPayment);\r\n\r\n } \r\n\r\n function getQCEVDisclaimerSection(){\r\n if(summaryCalculator.IncludeRebates && getProvince() === 'QC' && summaryCalculator.FinancialInfo?.ev_rebates?.length){\r\n return (\r\n <> \r\n <div class=\"mz-QC-EV-disclaimer text--grey label\">\r\n {ReactHtmlParser(t(\"general:QCEVDisclaimer\"))}\r\n \r\n </div>\r\n \r\n </>\r\n )\r\n }\r\n }\r\n function handleQCEVD_LinkClick(e){\r\n if(e.target.id === 'QCEVD_link'){\r\n e.preventDefault();\r\n const contactRoute = `/${year}/${carline}/${summaryCalculator.SelectedTrim.trim_type.url_slug}/${summaryCalculator.SelectedModel.model_code}/${summaryCalculator.SelectedModel.option_code}/summary?contactDealer`;\r\n navigate(contactRoute);\r\n }\r\n }\r\n\r\n function hasBreak(){\r\n if(lang === 'fr')\r\n return (<br/>)\r\n }\r\n\r\n function getCashPrice(){\r\n let financePricing = null;\r\n let cashPricing = null;\r\n if(includeFees){\r\n if(includeTaxes){\r\n if(includeRebates){\r\n financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinanceWithFeesWithRebatesTaxed : financialInfo.calculatedLease.balanceToLeaseWithFeesWithRebatesTaxed;\r\n cashPricing = financialInfo.calculatedCash.subtotalWithFeesWithRebatesTaxed;\r\n }else{\r\n financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinanceWithFeesTaxed : financialInfo.calculatedLease.balanceToLeaseWithFees;\r\n cashPricing = financialInfo.calculatedCash.subtotalWithFeesTaxed;\r\n }\r\n }else{\r\n if(includeRebates){\r\n financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinanceWithFeesWithRebates : financialInfo.calculatedLease.balanceToLeaseWithFeesWithRebates;\r\n cashPricing = financialInfo.calculatedCash.subtotalWithFeesWithRebatesAndEvRebates;\r\n }else{\r\n financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinanceWithFees : financialInfo.calculatedLease.balanceToLeaseWithFees\r\n cashPricing = financialInfo.calculatedCash.subtotalWithFees;\r\n }\r\n }\r\n }else{\r\n if(includeTaxes){\r\n if(includeRebates){\r\n financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinanceWithRebatesTaxed : financialInfo.calculatedLease.balanceToLeaseWithRebates;\r\n cashPricing = financialInfo.calculatedCash.subtotalWithIncentiveRebatesAndEvRebatesTaxed;\r\n }else{\r\n financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinanceTaxed : financialInfo.calculatedLease.balanceToLease;\r\n cashPricing = financialInfo.calculatedCash.subtotalTaxed;\r\n }\r\n }else{\r\n if(includeRebates){\r\n financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinanceWithRebates : financialInfo.calculatedLease.balanceToLeaseWithRebates;\r\n cashPricing = financialInfo.calculatedCash.subtotalWithIncentiveRebatesAndEvRebates;\r\n }else{\r\n financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinance : financialInfo.calculatedLease.balanceToLease;\r\n cashPricing = financialInfo.calculatedCash.subtotal;\r\n }\r\n }\r\n }\r\n\r\n //for get local price form to grab\r\n summaryCalculator.CurrentCalculatedCash = formatPrice(cashPricing, true);\r\n\r\n return (<span className='mmz-cahs-options__price'>{formatPrice(financePricing)}</span>);\r\n }\r\n React.useEffect(() => {\r\n (async () => {\r\n if(summaryCalculator._selectedModel !== null) {\r\n document.addEventListener('click',handleQCEVD_LinkClick);\r\n \r\n setFinancialInfo(await summaryCalculator.RecalculateFinancialInfo());\r\n \r\n setForceUpdate(Math.random());\r\n }\r\n })();\r\n }, [\r\n summaryCalculator.FinancialInfo?.calculatedFinance, \r\n summaryCalculator.FinancialInfo?.calculatedLease,\r\n summaryCalculator._tradeInValue, \r\n summaryCalculator._downPaymentValue,\r\n summaryCalculator.LoyaltyChecked, \r\n summaryCalculator.GraduateChecked, \r\n summaryCalculator.MilitaryChecked,\r\n summaryCalculator.FirstTimeOwnerChecked,\r\n ]);\r\n\r\n useEffect(() => {\r\n console.log('refreshing pricebar section');\r\n }, [update]);\r\n \r\n if(!financialInfo)\r\n return (<></>);\r\n else\r\n return (\r\n <>\r\n <div\r\n className='mz-pricing'\r\n {...props}\r\n >\r\n <Button\r\n className=\"mz-btn mz-btn--legal text--grey\"\r\n label={t(\"general:legal\")}\r\n backgroundColor=\"grey\"\r\n colour=\"grey\"\r\n icon={true}\r\n iconAfter={true}\r\n svg_className=\"\"\r\n svg_list=\"plus\"\r\n size={0.6}\r\n onClick={() => {\r\n document.querySelector('body').classList.add('disabled');\r\n setLegalModalOpen(true)\r\n gtmHelper.setGTM({'action':'Open Modal','modal': 'legal'}, true, false);\r\n }}\r\n /> \r\n <div className=\"mz-pricing__container\">\r\n <div className=\"mz-pricing__built\">{builtLabel}<span className=\"mz-pricing__built--price\">\r\n {getCashPrice()}\r\n </span></div>\r\n <div className=\"mz-pricing__lease\">\r\n {showFinancePrice ? t(\"general:finance\") : t(\"general:lease\")}: {showFinancePrice ? summaryCalculator.FinanceTerm : summaryCalculator.LeaseTerm}{t(\"general:pricing_bar_label\")} {showFinancePrice ? getLoanRate() : getLeaseRate()}\r\n\r\n <span className=\"mz-pricing__lease--price\">{showFinancePrice ? getLoanWeekly()+t(\"general:weekly\") : getLeaseWeekly()+t(\"general:bi_weekly\")}</span>\r\n </div>\r\n {window.allow_oca ? \r\n <div className=\"mz-pricing__options\">\r\n <div><a className=\"mz-link label\" onClick={(e) => {\r\n handleOcaClick(e);\r\n }} >{ReactHtmlParser(t('general:ocaPriceBar'))}</a></div>\r\n <a className=\"mz-link label\" href=\"\" onClick={handleTogglePrice}>{showFinancePrice ? leaseLabel : financeLabel}</a>\r\n </div> :\r\n <div className=\"mz-pricing__options no_oca\" >\r\n <a className=\"mz-link label\" href=\"\" onClick={handleTogglePrice}>{showFinancePrice ? leaseLabel : financeLabel}</a>\r\n </div>\r\n }\r\n <Button\r\n className=\"mz-btn mz-btn--primary mz-btn--red\"\r\n primary={true}\r\n backgroundColor=\"red\"\r\n colour=\"white\"\r\n label={buttonLabel}\r\n icon={true}\r\n iconAfter={true}\r\n svg_className=\"\"\r\n svg_list=\"chevron_small\"\r\n size={0.8}\r\n onClick={() => {\r\n HandleNextClick();\r\n }}\r\n />\r\n <div className=\"mz-pricing__dealer\">\r\n <div>\r\n {summaryCalculator.isSelectionPreOrder() ?\r\n <a className=\"mz-link label\" onClick={handlePreOrderClick} style={{cursor:'pointer'}}>{ReactHtmlParser(t(\"general:pre_order\"))}</a>\r\n :\r\n <a className=\"mz-link label\" onClick={handleContactDealerLinkClick} style={{cursor:'pointer'}}>{ReactHtmlParser(t(\"general:get_local_price\"))}</a>}\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"mz-pricing__built mz-mobile\">{ReactHtmlParser(t('general:price_as_built_m'))}\r\n <span className=\"mz-pricing__built--price mz-mobile\">\r\n {getCashPrice()}\r\n </span>\r\n <div className=\"mz-pricing__dealer\">\r\n {summaryCalculator.isSelectionPreOrder() ?\r\n <a className=\"mz-link label\" onClick={handlePreOrderClick} style={{cursor:'pointer'}}>{ReactHtmlParser(t(\"general:pre_order\"))}</a>\r\n :\r\n <a className=\"mz-link label\" onClick={handleContactDealerLinkClick} style={{cursor:'pointer'}}>{ReactHtmlParser(t(\"general:get_local_price\"))}</a>\r\n }\r\n </div>\r\n </div>\r\n <div className=\"mz-pricing__lease mz-mobile\">\r\n {showFinancePrice ? t(\"general:finance\") : t(\"general:lease\")}: {hasBreak()} {showFinancePrice ? summaryCalculator.FinanceTerm : summaryCalculator.LeaseTerm}{t(\"general:pricing_bar_label\")} {showFinancePrice ? getLoanRate() : getLeaseRate()}\r\n\r\n <span className=\"mz-pricing__lease--price mz-mobile\">{showFinancePrice ? getLoanWeekly()+t(\"general:weekly\") : getLeaseWeekly()+t(\"general:bi_weekly\")}</span>\r\n\r\n <div>\r\n {window.allow_oca ? \r\n <>\r\n <a className=\"mz-link label nowrap\" onClick={(e) => handleOcaClick(e)} >{ReactHtmlParser(t('general:ocaPriceBar'))}</a> \r\n <br/> \r\n </>\r\n : \"\" }\r\n <a className=\"mz-link label nowrap\" href=\"#\" onClick={handleTogglePrice}>{showFinancePrice ? leaseLabel : financeLabel}</a></div>\r\n </div>\r\n \r\n <Button\r\n className=\"mz-btn mz-btn--primary mz-btn--red mz-mobile\"\r\n primary={true}\r\n backgroundColor=\"red\"\r\n label={buttonLabel}\r\n icon={true}\r\n iconAfter={true}\r\n colour=\"white\"\r\n svg_className=\"\"\r\n svg_list=\"chevron_small\"\r\n size={0.8}\r\n onClick={() => HandleNextClick()}\r\n />\r\n \r\n </div>\r\n </>\r\n );\r\n};\r\n\r\n\r\n// Pricing.propTypes = {\r\n// HandleTabClick: PropTypes.func,\r\n// }\r\n\r\n// Pricing.defaultProps = {\r\n// HandleTabClick: () => {\r\n// },\r\n// };","import React from 'react';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { Svg } from '../../1_Atoms/Svg/Svg';\r\nimport PropTypes from 'prop-types';\r\n\r\nexport const PreOrderModal = ({modalContent, isOpen, modalId, handleClose, ...props }) => {\r\n const summaryCalculator = window.summaryCalculator;\r\n const { t } = useTranslation(['summary', 'general']);\r\n\r\n React.useEffect(() => {\r\n if(isOpen){ \r\n // Skip if this is the first time loading it because App.js takes care of it.\r\n //redraw on dealer id change\r\n if (window.isReactFormsAppLoaded && typeof window.initReactFormsApp === 'function') {\r\n window.initReactFormsApp();\r\n }\r\n }\r\n }, [isOpen]);\r\n\r\n window.addEventListener(\"message\", function (e) { \r\n if (e.data.type === \"formEvent\") {\r\n if(e.data.origin === 'preOrder'){\r\n sessionStorage.setItem('preorder', e.data.message.dealer_code);\r\n //handlePreOrderClick();\r\n }\r\n\r\n }\r\n });\r\n\r\n return (\r\n <div className=\"mz-modal modal\" id=\"preorderModal\" aria-hidden={!isOpen}>\r\n <div className=\"wrapper\">\r\n <div className=\"mz-modal__container\">\r\n <div className=\"mz-modal__content\">\r\n <button className=\"mz-modal__close\" aria-label=\"Close Modal\" onClick={() => {\r\n\t\t\t\t\t\t\tdocument.querySelector('body').classList.remove('disabled');\r\n\t\t\t\t\t\t\thandleClose(false)\r\n\t\t\t\t\t\t}}>\r\n <Svg\r\n colour=\"grey\"\r\n size={1.93}\r\n svg_list=\"x\"\r\n />\r\n </button>\r\n <div className=\"mz-modal__text-container\">\r\n {isOpen &&\r\n <> \r\n <div className=\"mz-container\">\r\n <div className=\"mz-full-width\">\r\n <h3 style={{'paddingTop':'50px'}}>{t('general:pre_order')}</h3>\r\n </div>\r\n </div>\r\n <div className=\"mzReactForms\">\r\n <input type=\"hidden\" data-mz-form-field-name=\"formType\" value=\"PreOrder\" />\r\n <input type=\"hidden\" data-mz-form-field-name=\"isPreorderModal\" value=\"true\"/>\r\n <input type=\"hidden\" data-mz-form-field-name=\"modelCode\" value={summaryCalculator.selectedVehicle.model}/>\r\n <input type=\"hidden\" data-mz-form-field-name=\"modelOption\" value={summaryCalculator.selectedVehicle.packageCode}/>\r\n {sessionStorage.getItem('preorder') &&\r\n <>\r\n <input type=\"hidden\" data-mz-form-field-name=\"dealerId\" value={sessionStorage.getItem('preorder')}/>\r\n </>\r\n }\r\n <input type=\"hidden\" data-mz-form-field-name=\"source\" value=\"WR\" />\r\n <input type=\"hidden\" data-mz-form-field-name=\"formDisclaimer\" value={t(\"form_disclaimer_retailer\")}/>\r\n <div className=\"mz-react-forms-root\"></div>\r\n </div>\r\n </>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nPreOrderModal.propTypes = {\r\n HandleTabClick: PropTypes.func,\r\n}\r\n\r\nPreOrderModal.defaultProps = {\r\n handleClose: () => {\r\n },\r\n};","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { useRef } from 'react';\r\n\r\nimport { Tooltip } from '../../1_Atoms/Tooltip/Tooltip';\r\n\r\nexport const Alert = ({Id, Desc, ...props }) => {\r\n const [textDisplayed, setTextDisplayed] = React.useState(null);\r\n const [tooltipCont, setTooltipCont] = React.useState(null);\r\n const alertRef = useRef();\r\n\r\n let summaryCalculator = window.summaryCalculator\r\n\r\n const getTextDisplay = () => {\r\n if(Desc)\r\n return Desc;\r\n\r\n switch(summaryCalculator._currentStep) {\r\n case 1:\r\n if(summaryCalculator?._selectedModelYear?.incentives_banner)\r\n return summaryCalculator?._selectedModelYear?.incentives_banner;\r\n default: \r\n if(summaryCalculator?._selectedTrim?.incentives_banner)\r\n return summaryCalculator?._selectedTrim?.incentives_banner;\r\n\r\n if(summaryCalculator?._selectedModelYear?.incentives_banner)\r\n return summaryCalculator?._selectedModelYear?.incentives_banner;\r\n }\r\n\r\n }\r\n \r\n React.useEffect(() => {\r\n //console.log('ALERT BAR DISPLAY TEXT CHANGED');\r\n\r\n let tempHtml = getTextDisplay();\r\n tempHtml = tempHtml?.includes('<ToolTip>') ? tempHtml.split('<ToolTip>') : tempHtml;\r\n if(Array.isArray(tempHtml)){\r\n setTooltipCont(tempHtml[1]);\r\n tempHtml.splice(1, 1);\r\n tempHtml = tempHtml.join(' ');\r\n }\r\n setTextDisplayed(tempHtml);\r\n }, [summaryCalculator._selectedModelYear, summaryCalculator._selectedTrim]);\r\n\r\n\r\n if(!textDisplayed) \r\n return <></>;\r\n \r\n function insertTooltip(){\r\n return (<Tooltip TooltipText={ReactHtmlParser(tooltipCont)} TooltipClasses=\"mz-svg--white\" />)\r\n }\r\n return (\r\n <div className=\"mz-alert__item\" id={Id} ref={alertRef}>\r\n {!tooltipCont && ReactHtmlParser(textDisplayed)}\r\n {tooltipCont && \r\n <p>\r\n {ReactHtmlParser(textDisplayed)}\r\n {insertTooltip()}\r\n </p>\r\n }\r\n </div>\r\n );\r\n};\r\n\r\nexport default Alert;\r\n\r\nAlert.propTypes = {\r\n Id: PropTypes.string,\r\n Desc: PropTypes.string,\r\n}\r\n\r\nAlert.defaultProps = {\r\n Id: 'AlertID',\r\n Desc: '',\r\n};","import React from \"react\";\r\nimport PropTypes from 'prop-types';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nimport { setTabsNextAndPrevButtons, goToTop, setCursorWaiting, hideCmsHiddenBlock, getLoading} from '../../../utils'\r\n\r\nimport SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\nimport NavHelper from '../../../Helpers/navhelper';\r\n\r\nimport Button from '../../1_Atoms/Button/Button';\r\nimport { TabsMenu } from \"../../2_Molecules/Tabs/TabsMenu\";\r\nimport AccessoryCard from '../../2_Molecules/AccessoryCard/AccessoryCard'\r\nimport CollapseLegal from '../../2_Molecules/Collapse/CollapseLegal';\r\nimport { Nav } from '../../3_Organisms/Nav/Nav';\r\nimport { Pricing } from '../../3_Organisms/Pricing/Pricing';\r\nimport { Modal } from '../../3_Organisms/Modal/Modal';\r\nimport { PreOrderModal } from '../../3_Organisms/Modal/PreOrderModal';\r\nimport { Alert } from '../../3_Organisms/Alert/Alert';\r\n\r\nexport const AccessoriesList = ({ HandleSelectedAccessory, ...props }) => {\r\n const summaryCalculator = window.summaryCalculator;\r\n const [nav, setNav] = React.useState(null);\r\n const { year, carline, trim, model, packageCode } = useParams();\r\n const navigate = useNavigate();\r\n const leftArrowRef = React.useRef();\r\n const rightArrowRef = React.useRef();\r\n const tabsContainerRef = React.useRef();\r\n const tabsRef = React.useRef();\r\n const [visibleLeftArrow, setVisibleLeftArrow] = React.useState(false);\r\n const [visibleRightArrow, setVisibleRightArrow] = React.useState(false);\r\n const legalContent = JSON.parse(sessionStorage.getItem(Constants.LegalAccessories));\r\n const [legalModalOpen, setLegalModalOpen] = React.useState(false);\r\n const { t, i18n } = useTranslation(['accessories', 'general']);\r\n const [accessories, setAccessories] = React.useState(null);\r\n const [categories, setCategories] = React.useState(null);\r\n const [selectedAccessories, setSelectedAccessories] = React.useState(summaryCalculator.SelectedAccessories);\r\n const [selectedCategory, setSelectedCategory] = React.useState(summaryCalculator.SelectedCategory);\r\n const [showFinancePrice, setShowFinancePrice] = React.useState(summaryCalculator.ShowFinancePrice);\r\n\r\n const [preorderOpen, setPreorderModalOpen] = React.useState(false);\r\n\r\n\tconst gtmHelper = new GTMHelper();\r\n\tconst navHelper = new NavHelper();\r\n\r\n hideCmsHiddenBlock();\r\n \r\n function handleArrowLeftClick(e) {\r\n e.preventDefault();\r\n tabsRef.current.scroll(tabsRef.current.scrollLeft - 50, 0);\r\n setTabsNextAndPrevButtons();\r\n }\r\n\r\n function handleArrowRightClick(e) {\r\n e.preventDefault();\r\n tabsRef.current.scroll(tabsRef.current.scrollLeft + 50, 0);\r\n setTabsNextAndPrevButtons();\r\n }\r\n\r\n function setTabsNextAndPrevButtons() {\r\n if (tabsRef?.current?.offsetWidth < tabsRef?.current?.scrollWidth) {\r\n if (tabsRef.current.scrollLeft === 0 && !((tabsRef.current.scrollWidth - tabsRef.current.clientWidth) == tabsRef.current.scrollLeft)) {\r\n setVisibleRightArrow(true);\r\n setVisibleLeftArrow(false);\r\n } else if ((tabsRef.current.scrollWidth - tabsRef.current.clientWidth) == tabsRef.current.scrollLeft) {\r\n setVisibleRightArrow(false);\r\n setVisibleLeftArrow(true);\r\n } else {\r\n setVisibleRightArrow(true);\r\n setVisibleLeftArrow(true);\r\n }\r\n } else {\r\n setVisibleRightArrow(false);\r\n setVisibleLeftArrow(false);\r\n }\r\n return;\r\n }\r\n\r\n function handleArrowLeftClick(e) {\r\n e.preventDefault();\r\n tabsRef.current.scroll(tabsRef.current.scrollLeft - 50, 0);\r\n setTabsNextAndPrevButtons();\r\n }\r\n\r\n function handleArrowRightClick(e) {\r\n e.preventDefault();\r\n tabsRef.current.scroll(tabsRef.current.scrollLeft + 50, 0);\r\n setTabsNextAndPrevButtons();\r\n }\r\n\r\n\t//sort popular to first item\r\n\tfunction isPopular(a, b){\r\n\t\tconst bandA = a.toUpperCase();\r\n\t\tconst bandB = b.toUpperCase();\r\n\r\n\t\tlet comparison = 0;\r\n\t\tif (bandA === 'POPULAR') {\r\n\t\t\tcomparison = -1;\r\n\t\t} else if(bandA > bandB){\r\n\t\t\tcomparison = 1;\r\n\t\t} else if(bandA < bandB){\r\n\t\t\tcomparison = -1;\r\n\t\t}\r\n\t\treturn comparison;\r\n }\r\n\r\n summaryCalculator.CurrentStep = 6;\r\n\r\n React.useEffect(async () => {\r\n if (!summaryCalculator.isDataLoaded()) {\r\n await summaryCalculator.loadVehicleData(year, carline, trim, model, packageCode);\r\n\r\n setNav(null);\r\n } else if (summaryCalculator.Categories === null) {\r\n summaryCalculator.Categories = Object.keys(summaryCalculator.Accessories.data).sort(isPopular);\r\n\r\n setCategories(summaryCalculator.Categories);\r\n } else if (summaryCalculator.SelectedCategory === null) {\r\n summaryCalculator.SelectedCategory = \"Popular\";\r\n\r\n setSelectedCategory(summaryCalculator.SelectedCategory);\r\n } else if (nav === null) {\r\n const toRender = navHelper.getNavContent(t);\r\n setNav(toRender); \r\n //setNav(navHelper.getNavContent(year, carline, trim, model, packageCode, summaryCalculator.CurrentStep, t));\r\n\r\n if (tabsRef.current) {\r\n tabsRef.current.removeEventListener('scroll', setTabsNextAndPrevButtons);\r\n tabsRef.current.addEventListener('scroll', setTabsNextAndPrevButtons, true);\r\n window.removeEventListener('resize', setTabsNextAndPrevButtons);\r\n window.addEventListener('resize', setTabsNextAndPrevButtons);\r\n\r\n setTabsNextAndPrevButtons();\r\n } \r\n }\r\n\r\n // Force first redraw\r\n if (accessories === null)\r\n {\r\n setAccessories(summaryCalculator.Accessories);\r\n }\r\n\r\n }, [summaryCalculator, selectedAccessories, selectedCategory, accessories, categories]);\r\n\r\n async function handleSelectedAccessory(index) {\r\n setCursorWaiting(true);\r\n\r\n if (summaryCalculator.SelectedAccessories.findIndex(obj => obj.index === index) === -1) {\r\n const accessory = summaryCalculator.Accessories.rawData[index][1];\r\n\r\n let selectedAccessories = summaryCalculator.SelectedAccessories;\r\n selectedAccessories.push(accessory);\r\n\r\n await summaryCalculator.setSelectedAccessories(selectedAccessories);\r\n } else {\r\n await summaryCalculator.setSelectedAccessories(summaryCalculator.SelectedAccessories.filter((value) => value.index != index));\r\n }\r\n\r\n // Force update, this is a hack!\r\n setSelectedAccessories( Math.random() ); //setSelectedAccessories(summaryCalculator.SelectedAccessories);\r\n\r\n setCursorWaiting(false);\r\n }\r\n\r\n function nextStep() {\r\n goToTop();\r\n //navigate(`/${year}/${carline}/${trim}/${model}/${packageCode}/protections${decodeURI(window.location.search)}`);\r\n navigate(`/${year}/${carline}/${trim}/${model}/${packageCode}/payments${decodeURI(window.location.search)}`);\r\n }\r\n\r\n function handleShowFinanceClick(value) {\r\n setShowFinancePrice(value);\r\n }\r\n\r\n function hasAlertBar() {\r\n return summaryCalculator?._selectedModelYear?.incentives_banner;\r\n }\r\n\r\n return (\r\n <>\r\n {getLoading(false, t)}\r\n <Nav nav={nav} />\r\n <div className={`${hasAlertBar() ? 'mz-top-nav-spacing' : ''}`}>\r\n <Alert />\r\n\r\n <div className={`accessories-list ${hasAlertBar() ? '' : 'mz-top-nav-spacing'}`}>\r\n {summaryCalculator.Accessories && summaryCalculator.Accessories.title ? <h5 className={`accessories-list__title ${hasAlertBar() ? 'no-top-margin' : ''}`}>{ReactHtmlParser(summaryCalculator.VehicleTitle)} {t(\"accessories:title\")}</h5> : null}\r\n {summaryCalculator.Accessories && summaryCalculator.Accessories.data && Object.keys(summaryCalculator.Accessories.data).length !== 0 ? <><br/><div><p className=\"mz-flex-2 caption text--grey text--center\">{ReactHtmlParser(t(\"accessories:titleLegal\"))}</p></div></> : null}\r\n {\r\n (summaryCalculator.Categories && summaryCalculator.SelectedCategory) && (\r\n <TabsMenu\r\n className=\"mz-bg--off-white\"\r\n menus={summaryCalculator.Categories.map((category, key) => ({\r\n id: key,\r\n isactive: category === summaryCalculator.SelectedCategory ? 'true': '',\r\n label: category,\r\n onClick: async () => {\r\n await summaryCalculator.setSelectedCategory(summaryCalculator.Categories[key]);\r\n setSelectedCategory(summaryCalculator.Categories[key]);\r\n\r\n gtmHelper.setGTM({'action':'Tab Click', 'accessory tab': summaryCalculator.Categories[key]}, true , false);\r\n }\r\n }))}\r\n />\r\n )\r\n \r\n }\r\n <div className='accessories-list__tab-content'>\r\n {summaryCalculator.Accessories && summaryCalculator.Accessories.data ?.All && summaryCalculator.SelectedCategory ?\r\n summaryCalculator.Accessories.data[summaryCalculator.SelectedCategory].map((accessory, key) =>\r\n <AccessoryCard Accessory={accessory} Selected={summaryCalculator.SelectedAccessories ? summaryCalculator.SelectedAccessories.findIndex(obj => obj.index === accessory.index) !== -1 : ''} HandleSelectedAccessory={handleSelectedAccessory} key={key} isPopular={summaryCalculator.SelectedCategory === 'Popular' ? true : false} showFinancePrice={showFinancePrice}></AccessoryCard>)\r\n : null}\r\n </div>\r\n {summaryCalculator.Accessories && summaryCalculator.Accessories.data && Object.keys(summaryCalculator.Accessories.data).length === 0 ? <p className=\"accessories-list__not-found\">{t(\"accessories:no_accessorie_found\")}</p> : null}\r\n <div className=\"mz-legal mz-mobile\">\r\n <Button\r\n className=\"mz-btn mz-btn--legal text--grey\"\r\n label={t(\"general:legal\")}\r\n backgroundColor=\"grey\"\r\n colour=\"grey\"\r\n icon={true}\r\n iconAfter={true}\r\n svg_className=\"\"\r\n svg_list=\"plus\"\r\n size={0.6}\r\n onClick={() => {\r\n document.querySelector('body').classList.add('disabled');\r\n setLegalModalOpen(true)\r\n }}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <Pricing builtLabel={t(\"general:price_as_built\")} builtPrice=\"$\" loanLabel={t(\"general:loan_label\")} loanPrice=\"$\" /*optionsRoute={`/${year}/${carline}/${trim}/${model}/${packageCode}/payments${decodeURI(window.location.search)}`} optionsLabel=\"See options\"*/ saveLabel={t(\"general:save_build\")}\r\n leaseLabel={t(\"general:show_lease_price\")} financeLabel={t(\"general:show_finance_price\")} buttonLabel={t(\"general:next_payments\")} summaryCalculator={summaryCalculator}\r\n HandleNextClick={nextStep} setLegalModalOpen={setLegalModalOpen} HandleShowFinanceClick={handleShowFinanceClick} setPreorderModalOpen={setPreorderModalOpen} />\r\n <Modal modalContent={legalContent} isOpen={legalModalOpen} handleClose={setLegalModalOpen} modalId='legalModal' />\r\n <PreOrderModal isOpen={preorderOpen} handleClose={setPreorderModalOpen}></PreOrderModal> \r\n </>\r\n )\r\n}\r\n\r\n\r\nexport default AccessoriesList;\r\n\r\nAccessoriesList.propTypes = {\r\n HandleSelectedAccessory: PropTypes.func,\r\n}\r\n\r\nAccessoriesList.defaultProps = {\r\n HandleSelectedAccessory: () => { },\r\n};","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { formatPrice } from '../../../utils'\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nexport const Jelly = ({topLabel, carName, carModel, carPrice, carFeatures, carImg, carImgHover, jellieHaveIcons, icon1, icon2, icon3, btnLabel, onClick, isComingSoon, ...props }) => {\r\n const { t, i18n } = useTranslation(['vehicles', 'general']); \r\n const displayFeatures = carFeatures.map((feature, key) => {\r\n\r\n\t\tlet iconType = feature.icon_type;\r\n iconType = iconType==='seat'? 'seats' : iconType;\r\n\t\ticonType = iconType==='awd'? 'drivetrain' : iconType;\r\n\t\tfeature.icon_type = iconType; //Pass it back into the array.\r\n\r\n return (\r\n <div className=\"mz-icon-text \" key={key}>\r\n <div className=\"mz-icon-text-icon\">\r\n <i className={\"mz-svg mz-svg-feature_\"+feature.icon_type}/>\r\n </div>\r\n <div className=\"mz-icon-text-text\">{ReactHtmlParser(feature.content)}</div>\r\n </div>\r\n )\r\n })\r\n\r\n return (\r\n <div\r\n className={ isComingSoon ? 'mz-jelly disabled' :'mz-jelly'}\r\n {...props}\r\n onClick={() => onClick()}\r\n >\r\n {topLabel ? <span className=\"mz-jelly-top paragraph\">{topLabel}</span> : <span className=\"mz-jelly-top\"> </span>}\r\n <div className={ isComingSoon ? 'mz-jelly-container disabled' :'mz-jelly-container'} >\r\n <div className=\"mz-image mz-jelly-image\">\r\n <img className=\"lazy\" src={carImg} alt={'Car image'}/>\r\n </div>\r\n <div className=\"mz-image mz-jelly-image--hover\">\r\n <img className=\"lazy\" src={carImgHover} alt={'Car image angled'}/>\r\n\r\n </div>\r\n </div>\r\n <div className={ isComingSoon ? 'mz-jelly-content disabled' :'mz-jelly-content'}>\r\n <h5>{ReactHtmlParser(carName)}</h5>\r\n \r\n <div>{carModel} { !isComingSoon && carPrice > 0 ? `- ${t(\"jelly_starting_at\")} ${formatPrice(carPrice)} `:''} { isComingSoon ? '' : <sup>1</sup>}</div>\r\n </div>\r\n <div className=\"mz-jelly-iconslist\">{displayFeatures}</div>\r\n </div>\r\n );\r\n};\r\n\r\nJelly.propTypes = {\r\n jellieHaveIcons: PropTypes.bool,\r\n icon1: PropTypes.bool,\r\n icon2: PropTypes.bool,\r\n icon3: PropTypes.bool,\r\n topLabel: PropTypes.string,\r\n carName: PropTypes.string,\r\n carModel: PropTypes.string,\r\n carFeatures: PropTypes.array,\r\n // carPrice: PropTypes.string,\r\n carImg: PropTypes.string,\r\n carImgHover: PropTypes.string,\r\n btnLabel: PropTypes.string,\r\n onClick: PropTypes.func,\r\n}\r\n\r\nJelly.defaultProps = {\r\n jellieHaveIcons: true,\r\n icon1: true,\r\n icon2: true,\r\n icon3: true,\r\n topLabel: '',\r\n carName: '',\r\n carModel: '',\r\n carPrice: '',\r\n carFeatures: [\r\n {\r\n \"content\": \"5\",\r\n \"icon_type\": \"seats\"\r\n },\r\n {\r\n \"content\": \"Available AWD\",\r\n \"icon_type\": \"awd\"\r\n },\r\n {\r\n \"content\": \"Available Turbo Engine\",\r\n \"icon_type\": \"turbo\"\r\n }\r\n ],\r\n carImg: '',\r\n carImgHover: '',\r\n btnLabel: 'BUILD YOURS',\r\n onClick: undefined,\r\n}\r\n\r\nexport default Jelly;","//tabs driven by core js.\r\n/* global mzFunc mzTabs */\r\n\r\nimport React, { useEffect, useState, useRef } from \"react\";\r\nimport PropTypes from 'prop-types';\r\nimport { useNavigate } from \"react-router-dom\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n//import NavHelper from '../../../Helpers/navhelper';\r\n\r\nimport Button from '../../1_Atoms/Button/Button';\r\nimport { Jelly } from '../../2_Molecules/Jelly/Jelly';\r\nimport { Modal } from '../../3_Organisms/Modal/Modal';\r\nimport { PreOrderModal } from '../../3_Organisms/Modal/PreOrderModal';\r\nimport { getLang, getProvince, hideCmsHiddenBlock, updateLanguageLink, getLoading, getApiBaseUrl } from '../../../utils';\r\n\r\nexport const VehiclePage = ({summaryCalculator = window.summaryCalculator, ...props }) => {\r\n const [response, setResponse] = useState({ model_years: [], categories: {} });\r\n const [vehicleLegal, setVehicleLegal] = useState([{ copy: '' }]);\r\n \r\n const leftArrowRef = useRef();\r\n const rightArrowRef = useRef();\r\n const tabsRef = useRef();\r\n const tabsContainerRef = useRef();\r\n const [loading, setLoading] = useState(true);\r\n const [visibleTab, setVisibleTab] = useState('2158');\r\n const [visibleLeftArrow, setVisibleLeftArrow] = useState(false);\r\n const [visibleRightArrow, setVisibleRightArrow] = useState(false);\r\n\tconst [legalModalOpen, setLegalModalOpen] = React.useState(false);\r\n const navigate = useNavigate();\r\n const { t, i18n } = useTranslation(['vehicles', 'general']);\r\n\r\n\tconst gtmHelper = new GTMHelper();\r\n\t//const navHelper = new NavHelper();\r\n\r\n summaryCalculator.CurrentStep = 0;\r\n\r\n hideCmsHiddenBlock();\r\n\r\n useEffect(() => {\r\n async function executeTasks() {\r\n // This is needed to have the right vehicle landing page for retailers which are per province\r\n const isRetailerMode = await summaryCalculator.isRetailerMode();\r\n\r\n const requestResponse = await summaryCalculator.loadVehicles();\r\n const requestLegalResponse = await summaryCalculator.loadVehiclesLegal(\"JXTN84\", \"AA00\");\r\n\r\n setResponse(requestResponse);\r\n setVehicleLegal(requestLegalResponse);\r\n\r\n setLoading(false);\r\n summaryCalculator.reset(true);\r\n\r\n\t\t\tif(typeof mzFunc === 'object' && typeof mzTabs === 'object'){\r\n\t\t\t\tmzFunc.waitForEl('.mzBuildandPrice .mz-tabs').then(function(components){mzTabs.init(components);});\r\n\t\t\t}\r\n\r\n // Rewrite the top navigation to not have the hash in the URL\r\n if(window.location.hash) {\r\n const newLocation = window.location.origin + window.location.pathname.replace('/#/', '');\r\n window.history.pushState({}, document.title, newLocation);\r\n }\r\n }\r\n\r\n executeTasks();\r\n\r\n // Used the CMS language change as this page doesn't include the NAV bar\r\n updateLanguageLink();\r\n }, []);\r\n\r\n const Cats = Object.keys(response.categories).map((item, key) => {\r\n return (\r\n <a\r\n onClick={() => {\r\n\t\t\t\t\tsetVisibleTab(response.categories[item].id);\r\n\t\t\t\t\tgtmHelper.setGTM({'action':'Tab Click','vehicle tab': response.categories[item].title}, true, false);\r\n\t\t\t\t}}\r\n key={response.categories[item].id}\r\n\t\t\t\tclassName={visibleTab === response.categories[item].id ? \"mz-tabs-tab interactive active\" : \"mz-tabs-tab interactive\"}\r\n\t\t\t>\r\n {response.categories[item].title}\r\n </a>\r\n )\r\n })\r\n\r\n const PreviusModel = response.model_years.filter(item => item.previous_model === true);\r\n\r\n if (PreviusModel.length) {\r\n const previusModelTab = <a\r\n onClick={() => {\r\n\t\t\t\tsetVisibleTab('previus_model')\r\n\t\t\t\tgtmHelper.setGTM({'action':'Tab Click', 'vehicle tab': 'Previous Model'}, true , false);\r\n\t\t\t}}\r\n key='previus_model'\r\n className={visibleTab === 'previus_model' ? \"mz-tabs-tab interactive active\" : \"mz-tabs-tab interactive\"}\r\n >\r\n {getLang() ==='en' ? 'Previous Models' : 'MODÈLES PRÉCÉDENTS'}\r\n </a>;\r\n\r\n Cats.push(previusModelTab);\r\n }\r\n\r\n const Model = response.model_years.map((item, key) => {\r\n const stripedHtml = item.description.replace(/(<([^>]+)>)/gi, \"\");\r\n const CategoryNumb = item.carline.categories.map((cat, key) => {\r\n\r\n if (cat.id === visibleTab && item.previous_model === false) {\r\n return cat.id\r\n } if (visibleTab === 'previus_model' && item.previous_model === true) {\r\n return 'previus_model'\r\n } else {\r\n return null\r\n }\r\n })\r\n\r\n\t\tconst setTopLabel = ()=>{\r\n\t\t\tlet topLabel= item.is_coming_soon ? item.coming_soon_data.top_copy : null;\r\n\t\t\ttopLabel=item.top_copy ? item.top_copy : topLabel;\r\n\r\n\t\t\treturn topLabel;\r\n\t\t}\r\n\r\n\t\tconst carCont = getLang() ==='en' ? `${item.year.title} ${item.carline.title}` : `${item.carline.title} ${item.year.title}`;\r\n\r\n return (\r\n <div key={key} className=\"mz-tabs__list\" style={CategoryNumb.includes(visibleTab) ? {} : { display: 'none' }}>\r\n <Jelly\r\n topLabel={setTopLabel()}\r\n carName={visibleTab === 'previus_model' ? carCont : item.carline.title}\r\n carModel={stripedHtml}\r\n carFeatures={item.highlighted_features}\r\n carPrice={item.financial.msrp}\r\n btnLabel=\"Design yours\"\r\n isComingSoon={item.is_coming_soon}\r\n onClick={() => {\r\n if(!item.is_coming_soon){\r\n const urlParams = new URLSearchParams(window.location.search);\r\n urlParams.set('prov_code', getProvince());\r\n urlParams.set('lang_code', getLang());\r\n //summaryCalculator.SelectedModelYear = item;\r\n window.providerCalls = 0;\r\n handleModelClick(`/${item.year.url_slug}/${item.carline.url_slug}/?${decodeURI(urlParams)}`);\r\n gtmHelper.setGTM({'action':'Vehicle Click', 'model': item.carline.url_slug, 'year': item.year.url_slug}, true , false);\r\n }\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tonMouseOver={(e) => handleModelOver(e)}\r\n\t\t\t\t\tonMouseOut={(e) => handleModelOut(e)}\r\n carImg={`${item.visual.static_content_base_path}${item.visual.jelly_path}${item.visual.jelly}`}\r\n carImgHover={`${item.visual.static_content_base_path}${item.visual.jelly_path}${item.visual.jelly_hover}`}\r\n />\r\n </div>\r\n )\r\n })\r\n\r\n const handleModelClick = navigateUrl => {\r\n window.ocaRetry = 0\r\n window.providerRetry = 0\r\n\r\n // PATCH ADDED FOR Having twice dealerID in URL and causing some session storage switch issue\r\n const currentLocation = window.location;\r\n const currentUrl = currentLocation.origin + currentLocation.pathname + currentLocation.hash;\r\n const urlWithoutQueryParams = currentUrl.split('?')[0];\r\n window.history.replaceState(null, 'React App', urlWithoutQueryParams);\r\n\r\n navigate(navigateUrl)\r\n };\r\n\tconst handleModelOver = (e) => {\r\n\t\tconst jellyContent = e.target.closest('.mz-tabs__content');\r\n\t\tconst jellySibArr = jellyContent.querySelectorAll('.mz-jelly')\r\n\t\t\tjellySibArr.forEach(jellySib =>{\r\n\t\t\t\tif(e.target !== jellySib){\r\n\t\t\t\tif(!jellySib.classList.contains('active') && jellySib.classList.contains('mz-jelly')){\r\n\t\t\t\t\tjellySib.classList.add('fade');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n };\r\n\tconst handleModelOut = (e) => {\r\n\t\tconst jellyContent = e.target.closest('.mz-tabs__content');\r\n\t\tconst jellySibArr = jellyContent.querySelectorAll('.mz-jelly')\r\n\t\t\tjellySibArr.forEach(jellySib =>{\r\n\t\t\t\tif(e.target !== jellySib){\r\n\t\t\t\tif(!jellySib.classList.contains('active') && jellySib.classList.contains('mz-jelly')){\r\n\t\t\t\t\tjellySib.classList.remove('fade');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t};\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"mz-spinner\">{t(\"loading\")}</div>\r\n )\r\n }\r\n\r\n\r\n const HasFinancialProviderError = JSON.parse(sessionStorage.getItem(Constants.HasFinancialProviderError));\r\n\r\n return (\r\n <>\r\n {getLoading(loading, t)}\r\n <div className=\"wrapper\">\r\n <div className=\"mz-vehicles mz-container\">\r\n {HasFinancialProviderError ? <h3 class=\"error\">{t(\"general:service_error\")}</h3>: ''}\r\n <h2>{t(\"app_title\")}</h2>\r\n <h5>{t(\"select_a_model\")}</h5>\r\n <div className=\"mz-tabs\" ref={tabsContainerRef}>\r\n\t\t\t\t\t<div className=\"mz-tabs-menu\">\r\n\t\t\t\t\t\t<div className=\"mz-tabs-menu-container\">\r\n\t\t\t\t\t\t <div className=\"mz-tabs-menu-inner\">\r\n \t{Cats}\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<div className=\"mz-tabs-menu--left\"><i className=\"mz-svg mz-svg--grey mz-svg-chevroncarousel mz-svg--rotate180\"></i></div>\r\n\t\t\t\t\t\t<div className=\"mz-tabs-menu--right active\"><i className=\"mz-svg mz-svg--grey mz-svg-chevroncarousel\"></i></div>\r\n </div>\r\n <div className=\"mz-tabs__content\">\r\n {Model}\r\n </div>\r\n </div>\r\n\t\t\t\t<div className=\"mz-legal\">\r\n\t <Button\r\n\t className=\"mz-btn mz-btn--legal text--grey\"\r\n\t label={t(\"general:legal\")}\r\n\t backgroundColor=\"grey\"\r\n colour=\"grey\"\r\n\t icon={true}\r\n\t iconAfter={true}\r\n\t svg_className=\"\"\r\n\t svg_list=\"plus\"\r\n\t size={0.6}\r\n\t onClick={() => {\r\n\t\t\t\t\t\t\tdocument.querySelector('body').classList.add('disabled');\r\n\t\t\t\t\t\t\tsetLegalModalOpen(true);\r\n\t\t\t\t\t\t\tgtmHelper.setGTM({'action':'Open Modal','modal': 'legal'}, true, false);\r\n\t\t\t\t\t\t}}\r\n\t />\r\n\t </div>\r\n\t\t\t\t<Modal modalContent={vehicleLegal[0].copy} isOpen={legalModalOpen} handleClose={setLegalModalOpen} modalId='legalModal' />\r\n </div>\r\n </div>\r\n </>\r\n )\r\n};\r\n\r\nVehiclePage.propTypes = {\r\n ApiUrl: PropTypes.string,\r\n}\r\n\r\nVehiclePage.defaultProps = {\r\n ApiUrl: `${getApiBaseUrl()}/api/ModelYears?prov_code=${getProvince()}&lang_code=${getLang()}`,\r\n}\r\n","/* global Draggable, mzFunc */\r\n\r\nimport React, { useEffect, useState, useRef } from 'react';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\nimport SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nexport const ThreeSixtyView = ({ imagePath, imageAmount, imageName, isLoading, ...props }) => {\r\n\tconst [summaryCalculator = new SummaryCalculator().reloadStoredData(), setSummaryCalculator] = React.useState();\r\n\tconst [imageList, setImageList] = React.useState(null)\r\n const ts = useRef();\r\n\tconst [trigger, setTrigger] = React.useState(ts.current)\r\n\tconst [imageCount, setImageCount] = React.useState(1);\r\n\tconst [draggableIsReady, setDraggableIsReady] = React.useState(false);\r\n\tconst gtmHelper = new GTMHelper();\r\n\r\n const getImages = ()=>{\r\n let images ='';\r\n for(let i=1;i<=parseInt(imageAmount);i++){\r\n images+=`<img src=\"${imagePath}${imageName.replace('{index}', i)}\" />`;\r\n }\r\n return images;\r\n }\r\n\r\n function preventScroll(e) {\r\n e.stopPropagation();\r\n return false;\r\n }\r\n\tfunction enableDraggable(){\r\n\t\t//console.log(!ts, !ts.current, trigger == undefined)\r\n\t\tif(!ts || !ts.current || trigger == undefined)\r\n\t\t\treturn;\r\n\r\n\t\t//console.log('enableDraggable', imageCount)\r\n\r\n\t\tif(typeof Draggable == 'function'){\r\n\t\t\tDraggable.create(trigger, {\r\n\t\t\t\ttype: \"x\",\r\n\t\t\t\tlockAxis: true,\r\n\t\t\t\tforce3D: true,\r\n\t\t\t\tzIndexBoost: false,\r\n\t\t\t\tcurrentPos: summaryCalculator.Current360Rotation,\r\n\t\t\t\tminimumMovement: 2, // moves more than 2px to be interpreted as a drag.\r\n\t\t\t\tonDragStart: function () {\r\n\t\t\t\t\tthis.target.classList.add('dragging')\r\n\t\t\t\t\tgtmHelper.setGTM({'action':'Drag Exterior'}, false , false);\r\n\t\t\t\t},\r\n\t\t\t\tonDrag: function () {\r\n\t\t\t\t\t// there is an extra drag event fired on mouse up that has x = 0, so check this.isDragging to skip that last one\r\n\t\t\t\t\tif (this.isDragging) {\r\n\t\t\t\t\t\tlet target = this.target;\r\n\t\t\t\t\t\tlet deltaX = this.deltaX;\r\n\r\n\t\t\t\t\t\t// When dragged forward (right)\r\n\t\t\t\t\t\tif (deltaX > 0) {\r\n\t\t\t\t\t\t\tif (this.vars.currentPos === imageCount - 1) {\r\n\t\t\t\t\t\t\t\tthis.vars.currentPos = 0;\r\n\t\t\t\t\t\t\t} else if (this.vars.currentPos < imageCount - 1) {\r\n\t\t\t\t\t\t\t\tthis.vars.currentPos += 1;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t// When dragged backward (left)\r\n\t\t\t\t\t\telse if (deltaX < 0) {\r\n\t\t\t\t\t\t\tif (this.vars.currentPos === 0) {\r\n\t\t\t\t\t\t\t\tthis.vars.currentPos = imageCount - 1;\r\n\t\t\t\t\t\t\t} else if (this.vars.currentPos > 0) {\r\n\t\t\t\t\t\t\t\tthis.vars.currentPos -= 1;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\ttarget.style.transform = `translate(-${this.vars.currentPos * 100}%, 0)`;\r\n\t\t\t\t\t\tsummaryCalculator.Current360Rotation=this.vars.currentPos;\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\tonDragEnd: function () {\r\n\t\t\t\t\tthis.target.classList.remove('dragging')\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\ttrigger.style.transform = `translate(-${summaryCalculator.Current360Rotation * 100}%, 0)`;\r\n\t\t}\r\n\t}\r\n\twindow.addEventListener('resize', set360Height);\r\n\r\n\tfunction set360Height(){\r\n\t\tconst container = document.querySelector('.mz-360-container');\r\n\t\tconst subnav = document.querySelector('.mz-sticky-submenu');\r\n\t\tconst pricing = document.querySelector('.mz-pricing');\r\n\t\tconst imageCont = document.querySelector('.mz-360-image-container');\r\n\t\tconst title = document.querySelector('.mz-360-container__tittle');\r\n\t\tconst controls = document.querySelector('.mz-360-container__controls');\r\n\t\tconst incentivebar = document.querySelector('.mz-alert__item'); // Red alert bar\r\n\t\tif(imageCont !== null && controls !== undefined && container){\r\n\t\t\tif(window.innerWidth > 1023 && subnav !== undefined && pricing !== undefined && pricing != null){\r\n\t\t\t\tconst alert = mzFunc ? mzFunc.offsetAlert : 0;\r\n\t\t\t\tconst permAlert = mzFunc ? mzFunc.offsetPermAlert : 0;\r\n\t\t\t\tconst menu = document.querySelector('.mz-menu');\r\n\t\t\t\tlet viewHeight = window.innerHeight - ( alert + permAlert + (menu ? menu.clientHeight : 0) + (subnav ? subnav.clientHeight : 0) + (pricing ? pricing.clientHeight : 0) + (incentivebar ? incentivebar.clientHeight : 0));\r\n\t\t\t\t//viewHeight = viewHeight<450? 450 : viewHeight;\r\n\t\t\t\timageCont.style.height= (viewHeight - (title.clientHeight + (controls ? controls.clientHeight : 0))) +'px';\r\n\t\t\t\tcontainer.dataset['height']=imageCont.style.height;\r\n\t\t\t}else{\r\n\t\t\t\tcontainer.dataset['height']=imageCont.clientHeight + 'px';\r\n\t\t\t\timageCont.style.height=null;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\r\n\r\n\tReact.useEffect(() => {\r\n\t\tsetImageList(getImages());\r\n\r\n\t\tif(ts.current?.querySelector('.mz-images-rotator-content')){\r\n\t\t\tsetTrigger(ts.current.querySelector('.mz-images-rotator-content'));\r\n\t\t\tsetImageCount(trigger?.querySelectorAll('img')?.length);\r\n\t\t}\r\n\r\n\t\tif(!draggableIsReady){\r\n\t\t\tconst ref = setInterval(() => {\r\n\t\t\t\tif(typeof Draggable == 'function' && imageCount > 1) {\r\n\t\t\t\t\tsetDraggableIsReady(true);\r\n\t\t\t\t\tclearInterval(ref);\r\n\t\t\t\t}\r\n\t\t\t}, 100);\r\n\t\t}\r\n\t}, [imageName, imageList, imageCount, isLoading]);\r\n\t\r\n\tReact.useEffect(() => {\r\n\t\tset360Height();\r\n\t\tenableDraggable();\r\n\t\tts.current.addEventListener(\"wheel\", preventScroll);\r\n\t\tts.current.addEventListener(\"scroll\", preventScroll);\r\n\t}, [draggableIsReady]);\r\n\t\t\r\n return (\r\n <div className=\"mz-360-image-container\" ref={ts}>\r\n\t\t\t<div className=\"mz-images-rotator-inner\">\r\n \t\t\t<div className=\"mz-images-rotator-content\">\r\n\t\t\t\t\t{!imageList ? <img src=\"/globalassets/mazda-canada/build-and-price/360_loadinganimation.gif\" /> : ReactHtmlParser(imageList)}\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default ThreeSixtyView; ","/*global mzFunc, mzImage360, PhotoSphereViewer */\r\n\r\nimport React from 'react';\r\n\r\nimport { Pannellum } from \"pannellum-react\";\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\n\r\nexport const ThreeSixtyInteriorView = ({ imagePath, ...props }) => {\r\n\tconst gtmHelper = new GTMHelper();\r\n\tconst [panoramaIsReady, setPanoramaIsReady] = React.useState(false);\r\n\r\n\twindow.addEventListener('resize', set360Height);\r\n\r\n\tfunction set360Height(){\r\n\t\tconst container = document.querySelector('.mz-360-container');\r\n\t\tconst subnav = document.querySelector('.mz-sticky-submenu');\r\n\t\tconst pricing = document.querySelector('.mz-pricing');\r\n\t\tconst imageCont = document.querySelector('.mz-360-image-container__interior');\r\n\t\tconst title = document.querySelector('.mz-360-container__tittle');\r\n\t\tconst controls = document.querySelector('.mz-360-container__controls');\r\n\t\tif(imageCont !== null && controls !== undefined && container){\r\n\t\t\tif(window.innerWidth > 1023 && subnav !== undefined && pricing !== undefined && pricing != null){\r\n\t\t\t\tconst alert = mzFunc ? mzFunc.offsetAlert : 0;\r\n\t\t\t\tconst permAlert = mzFunc ? mzFunc.offsetPermAlert : 0;\r\n\t\t\t\tconst menu = mzFunc ? mzFunc.offsetMenu : 0;\r\n\t\t\t\tlet viewHeight = window.innerHeight - ( alert + permAlert + menu + (subnav ? subnav.clientHeight : 0) + (pricing ? pricing.clientHeight : 0));\r\n\t\t\t\t//viewHeight = viewHeight<450? 450 : viewHeight;\r\n\t\t\t\timageCont.style.height= (viewHeight - (title.clientHeight + (controls ? controls.clientHeight : 0))) +'px';\r\n\t\t\t\tcontainer.dataset['height']=imageCont.style.height;\r\n\t\t\t}else{\r\n\t\t\t\t//container.dataset['height']=imageCont.clientHeight + 'px';\r\n\t\t\t\timageCont.style.height=window.innerHeight/3 +'px';\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfunction enablePanorama(){\r\n\t\tconst interiorEl = document.querySelector('.mz-360-image-container__interior');\r\n\t\tset360Height();\r\n\t\tinteriorEl.innerHTML='';\r\n\t\tconsole.log(document.getElementById('interiorModal'))\r\n\t\tif(!document.getElementById('interiorModal')){\r\n\t\t\tconst fullScreen = document.createElement('div');\r\n\t\t\tfullScreen.classList.add('mz-modal');\r\n\t\t\tfullScreen.id='interiorModal';\r\n\t\t\tfullScreen.setAttribute('aria-hidden', 'true');\r\n\t\t\tdocument.body.appendChild(fullScreen);\r\n\t\t}\r\n\t\tconsole.log(document.getElementById('interiorModal'))\r\n\t\tmzImage360.showPanorama(interiorEl, imagePath);\r\n\t}\r\n\r\n\tReact.useEffect(() => {\r\n\t\tif(!panoramaIsReady){\r\n\t\t\tconst ref = setInterval(() => {\r\n\t\t\t\tif(typeof PhotoSphereViewer == 'object') {\r\n\t\t\t\t\tenablePanorama();\r\n\t\t\t\t\tclearInterval(ref);\r\n\t\t\t\t}\r\n\t\t\t}, 100);\r\n\t\t}\t\t\r\n\t}, [imagePath]);\r\n\r\n\t// <Pannellum\r\n\t// \t width=\"100%\"\r\n\t// \t height={set360Height()}\r\n\t// \t image={imagePath}\r\n\t// \t pitch={-15}\r\n\t// \t yaw={-90}\r\n\t// \t autoLoad={true}\r\n\t// \t\t\tmouseZoom={false}\r\n\t// \t\t\tkeyboardZoom={false}\r\n\t// \t\t\tshowZoomCtrl={false}\r\n\t// \t\t\tshowFullscreenCtrl={true}\r\n\t// \t\t\torientationOnByDefault={false}\r\n\t// \t\t\tonMousedown={(evt)=>gtmHelper.setGTM({'action':'Drag Interior'}, true , false)}\r\n\t// \t\t\tonTouchstart={(evt)=>gtmHelper.setGTM({'action':'Drag Interior'}, true , false)}\r\n\t// \t >\r\n\t// \t </Pannellum>\r\n\r\n\treturn(\r\n\t\t<div className=\"mz-360-image-container__interior\">\r\n\t\t \r\n\t\t</div>\r\n\t)\r\n}\r\n\r\nexport default ThreeSixtyInteriorView;","import React from 'react';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\nimport ThreeSixtyView from '../../2_Molecules/360View/360View';\r\nimport ThreeSixtyInteriorView from '../../2_Molecules/360InteriorView/360InteriorView';\r\nimport { Svg } from '../../1_Atoms/Svg/Svg';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\n\r\nexport const ThreeSixtyContainer = ({ imagePathInterior, imagePath, imageAmount, imageName, trimName, imageIsLoading, ...props }) => {\r\n const [vehicleTrimName, setTrimName] = React.useState(trimName);\r\n const [active360, setActive360] = React.useState('exterior');\r\n //const [isModalOpen, setIsModalOpen] = React.useState(false);\r\n const [isLoading, setIsLoading] = React.useState(false);\r\n const { t, i18n } = useTranslation(['general']);\r\n\tconst gtmHelper = new GTMHelper();\r\n\r\n function toggleView() {\r\n var activeView = active360 === 'interior' ? 'exterior' : 'interior';\r\n setActive360(activeView);\r\n\t\tgtmHelper.setGTM({'action':'Change 360 View', '360 View': activeView}, true , false);\r\n }\r\n\r\n // This will launch only if trimName value has chaged.\r\n React.useEffect(() => {\r\n setTrimName(trimName);\r\n\r\n setIsLoading(imageIsLoading);\r\n }, [trimName, imagePath, imageIsLoading]);\r\n\r\n return (\r\n <div className='mz-360-container'>\r\n <h2 className=\"mz-360-container__tittle\">{ReactHtmlParser(vehicleTrimName ? vehicleTrimName : '')}</h2>\r\n {active360 === 'interior' ? <ThreeSixtyInteriorView imagePath={imagePathInterior}></ThreeSixtyInteriorView>\r\n : <ThreeSixtyView imagePath={imagePath} imageAmount={imageAmount} imageName={imageName} isLoading={isLoading}></ThreeSixtyView>}\r\n <div className=\"mz-360-container__controls\">\r\n <button className=\"mz-360-container__controls-button mz-360-container__controls-button-drag-copy\">\r\n <Svg\r\n colour=\"grey\"\r\n svg_list=\"threesixty\"\r\n svg_classname=\"threesixty\"\r\n />\r\n {t(\"general:drag_to_view_360\")}\r\n </button>\r\n <div className=\"mz-360-container__controls-actions\">\r\n <button className=\"mz-360-container__controls-button interactive\" onClick={() => toggleView()}>\r\n <Svg\r\n colour=\"grey\"\r\n svg_list={active360 !== 'interior' ? 'steeringwheel' : 'carexterior'}\r\n />\r\n {active360 !== 'interior' ? t(\"general:interior_view_360\") : t(\"general:exterior_view_360\")}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n )\r\n}\r\n\r\nexport default ThreeSixtyContainer;","import React, { useEffect, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { Svg } from '../../1_Atoms/Svg/Svg';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nexport const Collapse = ({ ColCarText1, ColCarText1Button, ColCarText2, ColCarText3, ColCarImg, ColBoxText, Selected, isPopular, isExpanded, setExpandedIndex, LegalContent, index, showCheck, ...props }) => {\r\n const [toggle, setToggle] = React.useState(false);\r\n const { t, i18n } = useTranslation(['trims']);\r\n const collapseRef = useRef(null);\r\n\r\n useEffect(() =>{\r\n if(typeof window.mzAnimator === 'object'){\r\n function setHeight(){\r\n window.mzAnimator.animateHeight(collapseRef.current, 'TrimCollapse' + index, 'init')\r\n // console.log('init',collapseRef.current, index, window.mzAnimator.heightOrigin['TrimCollapse' + index])\r\n if(window.mzAnimator.heightOrigin['TrimCollapse' + index] === 0){\r\n setTimeout(setHeight, 100);\r\n }\r\n }\r\n setHeight()\r\n }\r\n },[]);\r\n \r\n useEffect(() =>{\r\n window.mzAnimator.animateHeight(collapseRef.current, 'TrimCollapse' + index, isExpanded)\r\n //console.log('isExpanded',collapseRef.current, index, window.mzAnimator.heightOrigin['TrimCollapse' + index], isExpanded)\r\n },[isExpanded]);\r\n\r\n return (\r\n <div className={`mz-collapse ${Selected ? 'mz-collapse-selected' : ''}`}>\r\n <div\r\n onClick={(e) => {\r\n const $el = e.target;\r\n\r\n console.log($el, 'button.mz-trims-list__select-trim-button')\r\n\r\n if ($el.matches('button.mz-trims-list__select-trim-button')) {\r\n return;\r\n }\r\n\r\n if (isExpanded !== null && setExpandedIndex !== null && index !== null) {\r\n if (isExpanded === true) {\r\n setExpandedIndex(null);\r\n } else {\r\n setExpandedIndex(index);\r\n\t\t\t\t\t\t\tsetTimeout(()=>{\r\n\t\t\t\t\t\t\t\tconst collapseTarget = e.target.closest('.mz-collapse');\r\n\t\t\t\t\t\t\t\tif(collapseTarget){\r\n\t\t\t\t\t\t\t\t\tconst scrollWindow = document.querySelector('.mz-trims-list');\r\n\t\t\t\t\t\t\t\t\tconst topScroll = collapseTarget.offsetTop;\r\n\t\t\t\t\t\t\t\t\tscrollWindow.scroll({\r\n\t\t\t\t\t\t\t\t\t top:topScroll,\r\n\t\t\t\t\t\t\t\t\t behavior: 'smooth'\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t},1000);\r\n }\r\n } else {\r\n setToggle(!toggle);\r\n }\r\n }}\r\n className=\"mz-collapse__button\"\r\n >\r\n {showCheck &&\r\n <div className=\"mz-check-indicator\"><i className=\"mz-svg mz-svg--white mz-svg-checkmark\"></i></div>\r\n }\r\n <div className=\"mz-collapse__button-flex-container\">\r\n <img className=\"mz-collapse__carimg\" src={ColCarImg} alt={ColCarText1}/>\r\n <div className=\"mz-collapse__cartext-container\">\r\n {isPopular ? <p className=\"mz-collapse__cartext mz-collapse__cartext--popular\">{t(\"popular\")}</p> : null}\r\n <p className=\"mz-collapse__cartext mz-collapse__cartext--1\">{ReactHtmlParser(ColCarText1)}</p>\r\n <p className=\"mz-collapse__cartext mz-collapse__cartext--2\">{ColCarText2}<sup>1</sup><span className=\"mz-collapse__cartext mz-collapse__cartext--3\">{`${ColCarText3}`}</span></p>\r\n </div>\r\n <i className={isExpanded ? \"mz-svg mz-svg-chevron open\" : \"mz-svg mz-svg-chevron\"}></i>\r\n </div>\r\n {ReactHtmlParser(LegalContent)}\r\n\r\n <div className= {isExpanded ? \"mz-collapse__button-flex-container mz-collapse__content-box visible mz-trims-list__hr\" : \"mz-collapse__button-flex-container mz-collapse__content-box\"} ref={collapseRef}>\r\n {ReactHtmlParser(ColBoxText)}\r\n </div>\r\n {ReactHtmlParser(ColCarText1Button)}\r\n\r\n </div>\r\n <div className=\"mz-collapse__box\">{ReactHtmlParser(ColBoxText)}</div>\r\n </div>\r\n )\r\n}\r\n\r\nCollapse.propTypes = {\r\n ColCarImg: PropTypes.string,\r\n ColCarText1: PropTypes.string,\r\n ColCarText2: PropTypes.string,\r\n ColCarText3: PropTypes.string,\r\n ColBoxText: PropTypes.string,\r\n ColCarText1Button: PropTypes.string,\r\n isExpanded: PropTypes.bool,\r\n setExpandedIndex: PropTypes.func,\r\n index: PropTypes.number\r\n}\r\n\r\nCollapse.defaultProps = {\r\n ColCarImg: 'https://via.placeholder.com/100x60',\r\n ColCarText1: 'CX-5 GX',\r\n ColCarText2: '$XX,XXX',\r\n ColCarText3: '($XXX/wk)',\r\n ColBoxText: 'Pellentesque in ipsum id orci porta dapibus. Curabitur arcu erat, accumsan id imperdiet et, porttitor at sem. Nulla porttitor accumsan tincidunt. Cras ultricies ligula sed magna dictum porta. Nulla quis lorem ut libero malesuada feugiat. Curabitur arcu erat, accumsan id imperdiet et, porttitor at sem. Quisque velit nisi, pretium ut lacinia in, elementum id enim. Nulla porttitor accumsan tincidunt. Sed porttitor lectus nibh. Proin eget tortor risus.',\r\n ColCarText1Button: null,\r\n isExpanded: null,\r\n setExpandedIndex: null,\r\n index: null\r\n\r\n}\r\n\r\nexport default Collapse;","import React from 'react';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { formatPrice, getFinanceWeekly, getLeaseBiWeeklyFromMsrp } from '../../../utils';\r\n\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\n\r\nimport Button from '../../1_Atoms/Button/Button';\r\nimport Collapse from '../../2_Molecules/Collapse/Collapse';\r\n\r\nexport const TrimList = ({ trims, setSelectedTrim, selectedTrim, setLegalModalOpen, showFinancePrice, ...props }) => {\r\n const summaryCalculator = window.summaryCalculator;\r\n const [trimsData, setTrimsData] = React.useState([]);\r\n let [financeTerm, setFinanceTerm] = React.useState(parseInt(sessionStorage.getItem(Constants.FinanceTerm)));\r\n let [leaseTerm, setLeaseTerm] = React.useState(parseInt(sessionStorage.getItem(Constants.LeaseTerm)));\r\n const [expandedIndex, setExpandedIndex] = React.useState(null);\r\n const listRef = React.useRef();\r\n const { t, i18n } = useTranslation(['trims']);\r\n const handleTrimClick = e => {\r\n const $el = e.target;\r\n if ($el.matches('button.mz-trims-list__select-trim-button')) {\r\n e.stopPropagation();\r\n const index = Number($el.getAttribute('data-index'));\r\n setSelectedTrim(index);\r\n }\r\n };\r\n\r\n const setTermIndex = ()=>{\r\n // Fetch the selected term or select the last one\r\n let foundLeaseTermIndex = summaryCalculator.FinancialInfo.lease.findIndex(x => x.term === leaseTerm);\r\n if(!leaseTerm || foundLeaseTermIndex === -1)\r\n foundLeaseTermIndex = summaryCalculator.FinancialInfo.lease.length - 1;\r\n setLeaseTerm = summaryCalculator.FinancialInfo.lease[foundLeaseTermIndex].term;\r\n\r\n let foundFinanceIndex = summaryCalculator.FinancialInfo.apr.findIndex(x => x.term === financeTerm);\r\n if(!financeTerm || foundFinanceIndex === -1)\r\n foundFinanceIndex = summaryCalculator.FinancialInfo.apr.length - 1;\r\n setFinanceTerm = summaryCalculator.FinancialInfo.apr[foundFinanceIndex].term;\r\n }\r\n\r\n React.useEffect(() =>{\r\n document.addEventListener('click', handleTrimClick);\r\n\r\n if(summaryCalculator.FinancialInfo){\r\n setTermIndex()\r\n }\r\n\r\n setTrimsData(trims);\r\n\r\n if (listRef.current) {\r\n window.removeEventListener('resize', setListMaxHeight);\r\n window.addEventListener('resize', setListMaxHeight);\r\n setListMaxHeight();\r\n }\r\n\r\n return () => {\r\n document.removeEventListener('click', handleTrimClick);\r\n };\r\n },[trims, summaryCalculator.FinancialInfo, summaryCalculator.FinancialInfo?.calculatedCash, summaryCalculator.FinancialInfo?.calculatedFinance, summaryCalculator.FinancialInfo?.calculatedLease]);\r\n\r\n function isJellyPathConform(jelly)\r\n {\r\n if(!jelly)\r\n return false;\r\n\r\n var jellyContents = jelly.split('-');\r\n\r\n // Validate that we have a trim\r\n if(jellyContents && !jellyContents[jellyContents.length - 2])\r\n return false;\r\n else\r\n return true;\r\n }\r\n\r\n function getImage(trim) {\r\n const imagePath = trim.visual.static_content_base_path;\r\n //const key = Object.keys(trim.visual.exteriors)[0];\r\n\r\n if (isJellyPathConform(trim.visual.jelly)) {\r\n // Patch for the value received from the backend that has a space in.\r\n return `${imagePath}${trim.visual.jelly_path}${trim.visual.jelly.replace(/ /g, \"-\")}`;\r\n } else {\r\n // Patch for when the jelly hasn't been set in the api correctly (i.e. missing a trim like this `2022-MAZDA3--TAB.png`;)\r\n return `${imagePath}${trim.visual.jelly_path}${trim.title.replace(/ /g, '-')}-TAB.png`;\r\n }\r\n }\r\n\r\n function getLegalContent(legalArr){\r\n let legalContent = '';\r\n legalArr.map((legal, index) => {\r\n const icon = legal.icon_type === 'disclaimer' ? 'disclaimer' : 'feature_' + legal.icon_type;\r\n legalContent += `\r\n <div class=\"mz-trims-list__legal\"><i class=\"mz-svg mz-svg--grey mz-svg-${icon}\" style=\"font-size: 2rem;\"></i>\r\n <p>${legal.content}</p></div>`;\r\n })\r\n return legalContent;\r\n }\r\n\r\n function getTrimDataContent(item, index) {\r\n let highlitedfeatureList = '<ul class=\"mz-trims-list__highlited-feature-list\">';\r\n item.highlighted_features.forEach(feature => {\r\n let featureItem = '<li class=\"mz-trims-list__highlited-feature-item\">';\r\n featureItem += `<i class=\"mz-svg mz-svg--grey mz-svg-feature_${feature.icon_type} mz-i-undefined\" style=\"font-size: 1.85rem;\"></i>`;\r\n featureItem += `<p>${feature.content}</p></li>`;\r\n highlitedfeatureList += featureItem;\r\n });\r\n highlitedfeatureList += '</ul>';\r\n const featureListTitle = item.feature_list_title?`<h3 class=\"mz-trims-list__include-features-title\">${item.feature_list_title}</h3>`:'';\r\n let featureList = '<ul class=\"mz-trims-list__feature-list\">';\r\n\r\n item.feature_list.forEach(feature => {\r\n let featureItem = '<li class=\"mz-trims-list__featurei-item\">';\r\n featureItem += `<p>${feature.content}</p></li>`;\r\n featureList += featureItem;\r\n });\r\n featureList += '</ul>';\r\n\r\n //const selectTrimButton = index === selectedTrim?`<button class=\"mz-btn mz-btn--secondary mz-trims-list__select-trim-button\" data-index=\"${index}\" disabled=\"true\"><span class=\"mz-trims-list__select-trim-button-selected\"><i class=\"mz-svg mz-svg--white mz-svg-checkmark mz-i-undefined\"></i></span>${t(\"general:button_selected\")}</button>`: `<button class=\"mz-btn mz-btn--secondary mz-trims-list__select-trim-button\" data-index=\"${index}\">${t(\"btn_select_this_trim\")}</button>`;\r\n\r\n const content = highlitedfeatureList + featureListTitle + featureList;\r\n return content;\r\n }\r\n\r\n function getTrimButton(item, index) {\r\n const selectTrimButton = index === selectedTrim?`<button class=\"mz-btn mz-btn--primary mz-trims-list__select-trim-button mz-trims-list__select-trim-button-header\" data-index=\"${index}\" disabled=\"disabled\"><span>${t(\"general:button_selected\")}</span></button>`: `<button class=\"mz-btn mz-btn--primary mz-btn--red mz-trims-list__select-trim-button mz-trims-list__select-trim-button-header\" data-index=\"${index}\"><span>${t(\"btn_select_this_trim\")}</span></button>`;\r\n return selectTrimButton;\r\n }\r\n\r\n function setListMaxHeight(){\r\n if (listRef.current)\r\n if (window.innerWidth < 1025) {\r\n listRef.current.style.maxHeight = 'unset';\r\n } else {\r\n const incentivebar = document.querySelector('.mz-alert__item'); // Red alert bar\r\n\t\t\t\tconst submenu=document.querySelector(\".mz-sticky-submenu\");\r\n\t\t\t\tconst pricingBar=\r\n listRef.current.style.height = `${window.innerHeight - (submenu?.offsetTop + document.querySelector(\".mz-sticky-submenu\")?.offsetHeight + document.querySelector(\".mz-pricing\")?.offsetHeight + (incentivebar ? incentivebar.offsetHeight : 0) + 40)}px`;\r\n\t\t\t\tif(!submenu || !pricingBar){\r\n\t\t\t\t\tsetTimeout(setListMaxHeight, 100);\r\n\t\t\t\t}\r\n }\r\n\r\n }\r\n\r\n if(!summaryCalculator.FinancialInfo.calculatedFinance)\r\n return (<></>)\r\n else\r\n return (\r\n <div className=\"mz-trims-list\" ref ={listRef}>\r\n <h2 className=\"mz-trims-list__title\">{t(\"select_a_trim\")}</h2>\r\n {summaryCalculator.displayWarning() ? <div className=\"mz-alert-message paragraph paragraph--tight\">\r\n <i className=\"mz-svg mz-svg-warning mz-svg--red\"></i> \r\n <span className=\"mz-alert-message__text\">{t(\"warning_change_trim\")}</span>\r\n </div> : null}\r\n {trimsData.map((trim, index) => {\r\n const trimContent = getTrimDataContent(trim, index);\r\n const thumbnail = getImage(trim);\r\n const button = getTrimButton(trim, index);\r\n const legalContent = getLegalContent(trim.alert_features);\r\n return <Collapse key={index} Selected={selectedTrim === index} ColCarText1={trim.title} ColCarText1Button={button} showCheck={index === selectedTrim ? true : false} ColCarText2={`${formatPrice(trim.financial.msrp)}`} ColCarText3={\r\n `${showFinancePrice?\r\n `(${getFinanceWeekly(trim.financial.msrp, summaryCalculator.FinancialInfo?.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex].aprRate, summaryCalculator.FinancialInfo?.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex].term)}${t(\"general:week\")})`:\r\n !window.hideLeaseInCard ? `(${getLeaseBiWeeklyFromMsrp(trim.financial.msrp, summaryCalculator.FinancialInfo?.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].leaseRate, summaryCalculator.FinancialInfo?.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].term)}${t(\"general:bi_week\")})` : ''\r\n }`} LegalContent={legalContent} ColCarImg={thumbnail} ColBoxText={trimContent} isPopular={trim.is_popular} index={index} isExpanded={expandedIndex === index} setExpandedIndex={setExpandedIndex}> \r\n </Collapse>\r\n\t\t\t})}\r\n <div className=\"mz-legal mz-mobile\">\r\n <Button\r\n className=\"mz-btn mz-btn--legal text--grey\"\r\n label={t(\"general:legal\")}\r\n colour=\"grey\"\r\n icon={true}\r\n iconAfter={true}\r\n svg_className=\"\"\r\n svg_list=\"plus\"\r\n size={0.6}\r\n onClick={() => {\r\n\t\t\t\t\tdocument.querySelector('body').classList.add('disabled');\r\n\t\t\t\t\tsetLegalModalOpen(true)\r\n\t\t\t\t}}\r\n />\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n\r\nexport default TrimList;","import React, { useState } from 'react';\r\nimport { useNavigate, useParams } from 'react-router-dom'\r\nimport { data } from 'cheerio/lib/api/attributes';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { get360Data, goToTop, getLoading, setCursorWaiting } from '../../../utils';\r\n\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\nimport NavHelper from '../../../Helpers/navhelper';\r\nimport ThreeSixtyContainer from '../../3_Organisms/360Container/360Container';\r\nimport TrimList from '../../3_Organisms/TrimList/TrimList'\r\nimport { Pricing } from '../../3_Organisms/Pricing/Pricing';\r\nimport { Modal } from '../../3_Organisms/Modal/Modal';\r\nimport { PreOrderModal } from '../../3_Organisms/Modal/PreOrderModal';\r\nimport { Nav } from '../../3_Organisms/Nav/Nav';\r\nimport { Alert } from '../../3_Organisms/Alert/Alert';\r\n\r\nexport const TrimsPage = ({summaryCalculator = window.summaryCalculator, ...props }) => {\r\n const { year, carline } = useParams();\r\n\r\n const [images, setImages] = useState({});\r\n const navigate = useNavigate();\r\n const [loading, setLoading] = useState(true);\r\n const [is360Loading, setIs360Loading] = useState(true); \r\n const [firstEmptyDataLoad, setFirstEmptyDataLoad] = useState(false);\r\n const [fromTrimSelection, setFromTrimSelection] = useState(false);\r\n const [dataNeedUpdate, setDataNeedUpdate] = useState(false);\r\n const legalContent = JSON.parse(sessionStorage.getItem(Constants.LegalTrims));\r\n const [legalModalOpen, setLegalModalOpen] = useState(false);\r\n const [showFinancePrice, setShowFinancePrice] = React.useState(summaryCalculator.ShowFinancePrice);\r\n const [selectedTrimIndex, setSelectedTrimIndex] = useState(null);\r\n const { t, i18n } = useTranslation(['trims', 'general']);\r\n const [nav, setNav] = React.useState(null);\r\n\r\n const [preorderOpen, setPreorderModalOpen] = React.useState(false);\r\n\r\n const navHelper = new NavHelper();\r\n\tconst gtmHelper = new GTMHelper();\r\n \r\n summaryCalculator.CurrentStep = 1;\r\n \r\n function set360images() {\r\n if(!summaryCalculator.Colours)\r\n return;\r\n\r\n if (!Object.keys(images).length) {\r\n summaryCalculator.SetSelectedColorsFromParams();\r\n\r\n if (summaryCalculator.SelectedColourExteriorIndex > -1 && summaryCalculator.Colours) {\r\n const extArray = Object.entries(summaryCalculator.Colours.visual.exteriors);\r\n setImages(get360Data(summaryCalculator.Colours.visual, extArray[summaryCalculator.SelectedColourExteriorIndex][1], summaryCalculator.Colours.visual.interiors[summaryCalculator.SelectedColourInteriorIndex]));\r\n setIs360Loading(false);\r\n } else if (summaryCalculator.AvailableTrim) {\r\n setImages(get360Data(summaryCalculator.AvailableTrim.trims[summaryCalculator.SelectedTrimIndex].visual));\r\n setIs360Loading(false);\r\n }\r\n }\r\n }\r\n\r\n function nextStep() {\r\n\t\tlet url;\r\n if (summaryCalculator.SelectedTrim) {\r\n goToTop();\r\n url=`/${year}/${carline}/${summaryCalculator.SelectedTrimUrlSlug}${decodeURI(window.location.search)}`;\r\n } else {\r\n goToTop();\r\n url=`/${year}/${carline}/${summaryCalculator.DefaultTrimUrlSlug}${decodeURI(window.location.search)}`;\r\n }\r\n\t\tnavigate(url);\r\n\t\tgtmHelper.setGTM({'action':'Next Step'}, true , false);\r\n }\r\n\r\n async function handleSelectTrim(index) {\r\n setImages({});\r\n\r\n setFromTrimSelection(true);\r\n\r\n setSelectedTrimIndex(index);\r\n\r\n setDataNeedUpdate(true);\r\n }\r\n\r\n function hideShownCmsBlock() {\r\n let toHideBlocks = document.querySelectorAll('.mz-footer.visually-shown');\r\n if (toHideBlocks) {\r\n toHideBlocks.forEach(function (e) {\r\n e.classList.remove('visually-shown');\r\n e.classList.add('visually-hidden');\r\n });\r\n }\r\n }\r\n\r\n hideShownCmsBlock();\r\n\r\n goToTop();\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n React.useEffect(() => {\r\n async function executeTasks() {\r\n if (window.bnp_under_maintenance)\r\n return;\r\n \r\n if (!firstEmptyDataLoad) {\r\n setCursorWaiting(true);\r\n\r\n setFirstEmptyDataLoad(true);\r\n\r\n if (!summaryCalculator.isDataLoaded()) {\r\n summaryCalculator.reset(false);\r\n\r\n await summaryCalculator.loadVehicleData(year, carline);\r\n\r\n if (JSON.parse(sessionStorage.getItem(Constants.HasFinancialProviderError)) === true) {\r\n const vehiclePageUri = `/${decodeURI(window.location.search)}`;\r\n navigate(vehiclePageUri)\r\n }\r\n }\r\n else\r\n {\r\n setImages({});\r\n }\r\n\r\n setSelectedTrimIndex(summaryCalculator.SelectedTrimIndex);\r\n\r\n setDataNeedUpdate(true);\r\n\r\n setLoading(false);\r\n\r\n setCursorWaiting(false);\r\n }\r\n\r\n if (!loading) {\r\n if (dataNeedUpdate) {\r\n setDataNeedUpdate(false);\r\n\r\n setLoading(true);\r\n\r\n if (selectedTrimIndex !== summaryCalculator.SelectedTrimIndex) {\r\n setCursorWaiting(true);\r\n\r\n if( fromTrimSelection ) {\r\n summaryCalculator.reset(false);\r\n setFromTrimSelection(false);\r\n }\r\n\r\n await summaryCalculator.setSelectedTrimIndex(selectedTrimIndex);\r\n\r\n\t\t\t\t\t\tgtmHelper.setGTM({'action':'Trim Change'}, false, false);\r\n\r\n setCursorWaiting(false);\r\n }\r\n\r\n const toRender = navHelper.getNavContent(t);\r\n setNav(toRender);\r\n\r\n if (Object.keys(images).length === 0) {\r\n set360images();\r\n }\r\n\r\n setLoading(false);\r\n }\r\n }\r\n }\r\n\r\n executeTasks();\r\n }, [summaryCalculator, loading, dataNeedUpdate, images, selectedTrimIndex, is360Loading]);\r\n\r\n function handleShowFinanceClick(value) {\r\n summaryCalculator.ShowFinancePrice = value;\r\n setShowFinancePrice(value);\r\n }\r\n\r\n function getContent() {\r\n return (\r\n <div className=\"mz-trims-page mz-top-nav-spacing grid-no-gutter-sm\">\r\n <Nav nav={nav} />\r\n <Alert />\r\n {summaryCalculator.AvailableTrim && summaryCalculator.AvailableTrim?.trims?.length ?\r\n <div key='0' className=\"mz-full-width mz-trims-page__content general-content\">\r\n <div className=\"mz-trims-page__content-left\"> \r\n <ThreeSixtyContainer imagePathInterior={images.imagePathInterior} imagePath={images.imagePath} imageAmount={images.imageAmount} imageName={images.imageName} trimName={summaryCalculator.VehicleTitle} imageIsLoading={is360Loading} />\r\n </div>\r\n <div className=\"mz-trims-page__content-right right-container\">\r\n <TrimList trims={summaryCalculator.AvailableTrim.trims} setSelectedTrim={handleSelectTrim} selectedTrim={summaryCalculator.SelectedTrimIndex} setLegalModalOpen={setLegalModalOpen} showFinancePrice={showFinancePrice}/>\r\n </div>\r\n </div>\r\n : null}\r\n\r\n {summaryCalculator.AvailableTrim && summaryCalculator.AvailableTrim?.trims?.length ?\r\n <Pricing builtLabel={t(\"general:price_as_built\")} builtPrice=\"$\" loanLabel={t(\"general:loan_label\")} loanPrice=\"$\"\r\n leaseLabel={t(\"general:show_lease_price\")} financeLabel={t(\"general:show_finance_price\")} buttonLabel={t(\"general:next_options\")} saveLabel={t(\"general:save_build\")}\r\n HandleNextClick={nextStep} setLegalModalOpen={setLegalModalOpen} HandleShowFinanceClick={handleShowFinanceClick} setPreorderModalOpen={setPreorderModalOpen} /> : null}\r\n <Modal modalContent={legalContent} isOpen={legalModalOpen} handleClose={setLegalModalOpen} modalId='legalModal' />\r\n <PreOrderModal isOpen={preorderOpen} handleClose={setPreorderModalOpen}></PreOrderModal> \r\n </div>\r\n )\r\n }\r\n\r\n return (\r\n <>\r\n {getLoading(loading, t)}\r\n {getContent()}\r\n </>\r\n )\r\n}\r\n\r\nexport default TrimsPage;","import React from 'react';\r\nimport { useRef, useEffect } from 'react';\r\n\r\nimport PropTypes from 'prop-types';\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nimport { Tooltip } from '../../1_Atoms/Tooltip/Tooltip';\r\n\r\nexport const CollapseList = ({CollapseClasses, ColCarText1, ColBoxText, TooltipName, TooltipText, ColClassPrice, ColPrices, id, ...props }) => {\r\n\r\n\tconst gtmHelper = new GTMHelper();\r\n const [toggle, setToggle] = React.useState(false);\r\n const collapseRef = useRef();\r\n const [didInit, setInit] = React.useState(false);\r\n\r\n useEffect(() =>{\r\n const collapse = collapseRef.current; \r\n \r\n if(typeof window.mzAnimator === 'object' && !didInit && toggle){\r\n window.mzAnimator.animateHeight(collapse, 'CollapseList' + id, 'init')\r\n setInit(true);\r\n toggleCollapse(collapse);\r\n }else{\r\n toggleCollapse(collapse);\r\n }\r\n },[toggle, didInit]);\r\n\r\n useEffect(() =>{\r\n // Force a rerender to fix the height since the content has chanegd\r\n setInit(false);\r\n },[ColBoxText]);\r\n\r\n function toggleCollapse(collapse){\r\n if(toggle){\r\n window.mzAnimator.animateHeight(collapse, 'CollapseList' + id, true)\r\n }else if(toggle === false){\r\n window.mzAnimator.animateHeight(collapse, 'CollapseList' + id, false)\r\n }\r\n }\r\n\r\n return (\r\n <div className=\"mz-collapse mz-collapse--list\">\r\n <button\r\n onClick={() =>{\r\n\t\t\t\t\tsetToggle(!toggle);\r\n\t\t\t\t\tgtmHelper.setGTM({'action':'Collapse', 'type': 'Cash ' + ColCarText1, 'value': toggle}, true , false);\r\n\t\t\t\t}}\r\n className={CollapseClasses}\r\n >\r\n <div className=\"mz-collapse__cartext-container\">\r\n <div className=\"mz-collapse__text\">\r\n {ReactHtmlParser(ColCarText1)}\r\n {TooltipName !=='' && TooltipName !== undefined ?<Tooltip TooltipName={TooltipName}/>:<Tooltip TooltipText={TooltipText}/>}\r\n </div>\r\n </div>\r\n <i className={ toggle ? \"mz-svg mz-svg-chevron_small open mz-svg--grey paragraph\" : \"mz-svg mz-svg-chevron_small mz-svg--grey\"} style={{'fontSize': '1rem'}}></i>\r\n <span className={ColClassPrice}>{ColPrices}</span>\r\n </button>\r\n <div className=\"mz-collapse__box visible\" ref={collapseRef}>{ ReactHtmlParser (ColBoxText) }</div>\r\n </div>\r\n )\r\n}\r\n\r\nCollapseList.propTypes = {\r\n CollapseClasses: PropTypes.string,\r\n ColCarText1: PropTypes.string,\r\n ColBoxText: PropTypes.string,\r\n TooltipName: PropTypes.string,\r\n ColPrices: PropTypes.string,\r\n ColClassPrice: PropTypes.string,\r\n}\r\n\r\nCollapseList.defaultProps = {\r\n CollapseClasses: 'mz-collapse__button',\r\n ColCarText1: 'Term: 60 months @2.95%',\r\n ColPrices: '$XX,XXX',\r\n ColClassPrice: 'mz-collapse__price',\r\n ColBoxText: 'Pellentesque in ipsum id orci porta dapibus. Curabitur arcu erat, accumsan id imperdiet et, porttitor at sem. Nulla porttitor accumsan tincidunt. Cras ultricies ligula sed magna dictum porta. Nulla quis lorem ut libero malesuada feugiat. Curabitur arcu erat, accumsan id imperdiet et, porttitor at sem. Quisque velit nisi, pretium ut lacinia in, elementum id enim. Nulla porttitor accumsan tincidunt. Sed porttitor lectus nibh. Proin eget tortor risus.',\r\n}\r\n\r\nexport default CollapseList;","import React from 'react';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\nimport OcaService from '../../../Services/OcaService';\r\n\r\nimport Button from '../../1_Atoms/Button/Button';\r\nimport { Svg } from '../../1_Atoms/Svg/Svg';\r\n\r\nexport const OcaModal = ({financeType, handleClose, isOpen, ...props }) => {\r\n const summaryCalculator = window.summaryCalculator;\r\n const { t, i18n } = useTranslation(['general']);\r\n\r\n const ocaService = new OcaService();\r\n\r\n \r\n function handleExit(e){\r\n ocaService.sendDataToService(summaryCalculator, financeType);\r\n }\r\n return (\r\n <div className=\"mz-modal modal\" id=\"ocaModal\" aria-hidden={!isOpen}>\r\n <div className=\"wrapper\">\r\n <div className=\"mz-modal__container\">\r\n <div className=\"mz-modal__content\">\r\n <button className=\"mz-modal__close\" aria-label=\"Close Modal\" onClick={() => {\r\n handleClose(false)\r\n document.querySelector('body').classList.remove('disabled');\r\n }}>\r\n <Svg\r\n colour=\"grey\"\r\n size={1.93}\r\n svg_list=\"x\"\r\n />\r\n </button>\r\n <div className=\"mz-modal__text-container\">\r\n <h3 className=\"text--center\">{t(\"general:ocaTitle\")}</h3>\r\n <div className=\"mz-spacer mz-spacer-s\"></div>\r\n <p className=\"text--center\">{t(\"general:ocaContent\")}</p>\r\n <div className=\"mz-spacer mz-spacer-s\"></div>\r\n <div className=\"mz-container-flex\">\r\n <Button\r\n className=\"mz-btn mz-btn--primary mz-btn--red\"\r\n label={t(\"general:ocaButton\")}\r\n colour=\"white\"\r\n icon={true}\r\n iconAfter={true}\r\n svg_className=\"\"\r\n svg_list=\"chevron_small\"\r\n size={0.8}\r\n onClick={(e) => {\r\n handleClose(false);\r\n document.querySelector('body').classList.remove('disabled');\r\n handleExit(e);\r\n }}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nOcaModal.defaultProps = {\r\n handleClose: () => {\r\n },\r\n};\r\n\r\n","import React from 'react';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { Svg } from '../../1_Atoms/Svg/Svg';\r\nimport PropTypes from 'prop-types';\r\n\r\nexport const ReserveModal = ({modalContent, isOpen, modalId, handleClose, ...props }) => {\r\n const summaryCalculator = window.summaryCalculator;\r\n const { t } = useTranslation(['summary', 'general']);\r\n //const [reserveOpen, setReserveOpen] = React.useState(isOpen);\r\n\r\n React.useEffect(() => {\r\n // Restart React Forms app.\r\n // Skip if this is the first time loading it because App.js takes care of it.\r\n if (window.isReactFormsAppLoaded && typeof window.initReactFormsApp === 'function') {\r\n window.initReactFormsApp();\r\n }\r\n }, [isOpen]);\r\n\r\n return (\r\n <div className=\"mz-modal modal\" id={modalId} aria-hidden={!isOpen}>\r\n <div className=\"wrapper\">\r\n <div className=\"mz-modal__container\">\r\n <div className=\"mz-modal__content\">\r\n <button className=\"mz-modal__close\" aria-label=\"Close Modal\" onClick={() => {\r\n\t\t\t\t\t\t\tdocument.querySelector('body').classList.remove('disabled');\r\n\t\t\t\t\t\t\thandleClose(false)\r\n\t\t\t\t\t\t}}>\r\n <Svg\r\n colour=\"grey\"\r\n size={1.93}\r\n svg_list=\"x\"\r\n />\r\n </button>\r\n <div className=\"mz-modal__text-container\">\r\n {isOpen &&\r\n <>\r\n <h3>{t(\"title_reserve_yours\")}</h3>\r\n <div className=\"mzReactForms\">\r\n <input type=\"hidden\" data-mz-form-field-name=\"formType\" value=\"ReserveYourMazda\"/>\r\n <input type=\"hidden\" data-mz-form-field-name=\"modelCode\" value={summaryCalculator.selectedVehicle.model}/>\r\n <input type=\"hidden\" data-mz-form-field-name=\"modelOption\" value={summaryCalculator.selectedVehicle.packageCode}/>\r\n <input type=\"hidden\" data-mz-form-field-name=\"dealerId\" value={summaryCalculator.getDealerVars().dealerId}/>\r\n <input type=\"hidden\" data-mz-form-field-name=\"initStepTopContents\" value=\"mz-hero\"/>\r\n <input type=\"hidden\" data-mz-form-field-name=\"lastStepBottomContents\" value=\"mz-content-cards|mz-tool-icons\"/>\r\n <input type=\"hidden\" data-mz-form-field-name=\"source\" value=\"WD\"/>\r\n <input type=\"hidden\" data-mz-form-field-name=\"formDisclaimer\" value={t(\"form_disclaimer_retailer\")}/>\r\n <div className=\"mz-react-forms-root\"></div>\r\n </div>\r\n </>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nReserveModal.propTypes = {\r\n HandleTabClick: PropTypes.func,\r\n}\r\n\r\nReserveModal.defaultProps = {\r\n handleClose: () => {\r\n },\r\n};","import React from 'react';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\n\r\nimport { formatPrice, getBaseUrl, getMazdaFeesAndLeviesDetailTitle, convertKM, convertNum, getLang, getProvince, getDisplayableProvinceName } from '../../../utils';\r\n\r\nimport { openModal } from '../../../Helpers/helpers';\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nimport { Tooltip } from '../../1_Atoms/Tooltip/Tooltip';\r\nimport { Button } from '../../1_Atoms/Button/Button';\r\nimport { CollapseList } from '../../2_Molecules/Collapse/CollapseList';\r\nimport { OcaModal } from '../../3_Organisms/Modal/OcaModal';\r\nimport { ReserveModal } from '../../3_Organisms/Modal/ReserveModal';\r\nimport { PreOrderModal } from '../../3_Organisms/Modal/PreOrderModal';\r\n\r\nexport const Financial = ({\r\n openCollapsable,\r\n setOpenCollapsable,\r\n ...props }) => {\r\n\r\n const gtmHelper = new GTMHelper();\r\n \r\n const { year, carline, trim, model, packageCode } = useParams();\r\n\r\n const { t, i18n } = useTranslation(['summary', 'payments', 'general']);\r\n \r\n const [reserveOpen, setReserveModalOpen] = React.useState(false);\r\n const [preorderOpen, setPreorderModalOpen] = React.useState(false);\r\n\r\n const [ocaOpen, setOcaModalOpen] = React.useState(false);\r\n const [financeType, setFinanceType] = React.useState(false);\r\n const [getLocalOpen, setGetLocalOpen] = React.useState(false);\r\n\r\n let payment = sessionStorage.getItem(Constants.UrlSlugObjectPayments);\r\n let pathToPayment = '';\r\n\r\n if(payment) {\r\n payment = JSON.parse(payment);\r\n pathToPayment = '/'+payment.year+'/'+payment.carline+'/'+payment.trim+'/'+payment.model+'/'+payment.packageCode+'/payments?prov_code='+getProvince();\r\n } else {\r\n pathToPayment = '/'+year+'/'+carline+'/'+trim+'/'+model+'/'+packageCode+'/payments?prov_code='+getProvince();\r\n }\r\n\r\n const navigate = useNavigate();\r\n const [summaryCalculator = new SummaryCalculator().reloadStoredData(), setSummaryCalculator] = React.useState();\r\n const [feesChecked, setFeesChecked] = React.useState(summaryCalculator.IncludeFees);\r\n const [taxesChecked, setTaxesChecked] = React.useState(summaryCalculator.IncludeTaxes);\r\n const [rebatesChecked, setRebatesChecked] = React.useState(summaryCalculator.IncludeRebates);\r\n const [dataDisplayed, setDataDisplayed] = React.useState(false);\r\n const [selectedBox, setSelectedBox] = React.useState(null);\r\n\r\n const [financeTermIndex, setFinanceTermIndex] = React.useState(0);\r\n const [leaseTermIndex, setLeaseTermIndex] = React.useState(0);\r\n\r\n const financeTerm = summaryCalculator.FinanceTerm ? summaryCalculator.FinanceTerm : summaryCalculator.FinancialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex].term;\r\n const leaseTerm = summaryCalculator.LeaseTerm ? summaryCalculator.LeaseTerm: summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].term;\r\n const currentIncentives = summaryCalculator.FinancialInfo.incentive_programs.find(element => element.type === \"incentive\");\r\n\r\n const inclusionCheck = async (event) => {\r\n if(event.target.id === 'fees') {\r\n summaryCalculator.IncludeFees = !summaryCalculator.IncludeFees;\r\n await summaryCalculator.RecalculateFinancialInfo();\r\n setFeesChecked(!feesChecked);\r\n\r\n gtmHelper.setGTM({'action':'Checkbox', 'type': 'Include fees', 'value': feesChecked}, true , false);\r\n }\r\n if(event.target.id === 'taxes') {\r\n summaryCalculator.IncludeTaxes = !summaryCalculator.IncludeTaxes;\r\n await summaryCalculator.RecalculateFinancialInfo();\r\n setTaxesChecked(!taxesChecked)\r\n\r\n gtmHelper.setGTM({'action':'Checkbox', 'type': 'Include taxes', 'value': taxesChecked}, true , false);\r\n }\r\n if(event.target.id === 'rebates') {\r\n summaryCalculator.IncludeRebates = !summaryCalculator.IncludeRebates;\r\n await summaryCalculator.RecalculateFinancialInfo();\r\n setRebatesChecked(!rebatesChecked);\r\n \r\n gtmHelper.setGTM({'action':'Checkbox', 'type': 'Include rebate', 'value': rebatesChecked}, true , false);\r\n }\r\n }\r\n\r\n const Obj = JSON.parse(sessionStorage.getItem(Constants.FinancialObj));\r\n\r\n const handleEditFinanceLinkClick = (e) => {\r\n e.preventDefault();\r\n\r\n navigate(pathToPayment);\r\n }\r\n\r\n const handleEditLeaseLinkClick = (e) => {\r\n e.preventDefault();\r\n\r\n navigate(pathToPayment);\r\n }\r\n\r\n function getOptionList() {\r\n let optionList = '';\r\n \r\n const options = summaryCalculator.FinancialInfo ?.calculatedFinance ?.options;\r\n\r\n if(options.exteriorColour.price >0){\r\n optionList += ` <li >\r\n <p>${t('payments:exterior')} <span>${options.exteriorColour.description}</span></p>\r\n <span>${formatPrice(options.exteriorColour.price, true)}</span>\r\n </li>`\r\n }\r\n if(options ?.interiorColour.price >0){\r\n optionList += ` <li>\r\n <p>${t('payments:interior')} <span>${options.interiorColour.description}</span></p>\r\n <span>${formatPrice(options.interiorColour.price, true)}</span>\r\n </li>`\r\n }\r\n if(options ?.model_option_package ?.financial ?.msrp >0){\r\n optionList += ` <li>\r\n <p>${t('payments:package')} <span>${options.model_option_package.name}</span></p>\r\n <span>${formatPrice(options.model_option_package.financial.msrp, true)}</span>\r\n </li>`\r\n }\r\n\r\n /*const selectedWarrantyPackage = JSON.parse(sessionStorage.getItem('selectedWarrantyPackage'));\r\n if(selectedWarrantyPackage != null && selectedWarrantyPackage.name != undefined ){\r\n const warrantyPrice = (JSON.parse(sessionStorage.getItem('selectedWarrantyPackage')).financial.msrp);\r\n optionList += ` <li>\r\n <p>${t(\"payments:warranties\")} <span>${selectedWarrantyPackage.name}</span></p>\r\n <span>${formatPrice(warrantyPrice, true)}</span>\r\n </li>`\r\n } \r\n \r\n const selectedConnectedVehiclePackage = JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage'));\r\n if(selectedConnectedVehiclePackage != null && selectedConnectedVehiclePackage.title != undefined){\r\n const connectedPrice = (JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage')).financial.msrp);\r\n optionList += ` <li>\r\n <p>${t(\"payments:connected\")} <span style=\"text-transform:lowercase\">${selectedConnectedVehiclePackage.title}</span></p>\r\n <span>${formatPrice(connectedPrice, true)}</span>\r\n </li>`\r\n }\r\n\r\n const selectedAddedProtectionPackage = summaryCalculator.SelectedAddedProtectionPackage;\r\n if(selectedAddedProtectionPackage && selectedAddedProtectionPackage.name){\r\n const selectedAddedProtectionPackagePrice = selectedAddedProtectionPackage.financial.msrp;\r\n optionList += ` <li>\r\n <p class=\"desc\">${t(\"payments:added_protection\")} <span style=\"text-transform:lowercase\"> ${selectedAddedProtectionPackage.name}</span></p>\r\n <span class=\"price\">${formatPrice(selectedAddedProtectionPackagePrice, true)}</span>\r\n </li>`\r\n } \r\n\r\n const appearanceProtectionPlan = summaryCalculator.SelectedAppearanceProtectionPlan;\r\n const selectedAppearanceProtectionPlansPackage = summaryCalculator.SelectedAppearanceProtectionPlansPackage; JSON.parse(sessionStorage.getItem('selectedAppearanceProtectionPlansPackage'));\r\n if(appearanceProtectionPlan.name && selectedAppearanceProtectionPlansPackage.name){\r\n const selectedAppearanceProtectionPlansPackagePrice = selectedAppearanceProtectionPlansPackage.financial.msrp;\r\n optionList += ` <li>\r\n <p class=\"desc\">${t(\"payments:appearance_protection\")} <span style=\"text-transform:lowercase\">${appearanceProtectionPlan.name} ${selectedAppearanceProtectionPlansPackage.name}</span></p>\r\n <span class=\"price\">${formatPrice(selectedAppearanceProtectionPlansPackagePrice, true)}</span>\r\n </li>`\r\n }\r\n\r\n\r\n if(options.wheels.price >0){\r\n optionList += ` <li>\r\n <p><span>${options.wheels.title}</span></p>\r\n <span>${formatPrice(options.wheels.price, true)}</span>\r\n </li>`\r\n }*/\r\n\r\n return optionList;\r\n }\r\n \r\n function getMazdaPriceDetails() {\r\n // TODO : CHECK IF WEED ANYTHING - TO WILL FROM VIET\r\n //<li><p>${t(\"payments:accessories\")}${t(\"payments:accLegal\")}</p><span>${formatPrice(summaryCalculator.FinancialInfo.calculatedCash.accessories.total, true)}</span></li>\r\n return `<ul>\r\n <li><p>${getMazdaFeesAndLeviesDetailTitle(\"Administration Fee\", t)}<sup>9</sup></p><span>${formatPrice(summaryCalculator.FinancialInfo.adminServiceFees, true)}</span></li>\r\n <li><p>${t(\"payments:msrp\")}</p><span>${formatPrice(summaryCalculator.SelectedModel.financial.msrp, true)}</span></li>\r\n ${getOptionList()}\r\n <li><p>${t(\"payments:freight\")}</p><span>${formatPrice(summaryCalculator.FinancialInfo.freight, true)}</span></li>\r\n <li><p>${t(\"general:pde\")}</p><span>${formatPrice(summaryCalculator.FinancialInfo.pde, true)}</span></li>\r\n </ul>`;\r\n }\r\n\r\n function getWheelsDetails() {\r\n const options = summaryCalculator.FinancialInfo ?.calculatedFinance ?.options;\r\n\r\n return `<ul>\r\n <li><p>${`4x ${options.wheels.title}`}</p><span>${formatPrice(options.wheels.base_msrp, true)}</span></li>\r\n <li><p>${`4x ${t(\"payments:tpms\")}`}</p><span>${formatPrice(options.wheels.tpms, true)}</span></li>\r\n <li><p>${t(\"payments:installation\")}</p><span>${formatPrice(options.wheels.install_cost, true)}</span></li>\r\n </ul>`;\r\n }\r\n\r\n function getConnectivityDetails() {\r\n const selectedConnectedVehiclePackage = JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage'));\r\n if(selectedConnectedVehiclePackage != null && selectedConnectedVehiclePackage.title != undefined){\r\n const connectedPrice = (JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage')).financial.msrp);\r\n\r\n return `<ul>\r\n <li><p>${`${selectedConnectedVehiclePackage.title}`}</p><span>${formatPrice(connectedPrice, true)}</span></li>\r\n </ul>`;\r\n }\r\n\r\n return '';\r\n }\r\n \r\n function getAccessoriesDetails() {\r\n let accessories = sessionStorage.getItem(Constants.SelectedAccessories);\r\n accessories = JSON.parse(accessories); \r\n \r\n let list = \"<ul>\";\r\n //console.log(accessories);\r\n accessories.map((accessory, index) => {\r\n list += `<li class=\"financial_accessories\"><p>${accessory.name}</p><span>${formatPrice(accessory.base_msrp, true)}</span></li>`\r\n list += `<li class=\"financial_accessories\"><p>${accessory.name} - Installation</p><span>${formatPrice(accessory.install_cost, true)}</span></li>`\r\n });\r\n list += \"</ul>\"\r\n return list;\r\n }\r\n\r\n function getProtectionDetails() {\r\n let list = \"<ul>\"; \r\n\r\n if(summaryCalculator.SelectedAddedProtectionPackage.name != undefined ){\r\n list += `<li><p>${t(\"payments:added_protection\")} <span>${summaryCalculator.SelectedAddedProtectionPackage.name}</span></p><span>${formatPrice(summaryCalculator.SelectedAddedProtectionPackage.financial.msrp, true)}</span></li>`\r\n }\r\n if(summaryCalculator.SelectedAppearanceProtectionPlan.name != undefined && summaryCalculator.SelectedAppearanceProtectionPlansIndex !== null) {\r\n\r\n list += `<li><p>${t(\"payments:appearance_protection\")} <span>${summaryCalculator.SelectedAppearanceProtectionPlansPackage.name} for ${summaryCalculator.SelectedAppearanceProtectionPlan.name}</span></p><span>${formatPrice(summaryCalculator.SelectedAppearanceProtectionPlansPackage.financial.msrp, true)}</span></li>`\r\n } \r\n\r\n list += \"</ul>\"\r\n return list;\r\n }\r\n\r\n function getMazdaFeesAndLeviesDetails() {\r\n const feesAndLeviesToDisplay = summaryCalculator.FinancialInfo.calculatedCash.feesAndLevies.detail.filter(item => item.title !== 'PDE');\r\n\r\n return `<ul>\r\n ${feesAndLeviesToDisplay.map((fee, index) => `<li key=\"${index}\">\r\n <p>${getMazdaFeesAndLeviesDetailTitle(fee.title, t)}${fee.sup ? `<sup>${fee.sup}</sup>` : ''}</p><span>${formatPrice(fee.price, true)}</span>\r\n </li>`).join(\"\")}\r\n </ul>`;\r\n }\r\n\r\n function getMazdaFeesAndLeviesPricingWithoutPDE() {\r\n const total = summaryCalculator.FinancialInfo.calculatedCash.feesAndLevies.detail.filter(item => item.title !== 'PDE').reduce((total, fee) => total + fee.price, 0);\r\n return total;\r\n }\r\n\r\n function getMazdaPrice() {\r\n return summaryCalculator.FinancialInfo.calculatedCash.mazdaPrice;\r\n }\r\n\r\n function getWheelsPrice() {\r\n const options = summaryCalculator.FinancialInfo ?.calculatedCash ?.options;\r\n\r\n return options.wheels.price;\r\n }\r\n\r\n function getConnectivityPrice() {\r\n const connectedPrice = (JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage')).financial.msrp);\r\n\r\n return connectedPrice;\r\n }\r\n\r\n function getAccessoriesPrice() {\r\n const accessories = summaryCalculator.FinancialInfo ?.calculatedCash ?.accessories;\r\n\r\n return accessories.total;\r\n }\r\n \r\n function getProtectionPrice() {\r\n const protectionPrice = summaryCalculator.SelectedAddedProtectionPackage.financial.msrp + summaryCalculator.SelectedAppearanceProtectionPlansPackage.financial.msrp;\r\n \r\n return protectionPrice;\r\n } \r\n\r\n\tfunction getRebatesDetails() {\r\n return `<ul>\r\n ${summaryCalculator.FinancialInfo.calculatedCash.evRebates.details.map((rebate, index) => `<li key=\"${index}\">\r\n \t<p class=\"text--green\">${rebate.title==='federal'? t('payments:fed_rebate'):t('payments:prov_rebate') + ' ('+getProvince()+')'}</p><span class=\"text--green\">-${formatPrice(rebate.cash, true)}</span>\r\n </li>`).join(\"\")}\r\n </ul>`;\r\n }\r\n\r\n function getCreditsDetails() {\r\n const currentIncentives = summaryCalculator.FinancialInfo.incentive_programs.find(element => element.type === \"incentive\");\r\n return `<ul class=\"negative\">\r\n ${Obj.calculatedCash.incentives.taxable.details.map((incentive, index) => {\r\n const price = incentive.cash_value ? incentive.cash_value : incentive.value;\r\n return `<li key=\"${index}\">\r\n <p>${getIncentiveDisplayName(incentive)}</p><span>-${formatPrice(price, true)}</span>\r\n </li>`;\r\n }).join(\"\")}\r\n ${Obj.calculatedCash.incentives.nonTaxable.details.map((incentive, index) => {\r\n const price = incentive.cash_value ? incentive.cash_value : incentive.value;\r\n return `<li key=\"${index}\">\r\n <p>${getIncentiveDisplayName(incentive)}</p><span>-${formatPrice(price, true)}</span>\r\n </li>`;\r\n }).join(\"\")}\r\n ${currentIncentives && currentIncentives.value > 0 ? `<li>\r\n <p>${t(\"payments:current_incentives\")}</p>\r\n <span>${currentIncentives?'-':''}${formatPrice(currentIncentives.value, true)}</span>\r\n </li>`:''}\r\n ${(summaryCalculator.FinancialInfo.mazdaCashIncentive > 0) ? `<li>\r\n <p>${t(\"payments:mazda_cash_incentive\")}</p>\r\n <span style=\"white-space: nowrap;\">${summaryCalculator.FinancialInfo.mazdaCashIncentive?'-':''}${formatPrice(summaryCalculator.FinancialInfo.mazdaCashIncentive, true)}</span>\r\n </li>`:''}\r\n <li>\r\n <p>${t(\"payments:trade_in\")}<sup>1</sup></p><span>${Obj.tradeInValue>0?'-':''}${formatPrice(Obj.tradeInValue, true)}</span>\r\n </li>\r\n </ul>`;\r\n }\r\n\r\n function getIncentiveDisplayName(incentive) {\r\n switch(incentive.type) {\r\n case \"loyalty\" :\r\n return t(\"payments:mazda_owner_loyalty_program\");\r\n case \"military\":\r\n return t(\"payments:mazda_military_program\");\r\n case \"grad_award\":\r\n return t(\"payments:mazda_graduate_program_award\");\r\n case \"first_time_owner\":\r\n return t(\"payments:mazda_first_time_owner\");\r\n default:\r\n return incentive.type;\r\n }\r\n }\r\n\r\n function getAnnualMileageText() {\r\n let mileage = '';\r\n switch (parseInt(summaryCalculator.AnnualMileage)) {\r\n case 2:\r\n mileage = 20000;\r\n break;\r\n case 3:\r\n mileage = 16000;\r\n break;\r\n case 0:\r\n mileage = 24000;\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n return `${convertKM(mileage)}/${t('year')}`;\r\n }\r\n\r\n\r\n async function handleReserveYoursClick(PurchaseMethod) {\r\n const isRetailerMode = await summaryCalculator.isRetailerMode();\r\n summaryCalculator.CurrentPurchaseMethod = PurchaseMethod;\r\n if (isRetailerMode) {\r\n setReserveModalOpen(true);\r\n } else {\r\n openGetLocal();\r\n }\r\n }\r\n\r\n function handlePreOrderClick() {\r\n document.querySelector('body').classList.add('disabled');\r\n setPreorderModalOpen(true);\r\n }\r\n\r\n\r\n function openGetLocal(){\r\n const lang = getLang();\r\n gtmHelper.setGTM({'action':'Open Modal','modal': 'Contact Dealer'}, true, false);\r\n\r\n const targetModal = document.getElementById('mz-react-send-build-to-dealer-modal');\r\n if (targetModal && summaryCalculator) {\r\n if (summaryCalculator.SelectedColourExteriorIndex !== 'null' && summaryCalculator.Colours !== null) {\r\n const heading = targetModal.querySelector('.mz-send-build-to-dealer__vehicle-name');\r\n if (heading) {\r\n heading.textContent = lang === 'en' ? summaryCalculator._selectedModelYear.year.title + ' ' + ReactHtmlParser(summaryCalculator._selectedModelYear.carline.title) : ReactHtmlParser(summaryCalculator._selectedModelYear.carline.title) + ' ' + summaryCalculator._selectedModelYear.year.title;\r\n }\r\n }\r\n openModal('mz-react-send-build-to-dealer-modal');\r\n }\r\n }\r\n\r\n function financeClick(financeType){\r\n document.querySelector('body').classList.add('disabled');\r\n\t\tsetOcaModalOpen(true);\r\n setFinanceType(financeType);\r\n\r\n const price = financeType === 'loan' ? summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceWithFeesWithRebatesTaxed : summaryCalculator.FinancialInfo.calculatedLease.balanceToLeaseWithFeesWithRebatesTaxed;\r\n gtmHelper.setGTM({'action':`OCA - ${financeType === 'loan' ? 'Finance': 'Lease'} Summary`,'year': year,'model': ReactHtmlParser(carline), 'trim': trim, 'price' : Math.round(price)}, true, false);\r\n }\r\n\r\n function getLoanInformationalApr() {\r\n return summaryCalculator.getResponsesHasError() ? '-' : convertNum(summaryCalculator.getLoanInformationalAprRate(),2) + '%'\r\n }\r\n\r\n function getLeaseInformationalApr() {\r\n return summaryCalculator.getResponsesHasError() ? '-' : convertNum(summaryCalculator.getLeaseInformationalAprRate(),2) + '%'\r\n }\r\n\r\n function hasLoanRatePercentageDiscount(financeElement) {\r\n return (Number.parseFloat(financeElement.aprRate) !== Number.parseFloat(financeElement.aprRateDiscounted));\r\n }\r\n\r\n function getLoanRate() {\r\n const financeElement = summaryCalculator.FinancialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex];\r\n\r\n if (summaryCalculator.getResponsesHasError() === true)\r\n return '-'; \r\n else {\r\n if (hasLoanRatePercentageDiscount(financeElement))\r\n return convertNum(financeElement.aprRateDiscounted,2) + '%'\r\n else\r\n return convertNum(financeElement.aprRate,2) + '%'\r\n } \r\n }\r\n\r\n function hasLeaseRatePercentageDiscount(leaseElement) {\r\n return (Number.parseFloat(leaseElement.leaseRate) !== Number.parseFloat(leaseElement.leaseRateDiscounted));\r\n }\r\n \r\n function getLeaseRate() {\r\n //return summaryCalculator.getResponsesHasError() ? '-' : convertNum(summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].leaseRate,2) + '%';\r\n const leaseElement = summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex];\r\n\r\n if (summaryCalculator.getResponsesHasError() === true)\r\n return '-'; \r\n else {\r\n if (hasLeaseRatePercentageDiscount(leaseElement))\r\n return convertNum(leaseElement.leaseRateDiscounted,2) + '%'\r\n else\r\n return convertNum(leaseElement.leaseRate,2) + '%'\r\n } \r\n }\r\n\r\n function getLoanWeekly() {\r\n const financeElement = summaryCalculator.FinancialInfo.calculatedFinance.financeValues[financeTermIndex];\r\n\r\n return summaryCalculator.getResponsesHasError() ? '-' : formatPrice(financeElement[summaryCalculator.IncludeTaxes ? 'weeklyWithTaxes' : 'weekly']);\r\n }\r\n\r\n function getLoanBiWeekly() {\r\n const financeElement = summaryCalculator.FinancialInfo.calculatedFinance.financeValues[financeTermIndex];\r\n \r\n return summaryCalculator.getResponsesHasError() ? '-' : formatPrice(financeElement[summaryCalculator.IncludeTaxes ? 'biWeeklyWithTaxes' : 'biWeekly']);\r\n }\r\n\r\n function getLoanMonthly() {\r\n const financeElement = summaryCalculator.FinancialInfo.calculatedFinance.financeValues[financeTermIndex];\r\n\r\n return summaryCalculator.getResponsesHasError() ? '-' : formatPrice(financeElement[summaryCalculator.IncludeTaxes ? 'monthlyWithTaxes' : 'monthly']);\r\n }\r\n\r\n function getLeaseWeekly() {\r\n const leaseElement = summaryCalculator.FinancialInfo.calculatedLease.leaseValues[leaseTermIndex];\r\n\r\n return summaryCalculator.getResponsesHasError() ? '-': formatPrice(leaseElement[summaryCalculator.IncludeTaxes ? 'weeklyWithTaxes' : 'weekly']);\r\n }\r\n\r\n function getLeaseBiWeekly() {\r\n const leaseElement = summaryCalculator.FinancialInfo.calculatedLease.leaseValues[leaseTermIndex];\r\n \r\n return summaryCalculator.getResponsesHasError() ? '-' : formatPrice(leaseElement[summaryCalculator.IncludeTaxes ? 'biWeeklyWithTaxes' : 'biWeekly']);\r\n }\r\n\r\n function getLeaseMonthly() {\r\n const leaseElement = summaryCalculator.FinancialInfo.calculatedLease.leaseValues[leaseTermIndex];\r\n\r\n return summaryCalculator.getResponsesHasError() ? '-' : formatPrice(leaseElement[summaryCalculator.IncludeTaxes ? 'monthlyWithTaxes' : 'monthly']);\r\n }\r\n \r\n React.useEffect(() => {\r\n setSelectedBox(null);\r\n if(feesChecked) {\r\n setSelectedBox('feesCheck');\r\n }\r\n if(taxesChecked) {\r\n setSelectedBox('taxesCheck');\r\n }\r\n if(rebatesChecked) {\r\n setSelectedBox('rebatesCheck');\r\n }\r\n if(feesChecked && taxesChecked) {\r\n setSelectedBox('feestaxes');\r\n }\r\n if(feesChecked && rebatesChecked) {\r\n setSelectedBox('feesrebates');\r\n }\r\n if(taxesChecked && rebatesChecked) {\r\n setSelectedBox('taxesrebates');\r\n }\r\n if(feesChecked && taxesChecked && rebatesChecked) {\r\n setSelectedBox('allCheck');\r\n }\r\n \r\n async function executeTask() {\r\n await summaryCalculator.RecalculateFinancialInfo();\r\n setFinanceTermIndex(summaryCalculator.FinancialInfo.calculatedFinance.financeValues.findIndex(x => x.term === financeTerm));\r\n setLeaseTermIndex(summaryCalculator.FinancialInfo.calculatedLease.leaseValues.findIndex(x => x.term === leaseTerm));\r\n\r\n document.addEventListener('click',handleContactDealerLinkClick);\r\n }\r\n window.addEventListener(\"message\", function (e) { \r\n if (e.data.type === \"formEvent\") {\r\n if(e.data.origin==='form'){\r\n \r\n // If the message 'generic' is passed, return & fire generic callback\r\n if (e.data.message === \"open\") {\r\n setReserveModalOpen(true);\r\n }\r\n }else if(e.data.origin === 'getLocalPrice'){\r\n if (e.data.message === \"open\") {\r\n openGetLocal();\r\n }\r\n }else if(e.data.origin === 'preOrder'){\r\n sessionStorage.setItem('preorder', e.data.message.dealer_code);\r\n handlePreOrderClick();\r\n }\r\n\r\n }\r\n });\r\n \r\n executeTask(); \r\n }, [feesChecked, taxesChecked, dataDisplayed, selectedBox, rebatesChecked])\r\n\r\n\r\n /* START HORRIBLE HACK */\r\n /* TODO : MOVE TRANSLATION TEXT IN RESOURCE FILE AND MAKE A GENERIC FUNCTION FOR THE SPECIALITY \"WORD\" */\r\n function isEnglish() {\r\n return getLang() === 'en';\r\n }\r\n \r\n function getDisplayableProvinceName() {\r\n const provinceCode = getProvince().toLowerCase();\r\n const provinceNames = {\r\n 'on': { en: 'Ontario', fr: 'en Ontario' },\r\n 'qc': { en: 'Quebec', fr: 'au Québec' },\r\n 'ab': { en: 'Alberta', fr: 'en Alberta' },\r\n 'bc': { en: 'British Columbia', fr: 'au Colombie Britanique' },\r\n 'mb': { en: 'Manitoba', fr: 'au Manitoba' },\r\n 'nb': { en: 'New Brunswick', fr: 'au Nouveau-Brunswick' },\r\n 'nl': { en: 'Newfoundland', fr: 'à Terre-Neuve-et-Labrador' },\r\n 'nt': { en: 'North-West Territories', fr: 'à Territoires du nord-ouest' },\r\n 'ns': { en: 'Nova Scotia', fr: 'en Nouvelle-Écosse' },\r\n 'nu': { en: 'Nunavut', fr: 'au Nanavut' },\r\n 'pe': { en: 'Prince Edward Island', fr: \"à l'ÃŽle-du-Prince-Édouard\" },\r\n 'sk': { en: 'Saskatchewan', fr: 'en Saskatchewan' },\r\n 'yt': { en: 'Yukon', fr: 'au Yukon' },\r\n };\r\n \r\n const provinceName = provinceNames[provinceCode];\r\n return provinceName ? provinceName[isEnglish() ? 'en' : 'fr'] : '';\r\n }\r\n \r\n function getAccessoriesTooltipText() {\r\n const provinceName = getDisplayableProvinceName();\r\n \r\n const text = isEnglish()\r\n ? `Labour for installation is calculated using average labour rates in ${provinceName}.`\r\n : `Le coût de la main-d'Å“uvre pour l'installation est calculé en fonction du tarif horaire moyen ${provinceName}.`;\r\n \r\n return text;\r\n }\r\n\r\n function getTooltipText() {\r\n const lang = getLang();\r\n \r\n return lang === 'en' ? `Labour for installation is calculated using average labour rates in ${getDisplayableProvinceName()}.` : `Le coût de la main-d'Å“uvre pour l'installation est calculé en fonction du tarif horaire moyen ${getDisplayableProvinceName()}.`;\r\n }\r\n /* END HORRIBLE HACK */\r\n\r\n function getLoanDisplayedRate() {\r\n const financeElement = summaryCalculator.FinancialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex];\r\n if (Number.parseFloat(financeElement.aprRate) !== Number.parseFloat(financeElement.aprRateDiscounted))\r\n return convertNum(financeElement.aprRateDiscounted,2);\r\n else\r\n return convertNum(financeElement.aprRate,2);\r\n }\r\n\r\n function getLeaseDisplayedRate() {\r\n // `${convertNum(summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].leaseRate,2)}`\r\n const leaseElement = summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex];\r\n if (Number.parseFloat(leaseElement.leaseRate) !== Number.parseFloat(leaseElement.leaseRateDiscounted))\r\n return convertNum(leaseElement.leaseRateDiscounted,2);\r\n else\r\n return convertNum(leaseElement.leaseRate,2);\r\n }\r\n\r\n function getQCEVDisclaimerSection(){\r\n if(summaryCalculator.IncludeRebates && getProvince() === 'QC' && summaryCalculator.FinancialInfo?.ev_rebates?.length){\r\n return (\r\n <> \r\n <div class=\"mz-QC-EV-disclaimer text--grey\">\r\n {ReactHtmlParser(t(\"general:QCEVDisclaimer\"))}\r\n \r\n </div>\r\n \r\n </>\r\n )\r\n }\r\n }\r\n function handleContactDealerLinkClick(e){\r\n if(e.target.id === 'QCEVD_link' && document.getElementById('contactDealer')){\r\n e.preventDefault();\r\n console.log(document.getElementById('contactDealer'))\r\n document.getElementById('contactDealer').scrollIntoView();\r\n }\r\n }\r\n\r\n\r\n return (\r\n <>\r\n \r\n <div className=\"mz-container mz-financial--container\">\r\n <div className=\"mz-financial--actions mz-financial--actions-alt\">\r\n <div className=\"actions__wrapper\">\r\n\t\t\t\t\t{summaryCalculator.FinancialInfo.calculatedCash.evRebates.details.length > 0 && summaryCalculator.FinancialInfo.calculatedCash.evRebates.details[0].cash && <div className=\"actions__item\">\r\n\t\t\t\t\t\t<input type=\"checkbox\" value=\"\" onClick={inclusionCheck} defaultChecked={rebatesChecked} id=\"rebates\" />\r\n\t\t\t\t\t\t<label htmlFor=\"rebates\"> {t(\"payments:checkbox_include_government_rebates\")}</label>\r\n\t\t\t\t\t</div>}\r\n <div className=\"actions__item\">\r\n <div className=\"mz-form-item mz-form-item--checkbox \">\r\n <label className=\"mz-form-item__inner\" htmlFor=\"fees\">\r\n {t(\"payments:checkbox_include_fees_and_levies\")}\r\n <input type=\"checkbox\" className=\"mz-form-item__checkbox\" id=\"fees\" name=\"fees\" onClick={inclusionCheck} defaultChecked={feesChecked} value=\"\" />\r\n {/* <div className=\"mz-form-item__checkmark\">\r\n <div className=\"mz-svg-wrapper\">\r\n <i className=\"mz-svg mz-svg--black undefined mz-svg-checkmark\"></i>\r\n </div>\r\n </div> */}\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <div className=\"actions__item\">\r\n <div className=\"mz-form-item mz-form-item--checkbox \">\r\n <label className=\"mz-form-item__inner\" htmlFor=\"taxes\">\r\n {t(\"payments:checkbox_include_taxes_in_prices\")}\r\n <input type=\"checkbox\" className=\"mz-form-item__checkbox\" id=\"taxes\" name=\"taxes\" onClick={inclusionCheck} defaultChecked={taxesChecked} value=\"\"/>\r\n {/* <div className=\"mz-form-item__checkmark\">\r\n <div className=\"mz-svg-wrapper\">\r\n <i className=\"mz-svg mz-svg--black undefined mz-svg-checkmark\"></i>\r\n </div>\r\n </div> */}\r\n </label>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n <div className=\"mz-financial--left\">\r\n <div className=\"mz-financial--finance\">\r\n <h6>{t(\"general:finance\")}</h6>\r\n <p className='mz-financial--finance-terms'>\r\n {!summaryCalculator.getResponsesHasError() ?\r\n <>\r\n <span>{financeTerm} {t(\"payments:months_lowercase\")}</span> <span>{getLoanRate()}</span>\r\n </>\r\n :\r\n <>\r\n <p className=\"text--center\">\r\n {ReactHtmlParser(t(\"general:generalErrorMessage\"))}\r\n </p>\r\n </>}\r\n </p>\r\n\r\n {!summaryCalculator.getResponsesHasError() ?\r\n <>\r\n <div className=\"periods\">\r\n <div className=\"periods--item weekly\">\r\n <p>{t(\"payments:weekly\")}</p>\r\n <span>{getLoanWeekly()}</span> \r\n </div>\r\n <div className=\"periods--item bi-weekly\">\r\n <p>{t(\"payments:bi_weekly\")}</p>\r\n <span>{getLoanBiWeekly()}</span> \r\n </div>\r\n <div className=\"periods--item Monthly\">\r\n <p>{t(\"payments:monthly\")}</p>\r\n <span>{getLoanMonthly()}</span> \r\n </div>\r\n </div>\r\n </> \r\n : null\r\n } \r\n \r\n <p>\r\n <a className=\"mz-link\" onClick={handleEditFinanceLinkClick}>{t(\"btn_edit_finance_options\")}</a>\r\n </p>\r\n <div className=\"mz-financial--cta hidden\">\r\n {window.allow_oca ? \r\n <Button primary={false} label={ReactHtmlParser(String(t(\"summary:btn_apply_for_financing\")))} iconBefore={false} onClick={()=>financeClick('loan')}/>\r\n :\r\n summaryCalculator.isSelectionPreOrder() ?\r\n <Button primary={true} label={String(t(\"btn_pre_order\"))} iconBefore={false} onClick={handlePreOrderClick}/>\r\n :\r\n <Button primary={true} label={String(t(\"btn_reserve_yours\"))} iconBefore={false} onClick={()=>{handleReserveYoursClick('Finance')}}/>\r\n }\r\n </div>\r\n {!summaryCalculator.getResponsesHasError() ?\r\n <div>\r\n <span className='mz-financial--finance-infos'>{getLoanInformationalApr()} {t(\"text_information_apr\")} <Tooltip TooltipName=\"promo_apr\"/></span>\r\n </div>:null}\r\n </div>\r\n <div className=\"mz-financial--lease\">\r\n <h6>{t(\"payments:lease\")}</h6>\r\n <p className='mz-financial--finance-terms'>\r\n {!summaryCalculator.getResponsesHasError() ?\r\n <>\r\n <span>{leaseTerm} {t(\"payments:months_lowercase\")}</span> <span>{getLeaseRate()}</span><br/><span>{getAnnualMileageText()}</span>\r\n </>\r\n :\r\n <>\r\n <p className=\"text--center\">\r\n {ReactHtmlParser(t(\"general:generalErrorMessage\"))}\r\n </p>\r\n </>}\r\n </p>\r\n {!summaryCalculator.getResponsesHasError() ?\r\n <>\r\n <div className=\"periods\">\r\n <div className=\"periods--item weekly\">\r\n <p>{t(\"payments:weekly\")}</p>\r\n <span>{getLeaseWeekly()}</span> \r\n </div>\r\n <div className=\"periods--item bi-weekly\">\r\n <p>{t(\"payments:bi_weekly\")}</p>\r\n <span>{getLeaseBiWeekly()}</span> \r\n </div>\r\n <div className=\"periods--item Monthly\">\r\n <p>{t(\"payments:monthly\")}</p>\r\n <span>{getLeaseMonthly()}</span> \r\n </div>\r\n </div>\r\n </> \r\n :\r\n null} \r\n \r\n\r\n <p><a className=\"mz-link\" onClick={handleEditLeaseLinkClick}>{t(\"btn_edit_lease_options\")}</a></p>\r\n <div className=\"mz-financial--cta hidden\">\r\n {window.allow_oca ? \r\n <Button primary={false} label={ReactHtmlParser(String(t(\"summary:btn_apply_for_financing\")))} iconBefore={false} onClick={()=>financeClick('lease')}/>\r\n :\r\n summaryCalculator.isSelectionPreOrder() ?\r\n <Button primary={true} label={String(t(\"btn_pre_order\"))} iconBefore={false} onClick={handlePreOrderClick}/>\r\n : \r\n <Button primary={true} label={String(t(\"btn_reserve_yours\"))} iconBefore={false} onClick={()=>{handleReserveYoursClick('Lease')}}/>}\r\n </div>\r\n {!summaryCalculator.getResponsesHasError() ?\r\n\t\t\t\t\t<div>\r\n <span className='mz-financial--finance-infos'>{getLeaseInformationalApr()} {t(\"text_information_apr\")} <Tooltip TooltipName=\"promo_apr\"/></span>\r\n </div>:null}\r\n </div>\r\n </div>\r\n <div className=\"mz-financial--right\">\r\n <h6>{t(\"payments:cash_purchase_price\")}</h6>\r\n <div>{t(\"purchase_price\")} <Tooltip TooltipName=\"purchase_price\" /></div>\r\n {selectedBox === 'feesCheck' && <span className='mz-detailed-price__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotalWithFees, true)}</span>}\r\n {selectedBox === 'taxesCheck' &&<span className='mz-detailed-price__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotalTaxed, true)}</span>}\r\n {selectedBox === 'rebatesCheck' && <span className='mz-detailed-price__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotalWithIncentiveRebatesAndEvRebates, true)}</span>}\r\n {selectedBox === 'feestaxes' && <span className='mz-detailed-price__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotalWithFeesTaxed, true)}</span>}\r\n {selectedBox === 'feesrebates' && <span className='mz-detailed-price__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotalWithFeesWithRebatesAndEvRebates, true)}</span>}\r\n {selectedBox === 'taxesrebates' && <span className='mz-detailed-price__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotalWithIncentiveRebatesAndEvRebatesTaxed, true)}</span>}\r\n {selectedBox === 'allCheck' && <span className='mz-detailed-price__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotalWithFeesWithRebatesTaxed, true)}</span>}\r\n {selectedBox === null && <span className='mz-detailed-price__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotal, true)}</span>}\r\n <div className=\"mz-financial--details\">\r\n\r\n\r\n {/* {financialInfo?.calculatedCash ? <CashOptions financialInfo={financialInfo} includeFees={selectedBox} includeTaxes={selectedBox} includeRebates={selectedBox} /> : null} */}\r\n\r\n < CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price\" ColCarText1={`${t('payments:cash_price')}`} ColBoxText={getMazdaPriceDetails()} ColClassPrice=\"mz-collapse__price\" TooltipName=\"detailedprice_mazdaprice\" ColPrices={`${formatPrice(getMazdaPrice(), true)}`} isOpen={openCollapsable === 'mzPrice'} setOpenCollapsable={setOpenCollapsable} id={String(Math.floor(Math.random() * 100000000))}/>\r\n\r\n {summaryCalculator.FinancialInfo ?.calculatedFinance ?.options.wheels.title ? \r\n < CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price\" ColCarText1={t(\"payments:cash_option_wheels\")} ColBoxText={getWheelsDetails()} ColClassPrice=\"mz-collapse__price\" TooltipName=\"\" TooltipText={ReactHtmlParser(getTooltipText())} ColPrices={`${formatPrice(getWheelsPrice(), true)}`} id={String(Math.floor(Math.random() * 100000000))} />\r\n : null}\r\n\r\n {summaryCalculator.SelectedConnectedVehiclePackage.financial.msrp ?\r\n < CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price\" ColCarText1={t(\"payments:cash_option_connectivity\")} ColBoxText={getConnectivityDetails()} ColClassPrice=\"mz-collapse__price\" TooltipName=\"\" ColPrices={`${formatPrice(getConnectivityPrice(), true)}`} id={String(Math.floor(Math.random() * 100000000))} />\r\n : null }\r\n\r\n {summaryCalculator.FinancialInfo ?.calculatedFinance ?.accessories.total ? \r\n < CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price\" ColCarText1={t(\"payments:cash_option_accessories\")} ColBoxText={getAccessoriesDetails()} ColClassPrice=\"mz-collapse__price\" TooltipName=\"\" TooltipText={getAccessoriesTooltipText()} ColPrices={`${formatPrice(getAccessoriesPrice(), true)}`} id={String(Math.floor(Math.random() * 100000000))} />\r\n : null }\r\n\r\n {summaryCalculator.SelectedAddedProtectionPackage.name || summaryCalculator.SelectedAppearanceProtectionPlansIndex !== null? \r\n < CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price\" ColCarText1={t(\"payments:cash_option_protection\")} ColBoxText={getProtectionDetails()} ColClassPrice=\"mz-collapse__price\" TooltipName=\"\" ColPrices={`${formatPrice(getProtectionPrice(), true)}`} id={String(Math.floor(Math.random() * 100000000))} />\r\n : null } \r\n\r\n\r\n {feesChecked ?< CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price\" ColCarText1={`${t('payments:cash_fees')}`} ColBoxText={getMazdaFeesAndLeviesDetails()} ColClassPrice=\"mz-collapse__price\" TooltipName=\"detailedprice_feesandlevies\" ColPrices={`${formatPrice(getMazdaFeesAndLeviesPricingWithoutPDE(), true)}`} isOpen={openCollapsable === 'mzFees'} setOpenCollapsable={setOpenCollapsable} id={String(Math.floor(Math.random() * 100000000))}/>:null}\r\n {taxesChecked ? <div className=\"mz-financial__non-collapse\"><p className=\"mz-financial__non-collapse__title\">{t(\"payments:taxes\")} <Tooltip TooltipName=\"detailedprice_taxes\" /></p>\r\n {selectedBox === 'feesCheck' && <span className=\"mz-financial__non-collapse__price\">{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotalWithFeesTaxes, true)}</span>}\r\n {selectedBox === 'taxesCheck' && <span className='mz-financial__non-collapse__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotalTaxes, true)}</span>}\r\n {selectedBox === 'rebatesCheck' && <span className='mz-financial__non-collapse__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotalWithIncentiveRebatesAndEvRebatesTaxes, true)}</span>}\r\n {selectedBox === 'feestaxes' && <span className='mz-financial__non-collapse__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotalWithFeesTaxes, true)}</span>}\r\n {selectedBox === 'feesrebates' && <span className='mz-financial__non-collapse__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotalWithFeesWithRebatesTaxes, true)}</span>}\r\n {selectedBox === 'taxesrebates' && <span className='mz-financial__non-collapse__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotalWithIncentiveRebatesAndEvRebatesTaxes, true)}</span>}\r\n {selectedBox === 'allCheck' && <span className='mz-financial__non-collapse__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotalWithFeesWithRebatesTaxes, true)}</span>}\r\n {selectedBox === null && <span className='mz-financial__non-collapse__price'>{formatPrice(summaryCalculator.FinancialInfo.calculatedCash.subtotal, true)}</span>}\r\n </div>:null}\r\n\r\n < CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price negative\" ColCarText1={`${t('payments:cash_credits')}`} ColBoxText={getCreditsDetails()} ColClassPrice=\"mz-collapse__price\" TooltipName=\"detailedprice_credit\" ColPrices={`${currentIncentives.value + summaryCalculator.FinancialInfo.calculatedCash.incentives.taxable.total + summaryCalculator.FinancialInfo.calculatedCash.incentives.nonTaxable.total + Obj.tradeInValue + summaryCalculator.FinancialInfo.mazdaCashIncentive >0?'-':''}${formatPrice(currentIncentives.value + summaryCalculator.FinancialInfo.calculatedCash.incentives.taxable.total + summaryCalculator.FinancialInfo.calculatedCash.incentives.nonTaxable.total + summaryCalculator.FinancialInfo.tradeInValue + summaryCalculator.FinancialInfo.mazdaCashIncentive, true)}`} isOpen={openCollapsable === 'mzCredits'} setOpenCollapsable={setOpenCollapsable} id={String(Math.floor(Math.random() * 100000000))}/>\r\n <div className=\"mz-financial__non-collapse negative\">\r\n <div className=\"mz-financial__non-collapse__title\">{t(\"payments:down_payment\")}<sup>1</sup> <Tooltip TooltipName=\"detailedprice_downpayment\" /></div>\r\n <span className=\"mz-financial__non-collapse__price\">{formatPrice(Obj.downPaymentValue, true)}</span>\r\n </div>\r\n {selectedBox === 'rebatesCheck' || selectedBox === 'taxesrebates' || selectedBox === 'allCheck' || selectedBox === 'feesrebates' && summaryCalculator.FinancialInfo?.ev_rebates?.length ?< CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price evRebates\" ColCarText1={t(\"payments:gov_rebates\")} ColBoxText={getRebatesDetails()} ColClassPrice=\"mz-collapse__price\" ColPrices={`${summaryCalculator.FinancialInfo.calculatedCash.evRebates.total.cash>0?'-':''}${formatPrice(summaryCalculator.FinancialInfo.calculatedCash.evRebates.total.cash, true)}`} isOpen={openCollapsable === 'mzRebates'} setOpenCollapsable={setOpenCollapsable}/>:null}\r\n </div>\r\n\t\t\t\t<div className=\"mz-financial--cta\">\r\n {summaryCalculator.isSelectionPreOrder() ?\r\n <Button primary={true} label={String(t(\"btn_pre_order\"))} iconBefore={false} onClick={handlePreOrderClick}/>\r\n : \r\n\t <Button primary={true} label={String(t(\"btn_reserve_yours\"))} iconBefore={false} onClick={()=>{handleReserveYoursClick('Cash')}}/>\r\n }\r\n\t </div>\r\n </div>\r\n <ReserveModal isOpen={reserveOpen} handleClose={setReserveModalOpen}></ReserveModal> \r\n <OcaModal isOpen={ocaOpen} financeType={financeType} handleClose={setOcaModalOpen}></OcaModal> \r\n </div>\r\n <PreOrderModal isOpen={preorderOpen} handleClose={setPreorderModalOpen}></PreOrderModal> \r\n </>\r\n );\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { goToTop } from '../../../utils'\r\n\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nexport const SpecsItem = ({ SpecsItemName, SpecsItemModel, SpecsItemEditUrl, useHTML, isPackage, ...props }) => {\r\n const { t, i18n } = useTranslation(['summary', 'general']);\r\n const navigate = useNavigate();\r\n let SpecsItemModelStriped\r\n if(!useHTML){\r\n SpecsItemModelStriped = SpecsItemModel.replace(/(<([^>]+)>)/gi, \"\");\r\n }else{\r\n SpecsItemModelStriped = SpecsItemModel;\r\n }\r\n \r\n const gtmHelper = new GTMHelper();\r\n\r\n const handleOnClick = (e) => {\r\n goToTop();\r\n navigate(SpecsItemEditUrl);\r\n gtmHelper.setGTM({'action':'Edit Specs','value': e.target.innerHTML}, true, false);\r\n }\r\n\r\n return (\r\n <div className={isPackage ? useHTML ? \"mz-specs__item spec-packages spec-packages_wide\" : 'mz-specs__item spec-packages' : \"mz-specs__item\"}>\r\n <p className=\"mz-specs__category\" onClick={handleOnClick}>\r\n <a className=\"mz-link\">{ SpecsItemName }</a>\r\n </p>\r\n <div className=\"mz-specs__right\">\r\n <p className=\"mz-specs__name\">{ ReactHtmlParser(SpecsItemModelStriped) }</p>\r\n </div>\r\n </div>\r\n )\r\n};\r\n\r\nSpecsItem.propTypes = {\r\n SpecsItemName: PropTypes.string,\r\n SpecsItemModel: PropTypes.string,\r\n SpecsItemEditUrl: PropTypes.string,\r\n}\r\n\r\nSpecsItem.defaultProps = {\r\n SpecsItemName: 'SPECS NAME',\r\n SpecsItemModel: '',\r\n SpecsItemEditUrl: '',\r\n}\r\n\r\nexport default SpecsItem;","import React from 'react';\r\nimport { useParams } from 'react-router-dom';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { getApiBaseUrl, getLang, getProvince } from '../../../utils';\r\n\r\nimport { handleRequest } from '../../../stories/helpers/httpRequest';\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\n\r\nimport { SpecsItem } from '../../2_Molecules/SpecsItem/SpecsItem';\r\n\r\nexport const BuildSpecs = ({ componentRef, ...props }) => {\r\n const { t, i18n } = useTranslation(['summary', 'packages', 'general', 'payments']);\r\n const { year, carline, trim, model, packageCode } = useParams();\r\n\r\n const defaultEngineUrl = `${getApiBaseUrl()}/api/EngineModels/${year}/${carline}/${trim}/?prov_code=${getProvince()}&lang_code=${getLang()}`;\r\n const defaultPackageUrl = `${getApiBaseUrl()}/api/Packages/${model}/${packageCode}/?prov_code=${getProvince()}&lang_code=${getLang()}`;\r\n\r\n\r\n const [defaultDrivetrain, setDefaultDrivetrain] = React.useState(null);\r\n const [defaultEngine, setDefaultEngine] = React.useState(null);\r\n const [defaultPackages, setDefaultPackage] = React.useState(null);\r\n\r\n\r\n let { selectedTrim, selectedTrimUrl} = '';\r\n let { selectedModel, selectedModelUrl} = '';\r\n let { selectedPackage, selectedPackageUrl} = '';\r\n let { selectedColoursInt, selectedColoursExt, selectedColoursUrl} = '';\r\n let { selectedWheel, selectedWheelUrl} = '';\r\n let { selectedConnectivity, selectedConnectivityUrl} = '';\r\n let { selectedAddedProtection, selectedAddedProtectionUrl} = '';\r\n let { selectedAppearanceProtectionPlan, selectedAppearanceProtection, selectedAppearanceProtectionUrl} = '';\r\n\r\n let isWide = false;\r\n\r\n async function defaultEngineRequest() {\r\n handleRequest('get', defaultEngineUrl, {}).then(requestResponse => {\r\n const data = requestResponse.data;\r\n const defaultDrivetrain = data.models[0].drivetrain.label;\r\n const defaultEngine = data.models[0].engine.label;\r\n setDefaultDrivetrain(defaultDrivetrain);\r\n setDefaultEngine(defaultEngine);\r\n }).catch(error => {\r\n console.log(error);\r\n });\r\n }\r\n\r\n async function defaultPackagesRequest() {\r\n handleRequest('get', defaultPackageUrl, {}).then(requestResponse => {\r\n const data = requestResponse.data;\r\n setDefaultPackage(data);\r\n }).catch(error => {\r\n console.log(error);\r\n });\r\n }\r\n\r\n if (!defaultEngine) {\r\n defaultEngineRequest();\r\n }\r\n\r\n if (!defaultPackages) {\r\n defaultPackagesRequest();\r\n }\r\n\r\n if (defaultEngine) {\r\n let model = { engine: { label: defaultEngine }, drivetrain: { label: defaultDrivetrain } };\r\n selectedModel = model;\r\n let modelUrl = '/' + year + '/' + carline + '/' + trim;\r\n selectedModelUrl = modelUrl\r\n\r\n }\r\n\r\n if (defaultPackages) {\r\n let packages = { name: defaultPackages.packages[0] ?.name};\r\n selectedPackage = packages;\r\n let packageUrl = '/' + year + '/' + carline + '/' + trim + '/' + model + '/' + packageCode + '/#';\r\n selectedPackageUrl = packageUrl\r\n }\r\n\r\n if (sessionStorage.getItem('selectedTrim')) {\r\n selectedTrim = sessionStorage.getItem('selectedTrim');\r\n selectedTrim = JSON.parse(selectedTrim);\r\n\r\n selectedTrimUrl = sessionStorage.getItem('urlSlugObjectTrims');\r\n selectedTrimUrl = JSON.parse(selectedTrimUrl);\r\n selectedTrimUrl = '/' + selectedTrimUrl.year + '/' + selectedTrimUrl.carline;\r\n }\r\n\r\n if (sessionStorage.getItem('selectedModel')) {\r\n selectedModel = sessionStorage.getItem('selectedModel');\r\n selectedModel = JSON.parse(selectedModel);\r\n\r\n selectedModelUrl = sessionStorage.getItem('urlSlugObjectEngineAndDrivetrain');\r\n selectedModelUrl = JSON.parse(selectedModelUrl);\r\n selectedModelUrl = '/' + selectedModelUrl.year + '/' + selectedModelUrl.carline + '/' + selectedModelUrl.trim;\r\n }\r\n\r\n if (sessionStorage.getItem('selectedPackage')) {\r\n selectedPackage = sessionStorage.getItem('selectedPackage');\r\n selectedPackage = JSON.parse(selectedPackage);\r\n\r\n // Added this in the case of the build id passed in the url\r\n if (sessionStorage.getItem('urlSlugObjectPackage')) {\r\n selectedPackageUrl = sessionStorage.getItem('urlSlugObjectPackage');\r\n selectedPackageUrl = JSON.parse(selectedPackageUrl);\r\n selectedPackageUrl = '/' + selectedPackageUrl.year + '/' + selectedPackageUrl.carline + '/' + selectedPackageUrl.trim + '/' + selectedPackageUrl.model + '/' + (selectedPackageUrl.option ? selectedPackageUrl.option : selectedPackageUrl.packageCode);\r\n } else {\r\n selectedPackageUrl = defaultPackageUrl;\r\n }\r\n }\r\n\r\n if (sessionStorage.getItem('selectedInteriorColour')) {\r\n selectedColoursInt = sessionStorage.getItem('selectedInteriorColour');\r\n selectedColoursExt = sessionStorage.getItem('selectedExteriorColour');\r\n selectedColoursInt = JSON.parse(selectedColoursInt);\r\n selectedColoursExt = JSON.parse(selectedColoursExt);\r\n\r\n selectedColoursUrl = sessionStorage.getItem('urlSlugObjectColour');\r\n selectedColoursUrl = JSON.parse(selectedColoursUrl);\r\n selectedColoursUrl = '/' + selectedColoursUrl.year + '/' + selectedColoursUrl.carline + '/' + selectedColoursUrl.trim + '/' + selectedColoursUrl.model + '/' + selectedColoursUrl.packageCode + '/colours/';\r\n } else if (sessionStorage.getItem('defaultExteriorColour')) {\r\n selectedColoursInt = sessionStorage.getItem('defaultInteriorColour');\r\n selectedColoursExt = sessionStorage.getItem('defaultExteriorColour');\r\n selectedColoursInt = JSON.parse(selectedColoursInt);\r\n selectedColoursExt = JSON.parse(selectedColoursExt);\r\n\r\n selectedColoursUrl = '/' + year + '/' + carline + '/' + trim + '/' + model + '/' + packageCode + '/colours/';\r\n } else {\r\n selectedColoursUrl = '/' + year + '/' + carline + '/' + trim + '/' + model + '/' + packageCode + '/colours/';\r\n }\r\n\r\n if (sessionStorage.getItem('selectedWheel')) {\r\n selectedWheel = sessionStorage.getItem('selectedWheel');\r\n selectedWheel = JSON.parse(selectedWheel);\r\n\r\n selectedWheelUrl = sessionStorage.getItem('urlSlugObjectWheels');\r\n selectedWheelUrl = JSON.parse(selectedWheelUrl);\r\n selectedWheelUrl = '/' + selectedWheelUrl.year + '/' + selectedWheelUrl.carline + '/' + selectedWheelUrl.trim + '/' + selectedWheelUrl.model + '/' + selectedWheelUrl.packageCode + '/wheels';\r\n } else {\r\n selectedWheelUrl = '/' + year + '/' + carline + '/' + trim + '/' + model + '/' + packageCode + '/wheels';\r\n }\r\n\r\n if(sessionStorage.getItem('selectedConnectedVehiclePackage')) {\r\n selectedConnectivity = sessionStorage.getItem('selectedConnectedVehiclePackage');\r\n selectedConnectivity = JSON.parse(selectedConnectivity);\r\n }\r\n selectedConnectivityUrl = '/'+year+'/'+carline+'/'+trim+'/'+model+'/'+packageCode+'/connectivity';\r\n\r\n\r\n if(sessionStorage.getItem('selectedAppearanceProtectionPlansPackage')) {\r\n // TODO : TRANSFORM INTO A FUNCTION SUMMARYCALCULATOR\r\n if(window.summaryCalculator.Packages?.appearance_protection){\r\n Object.entries(window.summaryCalculator.Packages.appearance_protection[0].plans).map(([key, value], planIndex) => {\r\n if(planIndex === Number(window.summaryCalculator.SelectedAppearanceProtectionIndex)) {\r\n selectedAppearanceProtectionPlan = value;\r\n }\r\n });\r\n }\r\n\r\n selectedAppearanceProtection = sessionStorage.getItem('selectedAppearanceProtectionPlansPackage');\r\n selectedAppearanceProtection = JSON.parse(selectedAppearanceProtection);\r\n }\r\n selectedAppearanceProtectionUrl = '/'+year+'/'+carline+'/'+trim+'/'+model+'/'+packageCode+'/protections#ap';\r\n\r\n if(sessionStorage.getItem('selectedAddedProtectionPackage')) {\r\n selectedAddedProtection = sessionStorage.getItem('selectedAddedProtectionPackage');\r\n selectedAddedProtection = JSON.parse(selectedAddedProtection);\r\n }\r\n selectedAddedProtectionUrl = '/'+year+'/'+carline+'/'+trim+'/'+model+'/'+packageCode+'/protections#map';\r\n\r\n function getProtectionDetails() {\r\n let list = \"<p>\";\r\n\r\n if(window.summaryCalculator.SelectedAddedProtectionPackage.name != undefined ){\r\n list += `${t('payments:added_protection')} ${window.summaryCalculator.SelectedAddedProtectionPackage.name}`\r\n }\r\n if(window.summaryCalculator.SelectedAppearanceProtectionPlan.name != undefined && window.summaryCalculator.SelectedAppearanceProtectionPlansIndex !== null) {\r\n if(window.summaryCalculator.SelectedAddedProtectionPackage.name != undefined ){\r\n list += ', '\r\n }\r\n list += `<p class=\"desc\">${t('payments:appearance_protection')} <span style=\"text-transform:lowercase\">${window.summaryCalculator.SelectedAppearanceProtectionPlansPackage.name} for ${window.summaryCalculator.SelectedAppearanceProtectionPlan.name}</span></p>`\r\n } \r\n list += \"</p>\"\r\n return list;\r\n }\r\n\r\n function getPackageName() {\r\n let packageName = '';\r\n\r\n\r\n const selectedPackageIndex = JSON.parse(sessionStorage.getItem(Constants.SelectedPackageIndex));\r\n if (selectedPackageIndex !== null)\r\n packageName += `<span>${selectedPackage.name}</span>`;\r\n\r\n const selectedWarrantyPackage = JSON.parse(sessionStorage.getItem('selectedWarrantyPackage'));\r\n if (selectedWarrantyPackage != null && selectedWarrantyPackage.name != undefined) {\r\n isWide = true;\r\n if (packageName != '') packageName += ', <br>';\r\n packageName += `<span>${t(\"packages:warranties\")}</span> : <span>${selectedWarrantyPackage.name}</span>`;\r\n }\r\n const selectedConnectedVehiclePackage = JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage'));\r\n if (selectedConnectedVehiclePackage != null && selectedConnectedVehiclePackage.name != undefined) {\r\n isWide = true;\r\n if (packageName != '') packageName += ', <br>';\r\n packageName += `<span>${t(\"packages:connected\")}</span> : <span>${selectedConnectedVehiclePackage.name}</span>`;\r\n }\r\n if (packageName === '')\r\n t(\"general:none_selected\");\r\n\r\n return packageName;\r\n }\r\n\r\n React.useEffect(() => {\r\n }, []);\r\n\r\n return (\r\n <div className=\"mz-summary--specs\" ref={componentRef}>\r\n <h3>{t(\"your_build_specifications\")}</h3>\r\n <SpecsItem SpecsItemName={t(\"trim\")} SpecsItemModel={selectedTrim? selectedTrim.trim_type.name : '' } SpecsItemEditUrl={selectedTrimUrl? selectedTrimUrl : '/#/'} />\r\n <SpecsItem SpecsItemName={t(\"options\")} SpecsItemModel={selectedModel ? selectedModel.engine.label +' '+ selectedModel.drivetrain.label : '' } SpecsItemEditUrl={selectedModelUrl ? selectedModelUrl : '/#/'} />\r\n <SpecsItem SpecsItemName={t(\"package\")} SpecsItemModel={ getPackageName() } SpecsItemEditUrl={selectedPackageUrl} useHTML={isWide} isPackage={true} />\r\n <SpecsItem SpecsItemName={t(\"exterior\")} SpecsItemModel={selectedColoursExt? selectedColoursExt.description : ''} SpecsItemEditUrl={selectedColoursUrl} />\r\n <SpecsItem SpecsItemName={t(\"interior\")} SpecsItemModel={selectedColoursInt? selectedColoursInt.description : ''} SpecsItemEditUrl={selectedColoursUrl} />\r\n <SpecsItem SpecsItemName={t(\"wheels\")} SpecsItemModel={selectedWheel? selectedWheel.title : t(\"wheels_default\")} SpecsItemEditUrl={selectedWheelUrl} />\r\n {/* <SpecsItem SpecsItemName={t(\"protection\")} SpecsItemModel={getProtectionDetails()} SpecsItemEditUrl={selectedAppearanceProtectionUrl} /> */}\r\n </div>\r\n )\r\n};\r\n\r\nBuildSpecs.defaultProps = {\r\n componentRef: null,\r\n}","import React from 'react';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nimport { Button } from '../../1_Atoms/Button/Button';\r\nimport { AccessoryCard } from '../../2_Molecules/AccessoryCard/AccessoryCard';\r\n\r\nexport const Accessories = ({ ...props }) => {\r\n const { year, carline, trim, model, packageCode } = useParams();\r\n const navigate = useNavigate();\r\n const { t, i18n } = useTranslation(['accessories', 'general']);\r\n\r\n const gtmHelper = new GTMHelper();\r\n\r\n function handleAddAccessoriesClick(e) {\r\n\t\te.preventDefault();\r\n const url = '/'+year+'/'+carline+'/'+trim+'/'+model+'/'+packageCode+'/accessories';\r\n\r\n navigate(url);\r\n gtmHelper.setGTM({'action':'Add Accessories'}, true, false);\r\n }\r\n\r\n function EditButton(props) {\r\n let accessories = sessionStorage.getItem(Constants.SelectedAccessories);\r\n accessories = JSON.parse(accessories);\r\n\r\n if(accessories && accessories.length > 0) {\r\n return(<div className=\"accessory-edit-link\"><a className=\"mz-link\" href=\"\" onClick={handleAddAccessoriesClick}>{t(\"edit_accessories\")}</a></div>);\r\n }\r\n }\r\n\r\n function AccessoriesList(props) {\r\n let availableAccessories = JSON.parse(sessionStorage.getItem(Constants.Accessories));\r\n\r\n let accessories = sessionStorage.getItem(Constants.SelectedAccessories);\r\n accessories = JSON.parse(accessories);\r\n const List = []\r\n\r\n console.log(accessories)\r\n if(accessories && accessories.length > 0) {\r\n accessories.forEach((accessory) => {\r\n List.push(<AccessoryCard\r\n Accessory={{\r\n category: {\r\n id: accessory.category.id,\r\n title: accessory.category.title,\r\n },\r\n description: accessory.description,\r\n image: accessory.image,\r\n name: accessory.name,\r\n part_number: accessory.part_number,\r\n price: accessory.price,\r\n install_cost: accessory.install_cost,\r\n price_week: null,\r\n }}\r\n key={accessory.name}\r\n Index={1}\r\n />)\r\n })\r\n } else {\r\n if(availableAccessories && availableAccessories.rawData.length > 0) {\r\n return (\r\n <div className='mz-accessory--empty'>\r\n <p>{t(\"no_added_accessories\")}</p>\r\n <a className=\"mz-link\" href=\"\" onClick={handleAddAccessoriesClick}>{t(\"add_accessories\")}</a>\r\n </div>\r\n )\r\n } else {\r\n return (\r\n <div className='mz-accessory--empty'>\r\n <p>{t(\"no_accessorie_comingsoon\")}</p>\r\n </div>\r\n )\r\n }\r\n }\r\n\r\n return (\r\n <div className='mz-accessory--container'>\r\n {List}\r\n </div>\r\n )\r\n }\r\n\r\n return (\r\n <div className=\"mz-summary--accessories\">\r\n <h4>{t(\"accessories:title\")}</h4>\r\n\r\n {\r\n EditButton()\r\n }\r\n\r\n <AccessoriesList />\r\n </div>\r\n )\r\n};","import React, { useState, useEffect, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nexport const CollapseSpecs = ({ColCarText1, ColBoxText, id, ...props }) => {\r\n\tconst gtmHelper = new GTMHelper();\r\n\r\n const [toggle, setToggle] = useState(true);\r\n const [currID, setID] = useState(id);\r\n const collapseRef = useRef();\r\n\r\n useEffect(() => {\r\n const collapse = collapseRef.current;\r\n if(typeof window.mzAnimator === 'object'){\r\n window.mzAnimator.animateHeight(collapse, 'CollapseListSpecs' + currID, 'init')\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n const collapse = collapseRef.current;\r\n if(toggle){\r\n window.mzAnimator.animateHeight(collapse, 'CollapseListSpecs' + currID, false)\r\n }else{\r\n window.mzAnimator.animateHeight(collapse, 'CollapseListSpecs' + currID, true)\r\n }\r\n gtmHelper.setGTM({'action':'Collapse', 'type': 'Specs', 'value': toggle, 'title': ColCarText1}, true , false);\r\n },[toggle])\r\n\r\n return (\r\n <div className=\"mz-collapse mz-collapse--specs\">\r\n <button\r\n onClick={()=>{setToggle(!toggle)}}\r\n className=\"mz-collapse__button\"\r\n >\r\n <div className=\"mz-collapse__cartext-container\">\r\n <p className=\"mz-collapse__text\">{ColCarText1}</p>\r\n </div>\r\n <i className={ !toggle ? \"mz-svg mz-svg-chevron open\" : \"mz-svg mz-svg-chevron\"}></i>\r\n </button>\r\n <div className=\"mz-collapse__box visible\" ref={collapseRef}>{ ReactHtmlParser (ColBoxText) }</div>\r\n </div>\r\n )\r\n}\r\n\r\nCollapseSpecs.propTypes = {\r\n ColCarText1: PropTypes.string,\r\n ColBoxText: PropTypes.string,\r\n}\r\n\r\nCollapseSpecs.defaultProps = {\r\n ColCarText1: 'Term: 60 months @2.95%',\r\n ColBoxText: 'Pellentesque in ipsum id orci porta dapibus. Curabitur arcu erat, accumsan id imperdiet et, porttitor at sem. Nulla porttitor accumsan tincidunt. Cras ultricies ligula sed magna dictum porta. Nulla quis lorem ut libero malesuada feugiat. Curabitur arcu erat, accumsan id imperdiet et, porttitor at sem. Quisque velit nisi, pretium ut lacinia in, elementum id enim. Nulla porttitor accumsan tincidunt. Sed porttitor lectus nibh. Proin eget tortor risus.',\r\n}\r\n\r\nexport default CollapseSpecs;","import React from 'react';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nimport { Button } from '../../1_Atoms/Button/Button';\r\nimport { CollapseSpecs } from '../../2_Molecules/Collapse/CollapseSpecs';\r\n\r\nimport { getLang } from '../../../utils';\r\n\r\nexport const FeaturedSpecs = ({openCollapsable, ...props }) => {\r\n const { t, i18n } = useTranslation(['summary', 'general']);\r\n const navigate = useNavigate();\r\n const { year, carline, trim, model, packageCode } = useParams();\r\n const [summaryCalculator = new SummaryCalculator().reloadStoredData(), setSummaryCalculator] = React.useState();\r\n\r\n const [showBrochure] = React.useState(summaryCalculator.AvailableTrim.model_year.show_brochure);\r\n const data = JSON.parse(sessionStorage.getItem(Constants.SpecificationData));\r\n const specsPDF = genereatePDFURL(true);\r\n\tconst brochurePDF = genereatePDFURL(false);\r\n\r\n const gtmHelper = new GTMHelper();\r\n\r\n function genereatePDFURL(isSpec){\r\n\t\tconst pdfType=isSpec?'specs':'brochure';\r\n let URL = `/globalassets/mazda-canada/${getLang()}/pdf/brochures/vehicles/${carline}/${year}-mazda-${carline.toLowerCase()}-${pdfType}-${getLang()}.pdf`;\r\n return URL;\r\n }\r\n\r\n function getTableSpecs(data) {\r\n let table = \"<table class='tablespecs'>\"\r\n Object.keys(data).map((innerAttr, index) => {\r\n table += \"<tbody>\";\r\n table += \"<tr>\";\r\n\r\n let title=data[innerAttr].Title;\r\n if(!title.includes('http')){\r\n title=title.replace(/([^<])\\/([^>])/g, \"$1 / $2\");\r\n }\r\n let content=data[innerAttr].Data;\r\n if(!content.includes('http')){\r\n content=content.replace(/([^<])\\/([^>])/g, \"$1 / $2\");\r\n }\r\n if(data[innerAttr].type === 'Header') {\r\n table += `<td colspan=\"2\" class=\"cell category\"><p class=\"paragraph--large text--white\">${title}</p></td>`;\r\n } else {\r\n table += `<td class=\"cell title\">${title}</td>`;\r\n table += `<td class=\"cell data\">${content}</td>`;\r\n }\r\n\r\n table += \"</tr>\";\r\n table += \"</tbody>\";\r\n });\r\n table += \"</table>\";\r\n\r\n return table;\r\n }\r\n\r\n return (\r\n <div className=\"mz-summary--featured\">\r\n <h3>{t(\"full_specifications\")}</h3>\r\n\r\n {data ? Object.keys(data).map((innerAttr, index) => {\r\n const key = `specificationsCollapse${index}`;\r\n const tableHtml = getTableSpecs(data[innerAttr]);\r\n return (\r\n <CollapseSpecs key={key} isOpen={openCollapsable === key} ColCarText1={innerAttr} ColBoxText={tableHtml} id={String(Math.floor(Math.random() * 100000000))} />\r\n )}) : null\r\n }\r\n\r\n <div className=\"mz-summary--featured__cta\">\r\n\t\t\t\t<Button\r\n primary={false}\r\n label={t(\"btn_download_full_specs\")}\r\n icon={true}\r\n iconBefore={true}\r\n size={1.4}\r\n svg_list=\"downloadbrochure\"\r\n onClick={() => { \r\n window.open(specsPDF, \"_blank\")\r\n gtmHelper.setGTM({'action':'Download', 'type': 'Specs PDF', 'value': specsPDF}, true , false);\r\n }}\r\n />\r\n\t\t\t\t{showBrochure && <Button\r\n primary={false}\r\n label={t(\"btn_download_brochure\")}\r\n icon={true}\r\n iconBefore={true}\r\n size={1.4}\r\n svg_list=\"downloadbrochure\"\r\n onClick={() => { \r\n window.open(brochurePDF, \"_blank\");\r\n gtmHelper.setGTM({'action':'Download', 'type': 'Brochure PDF', 'value': brochurePDF}, true , false);\r\n }}\r\n />}\r\n </div>\r\n </div>\r\n)\r\n};","import React from 'react';\r\n\r\nimport { getLang, getBaseUrl} from '../../../utils';\r\n\r\nimport { useTranslation } from \"react-i18next\";\r\n// import PropTypes from 'prop-types';\r\n\r\nexport const Packs = ({ ...props }) => {\r\n const { t, i18n } = useTranslation(['summary', 'general']);\r\n //const lang = getLang();\r\n\r\n const shortLang = getLang() === 'en' ? 'e' : 'f';\r\n\r\n return (\r\n <>\r\n <div className=\"mz-bg--101010\">\r\n <div className=\"mz-spacer-m mz-spacer\"></div>\r\n <div className=\"mz-circle-callout mz-circle-callout--warranty\">\r\n <div className=\"mz-image mz-circle-callout__top-logo\">\r\n <img src={`https://mazda.ca/globalassets/mazda-canada/c65_mazdaunlimitedlogo_neg_${shortLang}_new.png`} alt=\"Mazda Unlimited Mileage Warranty.\"/>\r\n </div>\r\n <div className=\"mz-container mz-four-col-grid\">\r\n <div className=\"mz-circle-callout-wrapper \">\r\n <div className=\"image\">\r\n <div className=\"mz-image \">\r\n <img src=\"https://mazda.ca/contentassets/3b14f54f8aa6495999c6e6d1e1477959/c63_unlmited_newvehicle.png\" alt=\"White car icon.\"/>\r\n </div> \r\n </div>\r\n <div className=\"top-label\">\r\n <h6 className=\"text--grey\"></h6>\r\n </div>\r\n <div className=\"big-text\">\r\n <h4 className=\"text--white\">{t(\"wrnty_newVeh\")}</h4>\r\n </div>\r\n <div className=\"text text--grey2\">\r\n <h6 className=\"text--white\">{t(\"wrnty_unlimited\")}</h6>\r\n </div>\r\n </div>\r\n <div className=\"mz-circle-callout-wrapper \">\r\n <div className=\"image\">\r\n <div className=\"mz-image \">\r\n <img src=\"https://mazda.ca/contentassets/ca3ba1ddd7e84ecc9ee1ba3ea10d11d3/c63_unlmited_roadside.png\" alt=\"White road icon.\"/>\r\n </div> \r\n </div>\r\n <div className=\"top-label\">\r\n <h6 className=\"text--grey\"></h6>\r\n </div>\r\n <div className=\"big-text\">\r\n <h4 className=\"text--white\">{t(\"wrnty_roadside\")}</h4>\r\n </div>\r\n <div className=\"text text--grey2\">\r\n <h6 className=\"text--white\">{t(\"wrnty_mileage\")}</h6>\r\n </div>\r\n </div>\r\n <div className=\"mz-circle-callout-wrapper \">\r\n <div className=\"image\">\r\n <div className=\"mz-image \">\r\n <img src=\"https://mazda.ca/contentassets/b2c41975a22049409c47e9ab7f278f4d/c63_unlmited_powertrain.png\" alt=\"White powertrain icon.\"/>\r\n </div> \r\n </div>\r\n <div className=\"top-label\">\r\n <h6 className=\"text--grey\"></h6>\r\n </div>\r\n <div className=\"big-text\">\r\n <h4 className=\"text--white\">{t(\"wrnty_powertrain\")}</h4>\r\n </div>\r\n <div className=\"text text--grey2\">\r\n <h6 className=\"text--white\">{t(\"wrnty_unlimited\")}</h6>\r\n </div>\r\n </div>\r\n <div className=\"mz-circle-callout-wrapper \">\r\n <div className=\"image\">\r\n <div className=\"mz-image \">\r\n <img src=\"https://mazda.ca/contentassets/5ac1baf08c5b43cd9230b7495f35906a/c63_unlmited_antiperforation.png\" alt=\"White shield icon.\"/>\r\n </div> \r\n </div>\r\n <div className=\"top-label\">\r\n <h6 className=\"text--grey\"></h6>\r\n </div>\r\n <div className=\"big-text\">\r\n <h4 className=\"text--white\">{t(\"wrnty_perforation\")}</h4>\r\n </div>\r\n <div className=\"text text--grey2\">\r\n <h6 className=\"text--white\">{t(\"wrnty_unlimited\")}</h6>\r\n </div>\r\n </div> \r\n </div>\r\n </div>\r\n <a className=\"mz-btn mz-btn--primary mz-btn--white mz-btn--center\" href={t(\"wrnty_href\")} target=\"_self\" data-link-type=\"internal\" data-link-name=\"View Warranty Details\" data-link-url=\"/en/mazda-owners/Overview/warranty/\"><span>{t(\"wrnty_cta\")}</span></a>\r\n <div className=\"mz-spacer-m mz-spacer mz-bg--101010\"></div>\r\n </div>\r\n <div className=\"mz-spacer-s mz-spacer\"></div>\r\n </>\r\n )\r\n};","/* global mzFunc mzMenu mzTabs */\r\n\r\nimport React, { useRef, useState } from 'react';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nimport { get360Data, getLoading, showCmsHiddenBlock, getCmsAwardsBlockFromCMS, showCmsFooterHiddenBlock, getProvince } from '../../../utils';\r\n\r\nimport { openModal, scrollTo } from '../../../Helpers/helpers';\r\n//import SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\nimport NavHelper from '../../../Helpers/navhelper';\r\n\r\nimport Button from '../../1_Atoms/Button/Button';\r\nimport { Svg } from '../../1_Atoms/Svg/Svg';\r\nimport CollapseLegal from '../../2_Molecules/Collapse/CollapseLegal';\r\nimport { Nav } from '../../3_Organisms/Nav/Nav';\r\nimport { Financial } from '../../3_Organisms/Financial/Financial';\r\nimport { BuildSpecs } from '../../3_Organisms/BuildSpecs/BuildSpecs';\r\nimport ThreeSixtyContainer from '../../3_Organisms/360Container/360Container';\r\nimport { Accessories } from '../../3_Organisms/Accessories/Accessories';\r\nimport { FeaturedSpecs } from '../../3_Organisms/FeaturedSpecs/FeaturedSpecs';\r\nimport { Packs } from '../../3_Organisms/Packs/Packs';\r\nimport { Modal } from '../../3_Organisms/Modal/Modal';\r\n\r\nexport const SummaryPage = ({ ...props }) => {\r\n const [loading, setLoading] = useState(true);\r\n const summaryCalculator = window.summaryCalculator;\r\n const { year, carline, trim, model, packageCode } = useParams();\r\n const [nav, setNav] = React.useState(null);\r\n const navigate = useNavigate();\r\n const { t, i18n } = useTranslation(['summary', 'general']);\r\n const buildSpecsRef = useRef(null);\r\n\r\n const [hasScrolled, setHasScrolled] = React.useState(false);\r\n\r\n const [openCollapsable, setOpenCollapsable] = React.useState(null);\r\n const [openSpecificationCollapsable, setOpenSpecificationCollapsable] = React.useState(null);\r\n\r\n const legalContent = JSON.parse(sessionStorage.getItem(Constants.LegalSummary));\r\n const [legalModalOpen, setLegalModalOpen] = React.useState(false);\r\n\r\n const [dealerID, setDealerID] = useState(null);\r\n const [isRetailerMode, setIsRetailerMode] = useState(window.bnp_retailer_mode === true ? true : false);\r\n\r\n\tconst gtmHelper = new GTMHelper();\r\n\tconst navHelper = new NavHelper();\r\n\r\n //showCmsHiddenBlock(summaryCalculator.selectedVehicle.carline);\r\n\r\n showCmsFooterHiddenBlock();\r\n\r\n summaryCalculator.CurrentStep = 9;\r\n\r\n React.useEffect(() => {\r\n async function executeTasks() {\r\n if (!summaryCalculator.isDataLoaded()) {\r\n await summaryCalculator.loadVehicleData(year, carline, trim, model, packageCode);\r\n await summaryCalculator.loadFromFinancialProvider();\r\n\r\n if (JSON.parse(sessionStorage.getItem(Constants.HasFinancialProviderError)) === true) {\r\n const vehiclePageUri = `/${decodeURI(window.location.search)}`;\r\n navigate(vehiclePageUri)\r\n }\r\n\r\n setLoading(false);\r\n\r\n setNav(null);\r\n } else {\r\n setLoading(false);\r\n }\r\n\r\n if(!loading) {\r\n if (nav === null) {\r\n //setNav(navHelper.getNavContent(year, carline, trim, model, packageCode,summaryCalculator.CurrentStep, t));\r\n const toRender = navHelper.getNavContent(t);\r\n setNav(toRender); \r\n }\r\n if(summaryCalculator.isDataLoaded() && !hasScrolled) {\r\n // ONCE THE PAGE DATA IS LOADED ANCHOR TO CONTACT A DEALER\r\n if (window.location.href.indexOf('?contactDealer') > 0) {\r\n function isFindDealerForm() {\r\n const formEl = document.getElementById('contactDealer')\r\n if (formEl) {\r\n const reactEl = formEl.querySelector('.FormApp');\r\n if(reactEl){\r\n document.querySelector('#contactDealer').scrollIntoView({\r\n block: 'end',\r\n behavior: 'smooth'\r\n });\r\n }else{\r\n setTimeout(isFindDealerForm, 15);\r\n }\r\n } else {\r\n setTimeout(isFindDealerForm, 15);\r\n }\r\n }\r\n isFindDealerForm();\r\n }\r\n \r\n setHasScrolled(true);\r\n }\r\n }\r\n\r\n\t\t\tif(typeof mzFunc === 'object' && typeof mzTabs === 'object'){\r\n\t\t\t\tmzFunc.waitForEl('.mzBuildandPrice .mz-tabs').then(function(components){mzTabs.init(components);});\r\n mzMenu.init();\r\n\t\t\t}\r\n\r\n // Set the retailer mode (Force this call for the hotlink situation)\r\n const isRetailerMode = await summaryCalculator.isRetailerMode();\r\n setIsRetailerMode(isRetailerMode);\r\n }\r\n executeTasks();\r\n }, [summaryCalculator, loading]);\r\n\r\n let images = {};\r\n\r\n if (summaryCalculator.SelectedColourExteriorIndex !== 'null' && summaryCalculator.Colours !== null) {\r\n const { exteriors, interiors } = summaryCalculator.Colours.visual;\r\n const selectedExterior = Object.entries(exteriors)[summaryCalculator.SelectedColourExteriorIndex][1];\r\n const selectedInterior = summaryCalculator.SelectedColourInteriorIndex !== 'null' ? interiors[summaryCalculator.SelectedColourInteriorIndex] : null;\r\n images = get360Data(summaryCalculator.Colours.visual, selectedExterior, selectedInterior);\r\n }\r\n\r\n React.useEffect(() => {\r\n if (window.bnp_retailer_mode) {\r\n // Set the polling until we have a dealer vars with the information set as we should always have the dealer vars information\r\n const intervalRef = setInterval(()=>{\r\n const dealerVars = window.summaryCalculator.getDealerVars();\r\n \r\n if (dealerVars) {\r\n setDealerID(dealerVars.dealerId);\r\n \r\n clearInterval(intervalRef);\r\n }\r\n }, 200);\r\n } else {\r\n // Restart React Forms app.\r\n // Skip if this is the first time loading it because App.js takes care of it.\r\n if (window.isReactFormsAppLoaded && typeof window.initReactFormsApp === 'function') {\r\n window.initReactFormsApp();\r\n }\r\n }\r\n }, []);\r\n\r\n React.useEffect(() => {\r\n if(dealerID) {\r\n // Restart React Forms app.\r\n // Skip if this is the first time loading it because App.js takes care of it.\r\n if (window.isReactFormsAppLoaded && typeof window.initReactFormsApp === 'function') {\r\n window.initReactFormsApp();\r\n }\r\n }\r\n }, [dealerID, isRetailerMode]);\r\n\r\n const generateStaticVehicleImg = () => {\r\n if (images) {\r\n const { imagePath, imageName } = images;\r\n const { year, carline, trim } = summaryCalculator.selectedVehicle\r\n const src = imagePath && imageName ? `${imagePath}${imageName.replace('{index}', 18)}` : '';\r\n return (\r\n <img src={src} alt={year + '' + carline + ' ' + trim} />\r\n )\r\n }\r\n return ''\r\n }\r\n\r\n return (\r\n <>\r\n {getLoading(false, t)}\r\n <div className=\"mz-summary-page mz-top-nav-spacing\">\r\n <Nav nav={nav} />\r\n\r\n <h6 className='mz-full-width mz-summary__page-title'>{t(\"build_summary\")}</h6>\r\n <h3 className='mz-full-width mz-summary__page-subtitle'>{t(\"your\")} {ReactHtmlParser(summaryCalculator.VehicleTitle)}</h3>\r\n\r\n <div className=\"mz-summary__top-vehicle-image\">\r\n {generateStaticVehicleImg()}\r\n </div>\r\n\r\n <div className=\"mz-full-width mz-summary__top-actions\">\r\n <button\r\n className=\"reset mz-summary-review-build-btn interactive text--grey\"\r\n onClick={() => {\r\n scrollTo({ y: buildSpecsRef.current, offsetY: 100 });\r\n gtmHelper.setGTM({'action':'Sctoll to','scrollto': 'Review Build'}, true, false);\r\n }}\r\n >\r\n <span>{t(\"review_build_specifications\")}</span>\r\n </button>\r\n </div>\r\n \r\n <div style={{marginTop: '25px'}}></div>\r\n \r\n <div className=\"mz-grey-block\">\r\n { !loading ?\r\n <Financial\r\n openCollapsable={openCollapsable}\r\n setOpenCollapsable={setOpenCollapsable}\r\n /> : null }\r\n\r\n <div id=\"BNP_AWARDS\">\r\n {ReactHtmlParser(getCmsAwardsBlockFromCMS(summaryCalculator.selectedVehicle.year, summaryCalculator.selectedVehicle.carline))}\r\n </div>\r\n\r\n <div className=\"mzReactForms mz-summary--container-forms\" id=\"contactDealer\">\r\n <input type=\"hidden\" data-mz-form-field-name=\"formType\" value=\"BookTestDrive\"/>\r\n {isRetailerMode ?\r\n <>\r\n <h3 className=\"mz-summary__form-app-title\">{t(\"take_the\")} {ReactHtmlParser(summaryCalculator.VehicleTitle)} {t('test_drive')}</h3>\r\n <div className=\"mz-spacer mz-spacer-s\"></div>\r\n <input type=\"hidden\" data-mz-form-field-name=\"dealerId\" value={dealerID}/>\r\n </>\r\n :\r\n <>\r\n <h3 className=\"mz-summary__form-app-title\">{t(\"contact_your_local_retailer\")}</h3>\r\n </>\r\n }\r\n\r\n <input type=\"hidden\" data-mz-form-field-name=\"formDisclaimer\" value={t(\"form_disclaimer_retailer\")}/> \r\n <input type=\"hidden\" data-mz-form-field-name=\"modelCode\" value={model}/>\r\n <input type=\"hidden\" data-mz-form-field-name=\"modelOption\" value={packageCode}/>\r\n <input type=\"hidden\" data-mz-form-field-name=\"isTopSectionHidden\" value=\"true\"/>\r\n <input type=\"hidden\" data-mz-form-field-name=\"isEmbeddedOnBnP\" value=\"true\"/>\r\n <input type=\"hidden\" data-mz-form-field-name=\"source\" value=\"WF\"/>\r\n <div className=\"mz-react-forms-root\"></div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"mz-summary--container mz-summary--container-build\">\r\n <BuildSpecs componentRef={buildSpecsRef} />\r\n <Accessories />\r\n </div>\r\n\r\n {images?.imagePlaceHolder ? <ThreeSixtyContainer imagePlaceHolder={images.imagePlaceHolder} /> : <ThreeSixtyContainer imagePathInterior={images.imagePathInterior} imagePath={images.imagePath} imageAmount={images.imageAmount} imageName={images.imageName} />}\r\n \r\n {sessionStorage.getItem(Constants.SpecificationData) && Object.keys(JSON.parse(sessionStorage.getItem(Constants.SpecificationData))).length > 0 ?\r\n <div className=\"mz-grey-block mz-summary--container mz-summary--container-specs\">\r\n <FeaturedSpecs\r\n openCollapsable={openSpecificationCollapsable}\r\n />\r\n </div>\r\n :''}\r\n\r\n \r\n \r\n\r\n <Modal modalContent={legalContent} isOpen={legalModalOpen} handleClose={setLegalModalOpen} modalId='legalModal' />\r\n </div>\r\n {!window.bnp_retailer_mode &&\r\n <Packs />\r\n }\r\n <div className=\"mz-summary-page\">\r\n <div className=\"mz-summary--container mz-summary-warranty\">\r\n <div className=\"mz-legal mz-mobile\">\r\n <Button\r\n className=\"mz-btn mz-btn--legal alwaysVisible text--grey\"\r\n label={t(\"general:legal\")}\r\n backgroundColor=\"grey\"\r\n colour=\"grey\"\r\n icon={true}\r\n iconAfter={true}\r\n svg_className=\"\"\r\n svg_list=\"plus\"\r\n size={0.6}\r\n onClick={() => {\r\n document.querySelector('body').classList.add('disabled');\r\n setLegalModalOpen(true);\r\n gtmHelper.setGTM({'action':'Open Modal','modal': 'Legal'}, true, false);\r\n }}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n )\r\n}\r\n\r\nexport default SummaryPage;","import React from 'react';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { useRef, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { formatPrice, getFinanceWeekly, getLeaseBiWeeklyFromMsrp } from '../../../utils';\r\nimport SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nexport const EngineCard = ({ Model, Selected, HandleSelectedModel, Index, showFinancePrice, ...props }) => {\r\n const summaryCalculator = window.summaryCalculator;\r\n const [modelData] = React.useState(Model);\r\n\tconst financial = JSON.parse(sessionStorage.getItem(Constants.FinancialObj));\r\n const engineCost = modelData.financial.msrp - summaryCalculator.SelectedTrim.financial.msrp; //financial.msrp;\r\n const { t, i18n } = useTranslation(['options', 'general']);\r\n\tconst [expandedIndex, setExpandedIndex] = React.useState(null);\r\n\tconst collapseRef = useRef(null);\r\n\tconst [toggle, setToggle] = React.useState(false);\r\n\tconst isExpanded = false;\r\n\r\n function setSelectedModel(index) {\r\n HandleSelectedModel(index)\r\n }\r\n\r\n\tuseEffect(() =>{\r\n\t\tif(typeof window.mzAnimator === 'object'){\r\n\t\t\twindow.mzAnimator.animateHeight(collapseRef.current, 'EngineCollapse' + Index, 'init')\r\n\t\t}\r\n \t},[]);\r\n \r\n useEffect(() =>{\r\n\t\twindow.mzAnimator.animateHeight(collapseRef.current, 'EngineCollapse' + Index, toggle)\r\n \t},[toggle]);\r\n\r\n\tfunction handleCollapse(e){\r\n\t\t\tif (isExpanded !== null && expandedIndex !== null && Index !== null) {\r\n\t\t\t\tif (isExpanded === true) {\r\n\t\t\t\t\tsetExpandedIndex(null);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsetExpandedIndex(Index);\r\n\t\t\t\t\tsetTimeout(()=>{\r\n\t\t\t\t\t\tconst collapseTarget = e.target.closest('.mz-collapse');\r\n\t\t\t\t\t\tif(collapseTarget){\r\n\t\t\t\t\t\t\tconst scrollWindow = document.querySelector('.mz-package-page__package-card-list');\r\n\t\t\t\t\t\t\tconst topScroll = collapseTarget.offsetTop;\r\n\t\t\t\t\t\t\tscrollWindow.scroll({\r\n\t\t\t\t\t\t\t top:topScroll,\r\n\t\t\t\t\t\t\t behavior: 'smooth'\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t},100);\r\n\t\t\t\t}\r\n\t\t\t} else{\r\n\t\t\t\tsetToggle(!toggle);\r\n\t\t\t}\r\n\t}\r\n return (\r\n <div className={`mz-collapse engine-card ${Selected?'mz-collapse-selected engine-card-selected':''}`}>\r\n\r\n {modelData ?\r\n\r\n\t\t\t\t<div className=\"engine-card__content\">\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tonClick={handleCollapse}\r\n\t\t\t\t\t\tclassName=\"mz-collapse__button\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{Selected &&\r\n\t\t\t\t\t\t\t<div className=\"mz-check-indicator\"><i className=\"mz-svg mz-svg--white mz-svg-checkmark\"></i></div>\r\n\t\t\t\t\t\t}\r\n\t\t <h6 className=\"engine-card__title\">\r\n\t\t\t\t\t\t\t{modelData.drivetrain.short_description}<br/>\r\n\t\t\t\t\t\t\t{modelData.transmission.short_description}<br/>\r\n\t\t\t\t\t\t\t{modelData.engine.short_description}\r\n\t\t\t\t\t\t</h6>\r\n\t\t\t\t\t\t{engineCost != 0 ? ReactHtmlParser(`<p class=\"engine-card__price\">${formatPrice(engineCost)} <span>\r\n\t\t\t\t\t\t\t${showFinancePrice?\r\n\t\t\t\t\t\t\t`(${getFinanceWeekly(engineCost, financial.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex].rate, financial.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex].term)}${t(\"general:week\")})` : \r\n\t\t\t\t\t\t\t!window.hideLeaseInCard ? `(${getLeaseBiWeeklyFromMsrp(engineCost, financial.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].rate, financial.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].term)}${t(\"general:bi_week\")})` : ''\r\n\t\t\t\t\t\t\t}</span></p>`) : ''}\r\n\t\t\t\t\t\t<i className={`mz-svg mz-svg-chevron ${toggle ? 'mz-svg--rotate270':''}`}></i>\r\n\t\t\t\t\t\t<hr />\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div className=\"mz-collapse__box\" ref={collapseRef}>\r\n\r\n\t\t {!modelData.description ?\r\n\t\t\t\t\t\t<ul className=\"engine-card__list\">\r\n\t\t\t\t\t\t\t<li className=\"engine-card__list-item\">{ReactHtmlParser(modelData.drivetrain.label)}</li>\r\n\t\t\t\t\t\t\t<li className=\"engine-card__list-item\">{ReactHtmlParser(modelData.transmission.label)}</li>\r\n\t\t </ul> :\r\n\t\t <p dangerouslySetInnerHTML={{ __html: modelData.description }} />}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div>\r\n\t\t {Selected ? <button className=\"mz-btn mz-button--secondary engine-card__select-button\" disabled={true}><span>{t(\"general:button_selected\")}</span></button> : <button className=\"mz-btn mz-btn--primary mz-btn--red engine-card__select-button\" onClick={()=>{\r\n\t\t\t\t\t\t\tsetSelectedModel(Index);\r\n\t\t\t\t\t\t}}><span>{t(\"select_engine\")}</span></button>}\r\n\t\t\t\t\t</div>\r\n </div> : null}\r\n </div>\r\n )\r\n}\r\n\r\n\r\nexport default EngineCard;\r\n\r\nEngineCard.propTypes = {\r\n HandleSelectedModel: PropTypes.func,\r\n}\r\n\r\nEngineCard.defaultProps = {\r\n HandleSelectedModel: () => {},\r\n};","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useRef, useEffect } from 'react';\r\nimport { formatPrice, getFinanceWeekly, getLeaseBiWeeklyFromMsrp, getLeaseBiWeeklyFromOptions } from '../../../utils';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nexport const PackageCard = ({ Package, PopContent, ButStyle, ButContent, Selected, ButSelectedContent, SelectedIndex, HandleSelectedPackage, HandleRemovePackage, HasCollapse=true, Index, showFinancePrice, isUniversal, displayPriceCalculation = true, displayConnectedServicePriceCalculation = false, ...props }) => {\r\n const summaryCalculator = window.summaryCalculator;\r\n const [packageData, setPackageData] = React.useState(Package);\r\n\tconst [financial, setFinancial] = React.useState(summaryCalculator.FinancialInfo);\r\n const packageCost = packageData.financial.msrp;\r\n const { t, i18n } = useTranslation(['packages', 'general']);\r\n\tconst [expandedIndex, setExpandedIndex] = React.useState(null);\r\n\tconst collapseRef = useRef(null);\r\n\tconst [toggle, setToggle] = React.useState(false);\r\n\tconst isExpanded = false;\r\n\t \r\n\tfunction getConnectivityPackageDesc(){\r\n\t\tlet packageDesc;\r\n\r\n\t\t/*if(packageArr && packageArr.length === 0){\r\n\t\t\tpackageDesc=packageData.description;\r\n\t\t}else{\r\n\t\t\tpackageDesc= packageData.features.map((feature, index) => {return `<li class=\"package-card__list-item\" key=${index}>${feature.content}</li>`});\r\n\t\t\tpackageDesc = `<ul class=\"package-card__list\">${packageDesc.join('')}</ul>`;\r\n\t\t}*/\r\n\t\t//\r\n\r\n\t\tpackageDesc= `<li class=\"package-card__list-item\" >${packageData.title}</li>`;\r\n\t\tpackageDesc = `<ul class=\"package-card__list\">${packageData.subtitle}</ul>`;\t\t\r\n\t\treturn packageDesc;\r\n\t}\r\n\r\n\tfunction getPackageDesc(){\r\n\t\tlet packageArr=packageData.features;\r\n\t\tlet packageDesc;\r\n\r\n\t\tif(packageArr && packageArr.length === 0){\r\n\t\t\tpackageDesc=packageData.description;\r\n\t\t}else{\r\n\t\t\tpackageDesc= packageData.features.map((feature, index) => {return `<li class=\"package-card__list-item\" key=${index}>${feature.content}</li>`});\r\n\t\t\tpackageDesc = `<ul class=\"package-card__list\">${packageDesc.join('')}</ul>`;\r\n\t\t}\r\n\r\n\t\treturn packageDesc;\r\n\t}\r\n\r\n\t// DO NOT REMOVE THIS IS USED TO REFRESH WHEN AN ENGINE AND DRIVETRAIN GET SELECTED\r\n\tuseEffect(() =>{\r\n\t\tsetPackageData(Package);\r\n\r\n\t\tconst collapse = collapseRef.current; \r\n if(typeof window.mzAnimator === 'object' ){\r\n window.mzAnimator.animateHeight(collapse, 'PackageList' + Index, 'init', toggle)\r\n }\r\n\t}, [Package]);\r\n \r\n useEffect(() =>{\r\n const collapse = collapseRef.current;\r\n window.mzAnimator.animateHeight(collapse, 'PackageList' + Index, toggle)\r\n },[toggle]);\r\n\r\n async function setSelectedPackage(index) {\r\n await HandleSelectedPackage(index);\r\n }\r\n\r\n async function removeSelectedPackage(index) {\r\n await HandleRemovePackage(index);\r\n }\r\n\r\n\tfunction handleCollapse(e){\r\n\t\t\tconst $el = e.target;\r\n\r\n\t\t\tif (isExpanded !== null && expandedIndex !== null && Index !== null) {\r\n\t\t\t\tif (isExpanded === true) {\r\n\t\t\t\t\tsetExpandedIndex(null);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsetExpandedIndex(Index);\r\n\t\t\t\t\tsetTimeout(()=>{\r\n\t\t\t\t\t\tconst collapseTarget = e.target.closest('.mz-collapse');\r\n\t\t\t\t\t\tif(collapseTarget){\r\n\t\t\t\t\t\t\tconst scrollWindow = document.querySelector('.mz-package-page__package-card-list');\r\n\t\t\t\t\t\t\tconst topScroll = collapseTarget.offsetTop;\r\n\t\t\t\t\t\t\tscrollWindow.scroll({\r\n\t\t\t\t\t\t\t top:topScroll,\r\n\t\t\t\t\t\t\t behavior: 'smooth'\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t},100);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tsetToggle(!toggle);\r\n\t\t\t}\r\n\t}\r\n\tconst showPrice = ()=>{\r\n\t\tlet spanCont;\r\n\t\tif(isUniversal){\r\n\t\t\treturn (<p className=\"package-card__price noUpper\">{t('warrantyDisclaimer')}</p>);\r\n\t\t}else{\r\n\t\t\tif(packageCost!==null && displayPriceCalculation){\r\n\t\t\t\tspanCont = showFinancePrice?\r\n\t\t\t\t\t\t`(${getFinanceWeekly(packageCost, financial.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex].aprRate, financial.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex].term)}${t(\"general:week\")})`:\r\n\t\t\t\t\t\t!window.hideLeaseInCard ? `(${getLeaseBiWeeklyFromMsrp(packageCost, financial.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].leaseRate, financial.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].term)}${t(\"general:bi_week\")})` : ''\r\n\t\t\t}\r\n\t\t\tif(packageCost!==null && displayConnectedServicePriceCalculation) {\r\n\t\t\t\tspanCont = showFinancePrice?\r\n\t\t\t\t\t\t`(${getFinanceWeekly(packageCost, financial.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex].aprRate, financial.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex].term)}${t(\"general:week\")})`:\r\n\t\t\t\t\t\t`(${getLeaseBiWeeklyFromOptions(packageCost, financial.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].leaseRate, financial.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].term)}${t(\"general:bi_week\")})`\r\n\r\n\t\t\t}\r\n\t\t\treturn(<p className=\"package-card__price\">+ {formatPrice(packageCost)} <span>{spanCont}</span></p>);\r\n\t\t}\r\n\t}\r\n\r\n return (\r\n\t\t<div className={`mz-collapse package-card ${Selected ? 'mz-collapse-selected selected' : ''}`}>\r\n <div\r\n onClick={handleCollapse}\r\n className=\"mz-collapse__button\"\r\n >\t\r\n\t\t\t\t{Selected && !ButSelectedContent &&\r\n\t\t\t\t\t<div className=\"mz-check-indicator\"><i className=\"mz-svg mz-svg--white mz-svg-checkmark\"></i></div>\r\n\t\t\t\t}\r\n\t\t\t\t{Package.popular===1 && <div className=\"package-card__popular label\">{PopContent}</div>}\r\n\t\t\t\t<h3 className=\"package-card__title\">{packageData.name}</h3>\r\n\t\t\t\t{!HasCollapse && <div>{ReactHtmlParser(displayConnectedServicePriceCalculation ? getConnectivityPackageDesc() : getPackageDesc())}</div>}\r\n\t\t\t\t{showPrice()}\r\n\t\t\t\t{HasCollapse && <><i className={`mz-svg mz-svg-chevron ${toggle ? 'mz-svg--rotate270':''}`}></i>\r\n\t\t\t\t<hr /></>}\r\n\t\t\t</div>\r\n\t\t\t{HasCollapse && <div className=\"mz-collapse__box\" ref={collapseRef}>{ReactHtmlParser(getPackageDesc())}</div>}\r\n\t\t\t<div>\r\n\t\t\t\t{Selected ? \r\n\t\t\t\t\tButSelectedContent ? \r\n\t\t\t\t\t\t<button className=\"mz-btn mz-btn--primary package-card__button\" onClick={()=>removeSelectedPackage(Index)}><span>{ButSelectedContent}</span></button> \r\n\t\t\t\t\t: \r\n\t\t\t\t\t\t<button className=\"mz-btn mz-btn--primary package-card__button\" onClick={()=>removeSelectedPackage(Index)}><span>{t(\"button_remove_package\")}</span></button> \r\n\t\t\t\t: \r\n\t\t\t\t\tButContent ?\r\n\t\t\t\t\t\t<button className=\"mz-btn mz-btn--primary mz-btn--red package-card__button\" onClick={()=>{setSelectedPackage(Index);}}><span>{ButContent}</span></button>\r\n\t\t\t\t\t:\r\n\t\t\t\t\t<button className=\"mz-btn mz-btn--primary mz-btn--red package-card__button\" onClick={()=>{setSelectedPackage(Index);}}>\r\n\t\t\t\t\t\t<span>{t(\"button_select_package\")}</span>\r\n\t\t\t\t\t</button>\r\n\t\t\t\t}\r\n\t\t\t</div>\r\n\t\t</div>\r\n )\r\n}\r\n\r\n\r\nexport default PackageCard;\r\n\r\nPackageCard.propTypes = {\r\n HandleSelectedPackage: PropTypes.func,\r\n HandleRemovePackage: PropTypes.func,\r\n}\r\n\r\nPackageCard.defaultProps = {\r\n HandleSelectedPackage: () => {},\r\n HandleRemovePackage: () => {},\r\n};","import React, { useState } from 'react';\r\nimport { useNavigate, useParams } from 'react-router-dom'\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { get360Data, goToTop, getLoading, setCursorWaiting, hideCmsHiddenBlock} from '../../../utils';\r\n\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\nimport NavHelper from '../../../Helpers/navhelper';\r\n\r\nimport Button from '../../1_Atoms/Button/Button';\r\nimport EngineCard from '../../2_Molecules/EngineCard/EngineCard';\r\nimport ThreeSixtyContainer from '../../3_Organisms/360Container/360Container';\r\nimport { Nav } from '../../3_Organisms/Nav/Nav';\r\nimport { Pricing } from '../../3_Organisms/Pricing/Pricing';\r\nimport { Modal } from '../../3_Organisms/Modal/Modal';\r\nimport { PreOrderModal } from '../../3_Organisms/Modal/PreOrderModal';\r\nimport PackageCard from '../../2_Molecules/PackageCard/PackageCard';\r\nimport { Alert } from '../../3_Organisms/Alert/Alert';\r\n\r\nexport const Options = (...props) => {\r\n const summaryCalculator = window.summaryCalculator;\r\n const [loading, setLoading] = useState(true);\r\n const [is360Loading, setIs360Loading] = useState(true); \r\n const [firstEmptyDataLoad, setFirstEmptyDataLoad] = useState(false);\r\n const [dataNeedUpdate, setDataNeedUpdate] = useState(false);\r\n const [selectedModelIndex, setSelectedModelIndex] = useState(summaryCalculator.SelectedModelIndex);\r\n const [showFinancePrice, setShowFinancePrice] = React.useState(summaryCalculator.ShowFinancePrice);\r\n const { year, carline, trim, model, option } = useParams(); \r\n const listRef = React.useRef();\r\n const [nav, setNav] = React.useState(null);\r\n const navigate = useNavigate();\r\n const legalContent = JSON.parse(sessionStorage.getItem(Constants.LegalOption));\r\n const [legalModalOpen, setLegalModalOpen] = React.useState(false);\r\n const [images, setImages] = React.useState({});\r\n const { t, i18n } = useTranslation(['options', 'general']);\r\n\r\n const [preorderOpen, setPreorderModalOpen] = React.useState(false);\r\n \r\n\tconst gtmHelper = new GTMHelper();\r\n\tconst navHelper = new NavHelper();\r\n\r\n hideCmsHiddenBlock();\r\n\r\n function set360images() {\r\n if(!summaryCalculator.Colours)\r\n return;\r\n \r\n if (!Object.keys(images).length) {\r\n summaryCalculator.SetSelectedColorsFromParams();\r\n\r\n if (summaryCalculator.SelectedColourExteriorIndex > -1 && summaryCalculator.Colours) {\r\n const extArray = Object.entries(summaryCalculator.Colours.visual.exteriors);\r\n setImages(get360Data(summaryCalculator.Colours.visual, extArray[summaryCalculator.SelectedColourExteriorIndex][1], summaryCalculator.Colours.visual.interiors[summaryCalculator.SelectedColourInteriorIndex]));\r\n setIs360Loading(false);\r\n } else if (summaryCalculator.AvailableTrim) {\r\n setImages(get360Data(summaryCalculator.AvailableTrim.trims[summaryCalculator.SelectedTrimIndex].visual));\r\n setIs360Loading(false);\r\n } else if (summaryCalculator.EngineAndDrivetrain) {\r\n setImages(get360Data(summaryCalculator.SelectedModel.visual));\r\n setIs360Loading(false);\r\n }\r\n }\r\n }\r\n\r\n summaryCalculator.CurrentStep = 2;\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n React.useEffect(() => {\r\n async function executeTasks() {\r\n if (window.bnp_under_maintenance)\r\n return;\r\n\r\n if (!firstEmptyDataLoad) {\r\n setFirstEmptyDataLoad(true);\r\n\r\n if (!summaryCalculator.isDataLoaded()) {\r\n summaryCalculator.reset(false);\r\n\r\n if(model || option) {\r\n console.log('has package ', model, option);\r\n await summaryCalculator.loadVehicleData(year, carline, trim, model, option); \r\n } else {\r\n await summaryCalculator.loadVehicleData(year, carline, trim);\r\n }\r\n\r\n if (JSON.parse(sessionStorage.getItem(Constants.HasFinancialProviderError)) === true) {\r\n const vehiclePageUri = `/${decodeURI(window.location.search)}`;\r\n navigate(vehiclePageUri)\r\n }\r\n }\r\n\r\n setSelectedModelIndex(summaryCalculator.SelectedModelIndex);\r\n\r\n setDataNeedUpdate(true);\r\n\r\n setNav(null);\r\n\r\n setLoading(false);\r\n }\r\n\r\n if (!loading) {\r\n if (dataNeedUpdate) {\r\n setDataNeedUpdate(false);\r\n\r\n setLoading(true);\r\n\r\n if (selectedModelIndex !== summaryCalculator.SelectedModelIndex) {\r\n setCursorWaiting(true);\r\n await summaryCalculator.setSelectedModelIndex(selectedModelIndex);\r\n\r\n await summaryCalculator.updateSingleLineFromFinancialProvider();\r\n\r\n updateAddressBar();\r\n\r\n\t\t\t\t\t\tgtmHelper.setGTM({'action':'Model Change'}, false, false);\r\n\r\n setCursorWaiting(false);\r\n } \r\n else {\r\n if (model && option) {\r\n console.log('has package ', model, option);\r\n \r\n await summaryCalculator.loadVehicleData(year, carline, trim, model, option);\r\n }\r\n }\r\n\r\n\r\n set360images();\r\n\r\n const toRender = navHelper.getNavContent(t);\r\n setNav(toRender);\r\n\r\n setLoading(false);\r\n }\r\n }\r\n\r\n if (listRef.current) {\r\n window.removeEventListener('resize', setListMaxHeight);\r\n window.addEventListener('resize', setListMaxHeight);\r\n setListMaxHeight();\r\n }\r\n }\r\n\r\n executeTasks();\r\n }, [nav, carline, summaryCalculator, loading, dataNeedUpdate, showFinancePrice, is360Loading, selectedModelIndex]);\r\n\r\n function updateAddressBar() {\r\n const lang = document.querySelector('meta[name=\"data-language\"]') ? document.querySelector('meta[name=\"data-language\"]').content === 'en' ? 'en' : 'fr' : 'en';\r\n const province = document.querySelector('meta[name=\"data-region\"]') ? document.querySelector('meta[name=\"data-region\"]').content : 'on'; \r\n const urlPrefix = window.location.hostname === 'localhost' ? '' : lang === 'en' ? '/en/shopping/build-and-price' : '/fr/magasiner/construction-et-prix/';\r\n const url = `${urlPrefix}/#/${year}/${carline}/${trim}/${summaryCalculator.SelectedModel.model_code}/${summaryCalculator.SelectedPackage.option_code}?prov_code=${province}&lang_code=${lang}`;\r\n //history.replaceState('', 'React App', url);\r\n window.history.replaceState(null, 'React App', url);\r\n }\r\n\r\n React.useEffect(() => {\r\n // Redraw the 360 images\r\n set360images();\r\n }, [images]);\r\n\r\n async function handleSelectedPackage(index) {\r\n setCursorWaiting(true);\r\n\r\n await summaryCalculator.setSelectedPackageIndex(index);\r\n\r\n // This is a patch for the MX5 package selection\r\n await summaryCalculator.loadColours(year, carline, trim, summaryCalculator.SelectedModel.model_code, summaryCalculator.SelectedPackage.option_code);\r\n\r\n // Added these two call as wheels and accessories a package dependant\r\n await summaryCalculator.loadWheels(year, carline, trim, summaryCalculator.SelectedModel.model_code, summaryCalculator.SelectedPackage.option_code);\r\n await summaryCalculator.loadAccessories(year, carline, trim, summaryCalculator.SelectedModel.model_code, summaryCalculator.SelectedPackage.option_code);\r\n\r\n await summaryCalculator.updateSingleLineFromFinancialProvider();\r\n\r\n //setSelectedPackageIndex(index);\r\n\t\tgtmHelper.setGTM({'action':'Package Add', 'package': summaryCalculator.SelectedPackage.option_code}, false, false);\r\n\r\n const toRender = navHelper.getNavContent(t);\r\n setNav(toRender);\r\n\r\n updateAddressBar();\r\n\r\n // Refresh the 360 images\r\n setImages({});\r\n\r\n setCursorWaiting(false);\r\n }\r\n\r\n async function handleRemovePackage(index) {\r\n setCursorWaiting(true);\r\n\r\n\t\tgtmHelper.setGTM({'action':'Package Remove', 'package': summaryCalculator.SelectedPackage.option_code}, true, false);\r\n\r\n await summaryCalculator.setSelectedPackageIndex(null);\r\n\r\n // This is a patch for the MX5 package selection\r\n await summaryCalculator.loadColours(year, carline, trim, summaryCalculator.SelectedModel.model_code, summaryCalculator.SelectedPackage.option_code);\r\n\r\n // Added these two call as wheels and accessories a package dependant\r\n await summaryCalculator.loadWheels(year, carline, trim, summaryCalculator.SelectedModel.model_code, summaryCalculator.SelectedPackage.option_code);\r\n await summaryCalculator.loadAccessories(year, carline, trim, summaryCalculator.SelectedModel.model_code, summaryCalculator.SelectedPackage.option_code);\r\n\r\n await summaryCalculator.updateSingleLineFromFinancialProvider();\r\n\r\n const toRender = navHelper.getNavContent(t);\r\n setNav(toRender);\r\n\r\n updateAddressBar();\r\n\r\n // Refresh the 360 images\r\n setImages({});\r\n\r\n setCursorWaiting(false);\r\n\r\n } \r\n \r\n function handleSelectedModel(index) {\r\n setCursorWaiting(true);\r\n\r\n setImages({});\r\n\r\n setSelectedModelIndex(index);\r\n\r\n setDataNeedUpdate(true);\r\n\r\n updateAddressBar();\r\n\r\n setNav(null);\r\n\r\n setCursorWaiting(false);\r\n }\r\n\r\n function nextStep() {\r\n if (summaryCalculator.SelectedModel) {\r\n goToTop();\r\n navigate(`/${year}/${carline}/${trim}/${summaryCalculator.SelectedModel.model_code}/${summaryCalculator.SelectedModel.option_code}/colours${decodeURI(window.location.search)}`);\r\n } else {\r\n goToTop();\r\n navigate(`/${year}/${carline}/${trim}/${summaryCalculator.EngineAndDrivetrain.models[0].financial.based_on.model_code}/${summaryCalculator.EngineAndDrivetrain.models[0].financial.based_on.option_code}/colours${decodeURI(window.location.search)}`);\r\n }\r\n\t\tgtmHelper.setGTM({'action':'Next Step'}, true , false);\r\n }\r\n\r\n\tfunction setListMaxHeight(){\r\n if (listRef.current)\r\n if (window.innerWidth < 1025) {\r\n listRef.current.style.maxHeight = 'unset';\r\n } else {\r\n const incentivebar = document.querySelector('.mz-alert__item'); // Red alert bar\r\n\t\t\t\tconst submenu=document.querySelector(\".mz-sticky-submenu\");\r\n\t\t\t\tconst pricingBar=\r\n listRef.current.style.height = `${window.innerHeight - (submenu?.offsetTop + document.querySelector(\".mz-sticky-submenu\")?.offsetHeight + document.querySelector(\".mz-pricing\")?.offsetHeight + (incentivebar ? incentivebar.offsetHeight : 0) + 40)}px`;\r\n\t\t\t\tif(!submenu || !pricingBar){\r\n\t\t\t\t\tsetTimeout(setListMaxHeight, 100);\r\n\t\t\t\t}\r\n }\r\n\r\n }\r\n\r\n function handleShowFinanceClick(value) {\r\n setShowFinancePrice(value);\r\n }\r\n\r\n return (\r\n <>\r\n {getLoading(loading, t)}\r\n <div className=\"mz-engine-and-drivetrain-page mz-top-nav-spacing grid-no-gutter-sm\">\r\n <Nav nav={nav} />\r\n <Alert />\r\n\r\n {summaryCalculator.EngineAndDrivetrain?.models?.length ?\r\n <div key='0' className=\"mz-full-width mz-engine-and-drivetrain-page__content general-content\">\r\n <div className=\"mz-engine-and-drivetrain-page__content-left\">\r\n <ThreeSixtyContainer imagePathInterior={images.imagePathInterior} imagePath={images.imagePath} imageAmount={images.imageAmount} imageName={images.imageName} trimName={summaryCalculator.VehicleTitle} imageIsLoading={is360Loading} />\r\n </div>\r\n <div className=\"mz-engine-and-drivetrain-page__content-right\">\r\n <div className=\"mz-engine-and-drivetrain-page__engine-card-list\" ref={listRef}>\r\n <h5 className='mz-engine-and-drivetrain-page__engine-card-list-title'>{t(\"select_engine_and_drivetrain\")}</h5>\r\n {summaryCalculator.displayWarning() ? <div className={`mz-alert-message`}>\r\n <i className=\"mz-svg mz-svg-warning mz-svg--red\"></i> \r\n <span className=\"mz-alert-message__text\">{t(\"warning_change_selection\")}</span>\r\n </div> : null}\r\n {summaryCalculator.EngineAndDrivetrain?.models.map((Model, index) => <EngineCard Model={Model} Selected={summaryCalculator.SelectedModelIndex === index} HandleSelectedModel={handleSelectedModel} Index={index} key={index} showFinancePrice={showFinancePrice}></EngineCard>)}\r\n\r\n {summaryCalculator.Packages ? summaryCalculator.Packages.packages.filter(pack => pack.type === 'model_option_package').length ? <hr className=\"mz-package-page__content-separator\" /> : null : null}\r\n {summaryCalculator.Packages ? summaryCalculator.Packages.packages.filter(pack => pack.type === 'model_option_package').length > 0 && <h2 className='mz-package-page__package-card-list-title'>{t(\"packages:available_packages\")}</h2> : null}\r\n {summaryCalculator.Packages ? summaryCalculator.Packages.packages.filter(pack => pack.type === 'model_option_package').map((Package, index) => <PackageCard Package={Package} Selected={summaryCalculator.SelectedPackageIndex === index}\r\n\t\t\t\t\t\t\tSelectedIndex={summaryCalculator.SelectedPackageIndex === index?summaryCalculator.SelectedPackageIndex:''} HandleSelectedPackage={handleSelectedPackage} HandleRemovePackage={handleRemovePackage} Index={index} key={index} showFinancePrice={showFinancePrice}></PackageCard>) : null}\r\n\r\n\r\n <div className=\"mz-legal mz-mobile\">\r\n <Button\r\n className=\"mz-btn mz-btn--legal text--grey\"\r\n label={t(\"general:legal\")}\r\n backgroundColor=\"grey\"\r\n colour=\"grey\"\r\n icon={true}\r\n iconAfter={true}\r\n svg_className=\"\"\r\n svg_list=\"plus\"\r\n size={0.6}\r\n onClick={() => {\r\n\t\t\t\t\t\t\t\t\t\tdocument.querySelector('body').classList.add('disabled');\r\n\t\t\t\t\t\t\t\t\t\tsetLegalModalOpen(true)\r\n\t\t\t\t\t\t\t\t\t}}\r\n />\r\n </div>\r\n </div> \r\n </div>\r\n </div>\r\n : null}\r\n\r\n {summaryCalculator.EngineAndDrivetrain?.models?.length && summaryCalculator.SelectedModel ?\r\n <Pricing builtLabel={t(\"general:price_as_built\")} builtPrice=\"$\" loanLabel={t(\"general:loan_label\")} loanPrice=\"$\" saveLabel={t(\"general:save_build\")}\r\n leaseLabel={t(\"general:show_lease_price\")} financeLabel={t(\"general:show_finance_price\")} buttonLabel={t(\"general:next_colour\")}\r\n HandleNextClick={nextStep} setLegalModalOpen={setLegalModalOpen} HandleShowFinanceClick={handleShowFinanceClick} setPreorderModalOpen={setPreorderModalOpen} /> : null}\r\n <Modal modalContent={legalContent} isOpen={legalModalOpen} handleClose={setLegalModalOpen} modalId='legalModal' />\r\n <PreOrderModal isOpen={preorderOpen} handleClose={setPreorderModalOpen}></PreOrderModal> \r\n </div>\r\n </>\r\n )\r\n}\r\n\r\nexport default Options;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { formatPrice, getBaseUrl, getFinanceWeekly, getLeaseBiWeeklyFromOptions } from '../../../utils';\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nexport const ColourCard = ({ Colour, Disabled, Selected, HandleSelectedColour, isExterior, Index, showFinancePrice, ...props }) => {\r\n\r\n const [colourData] = React.useState(Colour);\r\n const [selected] = React.useState(Selected);\r\n const financial = JSON.parse(sessionStorage.getItem(Constants.FinancialObj));\r\n const financeTermIndex = parseInt(sessionStorage.getItem(Constants.FinanceTermIndex));\r\n const leaseTermIndex = parseInt(sessionStorage.getItem(Constants.LeaseTermIndex));\r\n const financeTerm = parseInt(sessionStorage.getItem(Constants.FinanceTerm));\r\n const leaseTerm = parseInt(sessionStorage.getItem(Constants.LeaseTerm));\r\n const { t, i18n } = useTranslation(['colours', 'general']);\r\n\r\n function setSelectedColour(index) {\r\n HandleSelectedColour(index)\r\n }\r\n const imagePath = getBaseUrl() + process.env.REACT_APP_BASIC_CONTENT_PATH;\r\n const apiBasePath = process.env.API_URL_BASE_PATH;\r\n\r\n return (\r\n <button onClick={() =>{\r\n\t\t\tsetSelectedColour(Index);\r\n\r\n\t\t}} className={`colour-card ${Selected?'colour-card-selected':''}`} disabled={Disabled}>\r\n {colourData ? <span className=\"colour-card__content\">\r\n <img className=\"colour-card__img\" alt={colourData.description} src={`${imagePath}${colourData.thumbnail}` } />\r\n <span className={Selected ? \"colour-card__selected-indicator selected\" : \"colour-card__selected-indicator\"}><i className=\"mz-svg mz-svg--white mz-svg-checkmark\"></i></span>\r\n <span className=\"colour-card__info\">\r\n <span className=\"colour-card__title\"><span className='text--red font-bold'>{Colour.new ? ReactHtmlParser(t('new')) : ''}</span>{ReactHtmlParser(Colour.description)}</span>\r\n <span className=\"colour-card__price\">{Colour.price!==0?`+ ${formatPrice(Colour.price)}`:''} <span>{Colour.price!==0? \r\n `(${showFinancePrice?\r\n `${getFinanceWeekly(Colour.price, financial.calculatedFinance.financeValues[financeTermIndex].aprRate, financial.calculatedFinance.financeValues[financeTermIndex].term)}${t(\"general:week\")}`:\r\n `${getLeaseBiWeeklyFromOptions(Colour.price, financial.calculatedLease.leaseValues[leaseTermIndex].leaseRate, financial.calculatedLease.leaseValues[leaseTermIndex].term)}${t(\"general:bi_week\")}`})`:''}</span></span>\r\n </span>\r\n </span> : null}\r\n </button>\r\n )\r\n\r\n}\r\n\r\n\r\nexport default ColourCard;\r\n\r\nColourCard.propTypes = {\r\n HandleSelectedColour: PropTypes.func,\r\n}\r\n\r\nColourCard.defaultProps = {\r\n HandleSelectedColour: () => { },\r\n};","import React, { useState } from 'react';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { get360Data, goToTop, getLoading, setTabsNextAndPrevButtons, setCursorWaiting, hideCmsHiddenBlock } from '../../../utils';\r\n\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\nimport NavHelper from '../../../Helpers/navhelper';\r\n\r\nimport Button from '../../1_Atoms/Button/Button';\r\nimport { Svg } from '../../1_Atoms/Svg/Svg';\r\nimport CollapseLegal from '../../2_Molecules/Collapse/CollapseLegal';\r\nimport ColourCard from '../../2_Molecules/ColourCard/ColourCard';\r\nimport ThreeSixtyContainer from '../../3_Organisms/360Container/360Container';\r\nimport { Nav } from '../../3_Organisms/Nav/Nav';\r\nimport { PreOrderModal } from '../../3_Organisms/Modal/PreOrderModal';\r\nimport { Pricing } from '../../3_Organisms/Pricing/Pricing';\r\nimport { Modal } from '../../3_Organisms/Modal/Modal';\r\nimport { Alert } from '../../3_Organisms/Alert/Alert';\r\n\r\nexport const Colours = ({ ...props }) => {\r\n const [loading, setLoading] = useState(true);\r\n const [is360Loading, setIs360Loading] = useState(true);\r\n const summaryCalculator = window.summaryCalculator;\r\n let defaultInteriorColour = JSON.parse(sessionStorage.getItem(Constants.DefaultInteriorColour));\r\n let defaultExteriorColour = JSON.parse(sessionStorage.getItem(Constants.DefaultExteriorColour));\r\n const { year, carline, trim, model, packageCode } = useParams();\r\n const [nav, setNav] = React.useState(null);\r\n let extArray = null;\r\n const [images, setImages] = React.useState({});\r\n const navigate = useNavigate();\r\n const listRef = React.useRef();\r\n const legalContent = JSON.parse(sessionStorage.getItem(Constants.LegalColours));\r\n const [legalModalOpen, setLegalModalOpen] = React.useState(false);\r\n const { t, i18n } = useTranslation(['colours', 'general']);\r\n const [selectedColourInteriorIndex, setSelectedColourInteriorIndex] = React.useState(null);\r\n const [selectedColourExteriorIndex, setSelectedColourExteriorIndex] = React.useState(null);\r\n const [showFinancePrice, setShowFinancePrice] = React.useState(summaryCalculator.ShowFinancePrice);\r\n\r\n const [preorderOpen, setPreorderModalOpen] = React.useState(false);\r\n \r\n\tconst gtmHelper = new GTMHelper();\r\n\tconst navHelper = new NavHelper();\r\n\r\n hideCmsHiddenBlock();\r\n\r\n summaryCalculator.CurrentStep = 3;\r\n\r\n React.useEffect(() => {\r\n const toRender = navHelper.getNavContent(t);\r\n setNav(toRender);\r\n \r\n async function executeTasks() {\r\n if (window.bnp_under_maintenance)\r\n return;\r\n\r\n if (!summaryCalculator.isDataLoaded()) {\r\n await summaryCalculator.loadTrims(year, carline);\r\n\r\n const trimIndex = summaryCalculator.AvailableTrim.trims.findIndex(obj => obj.trim_type.url_slug === trim);\r\n await summaryCalculator.setSelectedTrimIndex(trimIndex);\r\n\r\n setLoading(false);\r\n\r\n setNav(null);\r\n } else {\r\n setLoading(false);\r\n }\r\n\r\n if (!loading) {\r\n /*if (nav === null) {\r\n setNav(navHelper.getNavContent(year, carline, trim, model, packageCode, summaryCalculator.CurrentStep, t));\r\n }*/\r\n\r\n summaryCalculator.SetSelectedColorsFromParams();\r\n\r\n if (summaryCalculator.SelectedColourInterior === null) {\r\n if (summaryCalculator.SelectedColourInteriorIndex !== null)\r\n summaryCalculator.SelectedColourInteriorIndex = summaryCalculator.SelectedColourInteriorIndex; // Added this for when the page is beeing ctrl-r\r\n else {\r\n defaultInteriorColour = summaryCalculator.Colours.visual.interiors[0];\r\n summaryCalculator.Colours.visual.interiors.map((Colour, index) => {\r\n if (defaultInteriorColour.id === Colour.id)\r\n summaryCalculator.SelectedColourInteriorIndex = index;\r\n setSelectedColourInteriorIndex(index);\r\n })\r\n }\r\n }\r\n\r\n if (summaryCalculator.SelectedColourExterior === null) {\r\n if (summaryCalculator.SelectedColourExteriorIndex !== null)\r\n summaryCalculator.SelectedColourExteriorIndex = summaryCalculator.SelectedColourExteriorIndex; // Added this for when the page is beeing ctrl-r\r\n else {\r\n defaultExteriorColour = defaultInteriorColour.default_exterior;\r\n Object.entries(summaryCalculator.Colours.visual.exteriors).map((Colour, index) => {\r\n if (defaultExteriorColour.id === Colour[1]['id'])\r\n summaryCalculator.SelectedColourExteriorIndex = index;\r\n setSelectedColourExteriorIndex(index);\r\n })\r\n }\r\n }\r\n\r\n if (summaryCalculator.SelectedColourExteriorIndex > -1 && summaryCalculator.Colours) {\r\n const extArray = Object.entries(summaryCalculator.Colours.visual.exteriors);\r\n setImages(get360Data(summaryCalculator.Colours.visual, extArray[summaryCalculator.SelectedColourExteriorIndex][1], summaryCalculator.Colours.visual.interiors[summaryCalculator.SelectedColourInteriorIndex]));\r\n setIs360Loading(false);\r\n } else if (summaryCalculator.AvailableTrim) {\r\n setImages(get360Data(summaryCalculator.AvailableTrim.trims[summaryCalculator.SelectedTrimIndex].visual));\r\n setIs360Loading(false);\r\n }\r\n \r\n showWarning(); \r\n }\r\n }\r\n\r\n\t\tif (listRef.current) {\r\n\t\t\tsetListMaxHeight();\r\n }\r\n \r\n executeTasks();\r\n }, [summaryCalculator, selectedColourExteriorIndex, selectedColourInteriorIndex, loading, is360Loading]);\r\n\r\n React.useEffect(() => {\r\n //console.log('360 loading');\r\n }, [is360Loading]);\r\n \r\n function getAllowedExteriorsIds(exteriors) {\r\n let allowedExteriors = [];\r\n exteriors.forEach(exterior => {\r\n allowedExteriors.push(exterior.id);\r\n });\r\n return allowedExteriors;\r\n }\r\n\r\n async function handleSelectedColourInterior(index) {\r\n await summaryCalculator.setSelectedColourInteriorIndex(index);\r\n setSelectedColourInteriorIndex(index);\r\n\t\tgtmHelper.setGTM({'action':'Interior Colour Change'}, false, false);\r\n\r\n const allowedExteriors = getAllowedExteriorsIds(summaryCalculator.Colours.visual.interiors[index].allowed_exteriors);\r\n summaryCalculator.AllowedColoursExterior = allowedExteriors\r\n if (!allowedExteriors.includes(Object.entries(summaryCalculator.Colours.visual.exteriors)[summaryCalculator.SelectedColourExteriorIndex][1].id)) {\r\n const defaultExteriorId = summaryCalculator.Colours.visual.interiors[index].default_exterior.id;\r\n Object.entries(summaryCalculator.Colours.visual.exteriors).forEach(async (exterior, index) => {\r\n if (exterior[1].id === defaultExteriorId) {\r\n await summaryCalculator.setSelectedColourExteriorIndex(index);\r\n setSelectedColourExteriorIndex(index);\r\n }\r\n })\r\n }\r\n }\r\n\r\n async function handleSelectedColourExterior(index) {\r\n setCursorWaiting(true);\r\n\r\n setLoading(true);\r\n\r\n await summaryCalculator.setSelectedColourExteriorIndex(index);\r\n setSelectedColourExteriorIndex(index);\r\n\t\tgtmHelper.setGTM({'action':'Exterior Colour Change'}, false, false);\r\n\r\n const images = get360Data(summaryCalculator.Colours.visual, extArray[index][1], summaryCalculator.Colours.visual.interiors[summaryCalculator.SelectedColourInteriorIndex]);\r\n setImages(images);\r\n setCursorWaiting(false);\r\n }\r\n\r\n function nextStep() {\r\n goToTop();\r\n navigate(`/${year}/${carline}/${trim}/${model}/${packageCode}/wheels${decodeURI(window.location.search)}`)\r\n\t\tgtmHelper.setGTM({'action':'Next Step'}, true , false);\r\n }\r\n\r\n function showWarning() {\r\n let showWarningMessage = false;\r\n Object.entries(summaryCalculator.Colours.visual.exteriors).map((Colour, index) => {\r\n if (!summaryCalculator.AllowedColoursExterior.includes(Colour[1].id)) {\r\n showWarningMessage = true;\r\n }\r\n });\r\n\t\tshowWarningMessage = true;\r\n return showWarningMessage;\r\n\r\n }\r\n\r\n function setListMaxHeight() {\r\n if (listRef.current){\r\n if (window.innerWidth < 1025) {\r\n listRef.current.style.maxHeight = 'unset';\r\n listRef.current.style.overflow = 'auto';\r\n } else {\r\n const incentivebar = document.querySelector('.mz-alert__item'); // Red alert bar\r\n\r\n listRef.current.style.height = `${window.innerHeight - (document.querySelector(\".mz-sticky-submenu\")?.offsetTop + document.querySelector(\".mz-sticky-submenu\")?.offsetHeight + document.querySelector(\".mz-pricing\")?.offsetHeight + (incentivebar ? incentivebar.offsetHeight : 0) + 50)}px`;\r\n listRef.current.style.overflow = 'auto';\r\n }\r\n\t\t}\r\n\r\n\t}\r\n\r\n function handleShowFinanceClick(value) {\r\n setShowFinancePrice(value);\r\n }\r\n\r\n if (summaryCalculator.Colours && summaryCalculator.Colours.visual) {\r\n extArray = Object.entries(summaryCalculator.Colours.visual.exteriors);\r\n }\r\n\r\n if (summaryCalculator.SelectedColourInterior !== null && summaryCalculator.Colours && summaryCalculator.AllowedColoursExterior.length === 0) {\r\n const allowedExteriors = getAllowedExteriorsIds(summaryCalculator.Colours.visual.interiors[summaryCalculator.SelectedColourInteriorIndex].allowed_exteriors);\r\n summaryCalculator.AllowedColoursExterior = allowedExteriors;\r\n }\r\n\r\n\twindow.addEventListener('resize', setListMaxHeight);\r\n\r\n return (\r\n <>\r\n {getLoading(loading, t)}\r\n <div className=\"mz-colours-page mz-top-nav-spacing grid-no-gutter-sm\">\r\n <Nav nav={nav} />\r\n <Alert />\r\n\r\n {summaryCalculator.Colours?.visual ?\r\n <div key='0' className=\"mz-full-width mz-colours-page__content general-content\">\r\n <div className=\"mz-colours-page__content-left\">\r\n {images.imagePathInterior ?\r\n <ThreeSixtyContainer imagePathInterior={images.imagePathInterior} imagePath={images.imagePath} imageAmount={images.imageAmount} imageName={images.imageName} trimName={summaryCalculator.VehicleTitle} imageIsLoading={is360Loading} /> : <></>}\r\n </div>\r\n <div className=\"mz-colours-page__content-right right-container\">\r\n\r\n <div className=\"mz-colours-page__package-card-list right-container\" ref={listRef}>\r\n\t\t\t\t\t\t\t<h5 className='mz-colours-page__package-card-list-title'>{t(\"select_exterior_colour\")}</h5>\r\n {showWarning() ? <div className=\"mz-alert-message paragraph paragraph--tight\">\r\n <i className=\"mz-svg mz-svg-warning mz-svg--red\"></i>\r\n <span className=\"mz-alert-message__text\">{t(\"general:warning_change_color_selection\")}</span>\r\n </div> : null}\r\n <div className='mz-colours-page__package-card-list-container'>\r\n {Object.entries(summaryCalculator.Colours.visual.exteriors).map((Colour, index) => <ColourCard Colour={Colour[1]} Selected={summaryCalculator.SelectedColourExteriorIndex === index} HandleSelectedColour={handleSelectedColourExterior}\r\n\t\t\t\t\t\t\t\tisExterior={true} Index={index} key={index} Disabled={!summaryCalculator.AllowedColoursExterior.includes(Colour[1].id)} showFinancePrice={showFinancePrice}></ColourCard>)}\r\n </div>\r\n <hr className='mz-colours-page__package-card-list-separator' />\r\n\t\t\t\t\t\t\t<h5 className='mz-colours-page__package-card-list-title'>{t(\"select_interior_colour\")}</h5>\r\n <div className='mz-colours-page__package-card-list-container'>\r\n {summaryCalculator.Colours.visual.interiors.map((Colour, index) => <ColourCard Colour={Colour} Selected={summaryCalculator.SelectedColourInteriorIndex === index}\r\n\t\t\t\t\t\t\t\tisExterior={false} HandleSelectedColour={handleSelectedColourInterior} Index={index} key={index} showFinancePrice={showFinancePrice}></ColourCard>)}\r\n </div>\r\n\r\n <div className=\"mz-legal mz-mobile\">\r\n <Button\r\n className=\"mz-btn mz-btn--legal text--grey\"\r\n label={t(\"general:legal\")}\r\n backgroundColor=\"grey\"\r\n colour=\"grey\"\r\n icon={true}\r\n iconAfter={true}\r\n svg_className=\"\"\r\n svg_list=\"plus\"\r\n size={0.6}\r\n onClick={() => {\r\n\t\t\t\t\t\t\t\t\t\tdocument.querySelector('body').classList.add('disabled');\r\n\t\t\t\t\t\t\t\t\t\tsetLegalModalOpen(true)\r\n\t\t\t\t\t\t\t\t\t}}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n : null}\r\n {summaryCalculator.Colours?.visual ?\r\n <Pricing builtLabel={t(\"general:price_as_built\")} builtPrice=\"$\" loanLabel={t(\"general:loan_label\")} loanPrice=\"$\" saveLabel={t(\"general:save_build\")}\r\n leaseLabel={t(\"general:show_lease_price\")} financeLabel={t(\"general:show_finance_price\")} buttonLabel={t(\"general:next_wheel\")} summaryCalculator={summaryCalculator}\r\n HandleNextClick={nextStep} setLegalModalOpen={setLegalModalOpen} HandleShowFinanceClick={handleShowFinanceClick} setPreorderModalOpen={setPreorderModalOpen} /> : null}\r\n <Modal modalContent={legalContent} isOpen={legalModalOpen} handleClose={setLegalModalOpen} modalId='legalModal' />\r\n <PreOrderModal isOpen={preorderOpen} handleClose={setPreorderModalOpen}></PreOrderModal> \r\n </div>\r\n </>\r\n )\r\n}\r\n\r\nexport default Colours;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nimport { getLang, formatPrice, getBaseUrl, getFinanceWeekly, getLeaseBiWeeklyFromOptions, getDisplayableProvinceName } from '../../../utils';\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\n\r\nimport { Tooltip } from '../../1_Atoms/Tooltip/Tooltip';\r\n\r\nexport const WheelCard = ({ Wheel, Disabled, Selected, HandleSelectedWheel, Index, showFinancePrice, ...props }) => {\r\n const [selected] = React.useState(Selected);\r\n const financial = JSON.parse(sessionStorage.getItem(Constants.FinancialObj));\r\n const financeTermIndex = parseInt(sessionStorage.getItem(Constants.FinanceTermIndex));\r\n const leaseTermIndex = parseInt(sessionStorage.getItem(Constants.LeaseTermIndex));\r\n const financeTerm = parseInt(sessionStorage.getItem(Constants.FinanceTerm));\r\n const leaseTerm = parseInt(sessionStorage.getItem(Constants.LeaseTerm));\r\n const { t, i18n } = useTranslation(['wheels', 'general']);\r\n\r\n const imagePath = getBaseUrl() + process.env.REACT_APP_BASIC_CONTENT_PATH;\r\n\r\n function setSelectedWheel() {\r\n if (Selected) {\r\n HandleSelectedWheel(null)\r\n } else {\r\n HandleSelectedWheel(Wheel.index)\r\n }\r\n }\r\n\r\n function getTotalCost(wheel) {\r\n if(!wheel)\r\n return;\r\n\r\n let total = wheel.price;\r\n total += wheel.install_cost ? wheel.install_cost : 0; \r\n total += wheel.tpms ? wheel.tpms : 0;\r\n \r\n return formatPrice(total, true);\r\n }\r\n\r\n function getTooltipText(wheel) {\r\n const lang = getLang();\r\n const languageText = lang === 'en' ? 'This price includes:' : 'Ce prix inclut :';\r\n const basePrice = lang === 'en' ? `4 x ${wheel.title}: ` : `4 x ${wheel.title} : `\r\n const tpmsText = lang === 'en' ? `4 x Tire Pressure Monitoring System sensors` : `4 capteurs pour le système de surveillance de la pression des pneus`;\r\n const installText = lang === 'en' ? `Installation (based on average labour rates in ${getDisplayableProvinceName()})` : `Installation (calculée en fonction des frais de main-d’œuvre moyens chez les détaillants ${getDisplayableProvinceName()})`;\r\n const totalText = lang === 'en' ? `Total price` : `Prix total`;\r\n\r\n const totalCost = wheel.price //getTotalCost(wheel);\r\n\r\n let text = wheel.tpms && wheel.install_cost ? `${languageText}` : ``;\r\n text += wheel.base_msrp ? `<br>${basePrice}${formatPrice(wheel.base_msrp, true)}` : ''; \r\n text += wheel.tpms ? `<br>${tpmsText} : ${formatPrice(wheel.tpms, true)}` : '';\r\n text += wheel.install_cost ? `<br>${installText} : ${formatPrice(wheel.install_cost, true)}` : '';\r\n text += wheel.install_cost ? `<hr>${totalText} : ${formatPrice(totalCost, true)}` : ``;\r\n\r\n return text;\r\n }\r\n\r\n return (\r\n <button onClick={() => setSelectedWheel()} className={`wheel-card ${Selected ? 'wheel-card-selected' : ''}`} disabled={Disabled}>\r\n {Wheel ? <span className=\"wheel-card__content\">\r\n <img className=\"wheel-card__img\" alt={Wheel.name} src={`${imagePath}/wheels/${Wheel.image.thumbnail}`} />\r\n <span className={Selected ? \"wheel-card__selected-indicator selected\" : \"wheel-card__selected-indicator\"}><i className=\"mz-svg mz-svg--white mz-svg-checkmark\"></i></span>\r\n <span className=\"wheel-card__info\">\r\n <span className=\"wheel-card__title\">{Wheel.title}</span>\r\n <span className=\"wheel-card__price\">{Wheel.price !== 0 ? `+ ${formatPrice(Wheel.price)}` : ''} <span className=\"nowrap\">{Wheel.price !== 0 ?\r\n `(${showFinancePrice ?\r\n `${getFinanceWeekly(Wheel.price, financial.apr[financeTermIndex].rate, financial.apr[financeTermIndex].term)}${t(\"general:week\")}` :\r\n `${getLeaseBiWeeklyFromOptions(Wheel.price, financial.apr[leaseTermIndex].leaseRate, financial.apr[leaseTermIndex].term)}${t(\"general:bi_week\")}`})` : ''}\r\n {getTooltipText(Wheel) ? <Tooltip TooltipText={ReactHtmlParser(getTooltipText(Wheel))} /> : ``}</span>\r\n </span>\r\n\r\n </span>\r\n </span> : null}\r\n </button>\r\n )\r\n\r\n}\r\n\r\n\r\nexport default WheelCard;\r\n\r\nWheelCard.propTypes = {\r\n HandleSelectedWheel: PropTypes.func,\r\n}\r\n\r\nWheelCard.defaultProps = {\r\n HandleSelectedWheel: () => { },\r\n};","//tabs driven by core js.\r\n/* global mzFunc mzTabs */\r\n\r\nimport React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nimport WheelCard from '../../2_Molecules/WheelCard/WheelCard'\r\n\r\nexport const WheelsList = ({ Wheels, DisabledIndexes, SelectedIndex, HandleSelectedWheel, defaultWheelSize, showFinancePrice,...props }) => {\r\n const hasDefaultWheelSize = (formatedData, defaultSize) => {\r\n const hasKey = Number(defaultSize) in formatedData;\r\n return hasKey;\r\n } \r\n\r\n\tconst { t, i18n } = useTranslation(['wheels']);\r\n const [wheelsData, setWheelsData] = React.useState(parceWheelsData());\r\n const [sizes] = React.useState(Object.keys(wheelsData));\r\n\r\n\tconst gtmHelper = new GTMHelper();\r\n\r\n const initWheelTab = sessionStorage.getItem(Constants.SelectedWheelSize) ? sessionStorage.getItem(Constants.SelectedWheelSize) : defaultWheelSize ? String(defaultWheelSize) : sizes[0];\r\n\r\n const [selectedWheelsSize, setSelectedWheelsSize] = React.useState(initWheelTab);\r\n const [warningMessage, setWarningMessage] = React.useState(getWarningMessage(initWheelTab));\r\n const summaryCalculator = window.summaryCalculator;\r\n function handleSelectedWheel(index) {\r\n HandleSelectedWheel(index);\r\n }\r\n\r\n function getWarningMessage(newSize) {\r\n let newMessage = null;\r\n\r\n if (!defaultWheelSize) return newMessage;\r\n\r\n if (Number(newSize) > Number(defaultWheelSize)) {\r\n i18n.language == \"en\" ? newMessage = `${newSize}″ ${t('wheel_def_pre')} ${t('wheel_def_large')} ${t('wheel_def_suff')}` : newMessage = `${t('wheel_def_pre')} ${newSize}″ ${t('wheel_def_large')} ${t('wheel_def_suff')}`\r\n } else if (Number(newSize) < Number(defaultWheelSize)) {\r\n i18n.language == \"en\" ? newMessage = `${newSize}″ ${t('wheel_def_pre')} ${t('wheel_def_small')} ${t('wheel_def_suff')}` : newMessage = `${t('wheel_def_pre')} ${newSize}″ ${t('wheel_def_small')} ${t('wheel_def_suff')}`\r\n }\r\n\r\n return newMessage;\r\n }\r\n\r\n\r\n function groupBy(xs, key) {\r\n return xs.reduce(function (rv, x) {\r\n (rv[x[key]] = rv[x[key]] || []).push(x);\r\n return rv;\r\n }, {});\r\n };\r\n\r\n function parceWheelsData() {\r\n var data = [];\r\n let formatedData = {};\r\n\r\n for (const index in Wheels) {\r\n data.push(Wheels[index]);\r\n }\r\n \r\n data.forEach((wheel, index) => {\r\n wheel.selected = SelectedIndex!==null?Number(SelectedIndex) === index:null;\r\n wheel.disabled = DisabledIndexes.includes(index);\r\n wheel.index = index;\r\n })\r\n\r\n if (data.length) {\r\n formatedData = groupBy(data, 'size');\r\n }\r\n\r\n const HASDEFAULTWHEELSIZE = hasDefaultWheelSize(formatedData, defaultWheelSize);\r\n // Add default wheel size array\r\n if(defaultWheelSize !== 0 && !HASDEFAULTWHEELSIZE) \r\n formatedData[defaultWheelSize] = [];\r\n\r\n return (formatedData);\r\n }\r\n\r\n const getWheelSizeSuffix = (size) => {\r\n if (!size) return '';\r\n let suffix = '\"';\r\n\r\n if (defaultWheelSize && Number(size) === Number(defaultWheelSize)) {\r\n suffix += t('wheel_size');\r\n }\r\n\r\n return suffix\r\n }\r\n\r\n React.useEffect(() => {\r\n setWheelsData(parceWheelsData());\r\n\r\n\t\tif(typeof mzFunc === 'object' && typeof mzTabs === 'object'){\r\n\t\t\tmzFunc.waitForEl('.mzBuildandPrice .mz-tabs').then(function(components){mzTabs.init(components);});\r\n\t\t}\r\n\r\n }, [Wheels]);\r\n\r\n return (\r\n <div className=\"wheels-list\">\r\n\t\t\t<div className=\"mz-tabs\">\r\n\t\t\t\t<div className=\"mz-tabs-menu\">\r\n\t\t\t\t\t<div className=\"mz-tabs-menu-container\">\r\n\t\t\t\t\t <div className=\"mz-tabs-menu-inner\">\r\n {\r\n\t\t\t sizes.map((size, key) => (\r\n\t\t\t <a\r\n\t\t\t className={size === selectedWheelsSize ? 'wheels-list__tab active' : 'wheels-list__tab'}\r\n\t\t\t onClick={() => {\r\n\t\t\t setSelectedWheelsSize(sizes[key]);\r\n\r\n\t\t\t sessionStorage.setItem(Constants.SelectedWheelSize, sizes[key]);\r\n\r\n setWarningMessage(getWarningMessage(size));\r\n\r\n\t\t\t\t\t\t\t\t\t\tgtmHelper.setGTM({'action':'Tab Click', 'wheel tab': sizes[key]}, true, false);\r\n\t\t\t }}\r\n\t\t\t key={key}\r\n\t\t\t >\r\n\t\t\t {size}{getWheelSizeSuffix(size)}\r\n\t\t\t </a>\r\n\t\t\t ))\r\n\r\n }\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div className=\"mz-tabs-menu--left\"><i className=\"mz-svg mz-svg--grey mz-svg-chevroncarousel mz-svg--rotate180\"></i></div>\r\n\t\t\t\t\t<div className=\"mz-tabs-menu--right active\"><i className=\"mz-svg mz-svg--grey mz-svg-chevroncarousel\"></i></div>\r\n\t\t\t\t</div>\r\n </div>\r\n {wheelsData[selectedWheelsSize] && wheelsData[selectedWheelsSize].length > 0 ?\r\n <div className='wheels-list__tab-content'>\r\n <p className=\"wheels-list__warning-message paragraph paragraph--tight\">\r\n {ReactHtmlParser(t(\"wheels_disclaimer\"))}\r\n </p>\r\n {\r\n warningMessage && (\r\n <p className=\"wheels-list__warning-message paragraph paragraph--tight\"><i className=\"mz-svg mz-svg-warning mz-svg--red\"></i> {warningMessage}</p>\r\n )\r\n }\r\n {wheelsData[selectedWheelsSize].map((wheel, key) =>\r\n <WheelCard Wheel={wheel} Disabled={wheel.disabled} Selected={wheel.selected} Index={key} HandleSelectedWheel={handleSelectedWheel} key={key} showFinancePrice={showFinancePrice} />)\r\n }\r\n </div> \r\n : \r\n <p>\r\n {t(\"wheel_default_msg\")}\r\n </p>\r\n }\r\n </div>\r\n )\r\n}\r\n\r\n\r\nexport default WheelsList;\r\n\r\nWheelsList.propTypes = {\r\n HandleSelectedWheel: PropTypes.func,\r\n}\r\n\r\nWheelsList.defaultProps = {\r\n HandleSelectedWheel: () => {},\r\n};","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nexport const WheelsImageContainer = ({ imageBackgroundCar, imageForegroundWheel, trimName, ...props }) => {\r\n\r\n return (\r\n <div className='mz-wheels-images-container'>\r\n <h2 className=\"mz-wheels-images-container__tittle\">{ReactHtmlParser(trimName)}</h2>\r\n <div className=\"mz-wheels-images-container__background-image-container\">\r\n <img className=\"mz-wheels-images-container__background-image\" src={imageBackgroundCar}/>\r\n\t\t\t\t{ imageForegroundWheel ?\r\n\t\t\t\t\t<div className=\"mz-wheels-images-container__foreground-image-container\">\r\n\t\t\t\t\t\t<img className=\"mz-wheels-images-container__foreground-image\" src={imageForegroundWheel}/>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t: <></>\r\n\t\t\t\t}\r\n </div>\r\n\r\n </div>\r\n )\r\n}\r\n\r\nexport default WheelsImageContainer;\r\n\r\nWheelsImageContainer.propTypes = {\r\n imageBackgroundCar: PropTypes.string,\r\n imageForegroundWheel: PropTypes.string,\r\n\r\n}\r\n\r\nWheelsImageContainer.defaultProps = {\r\n imageBackgroundCar: '/jellies/mazda-logo-placeholder.png',\r\n imageForegroundWheel: ''\r\n};","import React, { useMemo, useState } from 'react';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nimport { get360Data, goToTop, setCursorWaiting, hideCmsHiddenBlock, getLoading } from '../../../utils';\r\n\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\nimport NavHelper from '../../../Helpers/navhelper';\r\n\r\nimport { Nav } from '../../3_Organisms/Nav/Nav';\r\nimport Button from '../../1_Atoms/Button/Button';\r\nimport WheelsList from '../../3_Organisms/WheelsList/WheelsList';\r\nimport { WheelsImageContainer } from '../../3_Organisms/WheelsImageContainer/WheelsImageContainer';\r\nimport { Pricing } from '../../3_Organisms/Pricing/Pricing';\r\nimport { Modal } from '../../3_Organisms/Modal/Modal';\r\nimport { PreOrderModal } from '../../3_Organisms/Modal/PreOrderModal';\r\nimport { Alert } from '../../3_Organisms/Alert/Alert';\r\n\r\nexport const Wheels = ({ ...props }) => {\r\n const [loading, setLoading] = useState(true);\r\n const summaryCalculator = window.summaryCalculator;\r\n const { year, carline, trim, model, packageCode } = useParams();\r\n const [nav, setNav] = React.useState(null);\r\n const navigate = useNavigate();\r\n const listRef = React.useRef();\r\n const legalContent = JSON.parse(sessionStorage.getItem('LegalWheels'));\r\n const [legalModalOpen, setLegalModalOpen] = React.useState(false);\r\n const { t, i18n } = useTranslation(['wheels', 'general']);\r\n const [images, setImages] = useState({});\r\n const [bgImage, setbgImage] = useState(null);\r\n const [fgImage, setfgImage] = useState(null);\r\n const [selectedWheelIndex, setSelectedWheelIndex] = useState(summaryCalculator.SelectedWheelIndex);\r\n const [showFinancePrice, setShowFinancePrice] = React.useState(summaryCalculator.ShowFinancePrice);\r\n\r\n const [preorderOpen, setPreorderModalOpen] = React.useState(false);\r\n \r\n\tconst gtmHelper = new GTMHelper();\r\n const navHelper = new NavHelper();\r\n \r\n\tlet selectedWheelObject;\r\n\r\n const selectedColor = useMemo(() => {\r\n const storageColor = sessionStorage.getItem(Constants.SelectedExteriorColour);\r\n return storageColor ? JSON.parse(storageColor).code : summaryCalculator.Wheels?.visual.interiors[0].default_exterior.code;\r\n }, [summaryCalculator.Wheels]);\r\n\r\n hideCmsHiddenBlock();\r\n\r\n summaryCalculator.CurrentStep = 4;\r\n\r\n React.useEffect(() => {\r\n async function executeTasks() {\r\n if (!summaryCalculator.isDataLoaded()) {\r\n await summaryCalculator.loadVehicleData(year, carline, trim, model, packageCode);\r\n await summaryCalculator.loadFromFinancialProvider();\r\n\r\n setLoading(false);\r\n\r\n setSelectedWheelIndex(summaryCalculator.SelectedWheelIndex);\r\n } else {\r\n setLoading(false);\r\n }\r\n\r\n if (!loading) {\r\n if (nav === null) {\r\n const toRender = navHelper.getNavContent(t);\r\n setNav(toRender); \r\n //setNav(navHelper.getNavContent(year, carline, trim, model, packageCode, summaryCalculator.CurrentStep, t));\r\n }\r\n } \r\n\r\n if (listRef.current) {\r\n setListMaxHeight();\r\n }\r\n }\r\n\r\n executeTasks();\r\n }, [summaryCalculator, nav, loading]);\r\n\r\n async function handleSelectedWheel(index) {\r\n setCursorWaiting(true);\r\n\r\n await summaryCalculator.setSelectedWheelIndex(index);\r\n\r\n setSelectedWheelIndex(index);\r\n\r\n setCursorWaiting(false);\r\n\r\n\t\tgtmHelper.setGTM({'action':'Selected Wheel'}, false, false);\r\n }\r\n\r\n function nextStep() {\r\n goToTop();\r\n //navigate(`/${year}/${carline}/${trim}/${model}/${packageCode}/connectivity${decodeURI(window.location.search)}`);\r\n navigate(`/${year}/${carline}/${trim}/${model}/${packageCode}/accessories${decodeURI(window.location.search)}`)\r\n\t\tgtmHelper.setGTM({'action':'Next Step'}, true , false);\r\n }\r\n\r\n function setListMaxHeight() {\r\n if (listRef.current){\r\n if (window.innerWidth < 1025) {\r\n listRef.current.style.height = 'unset';\r\n } else {\r\n const incentivebar = document.querySelector('.mz-alert__item'); // Red alert bar\r\n\r\n listRef.current.style.height = `${window.innerHeight - (document.querySelector(\".mz-sticky-submenu\")?.offsetTop + document.querySelector(\".mz-sticky-submenu\")?.offsetHeight + document.querySelector(\".mz-pricing\")?.offsetHeight + (incentivebar ? incentivebar.offsetHeight : 0) + 30)}px`;\r\n }\r\n\t\t}\r\n\r\n\t}\r\n\r\n\r\n if (summaryCalculator.Wheels && !images) {\r\n setImages(get360Data(summaryCalculator.Wheels.visual, model));\r\n }\r\n\r\n if (summaryCalculator.Wheels && summaryCalculator.Wheels.wheels) {\r\n // Set Wheel Images\r\n const yearSlug = summaryCalculator.Wheels.year.url_slug;\r\n const carlineSlug = summaryCalculator.Wheels.carline.url_slug;\r\n const trimSlug = summaryCalculator.Wheels.trim.trim_type.url_slug ? summaryCalculator.Wheels.trim.trim_type.url_slug : summaryCalculator.Wheels.trim.trim_type.name;\r\n const wheelImageBaseURL = `${summaryCalculator.Wheels.visual.static_content_base_path}/wheels/${yearSlug}/${carlineSlug}/`;\r\n const bgImagePath = summaryCalculator.SelectedColourInterior && summaryCalculator.SelectedColourInterior.include_in_360 ? `${wheelImageBaseURL}${yearSlug}-${carlineSlug}-${trimSlug.replaceAll(' ', '')}-${selectedColor}-${summaryCalculator.SelectedColourInterior.code}-WHEELS.jpg` : `${wheelImageBaseURL}${yearSlug}-${carlineSlug}-${trimSlug.replaceAll(' ', '')}-${selectedColor}-WHEELS.jpg`;\r\n if (bgImage !== bgImagePath)\r\n setbgImage(bgImagePath);\r\n\r\n selectedWheelObject = summaryCalculator.Wheels.wheels[Object.keys(summaryCalculator.Wheels.wheels)[selectedWheelIndex]];\r\n if (selectedWheelObject) {\r\n const fgImagePath = `${wheelImageBaseURL}${yearSlug}-${carlineSlug}-WHEELS-${selectedWheelObject.image.overlay_image_suffix}.png`;\r\n if(fgImage !== fgImagePath)\r\n setfgImage(fgImagePath);\r\n }\r\n }\r\n\r\n function handleShowFinanceClick(value) {\r\n setShowFinancePrice(value);\r\n }\r\n\r\n return (\r\n <>\r\n {getLoading(false, t)}\r\n <div className=\"mz-wheels-page mz-top-nav-spacing\">\r\n <Nav nav={nav} />\r\n <Alert />\r\n\r\n {summaryCalculator.Wheels?.wheels ?\r\n <div key='0' className=\"mz-full-width mz-wheels-page__content general-content\">\r\n <div className=\"mz-wheels-page__content-left\">\r\n <WheelsImageContainer trimName={summaryCalculator.VehicleTitle} imageBackgroundCar={bgImage} imageForegroundWheel={selectedWheelObject?fgImage:''} />\r\n </div>\r\n <div className=\"mz-wheels-page__content-right right-container\">\r\n <div className=\"mz-wheels-page__wheels-card-list\" ref={listRef}>\r\n <h5 className='mz-wheels-page__wheels-card-list-title'>{ReactHtmlParser(t(\"select_wheels\"))}</h5>\r\n\r\n <WheelsList Wheels={summaryCalculator.Wheels.wheels} SelectedIndex={selectedWheelIndex} DisabledIndexes={[]} HandleSelectedWheel={handleSelectedWheel} defaultWheelSize={summaryCalculator.Wheels.default_wheels_size} showFinancePrice={showFinancePrice}></WheelsList>\r\n\r\n <div className=\"mz-legal mz-mobile\">\r\n <Button\r\n className=\"mz-btn mz-btn--legal text--grey\"\r\n label={t(\"general:legal\")}\r\n backgroundColor=\"grey\"\r\n colour=\"grey\"\r\n icon={true}\r\n iconAfter={true}\r\n svg_className=\"\"\r\n svg_list=\"plus\"\r\n size={0.6}\r\n onClick={() => {\r\n\t\t\t\t\t\t\t\t\t\tdocument.querySelector('body').classList.add('disabled');\r\n\t\t\t\t\t\t\t\t\t\tsetLegalModalOpen(true)}}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n : null}\r\n {summaryCalculator.Wheels?.wheels ?\r\n <Pricing builtLabel={t(\"general:price_as_built\")} builtPrice=\"$\" loanLabel={t(\"general:loan_label\")} loanPrice=\"$\" saveLabel={t(\"general:save_build\")}\r\n leaseLabel={t(\"general:show_lease_price\")} financeLabel={t(\"general:show_finance_price\")} buttonLabel={t(\"general:next_accessories\")} summaryCalculator={summaryCalculator}\r\n HandleNextClick={nextStep} setLegalModalOpen={setLegalModalOpen} HandleShowFinanceClick={handleShowFinanceClick} setPreorderModalOpen={setPreorderModalOpen} /> : null}\r\n <Modal modalContent={legalContent} isOpen={legalModalOpen} handleClose={setLegalModalOpen} modalId='legalModal' />\r\n <PreOrderModal isOpen={preorderOpen} handleClose={setPreorderModalOpen}></PreOrderModal> \r\n </div>\r\n </>\r\n )\r\n}\r\n\r\nexport default Wheels;","// carousel driven by Core\r\n/* global mzCarousel */\r\n\r\nimport React, { useState } from 'react';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nimport { get360Data, goToTop, getLoading, setTabsNextAndPrevButtons, setCursorWaiting, getBaseUrl } from '../../../utils';\r\n\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\nimport NavHelper from '../../../Helpers/navhelper';\r\n\r\nimport Button from '../../1_Atoms/Button/Button';\r\nimport { Svg } from '../../1_Atoms/Svg/Svg';\r\nimport CollapseLegal from '../../2_Molecules/Collapse/CollapseLegal';\r\nimport ColourCard from '../../2_Molecules/ColourCard/ColourCard';\r\nimport ThreeSixtyContainer from '../../3_Organisms/360Container/360Container';\r\nimport { Nav } from '../../3_Organisms/Nav/Nav';\r\nimport { Pricing } from '../../3_Organisms/Pricing/Pricing';\r\nimport { Modal } from '../../3_Organisms/Modal/Modal';\r\nimport { PreOrderModal } from '../../3_Organisms/Modal/PreOrderModal';\r\nimport PackageCard from '../../2_Molecules/PackageCard/PackageCard';\r\n\r\nexport const Connectivity = ({ ...props }) => {\r\n const [loading, setLoading] = useState(true);\r\n const [is360Loading, setIs360Loading] = useState(true);\r\n const summaryCalculator = window.summaryCalculator;\r\n const { year, carline, trim, model, packageCode } = useParams();\r\n const [nav, setNav] = React.useState(null);\r\n let extArray = null;\r\n const [images, setImages] = React.useState({});\r\n const navigate = useNavigate();\r\n const listRef = React.useRef();\r\n const legalContent = JSON.parse(sessionStorage.getItem(Constants.LegalConnectivity));\r\n const [legalModalOpen, setLegalModalOpen] = React.useState(false);\r\n const [connectModalOpen, setConnectModalOpen] = React.useState(false);\r\n const [carouselInit, setCarouselInit] = React.useState(false);\r\n const { t, i18n } = useTranslation(['connectivity', 'general']);\r\n const [showFinancePrice, setShowFinancePrice] = React.useState(summaryCalculator.ShowFinancePrice);\r\n const [selectedConnectedVehicleIndex, setSelectedConnectedVehicleIndex] = React.useState(summaryCalculator.SelectedConnectedVehicleIndex); \r\n const [connectivityPackage, setConnectivityPackage] = React.useState(null); \r\n\r\n const [preorderOpen, setPreorderModalOpen] = React.useState(false);\r\n \r\n\tconst gtmHelper = new GTMHelper();\r\n\tconst navHelper = new NavHelper();\r\n\r\n function hideShownCmsBlock() {\r\n let toHideBlocks = document.querySelectorAll('.mz-footer.visually-shown');\r\n if (toHideBlocks) {\r\n toHideBlocks.forEach(function (e) {\r\n e.classList.remove('visually-shown');\r\n e.classList.add('visually-hidden');\r\n });\r\n }\r\n }\r\n\r\n hideShownCmsBlock();\r\n\r\n summaryCalculator.CurrentStep = 5;\r\n \r\n\r\n React.useEffect(() => {\r\n\t\tasync function executeTasks() {\r\n if (!summaryCalculator.isDataLoaded()) {\r\n await summaryCalculator.loadVehicleData(year, carline, trim, model, packageCode);\r\n\r\n if (JSON.parse(sessionStorage.getItem(Constants.HasFinancialProviderError)) === true) {\r\n const vehiclePageUri = `/${decodeURI(window.location.search)}`;\r\n navigate(vehiclePageUri)\r\n }\r\n\r\n setLoading(false);\r\n } else {\r\n setLoading(false);\r\n }\r\n\r\n if (!loading) {\r\n if (nav === null) {\r\n const toRender = navHelper.getNavContent(t);\r\n setNav(toRender); \r\n }\r\n\r\n if(summaryCalculator.Packages && !connectivityPackage) {\r\n setConnectivityPackage(summaryCalculator.Packages.connected_services[0]);\r\n }\r\n }\r\n\r\n if (listRef.current) {\r\n window.removeEventListener('resize', setListMaxHeight);\r\n window.addEventListener('resize', setListMaxHeight);\r\n setListMaxHeight();\r\n }\r\n \r\n }\r\n\r\n executeTasks();\r\n }, [loading, nav, connectivityPackage]);\r\n\r\n function getConnectivityImagePath() {\r\n const imagePath = getBaseUrl() + process.env.REACT_APP_BASIC_CONTENT_PATH;\r\n //return `https://preprod.mazda.ca/globalassets/mazda-canada/discover-mazda/innovation/mymazdaapp/4.1_c44_remotevehiclestart_nobackground_en.png`\r\n \r\n return `${imagePath}${connectivityPackage.image_folder}hero_section_bnp${connectivityPackage.image_extension}`\r\n }\r\n\r\n function getModalImagePath(carousel) {\r\n const imagePath = getBaseUrl() + process.env.REACT_APP_BASIC_CONTENT_PATH;\r\n \r\n return `${imagePath}${connectivityPackage.image_folder}${carousel.image}`\r\n }\r\n\r\n function nextStep() {\r\n goToTop();\r\n navigate(`/${year}/${carline}/${trim}/${model}/${packageCode}/accessories${decodeURI(window.location.search)}`)\r\n\t\tgtmHelper.setGTM({'action':'Next Step'}, true , false);\r\n }\r\n\r\n function setListMaxHeight() {\r\n if (listRef.current && typeof(mzFunc) === 'object'){\r\n if (window.innerWidth < 1200) {\r\n listRef.current.style.height = 'auto';\r\n } else {\r\n const baseTarget= document.querySelector('.App-container .mz-connectivity-page');\r\n const contentHeight = baseTarget.querySelector('.mz-connectivity-page__title').clientHeight + baseTarget.querySelector('.mz-connectivity-page__content').clientHeight;\r\n const visibleHeight = window.innerHeight - baseTarget.querySelector('.mz-pricing').clientHeight - document.querySelector('.mz-menu').clientHeight - baseTarget.querySelector('nav').clientHeight - document.querySelector('.mz-alert--permanent')?.clientHeight;\r\n if(contentHeight > visibleHeight){\r\n listRef.current.style.height = (window.innerHeight +150)+'px';\r\n }else{\r\n listRef.current.style.height = 'auto';\r\n }\r\n }\r\n\t\t}\r\n\r\n\t}\r\n\r\n function handleShowFinanceClick(value) {\r\n setShowFinancePrice(value);\r\n }\r\n\r\n async function handleSelectedConnectedVehiclePackage(index) {\r\n setCursorWaiting(true);\r\n\r\n await summaryCalculator.setSelectedConnectedVehicleIndex(index);\r\n\r\n setSelectedConnectedVehicleIndex(index);\r\n\t\tgtmHelper.setGTM({'action':'Add Connected Vehicle Package', 'package': summaryCalculator.SelectedConnectedVehiclePackage.name}, false, false);\r\n\r\n setCursorWaiting(false);\r\n }\r\n\r\n async function handleRemoveConnectedVehiclelPackage(index) {\r\n setCursorWaiting(true);\r\n\r\n\t\tgtmHelper.setGTM({'action':'Remove Connected Vehicle Package', 'package': summaryCalculator.SelectedConnectedVehiclePackage.name}, true, false);\r\n\r\n await summaryCalculator.setSelectedConnectedVehicleIndex(null);\r\n\r\n setSelectedConnectedVehicleIndex(null);\r\n\r\n setCursorWaiting(false);\r\n }\r\n\r\n\twindow.addEventListener('resize', setListMaxHeight);\r\n\r\n function setCarousel(){\r\n if(carouselInit){\r\n return `<div class=\"mz-container\" style=\"width:100%;\">\r\n <div class=\"mz-full-width w-100\">\r\n <div class=\"mz-carousel-wrapper\">\r\n <div data-mz-autoplay=\"false\" data-mz-autoplay-timer=\"3000\" data-mz-infinite-loop=\"true\" data-mz-hide-pips=\"false\" data-mz-carousel-theme=\"contain\" data-mz-center=\"undefined\" class=\"mz-carousel glide mz-carousel--contain mz-carousel--light\">\r\n <div class=\"glide__bullets slider__bullets\" data-glide-el=\"controls[nav]\">\r\n ${setBullets()}\r\n </div>\r\n <div class=\"glide__track\" data-glide-el=\"track\">\r\n <ul class=\"glide__slides\">\r\n ${setSlides()}\r\n </ul>\r\n </div>\r\n <div class=\"glide__arrows\" data-glide-el=\"controls\">\r\n <button class=\"mz-btn mz-btn--carousel mz-btn--black glide__arrow glide__arrow--right\" data-glide-dir=\">\">\r\n <span><i class=\"mz-svg mz-svg--grey mz-svg-chevroncarousel\"></i></span>\r\n </button>\r\n <button class=\"mz-btn mz-btn--carousel mz-btn--black glide__arrow glide__arrow--left\" data-glide-dir=\"<\">\r\n <span><i class=\"mz-svg mz-svg--grey mz-svg--rotate180 mz-svg-chevroncarousel\"></i></span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>`\r\n }\r\n }\r\n\r\n function setBullets(){\r\n let slideContent='';\r\n if(connectivityPackage) {\r\n connectivityPackage.carousel.map((carousel, index) => {\r\n slideContent +=`<button class=\"slider__bullet glide__bullet\" data-glide-dir=\"=${index}\"></button>`;\r\n });\r\n }\r\n\r\n return slideContent;\r\n }\r\n\r\n function setSlides(){\r\n let slideContent='';\r\n if(connectivityPackage) {\r\n connectivityPackage.carousel.map((carousel, index) => {\r\n slideContent +=`<li class=\"glide__slide mz-image\" data-mz-slide-nth=\"${index}\">${set5050(carousel)}</li>`;\r\n });\r\n }\r\n\r\n return slideContent;\r\n }\r\n function set5050(carousel){\r\n return `<div class=\"mz-5050 mz-5050--image-right\">\r\n <div class=\"mz-container unconstrained mz-5050-container full-width no-gutter-between-cols\">\r\n <div class=\"mz-5050-left mz-5050-content mz-bg--f5f5f5\">\r\n <div class=\"mz-5050-text-wrapper text--left\">\r\n ${carousel.content}\r\n </div>\r\n </div>\r\n <div class=\"mz-5050-right mz-5050-content mz-bg--f5f5f5\">\r\n <div class=\"mz-image mz-5050-image\">\r\n <img src=\"${getModalImagePath(carousel)}\"></img>\r\n </div>\r\n </div>\r\n \r\n \r\n </div>\r\n </div>`;\r\n }\r\n\r\n return (\r\n <>\r\n {\r\n !summaryCalculator.isDataLoaded() ? getLoading(loading, t) : null\r\n }\r\n <div className=\"mz-connectivity-page mz-top-nav-spacing grid-no-gutter-sm\" ref={listRef}>\r\n <Nav nav={nav} />\r\n <h5 className=\"mz-connectivity-page__title\">{t(\"connectivity:title\")}</h5>\r\n <div className=\"mz-full-width mz-connectivity-page__content mz-container-flex\">\r\n \r\n <div className=\"mz-connectivity-page__content-left\">\r\n {connectivityPackage &&\r\n <div className=\"mz-connectivity-page__content-left-container\">\r\n <div className=\"mz-connectivity-page__content-left-container__content-left\">\r\n <img src={getConnectivityImagePath()} alt=\"img\" />\r\n </div>\r\n <div className=\"mz-connectivity-page__content-left-container__content-right\">\r\n {ReactHtmlParser(connectivityPackage.description)}\r\n\r\n <a href=\"\" className=\"mz-link\" onClick={ (e)=>{\r\n e.preventDefault();\r\n setConnectModalOpen(true);\r\n //mzCarousel.init();\r\n if(!carouselInit){\r\n \r\n // window.setTimeout(()=>{\r\n setCarouselInit(true)\r\n mzCarousel.init();\r\n \r\n //}, 1000)\r\n \r\n }\r\n }}>{connectivityPackage.carousel_cta_text}</a>\r\n </div>\r\n </div>}\r\n </div>\r\n <div className=\"mz-connectivity-page__content-right right-container\">\r\n {connectivityPackage && Object.entries(connectivityPackage.subscription).map(([key, value], index) => \r\n <PackageCard Package={value} \r\n PopContent={t('best')}\r\n ButStyle='mz-btn mz-btn--primary mz-btn--red package-card__button'\r\n ButContent={t('general','add')}\r\n Selected={summaryCalculator.SelectedConnectedVehicleIndex === index} \r\n ButSelectedContent={t('general','remove')}\r\n HasCollapse={false}\r\n HandleSelectedPackage={handleSelectedConnectedVehiclePackage} \r\n HandleRemovePackage={handleRemoveConnectedVehiclelPackage} \r\n Index={index} \r\n key={key} \r\n showFinancePrice={showFinancePrice} \r\n isUniversal={false} \r\n displayPriceCalculation={false} \r\n displayConnectedServicePriceCalculation={true}></PackageCard>)}\r\n </div>\r\n </div>\r\n \r\n\r\n <Pricing builtLabel={t(\"general:price_as_built\")} builtPrice=\"$\" loanLabel={t(\"general:loan_label\")} loanPrice=\"$\" saveLabel={t(\"general:save_build\")}\r\n leaseLabel={t(\"general:show_lease_price\")} financeLabel={t(\"general:show_finance_price\")} buttonLabel={t(\"general:next_accessories\")} summaryCalculator={summaryCalculator}\r\n HandleNextClick={nextStep} setLegalModalOpen={setLegalModalOpen} HandleShowFinanceClick={handleShowFinanceClick} setPreorderModalOpen={setPreorderModalOpen} />\r\n <Modal modalContent={legalContent} isOpen={legalModalOpen} handleClose={setLegalModalOpen} modalId='legalModal' />\r\n <Modal modalContent={setCarousel()} isOpen={connectModalOpen} handleClose={setConnectModalOpen} modalId='connectModal' />\r\n <PreOrderModal isOpen={preorderOpen} handleClose={setPreorderModalOpen}></PreOrderModal> \r\n \r\n </div>\r\n </>\r\n )\r\n}\r\n\r\nexport default Connectivity;","import React, { useState, useEffect, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\n//import SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nimport { formatPrice, convertNum, setCursorWaiting } from '../../../utils'\r\n\r\nexport const CollapseFinance = ({dropdownCallback, selectCallback, setSelectedFinanceOption, key, ...props }) => {\r\n const { t, i18n } = useTranslation(['payments', 'general']);\r\n\r\n const summaryCalculator = window.summaryCalculator;\r\n\tconst gtmHelper = new GTMHelper();\r\n\r\n const [collapseOpenContent, setCollapseOpenContent] = useState('');\r\n\r\n const [isCollapsed, setIsCollapsed] = useState(false);\r\n const [didInit, setInit] = React.useState(false);\r\n const collapseRef = useRef();\r\n\r\n const [update, setForceUpdate] = useState('');\r\n \r\n function termCanBeDisplayed(term) {\r\n const allowedTerm = [12,24,36,48,60,72,84];\r\n \r\n return allowedTerm.includes(term);\r\n }\r\n\r\n function hasRatePercentageDiscount(financeElement) {\r\n return (Number.parseFloat(financeElement.aprRate) !== Number.parseFloat(financeElement.aprRateDiscounted));\r\n }\r\n\r\n function getFinanceOptions(financialInfo) {\r\n if (summaryCalculator.getResponsesHasError() === true)\r\n return (\r\n <>\r\n <div className='mz-finance-options__financial-element-error-msg'>{t(\"general:contact_a_dealer\")}</div>\r\n </>\r\n ) \r\n else\r\n return (\r\n <ul className=\"mz-finance-options__financial-element-list mz-collapse__box--element-list\">\r\n {summaryCalculator.LoyaltyChecked ?\r\n <li className=\"loyalty-title\">{t(\"payments:mazda_loyalty_collapse_title\")}</li>:''}\r\n <li className=\"mz-finance-options__financial-element mz-collapse__box--element headers\"><span>{t(\"months\")}</span><span>{t(\"rate\")}</span><span>{t(\"weekly_payment\")}</span><span>{t(\"bi_weekly_payment\")}</span><span>{t(\"monthly_payment\")}</span></li>\r\n { financialInfo.calculatedFinance.financeValues.map((financeElement, index) => {\r\n if (termCanBeDisplayed(financeElement.term)){\r\n return (\r\n <>\r\n <li className=\"mz-finance-options__financial-element mz-collapse__box--element\" key={index}>\r\n <span><input type=\"checkbox\" name=\"financeTermOptions\" value={index} onChange={itemClick} data-term-selected={financeElement.term} checked={parseInt(summaryCalculator.FinanceTermIndex) === index ? true : false} id={financeElement.term + '__months'} /><label htmlFor={financeElement.term + '__months'}>{financeElement.term}</label></span>\r\n {summaryCalculator.LoyaltyChecked && hasRatePercentageDiscount(financeElement) ? \r\n <span className=\"rate text--red\"><span className='rate-strike'>{financeElement.aprRate ? convertNum(financeElement.aprRate, 2) : \"\"}% </span> {convertNum(financeElement.aprRateDiscounted, 2)}%</span>:\r\n <span className=\"rate\">{financeElement.aprRate ? convertNum(financeElement.aprRate, 2) : \"\"}%</span>\r\n }\r\n <span className=\"weekly\"><span>{formatPrice(financeElement[summaryCalculator.IncludeTaxes ? 'weeklyWithTaxes' : 'weekly'])}</span></span>\r\n <span className=\"biWeekly\"><span>{formatPrice(financeElement[summaryCalculator.IncludeTaxes ? 'biWeeklyWithTaxes' : 'biWeekly'])}</span></span>\r\n <span className=\"monthly\"><span>{formatPrice(financeElement[summaryCalculator.IncludeTaxes ? 'monthlyWithTaxes' : 'monthly'])}</span></span>\r\n </li>\r\n {summaryCalculator.LoyaltyChecked && !hasRatePercentageDiscount(financeElement) ? \r\n <li className=\"text--center text--red\" style={{'font-size': '0.6rem', 'margin-top': '-16px'}}>\r\n <span className=\"loyalty\">{t(\"payments:item_contains_discount\", { discount: formatPrice(summaryCalculator.Incentives.loyalty.cash_value) })}</span>\r\n </li>: null}\r\n </> \r\n )\r\n }\r\n })}\r\n </ul>\r\n )\r\n }\r\n \r\n async function handleClick(e) {\r\n const financialInfo = await summaryCalculator.RecalculateFinancialInfo();\r\n setCollapseOpenContent(getFinanceOptions(financialInfo));\r\n\r\n \r\n setIsCollapsed(!isCollapsed);\r\n\t\tgtmHelper.setGTM({'action':'Collapse', 'type': 'Finance Term', 'value': isCollapsed}, true , false);\r\n }\r\n\r\n function itemClick(e) {\r\n summaryCalculator.FinanceTermIndex = e.target.value;\r\n summaryCalculator.FinanceTerm = parseInt(e.target.getAttribute(\"data-term-selected\"));\r\n setSelectedFinanceOption(e.target.value);\r\n\r\n selectCallback();\r\n\r\n setCollapseOpenContent(getFinanceOptions(summaryCalculator.FinancialInfo));\r\n\r\n gtmHelper.setGTM({'action':'Checkbox', 'type': 'Finance Term', 'value': e.target.dataset['termSelected']}, true , false); \r\n }\r\n\r\n function getDisplayedRate() {\r\n const financeElement = summaryCalculator.FinancialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex];\r\n\r\n if (summaryCalculator.getResponsesHasError() === true)\r\n return convertNum(0,2); \r\n else {\r\n if (hasRatePercentageDiscount(financeElement))\r\n return convertNum(financeElement.aprRateDiscounted,2);\r\n else\r\n return convertNum(financeElement.aprRate,2);\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n (async () => {\r\n setCursorWaiting(true);\r\n\r\n const financialInfo = await summaryCalculator.RecalculateFinancialInfo();\r\n\r\n setCollapseOpenContent(getFinanceOptions(financialInfo));\r\n \r\n setInit(false);\r\n //setIsCollapsed(false);\r\n const collapse = collapseRef.current;\r\n collapse.style.height = null;\r\n //collapse.style.removeProperty('height');\r\n \r\n setForceUpdate(Math.random());\r\n //window.mzAnimator.animateHeight(collapse, 'CollapseFinanceRate', true);\r\n setCursorWaiting(false);\r\n })();\r\n }, [summaryCalculator._tradeInValue, summaryCalculator._downPaymentValue, summaryCalculator.LoyaltyChecked, summaryCalculator.GraduateChecked, summaryCalculator.MilitaryChecked, summaryCalculator.FirstTimeOwnerChecked, summaryCalculator.IncludeFees, summaryCalculator.IncludeTaxes, summaryCalculator.IncludeRebates]);\r\n\r\n useEffect(() => {\r\n (async () => {\r\n const collapse = collapseRef.current;\r\n\r\n if(typeof window.mzAnimator === 'object' && !didInit){\r\n window.mzAnimator.animateHeight(collapse, 'CollapseFinanceRate', 'init');\r\n setInit(true);\r\n window.mzAnimator.animateHeight(collapse, 'CollapseFinanceRate', isCollapsed);\r\n }\r\n else {\r\n window.mzAnimator.animateHeight(collapse, 'CollapseFinanceRate', isCollapsed);\r\n }\r\n \r\n collapse.className = 'mz-collapse__box visible ' + (!isCollapsed ? 'mz-collapse__box--finance-collapsed' : 'mz-collapse__box--finance-expanded');\r\n\r\n if(isCollapsed === false)\r\n dropdownCallback();\r\n })();\r\n }, [isCollapsed, didInit]);\r\n\r\n /*useEffect(() => {\r\n setCollapseOpenContent(getFinanceOptions());\r\n console.log('reupdating finance collapse');\r\n }, [update]);*/\r\n\r\n return (\r\n <div className=\"mz-collapse mz-collapse--finance\" key={key}>\r\n <button\r\n onClick={handleClick}\r\n className=\"mz-collapse__button\"\r\n >\r\n <div className=\"mz-collapse__cartext-container\">\r\n <p className=\"mz-collapse__text\">{t(\"term\")}: {summaryCalculator.FinancialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex].term} {t(\"payments:months_lowercase\")} {getDisplayedRate()}%</p>\r\n </div>\r\n <i className={ isCollapsed ? \"mz-svg mz-svg-chevron_small open mz-svg--grey\" : \"mz-svg mz-svg-chevron_small mz-svg--grey\"}></i>\r\n </button>\r\n <div className=\"mz-collapse__box\" ref={collapseRef}>{collapseOpenContent}</div>\r\n </div>\r\n )\r\n}\r\n\r\nCollapseFinance.propTypes = {\r\n}\r\n\r\nCollapseFinance.defaultProps = {\r\n}\r\n\r\nexport default CollapseFinance;","import React, { useState, useEffect, useRef } from 'react';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\n\r\nimport { formatPrice, getIncentiveDisplayName, getMazdaFeesAndLeviesDetailTitle, convertNum, setCursorWaiting, setCheckChanged, getProvince, getLang} from '../../../utils'\r\n\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\nimport OcaService from '../../../Services/OcaService';\r\n\r\nimport { Tooltip } from '../../1_Atoms/Tooltip/Tooltip';\r\nimport { Button } from '../../1_Atoms/Button/Button';\r\nimport { OcaModal } from '../../3_Organisms/Modal/OcaModal';\r\nimport { PreOrderModal } from '../../3_Organisms/Modal/PreOrderModal';\r\nimport CollapseFinance from '../Collapse/CollapseFinance';\r\nimport { openModal } from '../../../Helpers/helpers';\r\n\r\nexport const FinanceOptions = ({ setSelectedFinanceOption, includeFees, includeTaxes, includeRebates, setPreorderModalOpen, ...props }) => {\r\n const navigate = useNavigate();\r\n const { year, carline, trim, model, packageCode } = useParams();\r\n const summaryCalculator = window.summaryCalculator;\r\n\r\n const [feesAndLeviesToDisplay, setFeesAndLeviesToDisplay] = useState(summaryCalculator.FinancialInfo.calculatedCash.feesAndLevies.detail.filter(item => item.title !== 'PDE'));\r\n\r\n const [didInit, setInit] = useState(false);\r\n const [showDetailedPricing, toggleShowDetailedPricing] = useState(false);\r\n const financeDetailRef1 = useRef();\r\n const financeDetailRef2 = useRef();\r\n const financeDetailRef3 = useRef();\r\n\r\n const { t, i18n } = useTranslation(['payments', 'general', 'summary']);\r\n const provinceCode = getProvince().toUpperCase();\r\n const [financialInfo, setFinancialInfo] = useState(summaryCalculator.FinancialInfo);\r\n const [update, setForceUpdate] = useState('');\r\n\r\n const gtmHelper = new GTMHelper();\r\n const ocaService = new OcaService();\r\n\r\n const [ocaOpen, setOcaModalOpen] = useState(false);\r\n const [financeType, setFinanceType] = useState(false);\r\n\r\n //Fixed Number provided by API\r\n const [currentIncentives, setCurrentIncentives] = useState(null);\r\n\r\n const [reserveOpen, setReserveModalOpen] = React.useState(false);\r\n\r\n useEffect(() =>{\r\n const collapse1 = financeDetailRef1.current;\r\n const collapse2 = financeDetailRef2.current;\r\n const collapse3 = financeDetailRef3.current;\r\n \r\n if(typeof window.mzAnimator === 'object' && !didInit && showDetailedPricing){\r\n window.mzAnimator.animateHeight(collapse1, 'CollapseDetailedFinance1', 'init')\r\n window.mzAnimator.animateHeight(collapse2, 'CollapseDetailedFinance2', 'init')\r\n window.mzAnimator.animateHeight(collapse3, 'CollapseDetailedFinance3', 'init')\r\n setInit(true);\r\n toggleCollapse(false);\r\n }else{\r\n toggleCollapse(true);\r\n }\r\n },[showDetailedPricing, didInit]);\r\n\r\n useEffect(() =>{\r\n (async function() {\r\n setInit(false);\r\n \r\n setFinancialInfo(await summaryCalculator.RecalculateFinancialInfo());\r\n\r\n setForceUpdate(Math.random());\r\n })();\r\n },[summaryCalculator._tradeInValue, summaryCalculator._downPaymentValue, summaryCalculator.LoyaltyChecked, summaryCalculator.GraduateChecked, summaryCalculator.MilitaryChecked, summaryCalculator.FirstTimeOwnerChecked, summaryCalculator.IncludeFees, summaryCalculator.IncludeTaxes, summaryCalculator.AnnualMileage, summaryCalculator.IncludeRebates]); \r\n\r\n useEffect(() => {\r\n if(summaryCalculator.FinancialInfo.incentive_programs){\r\n setCurrentIncentives(summaryCalculator.FinancialInfo.incentive_programs?.find(element => element.type === \"incentive\"));\r\n }\r\n\r\n console.log('refreshing the finance options section');\r\n //console.log(summaryCalculator.FinancialInfo);\r\n }, [update]);\r\n\r\n\r\n function toggleCollapse(fromClick) {\r\n const collapse1 = financeDetailRef1.current;\r\n const collapse2 = financeDetailRef2.current;\r\n const collapse3 = financeDetailRef3.current;\r\n \r\n if(showDetailedPricing){\r\n window.mzAnimator.animateHeight(collapse1, 'CollapseDetailedFinance1', true)\r\n window.mzAnimator.animateHeight(collapse2, 'CollapseDetailedFinance2', true)\r\n window.mzAnimator.animateHeight(collapse3, 'CollapseDetailedFinance3', true)\r\n }else{\r\n window.mzAnimator.animateHeight(collapse1, 'CollapseDetailedFinance1', false)\r\n window.mzAnimator.animateHeight(collapse2, 'CollapseDetailedFinance2', false)\r\n window.mzAnimator.animateHeight(collapse3, 'CollapseDetailedFinance3', false)\r\n }\r\n if(fromClick)\r\n gtmHelper.setGTM({'action':'Collapse', 'type': 'Finance ', 'value': showDetailedPricing}, true , false);\r\n \r\n }\r\n\r\n function financeClick(financeType){\r\n document.querySelector('body').classList.add('disabled');\r\n\t\tsetOcaModalOpen(true);\r\n setFinanceType(financeType);\r\n\r\n const price = summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceWithFeesWithRebatesTaxed;\r\n gtmHelper.setGTM({'action':`OCA - Finance Payment`,'year': year,'model': ReactHtmlParser(carline), 'trim': trim, 'price' : Math.round(price)}, true, false);\r\n }\r\n\r\n const handleContactDealerLinkClick = (e) => {\r\n e.preventDefault();\r\n\r\n const contactRoute = `/${year}/${carline}/${trim}/${model}/${packageCode}/summary?contactDealer`;\r\n navigate(contactRoute);\r\n }\r\n\r\n includeFees = summaryCalculator.IncludeFees;\r\n includeTaxes = summaryCalculator.IncludeTaxes;\r\n includeRebates = summaryCalculator.IncludeRebates;\r\n\r\n\tfunction getRebatesDetails() {\r\n\t\treturn financialInfo.calculatedCash.evRebates.details.map((rebate, index) => `<li key=\"${index}\" class=\"finance-list__item rebate\">\r\n <p class=\"desc text--green\">${rebate.title==='federal'? t('fed_rebate'):t('prov_rebate') + ' ('+getProvince()+')'}</p><span class=\"price text--green\">${rebate.finance ? '-' : ''}${formatPrice(rebate.finance, true)}</span>\r\n </li>`).join(\"\");\r\n }\r\n\r\n function getOptionList() {\r\n let optionList = '';\r\n \r\n const options = summaryCalculator.FinancialInfo ?.calculatedFinance ?.options;\r\n\r\n if(options.exteriorColour.price >0){\r\n optionList += ` <li class=\"finance-list__item\">\r\n <p class=\"desc\">${t('exterior')} ${options.exteriorColour.description}</p>\r\n <span class=\"price\">${formatPrice(options.exteriorColour.price, true)}</span>\r\n </li>`\r\n }\r\n if(options ?.interiorColour.price >0){\r\n optionList += ` <li class=\"finance-list__item\">\r\n <p class=\"desc\">${t('interior')} ${options.interiorColour.description}</p>\r\n <span class=\"price\">${formatPrice(options.interiorColour.price, true)}</span>\r\n </li>`\r\n }\r\n if(options ?.model_option_package ?.financial ?.msrp >0){\r\n optionList += ` <li class=\"finance-list__item\">\r\n <p class=\"desc\">${t('package')} ${options.model_option_package.name}</p>\r\n <span class=\"price\">${formatPrice(options.model_option_package.financial.msrp, true)}</span>\r\n </li>`\r\n }\r\n\r\n const selectedWarrantyPackage = JSON.parse(sessionStorage.getItem('selectedWarrantyPackage'));\r\n if(selectedWarrantyPackage != null && selectedWarrantyPackage.name != undefined ){\r\n const warrantyPrice = (JSON.parse(sessionStorage.getItem('selectedWarrantyPackage')).financial.msrp);\r\n optionList += ` <li class=\"finance-list__item\">\r\n <p class=\"desc\">${t(\"warranties\")} ${selectedWarrantyPackage.name}</p>\r\n <span class=\"price\">${formatPrice(warrantyPrice, true)}</span>\r\n </li>`\r\n } \r\n \r\n const selectedConnectedVehiclePackage = JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage'));\r\n if(selectedConnectedVehiclePackage != null && selectedConnectedVehiclePackage.name != undefined){\r\n const connectedPrice = (JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage')).financial.msrp);\r\n optionList += ` <li class=\"finance-list__item\">\r\n <p class=\"desc\">${t(\"connected\")} <span style=\"text-transform:lowercase\">${selectedConnectedVehiclePackage.name}</span></p>\r\n <span class=\"price\">${formatPrice(connectedPrice, true)}</span>\r\n </li>`\r\n }\r\n\r\n if(options.wheels.price >0){\r\n const options = summaryCalculator.FinancialInfo ?.calculatedFinance ?.options;\r\n \r\n optionList += ` <li class=\"finance-list__item\">\r\n <p class=\"desc\">${`4x ${options.wheels.title}`}</p>\r\n <span class=\"price\">${formatPrice(options.wheels.base_msrp, true)}</span>\r\n </li>\r\n <li class=\"finance-list__item\">\r\n <p class=\"desc\">${`4x ${t(\"payments:tpms\")}`}</p>\r\n <span class=\"price\">${formatPrice(options.wheels.tpms, true)}</span>\r\n </li>\r\n <li class=\"finance-list__item\">\r\n <p class=\"desc\">${t(\"payments:installation\")}</p>\r\n <span class=\"price\">${formatPrice(options.wheels.install_cost, true)}</span>\r\n </li>`\r\n }\r\n\r\n return optionList;\r\n }\r\n \r\n function getAccessoriesDetails() {\r\n let accessories = sessionStorage.getItem(Constants.SelectedAccessories);\r\n accessories = JSON.parse(accessories); \r\n \r\n const accList = accessories.map((accessory, index) => {\r\n return(\r\n <> \r\n <li className=\"finance-list__item financeOptions_accessories\">\r\n <p className=\"desc\">{accessory.name}</p>\r\n <span className=\"price\">{formatPrice(accessory.base_msrp, true)}</span>\r\n </li>\r\n <li className=\"finance-list__item financeOptions_accessories\">\r\n <p className=\"desc\">{accessory.name} - Installation</p>\r\n <span className=\"price\">{formatPrice(accessory.install_cost, true)}</span>\r\n </li>\r\n </>\r\n )\r\n });\r\n return accList;\r\n }\r\n\r\n const financeDropdown = async () => {\r\n if(didInit){\r\n const collapse1 = financeDetailRef1.current;\r\n const collapse2 = financeDetailRef2.current;\r\n const collapse3 = financeDetailRef3.current;\r\n\r\n window.mzAnimator.animateHeight(collapse1, 'CollapseDetailedFinance1', 'init')\r\n window.mzAnimator.animateHeight(collapse2, 'CollapseDetailedFinance2', 'init')\r\n window.mzAnimator.animateHeight(collapse3, 'CollapseDetailedFinance3', 'init')\r\n setInit(true);\r\n toggleCollapse(false);\r\n }\r\n }\r\n \r\n const financeTermSelect = async () => {\r\n setFinancialInfo(await summaryCalculator.RecalculateFinancialInfo());\r\n }\r\n\r\n async function handleReserveYoursClick() {\r\n const isRetailerMode = await summaryCalculator.isRetailerMode();\r\n summaryCalculator.CurrentPurchaseMethod = 'Finance';\r\n if (isRetailerMode) {\r\n setReserveModalOpen(true);\r\n } else {\r\n openGetLocal();\r\n }\r\n }\r\n\r\n function handlePreOrderClick() {\r\n document.querySelector('body').classList.add('disabled');\r\n setPreorderModalOpen(true)\r\n }\r\n\r\n function openGetLocal(){\r\n const lang = getLang();\r\n gtmHelper.setGTM({'action':'Open Modal','modal': 'Contact Dealer'}, true, false);\r\n\r\n const targetModal = document.getElementById('mz-react-send-build-to-dealer-modal');\r\n if (targetModal && summaryCalculator) {\r\n if (summaryCalculator.SelectedColourExteriorIndex !== 'null' && summaryCalculator.Colours !== null) {\r\n const heading = targetModal.querySelector('.mz-send-build-to-dealer__vehicle-name');\r\n if (heading) {\r\n heading.textContent = lang === 'en' ? summaryCalculator._selectedModelYear.year.title + ' ' + ReactHtmlParser(summaryCalculator._selectedModelYear.carline.title) : ReactHtmlParser(summaryCalculator._selectedModelYear.carline.title) + ' ' + summaryCalculator._selectedModelYear.year.title;\r\n }\r\n }\r\n openModal('mz-react-send-build-to-dealer-modal');\r\n }\r\n }\r\n const hasResponseError = summaryCalculator.getResponsesHasError();\r\n\r\n function getWeeklyPrice() {\r\n if (hasResponseError)\r\n return formatPrice(0);\r\n else\r\n return formatPrice(financialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex][summaryCalculator.IncludeTaxes ? 'weeklyWithTaxes' : 'weekly']);\r\n }\r\n\r\n function getBiWeeklyPrice() {\r\n if (hasResponseError)\r\n return formatPrice(0);\r\n else\r\n return formatPrice(financialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex][summaryCalculator.IncludeTaxes ? 'biWeeklyWithTaxes' : 'biWeekly'])\r\n }\r\n\r\n function getMonthlyPrice() {\r\n if (hasResponseError)\r\n return formatPrice(0);\r\n else\r\n return formatPrice(financialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex][[summaryCalculator.IncludeTaxes ? 'monthlyWithTaxes' : 'monthly']])\r\n }\r\n\r\n function getDisplayedRate() {\r\n if (hasResponseError)\r\n return '-';\r\n\r\n const financeElement = summaryCalculator.FinancialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex];\r\n if (Number.parseFloat(financeElement.aprRate) !== Number.parseFloat(financeElement.aprRateDiscounted))\r\n return convertNum(financeElement.aprRateDiscounted,2) + '%';\r\n else\r\n return convertNum(financeElement.aprRate,2) + '%';\r\n }\r\n\r\n function getInformationalRate() {\r\n if (hasResponseError)\r\n return '-';\r\n else\r\n return convertNum(summaryCalculator.getLoanInformationalAprRate(),2) + '%';\r\n }\r\n \r\n function getCostOfBorrowing() {\r\n const costOfBorrowing = includeTaxes ? summaryCalculator.FinancialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex].costOfBorrowingWithTaxes : summaryCalculator.FinancialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex].costOfBorrowing\r\n\r\n return hasResponseError ? '-' :formatPrice(costOfBorrowing, true);\r\n }\r\n\r\n return (\r\n <div className=\"mz-finance-options finance\">\r\n <h4>{t(\"finance_options\")}</h4>\r\n {!summaryCalculator.getResponsesHasError() ?\r\n <>\r\n <div className=\"mz-finance__count\">\r\n <div className=\"mz-finance__count-item \">\r\n <p>{t(\"weekly\")}</p>\r\n <span>{getWeeklyPrice()}</span> \r\n </div>\r\n <div className=\"mz-finance__count-item \">\r\n <p>{t(\"bi_weekly\")}</p>\r\n <span>{getBiWeeklyPrice()}</span> \r\n </div>\r\n <div className=\"mz-finance__count-item \">\r\n <p>{t(\"monthly\")}</p>\r\n <span>{getMonthlyPrice()}</span> \r\n </div>\r\n </div>\r\n <div className=\"mz-finance__terms\">\r\n <CollapseFinance dropdownCallback={financeDropdown} selectCallback={financeTermSelect} setSelectedFinanceOption={setSelectedFinanceOption} />\r\n </div>\r\n </> \r\n :\r\n <>\r\n <p className=\"text--center\">\r\n {ReactHtmlParser(t(\"general:generalErrorMessage\"))}\r\n </p>\r\n </>}\r\n <div className=\"hr light\"></div>\r\n <div className={`mz-finance__numbs ${!showDetailedPricing ? 'collapsed' : \r\n ''}`}>\r\n <ul className=\"finance-list hidden\" ref={financeDetailRef1}>\r\n <li className=\"finance-list__item\">\r\n <p className=\"desc\">{t(\"msrp\")}</p>\r\n <span className=\"price\">{`${formatPrice(summaryCalculator.SelectedModel.financial.msrp, true)}`}</span>\r\n </li>\r\n <li className=\"finance-list__item\">\r\n <p className=\"desc\">{t(\"trade_in\")}<sup>1</sup></p>\r\n <span className=\"price discount\">{`${summaryCalculator.FinancialInfo.tradeInValue > 0 ? '-' : ''}${formatPrice(summaryCalculator.FinancialInfo.tradeInValue, true)}`}</span>\r\n </li>\r\n {currentIncentives && currentIncentives.value >0 ?\r\n <li className=\"finance-list__item\">\r\n <p className=\"desc\">{t(\"current_incentive\")} <Tooltip TooltipName=\"incentives\" incentives={currentIncentives.value}/></p>\r\n <span className=\"price discount\">{currentIncentives?'-':''}{formatPrice(currentIncentives.value, true)}</span>\r\n </li>:''}\r\n {ReactHtmlParser(getOptionList())}\r\n {summaryCalculator.FinancialInfo.calculatedLease?.accessories.total > 0 ?\r\n getAccessoriesDetails()\r\n : '' }\r\n <li className=\"finance-list__item\">\r\n <p className=\"desc\">{t(\"freight\")}</p>\r\n <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.freight, true)}`}</span>\r\n </li>\r\n <li className=\"finance-list__item\">\r\n <p className=\"desc\">{t(\"general:pde\")}</p>\r\n <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.pde, true)}`}</span>\r\n </li>\r\n {includeFees ? <li className=\"finance-list__item\">\r\n <p className=\"desc\">\r\n {getMazdaFeesAndLeviesDetailTitle(\"Administration Fee\", t)}\r\n <sup>9</sup>\r\n </p>\r\n <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.adminServiceFees, true)}`}</span>\r\n </li>:''} \r\n {includeFees ? feesAndLeviesToDisplay.map((fee, index) => {\r\n return <li className=\"finance-list__item\" key={index}>\r\n <p className=\"desc\">{ReactHtmlParser(getMazdaFeesAndLeviesDetailTitle(fee.title,t))}\r\n {fee.sup ? ReactHtmlParser(`<sup>${fee.sup}</sup>`) : ''}\r\n </p>\r\n <span className=\"price\">{`${formatPrice(fee.price, true)}`}</span>\r\n </li>\r\n }):''}\r\n {includeRebates ? ReactHtmlParser(getRebatesDetails()) : \"\"}\r\n </ul>\r\n <ul className=\"finance-list hidden\" ref={financeDetailRef2}>\r\n <li className=\"finance-list__item\"><p className=\"desc\">{provinceCode === \"QC\" ? \"RDPRM\" : \"PPSA\"}<sup>7</sup></p>\r\n <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex].ppsa, true)}`}</span>\r\n </li>\r\n <li className=\"finance-list__item\">\r\n <p className=\"desc\">{t(\"sub_total\")}</p>\r\n <span className=\"price\">\r\n { includeFees && includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedFinance.subtotalWithFeesWithRebates, true)}`}</span> : null}\r\n { includeFees && !includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedFinance.subtotalWithFees, true)}`}</span> : null}\r\n {!includeFees && includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedFinance.subtotalWithRebates, true)}`}</span> : null}\r\n {!includeFees && !includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedFinance.subtotal, true)}`}</span> : null}\r\n </span>\r\n </li>\r\n {includeTaxes?<li className=\"finance-list__item\">\r\n <p className=\"desc\">{t(\"taxes\")}</p>\r\n <span className=\"price\">\r\n <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedFinance.subtotalTaxes, true)}`}</span> \r\n </span>\r\n </li>:''}\r\n\r\n <li className=\"finance-list__item\">\r\n <p className=\"desc\">{t(\"down_payment\")}<sup>2</sup></p>\r\n <span className=\"price discount\">{`${summaryCalculator.FinancialInfo.downPaymentValue > 0 ? '-' : ''}${formatPrice(summaryCalculator.FinancialInfo.downPaymentValue, true)}`}</span>\r\n </li>\r\n\r\n {summaryCalculator.FinancialInfo.calculatedFinance.rewards.map((el, index) => {\r\n return <li className=\"finance-list__item\" key={index}>\r\n <p className=\"desc\">{getIncentiveDisplayName(el.type)}</p>\r\n <span className=\"price discount\">{`-${el.cash_value?formatPrice(el.cash_value, true):formatPrice(el.value, true)}`}</span>\r\n </li>\r\n })}\r\n\r\n </ul>\r\n <ul className={`finance-list ${showDetailedPricing ? 'finance-list__border' : ''}`}>\r\n <li className=\"finance-list__item\">\r\n <p className=\"desc\">{t(\"balance_to_finance\")}</p>\r\n {includeFees && includeTaxes && includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceWithFeesWithRebatesTaxed, true)}`}</span> : null}\r\n {!includeFees && includeTaxes && includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceWithRebatesTaxed, true)}`}</span> : null}\r\n {includeFees && !includeTaxes && includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceWithFeesWithRebates, true)}`}</span> : null}\r\n {includeFees && includeTaxes && !includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceWithFeesTaxed, true)}`}</span> : null}\r\n {includeFees && !includeTaxes && !includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceWithFees, true)}`}</span> : null}\r\n {!includeFees && includeTaxes && !includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceTaxed, true)}`}</span> : null}\r\n {!includeFees && !includeTaxes && includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceWithRebates, true)}`}</span> : null}\r\n {!includeFees && !includeTaxes && !includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinance, true)}`}</span> : null}\r\n </li>\r\n <div ref={financeDetailRef3}>\r\n <li className=\"finance-list__item\">\r\n <p className=\"desc\">{t(\"period_of_loan\")}</p>\r\n <span className=\"price\">{`${summaryCalculator.FinancialInfo.calculatedFinance.financeValues[summaryCalculator.FinanceTermIndex].term}`} {t(\"months\")}</span>\r\n </li>\r\n <li className=\"finance-list__item\">\r\n <p className=\"desc\">{t(\"rate\")}</p>\r\n <span className=\"price\">{getDisplayedRate()}</span>\r\n </li>\r\n <li className=\"finance-list__item\">\r\n <p className=\"desc\">{t(\"informational_apr\")}</p>\r\n <span className=\"price\">{getInformationalRate()}</span>\r\n </li>\r\n </div>\r\n </ul>\r\n <ul className={`finance-list ${showDetailedPricing ? 'finance-list__border' : ''}`}>\r\n <li className=\"finance-list__item\">\r\n <p className=\"desc\">{t(\"cost_of_borrowing\")}</p>\r\n <span className=\"price\">{getCostOfBorrowing()}</span>\r\n </li>\r\n <li className=\"finance-list__item no-spacing\">\r\n <a className=\"mz-link label text--grey\" href=\"/\" \r\n onClick={(e) =>{\r\n e.preventDefault();\r\n toggleShowDetailedPricing(!showDetailedPricing);\r\n \r\n }}>{t(\"show_detailed_pricing\")}</a>\r\n <a className=\"no_line label\" href=\"/\" \r\n onClick={(e) =>{\r\n e.preventDefault();\r\n toggleShowDetailedPricing(!showDetailedPricing);\r\n \r\n }}><i className={`mz-svg mz-svg-chevron_small mz-svg--red ${showDetailedPricing ? 'mz-svg--rotate270' : 'mz-svg--rotate90'}`}></i></a>\r\n </li>\r\n </ul>\r\n <div className=\"mz-financial--cta hidden\">\r\n {window.allow_oca ?\r\n <Button primary={true} label={ReactHtmlParser(String(t(\"summary:btn_apply_for_financing\")))} iconBefore={false} onClick={()=>financeClick('loan')}/>\r\n :\r\n summaryCalculator.isSelectionPreOrder() ?\r\n <Button primary={true} label={String(t(\"summary:btn_pre_order\"))} iconBefore={false} onClick={handlePreOrderClick}/>\r\n :\r\n <Button primary={true} label={String(t(\"summary:btn_reserve_yours\"))} iconBefore={false} onClick={handleReserveYoursClick}/>}\r\n </div>\r\n <div className=\"finance_disclaimer\">\r\n {currentIncentives && currentIncentives.value != 0 ?\r\n i18n.language == \"en\" ?\r\n <>\r\n <p className=\"caption\">Payments shown include a <span className=\"text--red\">{formatPrice(currentIncentives.value)}</span> Current Incentive.<br/><a className=\"mz-link--black\" onClick={handleContactDealerLinkClick}>Contact your local Mazda retailer</a> for details.</p>\r\n <br /> \r\n </>\r\n :\r\n <>\r\n <p className=\"caption\">Les paiements indiqués incluent l'offre incitatives actuelle de <span className=\"text--red\">{formatPrice(currentIncentives.value)}</span>. <a className=\"mz-link--black\" onClick={handleContactDealerLinkClick}>Communiquez avec votre concessionnaire Mazda</a> pour les détails.</p>\r\n <br />\r\n </>\r\n :\r\n ''\r\n }\r\n {i18n.language == \"en\" ?\r\n <p className=\"caption\">Informational APR {getInformationalRate()}. The rate selected is a special promotional rate. Alternatively, you can take advantage of cash purchase incentives that cannot be combined with the special promotional rate and your Informational APR would be as outlined above.</p>\r\n :\r\n <p className=\"caption\">TAP informatif {getInformationalRate()}. Le taux sélectionné est un taux promotionnel spécial. Si vous profitez plutôt des offres à l'achat au comptant qui ne peuvent être combinées avec le taux promotionnel spécial, votre TAP informatif serait celui indiqué ci-dessus.</p>\r\n }\r\n </div>\r\n </div>\r\n <OcaModal isOpen={ocaOpen} financeType={financeType} handleClose={setOcaModalOpen}></OcaModal> \r\n </div>\r\n )\r\n}\r\n\r\nFinanceOptions.propTypes = {\r\n\r\n}\r\n\r\nFinanceOptions.defaultProps = {\r\n\r\n}","import React, { useState, useEffect, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\n//import SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nimport { formatPrice, convertNum, setCursorWaiting } from '../../../utils'\r\n\r\nexport const CollapseLease = ({dropdownCallback, selectCallback, setSelectedLeaseOption, ...props }) => {\r\n const { t, i18n } = useTranslation(['payments', 'general']);\r\n\r\n const summaryCalculator = window.summaryCalculator;\r\n\tconst gtmHelper = new GTMHelper();\r\n\r\n const [collapseOpenContent, setCollapseOpenContent] = useState('');\r\n\r\n const [isCollapsed, setIsCollapsed] = useState(false);\r\n const [didInit, setInit] = React.useState(false);\r\n const collapseRef = useRef();\r\n\r\n const [update, setForceUpdate] = useState('');\r\n\r\n function leaseTermCanBeDisplayed(term) {\r\n const allowedTerm = [36,39,42,45,48,51,54,57,60];\r\n\r\n return allowedTerm.includes(term);\r\n }\r\n\r\n function hasRatePercentageDiscount(leaseElement) {\r\n return (Number.parseFloat(leaseElement.leaseRate) !== Number.parseFloat(leaseElement.leaseRateDiscounted));\r\n }\r\n \r\n function getLeaseOptions(financialInfo) {\r\n if (summaryCalculator.getResponsesHasError() === true)\r\n return (\r\n <>\r\n <div className='mz-finance-options__financial-element-error-msg'>{t(\"general:contact_a_dealer\")}</div>\r\n </>\r\n ) \r\n else\r\n return (\r\n <ul className=\"mz-lease-options__financial-element-list mz-collapse__box--element-list\">\r\n {summaryCalculator.LoyaltyChecked ?\r\n <li className=\"loyalty-title\">{t(\"payments:mazda_loyalty_collapse_title\")}</li>: ''}\r\n <li className=\"mz-lease-options__financial-element mz-collapse__box--element headers\">\r\n <span>{t(\"months\")}</span><span>{t(\"rate\")}</span><span>{t(\"weekly_payment\")}</span><span>{t(\"bi_weekly_payment\")}</span><span>{t(\"monthly_payment\")}</span>\r\n </li>\r\n { financialInfo.calculatedLease.leaseValues.map((leaseElement, index) => {\r\n if (leaseTermCanBeDisplayed(leaseElement.term)){\r\n return (\r\n <>\r\n <li className=\"mz-lease-options__financial-element mz-collapse__box--element\" key={index}>\r\n <span><input type=\"checkbox\" name=\"leaseTermOptions\" data-term-selected={leaseElement.term} value={index} onChange={itemClick} checked={parseInt(summaryCalculator.LeaseTermIndex) === index ? true : false} id={leaseElement.term +'__months'} /><label htmlFor={leaseElement.term + '__months'}>{leaseElement.term}</label></span>\r\n {summaryCalculator.LoyaltyChecked && hasRatePercentageDiscount(leaseElement) ? \r\n <span className=\"rate text--red\"><span className='rate-strike '>{convertNum(leaseElement.leaseRate, 2)}% </span> {convertNum(leaseElement.leaseRateDiscounted, 2)}%</span>:\r\n <span className=\"rate\">{convertNum(leaseElement.leaseRate, 2)}%</span>\r\n }\r\n <span className=\"weekly\"><span>{formatPrice(leaseElement[summaryCalculator.IncludeTaxes ? 'weeklyWithTaxes' : 'weekly'])}</span></span>\r\n <span className=\"biWeekly\"><span>{formatPrice(leaseElement[summaryCalculator.IncludeTaxes ? 'biWeeklyWithTaxes' : 'biWeekly'])}</span></span>\r\n <span className=\"weekly\"> <span>{formatPrice(leaseElement[summaryCalculator.IncludeTaxes ? 'monthlyWithTaxes' : 'monthly'])}</span></span>\r\n </li>\r\n {summaryCalculator.LoyaltyChecked && !hasRatePercentageDiscount(leaseElement) ? \r\n <li className=\"text--center text--red\" style={{'font-size': '0.6rem', 'margin-top': '-16px'}}>\r\n <span className=\"loyalty\">{t(\"payments:item_contains_discount\", { discount: formatPrice(summaryCalculator.Incentives.loyalty.cash_value) })}</span>\r\n </li>: null}\r\n </>\r\n )\r\n }\r\n })}\r\n </ul>\r\n )\r\n }\r\n \r\n async function handleClick(e) {\r\n const financialInfo = await summaryCalculator.RecalculateFinancialInfo();\r\n\r\n setCollapseOpenContent(getLeaseOptions(financialInfo));\r\n\r\n setIsCollapsed(!isCollapsed);\r\n\r\n setInit(false);\r\n\r\n setForceUpdate(Math.random());\r\n\r\n gtmHelper.setGTM({'action':'Collapse', 'type': 'Lease Term', 'value': !isCollapsed}, true , false);\r\n }\r\n\r\n function itemClick(e) {\r\n summaryCalculator.LeaseTermIndex = parseInt(e.target.value);\r\n summaryCalculator.LeaseTerm = parseInt(e.target.getAttribute(\"data-term-selected\"));\r\n setSelectedLeaseOption(e.target.value);\r\n\r\n selectCallback();\r\n \r\n setCollapseOpenContent(getLeaseOptions(summaryCalculator.FinancialInfo));\r\n\r\n gtmHelper.setGTM({'action':'Checkbox', 'type': 'Lease Term', 'value': e.target.dataset['termSelected']}, true , false);\r\n }\r\n\r\n function getDisplayedRate() {\r\n const leaseElement = summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex];\r\n\r\n if (summaryCalculator.getResponsesHasError() === true)\r\n return convertNum(0,2); \r\n else {\r\n //return convertNum(summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].leaseRate,2);\r\n if (hasRatePercentageDiscount(leaseElement))\r\n return convertNum(leaseElement.leaseRateDiscounted,2)\r\n else\r\n return convertNum(leaseElement.leaseRate,2);\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n (async () => {\r\n setCursorWaiting(true);\r\n\r\n const financialInfo = await summaryCalculator.RecalculateFinancialInfo();\r\n\r\n setCollapseOpenContent(getLeaseOptions(financialInfo));\r\n\r\n //setForceUpdate(Math.random());\r\n\r\n setCursorWaiting(false);\r\n })();\r\n }, [summaryCalculator.AnnualMileage]);\r\n\r\n useEffect(() => {\r\n (async () => {\r\n setCursorWaiting(true);\r\n\r\n const financialInfo = await summaryCalculator.RecalculateFinancialInfo();\r\n\r\n setCollapseOpenContent(getLeaseOptions(financialInfo));\r\n \r\n setInit(false);\r\n //setIsCollapsed(false);\r\n const collapse = collapseRef.current;\r\n collapse.style.height = null;\r\n //collapse.style.removeProperty('height');\r\n \r\n //setForceUpdate(Math.random());\r\n //window.mzAnimator.animateHeight(collapse, 'CollapseListLease', true);\r\n\r\n setCursorWaiting(false); \r\n })();\r\n }, [summaryCalculator._tradeInValue, summaryCalculator._downPaymentValue, summaryCalculator.LoyaltyChecked, summaryCalculator.GraduateChecked, summaryCalculator.MilitaryChecked, summaryCalculator.FirstTimeOwnerChecked, summaryCalculator.IncludeFees, summaryCalculator.IncludeTaxes, summaryCalculator.IncludeRebates]);\r\n\r\n useEffect(() => {\r\n (async () => {\r\n const collapse = collapseRef.current;\r\n\r\n if(typeof window.mzAnimator === 'object' && !didInit){\r\n window.mzAnimator.animateHeight(collapse, 'CollapseListLease', 'init');\r\n setInit(true);\r\n window.mzAnimator.animateHeight(collapse, 'CollapseListLease', isCollapsed);\r\n } \r\n else {\r\n window.mzAnimator.animateHeight(collapse, 'CollapseListLease', isCollapsed);\r\n }\r\n \r\n collapse.className = 'mz-collapse__box visible ' + (!isCollapsed ? 'mz-collapse__box--finance-collapsed' : 'mz-collapse__box--finance-expanded');\r\n\r\n if(isCollapsed === false)\r\n dropdownCallback();\r\n })();\r\n },[isCollapsed, didInit]);\r\n\r\n useEffect(() => {\r\n console.log('reupdating lease collapse');\r\n }, [update]);\r\n\r\n useEffect(() => {\r\n setForceUpdate(Math.random());\r\n }, [collapseOpenContent]);\r\n\r\n return (\r\n <div className=\"mz-collapse mz-collapse--finance\">\r\n <button\r\n onClick={handleClick}\r\n className=\"mz-collapse__button\"\r\n >\r\n <div className=\"mz-collapse__cartext-container\">\r\n <p className=\"mz-collapse__text\">{t(\"term\")}: {summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].term} {t(\"payments:months_lowercase\")} {getDisplayedRate()}%</p>\r\n </div>\r\n <i className={ isCollapsed ? \"mz-svg mz-svg-chevron_small open mz-svg--grey\" : \"mz-svg mz-svg-chevron_small mz-svg--grey\"}></i>\r\n </button>\r\n <div className=\"mz-collapse__box\" ref={collapseRef}>{collapseOpenContent}</div>\r\n </div>\r\n )\r\n}\r\n\r\nCollapseLease.propTypes = {\r\n}\r\n\r\nCollapseLease.defaultProps = {\r\n}\r\n\r\nexport default CollapseLease;","import React, { useState, useEffect, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\n//import SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nimport { convertNum, setCursorWaiting } from '../../../utils'\r\n\r\nexport const CollapseLeaseMileage = ({callback, key, setSelectedLeasesMileage, ...props }) => {\r\n const { t, i18n } = useTranslation(['payments', 'general']);\r\n\r\n const summaryCalculator = window.summaryCalculator;\r\n\tconst gtmHelper = new GTMHelper();\r\n\r\n const [isCollapsed, setIsCollapsed] = useState(false);\r\n const [didInit, setInit] = React.useState(false);\r\n const collapseRef = useRef();\r\n\r\n const [collapseClosedContent, setCollapseClosedContent] = useState('');\r\n const [currentMileage, setCurrentAnnuelMileage] = useState(summaryCalculator.AnnualMileage);\r\n \r\n const [update, setForceUpdate] = useState('');\r\n\r\n //content for mileage current drop down select\r\n const ClosedContent = ()=>{\r\n let mileage = '';\r\n\r\n switch (parseInt(summaryCalculator.AnnualMileage)) {\r\n case 2:\r\n mileage = 20000;\r\n break;\r\n case 3:\r\n mileage = 16000;\r\n break;\r\n case 0:\r\n mileage = 24000;\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n return `${t(\"annual_km\")}: ${convertNum(mileage)}`\r\n }\r\n\r\n //content for mileage dropdown\r\n function collapseOpenContent() {\r\n return (\r\n <ul className=\"mz-finance-options__financial-element-list annual-mileage-options\">\r\n \r\n <li className={`mz-finance-options__financial-element ${summaryCalculator.AnnualMileage === 3 ? 'selected' : ''}`}>\r\n <span onClick={itemClick}><label htmlFor=\"annualMileage\">{t(\"annual_km_16000\")}</label><input type=\"hidden\" name=\"annualMileage\" value=\"3\" id=\"ultra_kilometer_lease\"/></span> <i className=\"mz-svg mz-svg-checkmark\"></i>\r\n </li>\r\n \r\n <li className={`mz-finance-options__financial-element ${summaryCalculator.AnnualMileage === 2 ? 'selected' : ''}`}>\r\n <span onClick={itemClick}><label htmlFor=\"annualMileage\">{t(\"annual_km_20000\")}</label><input type=\"hidden\" name=\"annualMileage\" value=\"2\" id=\"low_kilometer_lease\"/></span> <i className=\"mz-svg mz-svg-checkmark\"></i> \r\n </li>\r\n <li className={`mz-finance-options__financial-element ${summaryCalculator.AnnualMileage === 0 ? 'selected' : ''}`}>\r\n <span onClick={itemClick}><label htmlFor=\"annualMileage\">{t(\"annual_km_24000\")}</label><input type=\"hidden\" name=\"annualMileage\" value=\"0\" id=\"standard_kilometer_lease\"/></span> <i className=\"mz-svg mz-svg-checkmark\"></i>\r\n </li>\r\n </ul>\r\n );\r\n }\r\n\r\n function handleClick(e) {\r\n setIsCollapsed(!isCollapsed);\r\n\r\n setInit(false);\r\n \r\n\t\tgtmHelper.setGTM({'action':'Collapse', 'type': 'Lease Mileage', 'value': !isCollapsed}, true , false);\r\n }\r\n\r\n // update mileage value\r\n async function itemClick(e) {\r\n setCursorWaiting(true);\r\n\r\n callback(e);\r\n\r\n //setForceUpdate(Math.random());\r\n \r\n setCursorWaiting(false);\r\n\r\n gtmHelper.setGTM({'action':'Checkbox', 'type': 'Lease Mileage', 'value': summaryCalculator.AnnualMileage}, true , false);\r\n }\r\n\r\n useEffect(() =>{\r\n (async () => {\r\n //setInit(false);\r\n //setIsCollapsed(false);\r\n const collapse = collapseRef.current;\r\n\r\n if(!isCollapsed)\r\n collapse.style.height = \"0px\";\r\n else {\r\n collapse.style.height = null;\r\n window.mzAnimator.animateHeight(collapse, 'CollapseListMileage', true);\r\n }\r\n\r\n //collapse.style.removeProperty('height');\r\n \r\n //setForceUpdate(Math.random());\r\n\r\n setCollapseClosedContent(ClosedContent());\r\n })(); \r\n }, [summaryCalculator._tradeInValue, summaryCalculator._downPaymentValue, summaryCalculator.LoyaltyChecked, summaryCalculator.GraduateChecked, summaryCalculator.MilitaryChecked, summaryCalculator.FirstTimeOwnerChecked, summaryCalculator.IncludeFees, summaryCalculator.IncludeTaxes, summaryCalculator.IncludeRebates]);\r\n\r\n useEffect(() =>{\r\n (async () => {\r\n const collapse = collapseRef.current;\r\n\r\n /*if(typeof window.mzAnimator === 'object'){\r\n window.mzAnimator.animateHeight(collapse, 'CollapseListMileage', 'init')\r\n }*/\r\n\r\n if(typeof window.mzAnimator === 'object' && !didInit){\r\n window.mzAnimator.animateHeight(collapse, 'CollapseListMileage', 'init')\r\n setInit(true);\r\n window.mzAnimator.animateHeight(collapse, 'CollapseListMileage', isCollapsed);\r\n }\r\n else {\r\n //collapse.style.height = \"500px\";\r\n window.mzAnimator.animateHeight(collapse, 'CollapseListMileage', isCollapsed); \r\n }\r\n\r\n })();\r\n }, [isCollapsed, didInit]);\r\n\r\n /*useEffect(()=>{\r\n \r\n }, [currentMileage, update]);*/\r\n\r\n useEffect(()=>{\r\n setCurrentAnnuelMileage(summaryCalculator.AnnualMileage);\r\n\r\n setCollapseClosedContent(ClosedContent());\r\n }, [summaryCalculator.AnnualMileage]);\r\n\r\n return (\r\n <div className=\"mz-collapse mz-collapse--finance\" key={key}>\r\n <button\r\n onClick={handleClick}\r\n className=\"mz-collapse__button\"\r\n >\r\n <div className=\"mz-collapse__cartext-container\">\r\n <p className=\"mz-collapse__text\">{collapseClosedContent}</p>\r\n </div>\r\n <i className={ !isCollapsed ? \"mz-svg mz-svg-chevron_small open mz-svg--grey\" : \"mz-svg mz-svg-chevron_small mz-svg--grey\"}></i>\r\n </button>\r\n <div className=\"mz-collapse__box\" ref={collapseRef}>{collapseOpenContent()}</div>\r\n </div>\r\n )\r\n}\r\n\r\nCollapseLeaseMileage.propTypes = {\r\n\r\n}\r\n\r\nCollapseLeaseMileage.defaultProps = {\r\n\r\n}\r\n\r\nexport default CollapseLeaseMileage;","import React, { useState, useEffect, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport { Trans, useTranslation } from \"react-i18next\";\r\n\r\nimport { formatPrice, getIncentiveDisplayName, getMazdaFeesAndLeviesDetailTitle, convertNum, getProvince, getLang} from '../../../utils'\r\nimport { openModal } from '../../../Helpers/helpers';\r\n\r\n//import SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nimport { Tooltip } from '../../1_Atoms/Tooltip/Tooltip';\r\nimport { Button } from '../../1_Atoms/Button/Button';\r\nimport { OcaModal } from '../../3_Organisms/Modal/OcaModal';\r\nimport CollapseLease from '../Collapse/CollapseLease';\r\nimport CollapseLeaseMileage from '../Collapse/CollapseLeaseMileage';\r\n\r\nexport const LeaseOptions = ({ setSelectedLeaseOption, includeFees, includeTaxes, includeRebates, setSelectedLeasesMileage, setPreorderModalOpen, ...props }) => {\r\n const navigate = useNavigate();\r\n const { year, carline, trim, model, packageCode } = useParams();\r\n const summaryCalculator = window.summaryCalculator;\r\n \r\n const { t, i18n } = useTranslation(['payments', 'general', 'summary']);\r\n const provinceCode = getProvince().toUpperCase();\r\n const [financialInfo, setFinancialInfo] = useState(summaryCalculator.FinancialInfo);\r\n const [update, setForceUpdate] = useState(''); \r\n const [isLeaseTermCollapsed, setLeaseTermCollapsed] = useState(false);\r\n\r\n const [didInit, setInit] = useState(false);\r\n const [showDetailedPricing, toggleShowDetailedPricing] = useState(false);\r\n const leaseDetailRef1 = useRef();\r\n const leaseDetailRef2 = useRef();\r\n const leaseDetailRef3 = useRef();\r\n\r\n\tconst gtmHelper = new GTMHelper();\r\n \r\n const [ocaOpen, setOcaModalOpen] = useState(false);\r\n const [financeType, setFinanceType] = useState(false);\r\n\r\n //Fixed Number provided by API\r\n const [currentIncentives, setCurrentIncentives] = useState(null);\r\n \r\n const [reserveOpen, setReserveModalOpen] = React.useState(false);\r\n\r\n useEffect(() =>{\r\n const collapse1 = leaseDetailRef1.current;\r\n const collapse2 = leaseDetailRef2.current;\r\n const collapse3 = leaseDetailRef3.current;\r\n \r\n if(typeof window.mzAnimator === 'object' && !didInit && showDetailedPricing){\r\n window.mzAnimator.animateHeight(collapse1, 'CollapseDetailedLease1', 'init')\r\n window.mzAnimator.animateHeight(collapse2, 'CollapseDetailedLease2', 'init')\r\n window.mzAnimator.animateHeight(collapse3, 'CollapseDetailedLease3', 'init')\r\n setInit(true);\r\n toggleCollapse(false);\r\n }else{\r\n toggleCollapse(true);\r\n }\r\n },[showDetailedPricing, didInit]);\r\n\r\n \r\n function toggleCollapse(fromClick) {\r\n const collapse1 = leaseDetailRef1.current;\r\n const collapse2 = leaseDetailRef2.current;\r\n const collapse3 = leaseDetailRef3.current;\r\n \r\n if(showDetailedPricing){\r\n window.mzAnimator.animateHeight(collapse1, 'CollapseDetailedLease1', true)\r\n window.mzAnimator.animateHeight(collapse2, 'CollapseDetailedLease2', true)\r\n window.mzAnimator.animateHeight(collapse3, 'CollapseDetailedLease3', true)\r\n }else{\r\n window.mzAnimator.animateHeight(collapse1, 'CollapseDetailedLease1', false)\r\n window.mzAnimator.animateHeight(collapse2, 'CollapseDetailedLease2', false)\r\n window.mzAnimator.animateHeight(collapse3, 'CollapseDetailedLease3', false)\r\n }\r\n if(fromClick)\r\n gtmHelper.setGTM({'action':'Collapse', 'type': 'Detailed Lease ', 'value': showDetailedPricing}, true , false);\r\n \r\n }\r\n function financeClick(financeType){\r\n document.querySelector('body').classList.add('disabled');\r\n\t\tsetOcaModalOpen(true);\r\n setFinanceType(financeType);\r\n \r\n const price = summaryCalculator.FinancialInfo.calculatedLease.balanceToLeaseWithFeesWithRebatesTaxed;\r\n gtmHelper.setGTM({'action':`OCA - Lease Payment`,'year': year,'model': ReactHtmlParser(carline), 'trim': trim, 'price' : Math.round(price)}, true, false);\r\n }\r\n\r\n function getRebatesDetails() {\r\n\t\treturn financialInfo !== null ? financialInfo.calculatedLease.evRebates.details.map((rebate, index) => `<li key=\"${index}\" class=\"finance-list__item rebate\">\r\n \t<p class=\"desc text--green\">${rebate.title==='federal'? t('fed_rebate'):t('prov_rebate') + ' ('+getProvince()+')'}</p><span class=\"price text--green\">${rebate.lease ? '-' : ''}${formatPrice(rebate.lease, true)}</span>\r\n </li>`).join(\"\") : '';\r\n }\r\n\r\n function getTaxRebatesDetails() {\r\n return <>\r\n <li class=\"finance-list__item\"><p class=\"desc\">{t('tax_fed_rebate')}</p><span class=\"price\">{formatPrice(financialInfo.calculatedLease.evRebates.total.lease_federal_tax, true)}</span></li>\r\n <li class=\"finance-list__item\"><p class=\"desc\">{t('tax_prov_rebate') + ' ('+getProvince()+')'}</p><span class=\"price\">{formatPrice(financialInfo.calculatedLease.evRebates.total.lease_provincial_tax, true)}</span></li>\r\n </>\r\n }\r\n\r\n function getOptionList() {\r\n let optionList = '';\r\n \r\n const options = summaryCalculator.FinancialInfo ?.calculatedLease ?.options;\r\n\r\n if(options.exteriorColour.price >0){\r\n optionList += ` <li class=\"finance-list__item\">\r\n <p class=\"desc\">${t('exterior')} ${options.exteriorColour.description}</p>\r\n <span class=\"price\">${formatPrice(options.exteriorColour.price, true)}</span>\r\n </li>`\r\n }\r\n if(options ?.interiorColour.price >0){\r\n optionList += ` <li class=\"finance-list__item\">\r\n <p class=\"desc\">${t('interior')} ${options.interiorColour.description}</p>\r\n <span class=\"price\">${formatPrice(options.interiorColour.price, true)}</span>\r\n </li>`\r\n }\r\n if(options ?.model_option_package ?.financial ?.msrp >0){\r\n optionList += ` <li class=\"finance-list__item\">\r\n <p class=\"desc\">${t('package')} ${options.model_option_package.name}</p>\r\n <span class=\"price\">${formatPrice(options.model_option_package.financial.msrp, true)}</span>\r\n </li>`\r\n }\r\n\r\n const selectedWarrantyPackage = JSON.parse(sessionStorage.getItem('selectedWarrantyPackage'));\r\n if(selectedWarrantyPackage != null && selectedWarrantyPackage.name != undefined ){\r\n const warrantyPrice = (JSON.parse(sessionStorage.getItem('selectedWarrantyPackage')).financial.msrp);\r\n optionList += ` <li class=\"finance-list__item\">\r\n <p class=\"desc\">${t(\"warranties\")} ${selectedWarrantyPackage.name}</p>\r\n <span class=\"price\">${formatPrice(warrantyPrice, true)}</span>\r\n </li>`\r\n } \r\n \r\n const selectedConnectedVehiclePackage = JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage'));\r\n if(selectedConnectedVehiclePackage != null && selectedConnectedVehiclePackage.name != undefined){\r\n const connectedPrice = (JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage')).financial.msrp);\r\n optionList += ` <li class=\"finance-list__item\">\r\n <p class=\"desc\">${t(\"connected\")} <span style=\"text-transform:lowercase\">${selectedConnectedVehiclePackage.name}</span></p>\r\n <span class=\"price\">${formatPrice(connectedPrice, true)}</span>\r\n </li>`\r\n }\r\n\r\n if(options.wheels.price >0){\r\n const options = summaryCalculator.FinancialInfo ?.calculatedFinance ?.options;\r\n\r\n optionList += ` <li class=\"finance-list__item\">\r\n <p class=\"desc\">${`4x ${options.wheels.title}`}</p>\r\n <span class=\"price\">${formatPrice(options.wheels.base_msrp, true)}</span>\r\n </li>\r\n <li class=\"finance-list__item\">\r\n <p class=\"desc\">${`4x ${t(\"payments:tpms\")}`}</p>\r\n <span class=\"price\">${formatPrice(options.wheels.tpms, true)}</span>\r\n </li>\r\n <li class=\"finance-list__item\">\r\n <p class=\"desc\">${t(\"payments:installation\")}</p>\r\n <span class=\"price\">${formatPrice(options.wheels.install_cost, true)}</span>\r\n </li>`\r\n }\r\n\r\n return optionList;\r\n } \r\n\r\n function getAccessoriesDetails() {\r\n let accessories = sessionStorage.getItem(Constants.SelectedAccessories);\r\n accessories = JSON.parse(accessories); \r\n \r\n const accList = accessories.map((accessory, index) => {\r\n return(\r\n <> \r\n <li className=\"finance-list__item financeOptions_accessories\">\r\n <p className=\"desc\">{accessory.name}</p>\r\n <span className=\"price\">{formatPrice(accessory.base_msrp, true)}</span>\r\n </li>\r\n <li className=\"finance-list__item financeOptions_accessories\">\r\n <p className=\"desc\">{accessory.name} - Installation</p>\r\n <span className=\"price\">{formatPrice(accessory.install_cost, true)}</span>\r\n </li>\r\n </>\r\n )\r\n });\r\n return accList;\r\n }\r\n\r\n const handleContactDealerLinkClick = (e) => {\r\n e.preventDefault();\r\n\r\n const contactRoute = `/${year}/${carline}/${trim}/${model}/${packageCode}/summary?contactDealer`;\r\n navigate(contactRoute);\r\n }\r\n \r\n useEffect(() =>{\r\n (async function() {\r\n setInit(false);\r\n \r\n setFinancialInfo(await summaryCalculator.RecalculateFinancialInfo());\r\n\r\n setForceUpdate(Math.random());\r\n \r\n })();\r\n },[summaryCalculator._tradeInValue, summaryCalculator._downPaymentValue, summaryCalculator.LoyaltyChecked, summaryCalculator.GraduateChecked, summaryCalculator.MilitaryChecked, summaryCalculator.FirstTimeOwnerChecked, summaryCalculator.IncludeFees, summaryCalculator.IncludeTaxes, summaryCalculator.AnnualMileage, summaryCalculator.IncludeRebates]);\r\n\r\n useEffect(() => {\r\n if(summaryCalculator.FinancialInfo.incentive_programs) \r\n setCurrentIncentives(summaryCalculator.FinancialInfo.incentive_programs?.find(element => element.type === \"incentive\"));\r\n\r\n console.log('refreshing the lease options section');\r\n //console.log(summaryCalculator.FinancialInfo);\r\n }, [update]);\r\n \r\n includeFees = summaryCalculator.IncludeFees;\r\n includeTaxes = summaryCalculator.IncludeTaxes;\r\n includeRebates = summaryCalculator.IncludeRebates;\r\n\t\r\n const leaseDropdown = async (isOpen) => {\r\n if(didInit){\r\n const collapse1 = leaseDetailRef1.current;\r\n const collapse2 = leaseDetailRef2.current;\r\n const collapse3 = leaseDetailRef3.current;\r\n \r\n window.mzAnimator.animateHeight(collapse1, 'CollapseDetailedLease1', 'init')\r\n window.mzAnimator.animateHeight(collapse2, 'CollapseDetailedLease2', 'init')\r\n window.mzAnimator.animateHeight(collapse3, 'CollapseDetailedLease3', 'init')\r\n setInit(true);\r\n toggleCollapse(false);\r\n }\r\n }\r\n\r\n const leaseTermSelect = async (e) => {\r\n setFinancialInfo(await summaryCalculator.RecalculateFinancialInfo());\r\n }\r\n\r\n const leaseMileageItemClick = async (e)=>{\r\n const annualMileageValue = parseInt(e.currentTarget.querySelector('input[name=\"annualMileage\"]').value);\r\n summaryCalculator.AnnualMileage = annualMileageValue;\r\n\r\n setFinancialInfo(await summaryCalculator.RecalculateFinancialInfo());\r\n\r\n setSelectedLeasesMileage(annualMileageValue);\r\n }\r\n\r\n const getMazdaFeesAndLeviesDetails = () => {\r\n const feesAndLeviesToDisplay = summaryCalculator.FinancialInfo.calculatedLease.feesAndLevies.detail.filter(item => item.title !== 'PDE');\r\n \r\n return feesAndLeviesToDisplay;\r\n }\r\n\r\n const getDisplayedFee = (fee) => {\r\n return getMazdaFeesAndLeviesDetailTitle(fee.title, t);\r\n }\r\n\r\n async function handleReserveYoursClick() {\r\n const isRetailerMode = await summaryCalculator.isRetailerMode();\r\n summaryCalculator.CurrentPurchaseMethod = 'Lease';\r\n if (isRetailerMode) {\r\n setReserveModalOpen(true);\r\n } else {\r\n openGetLocal();\r\n }\r\n }\r\n\r\n function handlePreOrderClick() {\r\n document.querySelector('body').classList.add('disabled');\r\n setPreorderModalOpen(true)\r\n }\r\n\r\n\r\n function openGetLocal(){\r\n const lang = getLang();\r\n gtmHelper.setGTM({'action':'Open Modal','modal': 'Contact Dealer'}, true, false);\r\n\r\n const targetModal = document.getElementById('mz-react-send-build-to-dealer-modal');\r\n if (targetModal && summaryCalculator) {\r\n if (summaryCalculator.SelectedColourExteriorIndex !== 'null' && summaryCalculator.Colours !== null) {\r\n const heading = targetModal.querySelector('.mz-send-build-to-dealer__vehicle-name');\r\n if (heading) {\r\n heading.textContent = lang === 'en' ? summaryCalculator._selectedModelYear.year.title + ' ' + ReactHtmlParser(summaryCalculator._selectedModelYear.carline.title) : ReactHtmlParser(summaryCalculator._selectedModelYear.carline.title) + ' ' + summaryCalculator._selectedModelYear.year.title;\r\n }\r\n }\r\n openModal('mz-react-send-build-to-dealer-modal');\r\n }\r\n }\r\n\r\n\r\n const firstPaymentTaxes = summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].monthlyWithTaxes - (summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].monthlyWithTaxes / (1 + summaryCalculator.FinancialInfo.calculatedLease.tax));\r\n\r\n const hasResponseError = summaryCalculator.getResponsesHasError();\r\n\r\n function getWeeklyPrice() {\r\n if (hasResponseError)\r\n return formatPrice(0);\r\n else\r\n return formatPrice(summaryCalculator.FinancialInfo.calculatedLease?.leaseValues[summaryCalculator.LeaseTermIndex][summaryCalculator.IncludeTaxes ? 'weeklyWithTaxes' : 'weekly'])\r\n }\r\n\r\n function getBiWeeklyPrice() {\r\n if (hasResponseError)\r\n return formatPrice(0);\r\n else\r\n return formatPrice(summaryCalculator.FinancialInfo.calculatedLease?.leaseValues[summaryCalculator.LeaseTermIndex][summaryCalculator.IncludeTaxes ? 'biWeeklyWithTaxes' : 'biWeekly'])\r\n }\r\n\r\n function getMonthlyPrice() {\r\n if (hasResponseError)\r\n return formatPrice(0);\r\n else\r\n return formatPrice(summaryCalculator.FinancialInfo.calculatedLease?.leaseValues[summaryCalculator.LeaseTermIndex][summaryCalculator.IncludeTaxes ? 'monthlyWithTaxes' : 'monthly']);\r\n }\r\n\r\n function getDisplayedRate() {\r\n if (hasResponseError)\r\n return '-';\r\n\r\n const leaseElement = summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex];\r\n if (Number.parseFloat(leaseElement.leaseRate) !== Number.parseFloat(leaseElement.leaseRateDiscounted))\r\n return convertNum(leaseElement.leaseRateDiscounted, 2) + '%';\r\n else\r\n return convertNum(leaseElement.leaseRate,2) + '%';\r\n }\r\n\r\n function getInformationalRate() {\r\n if (hasResponseError)\r\n return '-';\r\n else\r\n return convertNum(summaryCalculator.getLeaseInformationalAprRate(),2) + '%';\r\n }\r\n\r\n function getTotalPayable() {\r\n //{includeFees && includeTaxes && includeRebates \r\n let totalPayable = summaryCalculator.FinancialInfo.calculatedLease.balanceToLease;\r\n totalPayable = includeFees ? summaryCalculator.FinancialInfo.calculatedLease.balanceToLeaseWithFees : totalPayable;\r\n totalPayable = includeRebates ? summaryCalculator.FinancialInfo.calculatedLease.balanceToLeaseWithRebates : totalPayable;\r\n totalPayable = includeFees && includeRebates ? summaryCalculator.FinancialInfo.calculatedLease.balanceToLeaseWithFeesWithRebates : totalPayable;\r\n\r\n return hasResponseError ? '-' :formatPrice(totalPayable, true);\r\n }\r\n\r\n function getFirstPayment() {\r\n const firstPayment = includeTaxes ? (summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].monthlyWithTaxes - firstPaymentTaxes) : summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].monthly;\r\n\r\n return hasResponseError ? '-' :formatPrice(firstPayment, true);\r\n }\r\n\r\n function getTotalDue() {\r\n const leaseElement = summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex];\r\n \r\n const totalDue = (includeTaxes ? (leaseElement.monthlyWithTaxes + summaryCalculator.FinancialInfo.calculatedLease.downPaymentValue + summaryCalculator.FinancialInfo.calculatedLease.downPaymentTax) : leaseElement.monthly + summaryCalculator.FinancialInfo.calculatedLease.downPaymentValue)\r\n + (includeRebates && includeTaxes ? (summaryCalculator.FinancialInfo.calculatedLease.evRebates.total.lease_federal_tax + summaryCalculator.FinancialInfo.calculatedLease.evRebates.total.lease_provincial_tax) : 0);\r\n\r\n return hasResponseError ? '-' :formatPrice(totalDue, true);\r\n }\r\n\r\n\r\n return (\r\n <div className=\"mz-lease-options lease\">\r\n <h4>{t(\"lease_options\")}</h4>\r\n {!summaryCalculator.getResponsesHasError() ?\r\n <>\r\n <div className=\"mz-lease__count\">\r\n <div className=\"mz-lease__count-item \">\r\n <p>{t(\"weekly\")}</p>\r\n <span>{getWeeklyPrice()}</span> \r\n </div>\r\n <div className=\"mz-lease__count-item \">\r\n <p>{t(\"bi_weekly\")}</p>\r\n <span>{getBiWeeklyPrice()}</span> \r\n </div>\r\n <div className=\"mz-lease__count-item \">\r\n <p>{t(\"monthly\")}</p>\r\n <span>{getMonthlyPrice()}</span> \r\n </div>\r\n </div>\r\n <div className=\"mz-lease__terms\">\r\n <CollapseLease dropdownCallback={leaseDropdown} selectCallback={leaseTermSelect} setSelectedLeaseOption={setSelectedLeaseOption} />\r\n <CollapseLeaseMileage callback={leaseMileageItemClick} setSelectedLeasesMileage={setSelectedLeasesMileage} />\r\n </div>\r\n </> \r\n :\r\n <>\r\n <p className=\"text--center\">\r\n {ReactHtmlParser(t(\"general:generalErrorMessage\"))}\r\n </p>\r\n </>} \r\n <div className=\"hr light\"></div>\r\n <div className={`mz-finance__numbs ${!showDetailedPricing ? 'collapsed' : \r\n ''}`}>\r\n <ul className=\"finance-list hidden\" ref={leaseDetailRef1}>\r\n <li className=\"finance-list__item\">\r\n <p className=\"desc\">{t(\"msrp\")}</p>\r\n <span className=\"price\">{`${formatPrice(summaryCalculator.SelectedModel.financial.msrp, true)}`}</span>\r\n </li>\r\n <li className=\"finance-list__item\">\r\n <p className=\"desc\">{t(\"trade_in\")}<sup>1</sup></p>\r\n <span className=\"price discount\">{`${summaryCalculator.FinancialInfo.tradeInValue > 0 ? '-' : ''}${formatPrice(summaryCalculator.FinancialInfo.tradeInValue, true)}`}</span>\r\n </li>\r\n {currentIncentives && currentIncentives.value >0 ?\r\n <li className=\"finance-list__item\">\r\n <p className=\"desc\">{t(\"current_incentive\")} <Tooltip TooltipName=\"incentives\" incentives={currentIncentives.value}/></p>\r\n <span className=\"price discount\">{currentIncentives?'-':''}{formatPrice(currentIncentives.value, true)}</span>\r\n </li>:''}\r\n {ReactHtmlParser(getOptionList())}\r\n {summaryCalculator.FinancialInfo.calculatedLease?.accessories.total > 0?\r\n getAccessoriesDetails()\r\n :''}\r\n <li className=\"finance-list__item\">\r\n <p className=\"desc\">{t(\"freight\")}</p>\r\n <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.freight, true)}`}</span>\r\n </li>\r\n <li className=\"finance-list__item\">\r\n <p className=\"desc\">{t(\"general:pde\")}</p>\r\n <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.pde, true)}`}</span>\r\n </li>\r\n {includeFees ? <li className=\"finance-list__item\">\r\n <p className=\"desc\">\r\n {getDisplayedFee({title: \"Administration Fee\"})}\r\n <sup>9</sup>\r\n </p>\r\n <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.adminServiceFees, true)}`}</span>\r\n </li>:''} \r\n {includeFees? getMazdaFeesAndLeviesDetails().map((fee, index) => {\r\n return <li className=\"finance-list__item\">\r\n <p className=\"desc\">{ReactHtmlParser(getDisplayedFee(fee))}\r\n {fee.sup ? ReactHtmlParser(`<sup>${fee.sup}</sup>`) : ''}\r\n </p>\r\n <span className=\"price\">{`${formatPrice(fee.price, true)}`}</span>\r\n </li>\r\n }):''}\r\n\t\t\t\t\t{includeRebates ? ReactHtmlParser(getRebatesDetails()) : \"\"}\r\n </ul>\r\n <ul className=\"finance-list hidden\" ref={leaseDetailRef2}>\r\n <li className=\"finance-list__item\"><p className=\"desc\">{provinceCode === \"QC\" ? \"RDPRM\" : \"PPSA\"}<sup>7</sup></p>\r\n <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].ppsa, true)}`}</span>\r\n </li>\r\n <li className=\"finance-list__item\">\r\n <p className=\"desc\">{t(\"sub_total\")}</p>\r\n <span className=\"price\">\r\n { includeFees && includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedLease.subtotalWithFeesWithRebates, true)}`}</span> : null}\r\n { includeFees && !includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedLease.subtotalWithFees, true)}`}</span> : null}\r\n {!includeFees && includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedLease.subtotalWithRebates, true)}`}</span> : null}\r\n {!includeFees && !includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedLease.subtotal, true)}`}</span> : null}\r\n </span>\r\n </li>\r\n <li className=\"finance-list__item\">\r\n <p className=\"desc\">{t(\"down_payment\")}<sup>2</sup></p>\r\n <span className=\"price discount\">{`${summaryCalculator.FinancialInfo.downPaymentValue > 0 ? '-' : ''}${formatPrice(summaryCalculator.FinancialInfo.downPaymentValue, true)}`}</span>\r\n </li>\r\n {summaryCalculator.FinancialInfo.calculatedLease.rewards.map((el, index) => {\r\n return <li className=\"finance-list__item\" key={index}>\r\n <p className=\"desc\">{getIncentiveDisplayName(el.type)}</p>\r\n <span className=\"price discount\">{`-${el.cash_value?formatPrice(el.cash_value, true):formatPrice(el.value, true)}`}</span>\r\n </li>\r\n })}\r\n\r\n </ul>\r\n <ul className={`finance-list ${showDetailedPricing ? 'finance-list__border' : ''}`}>\r\n <li className=\"finance-list__item\">\r\n <p className=\"desc\">{t(\"balance_to_lease\")}</p>\r\n {includeFees && includeTaxes && includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedLease.balanceToLeaseWithFeesWithRebates, true)}`}</span> : null}\r\n {!includeFees && includeTaxes && includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedLease.balanceToLeaseWithRebates, true)}`}</span> : null}\r\n {includeFees && !includeTaxes && includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedLease.balanceToLeaseWithFeesWithRebates, true)}`}</span> : null}\r\n {includeFees && includeTaxes && !includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedLease.balanceToLeaseWithFees, true)}`}</span> : null}\r\n {includeFees && !includeTaxes && !includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedLease.balanceToLeaseWithFees, true)}`}</span> : null}\r\n {!includeFees && includeTaxes && !includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedLease.balanceToLease, true)}`}</span> : null}\r\n {!includeFees && !includeTaxes && includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedLease.balanceToLeaseWithRebates, true)}`}</span> : null}\r\n {!includeFees && !includeTaxes && !includeRebates ? <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedLease.balanceToLease, true)}`}</span> : null}\r\n </li>\r\n <div ref={leaseDetailRef3}>\r\n <li className=\"finance-list__item\">\r\n <p className=\"desc\">{t(\"period_of_lease\")}</p>\r\n <span className=\"price\">{`${summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].term}`} months</span>\r\n </li>\r\n <li className=\"finance-list__item\">\r\n <p className=\"desc\">{t(\"rate\")}</p>\r\n <span className=\"price\">{`${getDisplayedRate()}`}</span>\r\n </li>\r\n <li className=\"finance-list__item\">\r\n <p className=\"desc\">{t(\"informational_apr\")}</p>\r\n <span className=\"price\">{getInformationalRate()}</span>\r\n </li>\r\n </div>\r\n </ul>\r\n <ul className={`finance-list ${showDetailedPricing ? 'finance-list__border' : ''}`}>\r\n <li className=\"finance-list__item\">\r\n <p className=\"desc\">{t(\"total_payable\")}</p>\r\n <span className=\"price\">{`${getTotalPayable()}`}</span>\r\n </li>\r\n {includeTaxes? <li className=\"finance-list__item hidden\">\r\n <p className=\"desc\">{t(\"taxes\")}</p>\r\n <span className=\"price\">{`${formatPrice(summaryCalculator.FinancialInfo.calculatedLease.leaseValues[summaryCalculator.LeaseTermIndex].monthly*summaryCalculator.FinancialInfo.calculatedLease.tax, true)}`}</span>\r\n </li>:''}\r\n </ul>\r\n <ul className=\"finance-list\">\r\n <li className={`finance-list__item`}>\r\n <p className=\"desc\"><strong>{t(\"amount_due_on_delivery\")}</strong></p>\r\n </li>\r\n <li className={`finance-list__item`}>\r\n <p className=\"desc\">{t(\"first_payment\")}</p>\r\n <span className=\"price\">{getFirstPayment()}</span>\r\n </li>\r\n { includeTaxes ? <li className={`finance-list__item`}>\r\n <p className=\"desc\">{t(\"taxe_first_payment\")}</p>\r\n <span className=\"price\">{`${formatPrice(firstPaymentTaxes, true)}`}</span>\r\n </li> : null}\r\n <li className=\"finance-list__item\">\r\n <p className=\"desc\">{t(\"down_payment\")}<sup>2</sup></p>\r\n <span className=\"price\">{formatPrice(summaryCalculator.FinancialInfo.calculatedLease.downPaymentValue, true)}</span>\r\n </li>\r\n {includeTaxes? <li className=\"finance-list__item\">\r\n <p className=\"desc\">{t(\"taxes_on_down_payment\")}</p>\r\n <span className=\"price\">{formatPrice(summaryCalculator.FinancialInfo.calculatedLease.downPaymentTax, true)}</span>\r\n </li>:''}\r\n {includeRebates && includeTaxes ? getTaxRebatesDetails() : \"\"}\r\n <li className=\"finance-list__item\">\r\n <p className=\"desc\">{t(\"total_due\")}</p>\r\n <span className=\"price\">{getTotalDue()}</span>\r\n </li>\r\n </ul>\r\n <ul className={`finance-list ${showDetailedPricing ? 'finance-list__border' : ''}`}>\r\n <li className=\"finance-list__item no-spacing\">\r\n <a className=\"mz-link label text--grey\" href=\"/\" onClick={(e) =>{\r\n e.preventDefault();\r\n toggleShowDetailedPricing(!showDetailedPricing);\r\n \r\n }}>{t(\"show_detailed_pricing\")}</a>\r\n <a className=\"no_line label\" href=\"/\" onClick={(e) =>{\r\n e.preventDefault();\r\n toggleShowDetailedPricing(!showDetailedPricing);\r\n \r\n }}><i className={`mz-svg mz-svg-chevron_small mz-svg--red ${showDetailedPricing ? 'mz-svg--rotate270' : 'mz-svg--rotate90'}`}></i></a>\r\n </li>\r\n </ul>\r\n <div className=\"mz-financial--cta hidden\">\r\n {window.allow_oca ?\r\n <Button primary={true} label={ReactHtmlParser(String(t(\"summary:btn_apply_for_financing\")))} iconBefore={false} onClick={()=>financeClick('lease')}/>\r\n :\r\n summaryCalculator.isSelectionPreOrder() ?\r\n <Button primary={true} label={String(t(\"summary:btn_pre_order\"))} iconBefore={false} onClick={handlePreOrderClick}/>\r\n : \r\n <Button primary={true} label={String(t(\"summary:btn_reserve_yours\"))} iconBefore={false} onClick={handleReserveYoursClick}/>}\r\n </div>\r\n <div className=\"finance_disclaimer\">\r\n {currentIncentives && currentIncentives.value != 0 ?\r\n i18n.language == \"en\" ?\r\n <>\r\n <p className=\"caption\">Payments shown include a <span className=\"text--red\">{formatPrice(currentIncentives.value)}</span> Current Incentive.<br/><a className=\"mz-link--black\" onClick={handleContactDealerLinkClick}>Contact your local Mazda retailer</a> for details.</p>\r\n <br /> \r\n </>\r\n :\r\n <>\r\n <p className=\"caption\">Les paiements indiqués incluent l'offre incitatives actuelle de <span className=\"text--red\">{formatPrice(currentIncentives.value)}</span>. <a className=\"mz-link--black\" onClick={handleContactDealerLinkClick}>Communiquez avec votre concessionnaire Mazda</a> pour les détails.</p>\r\n <br />\r\n </>\r\n :\r\n ''\r\n }\r\n {i18n.language == \"en\" ?\r\n <p className=\"caption\">Informational APR {getInformationalRate()}. The rate selected is a special promotional rate. Alternatively, you can take advantage of cash purchase incentives that cannot be combined with the special promotional rate and your Informational APR would be as outlined above.</p>\r\n :\r\n <p className=\"caption\">TAP informatif {getInformationalRate()}. Le taux sélectionné est un taux promotionnel spécial. Si vous profitez plutôt des offres à l'achat au comptant qui ne peuvent être combinées avec le taux promotionnel spécial, votre TAP informatif serait celui indiqué ci-dessus.</p>\r\n }\r\n </div>\r\n </div>\r\n <OcaModal isOpen={ocaOpen} financeType={financeType} handleClose={setOcaModalOpen}></OcaModal> \r\n </div>\r\n )\r\n}\r\n\r\nLeaseOptions.propTypes = {\r\n\r\n}\r\n\r\nLeaseOptions.defaultProps = {\r\n\r\n}","import React, { useState, useEffect, useRef } from 'react';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport { openModal } from '../../../Helpers/helpers';\r\nimport { getMazdaFeesAndLeviesDetailTitle, formatPrice, getProvince, getLang } from '../../../utils';\r\nimport { CollapseList } from '../Collapse/CollapseList';\r\n\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nimport { Button } from '../../1_Atoms/Button/Button';\r\nimport { Tooltip } from '../../1_Atoms/Tooltip/Tooltip';\r\n\r\nexport const CashOptions = ({ ...props }) => {\r\n const gtmHelper = new GTMHelper();\r\n\r\n const summaryCalculator = window.summaryCalculator;\r\n //Fixed Number provided by API\r\n const currentIncentives = summaryCalculator.FinancialInfo.incentive_programs.find(element => element.type === \"incentive\");\r\n const { t, i18n } = useTranslation(['payments', 'general']);\r\n //const [update, setForceUpdate] = useState('');\r\n const [financialInfo, setFinancialInfo] = useState(summaryCalculator.FinancialInfo);\r\n const [reserveOpen, setReserveModalOpen] = React.useState(false);\r\n\r\n function getMazdaPriceDetails() {\r\n // TODO : THIS HAS MOVED OUT INTO A COLLAPSE BOX, I HAVE COMMENTED DURING THE MERGE FROM DEVELOP - VIET TO WILL\r\n \r\n //<li><p>${t(\"accessories\")}<span class=\"accessory_legal\">${t(\"accLegal\")}</span></p><span>${formatPrice(financialInfo.calculatedCash.accessories.total, true)}</span></li>\r\n return `<ul>\r\n <li><p>${getMazdaFeesAndLeviesDetailTitle(\"Administration Fee\", t)}<sup>9</sup></p><span>${formatPrice(financialInfo.adminServiceFees, true)}</span></li>\r\n <li><p>${t(\"msrp\")}</p><span>${formatPrice(summaryCalculator.SelectedModel.financial.msrp, true)}</span></li>\r\n ${getOptionList()}\r\n <li><p>${t(\"freight\")}</p><span>${formatPrice(financialInfo.freight, true)}</span></li>\r\n <li><p>${t(\"general:pde\")}</p><span>${formatPrice(financialInfo.pde, true)}</span></li>\r\n </ul>`;\r\n\r\n }\r\n\r\n\r\n function getWheelsDetails() {\r\n const options = summaryCalculator.FinancialInfo ?.calculatedFinance ?.options;\r\n\r\n return `<ul>\r\n <li><p>${`4x ${options.wheels.title}`}</p><span>${formatPrice(options.wheels.base_msrp, true)}</span></li>\r\n <li><p>${`4x ${t(\"payments:tpms\")}`}</p><span>${formatPrice(options.wheels.tpms, true)}</span></li>\r\n <li><p>${t(\"payments:installation\")}</p><span>${formatPrice(options.wheels.install_cost, true)}</span></li>\r\n </ul>`;\r\n }\r\n\r\n function getConnectivityDetails() {\r\n const selectedConnectedVehiclePackage = JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage'));\r\n if(selectedConnectedVehiclePackage != null && selectedConnectedVehiclePackage.title != undefined){\r\n const connectedPrice = (JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage')).financial.msrp);\r\n\r\n return `<ul>\r\n <li><p>${`${selectedConnectedVehiclePackage.title}`}</p><span>${formatPrice(connectedPrice, true)}</span></li>\r\n </ul>`;\r\n }\r\n\r\n return '';\r\n }\r\n \r\n function getAccessoriesDetails() {\r\n let accessories = sessionStorage.getItem(Constants.SelectedAccessories);\r\n accessories = JSON.parse(accessories); \r\n \r\n let list = '<ul class=\"cashOptions_accessories\">';\r\n accessories.map((accessory, index) => {\r\n list += `<li><p>${accessory.name}</p><span>${formatPrice(accessory.base_msrp, true)}</span></li>`\r\n list += `<li><p>${accessory.name} - Installation</p><span>${formatPrice(accessory.install_cost, true)}</span></li>`\r\n });\r\n list += '</ul>';\r\n return list;\r\n }\r\n\r\n function getProtectionDetails() {\r\n let list = \"<ul>\";\r\n\r\n if(summaryCalculator.SelectedAddedProtectionPackage.name != undefined ){\r\n list += `<li><p class=\"desc\">${t(\"added_protection\")} <span style=\"text-transform:lowercase\">${summaryCalculator.SelectedAddedProtectionPackage.name}</span></p><span>${formatPrice(summaryCalculator.SelectedAddedProtectionPackage.financial.msrp, true)}</span></li>`\r\n }\r\n if(summaryCalculator.SelectedAppearanceProtectionPlan.name != undefined && summaryCalculator.SelectedAppearanceProtectionPlansIndex !== null) {\r\n\r\n list += `<li><p class=\"desc\">${t(\"appearance_protection\")} <span style=\"text-transform:lowercase\">${summaryCalculator.SelectedAppearanceProtectionPlansPackage.name} for ${summaryCalculator.SelectedAppearanceProtectionPlan.name}</span></p><span>${formatPrice(summaryCalculator.SelectedAppearanceProtectionPlansPackage.financial.msrp, true)}</span></li>`\r\n } \r\n list += \"</ul>\"\r\n return list;\r\n }\r\n\r\n function getMazdaFeesAndLeviesDetails() {\r\n const feesAndLeviesToDisplay = financialInfo.calculatedCash.feesAndLevies.detail.filter(item => item.title !== 'PDE');\r\n \r\n return `<ul>\r\n ${feesAndLeviesToDisplay.map((fee, index) => `<li key=\"${index}\">\r\n <p>${getMazdaFeesAndLeviesDetailTitle(fee.title, t)}${fee.sup ? `<sup>${fee.sup}</sup>` : ''}</p><span>${formatPrice(fee.price, true)}</span>\r\n </li>`).join(\"\")}\r\n </ul>`;\r\n }\r\n\r\n function getMazdaFeesAndLeviesPricingWithoutPDE() {\r\n const total = financialInfo.calculatedCash.feesAndLevies.detail.filter(item => item.title !== 'PDE').reduce((total, fee) => total + fee.price, 0);\r\n return total;\r\n }\r\n\r\n function getRebatesDetails() {\r\n return `<ul>\r\n ${financialInfo.calculatedCash.evRebates.details.map((rebate, index) => `<li key=\"${index}\">\r\n \t<p class=\"text--green\">${rebate.title==='federal'? t('fed_rebate'):t('prov_rebate') + ' ('+getProvince()+')'}</p><span class=\"text--green\">-${formatPrice(rebate.cash, true)}</span>\r\n </li>`).join(\"\")}\r\n </ul>`;\r\n }\r\n\r\n function getMazdaPrice() {\r\n return financialInfo.calculatedCash.mazdaPrice;\r\n }\r\n\r\n function getWheelsPrice() {\r\n const options = summaryCalculator.FinancialInfo ?.calculatedCash ?.options;\r\n\r\n return options.wheels.price;\r\n }\r\n\r\n function getConnectivityPrice() {\r\n const connectedPrice = (JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage')).financial.msrp);\r\n\r\n return connectedPrice;\r\n }\r\n\r\n function getAccessoriesPrice() {\r\n const accessories = summaryCalculator.FinancialInfo ?.calculatedCash ?.accessories;\r\n\r\n return accessories.total;\r\n }\r\n \r\n function getProtectionPrice() {\r\n const protectionPrice = summaryCalculator.SelectedAddedProtectionPackage.financial.msrp + summaryCalculator.SelectedAppearanceProtectionPlansPackage.financial.msrp;\r\n \r\n return protectionPrice;\r\n }\r\n\r\n function openGetLocal(){\r\n const lang = getLang();\r\n gtmHelper.setGTM({'action':'Open Modal','modal': 'Contact Dealer'}, true, false);\r\n\r\n const targetModal = document.getElementById('mz-react-send-build-to-dealer-modal');\r\n if (targetModal && summaryCalculator) {\r\n if (summaryCalculator.SelectedColourExteriorIndex !== 'null' && summaryCalculator.Colours !== null) {\r\n const heading = targetModal.querySelector('.mz-send-build-to-dealer__vehicle-name');\r\n if (heading) {\r\n heading.textContent = lang === 'en' ? summaryCalculator._selectedModelYear.year.title + ' ' + ReactHtmlParser(summaryCalculator._selectedModelYear.carline.title) : ReactHtmlParser(summaryCalculator._selectedModelYear.carline.title) + ' ' + summaryCalculator._selectedModelYear.year.title;\r\n }\r\n }\r\n openModal('mz-react-send-build-to-dealer-modal');\r\n }\r\n }\r\n\r\n async function handleReserveYoursClick() {\r\n const isRetailerMode = await summaryCalculator.isRetailerMode();\r\n summaryCalculator.CurrentPurchaseMethod = 'Cash';\r\n if (isRetailerMode) {\r\n setReserveModalOpen(true);\r\n } else {\r\n openGetLocal();\r\n }\r\n }\r\n\r\n function getCreditsDetails() {\r\n const currentIncentives =financialInfo.incentive_programs.find(element => element.type === \"incentive\");\r\n\r\n return `<ul class=\"negative\">\r\n ${financialInfo.calculatedCash.incentives.taxable.details.map((incentive, index) => {\r\n const price = incentive.cash_value ? incentive.cash_value : incentive.value;\r\n return `<li key=\"${index}\">\r\n <p>${getIncentiveDisplayName(incentive)}</p><span>-${formatPrice(price, true)}</span>\r\n </li>`;\r\n }).join(\"\")}\r\n ${financialInfo.calculatedCash.incentives.nonTaxable.details.map((incentive, index) => {\r\n const price = incentive.cash_value ? incentive.cash_value : incentive.value;\r\n return `<li key=\"${index}\">\r\n <p>${getIncentiveDisplayName(incentive)}</p><span>-${formatPrice(price, true)}</span>\r\n </li>`;\r\n }).join(\"\")}\r\n ${(currentIncentives.value > 0) ? `<li>\r\n <p>${t(\"current_incentive\")}</p>\r\n <span>${currentIncentives?'-':''}${formatPrice(currentIncentives.value, true)}</span>\r\n </li>`:''}\r\n ${(summaryCalculator.FinancialInfo.mazdaCashIncentive > 0) ? `<li>\r\n <p>${t(\"mazda_cash_incentive\")}</p>\r\n <span style=\"white-space: nowrap;\">${summaryCalculator.FinancialInfo.mazdaCashIncentive?'-':''}${formatPrice(summaryCalculator.FinancialInfo.mazdaCashIncentive, true)}</span>\r\n </li>`:''}\r\n <li>\r\n <p>${t(\"trade_in\")}<sup>1</sup></p><span>${financialInfo.tradeInValue>0?'-':''}${formatPrice(financialInfo.tradeInValue, true)}</span>\r\n </li>\r\n </ul>`;\r\n }\r\n\r\n function getIncentiveDisplayName(incentive) {\r\n switch(incentive.type) {\r\n case \"loyalty\" :\r\n return t(\"mazda_owner_loyalty_program\");\r\n case \"military\":\r\n return t(\"mazda_military_program\");\r\n case \"grad_award\":\r\n return t(\"mazda_graduate_program_award\");\r\n case \"first_time_owner\":\r\n return t(\"mazda_first_time_owner\"); \r\n default:\r\n return incentive.type;\r\n }\r\n }\r\n\r\n function getOptionList() {\r\n let optionList = '';\r\n \r\n const options = summaryCalculator.FinancialInfo ?.calculatedFinance ?.options;\r\n\r\n if(options.exteriorColour.price >0){\r\n optionList += ` <li class=\"finance-list__item\">\r\n <p class=\"desc\">${t('exterior')} ${options.exteriorColour.description}</p>\r\n <span class=\"price\">${formatPrice(options.exteriorColour.price, true)}</span>\r\n </li>`\r\n }\r\n if(options ?.interiorColour.price >0){\r\n optionList += ` <li class=\"finance-list__item\">\r\n <p class=\"desc\">${t('interior')} ${options.interiorColour.description}</p>\r\n <span class=\"price\">${formatPrice(options.interiorColour.price, true)}</span>\r\n </li>`\r\n }\r\n if(options ?.model_option_package ?.financial ?.msrp >0){\r\n optionList += ` <li class=\"finance-list__item\">\r\n <p class=\"desc\">${t('package')} ${options.model_option_package.name}</p>\r\n <span class=\"price\">${formatPrice(options.model_option_package.financial.msrp, true)}</span>\r\n </li>`\r\n }\r\n/*\r\n const selectedWarrantyPackage = JSON.parse(sessionStorage.getItem('selectedWarrantyPackage'));\r\n if(selectedWarrantyPackage != null && selectedWarrantyPackage.name != undefined ){\r\n const warrantyPrice = (JSON.parse(sessionStorage.getItem('selectedWarrantyPackage')).financial.msrp);\r\n optionList += ` <li class=\"finance-list__item\">\r\n <p class=\"desc\">${t(\"warranties\")} ${selectedWarrantyPackage.name}</p>\r\n <span class=\"price\">${formatPrice(warrantyPrice, true)}</span>\r\n </li>`\r\n } \r\n \r\n const selectedConnectedVehiclePackage = JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage'));\r\n if(selectedConnectedVehiclePackage != null && selectedConnectedVehiclePackage.title != undefined){\r\n const connectedPrice = (JSON.parse(sessionStorage.getItem('selectedConnectedVehiclePackage')).financial.msrp);\r\n optionList += ` <li class=\"finance-list__item\">\r\n <p class=\"desc\">${t(\"connected\")} <span style=\"text-transform:lowercase\">${selectedConnectedVehiclePackage.title}</span></p>\r\n <span class=\"price\">${formatPrice(connectedPrice, true)}</span>\r\n </li>`\r\n }\r\n\r\n const selectedAddedProtectionPackage = summaryCalculator.SelectedAddedProtectionPackage;\r\n if(selectedAddedProtectionPackage && selectedAddedProtectionPackage.name){\r\n const selectedAddedProtectionPackagePrice = selectedAddedProtectionPackage.financial.msrp;\r\n optionList += ` <li class=\"finance-list__item\">\r\n <p class=\"desc\">${t(\"added_protection\")} <span style=\"text-transform:lowercase\"> ${selectedAddedProtectionPackage.name}</span></p>\r\n <span class=\"price\">${formatPrice(selectedAddedProtectionPackagePrice, true)}</span>\r\n </li>`\r\n } \r\n\r\n const appearanceProtectionPlan = summaryCalculator.SelectedAppearanceProtectionPlan;\r\n const selectedAppearanceProtectionPlansPackage = summaryCalculator.SelectedAppearanceProtectionPlansPackage; JSON.parse(sessionStorage.getItem('selectedAppearanceProtectionPlansPackage'));\r\n if(appearanceProtectionPlan.name && selectedAppearanceProtectionPlansPackage.name){\r\n const selectedAppearanceProtectionPlansPackagePrice = selectedAppearanceProtectionPlansPackage.financial.msrp;\r\n optionList += ` <li class=\"finance-list__item\">\r\n <p class=\"desc\">${t(\"appearance_protection\")} <span>${appearanceProtectionPlan.name}</span>${selectedAppearanceProtectionPlansPackage.name}</p>\r\n <span class=\"price\">${formatPrice(selectedAppearanceProtectionPlansPackagePrice, true)}</span>\r\n </li>`\r\n }\r\n \r\n if(options.wheels.price >0){\r\n optionList += ` <li class=\"finance-list__item\">\r\n <p class=\"desc\">${options.wheels.title}</p>\r\n <span class=\"price\">${formatPrice(options.wheels.price, true)}</span>\r\n </li>`\r\n }*/\r\n\r\n return optionList;\r\n }\r\n\r\n function getCashPrice() {\r\n //let financePricing = null;\r\n let cashPricing = null;\r\n if(summaryCalculator.IncludeFees){\r\n if(summaryCalculator.IncludeTaxes){\r\n if(summaryCalculator.IncludeRebates){\r\n // financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinanceWithFeesWithRebatesTaxed : financialInfo.calculatedLease.balanceToLeaseWithFeesWithRebatesTaxed;\r\n cashPricing = financialInfo.calculatedCash.subtotalWithFeesWithRebatesTaxed;\r\n }else{\r\n //financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinanceWithFeesTaxed : financialInfo.calculatedLease.balanceToLeaseWithFees;\r\n cashPricing = financialInfo.calculatedCash.subtotalWithFeesTaxed;\r\n }\r\n }else{\r\n if(summaryCalculator.IncludeRebates){\r\n //financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinanceWithFeesWithRebates : financialInfo.calculatedLease.balanceToLeaseWithFeesWithRebates;\r\n cashPricing = financialInfo.calculatedCash.subtotalWithFeesWithRebatesAndEvRebates;\r\n }else{\r\n //financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinanceWithFees : financialInfo.calculatedLease.balanceToLeaseWithFees\r\n cashPricing = financialInfo.calculatedCash.subtotalWithFees;\r\n }\r\n }\r\n }else{\r\n if(summaryCalculator.IncludeTaxes){\r\n if(summaryCalculator.IncludeRebates){\r\n //financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinanceWithRebatesTaxed : financialInfo.calculatedLease.balanceToLeaseWithRebates;\r\n cashPricing = financialInfo.calculatedCash.subtotalWithIncentiveRebatesAndEvRebatesTaxed;\r\n }else{\r\n //financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinanceTaxed : financialInfo.calculatedLease.balanceToLease;\r\n cashPricing = financialInfo.calculatedCash.subtotalTaxed;\r\n }\r\n }else{\r\n if(summaryCalculator.IncludeRebates){\r\n //financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinanceWithRebates : financialInfo.calculatedLease.balanceToLeaseWithRebates;\r\n cashPricing = financialInfo.calculatedCash.subtotalWithIncentiveRebatesAndEvRebates;\r\n }else{\r\n //financePricing = showFinancePrice ? financialInfo.calculatedFinance.balanceToFinance : financialInfo.calculatedLease.balanceToLease;\r\n cashPricing = financialInfo.calculatedCash.subtotal;\r\n }\r\n }\r\n }\r\n\r\n //for get local price form to grab\r\n summaryCalculator.CurrentCalculatedCash = formatPrice(cashPricing, true);\r\n }\r\n \r\n function canDisplayRebates() {\r\n if(!summaryCalculator.IncludeRebates) \r\n return false;\r\n\r\n return summaryCalculator.FinancialInfo.ev_rebates && summaryCalculator.FinancialInfo.ev_rebates.length > 0;\r\n }\r\n\r\n /* START HORRIBLE HACK */\r\n /* TODO : MOVE TRANSLATION TEXT IN RESOURCE FILE AND MAKE A GENERIC FUNCTION FOR THE SPECIALITY \"WORD\" */\r\n function isEnglish() {\r\n return getLang() === 'en';\r\n }\r\n \r\n function getDisplayableProvinceName() {\r\n const provinceCode = getProvince().toLowerCase();\r\n const provinceNames = {\r\n 'on': { en: 'Ontario', fr: 'en Ontario' },\r\n 'qc': { en: 'Quebec', fr: 'au Québec' },\r\n 'ab': { en: 'Alberta', fr: 'en Alberta' },\r\n 'bc': { en: 'British Columbia', fr: 'au Colombie Britanique' },\r\n 'mb': { en: 'Manitoba', fr: 'au Manitoba' },\r\n 'nb': { en: 'New Brunswick', fr: 'au Nouveau-Brunswick' },\r\n 'nl': { en: 'Newfoundland', fr: 'à Terre-Neuve-et-Labrador' },\r\n 'nt': { en: 'North-West Territories', fr: 'à Territoires du nord-ouest' },\r\n 'ns': { en: 'Nova Scotia', fr: 'en Nouvelle-Écosse' },\r\n 'nu': { en: 'Nunavut', fr: 'au Nanavut' },\r\n 'pe': { en: 'Prince Edward Island', fr: \"à l'ÃŽle-du-Prince-Édouard\" },\r\n 'sk': { en: 'Saskatchewan', fr: 'en Saskatchewan' },\r\n 'yt': { en: 'Yukon', fr: 'au Yukon' },\r\n };\r\n \r\n const provinceName = provinceNames[provinceCode];\r\n return provinceName ? provinceName[isEnglish() ? 'en' : 'fr'] : '';\r\n }\r\n \r\n function getAccessoriesTooltipText() {\r\n const provinceName = getDisplayableProvinceName();\r\n \r\n const text = isEnglish()\r\n ? `Labour for installation is calculated using average labour rates in ${provinceName}.`\r\n : `Le coût de la main-d'Å“uvre pour l'installation est calculé en fonction du tarif horaire moyen ${provinceName}.`;\r\n \r\n return text;\r\n }\r\n\r\n function getTooltipText() {\r\n const lang = getLang();\r\n \r\n return lang === 'en' ? `Labour for installation is calculated using average labour rates in ${getDisplayableProvinceName()}.` : `Le coût de la main-d'Å“uvre pour l'installation est calculé en fonction du tarif horaire moyen ${getDisplayableProvinceName()}.`;\r\n }\r\n /* END HORRIBLE HACK */\r\n\r\n useEffect(() => {\r\n console.log('data has changed need a refresh cash section');\r\n\r\n //setForceUpdate(Math.random());\r\n setFinancialInfo(summaryCalculator.FinancialInfo);\r\n }, [summaryCalculator._tradeInValue, summaryCalculator._downPaymentValue, summaryCalculator.LoyaltyChecked, summaryCalculator.GraduateChecked, summaryCalculator.MilitaryChecked, summaryCalculator.FirstTimeOwnerChecked, summaryCalculator.IncludeFees, summaryCalculator.IncludeTaxes, summaryCalculator.IncludeRebates]);\r\n\r\n return (\r\n <div className=\"mz-cahs-options\">\r\n <h4>{t(\"cash_purchase_price\")}</h4>\r\n <div className=\"mz-cahs-options__count\">\r\n <div className=\"mz-cahs-options__count-item \">\r\n <div>{t(\"purchase_price\")} <Tooltip TooltipName=\"purchase_price\" /></div>\r\n {getCashPrice()}\r\n {/* {summaryCalculator.IncludeFees && summaryCalculator.IncludeTaxes && summaryCalculator.IncludeRebates ? <span className='mmz-cahs-options__price'>{`${formatPrice(financialInfo.calculatedCash.subtotalWithFeesWithRebatesTaxed, true)}`}</span> : null}\r\n {!summaryCalculator.IncludeFees && summaryCalculator.IncludeTaxes && summaryCalculator.IncludeRebates ? <span className='mmz-cahs-options__price'>{`${formatPrice(financialInfo.calculatedCash.subtotalWithIncentiveRebatesAndEvRebatesTaxed, true)}`}</span> : null}\r\n {summaryCalculator.IncludeFees && !summaryCalculator.IncludeTaxes && summaryCalculator.IncludeRebates ? <span className='mmz-cahs-options__price'>{`${formatPrice(financialInfo.calculatedCash.subtotalWithFeesWithRebatesAndEvRebates, true)}`}</span> : null}\r\n {summaryCalculator.IncludeFees && summaryCalculator.IncludeTaxes && !summaryCalculator.IncludeRebates ? <span className='mmz-cahs-options__price'>{`${formatPrice(financialInfo.calculatedCash.subtotalWithFeesTaxed, true)}`}</span> : null}\r\n {summaryCalculator.IncludeFees && !summaryCalculator.IncludeTaxes && !summaryCalculator.IncludeRebates ? <span className='mmz-cahs-options__price'>{`${formatPrice(financialInfo.calculatedCash.subtotalWithFees, true)}`}</span> : null}\r\n {!summaryCalculator.IncludeFees && summaryCalculator.IncludeTaxes && !summaryCalculator.IncludeRebates ? <span className='mmz-cahs-options__price'>{`${formatPrice(financialInfo.calculatedCash.subtotalTaxed, true)}`}</span> : null}\r\n {!summaryCalculator.IncludeFees && !summaryCalculator.IncludeTaxes && summaryCalculator.IncludeRebates ? <span className='mmz-cahs-options__price'>{`${formatPrice(financialInfo.calculatedCash.subtotalWithIncentiveRebatesAndEvRebates, true)}`}</span> : null}\r\n {!summaryCalculator.IncludeFees && !summaryCalculator.IncludeTaxes && !summaryCalculator.IncludeRebates ? <span className='mmz-cahs-options__price'>{`${formatPrice(financialInfo.calculatedCash.subtotal, true)}`}</span> : null} */}\r\n\r\n </div>\r\n </div>\r\n\r\n <div className=\"mz-financial--details\">\r\n < CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price\" ColCarText1={`${t('cash_price')}`} ColBoxText={getMazdaPriceDetails()} ColClassPrice=\"mz-collapse__price\" TooltipName=\"detailedprice_mazdaprice\" ColPrices={`${formatPrice(getMazdaPrice(), true)}`} id={t('cash_price').replace(/[^0-9a-z]/gi, '_')} />\r\n \r\n {financialInfo ?.calculatedFinance ?.options.wheels.title ? \r\n < CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price\" ColCarText1={t(\"cash_option_wheels\")} ColBoxText={getWheelsDetails()} ColClassPrice=\"mz-collapse__price\" TooltipName=\"\" TooltipText={ReactHtmlParser(getTooltipText())} ColPrices={`${formatPrice(getWheelsPrice(), true)}`} id={t(\"cash_option_wheels\").replace(/[^0-9a-z]/gi, '_')} />\r\n : null}\r\n\r\n {summaryCalculator.SelectedConnectedVehiclePackage.financial.msrp ?\r\n < CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price\" ColCarText1={t(\"cash_option_connectivity\")} ColBoxText={getConnectivityDetails()} ColClassPrice=\"mz-collapse__price\" TooltipName=\"\" ColPrices={`${formatPrice(getConnectivityPrice(), true)}`} id={t(\"cash_option_connectivity\").replace(/[^0-9a-z]/gi, '_')} />\r\n : null }\r\n\r\n {financialInfo ?.calculatedFinance ?.accessories.total ? \r\n < CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price\" ColCarText1={t(\"cash_option_accessories\")} ColBoxText={getAccessoriesDetails()} ColClassPrice=\"mz-collapse__price\" TooltipName=\"\" TooltipText={getAccessoriesTooltipText()} ColPrices={`${formatPrice(getAccessoriesPrice(), true)}`} id={t(\"cash_option_accessories\").replace(/[^0-9a-z]/gi, '_')} />\r\n : null }\r\n\r\n {summaryCalculator.SelectedAddedProtectionPackage.name || summaryCalculator.SelectedAppearanceProtectionPlansIndex !== null ? \r\n < CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price\" ColCarText1={t(\"cash_option_protection\")} ColBoxText={getProtectionDetails()} ColClassPrice=\"mz-collapse__price\" TooltipName=\"\" ColPrices={`${formatPrice(getProtectionPrice(), true)}`} id={t(\"cash_option_protection\").replace(/[^0-9a-z]/gi, '_')} />\r\n : null } \r\n\r\n\t\t\t\t{canDisplayRebates() ?< CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price evRebates\" ColCarText1={t(\"gov_rebates\")} ColBoxText={getRebatesDetails()} ColClassPrice=\"mz-collapse__price\" ColPrices={`${financialInfo.calculatedCash.evRebates.total.cash>0?'-':''}${formatPrice(financialInfo.calculatedCash.evRebates.total.cash, true)}`} id={t(\"gov_rebates\").replace(/[^0-9a-z]/gi, '_')} />:null}\r\n {summaryCalculator.IncludeFees?< CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price\" ColCarText1={`${t('cash_fees')}`} ColBoxText={getMazdaFeesAndLeviesDetails()} ColClassPrice=\"mz-collapse__price\" TooltipName=\"detailedprice_feesandlevies\" ColPrices={`${formatPrice(getMazdaFeesAndLeviesPricingWithoutPDE(), true)}`} id={t(\"cash_fees\").replace(/[^0-9a-z]/gi, '_')} />:null}\r\n {summaryCalculator.IncludeTaxes?<div className=\"mz-financial__non-collapse\"><div className=\"mz-financial__non-collapse__title\">{t(\"taxes\")}</div>\r\n { summaryCalculator.IncludeFees && summaryCalculator.IncludeTaxes && summaryCalculator.IncludeRebates ? <span className='mz-financial__non-collapse__price'>{`${formatPrice(financialInfo.calculatedCash.subtotalWithFeesWithRebatesTaxes, true)}`}</span> : null}\r\n {!summaryCalculator.IncludeFees && summaryCalculator.IncludeTaxes && summaryCalculator.IncludeRebates ? <span className='mz-financial__non-collapse__price'>{`${formatPrice(financialInfo.calculatedCash.subtotalWithIncentiveRebatesAndEvRebatesTaxes, true)}`}</span> : null}\r\n { summaryCalculator.IncludeFees && summaryCalculator.IncludeTaxes && !summaryCalculator.IncludeRebates ? <span className='mz-financial__non-collapse__price'>{`${formatPrice(financialInfo.calculatedCash.subtotalWithFeesTaxes, true)}`}</span> : null}\r\n {!summaryCalculator.IncludeFees && summaryCalculator.IncludeTaxes && !summaryCalculator.IncludeRebates ? <span className='mz-financial__non-collapse__price'>{`${formatPrice(financialInfo.calculatedCash.subtotalTaxes, true)}`}</span> : null}\r\n </div>:null}\r\n < CollapseList CollapseClasses=\"mz-collapse__button mz-collapse__button--transparent mz-collapse__button--price negative\" ColCarText1={`${t('cash_credits')}`} TooltipName=\"detailedprice_credit\" ColBoxText={getCreditsDetails()} ColClassPrice=\"mz-collapse__price\" ColPrices={`${currentIncentives.value + financialInfo.calculatedCash.incentives.taxable.total + financialInfo.calculatedCash.incentives.nonTaxable.total + financialInfo.tradeInValue + summaryCalculator.FinancialInfo.mazdaCashIncentive >0?'-':''}${formatPrice(currentIncentives.value + financialInfo.calculatedCash.incentives.taxable.total + financialInfo.calculatedCash.incentives.nonTaxable.total + financialInfo.tradeInValue + summaryCalculator.FinancialInfo.mazdaCashIncentive, true)}`} id={t(\"cash_credits\").replace(/[^0-9a-z]/gi, '_')} />\r\n <div className=\"mz-financial__non-collapse negative\"><div className=\"mz-financial__non-collapse__title\">{t(\"down_payment\")}<sup>2</sup> <Tooltip TooltipName=\"detailedprice_downpayment\" /></div><span className=\"mz-financial__non-collapse__price\">{financialInfo.downPaymentValue > 0 ? '-':''}{formatPrice(financialInfo.downPaymentValue, true)}</span></div>\r\n <div className=\"mz-financial--cta hidden\">\r\n <Button primary={true} label={String(t(\"summary:btn_reserve_yours\"))} iconBefore={false} onClick={handleReserveYoursClick}/>\r\n </div>\r\n <div className=\"mz-spacer mz-spacer-s\"></div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n//ev_rebates >0? evRebate.getRebate(ev_rebates, 'general', true)","import React from 'react';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport { Svg } from '../../1_Atoms/Svg/Svg';\r\nimport PropTypes from 'prop-types';\r\n\r\n\r\nexport const TradeInModal = ({modalContent, checkTradeInValue, isOpen, modalId, handleClose, setFinancialInfo, ...props }) => {\r\n const summaryCalculator = window.summaryCalculator;\r\n const { t } = useTranslation(['summary', 'general']);\r\n //const [reserveOpen, setReserveOpen] = React.useState(isOpen);\r\n\r\n React.useEffect(() => {\r\n // Restart React Forms app.\r\n // Skip if this is the first time loading it because App.js takes care of it.\r\n if (window.isReactFormsAppLoaded && typeof window.initReactFormsApp === 'function') {\r\n window.initReactFormsApp();\r\n }\r\n }, [isOpen]);\r\n\r\n return (\r\n <div className=\"mz-modal modal\" id={modalId} aria-hidden={!isOpen}>\r\n <div className=\"wrapper\">\r\n <div className=\"mz-modal__container\">\r\n <div className=\"mz-modal__content\">\r\n <button className=\"mz-modal__close\" aria-label=\"Close Modal\" onClick={async () => {\r\n\t\t\t\t\t\t\tdocument.querySelector('body').classList.remove('disabled');\r\n //set the trade in valuue if avail\r\n if(Number(summaryCalculator._tradeInValue) > 0){\r\n checkTradeInValue(summaryCalculator._tradeInValue);\r\n setFinancialInfo(await summaryCalculator.RecalculateFinancialInfo());\r\n }\r\n\r\n\t\t\t\t\t\t\thandleClose(false)\r\n\t\t\t\t\t\t}}>\r\n <Svg\r\n colour=\"grey\"\r\n size={1.93}\r\n svg_list=\"x\"\r\n />\r\n </button>\r\n <div className=\"mz-modal__text-container\">\r\n {isOpen &&\r\n <>\r\n <div className=\"mzReactForms\">\r\n <input type=\"hidden\" data-mz-form-field-name=\"formType\" value=\"TradeInEstimator\"/>\r\n <input type=\"hidden\" data-mz-form-field-name=\"source\" value=\"WC\"/>\r\n <input type=\"hidden\" data-mz-form-field-name=\"formDisclaimer\" value={t(\"form_disclaimer_retailer\")}/>\r\n <div class=\"mz-react-forms-root\"></div>\r\n <div className=\"mz-react-forms-root\"></div>\r\n </div>\r\n </>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nTradeInModal.propTypes = {\r\n HandleTabClick: PropTypes.func,\r\n}\r\n\r\nTradeInModal.defaultProps = {\r\n handleClose: () => {\r\n },\r\n};","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nimport { formatPrice, getBaseUrl, getProvince } from '../../../utils'\r\n\r\nimport SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\n\r\nimport { Tooltip } from '../../1_Atoms/Tooltip/Tooltip';\r\nimport { TradeInModal } from '../../3_Organisms/Modal/TradeInModal';\r\n\r\nexport const PricePayment = ({ incentives, tradeInValue, checkTradeInValue, downPaymentValue, loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked, setDownPaymentInput, onBlurDownPaymentInput, setTradeInInput, onBlurTradeInInput, setLoyaltyChecked, setGraduateChecked, setMilitaryChecked, setFirstTimeOwnerChecked, setFinancialInfo, title, ...props }) => {\r\n\tconst summaryCalculator = new SummaryCalculator().reloadStoredData();\r\n\tconst evRebates = summaryCalculator.FinancialInfo.ev_rebates;\r\n const { t, i18n } = useTranslation(['payments', 'general', 'summary']);\r\n const tradeInLink = i18n.language === \"en\" ? `${getBaseUrl()}/en/shopping/trade-in-estimator/?bnp=1` : `${getBaseUrl()}/fr/magasiner/Estimateur-de-la-valeur-dechange/?bnp=1`;\r\n\tconst incentive_img_path = getBaseUrl() + t(\"payments:incentive_img\");\r\n\t\r\n\tconst [isTradeOpen, setIsTradeOpen] = React.useState(false);\r\n\r\n\tconst gtmHelper = new GTMHelper();\r\n\tconst carline = summaryCalculator.VehicleTitle;\r\n\r\n\tsessionStorage.setItem('curr_BNP_URL', 'https://' + window.location.host + window.location.pathname + window.location.hash.split('?')[0]);\r\n\t\r\n\tfunction isFirstTimeOwnerGreyOut() {\r\n\t\t// Uncheck\r\n\t\tif(!loyaltyChecked && !firstTimeOwnerChecked)\r\n\t\t\treturn '';\r\n\r\n\t\t// Checked\r\n\t\treturn !firstTimeOwnerChecked ? 'grey-out' : ''\r\n\t}\r\n\r\n\tfunction isLoyaltyGreyOut() {\r\n\t\t// Uncheck\r\n\t\tif(!loyaltyChecked && !firstTimeOwnerChecked)\r\n\t\t\treturn '';\r\n\r\n\t\t// Checked\r\n\t\treturn !loyaltyChecked ? 'grey-out' : '';\r\n\t}\r\n\r\n\tReact.useEffect(()=>{\r\n\t\twindow.addEventListener(\"message\", async function (e) {\r\n if (e.data.type === \"formEvent\") {\r\n console.log(\r\n `received message: ${e.data.message}`\r\n )\r\n \r\n // If the message 'close' is passed, close the trade-in modal\r\n if (e.data.message === \"close\") {\r\n setIsTradeOpen(false);\r\n }\r\n }else if(e.data.type==='setTradeInVal'){\r\n\t\t\t\tcheckTradeInValue(e.data.message);\r\n\t\t\t\tsetFinancialInfo(await summaryCalculator.RecalculateFinancialInfo());\r\n\t\t\t}\r\n });\r\n\t},[tradeInValue])\r\n return (\r\n\t\t<div className=\"mz-bg--off-white mz-price-payment-container\">\r\n\t <div className=\"mz-price-payment desktop-center\">\r\n\t <h1 className='mz-price-payment__title'>{ReactHtmlParser(title)}</h1>\r\n\t {incentives.incentive && incentives.incentive.value > 0?<div className=\"mz-price-payment__connect\">\r\n\t <div >\r\n\t {/*<img src={incentive_img_path} alt=\"Mazda Incentives\"/>*/}\r\n\t\t\t\t\t\t<strong>{t(\"current_incentive\")}</strong>\r\n\t <Tooltip TooltipName=\"incentives\" incentives={incentives.incentive.value}/>\r\n\t </div>\r\n\t <span className=\"mz-price-payment__discount-price\">{`-${formatPrice(incentives.incentive.value)}`}</span>\r\n\t\t\t\t</div>:null}\r\n\t {summaryCalculator.FinancialInfo.mazdaCashIncentive && summaryCalculator.FinancialInfo.mazdaCashIncentive > 0?<div className=\"mz-price-payment__connect\">\r\n\t <div >\r\n\t {/*<img src={incentive_img_path} alt=\"Mazda Incentives\"/>*/}\r\n\t\t\t\t\t\t<strong>{t(\"mazda_cash_incentive_title\")}</strong>\r\n\t <Tooltip TooltipName=\"mazda_cash_incentive\" incentives={summaryCalculator.FinancialInfo.mazdaCashIncentive}/>\r\n\t </div>\r\n\t <span className=\"mz-price-payment__discount-price\">{`-${formatPrice(summaryCalculator.FinancialInfo.mazdaCashIncentive)}`}</span>\r\n\t\t\t\t</div>:null}\t\t\t\t\r\n\t\t\t\t{ evRebates && evRebates.length > 0 ?\r\n\t\t\t\t<>\r\n\t\t\t\t {evRebates[0] && evRebates[0].province==='federal'?<div className=\"mz-price-payment__connect\">\r\n\t <div >\r\n\t {t(\"fed_rebate\")}<sup>★</sup>\r\n\t <Tooltip TooltipName=\"ev_rebate_federal\" incentives={formatPrice(evRebates[0].cash)} vehicle={carline}/>\r\n\t </div>\r\n\t <span className=\"mz-price-payment__discount-price text--green\">{t(\"up_to\")} {formatPrice(evRebates[0].cash)}</span>\r\n\t </div>: ''}\r\n\t\t\t\t{evRebates[1] && evRebates[1].province==getProvince()?<div className=\"mz-price-payment__connect\">\r\n\t <div >\r\n\t {t(\"prov_rebate\")} ({getProvince()})<sup>★</sup>\r\n\t <Tooltip TooltipName={'ev_rebates_'+getProvince()} incentives={formatPrice(evRebates[1].cash)} vehicle={carline}/>\r\n\t </div>\r\n\t <span className=\"mz-price-payment__discount-price text--green\">{t(\"up_to\")} {formatPrice(evRebates[1].cash)}</span>\r\n\t </div>:''}\r\n\t\t\t\t{evRebates[0] && evRebates[0].province==getProvince()?<div className=\"mz-price-payment__connect\">\r\n\t <div >\r\n\t {t(\"prov_rebate\")} ({getProvince()})<sup>★</sup>\r\n\t <Tooltip TooltipName={'ev_rebates_'+getProvince()} incentives={formatPrice(evRebates[0].cash)} vehicle={carline}/>\r\n\t </div>\r\n\t <span className=\"mz-price-payment__discount-price text--green\">{t(\"up_to\")} {formatPrice(evRebates[0].cash)}</span>\r\n\t </div>:''}\r\n\r\n\t\t\t\t</> : '' }\r\n\t <div className=\"mz-price-payment__trade\">\r\n\t <label>{t(\"trade_in\")}<sup>1</sup> <a class=\"mz-link label text--grey\"\r\n\t\t\t\t\tonClick={async (e) => {\r\n\t\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\t\tsummaryCalculator.TradeInValue = 0;\r\n\t\t\t\t\t\tconst isRetailerMode = await summaryCalculator.isRetailerMode();\r\n\t\t\t\t\t\tif(isRetailerMode){\r\n\t\t\t\t\t\t\tsetIsTradeOpen(true);\r\n\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\twindow.location.href= tradeInLink;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t}}>{t(\"estimate_your_trade_in_value\")}</a></label>\r\n\t <input type=\"text\" value={tradeInValue.replace('$', '') === '0' ? '' : tradeInValue} placeholder={t('payments:input_placeholder')} onChange={setTradeInInput} onBlur={onBlurTradeInInput} className=\"base trade-input\" />\r\n\t </div>\r\n\t <div className=\"mz-price-payment__down\">\r\n\t <div className=\"mz-price-payment__label_container\"><label>{t(\"down_payment\")}<sup>2</sup></label> <Tooltip TooltipName=\"downpayment\"/></div>\r\n\t <input type=\"text\" value={downPaymentValue.replace('$', '') === '0' ? '' : downPaymentValue} placeholder={t('payments:input_placeholder')} onChange={setDownPaymentInput} onBlur={onBlurDownPaymentInput} className=\"base down-input\" />\r\n\t </div>\r\n\t {incentives.first_time_owner.value ?<div className={`mz-price-payment__firsttimeowner ${isFirstTimeOwnerGreyOut()}`}>\r\n\t <div className='mz-price-payment__checkbox'><input type=\"checkbox\" className={`${isFirstTimeOwnerGreyOut()}`} checked={firstTimeOwnerChecked} onChange={()=>{\r\n\t\t\t\t\t\tsetFirstTimeOwnerChecked(!firstTimeOwnerChecked); \r\n\t\t\t\t\t\tgtmHelper.setGTM({'action':'Checkbox', 'type': 'FirstTimeOwner', 'value': firstTimeOwnerChecked}, true , false);\r\n\t\t\t\t\t}} id=\"firstTimeOwner\" /><div className=\"mz-price-payment__label_container\"><label id=\"labelFirstTimeOwner\" className={isFirstTimeOwnerGreyOut()} htmlFor=\"firstTimeOwner\">{ReactHtmlParser(t(\"mazda_first_time_owner_checkbox_title\"))}</label> <Tooltip TooltipName=\"first_time_owner\"/></div></div>\r\n\t {firstTimeOwnerChecked?<span className=\"mz-price-payment__discount-price\">{`-${formatPrice(incentives.first_time_owner.value)}`}</span>:null}\r\n\t </div>:null}\r\n\t\t\t\t\r\n\t {incentives.loyalty ?<div className={`mz-price-payment__loyalty`} >\r\n\t <div className='mz-price-payment__checkbox'><input type=\"checkbox\" className={isLoyaltyGreyOut()} checked={loyaltyChecked} onChange={()=>{\r\n\t\t\t\t\t\tsetLoyaltyChecked(!loyaltyChecked);\r\n\t\t\t\t\t\tgtmHelper.setGTM({'action':'Checkbox', 'type': 'Loyalty', 'value': loyaltyChecked}, true , false);\r\n\t\t\t\t\t}} id=\"loyalty\" /><div className=\"mz-price-payment__label_container\"><label className={isLoyaltyGreyOut()} htmlFor=\"loyalty\">{loyaltyChecked ? ReactHtmlParser(t(\"mazda_owner_loyalty_program_with_subtitle\")) : t(\"mazda_owner_loyalty_program\")}</label> <Tooltip TooltipName=\"ownerloyaltyprogram\" incentives={formatPrice(incentives.loyalty.cash_value)} rate={`${formatPrice(incentives.loyalty.rate_value * 100, true).replace('$', '')}`}/></div></div>\r\n\t </div>:null}\r\n\t {incentives.grad_award?<div className=\"mz-price-payment__graduate\">\r\n\t <div className='mz-price-payment__checkbox'><input type=\"checkbox\" checked={graduateChecked} onChange={()=>{\r\n\t\t\t\t\t\tsetGraduateChecked(!graduateChecked);\r\n\t\t\t\t\t\tgtmHelper.setGTM({'action':'Checkbox', 'type': 'Graduate', 'value': graduateChecked}, true , false);\r\n\t\t\t\t\t}} id=\"graduate\" /><div className=\"mz-price-payment__label_container\"><label htmlFor=\"graduate\">{t(\"mazda_graduate_program_award\")}</label> <Tooltip TooltipName=\"graduate\"/></div></div>\r\n\t {graduateChecked?<span className=\"mz-price-payment__discount-price\">{`-${formatPrice(incentives.grad_award.value)}`}</span>:null}\r\n\t </div>:null}\r\n\t {incentives.military?<div className=\"mz-price-payment__military\">\r\n\t <div className='mz-price-payment__checkbox'><input type=\"checkbox\" checked={militaryChecked} onChange={()=>{\r\n\t\t\t\t\t\tsetMilitaryChecked(!militaryChecked);\r\n\t\t\t\t\t\tgtmHelper.setGTM({'action':'Checkbox', 'type': 'Military', 'value': militaryChecked}, true , false);\r\n\t\t\t\t\t}} id=\"military\" /><div className=\"mz-price-payment__label_container\"><label htmlFor=\"military\">{t(\"mazda_military_program\")}</label> <Tooltip TooltipName=\"military\"/></div></div>\r\n\t {militaryChecked?<span className=\"mz-price-payment__discount-price\">{`-${formatPrice(incentives.military.value)}`}</span>:null}\r\n\t </div>:null}\r\n\t\t\t</div>\r\n\t\t\t<TradeInModal isOpen={isTradeOpen} checkTradeInValue={checkTradeInValue} handleClose={setIsTradeOpen} setFinancialInfo={setFinancialInfo}></TradeInModal> \r\n </div>\r\n )\r\n}\r\n\r\nPricePayment.propTypes = {\r\n setMoneyInput: PropTypes.func,\r\n setLoyaltyChecked: PropTypes.func,\r\n setGraduateChecked: PropTypes.func,\r\n setMilitaryChecked: PropTypes.func,\r\n\tsetFirstTimeOwnerChecked: PropTypes.func\r\n}\r\n\r\nPricePayment.defaultProps = {\r\n setMoneyInput: () => {},\r\n setLoyaltyChecked: () => {},\r\n setGraduateChecked: () => {},\r\n setMilitaryChecked: () => {},\r\n\tsetFirstTimeOwnerChecked: () => {}\r\n}","//tabs driven by core js.\r\n/* global mzFunc mzMenu mzTabs */\r\n\r\nimport React, { useState } from \"react\";\r\nimport { useNavigate, useParams, useSearchParams } from 'react-router-dom';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport { goToTop, getBaseUrl, getParams, getLoading, setCursorWaiting, province, hideCmsHiddenBlock } from \"../../../utils\";\r\n\r\nimport SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\nimport NavHelper from '../../../Helpers/navhelper';\r\n\r\nimport Button from '../../1_Atoms/Button/Button';\r\nimport { FinanceOptions } from '../../2_Molecules/FinanceOptions/FinanceOptions';\r\nimport { LeaseOptions } from '../../2_Molecules/LeaseOptions/LeaseOptions';\r\nimport { CashOptions } from '../../2_Molecules/CashOptions/CashOptions';\r\nimport { PricePayment } from '../../2_Molecules/PricePayment/PricePayment';\r\nimport { Nav } from '../../3_Organisms/Nav/Nav';\r\nimport { PreOrderModal } from '../../3_Organisms/Modal/PreOrderModal';\r\nimport { Pricing } from '../../3_Organisms/Pricing/Pricing';\r\nimport { Modal } from '../../3_Organisms/Modal/Modal';\r\nimport { Alert } from '../../3_Organisms/Alert/Alert';\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nexport const PaymentsPage = ({ ...props }) => {\r\n const [loading, setLoading] = useState(true);\r\n const { t, i18n } = useTranslation(['payments', 'general']);\r\n const summaryCalculator = window.summaryCalculator;\r\n const { year, carline, trim, model, packageCode } = useParams();\r\n const [nav, setNav] = React.useState(null);\r\n let hasScrolled = false;\r\n const navigate = useNavigate();\r\n const [visibleTab, setVisibleTab] = useState(t(\"payments:finance_options\"));\r\n //const [openCollapsable, setOpenCollapsable] = useState(null);\r\n const legalContent = JSON.parse(sessionStorage.getItem(Constants.LegalPaymentInformation));\r\n const [legalModalOpen, setLegalModalOpen] = React.useState(false);\r\n const [selectedFinanceOption, setSelectedFinanceOption] = useState(null);\r\n const [selectedLeaseOption, setSelectedLeaseOption] = useState(null);\r\n const [selectedLeaseMileage, setSelectedLeasesMileage] = useState(null);\r\n \r\n const [loyaltyChecked, setLoyaltyChecked] = useState(summaryCalculator.LoyaltyChecked);\r\n const [graduateChecked, setGraduateChecked] = useState(summaryCalculator.GraduateChecked);\r\n const [militaryChecked, setMilitaryChecked] = useState(summaryCalculator.MilitaryChecked);\r\n const [firstTimeOwnerChecked, setFirstTimeOwnerChecked] = useState(summaryCalculator.FirstTimeOwnerChecked);\r\n const [includeFeesChecked, setIncludeFeesChecked] = useState(summaryCalculator.IncludeFees);\r\n const [includeTaxesChecked, setIncludeTaxesChecked] = useState(summaryCalculator.IncludeTaxes);\r\n const [includeRebatesChecked, setIncludeRebatesChecked] = useState(summaryCalculator.IncludeRebates);\r\n\r\n const [tradeInValue, setTradeInValue] = useState(summaryCalculator.TradeInValue);\r\n const [downPaymentValue, setDownPaymentValue] = useState(summaryCalculator.DownPaymentValue);\r\n\r\n const [preorderOpen, setPreorderModalOpen] = React.useState(false);\r\n\r\n const [financialInfo, setFinancialInfo] = useState(summaryCalculator.FinancialInfo);\r\n\r\n const [searchParams, setSearchParams] = useSearchParams();\r\n const DEBUG_MODE = sessionStorage.getItem(Constants.DEBUG);\r\n\r\n\tconst baseURL = getBaseUrl() + '/globalassets/mazda-canada/build-and-price/pricing/evgridicons/';\r\n\r\n const [financeType, setFinanceType] = React.useState(false);\r\n\r\n\tconst gtmHelper = new GTMHelper();\r\n\tconst navHelper = new NavHelper();\r\n\r\n if(getParams()['tve']){\r\n console.log(getParams()['tve'][0]);\r\n }\r\n \r\n if (DEBUG_MODE)\r\n console.log('YOU ARE IN DEBUG!');\r\n\r\n let legalContentObject = '';\r\n if (legalContentObject) {\r\n legalContentObject.map(item => {\r\n legalContent += item.copy\r\n });\r\n }\r\n\r\n if (DEBUG_MODE) {\r\n console.log(summaryCalculator.SelectedModelYear);\r\n\r\n console.log('mazdaCashIncentive', summaryCalculator.FinancialInfo.mazdaCashIncentive);\r\n }\r\n\r\n async function setDownPaymentInput(e) {\r\n const el = e.target;\r\n\r\n let val = e.target.value;\r\n val = val.replace(/\\D/g, \"\");\r\n\r\n if (!DEBUG_MODE) {\r\n // downpayment : Min: 0 , Max: (TotalMSRP-10000) \r\n if(parseInt(val) + summaryCalculator.FinancialInfo.tradeInValue >= summaryCalculator.FinancialInfo.maxDownPayment){\r\n val = summaryCalculator.FinancialInfo.maxDownPayment -summaryCalculator.FinancialInfo.tradeInValue;\r\n }else if(parseInt(val) > summaryCalculator.FinancialInfo.maxDownPayment){\r\n val = summaryCalculator.FinancialInfo.maxDownPayment;\r\n }\r\n }\r\n\r\n if (val.length > 0) {\r\n summaryCalculator.DownPaymentValue = `$${val}`;\r\n } else {\r\n summaryCalculator.DownPaymentValue = val;\r\n }\r\n\r\n // Check if the balance is under 7500$, if so update the downpayment\r\n if(summaryCalculator.IncludeFees ? (summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinance < 7500 || summaryCalculator.FinancialInfo.calculatedLease.leaseEndValue < 3000) : (summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceNoFees < 7500 || summaryCalculator.FinancialInfo.calculatedLease.leaseEndValueNoFees < 3000) ) {\r\n summaryCalculator.TradeInValue = 0;\r\n summaryCalculator.DownPaymentValue = 0;\r\n }\r\n\r\n setDownPaymentValue(summaryCalculator.DownPaymentValue);\r\n } \r\n\r\n async function checkTradeInValue(tempVal){\r\n console.log('checkTradeInValue', tempVal);\r\n let val = tempVal;\r\n if(typeof val==='string'){\r\n val = tempVal.replace(/\\D/g, \"\");\r\n }\r\n if (!DEBUG_MODE) {\r\n // Tradein : Min: 0 , Max: (TotalMSRP-10000) \r\n if(parseInt(val) > summaryCalculator.FinancialInfo.maxDownPayment){\r\n val = summaryCalculator.FinancialInfo.maxDownPayment;\r\n summaryCalculator.DownPaymentValue = 0;\r\n }else if(parseInt(val) + summaryCalculator.FinancialInfo.downPaymentValue > summaryCalculator.FinancialInfo.maxDownPayment){\r\n summaryCalculator.DownPaymentValue = summaryCalculator.FinancialInfo.maxDownPayment - parseInt(val);\r\n }\r\n }\r\n\r\n if (val.length > 0) {\r\n summaryCalculator.TradeInValue = `$${val}`;\r\n } else {\r\n summaryCalculator.TradeInValue = val;\r\n }\r\n\r\n // Check if the balance is under 7500$, if so update the downpayment\r\n if(summaryCalculator.IncludeFees ? (summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinance < 7500 || summaryCalculator.FinancialInfo.calculatedLease.leaseEndValue < 3000) : (summaryCalculator.FinancialInfo.calculatedFinance.balanceToFinanceNoFees < 7500 || summaryCalculator.FinancialInfo.calculatedLease.leaseEndValueNoFees < 3000) ) {\r\n summaryCalculator.TradeInValue = 0;\r\n summaryCalculator.DownPaymentValue = 0;\r\n }\r\n\r\n setTradeInValue(summaryCalculator.TradeInValue);\r\n }\r\n async function onBlurDownPaymentInput(e) {\r\n setCursorWaiting(true);\r\n\r\n setFinancialInfo(await summaryCalculator.RecalculateFinancialInfo());\r\n\r\n gtmHelper.setGTM({'action':'Input', 'type': 'down payment', 'value': e.target.value}, true , false);\r\n \r\n setCursorWaiting(false);\r\n }\r\n async function setTradeInInput(e) {\r\n setCursorWaiting(true);\r\n \r\n checkTradeInValue(e.target.value);\r\n setFinancialInfo(await summaryCalculator.RecalculateFinancialInfo());\r\n } \r\n async function onBlurTradeInInput(e) {\r\n setCursorWaiting(true);\r\n\r\n setFinancialInfo(await summaryCalculator.RecalculateFinancialInfo());\r\n\r\n gtmHelper.setGTM({'action':'Input', 'type': 'trade in', 'value': e.target.value}, true , false);\r\n \r\n setCursorWaiting(false);\r\n } \r\n\r\n hideCmsHiddenBlock();\r\n\r\n summaryCalculator.CurrentStep = 8;\r\n \r\n React.useEffect(() => {\r\n async function executeTasks() {\r\n if (!summaryCalculator.isDataLoaded()/* && !loading*/) {\r\n await summaryCalculator.loadVehicleData(year, carline, trim, model, packageCode);\r\n\r\n if (JSON.parse(sessionStorage.getItem(Constants.HasFinancialProviderError)) === true) {\r\n const vehiclePageUri = `/${decodeURI(window.location.search)}`;\r\n navigate(vehiclePageUri)\r\n }\r\n\r\n setNav(null);\r\n\r\n await summaryCalculator.loadFromFinancialProvider();\r\n }\r\n\r\n if (nav === null) {\r\n //setNav(navHelper.getNavContent(year, carline, trim, model, packageCode,summaryCalculator.CurrentStep, t));\r\n const toRender = navHelper.getNavContent(t);\r\n setNav(toRender);\r\n }\r\n\r\n // patch for the ctrl-r case\r\n //await summaryCalculator.loadFromFinancialProvider();\r\n \r\n if (loading) {\r\n setLoading(false);\r\n }\r\n\r\n if (getParams()['tve'] !== undefined){\r\n checkTradeInValue(getParams()['tve'][0]);\r\n searchParams.delete('tve');\r\n setSearchParams(searchParams)\r\n \r\n setFinancialInfo(await summaryCalculator.RecalculateFinancialInfo());\r\n }\r\n }\r\n\t\tif(typeof mzFunc === 'object' && typeof mzTabs === 'object'){\r\n\t\t\tmzFunc.waitForEl('.mzBuildandPrice .mz-tabs').then(function(components){mzTabs.init(components);});\r\n // TODO: Verify why it doesn't work on mobile\r\n //mzMenu.init();\r\n\t\t}\r\n \r\n executeTasks();\r\n }, [nav, searchParams, summaryCalculator, financialInfo, selectedFinanceOption, selectedLeaseOption, loyaltyChecked, graduateChecked, militaryChecked, firstTimeOwnerChecked, includeFeesChecked, includeTaxesChecked, includeRebatesChecked, tradeInValue, downPaymentValue]);\r\n\r\n React.useEffect(() => {\r\n if( document.querySelector('#oca') != undefined){\r\n if (searchParams.get('oca') === '1') {\r\n document.querySelector('#oca').scrollIntoView({\r\n block: 'center',\r\n behavior: 'smooth'\r\n });\r\n }\r\n }\r\n\r\n },[searchParams, loading]);\r\n\r\n function nextStep() {\r\n goToTop();\r\n navigate(`/${year}/${carline}/${trim}/${model}/${packageCode}/summary${decodeURI(window.location.search)}`);\r\n\t\tgtmHelper.setGTM({'action':'Next Step'}, true , false);\r\n }\r\n\r\n let paymentCats = [{ name: t(\"payments:finance_options\") }, { name: t(\"payments:lease_options\") }, { name: t(\"payments:purchase_price\") }];\r\n\r\n const paymentTabs = Object.keys(paymentCats).map((item, key) => {\r\n return (\r\n <a\r\n onClick={() => setVisibleTab(paymentCats[item].name)}\r\n key={paymentCats[item].name}\r\n className={visibleTab === paymentCats[item].name ? \"mz-tabs-tab interactive active\" : \"mz-tabs-tab interactive\"}\r\n >\r\n {paymentCats[item].name}\r\n </a>\r\n )\r\n });\r\n\r\n let paymentBlocks = [{ name: t(\"payments:finance_options\"), class: 'mz-finance-options' }, { name: t(\"payments:lease_options\"), class: 'mz-lease-options' }, { name: t(\"payments:purchase_price\"), class: 'mz-detailed-options' }];\r\n const paymentTabsContent = Object.keys(paymentBlocks).map((item, key) => {\r\n\r\n return (\r\n <div\r\n key={key}\r\n className=\"mz-payments-page__details__column\"\r\n style={paymentBlocks[item].name.includes(visibleTab) ? {} : { display: 'none' }}\r\n > \r\n {item==='0' ? <div><FinanceOptions setSelectedFinanceOption={ setSelectedFinanceOption } setPreorderModalOpen={setPreorderModalOpen} /></div> : '' }\r\n {item==='1' ? <div><LeaseOptions setSelectedLeaseOption={ setSelectedLeaseOption } setSelectedLeasesMileage={ setSelectedLeasesMileage } setPreorderModalOpen={setPreorderModalOpen} /></div> : '' }\r\n {item==='2' ? <div><CashOptions />\r\n </div> : '' }\r\n </div>\r\n )\r\n });\r\n\r\n function getAdminFeeDisclaimerSection() {\r\n const el = document.querySelectorAll('input[data-mz-form-field-name=\"formAdminServiceFeeDisclaimer\"]');\r\n\r\n const disclaimerMessage = el.length > 0 ? el[0].value : \"\";\r\n\r\n if(disclaimerMessage)\r\n return (\r\n <div className=\"mz-admin-fee-disclaimer\">\r\n {disclaimerMessage}\r\n </div>\r\n );\r\n else\r\n return (\r\n <>\r\n </>\r\n );\r\n }\r\n\r\n async function handleLoyaltyChecked() {\r\n setCursorWaiting(true);\r\n\r\n summaryCalculator.LoyaltyChecked = !summaryCalculator.LoyaltyChecked;\r\n if(summaryCalculator.LoyaltyChecked)\r\n summaryCalculator.FirstTimeOwnerChecked = false;\r\n\r\n await summaryCalculator.RecalculateFinancialInfo();\r\n setLoyaltyChecked(summaryCalculator.LoyaltyChecked);\r\n setFirstTimeOwnerChecked(summaryCalculator.FirstTimeOwnerChecked);\r\n\r\n setCursorWaiting(false);\r\n }\r\n\r\n async function handleFirstTimeOwnerChecked() {\r\n setCursorWaiting(true);\r\n\r\n summaryCalculator.FirstTimeOwnerChecked = !summaryCalculator.FirstTimeOwnerChecked;\r\n if(summaryCalculator.FirstTimeOwnerChecked)\r\n summaryCalculator.LoyaltyChecked = false;\r\n\r\n await summaryCalculator.RecalculateFinancialInfo();\r\n setFirstTimeOwnerChecked(summaryCalculator.FirstTimeOwnerChecked);\r\n setLoyaltyChecked(summaryCalculator.LoyaltyChecked);\r\n\r\n setCursorWaiting(false);\r\n } \r\n\r\n async function handleGraduateChecked() {\r\n setCursorWaiting(true);\r\n\r\n summaryCalculator.GraduateChecked = !summaryCalculator.GraduateChecked;\r\n await summaryCalculator.RecalculateFinancialInfo();\r\n setGraduateChecked(summaryCalculator.GraduateChecked);\r\n\r\n setCursorWaiting(false);\r\n }\r\n\r\n async function handleMilitaryChecked() {\r\n setCursorWaiting(true);\r\n\r\n summaryCalculator.MilitaryChecked = !summaryCalculator.MilitaryChecked;\r\n await summaryCalculator.RecalculateFinancialInfo();\r\n setMilitaryChecked(summaryCalculator.MilitaryChecked);\r\n\r\n setCursorWaiting(false);\r\n }\r\n\r\n\r\n\r\n async function handleIncludeFeesChecked() {\r\n setCursorWaiting(true);\r\n\r\n summaryCalculator.IncludeFees = !summaryCalculator.IncludeFees;\r\n await summaryCalculator.RecalculateFinancialInfo();\r\n setIncludeFeesChecked(summaryCalculator.IncludeFees);\r\n\r\n\t\tgtmHelper.setGTM({'action':'Checkbox', 'type': 'Fees', 'value': summaryCalculator.IncludeFees}, true , false);\r\n\r\n setCursorWaiting(false);\r\n }\r\n\r\n async function handleIncludeTaxesChecked() {\r\n setCursorWaiting(true);\r\n\r\n summaryCalculator.IncludeTaxes = !summaryCalculator.IncludeTaxes;\r\n await summaryCalculator.RecalculateFinancialInfo();\r\n setIncludeTaxesChecked(summaryCalculator.IncludeTaxes);\r\n\r\n\t\tgtmHelper.setGTM({'action':'Checkbox', 'type': 'Taxes', 'value': summaryCalculator.IncludeTaxes}, true , false);\r\n\r\n setCursorWaiting(false);\r\n }\r\n\r\n async function handleIncludeRebatesChecked() {\r\n setCursorWaiting(true);\r\n\r\n summaryCalculator.IncludeRebates = !summaryCalculator.IncludeRebates;\r\n await summaryCalculator.RecalculateFinancialInfo();\r\n setIncludeRebatesChecked(summaryCalculator.IncludeRebates);\r\n \r\n\r\n\t\tgtmHelper.setGTM({'action':'Checkbox', 'type': 'Rebates', 'value': summaryCalculator.IncludeRebates}, true , false);\r\n\r\n setCursorWaiting(false);\r\n }\r\n \r\n function hasAlertBar() {\r\n return summaryCalculator?._selectedModelYear?.incentives_banner;\r\n }\r\n\r\n function canDisplayEvRebatesCheckBox() {\r\n return summaryCalculator.FinancialInfo.ev_rebates && summaryCalculator.FinancialInfo.ev_rebates.length > 0;\r\n }\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"mz-spinner\">LOADING ...</div>\r\n )\r\n }\r\n return (\r\n <>\r\n {getLoading(loading, t)}\r\n <Nav nav={nav} />\r\n <div className={`${hasAlertBar() ? 'mz-top-nav-spacing' : ''}`}>\r\n <Alert />\r\n <div className={`mz-payments-page ${hasAlertBar() ? 'alert-bar-top' : 'mz-top-nav-spacing'}`}>\r\n <PricePayment title={summaryCalculator.VehicleTitle}\r\n incentives={summaryCalculator.Incentives}\r\n ev_rebates={summaryCalculator.FinancialInfo.ev_rebates}\r\n tradeInValue={summaryCalculator.TradeInValue}\r\n downPaymentValue={summaryCalculator.DownPaymentValue}\r\n loyaltyChecked={summaryCalculator.LoyaltyChecked}\r\n graduateChecked={summaryCalculator.GraduateChecked}\r\n militaryChecked={summaryCalculator.MilitaryChecked}\r\n firstTimeOwnerChecked={summaryCalculator.FirstTimeOwnerChecked}\r\n setDownPaymentInput={setDownPaymentInput}\r\n onBlurDownPaymentInput={onBlurDownPaymentInput}\r\n setTradeInInput={setTradeInInput}\r\n onBlurTradeInInput={onBlurTradeInInput}\r\n setLoyaltyChecked={handleLoyaltyChecked}\r\n setGraduateChecked={handleGraduateChecked}\r\n setMilitaryChecked={handleMilitaryChecked}\r\n setFirstTimeOwnerChecked={handleFirstTimeOwnerChecked}\r\n checkTradeInValue={checkTradeInValue}\r\n setFinancialInfo={setFinancialInfo} />\r\n {ReactHtmlParser(summaryCalculator.SelectedModelYear.price_payments_callout)}\r\n \r\n { searchParams.get('oca') === '1' ?\r\n <>\r\n <div class=\"mz-spacer mz-spacer-s\"></div>\r\n <div class=\"mz-payments-page__details mz-container-flex mz-bg--black\" id=\"oca\">\r\n <div class=\"mz-flex-1\">\r\n <div class=\"mz-spacer mz-spacer-s\"></div>\r\n <h4 class=\"text--white text--center\">{t('creditTitle')}</h4>\r\n <p class=\"text--white text--center\">{t('creditContent')}</p>\r\n </div>\r\n </div>\r\n </>\r\n : ''\r\n }\r\n <div className=\"mz-financial--actions\">\r\n {canDisplayEvRebatesCheckBox() ? \r\n <div className=\"actions__item\">\r\n <input type=\"checkbox\" defaultChecked={summaryCalculator.IncludeRebates} onChange={handleIncludeRebatesChecked} id=\"includeRebates\" />\r\n <label htmlFor=\"includeRebates\"> {t(\"checkbox_include_government_rebates\")}</label>\r\n </div> : null }\r\n <div className=\"actions__item\">\r\n <input type=\"checkbox\" defaultChecked={summaryCalculator.IncludeFees} onChange={handleIncludeFeesChecked} id=\"includeFees\" />\r\n <label htmlFor=\"includeFees\"> {t(\"checkbox_include_fees_and_levies\")}</label>\r\n </div>\r\n <div className=\"actions__item\">\r\n <input type=\"checkbox\" defaultChecked={summaryCalculator.IncludeTaxes} onChange={handleIncludeTaxesChecked} id=\"includeTaxes\" />\r\n <label htmlFor=\"includeTaxes\"> {t(\"checkbox_include_taxes_in_prices\")}</label>\r\n </div>\r\n\r\n </div>\r\n\r\n {getAdminFeeDisclaimerSection()}\r\n \r\n <div className=\"mz-payments-page__details\">\r\n <div className=\"mz-tabs mz-tabs--payments mz-mobile\">\r\n <div className=\"mz-tabs-menu\">\r\n <div className=\"mz-tabs-menu-container\">\r\n <div className=\"mz-tabs-menu-inner\">\r\n {paymentTabs}\r\n </div>\r\n </div>\r\n <div className=\"mz-tabs-menu--left\"><i className=\"mz-svg mz-svg--grey mz-svg-chevroncarousel mz-svg--rotate180\"></i></div>\r\n <div className=\"mz-tabs-menu--right active\"><i className=\"mz-svg mz-svg--grey mz-svg-chevroncarousel\"></i></div>\r\n </div>\r\n <div className=\"mz-tabs__content\">\r\n {paymentTabsContent}\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"mz-legal mz-mobile\">\r\n <Button\r\n className=\"mz-btn mz-btn--legal text--grey\"\r\n label={t(\"general:legal\")}\r\n backgroundColor=\"grey\"\r\n colour=\"grey\"\r\n icon={true}\r\n iconAfter={true}\r\n svg_className=\"\"\r\n svg_list=\"plus\"\r\n size={0.6}\r\n onClick={() => {\r\n document.querySelector('body').classList.add('disabled');\r\n setLegalModalOpen(true);\r\n }}\r\n />\r\n </div>\r\n <Pricing builtLabel={t(\"general:price_as_built\")} builtPrice=\"$\" loanLabel={t(\"general:loan_label\")} loanPrice=\"$\" buttonLabel={t(\"general:next_summary\")} saveLabel={t(\"general:save_build\")} summaryCalculator={summaryCalculator}\r\n HandleNextClick={nextStep} setLegalModalOpen={setLegalModalOpen} leaseLabel={t(\"general:show_lease_price\")} financeLabel={t(\"general:show_finance_price\")} setPreorderModalOpen={setPreorderModalOpen}/>\r\n <PreOrderModal isOpen={preorderOpen} handleClose={setPreorderModalOpen}></PreOrderModal> \r\n <Modal modalContent={legalContent} isOpen={legalModalOpen} handleClose={setLegalModalOpen} modalId='legalModal' />\r\n </div>\r\n </div>\r\n </>\r\n )\r\n}\r\n\r\nexport default PaymentsPage;","import React, { useState, useRef, useEffect } from 'react';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport ReactHtmlParser from 'react-html-parser';\r\n\r\nimport { formatPrice, goToTop, getLoading, setCursorWaiting, getFinanceWeekly, getLeaseBiWeeklyFromOptions, getLang, getBaseUrl, get360Data, hideCmsHiddenBlock} from '../../../utils';\r\n\r\nimport { SummaryConstants as Constants } from '../../../Helpers/summaryconstants';\r\nimport SummaryCalculator from '../../../Helpers/summarycalculator';\r\nimport GTMHelper from '../../../Helpers/gtmHelper';\r\nimport NavHelper from '../../../Helpers/navhelper';\r\n\r\nimport { Svg } from '../../1_Atoms/Svg/Svg';\r\nimport Button from '../../1_Atoms/Button/Button';\r\nimport CollapseLegal from '../../2_Molecules/Collapse/CollapseLegal';\r\nimport ColourCard from '../../2_Molecules/ColourCard/ColourCard';\r\nimport ThreeSixtyContainer from '../../3_Organisms/360Container/360Container';\r\nimport { Nav } from '../../3_Organisms/Nav/Nav';\r\nimport { Pricing } from '../../3_Organisms/Pricing/Pricing';\r\nimport { Modal } from '../../3_Organisms/Modal/Modal';\r\nimport { PreOrderModal } from '../../3_Organisms/Modal/PreOrderModal';\r\nimport { Alert } from '../../3_Organisms/Alert/Alert';\r\n\r\nexport const Protection = ({ ...props }) => {\r\n const baseURL = getBaseUrl();\r\n const lang = getLang();\r\n const [loading, setLoading] = useState(true);\r\n const summaryCalculator = window.summaryCalculator;\r\n const { year, carline, trim, model, packageCode } = useParams();\r\n const [nav, setNav] = useState(null);\r\n const navigate = useNavigate();\r\n\r\n const [preorderOpen, setPreorderModalOpen] = React.useState(false);\r\n \r\n let images = {};\r\n \r\n if (summaryCalculator.SelectedColourExteriorIndex !== 'null' && summaryCalculator.Colours !== null) {\r\n const { exteriors, interiors } = summaryCalculator.Colours.visual;\r\n const selectedExterior = Object.entries(exteriors)[summaryCalculator.SelectedColourExteriorIndex][1];\r\n const selectedInterior = summaryCalculator.SelectedColourInteriorIndex !== 'null' ? interiors[summaryCalculator.SelectedColourInteriorIndex] : null;\r\n images = get360Data(summaryCalculator.Colours.visual, selectedExterior, selectedInterior);\r\n }\r\n const generateStaticVehicleImg = () => {\r\n if (images) {\r\n const { imagePath, imageName } = images;\r\n const { year, carline, trim } = summaryCalculator.selectedVehicle\r\n const src = imagePath && imageName ? `${imagePath}${imageName.replace('{index}', 18)}` : '';\r\n return (\r\n <img src={src} alt={year + '' + carline + ' ' + trim} />\r\n )\r\n }\r\n return ''\r\n }\r\n\r\n const collapseRefProtection = useRef();\r\n const collapseRefAppearance = useRef();\r\n const [protectionExpanded, setProtectionExpanded] = useState(false);\r\n const [appearanceExpanded, setAppearanceExpanded] = useState(false);\r\n\r\n const legalContent = JSON.parse(sessionStorage.getItem(Constants.LegalProtections));\r\n const [legalModalOpen, setLegalModalOpen] = useState(false);\r\n const { t, i18n } = useTranslation(['protection', 'general']);\r\n const [showFinancePrice, setShowFinancePrice] = useState(summaryCalculator.ShowFinancePrice);\r\n\r\n const financial = JSON.parse(sessionStorage.getItem(Constants.FinancialObj));\r\n const financeTermIndex = parseInt(sessionStorage.getItem(Constants.FinanceTermIndex));\r\n const leaseTermIndex = parseInt(sessionStorage.getItem(Constants.LeaseTermIndex));\r\n\r\n const [selectedAddedProtectionIndex, setSelectedAddedProtectionIndex] = useState(summaryCalculator.SelectedAddedProtectionIndex);\r\n //const [selectedAppearanceProtectionIndex, setSelectedAppearanceProtectionIndex] = React.useState(summaryCalculator.SelectedAppearanceProtectionIndex);\r\n\r\n const [addedProtectionSection, setAddedProtectionSection] = useState(null);\r\n\r\n //const [appearanceDropDown, setAppearanceDropDown] = React.useState(Object.keys(summaryCalculator.Packages.appearance_protection[0].plans)[summaryCalculator.SelectedAppearanceProtectionIndex]);\r\n const [appearanceDropDown, setAppearanceDropDown] = useState(Object.keys(summaryCalculator.Packages.appearance_protection[0].plans)[0]);\r\n const [appearanceSelection, setAppearanceSelection] = useState(summaryCalculator.SelectedAppearanceProtectionPlansPackage.key !== undefined ? summaryCalculator.SelectedAppearanceProtectionPlansPackage.key : null);\r\n\r\n const gtmHelper = new GTMHelper();\r\n const navHelper = new NavHelper();\r\n\r\n hideCmsHiddenBlock();\r\n \r\n useEffect(() =>{\r\n const collapseProt = collapseRefProtection.current;\r\n const collapseApp = collapseRefAppearance.current;\r\n if(typeof window.mzAnimator === 'object'&& !protectionExpanded){\r\n window.mzAnimator.animateHeight(collapseApp, 'CollapseListApp', 'init')\r\n window.mzAnimator.animateHeight(collapseProt, 'CollapseListProt', 'init')\r\n console.log(collapseRefProtection)\r\n }\r\n },[addedProtectionSection]);\r\n \r\n useEffect(() =>{ \r\n const collapse = collapseRefProtection.current;\r\n if(protectionExpanded){\r\n window.mzAnimator.animateHeight(collapse, 'CollapseListProt', true)\r\n }else{\r\n window.mzAnimator.animateHeight(collapse, 'CollapseListProt', false)\r\n }\r\n },[protectionExpanded]);\r\n useEffect(() =>{ \r\n const collapse = collapseRefAppearance.current;\r\n\r\n if(appearanceExpanded){\r\n window.mzAnimator.animateHeight(collapse, 'CollapseListApp', true)\r\n }else{\r\n window.mzAnimator.animateHeight(collapse, 'CollapseListApp', false)\r\n }\r\n },[appearanceExpanded]);\r\n\r\n\r\n function hideShownCmsBlock() {\r\n let toHideBlocks = document.querySelectorAll('.mz-footer.visually-shown');\r\n if (toHideBlocks) {\r\n toHideBlocks.forEach(function (e) {\r\n e.classList.remove('visually-shown');\r\n e.classList.add('visually-hidden');\r\n });\r\n }\r\n }\r\n\r\n hideShownCmsBlock();\r\n\r\n summaryCalculator.CurrentStep = 7;\r\n\r\n useEffect(() => {\r\n async function executeTasks() {\r\n if (!summaryCalculator.isDataLoaded()) {\r\n await summaryCalculator.loadTrims(year, carline);\r\n\r\n const trimIndex = summaryCalculator.AvailableTrim.trims.findIndex(obj => obj.trim_type.name === trim);\r\n await summaryCalculator.setSelectedTrimIndex(trimIndex);\r\n\r\n setLoading(false);\r\n\r\n setNav(null);\r\n } else {\r\n setLoading(false);\r\n\r\n }\r\n\r\n if (!loading) {\r\n if (nav === null) {\r\n const toRender = navHelper.getNavContent(t);\r\n setNav(toRender); \r\n }\r\n }\r\n }\r\n\r\n executeTasks();\r\n }, [loading, nav, selectedAddedProtectionIndex, ]);\r\n\r\n useEffect(() => {\r\n if(addedProtectionSection === null) {\r\n setAddedProtectionSection(prepareAddedProtectionSection());\r\n }\r\n }, [addedProtectionSection]);\r\n\r\n function prepareAddedProtectionSection() {\r\n let section;\r\n\r\n if (summaryCalculator.SelectedAddedProtectionIndex == null) {\r\n /* DISPLAY THE TABLE IF WE HAVE NONE SELECTED*/\r\n section = getAddedProtectionPackage();\r\n } else {\r\n section = getCurrentAddedProtectionPackage();\r\n }\r\n\r\n return section;\r\n }\r\n\r\n function nextStep() {\r\n goToTop();\r\n navigate(`/${year}/${carline}/${trim}/${model}/${packageCode}/payments${decodeURI(window.location.search)}`)\r\n gtmHelper.setGTM({ 'action': 'Next Step' }, true, false);\r\n }\r\n\r\n async function handleSelectedAddedProtectionPackage(index) {\r\n setCursorWaiting(true);\r\n\r\n await summaryCalculator.setSelectedAddedProtectionIndex(index);\r\n\r\n gtmHelper.setGTM({ 'action': 'Added Protection Package Add', 'package': summaryCalculator.SelectedAddedProtectionPackage.option_code }, false, false); // TODO : CHECK WITH BARLOW IF IT'S A CODE OR INDEX\r\n\r\n setSelectedAddedProtectionIndex(index);\r\n\r\n setNav(null);\r\n\r\n setAddedProtectionSection(prepareAddedProtectionSection());\r\n \r\n setCursorWaiting(false);\r\n }\r\n\r\n async function handleRemoveAddedProtectionPackage() {\r\n setCursorWaiting(true);\r\n\r\n gtmHelper.setGTM({ 'action': 'Added Protection Package Remove', 'package': summaryCalculator.SelectedAddedProtectionPackage.option_code }, true, false); // TODO : CHECK WITH BARLOW IF IT'S A CODE OR INDEX\r\n\r\n await summaryCalculator.setSelectedAddedProtectionIndex(null);\r\n\r\n setSelectedAddedProtectionIndex(null);\r\n\r\n setNav(null);\r\n\r\n setAddedProtectionSection(prepareAddedProtectionSection());\r\n\r\n setCursorWaiting(false);\r\n }\r\n\r\n async function handleAppearanceProtectionTerms(index) {\r\n summaryCalculator.setSelectedAppearanceProtectionIndex(index);\r\n }\r\n\r\n async function handleAppearanceProtectionPlansPackage(index, key) {\r\n setCursorWaiting(true);\r\n\r\n setAppearanceSelection(key);\r\n\r\n await summaryCalculator.setSelectedAppearanceProtectionPlansIndex(index);\r\n\r\n gtmHelper.setGTM({ 'action': 'Appearance Protection Plans Package Add', 'package': summaryCalculator.SelectedAppearanceProtectionPlansPackage.name }, false, false); // TODO : CHECK WITH BARLOW IF IT'S A CODE OR INDEX\r\n\r\n setNav(null);\r\n\r\n setCursorWaiting(false);\r\n }\r\n\r\n async function handleRemoveAppearanceProtectionPlansPackage() {\r\n setCursorWaiting(true);\r\n\r\n setAppearanceSelection(null);\r\n\r\n gtmHelper.setGTM({ 'action': 'Appearance Protection Plans Package Remove', 'package': summaryCalculator.SelectedAppearanceProtectionPlansPackage.name }, true, false); // TODO : CHECK WITH BARLOW IF IT'S A CODE OR INDEX\r\n\r\n await summaryCalculator.setSelectedAppearanceProtectionPlansIndex(null);\r\n\r\n setNav(null);\r\n\r\n setCursorWaiting(false);\r\n }\r\n\r\n function handleShowFinanceClick(value) {\r\n setShowFinancePrice(value);\r\n }\r\n\r\n function getAddedProtectionPackage() {\r\n const addedProtectionPackageList = Object.entries(summaryCalculator.Packages.added_protection[0].plans).map(([key, plan], planIndex) => (\r\n <div className=\"mz-protection-packages__item\" key={key}>\r\n <div><strong>{plan.name}</strong></div>\r\n <span>+ {formatPrice(plan.financial.msrp)} <span className=\"label\">{\r\n `(${showFinancePrice?\r\n `${getFinanceWeekly(plan.financial.msrp, financial.calculatedFinance.financeValues[financeTermIndex].aprRate, financial.calculatedFinance.financeValues[financeTermIndex].term)}${t(\"general:week\")}`:\r\n `${getLeaseBiWeeklyFromOptions(plan.financial.msrp, financial.calculatedLease.leaseValues[leaseTermIndex].leaseRate, financial.calculatedLease.leaseValues[leaseTermIndex].term)}${t(\"general:bi_week\")}`})`}</span></span>\r\n <button className=\"mz-btn mz-btn--primary mz-btn--red\" onClick={()=>handleSelectedAddedProtectionPackage(planIndex)}><span>{t('general','add')}</span></button>\r\n </div>\r\n ));\r\n\r\n return (<div className=\"mz-protection-packages\">\r\n {addedProtectionPackageList}\r\n </div>\r\n )\r\n }\r\n\r\n function getCurrentAddedProtectionPackage() {\r\n const plan = summaryCalculator.SelectedAddedProtectionPackage.financial.msrp;\r\n return (<div>\r\n <div><strong>{summaryCalculator.SelectedAddedProtectionPackage.name}</strong></div>\r\n <p><span>+ {formatPrice(plan)} <span className=\"label\">{\r\n `(${showFinancePrice?\r\n `${getFinanceWeekly(plan, financial.calculatedFinance.financeValues[financeTermIndex].aprRate, financial.calculatedFinance.financeValues[financeTermIndex].term)}${t(\"general:week\")}`:\r\n `${getLeaseBiWeeklyFromOptions(plan, financial.calculatedLease.leaseValues[leaseTermIndex].leaseRate, financial.calculatedLease.leaseValues[leaseTermIndex].term)}${t(\"general:bi_week\")}`})`}</span></span>\r\n </p>\r\n <button className=\"mz-btn mz-btn--primary\" onClick={()=>{handleRemoveAddedProtectionPackage()}}><span>{t('general','remove')}</span></button> \r\n </div>)\r\n }\r\n\r\n function getAppearanceProtectionSection() {\r\n if (appearanceSelection === null) {\r\n return (\r\n <>\r\n {getAppearanceProtectionTermsDropDown()}\r\n {getAppearanceProtectionList()}\r\n </>\r\n )\r\n } else {\r\n const appearanceProtectionPlan = summaryCalculator.SelectedAppearanceProtectionPlan;\r\n const plan = appearanceProtectionPlan.packages[appearanceSelection].financial.msrp;\r\n return (\r\n <div>\r\n <div>\r\n <p><strong>{summaryCalculator.SelectedAppearanceProtectionPlansPackage.name} ({appearanceProtectionPlan.name})</strong></p>\r\n <p><span>+ {formatPrice(plan)} <span className=\"label\">{\r\n `(${showFinancePrice?\r\n `${getFinanceWeekly(plan, financial.calculatedFinance.financeValues[financeTermIndex].aprRate, financial.calculatedFinance.financeValues[financeTermIndex].term)}${t(\"general:week\")}`:\r\n `${getLeaseBiWeeklyFromOptions(plan, financial.calculatedLease.leaseValues[leaseTermIndex].leaseRate, financial.calculatedLease.leaseValues[leaseTermIndex].term)}${t(\"general:bi_week\")}`})`}</span></span></p>\r\n </div>\r\n <p><button className=\"mz-btn mz-btn--primary\" onClick={()=>{handleRemoveAppearanceProtectionPlansPackage()}}><span>{t('general','remove')}</span></button> </p>\r\n </div>\r\n )\r\n }\r\n }\r\n\r\n // TODO : LOOK WHAT WE DO WITH THOSE ICONS\r\n function getAddedProtectionIcons() {\r\n if (summaryCalculator.Packages.added_protection.length === 0)\r\n return;\r\n\r\n const src =`${baseURL}/globalassets/mazda-canada/react/images/mazdaaddedprotection_${lang}.png`;\r\n\r\n return (<img src={src} />)\r\n }\r\n\r\n // TODO : LOOK WHAT WE DO WITH THOSE ICONS\r\n function getAppearanceProtectionIcons() {\r\n if (summaryCalculator.Packages.appearance_protection.length === 0)\r\n return;\r\n\r\n const iconList = summaryCalculator.Packages.appearance_protection[0].icons.map((icon, index) => (\r\n <div key={index}>\r\n <i className={`mz-svg mz-svg-appearance_${icon.name}`}></i>\r\n </div>\r\n ));\r\n\r\n return (<div>\r\n {iconList}\r\n </div>\r\n )\r\n }\r\n\r\n function setExpand(title, innerContent, target) {\r\n // HACK FOR THE COLLAPSIBLE ON CTRL-R\r\n if (!innerContent) \r\n return (\r\n <>\r\n </>\r\n )\r\n \r\n let active='';\r\n let visible='';\r\n let ref=null;\r\n if(target === 'protection' && protectionExpanded){\r\n active='active';\r\n ref=collapseRefProtection;\r\n }else if(target === 'protection'){\r\n ref=collapseRefProtection;\r\n }else if(target === 'appearance' && appearanceExpanded){\r\n active='active';\r\n ref=collapseRefAppearance;\r\n }else if(target === 'appearance'){\r\n ref=collapseRefAppearance;\r\n }\r\n console.log(target, active, ref)\r\n return (<div className=\"mz-collapse mz-container-flex\">\r\n <button className={`mz-collapse__button ${active}`} onClick={(e)=>{expandToggle(target)}}>\r\n <h5>{title}</h5>\r\n <i className=\"mz-svg mz-svg-chevroncarousel mz-svg--grey\"></i>\r\n </button>\r\n <div className={`mz-collapse__box`} ref={ref}>\r\n <div className=\"mz-collapse__box-inner\">\r\n {innerContent}\r\n </div>\r\n </div>\r\n </div>)\r\n }\r\n\r\n function expandToggle(target){\r\n if(target === 'protection'){\r\n setProtectionExpanded(!protectionExpanded);\r\n }else{\r\n setAppearanceExpanded(!appearanceExpanded);\r\n }\r\n }\r\n\r\n function getAppearanceProtectionTermsDropDown() {\r\n const terms = Object.entries(summaryCalculator.Packages.appearance_protection[0].plans).map(([key, appearanceProtectionPlans], index) =>\r\n <option value={key} index={index} key={key}>{appearanceProtectionPlans.name}</option>\r\n );\r\n return (\r\n <div className=\"mz-protection-page__appearanceSelect\">\r\n\r\n <span className=\"label text--grey\">{summaryCalculator.Packages.appearance_protection[0].term_dropdown_label}</span>\r\n <div className=\"mz-form-item mz-form-item--select \">\r\n <select className=\"mz-form-item__select\" defaultValue={appearanceDropDown} onChange={(e)=>{\r\n setAppearanceDropDown(e.target.value);\r\n handleAppearanceProtectionTerms(e.currentTarget.querySelector(`option[value=\"${e.target.value}\"]`).getAttribute('index'))\r\n }}>\r\n {terms}\r\n </select>\r\n \r\n <div className=\"mz-form-item__arrow-down\">\r\n <div className=\"mz-svg-wrapper \" style={{ fontSize: '0.75rem' }}>\r\n <i className=\"mz-svg mz-svg--grey undefined mz-svg-chevron_small_down\"></i>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n function getAppearanceProtectionList() {\r\n const plans = Object.entries(summaryCalculator.Packages.appearance_protection[0].plans[appearanceDropDown].packages).map(([key, appearanceProtectionPlansPackage], index) => (\r\n <div className=\"mz-protection-page__appearance\" key={key}>\r\n <div className=\"mz-protection-page__appearance-name\">{appearanceProtectionPlansPackage.popular===1 ? <><span className=\"label\">popular</span><br/></> : \"\"}{appearanceProtectionPlansPackage.name}</div>\r\n <div className=\"mz-protection-page__appearance-price\">\r\n <div className=\"text--grey\">+ {formatPrice(appearanceProtectionPlansPackage.financial.msrp)} <span className=\"label\">{\r\n `(${showFinancePrice?\r\n `${getFinanceWeekly(appearanceProtectionPlansPackage.financial.msrp, financial.calculatedFinance.financeValues[financeTermIndex].aprRate, financial.calculatedFinance.financeValues[financeTermIndex].term)}${t(\"general:week\")}`:\r\n `${getLeaseBiWeeklyFromOptions(appearanceProtectionPlansPackage.financial.msrp, financial.calculatedLease.leaseValues[leaseTermIndex].leaseRate, financial.calculatedLease.leaseValues[leaseTermIndex].term)}${t(\"general:bi_week\")}`})`}</span></div>\r\n <button className=\"mz-btn mz-btn--primary mz-btn--red\" onClick={()=>handleAppearanceProtectionPlansPackage(index, key)}><span>{t('general','add')}</span></button> \r\n </div>\r\n </div>\r\n ));\r\n\r\n return (\r\n <>\r\n {plans}\r\n </>\r\n )\r\n }\r\n\r\n function scrollToID(id){\r\n const target = document.getElementById(id);\r\n window.gsap.to(window, {duration: 1, scrollTo: {y: target, offsetY: window.mzFunc.offsetMenu + 60, autoKill: true}});\r\n }\r\n\r\n return (\r\n <>\r\n {\r\n !summaryCalculator.isDataLoaded() ? getLoading(loading, t) : null\r\n }\r\n <div className=\"mz-protection-page mz-top-nav-spacing grid-no-gutter-sm\">\r\n <Nav nav={nav} />\r\n <Alert />\r\n\r\n <h5 className=\"mz-protection-page__title\">{t(\"title\")}</h5>\r\n <div className=\"mz-protection-page__subtitle\">\r\n <a className=\"mz-link\" onClick={()=>{scrollToID('map')}}>{ReactHtmlParser(summaryCalculator.Packages.added_protection[0].title.toLowerCase())}</a> {t(\"and\")} <a className=\"mz-link nowrap\" onClick={()=>{scrollToID('ap')}}>{ReactHtmlParser(summaryCalculator.Packages.appearance_protection[0].title.toLowerCase())}</a>\r\n </div>\r\n <div className=\"mz-full-width mz-protection-page__content\">\r\n {summaryCalculator.Packages.added_protection &&\r\n <section id=\"map\">\r\n <h5>{ReactHtmlParser(summaryCalculator.Packages.added_protection[0].title)}</h5>\r\n\r\n <div className=\"mz-protection-page__content-container\">\r\n <div className=\"mz-protection-page__content-container__content-left\">\r\n {generateStaticVehicleImg()}\r\n {getAddedProtectionIcons()}\r\n </div>\r\n <div className=\"mz-protection-page__content-container__content-right\">\r\n {ReactHtmlParser(summaryCalculator.Packages.added_protection[0].description)}\r\n </div>\r\n </div>\r\n { summaryCalculator.SelectedAddedProtectionIndex == null ? \r\n setExpand(summaryCalculator.Packages.added_protection[0].accordion_title, addedProtectionSection, 'protection') :\r\n <div className=\"mz-container-flex\">\r\n <div className=\"mz-protection-page__selectedBox\">\r\n <div className=\"mz-protection-page__selected-indicator\"><i className=\"mz-svg mz-svg--white mz-svg-checkmark\"></i></div>\r\n <h5>{ReactHtmlParser(summaryCalculator.Packages.added_protection[0].selected_plan_text)}</h5> \r\n {addedProtectionSection}\r\n </div>\r\n </div>\r\n }\r\n </section>}\r\n\r\n <section id=\"ap\">\r\n <h5>{ReactHtmlParser(summaryCalculator.Packages.appearance_protection[0].title)}</h5>\r\n\r\n <div className=\"mz-protection-page__content-container\">\r\n <div className=\"mz-protection-page__content-container__content-left\">\r\n {generateStaticVehicleImg()}\r\n {getAppearanceProtectionIcons()}\r\n </div>\r\n <div className=\"mz-protection-page__content-container__content-right protection-features-introduction\">\r\n {ReactHtmlParser(summaryCalculator.Packages.appearance_protection[0].description)}\r\n </div>\r\n </div>\r\n {appearanceSelection === null ?\r\n setExpand(summaryCalculator.Packages.appearance_protection[0].accordion_title , getAppearanceProtectionSection(), 'appearance'):\r\n <div className=\"mz-container-flex\">\r\n <div className=\"mz-protection-page__selectedBox\">\r\n <div className=\"mz-protection-page__selected-indicator\"><i className=\"mz-svg mz-svg--white mz-svg-checkmark\"></i></div>\r\n <h5>{ReactHtmlParser(summaryCalculator.Packages.appearance_protection[0].selected_plan_text)}</h5> \r\n {getAppearanceProtectionSection()}\r\n </div>\r\n </div>\r\n }\r\n\r\n </section>\r\n </div>\r\n \r\n <div className=\"mz-legal mz-mobile\">\r\n <Button\r\n className=\"mz-btn mz-btn--legal text--grey\"\r\n label={t(\"general:legal\")}\r\n backgroundColor=\"grey\"\r\n colour=\"grey\"\r\n icon={true}\r\n iconAfter={true}\r\n svg_className=\"\"\r\n svg_list=\"plus\"\r\n size={0.6}\r\n onClick={() => {\r\n document.querySelector('body').classList.add('disabled');\r\n setLegalModalOpen(true)\r\n }}\r\n />\r\n </div>\r\n\r\n <Pricing builtLabel={t(\"general:price_as_built\")} builtPrice=\"$\" loanLabel={t(\"general:loan_label\")} loanPrice=\"$\" saveLabel={t(\"general:save_build\")}\r\n leaseLabel={t(\"general:show_lease_price\")} financeLabel={t(\"general:show_finance_price\")} buttonLabel={t(\"general:next_payments\")} summaryCalculator={summaryCalculator}\r\n HandleNextClick={nextStep} setLegalModalOpen={setLegalModalOpen} HandleShowFinanceClick={handleShowFinanceClick} setPreorderModalOpen={setPreorderModalOpen} />\r\n <Modal modalContent={legalContent} isOpen={legalModalOpen} handleClose={setLegalModalOpen} modalId='legalModal' />\r\n <PreOrderModal isOpen={preorderOpen} handleClose={setPreorderModalOpen}></PreOrderModal> \r\n </div>\r\n </>\r\n \r\n )\r\n}\r\n\r\nexport default Protection","import React, { useEffect } from \"react\";\r\nimport { HashRouter as Router, Routes, Route } from 'react-router-dom';\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport './Assets/scss/main.scss';\r\n\r\nimport { getBaseUrl, getUrlParamsObject, getParams, getProvince, setCursorWaiting } from './utils';\r\n\r\nimport BuildHelper from \"./Helpers/BuildHelper\";\r\nimport NavHelper from './Helpers/navhelper';\r\nimport SummaryCalculator from './Helpers/summarycalculator';\r\nimport { openModal } from './Helpers/helpers';\r\n// import { BrowserRouter as Router, Route, Routes } from 'react-router-dom'\r\n\r\nimport { Nav } from './Components/3_Organisms/Nav/Nav';\r\nimport { Modal } from './Components/3_Organisms/Modal/Modal';\r\nimport { AccessoriesList } from './Components/3_Organisms/AccessoriesList/AccessoriesList'\r\nimport { VehiclePage } from './Components/5_Pages/Vehicles/Vehicles';\r\nimport { TrimsPage } from './Components/5_Pages/Trim/Trim';\r\nimport { SummaryPage } from './Components/5_Pages/Summary/Summary';\r\nimport { Options } from './Components/5_Pages/Option/Option';\r\nimport { Colours } from './Components/5_Pages/Colours/Colours';\r\nimport { Wheels } from './Components/5_Pages/Wheels/Wheels';\r\nimport { Connectivity } from './Components/5_Pages/Connectivity/Connectivity';\r\nimport { PaymentsPage } from './Components/5_Pages/Payments/Payments';\r\nimport { Protection } from './Components/5_Pages/Protection/Protection';\r\n\r\nfunction App() {\r\n const { t, i18n } = useTranslation(['general']);\r\n\r\n const urlParams = getUrlParamsObject();\r\n const buildId = urlParams.build;\r\n\r\n window.summaryCalculator = new SummaryCalculator().reloadStoredData();\r\n\r\n const savedCarline = JSON.parse(sessionStorage.getItem('SelectedVehicle')) ?.carline;\r\n const savedCarYear = JSON.parse(sessionStorage.getItem('SelectedVehicle')) ?.year;\r\n\r\n const getProvinceInUrl = () => {\r\n const params = getParams(window.location.hash);\r\n if(params.prov_code) {\r\n return params.prov_code[0];\r\n }\r\n\r\n return undefined\r\n }\r\n\r\n /*const getRequestedLanguageInUrl = () => {\r\n const params = getParams(window.location.hash);\r\n if(params.lang_code) {\r\n return params.lang_code[0];\r\n }\r\n\r\n return undefined\r\n }*/\r\n\r\n const currentProvince = document.querySelector('meta[name=\"data-region\"]').content;\r\n const requestedProvince = getProvinceInUrl();\r\n\r\n //const currentLanguage = document.querySelector('meta[name=\"data-language\"]').content;\r\n //const requestedLanguage = getRequestedLanguageInUrl();\r\n\r\n // Force a CMS redirect so that it can change province / language behind the scenes\r\n if (window.location.hash && (requestedProvince !== undefined && requestedProvince !== currentProvince)/* && (requestedLanguage !== undefined && requestedLanguage !== currentLanguage)*/) {\r\n const newLocation = window.location.origin + window.location.pathname + \"?changeProvince=\" + encodeURIComponent(window.location.origin + window.location.pathname +window.location.hash);\r\n window.location = newLocation;\r\n }\r\n\r\n // Rewrite the url after the redirect\r\n if (urlParams['changeProvince']) {\r\n window.summaryCalculator._apiService.province = currentProvince;\r\n window.summaryCalculator._tcciService.province = currentProvince; \r\n window.history.pushState({}, document.title, decodeURIComponent(urlParams['changeProvince']));\r\n }\r\n\r\n // Override onchange behavior for the region selector\r\n document.addEventListener('DOMContentLoaded', () => {\r\n window.handleSelectChange = async () => {\r\n const select = document.getElementById('region-selector-dropdown');\r\n\r\n const newProvince = select.value;\r\n //console.log(newProvince);\r\n\r\n window.summaryCalculator._apiService.province = newProvince;\r\n window.summaryCalculator._tcciService.province = newProvince;\r\n \r\n const waitScreen = document.querySelector('div.loading');\r\n \r\n setCursorWaiting(true);\r\n // Display wait screen\r\n if(waitScreen) {\r\n waitScreen.classList.add('visible');\r\n }\r\n\r\n // DO NOT REMOVE THIS LINE, USED TO RELOAD FOR THE EV REBATE\r\n await window.summaryCalculator.forceReloadVehicle();\r\n\r\n setCursorWaiting(false);\r\n // Hide wait screen\r\n if(waitScreen) {\r\n waitScreen.classList.remove('visible');\r\n }\r\n\r\n // Set the regEx for prov_code replacement\r\n const provCodePattern = /prov_code=[^&]*/;\r\n \r\n // Replace the prov_code parameter\r\n let updatedUrl = window.location.href.replace(provCodePattern, `prov_code=${newProvince}`);\r\n\r\n // Update the url in the address bar before submit\r\n window.history.pushState({}, document.title, updatedUrl);\r\n \r\n const form = document.getElementById('region-selector');\r\n form.submit();\r\n };\r\n\r\n const languageLink = document.querySelector('#region-language-link');\r\n\r\n window.handleLanguageChange = async (e) => {\r\n const newLocation = languageLink.href;\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const newLanguage = languageLink.text;\r\n\r\n const waitScreen = document.querySelector('div.loading');\r\n\r\n // Display the wait screen while loading\r\n if(waitScreen) {\r\n waitScreen.classList.add('visible');\r\n }\r\n \r\n window.summaryCalculator._apiService.language = newLanguage;\r\n window.summaryCalculator._tcciService.language = newLanguage;\r\n\r\n await window.summaryCalculator.forceReloadVehicle();\r\n \r\n // Hide wait screen\r\n if(waitScreen) {\r\n waitScreen.classList.remove('visible');\r\n }\r\n\r\n window.location = newLocation;\r\n };\r\n \r\n if (languageLink) {\r\n languageLink.addEventListener('click', window.handleLanguageChange, false);\r\n }\r\n\r\n });\r\n\r\n\r\n useEffect(() => {\r\n const cssFile = document.createElement(\"link\");\r\n const scriptFile = document.createElement(\"script\");\r\n \r\n \r\n cssFile.href = window.location.host.indexOf(\"localhost\") === -1 ? getBaseUrl() + process.env.REACT_APP_GLOBALASSETS_CSS : '/forms/main.css';\r\n cssFile.rel = \"stylesheet\";\r\n document.head.appendChild(cssFile);\r\n\r\n scriptFile.src = window.location.host.indexOf(\"localhost\") === -1 ? getBaseUrl() + process.env.REACT_APP_GLOBALASSETS_JS : '/forms/main.js';\r\n document.body.appendChild(scriptFile);\r\n\r\n }, [])\r\n\r\n if (window.location.hash) {\r\n if (window.location.hash.split('/')[1].substring(0, 1) != '?' && savedCarline) {\r\n const carYearHash = window.location.hash.split('/')[1];\r\n const carlineHash = window.location.hash.split('/')[2];\r\n if (carYearHash != savedCarYear || carlineHash != savedCarline) {\r\n console.log(carYearHash, carlineHash, savedCarYear, savedCarline);\r\n window.summaryCalculator.reset(true);\r\n }\r\n }\r\n }\r\n\r\n return (\r\n <Router>\r\n <div className={`App mzBuildandPrice ${window.location.host.indexOf(\"localhost\") === -1 && window.bnp_retailer_mode ? 'retailer' : ''}`}>\r\n <header className=\"App-header\">\r\n </header>\r\n <div className=\"App-container\">\r\n <Routes>\r\n <Route exact path=\"/\" element={\r\n buildId ? (\r\n <BuildHelper buildId={buildId} />\r\n ) : (\r\n <VehiclePage key=\"vehiclePage\" />\r\n )} />\r\n <Route exact path=\"/:year/:carline\" element={<TrimsPage key=\"trimPage\" />} />\r\n <Route exact path=\"/:year/:carline/:trim\" element={<Options />} />\r\n <Route exact path=\"/:year/:carline/:trim/:model/:option\" element={<Options />} />\r\n <Route exact path=\"/:year/:carline/:trim/:model/:packageCode/colours\" element={<Colours />} />\r\n <Route exact path=\"/:year/:carline/:trim/:model/:packageCode/wheels\" element={<Wheels />} />\r\n <Route exact path=\"/:year/:carline/:trim/:model/:packageCode/connectivity\" element={<Connectivity />} />\r\n <Route exact path=\"/:year/:carline/:trim/:model/:packageCode/accessories\" element={<AccessoriesList />} />\r\n <Route exact path=\"/:year/:carline/:trim/:model/:packageCode/protections\" element={<Protection />} />\r\n <Route exact path=\"/:year/:carline/:trim/:model/:packageCode/summary\" element={<SummaryPage />} />\r\n <Route exact path=\"/:year/:carline/:trim/:model/:packageCode/payments\" element={<PaymentsPage />} />\r\n </Routes>\r\n </div>\r\n </div>\r\n </Router>\r\n );\r\n}\r\n\r\nexport default App;\r\n","const reportWebVitals = onPerfEntry => {\r\n if (onPerfEntry && onPerfEntry instanceof Function) {\r\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\r\n getCLS(onPerfEntry);\r\n getFID(onPerfEntry);\r\n getFCP(onPerfEntry);\r\n getLCP(onPerfEntry);\r\n getTTFB(onPerfEntry);\r\n });\r\n }\r\n};\r\n\r\nexport default reportWebVitals;\r\n","import i18n from \"i18next\";\r\nimport { useTranslation, initReactI18next } from \"react-i18next\";\r\n\r\n//import Backend from 'i18next-http-backend';\r\nimport LanguageDetector from 'i18next-browser-languagedetector';\r\n\r\nimport VEHICLES_EN from './locales/en/vehicles.json';\r\nimport TRIMS_EN from './locales/en/trims.json';\r\nimport OPTIONS_EN from './locales/en/options.json';\r\nimport PACKAGES_EN from './locales/en/packages.json';\r\nimport CONNECTIVITY_EN from './locales/en/connectivity.json';\r\nimport COLOURS_EN from './locales/en/colours.json';\r\nimport WHEELS_EN from './locales/en/wheels.json';\r\nimport ACCESSORIES_EN from './locales/en/accessories.json';\r\nimport PROTECTION_EN from './locales/en/protection.json';\r\nimport PAYMENTS_EN from './locales/en/payments.json';\r\nimport SUMMARY_EN from './locales/en/summary.json';\r\nimport EVGRID_EN from './locales/en/evGrid.json';\r\nimport GENERAL_EN from './locales/en/general.json';\r\n\r\nimport VEHICLES_FR from './locales/fr/vehicles.json';\r\nimport TRIMS_FR from './locales/fr/trims.json';\r\nimport OPTIONS_FR from './locales/fr/options.json';\r\nimport PACKAGES_FR from './locales/fr/packages.json';\r\nimport CONNECTIVITY_FR from './locales/en/connectivity.json';\r\nimport COLOURS_FR from './locales/fr/colours.json';\r\nimport WHEELS_FR from './locales/fr/wheels.json';\r\nimport ACCESSORIES_FR from './locales/fr/accessories.json';\r\nimport PROTECTION_FR from './locales/fr/protection.json';\r\nimport PAYMENTS_FR from './locales/fr/payments.json';\r\nimport SUMMARY_FR from './locales/fr/summary.json';\r\nimport EVGRID_FR from './locales/fr/evGrid.json';\r\nimport GENERAL_FR from './locales/fr/general.json';\r\n\r\nconst languages = ['en', 'fr'];\r\nconst resources = {\r\n en: {\r\n general: GENERAL_EN,\r\n vehicles: VEHICLES_EN,\r\n trims: TRIMS_EN,\r\n options: OPTIONS_EN,\r\n connectivity: CONNECTIVITY_EN,\r\n packages: PACKAGES_EN,\r\n colours: COLOURS_EN,\r\n wheels: WHEELS_EN,\r\n accessories: ACCESSORIES_EN,\r\n protection: PROTECTION_EN,\r\n payments: PAYMENTS_EN,\r\n summary: SUMMARY_EN,\r\n\t\t\tevGrid: EVGRID_EN\r\n },\r\n fr: {\r\n general: GENERAL_FR,\r\n vehicles: VEHICLES_FR,\r\n trims: TRIMS_FR,\r\n options: OPTIONS_FR,\r\n packages: PACKAGES_FR,\r\n connectivity: CONNECTIVITY_FR,\r\n colours: COLOURS_FR,\r\n wheels: WHEELS_FR,\r\n accessories: ACCESSORIES_FR,\r\n protection: PROTECTION_FR,\r\n payments: PAYMENTS_FR,\r\n summary: SUMMARY_FR,\r\n\t\t\tevGrid: EVGRID_FR\r\n }\r\n }\r\nconsole.log(resources);\r\n\r\n\r\ni18n\r\n //.use(Backend)\r\n .use(LanguageDetector)\r\n .use(initReactI18next)\r\n .init({\r\n resources: resources,\r\n lng: document.querySelector('meta[name=\"data-language\"]').content, //\"en\",\r\n fallbackLng: \"en\",\r\n debug: true,\r\n whitelist: languages,\r\n transKeepBasicHtmlNodesFor: ['br', 'strong', 'i', 'span', 'a'],\r\n interpolation: {\r\n escapeValue: false\r\n }\r\n });\r\n\r\nexport default i18n;\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport App from './App';\r\nimport reportWebVitals from './reportWebVitals';\r\nimport './i18n';\r\n\r\nReactDOM.render(\r\n <React.StrictMode>\r\n <App />\r\n </React.StrictMode>,\r\n document.getElementById('root')\r\n);\r\n\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\nreportWebVitals();\r\n"],"sourceRoot":""}