{"version":3,"sources":["services/apiHelper.js","store/actions/calculatorActions.js","store/actionTypes/calculatorActionTypes.js","services/helpers.js","services/calculationsApi.js","components/Header.js","components/steps/stepParts/StepHeader.js","services/gtm.js","components/core/Input.js","components/steps/stepParts/AgeThresholdQuestions.js","components/modals/incomeCalcParts/BusinessCalculator.js","components/modals/incomeCalcParts/DefaultCalculator.js","components/modals/incomeCalcParts/LastStepOfBusinessCalculator.js","components/modals/IncomeCalculatorModal.js","services/stepHelpers.js","components/steps/stepParts/NextButton.js","components/steps/Step1.js","components/steps/stepParts/StepSectionHeader.js","components/steps/stepParts/StepSection.js","components/steps/Step2.js","components/steps/stepParts/StepHouseOptions.js","components/steps/Step3.js","components/steps/stepParts/HomeMortgageStart.js","components/steps/Step4.js","components/steps/stepParts/HypoTypeBlock.js","components/steps/stepParts/CheckLine.js","components/steps/stepParts/StepSidebar.js","components/modals/LoadingModal.js","components/summary/BankCard.js","components/steps/Step5.js","components/steps/stepParts/StepsIndication.js","components/modals/ErrorModal.js","components/Steps.js","components/modals/OverviewModal.js","services/stateHelper.js","components/modals/SharePdfModal.js","services/shareHelper.js","components/summary/ToolInfoComp.js","components/Summary.js","components/Usp.js","components/App.js","serviceWorker.js","store/reducers/calculatorReducer.js","index.js"],"names":["calculateByIncome","data","isNhg","calculateMaximumMortgageByIncomeApi","then","response","maxMortgageAmount","Interest","SelectedMortgageProvider","rentestand","interest","calculateMonthlyCostsByMortgage","rewriteApiData","cleanData","calculatedData","energyLabel","EnergyLabel","value","getAdditionalEnergyLabelAmount","isHouseAffordable","totalNeededToBuyHouse","sustainabilityUplift","parseSearchQuery","searchString","clean","result","entries","URLSearchParams","key","checkValueForCurrency","hasOwnProperty","Object","keys","length","setField","field","type","getMortgageProviderAction","id","isnewbuilding","dispatch","a","getMortgageProvider","mortgageProvider","store","getState","calculator","initial","getMortgageProviders","hypotheekVorm","rentevastePeriode","mortgageProvidersNhg","nhgLookupId","producten","find","p","aanbiederId","lookupId","mortgageProviders100","nonNhgLookupId","mainBank","sort","b","nhglookupId","affordCalcAction","stepNumber","useBestDealInterest","getMonthlyCost","removeDotsComas","InterestBestDeal","riskClass","getNhg","nhg","parseInt","existingBuilding","Woning","providers","CanIAffordThisHouseApi","error","customerMaximumMortgageAmount","netMonthlyCostHouse","netMonthlyCost","grossMonthlyCostHouse","grossMonthlyCost","mortgageCalcAction","sharePdfAction","locale","language","sharePdfViaEmail","sharePdf","CALCULATOR_TYPES","mainMediaMobile","PATH_TO_TYPE_MAP","getCalculatorType","pathname","window","location","queryParams","search","path","includes","stepStates","defaultStepsState","state","hasShareParam","filter","v","i","getDefaultStepState","calculatorCopy","replace","rewriteRadioOptionsClasses","parent","classes","el","document","getElementsByClassName","children","classList","add","rewriteSelectIds","prefix","setTimeout","innerHTML","numberToCurrency","number","format","getLanguage","formatter","Intl","NumberFormat","maximumFractionDigits","minimumFractionDigits","currencyToNumber","mustBeNumber","log","replaceAll","parseFloat","Math","round","toFixed","setBodyDataForPdf","bodyData","yearlyIncome","ApplicantYearlyIncome","yearlyIncomePartner","PartnerYearlyIncome","creditsAndLoans","HasLoans","Loans","StudentDebtMonthlyPayment","Alimony","PrivateLeaseAmount","maximumMortgage","grossMonthlyCosts","netMonthlyCosts","applicableGrossMonthlyCosts","applicableNetMonthlyCosts","askingHousePrice","ownResources","OwnResources","homeEquity","HomeEquity","extraInsert","extraMoneyNeeded","mortgageType","MortgageType","fixedInterestPeriod","RentevastePeriode","hasHouse","HasHouse","mortgageHistory","calculatorType","WantsToSkipMortgageQuestions","houseSalePrice","houseSaleCosts","HomeEquityCosts","houseMortgageValue","HomeMortgageAmount","housePartMortgageValue","HomeMortgageOtherPartAmount","houseMortgageDateStart","HomeMortgageStart","isHouseMortageDateStartedBefore2013","HomeMortgageStartBefore2013","isHouseMortageCompletelyAnnuityOrLinear","HomeMortgageIsBeingPaidOff","createPostObject","calculateStudentDebt","StudentDebtAmount","ApplicantAge","ApplicantAOW","PartnerAge","PartnerAOW","object","applicant","age","statePensionIncome","oldAgePensionIncome","ApplicantAnnualPensionIncome","partner","PartnerAnnualPensionIncome","interestRate","loans","alimony","stepState","mortageAmount","isNewBuilding","IsNieuwbouw","purchasePrice","ownMoney","surplus","HasPartner","params","share","addOfficeIdParamToLink","link","officeid","isSustainabilityUplift","studentDebtAmount","currentInterestRate","multiplier","getApiUrl","version","hostname","api","indexOf","fetch","method","body","JSON","stringify","headers","Accept","redirect","status","json","RenteBasis","getParamEnergyLabel","getBanksApi","getShortUrl","url","addOn","Authorization","calculateYearlyIncome","getSummaryPdf","mode","xhrFields","responseType","blob","URL","createObjectURL","Blob","createElement","href","setAttribute","appendChild","click","parentNode","removeChild","success","message","calculateYearlyIncomeIndependentApi","postData","Number","ld1","lvu1","ov1","sfw1","bpga1","ld2","lvu2","ov2","sfw2","bpga2","ld3","lvu3","ov3","sfw3","bpga3","Header","mediaMatches","useMediaQuery","className","style","marginTop","height","src","alt","defaultMessage","stepTitles","StepHeader","backLink","title","openStep","stepSummary","onClose","useDispatch","referrer","onClick","gtm","tagManagerArgs","TagManager","initialize","Input","errorCondition","name","label","inputType","icon","iconText","onIconClick","placeholder","register","validationRules","isDisabled","errorTitle","valueType","intl","useIntl","viewValue","highAgeCondition","useEffect","gtmId","dataLayer","event","eventCategory","eventAction","eventLabel","setType","$event","action","target","errorInfo","autoComplete","onFocus","e","onBlur","onWheel","blur","getType","disabled","ref","dangerouslySetInnerHTML","__html","formatMessage","AgeThresholdQuestions","errors","form","annualPensionIncome","formName","aow","values","pensionLink","rel","required","BusinessCalculator","toggleLastStep","currentYear","Date","getFullYear","useState","selectedYear","setSelectedYear","PER","JVA","DMK","DefaultCalculator","toggleIncomeCalculator","useForm","defaultValues","INK","ORT","handleSubmit","formState","onSubmit","UIT","calculateYearlyIncomeAction","onChange","horizontal","rootColor","pointColor","iconInnerSize","iconSize","min","data-tip","place","effect","data-iscapture","clickable","html","isValid","LastStepOfBusinessCalculator","years","labels","calculateYearlyIncomeIndependentAction","map","item","fieldName","fieldNameIndex","inputs","numberIndex","IncomeCalculatorModal","defaultCalculator","setDefaultCalculator","lastStepOpened","setLastStepOpened","getStepParams","requestParams","stateStore","getStateFromStore","isStateSharedViaUrl","isStateSavedInSession","getStep1HeaderSummary","getStep2HeaderSummary","getStep3HeaderSummary","getStep4HeaderSummary","returnAsInteger","sum","getStep5HeaderSummary","req","localStorage","getItem","NextButton","isFormValid","loading","Step1","onStepSubmit","shouldReset","setResetForms","setShowResetBtn","useSelector","setHasPartner","stepHeaderSummary","setStepHeaderSummary","incomeCalculatorVisibilityViaParam","setIncomeCalculatorVisibilityViaParam","incomeCalculatorVisibility","setIncomeCalculatorVisibility","incomeCalculatorField","setIncomeCalculatorField","getDefaultValues","watch","triggerValidation","setValue","reset","watchAge","useCallback","virtualURL","virtualTitle","toString","calculate","shouldDirty","hasAPartner","floor","noValidate","ReactDOM","createPortal","getElementById","StepSectionHeader","sectionState","toggleSection","StepSection","firstSection","stepBodyEl","useRef","setSectionState","Step2","setHasLoans","PrivateLeaseFull","setPrivateLeaseFull","salutation","salutation2","linkInfo","linkCalc","StepHouseOptions","all","onRadioChange","partial","Step3","setCalculatorType","setIsNieuwbouw","SustainabilityUplift","setSustainabilityUplift","AmountAboveNhg","setAmountAboveNhg","setEnergyLabel","StateIsNieuwbouw","Nhg","options","watchWoning","handleMobileFocus","browserName","navigator","userAgent","vendor","opera","test","substr","activeElement","scrollIntoView","addEventListener","removeEventListener","housePrice","amountAboveNhg","onHouseOptionsChange","question","watchHomeMortgageStartNotKnown","control","paidOff","as","defaultValue","Step4","setHasHouse","HomeMortgageStartNotKnown","getValues","watchHomeMortgageIsBeingPaidOff","watchWantsToSkipMortgageQuestions","watchHomeMortgageOtherPartAmount","watchHomeEquity","watchValues","MortgageLessThenSurplus","appointmentLink","rules","HypoTypeBlock","text","active","handleHypoChange","CheckLine","StepSidebar","toggleSidebar","sidebarType","LoadingModal","BankCard","isMain","bankData","selector","selected","toggleBank","bank","logoUrl","rentevasteDropdownStyles","provided","minHeight","indicatorSeparator","display","scrollToRef","scrollTo","current","offsetTop","Step5","hypoType","setHypoType","handledHasShareParam","SetHandledHasShareParam","isLoading","setIsLoading","rentevastePeriod","setRentevastePeriod","sidebarVisibility","setSidebarVisibility","setSidebarType","myRef","yearLabel","onBestDealCLick","triggeredByShare","setMortgageType","setMortgagePeriod","bankIds","banksList","uniqueBanks","reduce","uniq","some","uniqueBank","otherBanks","allBanks","fetchData","role","isSearchable","onMenuOpen","classNamePrefix","styles","StepsIndication","bullets","stepsState","ErrorModal","Steps","onStateClear","resetForms","showResetBtn","summaryWithBanksOpened","steps","Component","components","undefined","OverviewModal","toggleOverview","componentRef","mortgageTypeLabel","plural","answer","mappingValuesState","stepFields","getInitialState","defaultState","MortgageParts","forEach","shareParam","getStateFromBase64","removeItem","setItem","storedState","paramsState","mapping","prop","remapObject","Klant_Jaarinkomen","Klant_Leeftijd","Partner_Jaarinkomen","Partner_Leeftijd","HeeftPartner","Onderpand_Koopsom","Onderpand_IsNieuwbouw","Heeft_Woning","Overslaan_Hypotheek","Huis_Prijs","Verkoop_Kosten","Hoogte_Hypotheek","Student_Debt_Amount","energylabel","saveStateToSession","getBase64FromState","getStateAsShareableLink","origin","domain","mappingValues","valuesArray","index","push","mortgageParts","mortgagePartsToString","mortgagePart","join","currentMortgageAmount","fixedInterestAmount","encodeMortgageParts","btoa","base64State","decodedStateValues","parse","atob","reconstructedState","mappingValuesMortgageParts","reconstructedMortgageParts","mortgagePartArray","split","mortgagePartObject","decodeMortgageParts","SharePdfModal","toolData","SenderName","RecipientName","RecipientEmail","shortUrl","pattern","getWhatsAppShareText","shareUrl","shareText","ToolInfoComponent","toggleMobileSummary","mobileSummaryOpened","changeStepState","showNotCompleted","lastActiveStepIndex","getTitle","mortgagePreferenceAddition","mortgagePreference","confetti","particleCount","spread","y","shapes","shapeOptions","image","replaceColor","width","colors","useMemo","fields","showMaxMortgage","sustainabilityBudget","titleGrossMonthlyCost","addition","titleNetMonthlyCost","ownMoneyInformation","extraMoneyNeededInformation","sustainabilityUpliftInformation","sustainabilityUpliftInformationNoLabel","maxMortgageInformationNoHouse","maxMortgageInformationNoLabel","toolTip","hide","addResultRedClass","iamNeverTheFirstItem","toggleSummary","Summary","setMobileSummaryOpened","isOverviewOpened","setIsOverviewOpened","isSharePdfOpened","setIsSharePdfOpened","showPdfSpinner","setShowPdfSpinner","fetchPdf","pdfData","handlePrint","useReactToPrint","content","openedCondition","toggleSharePdf","shareWhatsApp","open","console","ToolInfoComp","Usp","class","App","setStepsState","setLoading","productid","stepIndex","newState","nextStepUpdate","prevStepUpdate","newStepsState","isLastStepFilled","currentStepState","Boolean","match","initialState","calculatorReducer","yearlyIncomeIndependent","it","loadLocaleData","rootReducer","combineReducers","createStore","composeWithDevTools","applyMiddleware","ReduxThunk","lang","messages","render","StrictMode","init","serviceWorker","ready","registration","unregister","catch"],"mappings":"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","file":"static/js/main.99721011.chunk.js","sourcesContent":["import {calculateMaximumMortgageByIncomeApi, calculateMonthlyCostsByMortgage} from './calculationsApi'\nimport {\n  getAdditionalEnergyLabelAmount\n} from \"./helpers\";\n\nexport const calculateByIncome = (data) => {\n\n    let isNhg = false;\n\n    return calculateMaximumMortgageByIncomeApi(data)\n        .then((response) => {\n            data.maxMortgageAmount = response.maxMortgageAmount;\n            data.Interest = (data.SelectedMortgageProvider) ? data.SelectedMortgageProvider.rentestand : response.interest;\n            if (typeof response.isNhg !== 'undefined') {\n              isNhg = response.isNhg;\n            }\n            return calculateMonthlyCostsByMortgage(data);\n\n        }).then(function _monthlyCosts(response) {\n            response.maxMortgageAmount = data.maxMortgageAmount;\n            response.interest = data.Interest;\n            response.isNhg = isNhg;\n            return response;\n        });\n};\n\nconst sustainabilityUplift = (cleanData, calculatedData) => {\n  //console.log('sustainabilityUplift', cleanData.EnergyLabel);\n  const energyLabel  = cleanData.EnergyLabel?.value;\n  calculatedData.maxMortgageAmount += getAdditionalEnergyLabelAmount(energyLabel, false);\n  if (!calculatedData.isHouseAffordable) {\n    if (calculatedData.totalNeededToBuyHouse < calculatedData.maxMortgageAmount) {\n      calculatedData.isHouseAffordable = true;\n    }\n  }\n  return calculatedData;\n}\n\n\n\n\nexport const rewriteApiData = (cleanData, calculatedData) => {\n  return sustainabilityUplift(cleanData, calculatedData);\n}\n\n","import {calculateByIncome, rewriteApiData} from '../../services/apiHelper'\nimport {\n  calculateMonthlyCostsByMortgage,\n  calculateYearlyIncome,\n  calculateYearlyIncomeIndependentApi,\n  CanIAffordThisHouseApi,\n  getBanksApi,\n  getMortgageProvider,\n  getMortgageProviders,\n  getNhg,\n  getSummaryPdf,\n  sharePdfViaEmail\n} from '../../services/calculationsApi'\nimport {store} from '../../index'\nimport {\n    SET_FIELD,\n    GET_BANK_BY_ID,\n    CALCULATE,\n    CALCULATE_INCOME,\n    CALCULATE_YEARLY_INCOME,\n    CALCULATE_YEARLY_INCOME_INDEPENDENT,\n    GET_MORTGAGE_PROVIDER,\n    GET_SUMMARY_PDF,\n    SHARE_PDF\n} from '../actionTypes/calculatorActionTypes'\nimport {removeDotsComas} from \"../../services/helpers\";\n\nexport const parseSearchQuery = (searchString, clean) => {\n    const result = {};\n    const entries = new URLSearchParams(searchString).entries();\n\n    for (const [key, value] of entries) {\n        // each 'entry' is a [key, value] tupple\n        result[key] = checkValueForCurrency(value, key);\n\n        if(clean) {\n          if (result.hasOwnProperty('share')) {\n            delete result[`share`];\n          }\n          // remove debug type param\n          if (result.hasOwnProperty('type')) {\n            delete result[`type`];\n          }\n        }\n    }\n\n    return Object.keys(result).length === 0 ? null : result;\n};\n\nconst checkValueForCurrency = (value, key) => {\n    return value;\n    /*let tmp;\n    switch (key) {\n        case 'Klant_Jaarinkomen':\n        case 'Onderpand_Koopsom':\n        case 'Partner_Jaarinkomen':\n            tmp = (value) ? '€ ' + value : value;\n        break;\n        default:\n            tmp = value;\n        break;\n    }\n\n    return tmp;*/\n}\n\nexport const setField = (field, value) => {\n    return {\n        type: SET_FIELD,\n        field,\n        value\n    };\n};\n\nexport const getMortgageProviderAction = (id, isnewbuilding, energyLabel) => {\n    return async (dispatch) => {\n\n        const mortgageProvider = await getMortgageProvider(id, isnewbuilding, energyLabel.value);\n\n        if(typeof store.getState().calculator?.SelectedMortgageProvider?.initial === \"undefined\") {\n          const mortgageProvidersNhg = await getMortgageProviders(mortgageProvider.hypotheekVorm, isnewbuilding, 0, mortgageProvider.rentevastePeriode, energyLabel);\n          const nhgLookupId = mortgageProvidersNhg.producten.find((p) => p.aanbiederId === mortgageProvider.aanbiederId)?.lookupId;\n          const isNhg = nhgLookupId === mortgageProvider.lookupId\n\n          // all producten ophalen voor renteBasis 100\n          const mortgageProviders100 = await getMortgageProviders(mortgageProvider.hypotheekVorm, isnewbuilding, 100, mortgageProvider.rentevastePeriode, energyLabel);\n          let nonNhgLookupId = mortgageProviders100.producten.find((p) => p.aanbiederId === mortgageProvider.aanbiederId)?.lookupId;\n          if (typeof nonNhgLookupId === \"undefined\") {\n            let mainBank = mortgageProviders100.producten.sort((a, b) => a.rentestand - b.rentestand)[0];\n            nonNhgLookupId = mainBank?.lookupId;\n          }\n\n          mortgageProvider.initial = {\n            isNhg: isNhg,\n            nhglookupId: nhgLookupId,\n            nonNhgLookupId: (nonNhgLookupId) ? nonNhgLookupId : nhgLookupId\n          }\n        }\n\n        dispatch({\n            type: GET_MORTGAGE_PROVIDER,\n            response: mortgageProvider\n        })\n    }\n}\n\n\nexport const affordCalcAction = (stepNumber, useBestDealInterest, getMonthlyCost) => {\n    return async (dispatch) => {\n        const cleanData = removeDotsComas(store.getState().calculator);\n\n        if (useBestDealInterest) {\n            cleanData.Interest = cleanData.InterestBestDeal;\n        }\n\n        if (cleanData.Interest <= 0 || !cleanData.Interest) {\n          let riskClass = 0;\n          const nhg = await getNhg();\n          if (parseInt(nhg.existingBuilding) <= parseInt(cleanData.Woning)) {\n            riskClass = 101;\n          }\n          const providers = await getMortgageProviders('Annuïteitenhypotheek', false, riskClass, 10, cleanData.EnergyLabel);\n          cleanData.Interest = providers.producten[0].rentestand;\n          dispatch(setField('Interest', cleanData.Interest));\n        }\n        let calculatedData = await CanIAffordThisHouseApi(cleanData);\n        if(calculatedData?.error) {\n            dispatch(setField('error', calculatedData?.error));\n            return;\n        }\n        calculatedData.maxMortgageAmount = calculatedData.customerMaximumMortgageAmount;\n        calculatedData.netMonthlyCostHouse = calculatedData.netMonthlyCost;\n        calculatedData.grossMonthlyCostHouse = calculatedData.grossMonthlyCost;\n\n        // if we need the monthlyCost for the calculatedData.customerMaximumMortgageAmount\n        // this is done when the mortgage history questions are filled in\n        // only then does the maxMortgageAmount differ\n        if(getMonthlyCost) {\n            cleanData.maxMortgageAmount = calculatedData.maxMortgageAmount;\n            await calculateMonthlyCostsByMortgage(cleanData).then((result) => {\n                calculatedData.netMonthlyCost = result.netMonthlyCost;\n                calculatedData.grossMonthlyCost = result.grossMonthlyCost;\n                //console.log(result)\n            });\n        } else {\n            // else we delete, since it is retrieved by\n            delete calculatedData.customerMaximumMortgageAmount;\n            delete calculatedData.netMonthlyCost;\n            delete calculatedData.grossMonthlyCost;\n        }\n\n        calculatedData = rewriteApiData(cleanData, calculatedData);\n\n\n        dispatch({\n            type: CALCULATE,\n            response: calculatedData,\n            stepNumber,\n        })\n    }\n};\n\n\nexport const mortgageCalcAction = (useBestDealInterest) => {\n    return async (dispatch) => {\n        const cleanData = removeDotsComas(store.getState().calculator);\n        if (useBestDealInterest) {\n          cleanData.Interest = cleanData.InterestBestDeal;\n        }\n        let calculatedData = await calculateByIncome(cleanData);\n        if(calculatedData?.error) {\n            dispatch(setField('error', calculatedData?.error));\n            return;\n        }\n\n\n        calculatedData = rewriteApiData(cleanData, calculatedData);\n\n        dispatch({\n            type: CALCULATE_INCOME,\n            response: calculatedData\n        })\n    }\n};\n\n\n\n\nexport const calculateYearlyIncomeAction = (data, field) => {\n    return async (dispatch) => {\n        const calculatedData = await calculateYearlyIncome(data);\n        if(calculatedData?.error) {\n            dispatch(setField('error', calculatedData?.error));\n            return;\n        }\n        dispatch({\n            type: CALCULATE_YEARLY_INCOME,\n            response: calculatedData,\n            field\n        })\n    }\n};\n\nexport const getSummaryPdfAction = (data, locale) => {\n    return async (dispatch) => {\n      if (locale === \"en\") {\n        data.language = locale\n      }\n        const pdfData = await getSummaryPdf(data);\n\n        dispatch({\n            type: GET_SUMMARY_PDF,\n            response: pdfData\n        })\n    }\n};\n\nexport const sharePdfAction = (data, locale) => {\n  if (locale === \"en\") {\n    data.language = locale\n  }\n    return async (dispatch) => {\n        const sharePdf = await sharePdfViaEmail(data);\n\n        dispatch({\n            type: SHARE_PDF,\n            response: sharePdf\n        })\n    }\n};\n\n\nexport const calculateYearlyIncomeIndependentAction = (data, field) => {\n    return async (dispatch) => {\n        const calculatedData = await calculateYearlyIncomeIndependentApi(data);\n\n        dispatch({\n            type: CALCULATE_YEARLY_INCOME_INDEPENDENT,\n            response: calculatedData,\n            field\n        })\n    }\n};\n\n\nexport const getBankByIdAction = () => {\n    return async (dispatch) => {\n        const bankIds = [\"AA\", \"RB\", \"IN\"];\n        const state = store.getState().calculator;\n        const bankData = await getBanksApi(state, state.response);\n\n        const banksList = bankData.producten.filter((item) => {\n            return bankIds.includes(item.aanbiederId);\n        });\n\n        let mainBank = bankData.producten.sort((a, b) => a.rentestand - b.rentestand)[0];\n        if (store.getState().calculator.SelectedMortgageProvider) {\n            mainBank = store.getState().calculator.SelectedMortgageProvider;\n        }\n\n        const uniqueBanks = banksList.reduce((uniq, item) => uniq.some(({ aanbiederId }) => aanbiederId === item.aanbiederId) ? uniq : [...uniq, item], []);\n        const { Woning } = store.getState().calculator;\n        for (const uniqueBank of uniqueBanks) {\n          if (Woning > 0) {\n            uniqueBank.response = await CanIAffordThisHouseApi(removeDotsComas(store.getState().calculator), uniqueBank.rentestand);\n          } else {\n            uniqueBank.response = await calculateMonthlyCostsByMortgage(removeDotsComas(store.getState().calculator), uniqueBank.rentestand, (state.Woning > 0) ? state.Woning : state.response.maxMortgageAmount);\n          }\n        }\n\n        dispatch({\n            type: GET_BANK_BY_ID,\n            bankData : {\n                mainBank,\n                otherBanks: uniqueBanks,\n                allBanks: bankData.producten\n            }\n        });\n\n        window.scrollTo(0, 0);\n    }\n};\n","export const SET_FIELD = 'SET_FIELD';\n\nexport const CALCULATE = 'CALCULATE';\n\nexport const CALCULATE_INCOME = 'CALCULATE_INCOME';\n\nexport const CALCULATE_YEARLY_INCOME = 'CALCULATE_YEARLY_INCOME';\n\nexport const CALCULATE_YEARLY_INCOME_INDEPENDENT = 'CALCULATE_YEARLY_INCOME_INDEPENDENT';\n\nexport const GET_BANK_BY_ID = 'GET_BANK_BY_ID';\n\nexport const SET_OTHER_BANK = 'SET_OTHER_BANK';\n\nexport const GET_SUMMARY_PDF = 'GET_SUMMARY_PDF';\n\nexport const GET_MORTGAGE_PROVIDER = 'GET_MORTGAGE_PROVIDER';\n\nexport const SHARE_PDF = 'SHARE_PDF';\n\nexport const RESET_STEPS = \"RESET_STEPS\";\n","import {parseSearchQuery} from \"../store/actions/calculatorActions\";\nimport {store} from \"../index\";\n\nexport const CALCULATOR_TYPES = {\n  hoeveelKanIkLenen: 'hoeveel-kan-ik-lenen',\n  watWordenMijnMaandLasten: 'wat-worden-mijn-maandlasten',\n  kanIkDitHuisBetalen: 'kan-ik-dit-huis-betalen'\n};\n\nexport const mainMediaMobile = \"(max-width: 1024px)\";\n\nconst PATH_TO_TYPE_MAP = {\n  'hoeveel-kan-ik-lenen': CALCULATOR_TYPES.hoeveelKanIkLenen,\n  'kan-ik-dit-huis-betalen': CALCULATOR_TYPES.kanIkDitHuisBetalen,\n  'wat-worden-mijn-maandlasten': CALCULATOR_TYPES.watWordenMijnMaandLasten,\n  'maximum-mortgage': CALCULATOR_TYPES.hoeveelKanIkLenen,\n  'mortgage-payment': CALCULATOR_TYPES.watWordenMijnMaandLasten,\n  'can-i-afford-this-house': CALCULATOR_TYPES.kanIkDitHuisBetalen\n};\n\nexport const getCalculatorType = () => {\n  const { pathname } = window.location;\n  const queryParams = parseSearchQuery(window.location.search);\n  let type = CALCULATOR_TYPES.watWordenMijnMaandLasten; // Default type\n\n  for (const path in PATH_TO_TYPE_MAP) {\n    if (pathname.includes(path)) {\n      type = PATH_TO_TYPE_MAP[path];\n      break;\n    }\n  }\n\n  if (queryParams && typeof queryParams.type !== 'undefined' && PATH_TO_TYPE_MAP[queryParams.type]) {\n    type = PATH_TO_TYPE_MAP[queryParams.type];\n  }\n\n  return type;\n};\n\nexport const stepStates = {\n    active: \"active\",\n    filled: \"filled\",\n    inactive: \"inactive\",\n    closed: \"closed\",\n};\n\nconst getDefaultStepState = () => {\n    let state = !hasShareParam() ? [\n        stepStates.active,\n        stepStates.inactive,\n        stepStates.inactive,\n        stepStates.inactive,\n        stepStates.inactive,\n    ] : [\n        stepStates.filled,\n        stepStates.filled,\n        stepStates.filled,\n        stepStates.filled,\n        stepStates.filled,\n    ];\n\n    if (getCalculatorType() === CALCULATOR_TYPES.watWordenMijnMaandLasten) {\n        state = state.filter((v, i) => i !== 2)\n    }\n\n    return state;\n}\n\nexport const defaultStepsState = getDefaultStepState();\n\nexport const removeDotsComas = (calculator) => {\n    const calculatorCopy = { ...calculator };\n\n    for (let field in calculator) {\n        if (\n            typeof calculator[field] === \"string\" &&\n            calculator[field].search(/,|\\./gm) !== -1\n        ) {\n            calculatorCopy[field] = calculator[field].replace(/,|\\./g, \"\");\n        }\n    }\n\n    return calculatorCopy;\n};\n\nexport const rewriteRadioOptionsClasses = (parent, classes) => {\n    const el = document.getElementsByClassName(parent);\n\n    if (typeof el[0] !== \"undefined\") {\n        for (let i = 0; i < el[0].children.length; i++) {\n            el[0].children[i].classList.add(`${parent}-${classes[i]}`);\n        }\n    }\n};\n\nexport const rewriteSelectIds = (parent, prefix) => {\n    setTimeout(function () {\n        const el = document.getElementsByClassName(parent);\n        if (typeof el[0] !== \"undefined\") {\n            for (var i = 0; i < el[0].children.length; i++) {\n                el[0].children[i].id = `${prefix}-${parseInt(\n                    el[0].children[i].innerHTML\n                )}`;\n            }\n        }\n    });\n};\n\nexport const numberToCurrency = (number, format = true) => {\n    if (number && !format) {\n        return `€ ${number}`;\n    } else if(number && format) {\n      const language = getLanguage();\n      const locale = (language === 'nl') ? 'nl-NL' : 'en-US';\n        var formatter = new Intl.NumberFormat(locale, {\n            //style: 'currency',\n            //currency: 'EUR',\n            maximumFractionDigits: 0,\n            minimumFractionDigits: 0\n        });\n        return `€ ${formatter.format(number)}`;\n    }\n}\n\nexport const currencyToNumber = (value, mustBeNumber, log) => {\n    if (typeof value === 'number') return value;\n    if (value) {\n      value = value.replaceAll(\"€\", \"\");\n      value = value.replaceAll(/[,.]/g,'');\n      value = value.replaceAll(/\\s/g, '');\n    } else {\n      value = null;\n    }\n    //value = (value) ? value.replaceAll(\"€ \", \"\") : null;\n  if (log) {\n    //console.log(value)\n  }\n    if (value) {\n        value = parseFloat(value);\n        if(Math.round(value) !== value) {\n            value = value.toFixed(2);\n        }\n\n        return Math.round(value);\n    }\n    return (!mustBeNumber) ? value : 0;\n};\n\nexport const remapObject = (object, mapping) => {\n    const result = {};\n    for (const prop in object) {\n        for (const map in mapping) {\n            if (map === prop) {\n                result[mapping[map]] = object[prop];\n            }\n        }\n    }\n    return result;\n};\n\nexport const monthDiff = (dateFrom, dateTo) => {\n    return dateTo.getMonth() - dateFrom.getMonth() +\n    (12 * (dateTo.getFullYear() - dateFrom.getFullYear()))\n}\n\nexport const convertToDateObject = (dateString) => {\n    const parts = dateString.split('-');\n    return new Date(parts[0], parts[1] - 1, parts[2]);\n}\n\nexport const getPercentage = (amount, percentage) => {\n  //console.log(Math.round((amount / 100) * percentage))\n  return Math.round((amount / 100) * percentage);\n}\n\nexport const getLanguage = () => {\n    return window.location.pathname.includes('/en/') ? 'en' : 'nl';\n}\n\nexport const setBodyDataForPdf = (state) => {\n    let bodyData = {\n        yearlyIncome: state.ApplicantYearlyIncome ? state.ApplicantYearlyIncome : 0,\n        yearlyIncomePartner: state.PartnerYearlyIncome ? state.PartnerYearlyIncome : 0,\n        creditsAndLoans: state.HasLoans ? (+state.Loans +state.StudentDebtMonthlyPayment +state.Alimony +state.PrivateLeaseAmount) : 0,\n        maximumMortgage: state.response.maxMortgageAmount ? state.response.maxMortgageAmount : 0,\n        grossMonthlyCosts: state.response.grossMonthlyCost ? state.response.grossMonthlyCost : 0,\n        netMonthlyCosts: state.response.netMonthlyCost ? state.response.netMonthlyCost : 0,\n        applicableGrossMonthlyCosts: state.response.grossMonthlyCostHouse ? state.response.grossMonthlyCostHouse : 0,\n        applicableNetMonthlyCosts: state.response.netMonthlyCostHouse ? state.response.netMonthlyCostHouse : 0,\n        askingHousePrice: (state.Woning) ? state.Woning : 0,\n        //buyerCosts: state.response.buyerCosts ? state.response.buyerCosts : 0,\n        //houseTotalCosts: state.response.totalNeededToBuyHouse ? state.response.totalNeededToBuyHouse: 0,\n        ownResources: state.OwnResources ? state.OwnResources : 0,\n        homeEquity: state.HomeEquity ? state.HomeEquity : 0,\n        extraInsert: state.response.extraMoneyNeeded ? state.response.extraMoneyNeeded : 0,\n        mortgageType: state.MortgageType === \"Annuïteitenhypotheek\" ? \"Annuïteiten\" : \"Lineair\",\n        interest: state.Interest ? state.Interest : 0,\n        fixedInterestPeriod: state.RentevastePeriode ? state.RentevastePeriode : 1,\n        riskClass: state.response.riskClass ? state.response.riskClass : 0,\n        isNhg: state.response.isNhg,\n        hasHouse: state.HasHouse === \"true\",\n        mortgageHistory: null,\n        calculatorType: getCalculatorType()\n\n    };\n\n    if (state.HasHouse === \"true\" && !state.WantsToSkipMortgageQuestions) {\n        bodyData = {...bodyData, mortgageHistory: {\n                houseSalePrice: state.HomeEquity,\n                houseSaleCosts: state.HomeEquityCosts,\n                houseMortgageValue: state.HomeMortgageAmount,\n                housePartMortgageValue: (state.HomeMortgageOtherPartAmount) ? state.HomeMortgageOtherPartAmount : 0,\n                houseMortgageDateStart: (state.HomeMortgageStart) ? `${state.HomeMortgageStart}T00:00:00.299Z`: null, // \"2021-08-17T20:53:40.651Z\",\n                isHouseMortageDateStartedBefore2013: state.HomeMortgageStartBefore2013,\n                isHouseMortageCompletelyAnnuityOrLinear: state.HomeMortgageIsBeingPaidOff\n            }\n        }\n    }\n\n    return bodyData;\n}\n\n/*\nHomeMortgageAmount(pin):250000\nHomeMortgageIsBeingPaidOff(pin):true\nHomeMortgageStartNotKnown(pin):true\nHomeMortgageStartBefore2013(pin):false\nHomeMortgageOtherPartAmount(pin):null\n */\n\nexport const createPostObject = (data, type) => {\n\n  data.StudentDebtMonthlyPayment = calculateStudentDebt(data.StudentDebtAmount, data.Interest);\n\n  if (data.ApplicantAge > 67) {\n        data.ApplicantAOW = data.ApplicantYearlyIncome;\n    }\n\n    if (data.PartnerAge > 67) {\n        data.PartnerAOW = data.PartnerYearlyIncome;\n    }\n    let object = {\n        mortgageType: (data.MortgageType === \"Annuïteitenhypotheek\" || data.MortgageType === \"Annuiteitenhypotheek\") ? 4 : 9,\n        applicant: {\n            age: (data.ApplicantAge === 0) ? 35 : data.ApplicantAge,\n            yearlyIncome: data.ApplicantYearlyIncome || 0,\n            statePensionIncome: data.ApplicantAOW,\n            oldAgePensionIncome: data.ApplicantAnnualPensionIncome,\n        },\n        partner: {\n            age: (data.PartnerAge === 0) ? 35 : data.PartnerAge,\n            yearlyIncome: data.PartnerYearlyIncome || 0,\n            statePensionIncome: data.PartnerAOW,\n            oldAgePensionIncome: data.PartnerAnnualPensionIncome,\n        },\n        interestRate: data.Interest,\n        fixedInterestPeriod: (data.RentevastePeriode > 1) ? data.RentevastePeriode : 1,\n        loans: (data.Loans + data.StudentDebtMonthlyPayment + data.PrivateLeaseAmount),\n        alimony: data.Alimony,\n\n    };\n\n    if (getCalculatorType() === CALCULATOR_TYPES.watWordenMijnMaandLasten) {\n        const {stepState, stepNumber} = store.getState().calculator;\n        if(stepState[1] === 'inactive' && stepNumber === 0) {\n            object.applicant.yearlyIncome = 34000;\n            object.applicant.age = 35;\n        }\n    }\n\n    if (data.HasHouse === \"true\" && !data.WantsToSkipMortgageQuestions) {\n      object = {\n        ...object, ...{ mortgageHistory : {\n            houseSalePrice: data.HomeEquity,\n            houseSaleCosts: data.HomeEquityCosts,\n            houseMortgageValue: data.HomeMortgageAmount,\n            housePartMortgageValue: (data.HomeMortgageOtherPartAmount) ? data.HomeMortgageOtherPartAmount : 0,\n            houseMortgageDateStart: (data.HomeMortgageStart) ? `${data.HomeMortgageStart}T20:55:57.299Z`: null, // \"2021-08-17T20:53:40.651Z\",\n            isHouseMortageDateStartedBefore2013: data.HomeMortgageStartBefore2013,\n            isHouseMortageCompletelyAnnuityOrLinear: data.HomeMortgageIsBeingPaidOff\n          }\n        }\n      };\n\n    }\n\n    if (type === 'monthlycostsbymortgage') {\n\n        object = {\n            ...object, ...{\n                mortageAmount: (data.maxMortgageAmount === 0) ? 1 : data.maxMortgageAmount\n            }\n        };\n\n    }\n    if (type === 'caniaffordthishouse') {\n        object = {\n            ...object, ...{\n                isNewBuilding: parseInt(data.IsNieuwbouw) === 2,\n                purchasePrice: parseInt(data.Woning),\n                ownMoney: (data.OwnResources) ? parseInt(data.OwnResources) : 0,\n                surplus: (data.HomeEquity)? parseInt(data.HomeEquity) : 0\n            }\n        };\n    }\n\n    if (typeof data.ApplicantAOW === 'undefined' || !data.ApplicantAOW) {\n        delete object.applicant.statePensionIncome;\n    }\n\n    if (!data.ApplicantAnnualPensionIncome) {\n        delete object.applicant.oldAgePensionIncome;\n    }\n\n    if (typeof data.PartnerAOW === 'undefined' || !data.PartnerAOW) {\n        delete object.partner.statePensionIncome;\n    }\n\n    if (!data.PartnerAnnualPensionIncome) {\n        delete object.partner.oldAgePensionIncome;\n    }\n\n    if (!data.HasPartner) {\n        delete object.partner;\n    }\n\n    return object;\n}\n\nexport function hasShareParam() {\n    const params = parseSearchQuery(window.location.search);\n    if (params && typeof params.share !== 'undefined') {\n        return params.share;\n    }\n}\n\nexport function addOfficeIdParamToLink(link) {\n  const params = parseSearchQuery(window.location.search);\n  if (params && typeof params.officeid !== 'undefined') {\n    return `${link}?officeid=${params.officeid}`;\n  }\n  return link;\n}\n\nexport const getAdditionalEnergyLabelAmount = (energyLabel, isSustainabilityUplift) => {\n  switch (energyLabel) {\n    case \"-\":\n      return isSustainabilityUplift ? 10000 : 0;\n    case \"G\":\n    case \"F\":\n    case \"E\":\n      return isSustainabilityUplift ? 20000 : 0;\n    case \"D\":\n    case \"C\":\n      return isSustainabilityUplift ? 15000 : 5000;\n    case \"B\":\n    case \"A\":\n      return isSustainabilityUplift ? 10000 : 10000;\n    case \"AP\":\n    case \"APP\":\n      return isSustainabilityUplift ? 10000 : 20000;\n    case \"APPP\":\n      return isSustainabilityUplift ? 10000 : 30000;\n    case \"APPPP\":\n      return isSustainabilityUplift ? 0 : 40000;\n    case \"APPPPP\":\n      return isSustainabilityUplift ? 0 : 50000;\n    default:\n      return 0;\n  }\n}\n\n// create a function to calculate the student debt\nexport const calculateStudentDebt = (studentDebtAmount, currentInterestRate) => {\n  // Determine the multiplier based on the current mortgage interest rate\n  let multiplier;\n  if (currentInterestRate < 2.00) {\n    multiplier = 1.05;\n  } else if (currentInterestRate < 2.50) {\n    multiplier = 1.10;\n  } else if (currentInterestRate < 3.00) {\n    multiplier = 1.15;\n  } else if (currentInterestRate < 3.50) {\n    multiplier = 1.20;\n  } else if (currentInterestRate < 4.00) {\n    multiplier = 1.20;\n  } else if (currentInterestRate < 4.50) {\n    multiplier = 1.25;\n  } else if (currentInterestRate < 5.00) {\n    multiplier = 1.3;\n  } else if (currentInterestRate < 5.50) {\n    multiplier = 1.3;\n  } else if (currentInterestRate < 6.00) {\n    multiplier = 1.35;\n  } else {\n    multiplier = 1.40;\n  }\n\n  // Apply the multiplier to the cost\n  const costWithMultiplier = Math.round(studentDebtAmount * multiplier);\n  //console.log('studentLoanAmount', costWithMultiplier);\n  //console.log('currentInterestRate', currentInterestRate);\n  //console.log('multiplier', multiplier);\n  return costWithMultiplier;\n};\n\n\nexport const checkMobileBrowser = (browserName) => {\n  return (\n  /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(\n  browserName\n  ) ||\n  /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw(n|u)|c55\\/|capi|ccwa|cdm|cell|chtm|cldc|cmd|co(mp|nd)|craw|da(it|ll|ng)|dbte|dcs|devi|dica|dmob|do(c|p)o|ds(12|d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(|_)|g1 u|g560|gene|gf5|gmo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd(m|p|t)|hei|hi(pt|ta)|hp( i|ip)|hsc|ht(c(| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i(20|go|ma)|i230|iac( ||\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|[a-w])|libw|lynx|m1w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|mcr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|([1-8]|c))|phil|pire|pl(ay|uc)|pn2|po(ck|rt|se)|prox|psio|ptg|qaa|qc(07|12|21|32|60|[2-7]|i)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h|oo|p)|sdk\\/|se(c(|0|1)|47|mc|nd|ri)|sgh|shar|sie(|m)|sk0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h|v|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl|tdg|tel(i|m)|tim|tmo|to(pl|sh)|ts(70|m|m3|m5)|tx9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas|your|zeto|zte/i.test(\n  browserName.substr(0, 4)\n  )\n  );\n};\n","import {createPostObject} from \"./helpers\";\n\nexport const assetsBaseUrl =\nprocess.env.NODE_ENV === \"production\" ? \"/calculator\" : \"\";\n\nconst getApiUrl = (version) => {\n  const {hostname} = window.location;\n  let api = (version !== 2) ? 'https://api.hypotheker.nl' : 'https://api.hypotheker.nl/v2';\n\n  if (hostname.indexOf('staging') !== -1) {\n    api = (version !== 2) ? 'https://api.hypotheker.nl' : 'https://staging-api.hypotheker.nl/v2';\n  }\n\n  if (hostname.indexOf('test') !== -1) {\n    api = (version !== 2) ? 'https://testapi.hypotheker.nl' : 'https://test-api.hypotheker.nl/v2';\n  }\n\n  if (hostname.indexOf('acc') !== -1) {\n    api = (version !== 2) ? 'https://acpapi.hypotheker.nl' : 'https://acc-api.hypotheker.nl/v2';\n  }\n\n  if (hostname.indexOf('localhost') !== -1) {\n    api = (version !== 2) ? 'https://api.hypotheker.nl' : 'https://acc-api.hypotheker.nl/v2';\n  }\n\n  return api;\n};\n\nexport const CanIAffordThisHouseApi = async (data, interest) => {\n\n  if (interest) {\n    data.Interest = interest;\n  }\n  let response = await fetch(\n    `${getApiUrl(2)}/calculator/caniaffordthishouse`,\n    {\n      method: \"POST\",\n      body: JSON.stringify(createPostObject(data, 'caniaffordthishouse')),\n      headers: {\n        Accept: \"application/json\",\n        \"Content-Type\": \"application/json\",\n      },\n      redirect: \"follow\",\n    }\n  );\n\n  if (response.status >= 500) {\n    return {'error': true };\n  }\n  return response.json(); // error on 500\n};\n\nexport const calculateMaximumMortgageByIncomeApi = async (data) => {\n\n  let response = await fetch(\n  `${getApiUrl(2)}/calculator/maximummortgagebyincome`,\n  {\n    method: \"POST\",\n    headers: {\n      Accept: \"application/json\",\n      \"Content-Type\": \"application/json\",\n    },\n    body: JSON.stringify(createPostObject(data)),\n    redirect: \"follow\",\n  }\n  );\n\n  if (response.status >= 500) {\n    return {'error': true };\n  }\n  return response.json(); // error on 500\n};\n\nexport const getNhg = async () => {\n\n  let response = await fetch(\n  `${getApiUrl(2)}/nhg`,\n  {\n    method: \"GET\",\n    headers: {\n      Accept: \"application/json\",\n      \"Content-Type\": \"application/json\",\n    },\n  }\n  );\n\n  return response.json();\n}\n\nexport const getMortgageProviders = async (MortgageType, IsNieuwbouw, RenteBasis, RentevastePeriode, EnergyLabel) => {\n\n  const getParamEnergyLabel = EnergyLabel ? (EnergyLabel.value === 'APPPPP') ? 'APPPP' : EnergyLabel.value : '';\n  let response = await fetch(\n  `${getApiUrl(2)}/interestrates/hypotheekaanbieders?HypotheekVorm=${MortgageType}&IsNieuwbouw=${IsNieuwbouw}&RenteBasis=${RenteBasis}&RentevastePeriode=${RentevastePeriode}&EnergyLabel=${getParamEnergyLabel}`,\n  {\n    method: \"GET\",\n    headers: {\n      Accept: \"application/json\",\n      \"Content-Type\": \"application/json\",\n    },\n  }\n  );\n\n  return response.json();\n}\n\nexport const getMortgageProvider = async (id, isnewbuilding, energyLabel) => {\n  //console.log(isnewbuilding)\n  let response = await fetch(\n  `${getApiUrl(2)}/interestrates/hypotheekaanbieders/${id}?isNewBuilding=${isnewbuilding}&energyLabel=${energyLabel}`,\n  {\n    method: \"GET\",\n    headers: {\n      Accept: \"application/json\",\n      \"Content-Type\": \"application/json\",\n    }\n  }\n  );\n\n  return response.json();\n}\n\nexport const calculateMonthlyCostsByMortgage = async (data, interest, maxMortgageAmount) => {\n\n  if (interest) {\n    data.Interest = interest;\n  }\n\n  if (maxMortgageAmount) {\n    data.maxMortgageAmount = maxMortgageAmount;\n  }\n\n  let response = await fetch(\n  `${getApiUrl(2)}/calculator/monthlycostsbymortgage`,\n  {\n    method: \"POST\",\n    body: JSON.stringify(createPostObject(data, 'monthlycostsbymortgage')),\n    headers: {\n      Accept: \"application/json\",\n      \"Content-Type\": \"application/json\",\n    },\n    redirect: \"follow\"\n  }\n  );\n\n  if (response.status >= 500) {\n    return {'error': true };\n  }\n  return response.json(); // error on 500\n};\n\nexport const getBanksApi = async (\n{MortgageType, RentevastePeriode, IsNieuwbouw, Woning, EnergyLabel},\n{riskClass, isNhg}\n) => {\n  let RenteBasis = 100;\n  if (typeof Woning !== \"undefined\") {\n    if (Woning > 0) {\n      RenteBasis = riskClass;\n    } else if (isNhg) {\n      RenteBasis = 0;\n    }\n  }\n\n  return await getMortgageProviders(MortgageType, parseInt(IsNieuwbouw) === 2, RenteBasis, RentevastePeriode, EnergyLabel);\n};\n\nexport const getShortUrl = async (url, addOn) => {\n\n  if (!addOn) {\n    addOn = '';\n  }\n  /*let data = {\n    \"group_guid\": \"Bl64hUIxk07\",\n    \"domain\": \"bit.ly\",\n    \"long_url\": url\n  }*/\n\n  let data = {\n    \"groupId\": \"Be33b2VNMyq\",\n    \"domain\": \"berekenen.hypotheker.nl\",\n    \"longUrl\": `${url}${addOn}`\n  }\n\n  let response = await fetch(\n  `${getApiUrl(2)}/urlshortening`,\n  {\n    method: \"POST\",\n    headers: {\n      Accept: \"application/json\",\n      \"Content-Type\": \"application/json\",\n      //Authorization: \"Bearer f8c2e48062804025e994e7d98d37e2ad0517812e\"\n      Authorization: \"Bearer b4916c1b36fb25378359c58936862bfc3d1e3d15\"\n    },\n    body: JSON.stringify(data),\n  }\n  );\n\n  return response.json();\n}\n\nexport const calculateYearlyIncome = async (data) => {\n  let response = await fetch(\n  `${getApiUrl(2)}/calculator/calculateyearlyincome`,\n  {\n    method: \"POST\",\n    headers: {\n      Accept: \"application/json\",\n      \"Content-Type\": \"application/json\",\n    },\n    body: JSON.stringify(data),\n  }\n  );\n\n  return response.json();\n};\nexport const getSummaryPdf = (data) => {\n return fetch(\n  `${getApiUrl(2)}/calculator/pdf`,\n  {\n    method: \"POST\",\n    mode: \"cors\",\n    headers: {\n      Accept: \"application/json\",\n      \"Content-Type\": \"application/json\",\n    },\n    xhrFields: {\n      responseType: \"blob\",\n    },\n    body: JSON.stringify(data),\n  })\n  .then((response) => response.blob())\n  .then((blob) => {\n    // Create blob link to download\n    const url = window.URL.createObjectURL(new Blob([blob]));\n    const link = document.createElement(\"a\");\n    link.href = url;\n    link.setAttribute(\"download\", `berekening-De-Hypotheker.pdf`);\n\n    // Append to html link element page\n    document.body.appendChild(link);\n\n    // Start download\n    link.click();\n\n    // Clean up and remove the link\n    link.parentNode.removeChild(link);\n  });\n};\n\nexport const sharePdfViaEmail = async (data) => {\n  try {\n    let response = await fetch(\n    `${getApiUrl(2)}/calculator/email`,\n    {\n      method: 'POST',\n      headers: {\n        'Accept': 'application/json',\n        'Content-Type': 'application/json'\n      },\n      body: JSON.stringify(data)\n    });\n\n    //console.log(response)\n    if (response.status === 200) {\n      return {\n        state: 'mailed',\n        success: true,\n        message: 'Email is verstuurt'\n      }\n    } else {\n      return {\n        state: 'mailed',\n        success: false,\n        message: 'Email is niet verstuurt'\n      }\n    }\n  } catch (e) {\n\n  }\n\n};\n\n\n// copied\nexport const calculateYearlyIncomeIndependentApi = async (postData) => {\n  const url =\n  \"https://raadhuys.nodum.io/api/hypotheker-api?apiKey=91da9493217153354c8e954b3ecfb5dbc21f431f\" +\n  \"&ld1=\" +\n  (Number(postData.ld1) ? postData.ld1 : 0) +\n  \"&lvu1=\" +\n  (Number(postData.lvu1) ? postData.lvu1 : 0) +\n  \"&ov1=\" +\n  (Number(postData.ov1) ? postData.ov1 : 0) +\n  \"&sfw1=\" +\n  (Number(postData.sfw1) ? postData.sfw1 : 0) +\n  \"&bpga1=\" +\n  (Number(postData.bpga1) ? postData.bpga1 : 0) +\n  \"&ld2=\" +\n  (Number(postData.ld2) ? postData.ld2 : 0) +\n  \"&lvu2=\" +\n  (Number(postData.lvu2) ? postData.lvu2 : 0) +\n  \"&ov2=\" +\n  (Number(postData.ov2) ? postData.ov2 : 0) +\n  \"&sfw2=\" +\n  (Number(postData.sfw2) ? postData.sfw2 : 0) +\n  \"&bpga2=\" +\n  (Number(postData.bpga2) ? postData.bpga2 : 0) +\n  \"&ld3=\" +\n  (Number(postData.ld3) ? postData.ld3 : 0) +\n  \"&lvu3=\" +\n  (Number(postData.lvu3) ? postData.lvu3 : 0) +\n  \"&ov3=\" +\n  (Number(postData.ov3) ? postData.ov3 : 0) +\n  \"&sfw3=\" +\n  (Number(postData.sfw3) ? postData.sfw3 : 0) +\n  \"&bpga3=\" +\n  (Number(postData.bpga3) ? postData.bpga3 : 0);\n\n  let response = await fetch(url, {\n    method: \"GET\",\n  });\n\n  return response.json();\n};\n","import React from 'react';\nimport { useMediaQuery } from '@react-hook/media-query';\nimport { FormattedMessage } from 'react-intl';\n\nimport { assetsBaseUrl } from \"../services/calculationsApi\";\nimport {addOfficeIdParamToLink, mainMediaMobile} from \"../services/helpers\";\n\nfunction Header() {\n  const mediaMatches = useMediaQuery(mainMediaMobile);\n\n  return (\n  <header className=\"ct-header\">\n    <div className=\"ct-header__content\">\n      <div>\n        <a href=\"https://www.hypotheker.nl/\">\n          <img style={ (!mediaMatches) ? { marginTop: 25 } : {} } height={ (mediaMatches) ? 48 : 90} src={`${assetsBaseUrl}/assets/${mediaMatches ? 'logo-no-text-40-year.svg' : 'logo-no-text-40-year.svg'}`} alt=\"Jazeker. De Hypotheker\"/>\n        </a>\n      </div>\n\n      <div className=\"ct-header__buttons\">\n        <a href=\"https://www.hypotheker.nl/vestigingen/\" className=\"ct__button ct-header__vestigingen\">\n          <FormattedMessage id=\"header.branches\" defaultMessage=\"Vestigingen\" />\n        </a>\n\n        <a href={addOfficeIdParamToLink(`https://www.hypotheker.nl/afspraak-maken-hypotheekadviseur/`)} className=\"ct__button ct-header__afspraak\">\n          <FormattedMessage id=\"header.appointment\" defaultMessage=\"Afspraak maken\" />\n        </a>\n      </div>\n    </div>\n  </header>\n  );\n}\n\nexport default Header;\n","import React from 'react';\nimport {useDispatch,} from \"react-redux\";\nimport {stepStates} from '../../../services/helpers';\nimport {assetsBaseUrl} from \"../../../services/calculationsApi\";\nimport {useMediaQuery} from \"@react-hook/media-query\";\nimport {mainMediaMobile} from \"../../../services/helpers\";\nimport {setField} from \"../../../store/actions/calculatorActions\";\n\nexport const stepTitles = [\n    'Bruto jaarinkomen',\n    \"Kredieten en leningen\",\n    \"Woning\",\n    \"Inleg eigen geld\",\n    'Hypotheekvorm'\n];\n\nfunction StepHeader({title, stepNumber, stepState, openStep, stepSummary, onClose}) {\n    let backLink;\n    const dispatch = useDispatch();\n    const mediaMatches = useMediaQuery(mainMediaMobile);\n\n    const openPrevStep = () => {\n        dispatch(setField('lastActiveStepIndex', stepNumber - 1));\n\n        openStep(stepNumber, false, true);\n    };\n\n    if (mediaMatches) {\n        if (stepNumber === 0) {\n            backLink = (\n                <a href={document.referrer} className=\"ct_back-button-mobile\">\n                    <img src={`${assetsBaseUrl}/assets/svg/arrow-down-secondary.svg`} alt=\"\"/>Terug\n                </a>\n            );\n        } else {\n            backLink = (\n                <button href={void(0)} className=\"ct_back-button-mobile ct_back-button-mobile--button\" onClick={openPrevStep}>\n                    <img src={`${assetsBaseUrl}/assets/svg/arrow-down-secondary.svg`} alt=\"\"/>{stepTitles[stepNumber - 1]}\n                </button>\n            )\n        }\n    }\n\n    const toggleStep = () => {\n      if (stepState !== stepStates.inactive && !mediaMatches) {\n        openStep(stepNumber);\n      }\n      if (stepState === stepStates.active && stepStates.filled && onClose) {\n        onClose();\n      }\n    };\n\n    return (\n        <div className=\"ct-step__header\" onClick={() => toggleStep()}>\n            <div className=\"ct-step__header-left\">\n                {stepState === stepStates.filled && (\n                    <div className=\"ct-step__header-left-icon\">\n                        <img src={`${assetsBaseUrl}/assets/svg/check.svg`} alt=\"\"/>\n                    </div>\n                )}\n\n                <div className={\n                    `ct-step__header-left-title ${(stepState === stepStates.inactive\n                        || stepState === stepStates.filled) ? \"ct-step__header-left-title-inactive\" : null}`}\n                >\n                    {backLink}\n\n                    <div>\n                        {title}\n                    </div>\n                </div>\n            </div>\n\n            {stepState !== stepStates.inactive ?\n                <div className=\"ct-step__header-right\">\n                    <div>\n                        {stepSummary}\n                    </div>\n\n                    {(stepState === stepStates.filled || stepState === stepStates.closed) ? (\n                        <div className=\"ct-step__header-open-button\">\n                            <img src={`${assetsBaseUrl}/assets/svg/arrow.svg`} alt=\"\"/>\n                        </div>\n                    ) : (\n                        <div className=\"ct-step__header-close-button\">\n                            &ndash;\n                        </div>\n                    )}\n                </div>\n                : null}\n        </div>\n    );\n}\n\nexport default StepHeader;\n","import TagManager from \"react-gtm-module\";\n\nexport const gtm = (tagManagerArgs) => {\n\tif (window.location.hostname !== 'localhost') {\n\t\tTagManager.initialize(tagManagerArgs);\n\t}else {\n        //console.log(\"tagManagerArgs\", tagManagerArgs);\n    }\n}\n","import React, {useEffect} from 'react'\nimport { assetsBaseUrl } from \"../../services/calculationsApi\";\nimport {currencyToNumber, numberToCurrency} from \"../../services/helpers\";\nimport {gtm} from '../../services/gtm'\nimport {useIntl} from \"react-intl\";\n\nfunction errorInfo(error, value) {\n    // console.log(validationRules[error.type], error.ref.value)\n    switch (error.type) {\n        case \"required\":\n            return error;\n        case \"min\":\n            return value && value.length > 1;\n\n        case \"max\":\n            return error;\n        default:\n            return error;\n    }\n}\n\nfunction Input({\n    name,\n    label,\n    inputType,\n    icon,\n    iconText,\n    onIconClick,\n    className,\n    placeholder,\n    register,\n    validationRules,\n    type,\n    error,\n    isDisabled,\n    value,\n    errorTitle,\n    valueType,\n}) {\n    const intl = useIntl();\n    let viewValue = value;\n    const highAgeCondition =\n        valueType === \"age\" &&\n        value &&\n        value.length > 1 &&\n        value > 56 &&\n        value < 67;\n\n    useEffect(() => {\n        if (!highAgeCondition) return;\n        const tagManagerArgs = {\n            gtmId: 'GTM-T78CX5',\n            dataLayer: {\n                event: 'gtm.calculators',\n                eventCategory: \"Calculator\",\n                eventAction: 'Bruto Jaarinkomen',\n                eventLabel: 'pensioeninkomen en aow gevraagd'\n            }\n        };\n        gtm(tagManagerArgs);\n\n    }, [highAgeCondition])\n    if (!register) {\n        return null;\n    }\n\n    let errorCondition;\n\n    if (error) {\n        errorCondition = errorInfo(error, value);\n    }\n\n    function getType(type) {\n        if (type === \"currency\") {\n            return \"text\";\n        }\n        return type ? type : \"text\";\n    }\n\n    function setType($event, type, action) {\n        if (type === \"currency\") {\n            // if it is a int (even 0) on blur we return it and Math.round\n            // if it is not an int we return null\n            // always round up\n            if (action === \"blur\") {\n                //viewValue = ($event.target.value > 0) ? Math.ceil($event.target.value) : $event.target.value\n                viewValue = $event.target.value\n            } else {\n                viewValue = currencyToNumber($event.target.value);\n            }\n\n            $event.target.type = action === \"focus\" ? \"number\" : \"text\";\n            $event.target.value = action === \"blur\" ? (viewValue) ? numberToCurrency(viewValue) : null : viewValue;\n        }\n    }\n\n    return (\n        <div\n            className={`ct-input_wrapper\n            ${inputType === \"secondary\" ? \"ct-input_wrapper-secondary\" : null}\n            ${valueType === \"-\" ? \"minus-currency\" : null}`}\n        >\n            {label && <div className=\"ct-input-label\">{label}</div>}\n\n            <div\n                className={`ct-input ${className} ${\n                    (errorCondition || highAgeCondition || error) && \"ct-input-error\"\n                    //(errorCondition) && \"ct-input-error\"\n                } ${(iconText) && \"ct-input--short-border\"}`}\n            >\n                <input\n                    autoComplete=\"off\"\n                    onFocus={e => setType(e,type, 'focus')}\n                    onBlur={e => setType(e, type, 'blur')}\n                    onWheel={e => e.target.blur()}\n                    type={getType(type)}\n                    name={name}\n                    disabled={isDisabled}\n                    placeholder={placeholder}\n                    ref={register(validationRules)}\n                />\n\n                {icon && (\n                    <div className={`ct-input-icon ${(iconText) && 'ct-input-icon--text'}`} onClick={onIconClick}>\n                        <img src={assetsBaseUrl + icon} alt=\"\" /> <div dangerouslySetInnerHTML={{__html: iconText}} />\n                    </div>\n                )}\n\n                {inputType === \"secondary\" && (\n                    <div className=\"ct-input-currency\">\n                        {valueType === \"-\" ? valueType : null} €\n                    </div>\n                )}\n            </div>\n\n            {errorCondition && (\n                <div className=\"ct-input_error-msg\">\n                    {error.type === \"required\" &&\n                    intl.formatMessage(\n                    {\n                      id: \"general.validations.required\",\n                      defaultMessage: \"Je bent je {errorTitle} vergeten in te vullen.\",\n                    },\n                    {\n                      errorTitle,\n                    }\n                    )}\n\n\n                    {error.type === \"min\" && valueType === \"age\" && value?.length > 1 &&\n                      intl.formatMessage({ id: \"general.validations.minAge\", defaultMessage: \"Je kunt deze berekening alleen gebruiken als je 18 jaar of ouder bent.\" })\n                    }\n\n                    {/*error.type === \"max\" && (\n                        <div>\n                            Op dit moment werkt onze rekentool niet bij een\n                            leeftijd boven de 67 jaar. Onze excuses voor het\n                            ongemak. Op één van onze{\" \"}\n                            <a href=\"https://www.hypotheker.nl/vestigingen/\">\n                                vestigingen\n                            </a>{\" \"}\n                            vertellen we je in een (vrijblijvend) gesprek graag\n                            meer over de mogelijkheden.\n                        </div>\n                    )*/}\n                </div>\n            )}\n\n            {highAgeCondition && (\n                <div className=\"ct-input_error-msg\">\n                  {intl.formatMessage({ id: \"general.validations.highAge\", defaultMessage: \"Bij een leeftijd boven de 56 jaar houden hypotheekverstrekkers rekening met het pensioeninkomen. Vul hieronder de hoogte van je toekomstige AOW en pensioeninkomen in om uit te rekenen wat de hoogte van je maximale hypotheek is.\" })}\n                </div>\n            )}\n        </div>\n    );\n}\n\nexport default Input;\n","import Input from \"../../core/Input\";\nimport React from \"react\";\nimport {useIntl, FormattedMessage} from 'react-intl';\n\nfunction AgeThresholdQuestions({register, errors, type}) {\n  const intl = useIntl();\n  const form = {\n    annualPensionIncome: {\n      formName: (type === \"applicant\") ? \"ApplicantAnnualPensionIncome\" : \"PartnerAnnualPensionIncome\",\n      error: (type === \"applicant\") ? errors.ApplicantAnnualPensionIncome : errors.PartnerAnnualPensionIncome\n    },\n    aow: {\n      formName: (type === \"applicant\") ? \"ApplicantAOW\" : \"PartnerAOW\",\n      error: (type === \"applicant\") ? errors.ApplicantAOW : errors.PartnerAOW\n    }\n  }\n  return (\n  <div className=\"ct-step__body-secondary-subquestions\">\n    <div>\n      <div className=\"ct-step__body-subquestion\">\n        <FormattedMessage\n        id=\"step1.ageThreshold.pensionIncomeQuestion\"\n        defaultMessage=\"Wat is de hoogte van {type} pensioeninkomen per jaar?\"\n        values={{\n          type: type === \"applicant\" ? intl.formatMessage({\n            id: \"step1.ageThreshold.pensionIncomeQuestion.applicantType\",\n            defaultMessage: \"je\"\n          }) : intl.formatMessage({id: \"step1.ageThreshold.pensionIncomeQuestion.partnerType\", defaultMessage: \"je partner\"})\n        }}\n        />\n      </div>\n\n      <div className=\"ct-step__body-tip\">\n        <FormattedMessage\n        id=\"step1.ageThreshold.pensionIncomeTip\"\n        defaultMessage=\"Dit kun je vinden in {pensionLink}.\"\n        values={{\n          pensionLink: (\n          <a href=\"https://www.mijnpensioenoverzicht.nl\"\n             target=\"_blank\"\n             rel=\"noopener noreferrer\">\n            {intl.formatMessage({\n              id: \"step1.ageThreshold.pensionIncomeTip.pensionLink\",\n              defaultMessage: \"Mijn Pensioenoverzicht\"\n            })}\n          </a>\n          )\n        }}\n        />\n      </div>\n\n      <Input\n      placeholder=\"€\"\n      type=\"currency\"\n      register={register}\n      validationRules={{required: false}}\n      name={form.annualPensionIncome.formName}\n      error={form.annualPensionIncome.error}\n      errorTitle=\"pensioeninkomen\"\n      />\n    </div>\n\n    <div>\n      <div className=\"ct-step__body-subquestion\">\n        <FormattedMessage\n        id=\"step1.ageThreshold.aowQuestion\"\n        defaultMessage=\"Wat is de hoogte van de AOW?\"\n        />\n      </div>\n\n      <div className=\"ct-step__body-tip\">\n        <FormattedMessage\n        id=\"step1.ageThreshold.pensionIncomeTip\"\n        defaultMessage=\"Dit kun je vinden in {pensionLink}.\"\n        values={{\n          pensionLink: (\n          <a href=\"https://www.mijnpensioenoverzicht.nl\"\n             target=\"_blank\"\n             rel=\"noopener noreferrer\">\n            {intl.formatMessage({\n              id: \"step1.ageThreshold.pensionIncomeTip.pensionLink\",\n              defaultMessage: \"Mijn Pensioenoverzicht\"\n            })}\n          </a>\n          )\n        }}\n        />\n      </div>\n\n      <Input\n      placeholder=\"€\"\n      type=\"currency\"\n      register={register}\n      validationRules={{required: false}}\n      name={form.aow.formName}\n      error={form.aow.error}\n      errorTitle=\"AOW\"\n      />\n    </div>\n  </div>\n  );\n};\n\nexport default AgeThresholdQuestions;\n","import React, {useState} from 'react';\nimport {FormattedMessage} from \"react-intl\";\n\nconst BusinessCalculator = ({toggleLastStep}) => {\n    const currentYear = new Date().getFullYear();\n\n    const [selectedYear, setSelectedYear] = useState();\n\n    return (\n        <div>\n            <div className=\"ct-step__income-calculator-modal__subtitle\">\n              <FormattedMessage id=\"incomeCalculator.type.selfEmployed.sinceWhen\" defaultMessage=\"Vanaf wanneer werk je zelfstandig?\"/>\n            </div>\n\n            <section className=\"ct-step-xl-labels\">\n                <div className=\"ct-step-xl-labels__container ct-step-xl-labels-low-margin\">\n                    <button\n                        className={(selectedYear === currentYear) ? \"selected-xl-label\" : null}\n                        onClick={() => setSelectedYear(currentYear)}\n                    >\n                        {currentYear}\n                    </button>\n\n                    <button\n                        className={(selectedYear === currentYear - 1) ? \"selected-xl-label\" : null}\n                        onClick={() => setSelectedYear(currentYear - 1)}\n                    >\n                        {currentYear - 1}\n                    </button>\n\n                    <button\n                        className={(selectedYear === currentYear - 2) ? \"selected-xl-label\" : null}\n                        onClick={() => setSelectedYear(currentYear - 2)}\n                    >\n                        {currentYear - 2}\n                    </button>\n\n                    <button\n                        className={(selectedYear === currentYear - 3) ? \"selected-xl-label\" : null}\n                        onClick={() => setSelectedYear(currentYear - 3)}\n                    >\n                        {currentYear - 3}\n                    </button>\n\n                    <button\n                        className={(selectedYear === currentYear - 4) ? \"selected-xl-label\" : null}\n                        onClick={() => setSelectedYear(currentYear - 4)}\n                    >\n                      <FormattedMessage id=\"incomeCalculator.type.selfEmployed.sinceWhen.before\" defaultMessage=\"Eerder dan \"/>\n                       {currentYear - 3}\n                    </button>\n                </div>\n            </section>\n\n            {selectedYear && (\n                <div className=\"ct-business-calculator__explanation-block\">\n                    <div className=\"ct-step__income-calculator-modal__subtitle ct-info-icon-block\">\n                        <div className=\"ct-info-icon\">\n                            i\n                        </div>\n\n                        <div>\n                          <FormattedMessage id=\"incomeCalculator.type.selfEmployed.information.title\" defaultMessage=\"Toelichting\"/>\n                        </div>\n                    </div>\n\n                    <div>\n                      <FormattedMessage id=\"incomeCalculator.type.selfEmployed.information.sameYear\" defaultMessage=\"Je dient minimaal 12 maanden actief te zijn als ondernemer. Uitgangspunt hierbij is de inschrijving bij de Kamer van Koophandel.\"/>\n\n                      {selectedYear === currentYear ? (\n                          <FormattedMessage id=\"incomeCalculator.type.selfEmployed.information.sameYear\" defaultMessage=\"Je dient minimaal 12 maanden actief te zijn als ondernemer. Uitgangspunt hierbij is de inschrijving bij de Kamer van Koophandel.\"/>\n                        ) : (\n                          <FormattedMessage id=\"incomeCalculator.type.selfEmployed.information.otherYear\" defaultMessage=\"Zorg dat je je aangiften inkomstenbelasting en de jaarcijfers van de afgelopen drie jaar bij de hand hebt.\"/>\n                        )}\n\n                    </div>\n                </div>\n            )}\n\n            <button\n                onClick={toggleLastStep}\n                className=\"ct__button ct-header__afspraak\"\n            >\n              <FormattedMessage id=\"incomeCalculator.calculateButton\" defaultMessage=\"Volgende\"/>\n            </button>\n\n        </div>\n    );\n};\n\nexport default BusinessCalculator;\n","import React from 'react';\nimport {useDispatch} from \"react-redux\";\nimport {useForm} from \"react-hook-form\";\nimport {RadioGroup, ReversedRadioButton} from \"react-radio-buttons\";\n\nimport Input from \"../../core/Input\";\nimport {calculateYearlyIncomeAction} from \"../../../store/actions/calculatorActions\";\nimport {gtm} from \"../../../services/gtm\";\nimport {assetsBaseUrl} from \"../../../services/calculationsApi\";\nimport ReactTooltip from \"react-tooltip\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\n\nlet PER = \"12\";\nlet JVA = true;\nlet DMK = true;\n\nconst DefaultCalculator = ({toggleIncomeCalculator, field}) => {\n    const intl = useIntl();\n    const {register, handleSubmit, formState} = useForm({\n        mode: 'onChange',\n        defaultValues: {\n            INK: null,\n            ORT: null,\n        }\n    });\n\n    const dispatch = useDispatch();\n\n\n    const onSubmit = data => {\n        data.JVA = JVA;\n        data.DMK = DMK;\n        data.PER = PER;\n        data.INK = parseInt(data.INK);\n        data.ORT = parseInt(data.ORT);\n\n        data.UIT = 0;\n\n        dispatch(calculateYearlyIncomeAction(data, field));\n\n        const tagManagerArgs = {\n            gtmId: 'GTM-T78CX5',\n            dataLayer: {\n                event: \"gtm.trackEvent\",\n                eventCategory: \"Jaarinkomen berekenen\",\n                eventAction: \"Berekening uitvoeren\",\n                eventLabel: \"in loondienst\"\n            }\n        };\n\n        gtm(tagManagerArgs);\n        //TagManager.initialize(tagManagerArgs);\n\n        toggleIncomeCalculator();\n    };\n\n    const onPERChange = (value) => {\n        PER = value;\n    };\n\n    const onJVAChange = (value) => {\n        JVA = parseInt(value) === 1;\n    };\n\n    const onDMKChange = (value) => {\n        DMK = parseInt(value) === 1;\n    };\n\n    return (\n        <div className=\"ct-step__income-calculator-modal-wrappers\">\n            <form onSubmit={handleSubmit(onSubmit)}>\n                <div className=\"ct-step__income-calculator-salaries-block\">\n\n                    <div>\n                        <div className=\"ct-step__income-calculator-modal__subtitle\">\n                          <FormattedMessage id=\"incomeCalculator.type.employed.incomePeriod\" defaultMessage=\"Hoe vaak ontvang jij je salaris?\"/>\n                        </div>\n                        <RadioGroup\n                            onChange={onPERChange}\n                            horizontal\n                            value={PER}\n                            register={register}\n                            className=\"ct-step__radio-group ct-income__radio-group\"\n                        >\n                            <ReversedRadioButton\n                                value=\"12\"\n                                rootColor=\"#000000\"\n                                pointColor=\"#000000\"\n                                iconInnerSize={18}\n                                iconSize={18}\n                            >\n                              <FormattedMessage id=\"incomeCalculator.type.employed.incomePeriod.onceAMonth\" defaultMessage=\"één keer per maand\"/>\n                            </ReversedRadioButton>\n\n                            <ReversedRadioButton\n                                value=\"13\"\n                                rootColor=\"#000000\"\n                                pointColor=\"#000000\"\n                                iconInnerSize={18}\n                                iconSize={18}\n                            >\n                              <FormattedMessage id=\"incomeCalculator.type.employed.incomePeriod.onceEvery4Weeks\" defaultMessage=\"één keer per 4 weken\"/>\n                            </ReversedRadioButton>\n                        </RadioGroup>\n                    </div>\n                    <div>\n                        <div className=\"ct-step__income-calculator-modal__subtitle\">\n                          <FormattedMessage id=\"incomeCalculator.type.employed.grossIncome\" defaultMessage=\"Wat is je bruto salaris?*\"/>\n                        </div>\n\n                        <Input\n                            inputType=\"secondary\"\n                            type=\"number\"\n                            placeholder=\"2200\"\n                            register={register}\n                            validationRules={{ required: true, min: 0 }}\n                            name=\"INK\"\n                        />\n\n                        <div className=\"ct-step__income-calculator-modal__subtitle\">\n                          <FormattedMessage id=\"incomeCalculator.type.employed.variableIncome\" defaultMessage=\"Hoeveel variabel inkomen ontvang je?*\"/>\n                            <img className=\"ct-step__tool-tip\"\n                                 data-tip={intl.formatMessage({ id: \"incomeCalculator.type.employed.variableIncome.tooltip\", defaultMessage: \"Een variabel inkomen is loon dat niet vast is, zoals een bonus of commissie. Denk hierbij aan een winstuitkering of prestatiebonus, maar ook aan onregelmatigheidstoeslag of uitbetaalde overwerkuren.\" })}\n                                 src={`${assetsBaseUrl}/assets/svg/info.svg`} alt=\"\"/>\n                            <ReactTooltip place={\"right\"} effect={\"solid\"} data-iscapture='true' clickable={true} html={true} />\n                        </div>\n\n                        <Input\n                            inputType=\"secondary\"\n                            placeholder=\"200\"\n                            type=\"number\"\n                            register={register}\n                            validationRules={{ required: true, min: 0 }}\n                            name=\"ORT\"\n                        />\n                    </div>\n                </div>\n\n\n                <div>\n                    <div className=\"ct-step__income-calculator-modal__subtitle\">\n                      <FormattedMessage id=\"incomeCalculator.type.employed.holidayPay\" defaultMessage=\"Krijg je vakantiegeld?\"/>\n                    </div>\n\n                    <RadioGroup onChange={onJVAChange}\n                                value={(JVA) ? \"1\" : \"0\"}\n                                horizontal\n                                className=\"ct-step__radio-group ct-income__radio-group ct-income__radio-group-secondary\">\n                        <ReversedRadioButton\n                            value=\"1\"\n                            rootColor=\"#000000\"\n                            pointColor=\"#000000\"\n                            iconInnerSize={18}\n                            iconSize={18}\n                        >\n                            Ja\n                        </ReversedRadioButton>\n\n                        <ReversedRadioButton\n                            value=\"0\"\n                            rootColor=\"#000000\"\n                            pointColor=\"#000000\"\n                            iconInnerSize={18}\n                            iconSize={18}\n                        >\n                            Nee\n                        </ReversedRadioButton>\n                    </RadioGroup>\n                </div>\n\n                <div>\n                    <div className=\"ct-step__income-calculator-modal__subtitle\">\n                      <FormattedMessage id=\"incomeCalculator.type.employed.13thMonth\" defaultMessage=\"Krijg je een 13e maand?\"/>\n\n                    </div>\n\n                    <RadioGroup onChange={onDMKChange} horizontal\n                                value={(DMK) ? \"1\" : \"0\"}\n                                className=\"ct-step__radio-group ct-income__radio-group ct-income__radio-group-secondary\">\n                        <ReversedRadioButton\n                            value=\"1\"\n                            rootColor=\"#000000\"\n                            pointColor=\"#000000\"\n                            iconInnerSize={18}\n                            iconSize={18}\n                        >\n                          <FormattedMessage id=\"incomeCalculator.type.employed.13thMonth.yes\" defaultMessage=\"Ja\"/>\n                        </ReversedRadioButton>\n\n                        <ReversedRadioButton\n                            value=\"0\"\n                            rootColor=\"#000000\"\n                            pointColor=\"#000000\"\n                            iconInnerSize={18}\n                            iconSize={18}\n                        >\n                          <FormattedMessage id=\"incomeCalculator.type.employed.13thMonth.no\" defaultMessage=\"Nee\"/>\n                        </ReversedRadioButton>\n                    </RadioGroup>\n                </div>\n\n                <button\n                    disabled={!formState.isValid}\n                    type=\"submit\"\n                    className=\"ct__button margin-bottom__xs-md ct-header__afspraak\"\n                >\n\n                  <FormattedMessage id=\"incomeCalculator.calculateButton\" defaultMessage=\"Volgende\"/>\n                </button>\n            </form>\n        </div>\n    );\n};\n\nexport default DefaultCalculator;\n","import React from 'react';\nimport {useDispatch} from \"react-redux\";\nimport {useForm} from \"react-hook-form\";\nimport {useMediaQuery} from \"@react-hook/media-query\";\n\nimport Input from \"../../core/Input\";\nimport {assetsBaseUrl} from \"../../../services/calculationsApi\";\nimport {calculateYearlyIncomeIndependentAction} from \"../../../store/actions/calculatorActions\";\nimport {mainMediaMobile} from \"../../../services/helpers\";\nimport {gtm} from \"../../../services/gtm\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\n\nconst LastStepOfBusinessCalculator = ({toggleIncomeCalculator, field, toggleLastStep}) => {\n  const intl = useIntl();\n  const fields = ['ld', 'lvu', 'ov', 'sfw', 'bpga'];\n  const currentYear = new Date().getFullYear();\n  const years = [\n    currentYear - 1,\n    currentYear - 2,\n    currentYear - 3,\n  ];\n  const labels = [\n    intl.formatMessage({ id: 'incomeCalculator.type.selfEmployed.lastStep.incomeLabels.saldoFiscaleWinst', defaultMessage: 'Saldo fiscale winst' }),\n    intl.formatMessage({ id: 'incomeCalculator.type.selfEmployed.lastStep.incomeLabels.loonvervangendeUitkeringen', defaultMessage: 'Loonvervangende uitkeringen' }),\n    intl.formatMessage({ id: 'incomeCalculator.type.selfEmployed.lastStep.incomeLabels.ontslagvergoeding', defaultMessage: 'Ontslagvergoeding' }),\n    intl.formatMessage({ id: 'incomeCalculator.type.selfEmployed.lastStep.incomeLabels.loondienst', defaultMessage: 'Loondienst' }),\n    intl.formatMessage({ id: 'incomeCalculator.type.selfEmployed.lastStep.incomeLabels.bijtellingPriveGebruikAuto', defaultMessage: 'Bijtelling prive gebruik auto' }),\n  ];\n\n    const mediaMatches = useMediaQuery(mainMediaMobile);\n    const {register, handleSubmit} = useForm({\n        mode: 'onChange',\n    });\n    const dispatch = useDispatch();\n\n    const onSubmit = data => {\n        dispatch(calculateYearlyIncomeIndependentAction(data, field));\n\n        const tagManagerArgs = {\n            gtmId: 'GTM-T78CX5',\n            dataLayer: {\n                event: \"gtm.trackEvent\",\n                eventCategory: \"Jaarinkomen berekenen\",\n                eventAction: \"Berekening uitvoeren\",\n                eventLabel: \"Zelfstandige\"\n            }\n        };\n\n        gtm(tagManagerArgs);\n        //TagManager.initialize(tagManagerArgs);\n\n        toggleIncomeCalculator();\n    };\n\n    return (\n        <div>\n            <form onSubmit={handleSubmit(onSubmit)}>\n                <div className=\"ct-step__overview-modal-title\">\n                  <FormattedMessage id=\"incomeCalculator.type.selfEmployed.lastStep.title\" defaultMessage=\"Benodigde gegevens\"/>\n                </div>\n\n                <div className=\"close-income\" onClick={toggleIncomeCalculator}>\n                    <img src={`${assetsBaseUrl}/assets/svg/close.svg`} alt=\"\"/>\n                </div>\n\n                <div className=\"ct__last-step-back\" onClick={toggleLastStep}>\n                    <img src={`${assetsBaseUrl}/assets/svg/arrow-down-secondary.svg`} alt=\"\"/>\n                    <FormattedMessage id=\"incomeCalculator.type.selfEmployed.lastStep.previous\" defaultMessage=\"Vorige stap\"/>\n                </div>\n\n                <div className=\"ct-step__income-calculator-modal__subtitle last-step-subtitle\">\n                  <FormattedMessage id=\"incomeCalculator.type.selfEmployed.lastStep.subTitle\" defaultMessage=\"Heb je aangiftes inkomstenbelasting en je jaarcijfers bij de hand? Vul de gegevens in die van toepassing zijn. Dit kan betekenen dat je niet alles hoeft in te vullen.\"/>\n                </div>\n                <div>\n                    <div className=\"ct__last-step-years\">\n                        {years.map((item) => {\n                            return (\n                                <div key={item}>\n                                    {item}\n                                </div>\n                            )\n                        })}\n                    </div>\n\n                    <div className=\"ct__last-step-fields-labels\">\n\n                        {fields.map((fieldName, fieldNameIndex) => {\n                            const inputs = [1, 2, 3].map((number, numberIndex) => {\n                                const name = fieldName + number;\n\n                                return (\n                                    <Input\n                                        inputType=\"secondary\"\n                                        placeholder=\"2200\"\n                                        type=\"number\"\n                                        register={register}\n                                        name={name}\n                                        valueType={(fieldNameIndex === 2 || fieldNameIndex === 4) ? \"-\" : null}\n                                        label={mediaMatches ? years[numberIndex] : null}\n                                        key={fieldName + number}\n                                    />\n                                )\n                            });\n\n                            return (\n                                <div key={fieldName}>\n                                    <div>\n                                        {labels[fieldNameIndex]}\n                                    </div>\n\n                                    <div className=\"ct__last-step-fields\">\n                                        {inputs}\n                                    </div>\n                                </div>\n                            )\n                        })}\n                    </div>\n                </div>\n\n\n                <button\n                    type=\"submit\"\n                    className=\"ct__button ct-header__afspraak\"\n                >\n                  <FormattedMessage id=\"incomeCalculator.calculateOnButton\" defaultMessage=\"Reken verder\"/>\n                </button>\n            </form>\n        </div>\n    );\n};\n\nexport default LastStepOfBusinessCalculator;\n","import React, {useState} from 'react';\n\nimport BusinessCalculator from \"./incomeCalcParts/BusinessCalculator\";\nimport DefaultCalculator from \"./incomeCalcParts/DefaultCalculator\";\nimport LastStepOfBusinessCalculator from \"./incomeCalcParts/LastStepOfBusinessCalculator\";\nimport {assetsBaseUrl} from \"../../services/calculationsApi\";\nimport {FormattedMessage} from \"react-intl\";\n\nconst IncomeCalculatorModal = ({toggleIncomeCalculator, field}) => {\n    const [defaultCalculator, setDefaultCalculator] = useState(true);\n    const [lastStepOpened, setLastStepOpened] = useState(false);\n\n    const toggleLastStep = () => {\n        setLastStepOpened(!lastStepOpened);\n    };\n\n    return (\n        <div className=\"ct-step__modal-wrapper\">\n            <div className=\"ct-step__income-calculator-modal-wrapper\">\n                {!lastStepOpened ? (\n                    <div>\n                        <div className=\"ct-step__overview-modal-title\">\n                          <FormattedMessage id=\"incomeCalculator.general.title\" defaultMessage=\"Jaarinkomen berekenen\"/>\n                        </div>\n\n                        <div\n                            className=\"close-income\"\n                            onClick={toggleIncomeCalculator}\n                        >\n                            <img\n                                src={`${assetsBaseUrl}/assets/svg/close.svg`}\n                                alt=\"\"\n                                className={\"svg\"}\n                            />\n                        </div>\n\n                        <div>\n                            <div className=\"ct-step__income-calculator-modal__subtitle\">\n                              <FormattedMessage id=\"incomeCalculator.general.subTitle\" defaultMessage=\"Ik ben\"/>\n                            </div>\n\n                            <div className=\"ct-step-xl-labels__container\">\n                                <button\n                                    className={\n                                        defaultCalculator\n                                            ? \"selected-xl-label\"\n                                            : null\n                                    }\n                                    onClick={() => setDefaultCalculator(true)}\n                                >\n                                  <FormattedMessage id=\"incomeCalculator.type.employed.title\" defaultMessage=\"In loondienst\"/>\n                                </button>\n\n                                <button\n                                    className={\n                                        !defaultCalculator\n                                            ? \"selected-xl-label\"\n                                            : null\n                                    }\n                                    onClick={() => setDefaultCalculator(false)}\n                                >\n                                  <FormattedMessage id=\"incomeCalculator.type.selfEmployed.title\" defaultMessage=\"Ondernemer/ZZP'er\"/>\n                                </button>\n                            </div>\n                        </div>\n\n                        {defaultCalculator ? (\n                            <DefaultCalculator\n                                toggleIncomeCalculator={toggleIncomeCalculator}\n                                field={field}\n                            />\n                        ) : (\n                            <BusinessCalculator\n                                toggleIncomeCalculator={toggleIncomeCalculator}\n                                field={field}\n                                toggleLastStep={toggleLastStep}\n                            />\n                        )}\n                    </div>\n                ) : (\n                    <LastStepOfBusinessCalculator\n                        toggleIncomeCalculator={toggleIncomeCalculator}\n                        field={field}\n                        toggleLastStep={toggleLastStep}\n                    />\n                )}\n            </div>\n        </div>\n    );\n};\n\nexport default IncomeCalculatorModal;\n","import {getCalculatorType, numberToCurrency} from \"./helpers\";\nimport {parseSearchQuery} from \"../store/actions/calculatorActions\";\nimport {store} from \"../index\";\n\nexport const getStepParams = () => {\n\n  const requestParams = parseSearchQuery(window.location.search, true);\n  const stateStore = getStateFromStore();\n  if (isStateSharedViaUrl() || isStateSavedInSession() || requestParams) {\n    return stateStore;\n  }\n}\n\nexport const getStep1HeaderSummary = (ApplicantYearlyIncome, HasPartner, PartnerYearlyIncome) => {\n  if (typeof ApplicantYearlyIncome !== 'undefined' || ApplicantYearlyIncome > 0) {\n    return numberToCurrency((typeof PartnerYearlyIncome !== \"undefined\" && HasPartner\n    ? +PartnerYearlyIncome + +ApplicantYearlyIncome\n    : +ApplicantYearlyIncome));\n  }\n}\n\nexport const getStep2HeaderSummary = (HasLoans, Loans, Alimony, StudentDebtMonthlyPayment, PrivateLeaseAmount, intl) => {\n  const sum = +Loans + +Alimony + +StudentDebtMonthlyPayment + +PrivateLeaseAmount;\n  return HasLoans === \"1\" ? numberToCurrency(sum) : intl.formatMessage({\n    id: 'step2.headerSummary.no',\n    defaultMessage: 'Nee',\n  });\n}\n\nexport const getStep3HeaderSummary = (Woning, intl) => {\n  return Woning <= 0 ? intl.formatMessage({\n    id: 'step3.headerSummary.no',\n    defaultMessage: 'Nee',\n  }) : numberToCurrency(Woning);\n}\n\nexport const getStep4HeaderSummary = (HomeEquity, OwnResources, HomeEquityCosts, HomeMortgageAmount, Woning, returnAsInteger, intl) => {\n  let sum = HomeEquity ? HomeEquity : 0;\n  //if (Woning > 0) {\n    sum = HomeEquity ? (+OwnResources + (+HomeEquity - +HomeEquityCosts - +HomeMortgageAmount)) : +OwnResources;\n  //}\n\n  if (!returnAsInteger) {\n    //The amount should be (selling price - costs to sell the house - remaining value of current mortgage) + eigen geld\n    return (sum > 0 || sum < 0) ? numberToCurrency(sum) : intl.formatMessage({\n      id: 'step4.headerSummary.no',\n      defaultMessage: 'Nee',\n    });\n  } else {\n    return sum;\n  }\n}\n\nexport const getStep5HeaderSummary = (MortgageType, intl) => {\n  return  MortgageType === \"Annuïteitenhypotheek\" || MortgageType === \"Annuiteitenhypotheek\" ? intl.formatMessage({\n    id: 'step5.headerSummary.annuïteiten',\n    defaultMessage: 'Annuïteiten',\n  }) : intl.formatMessage({\n    id: 'step5.headerSummary.lineair',\n    defaultMessage: 'Lineair',\n  });\n}\n\n\nconst isStateSharedViaUrl = () => {\n  const req = parseSearchQuery(window.location.search);\n  if (req && req.share) {\n    return true;\n  }\n}\n\n\nconst isStateSavedInSession = () => {\n  if (window.localStorage.getItem(`state.${getCalculatorType()}`)) {\n    return true;\n  }\n}\nconst getStateFromStore = () => {\n  return store.getState().calculator;\n}\n\n\n","import React from 'react';\n\nimport {assetsBaseUrl} from \"../../../services/calculationsApi\";\nimport {FormattedMessage} from \"react-intl\";\n\n\nfunction NextButton({isFormValid, formState, loading}) {\n    return (\n    <div className={`ct-step__next-wrapper`}>\n      <div className={`ct-step__next-button-wrapper`}>\n      {formState.isValid &&\n        <div className={`ct-step__next-button-label`}>\n          <FormattedMessage id=\"stepParts.nexButton.label\" defaultMessage=\"Ga verder\"/>\n        </div>\n      }\n      <button\n        className={`ct-step__next-button ${\n          isFormValid ? \"ct-step__next-button-active\" : null\n          }`}\n          disabled={!formState.isValid}\n          type=\"submit\"\n          >\n        {loading ? (\n        <img\n        src={`${assetsBaseUrl}/assets/svg/loading-circle.svg`}\n        alt=\"\"\n        />\n        ) : (\n        <img\n        src={`${assetsBaseUrl}/assets/svg/arrow-down.svg`}\n        alt=\"\"\n        />\n        )}\n\n            {formState.isValid}\n      </button>\n      </div>\n    </div>\n    );\n}\n\nexport default NextButton;\n","import React, {useCallback, useEffect, useState} from \"react\";\nimport {RadioGroup, ReversedRadioButton} from \"react-radio-buttons\";\nimport {useForm} from \"react-hook-form\";\nimport StepHeader from \"./stepParts/StepHeader\";\nimport AgeThresholdQuestions from \"./stepParts/AgeThresholdQuestions\";\nimport {\n  currencyToNumber,\n  getCalculatorType,\n  numberToCurrency,\n  rewriteRadioOptionsClasses,\n  stepStates\n} from \"../../services/helpers\";\nimport Input from \"../core/Input\";\nimport {parseSearchQuery, setField} from \"../../store/actions/calculatorActions\";\nimport {assetsBaseUrl} from \"../../services/calculationsApi\";\nimport ReactDOM from \"react-dom\";\nimport IncomeCalculatorModal from \"../modals/IncomeCalculatorModal\";\nimport {useSelector} from \"react-redux\";\nimport {gtm} from \"../../services/gtm\";\nimport ReactTooltip from \"react-tooltip\";\nimport {getStep1HeaderSummary, getStepParams} from \"../../services/stepHelpers\";\nimport NextButton from \"./stepParts/NextButton\";\nimport {useIntl, FormattedMessage} from 'react-intl';\n\nfunction Step1({\n                 stepNumber,\n                 state,\n                 loading,\n                 openStep,\n                 onStepSubmit,\n                 dispatch,\n                 shouldReset,\n                 setResetForms,\n                 setShowResetBtn,\n               }) {\n  const {ApplicantYearlyIncome, PartnerYearlyIncome} =\n  useSelector((state) => state.calculator);\n\n  const intl = useIntl();\n  const [HasPartner, setHasPartner] = useState();\n  const [stepHeaderSummary, setStepHeaderSummary] = useState();\n  const [incomeCalculatorVisibilityViaParam, setIncomeCalculatorVisibilityViaParam] = useState(false);\n  const [incomeCalculatorVisibility, setIncomeCalculatorVisibility] =\n  useState(false);\n  const [incomeCalculatorField, setIncomeCalculatorField] = useState(\n  \"ApplicantYearlyIncome\"\n  );\n  const [params] = useState(() => getStepParams());\n\n  const getDefaultValues = (params) => {\n    return {\n      ApplicantYearlyIncome: numberToCurrency(params?.ApplicantYearlyIncome, true),\n      ApplicantAge: (params?.ApplicantAge === 0) ? '' : params?.ApplicantAge,\n      ApplicantAnnualPensionIncome: numberToCurrency(\n      params?.ApplicantAnnualPensionIncome, true\n      ),\n      ApplicantAOW: numberToCurrency(params?.ApplicantAOW, true),\n      PartnerYearlyIncome: numberToCurrency(params?.PartnerYearlyIncome, true),\n      PartnerAge: (params?.PartnerAge === 0) ? '' : params?.PartnerAge,\n      PartnerAnnualPensionIncome: numberToCurrency(\n      params?.PartnerAnnualPensionIncome, true\n      ),\n      PartnerAOW: numberToCurrency(params?.PartnerAOW, true),\n    };\n  }\n  const {\n    register,\n    handleSubmit,\n    formState,\n    errors,\n    watch,\n    triggerValidation,\n    setValue,\n    reset,\n  } = useForm({\n    mode: \"onChange\",\n    defaultValues: getDefaultValues(params),\n  });\n  const queryParams = parseSearchQuery(window.location.search)\n  const isFormValid = formState.isValid && HasPartner;\n  const watchAge = watch([\"ApplicantAge\", \"PartnerAge\"]); // target specific fields by their names\n  rewriteRadioOptionsClasses(\"buy-house-partner\", [\"yes\", \"no\"]);\n\n  const toggleIncomeCalculator = useCallback((field) => {\n    setIncomeCalculatorField(field);\n    setIncomeCalculatorVisibility(!incomeCalculatorVisibility);\n\n    const tagManagerArgs = {\n      gtmId: \"GTM-T78CX5\",\n      dataLayer: {\n        event: \"gtm.virtualPageview\",\n        virtualURL: `zelf-berekenen/${getCalculatorType()}/jaarinkomen-berekenen`,\n        virtualTitle: \"Jaarinkomen berekenen\",\n      },\n    };\n\n    gtm(tagManagerArgs);\n    //TagManager.initialize(tagManagerArgs);\n  }, [incomeCalculatorVisibility]);\n\n\n  useEffect(() => {\n    if (!HasPartner) {\n      params?.HasPartner\n      ? setHasPartner(params.HasPartner.toString() === \"true\" ? \"1\" : \"0\")\n      : setHasPartner(\"0\");\n    }\n  }, [params, setHasPartner, HasPartner]);\n\n  useEffect(() => {\n    if (queryParams?.calculate && !incomeCalculatorVisibilityViaParam) {\n      toggleIncomeCalculator('ApplicantYearlyIncome');\n      setIncomeCalculatorVisibilityViaParam(true); // we have processed the param\n    }\n\n  }, [queryParams, toggleIncomeCalculator, incomeCalculatorVisibilityViaParam, setIncomeCalculatorVisibilityViaParam]);\n\n  useEffect(() => {\n    if (shouldReset) {\n      reset(getDefaultValues({}));\n      setStepHeaderSummary(\"\");\n      setResetForms(false);\n    }\n  }, [shouldReset, reset, setResetForms]);\n\n  useEffect(() => {\n    if (ApplicantYearlyIncome) {\n      setValue(\n      \"ApplicantYearlyIncome\",\n      numberToCurrency(ApplicantYearlyIncome, true),\n      {\n        shouldDirty: true,\n      }\n      );\n      setShowResetBtn(true);\n    } else {\n      setShowResetBtn(false);\n    }\n\n    PartnerYearlyIncome &&\n    setValue(\n    \"PartnerYearlyIncome\",\n    numberToCurrency(PartnerYearlyIncome, true),\n    {shouldDirty: true}\n    );\n  }, [ApplicantYearlyIncome, PartnerYearlyIncome, setValue, setShowResetBtn]);\n\n  useEffect(() => {\n    params &&\n    setStepHeaderSummary(\n    getStep1HeaderSummary(\n    params?.ApplicantYearlyIncome,\n    params?.HasPartner?.toString() === \"true\",\n    params?.PartnerYearlyIncome\n    )\n    );\n\n  }, [setStepHeaderSummary, params]);\n\n  const onSubmit = (data) => {\n    let tagManagerArgs;\n    // true or false\n    const hasAPartner = !!parseInt(HasPartner);\n    tagManagerArgs = {\n      gtmId: \"GTM-T78CX5\",\n      dataLayer: {\n        event: \"gtm.calculators\",\n        eventCategory: \"Calculator\",\n        eventAction: \"Bruto Jaarinkomen\",\n        eventLabel: hasAPartner ? \"met partner\" : \"zonder partner\",\n      },\n    };\n\n    gtm(tagManagerArgs);\n    //console.log(data);\n    data.ApplicantAge = Math.floor(data.ApplicantAge);\n    data.PartnerAge = Math.floor(data.PartnerAge);\n    dispatch(setField(\"HasPartner\", hasAPartner));\n    data.ApplicantYearlyIncome = currencyToNumber(\n    data.ApplicantYearlyIncome, true\n    );\n    data.ApplicantAnnualPensionIncome = currencyToNumber(\n    data.ApplicantAnnualPensionIncome\n    );\n    data.ApplicantAOW = currencyToNumber(data.ApplicantAOW);\n    data.PartnerYearlyIncome = currencyToNumber(data.PartnerYearlyIncome, true);\n    data.PartnerAnnualPensionIncome = currencyToNumber(\n    data.PartnerAnnualPensionIncome\n    );\n    data.PartnerAOW = currencyToNumber(data.PartnerAOW);\n\n    //console.log(data);\n    setStepHeaderSummary(\n    getStep1HeaderSummary(\n    data.ApplicantYearlyIncome,\n    hasAPartner,\n    data.PartnerYearlyIncome\n    )\n    );\n    onStepSubmit(data, stepNumber);\n  };\n\n  const onRadioChange = (value) => {\n    setHasPartner(value);\n  };\n\n  return (\n  <div\n  className={`ct-step ${\n  state === stepStates.inactive && \"ct-step__inactive\"\n  }\n                                 ${\n  state === stepStates.filled &&\n  \"ct-step__filled\"\n  }\n                                 ${\n  state === stepStates.closed &&\n  \"ct-step__closed\"\n  }`}\n  >\n    <StepHeader\n    title={intl.formatMessage({id: \"step1.headerTitle\", defaultMessage: \"Bruto jaarinkomen\"})}\n    stepNumber={stepNumber}\n    stepSummary={stepHeaderSummary}\n    stepState={state}\n    openStep={openStep}\n    onClose={handleSubmit(onSubmit)}\n    />\n    <div\n    className={`ct-step__body ${\n    state === stepStates.active ? \"ct-step__body-opened\" : null\n    }`}\n    >\n      <form\n      name={\"step1\"}\n      onSubmit={handleSubmit(onSubmit)}\n      noValidate\n      >\n        <div>\n          <div className=\"ct-step__body-primary-question\">\n            <FormattedMessage id=\"step1.yearlyIncomeApplicant\" defaultMessage=\"Wat is je bruto jaarinkomen?\"/>\n          </div>\n\n          <Input\n            placeholder=\"€\"\n            type=\"currency\"\n            register={register}\n            validationRules={{required: true, min: 1.0}}\n            name=\"ApplicantYearlyIncome\"\n            error={errors.ApplicantYearlyIncome}\n            errorTitle={intl.formatMessage({\n              id: \"step1.yearlyIncome.errorTitle\",\n              defaultMessage: \"bruto jaarinkomen\"\n            })}\n            icon=\"/assets/svg/calc.svg\"\n            iconText={intl.formatMessage({\n              id: \"step1.yearlyIncome.iconText\",\n              defaultMessage: \"Jaarinkomen <br/> berekenen\"\n            })}\n            onIconClick={() =>\n            toggleIncomeCalculator(\"ApplicantYearlyIncome\")\n            }\n          />\n        </div>\n\n        <div>\n          <div className=\"ct-step__body-secondary-question\">\n            <FormattedMessage\n            id=\"step1.ageApplicant\"\n            defaultMessage=\"Wat is je leeftijd?\"\n            />\n            <img\n            className=\"ct-step__tool-tip\"\n            data-tip={intl.formatMessage({\n              id: \"step1.ageApplicant.ageTooltip\",\n              defaultMessage: \"We vragen je leeftijd omdat we willen weten of je binnen nu en 30 jaar pensioen/AOW zal ontvangen\"\n            })}\n            src={`${assetsBaseUrl}/assets/svg/info.svg`}\n            alt=\"\"\n            />\n            <ReactTooltip place={\"right\"} effect={\"solid\"}/>\n          </div>\n\n          <Input\n          placeholder={intl.formatMessage({\n            id: \"step1.ageApplicant.placeholder\",\n            defaultMessage: \"30 jaar\"\n          })}\n          type=\"number\"\n          className=\"ct-input__small\"\n          name=\"ApplicantAge\"\n          register={register}\n          error={errors.ApplicantAge}\n          value={watchAge.ApplicantAge}\n          validationRules={{required: true, min: 18}}\n          errorTitle=\"leeftijd\"\n          valueType=\"age\"\n          />\n        </div>\n\n        {watchAge.ApplicantAge > 56 &&\n        watchAge.ApplicantAge < 67 && (\n        <AgeThresholdQuestions\n        register={register}\n        errors={errors}\n        triggerValidation={triggerValidation}\n        type={\"applicant\"}\n        />\n        )}\n\n        <div className=\"ct-step__body-secondary-questions-block\">\n          <div className=\"ct-step__body-secondary-question ct-step__body-secondary-question--no-tip\">\n\n            <FormattedMessage id=\"step1.withPartner\" defaultMessage=\"Wil je alleen of samen kopen?*\"/>\n          </div>\n\n          <RadioGroup\n          value={HasPartner}\n          onChange={onRadioChange}\n          horizontal\n          className=\"ct-step__radio-group buy-house-partner\"\n          >\n            <ReversedRadioButton\n            value=\"1\"\n            rootColor=\"#000000\"\n            pointColor=\"#000000\"\n            iconInnerSize={18}\n            iconSize={18}\n            >\n              <FormattedMessage id=\"step1.withPartner.yes\" defaultMessage=\"Samen\"/>\n            </ReversedRadioButton>\n\n            <ReversedRadioButton\n            value=\"0\"\n            rootColor=\"#000000\"\n            pointColor=\"#000000\"\n            iconInnerSize={18}\n            iconSize={18}\n            >\n              <FormattedMessage id=\"step1.withPartner.no\" defaultMessage=\"Alleen\"/>\n            </ReversedRadioButton>\n          </RadioGroup>\n        </div>\n\n        {HasPartner === \"1\" ? (\n        <div className=\"ct-step__body-secondary-subquestions\">\n          <div>\n            <div className=\"ct-step__body-subquestion\">\n              <FormattedMessage id=\"step1.yearlyIncomePartner\" defaultMessage=\"Wat is het bruto jaarinkomen van je partner?*\"/>\n\n            </div>\n\n            <Input\n            placeholder=\"€\"\n            type=\"currency\"\n            register={register}\n            validationRules={{required: true, min: 0}}\n            name=\"PartnerYearlyIncome\"\n            error={errors.PartnerYearlyIncome}\n            errorTitle={intl.formatMessage({\n              id: \"step1.yearlyIncome.errorTitle\",\n              defaultMessage: \"bruto jaarinkomen\"\n            })}\n            icon=\"/assets/svg/calc.svg\"\n            iconText={intl.formatMessage({\n              id: \"step1.yearlyIncome.iconText\",\n              defaultMessage: \"Jaarinkomen <br/> berekenen\"\n            })}\n            onIconClick={() =>\n            toggleIncomeCalculator(\"PartnerYearlyIncome\")\n            }\n            />\n          </div>\n\n          <div>\n\n            <div className=\"ct-step__body-subquestion\">\n              <FormattedMessage\n              id=\"step1.agePartner\"\n              defaultMessage=\"Wat is de leeftijd van je partner?*\"\n              />\n              <img\n              className=\"ct-step__tool-tip\"\n              data-tip={intl.formatMessage({\n                id: \"step1.agePartner.ageTooltip\",\n                defaultMessage: \"We vragen de leeftijd omdat we willen weten of je partner binnen nu en 30 jaar pensioen/AOW zal ontvangen\"\n              })}\n              src={`${assetsBaseUrl}/assets/svg/info.svg`}\n              alt=\"\"\n              />\n              <ReactTooltip\n              place={\"right\"}\n              effect={\"solid\"}\n              />\n            </div>\n\n            <Input\n            className=\"ct-input__small\"\n            placeholder={intl.formatMessage({\n              id: \"step1.ageApplicant.placeholder\",\n              defaultMessage: \"30 jaar\"\n            })}\n            type=\"number\"\n            name=\"PartnerAge\"\n            register={register}\n            error={errors.PartnerAge}\n            value={watchAge.PartnerAge}\n            validationRules={{\n              required: true,\n              min: 18,\n            }}\n            errorTitle=\"leeftijd\"\n            valueType=\"age\"\n            />\n          </div>\n\n          {watchAge.PartnerAge > 56 &&\n          watchAge.PartnerAge < 67 && (\n          <AgeThresholdQuestions\n          register={register}\n          errors={errors}\n          type={\"partner\"}\n          />\n          )}\n        </div>\n        ) : null}\n\n        <NextButton\n        loading={loading}\n        isFormValid={isFormValid}\n        formState={formState}\n        ></NextButton>\n      </form>\n    </div>\n    {incomeCalculatorVisibility\n    ? ReactDOM.createPortal(\n    <IncomeCalculatorModal\n    toggleIncomeCalculator={toggleIncomeCalculator}\n    field={incomeCalculatorField}\n    />,\n    document.getElementById(\"income-calculator-modal-portal\")\n    )\n    : null}\n  </div>\n  );\n}\n\nexport default Step1;\n","import React from 'react';\n\nfunction StepSectionHeader({title, sectionState, toggleSection}) {\n  return (\n    <div className={`ct-step__section-header`} onClick={toggleSection}>\n      <div>\n          {title}\n      </div>\n\n        <div className=\"ct-step__section-header-right\">\n            {sectionState ? '-' : '+'}\n        </div>\n    </div>\n  );\n}\n\nexport default StepSectionHeader;\n","import React, {useRef, useState, useEffect} from 'react';\n\nimport StepSectionHeader from \"./StepSectionHeader\";\n\n\nfunction StepSection({title, firstSection, children}) {\n  const stepBodyEl = useRef(null);\n  const [sectionState, setSectionState] = useState(false);\n  const toggleSection = () => {\n      setSectionState(!sectionState);\n  };\n\n  useEffect(() => {\n   if (firstSection) {\n     setSectionState(true);\n   }\n  }, [firstSection, setSectionState]);\n\n\n  return (\n    <div className=\"ct-step__section\">\n      <StepSectionHeader\n        title={title}\n        sectionState={sectionState}\n        toggleSection={toggleSection}\n      />\n      <div className={`ct-step__section-body ${sectionState ? 'ct-step__section-body-opened' : null}`} ref={stepBodyEl}>\n          {children}\n      </div>\n    </div>\n  );\n}\n\nexport default StepSection;\n","import React, {useEffect, useState} from \"react\";\nimport { RadioGroup, ReversedRadioButton } from \"react-radio-buttons\";\nimport { useForm } from \"react-hook-form\";\nimport StepHeader from \"./stepParts/StepHeader\";\nimport {\n  currencyToNumber, numberToCurrency,\n  rewriteRadioOptionsClasses,\n  stepStates,\n} from \"../../services/helpers\";\nimport StepSection from \"./stepParts/StepSection\";\nimport Input from \"../core/Input\";\nimport { gtm } from \"../../services/gtm\";\nimport { useSelector } from \"react-redux\";\nimport {getStep2HeaderSummary, getStepParams} from \"../../services/stepHelpers\";\nimport NextButton from \"./stepParts/NextButton\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\nimport {assetsBaseUrl} from \"../../services/calculationsApi\";\nimport ReactTooltip from \"react-tooltip\";\n\nfunction Step2({\n    stepNumber,\n    state,\n    loading,\n    openStep,\n    onStepSubmit,\n    shouldReset,\n    setResetForms,\n}) {\n    const intl = useIntl();\n    const [HasLoans, setHasLoans] = useState();\n    const [stepHeaderSummary, setStepHeaderSummary] = useState();\n    const [PrivateLeaseFull, setPrivateLeaseFull] = useState();\n    const { HasPartner } = useSelector((state) => state.calculator);\n    const [params] = useState(getStepParams());\n\n    const getDefaultValues = (params) => {\n      return {\n        Loans: numberToCurrency(params?.Loans, true),\n        Alimony: numberToCurrency(params?.Alimony, true),\n        StudentDebtAmount: numberToCurrency(params?.StudentDebtAmount, true),\n        PrivateLeaseAmount: numberToCurrency(params?.PrivateLeaseAmount, true),\n      }\n    }\n    const { register, handleSubmit, formState, reset} = useForm({\n        mode: \"onChange\",\n        defaultValues: getDefaultValues(params),\n    });\n\n    const isFormValid = formState.isValid && HasLoans;\n\n    useEffect(() => {\n        setPrivateLeaseFull(params?.PrivateLeaseFull ? \"1\" : \"0\")\n        setHasLoans(params?.HasLoans ? \"1\" : \"0\");\n    }, [setHasLoans, params]);\n\n    useEffect(() => {\n        params &&\n            setStepHeaderSummary(\n                getStep2HeaderSummary(\n                    params?.HasLoans ? \"1\" : \"0\",\n                    params?.Loans,\n                    params?.Alimony,\n                    params?.StudentDebtAmount,\n                    params?.PrivateLeaseAmount,\n                    intl\n                )\n            );\n    }, [setStepHeaderSummary, params, intl]);\n\n    useEffect(() => {\n        if (shouldReset) {\n            reset( getDefaultValues({}));\n            setStepHeaderSummary(\"\");\n            setResetForms(false);\n        }\n    }, [shouldReset, reset, setResetForms]);\n\n    rewriteRadioOptionsClasses(\"financial-obligations\", [\"yes\", \"no\"]);\n\n    const onRadioChange = (value) => setHasLoans(value);\n\n    const onSubmit = (data) => {\n      //console.log('onSubmit', data);\n        data.Loans = currencyToNumber(data.Loans, true);\n        data.Alimony = currencyToNumber(data.Alimony, true);\n        data.PrivateLeaseAmount = currencyToNumber(data.PrivateLeaseAmount, true);\n        data.PrivateLeaseFull = PrivateLeaseFull === \"1\";\n        data.StudentDebtAmount = currencyToNumber(data.StudentDebtAmount, true);\n        data.HasLoans = !!parseInt(HasLoans);\n        //data.StudentDebtMonthlyPayment = data.StudentDebtAmount;\n\n        setStepHeaderSummary(\n            getStep2HeaderSummary(\n                HasLoans,\n                data.Loans,\n                data.Alimony,\n                data.StudentDebtAmount,\n                data.PrivateLeaseAmount,\n                intl\n            )\n        );\n\n        const tagManagerArgs = {\n            gtmId: \"GTM-T78CX5\",\n            dataLayer: {\n                event: \"gtm.calculators\",\n                eventCategory: \"Calculator\",\n                eventAction: \"Kredieten en leningen\",\n                eventLabel: !!parseInt(HasLoans)\n                    ? \"verplichtingen-ja\"\n                    : \"verplichtingen-nee\",\n            },\n        };\n\n        gtm(tagManagerArgs);\n\n        onStepSubmit(data, stepNumber);\n    };\n\n    return (\n        <div\n            className={`ct-step ${\n                state === stepStates.inactive && \"ct-step__inactive\"\n            }\n                                 ${\n                                     state === stepStates.filled &&\n                                     \"ct-step__filled\"\n                                 }\n                                 ${\n                                     state === stepStates.closed &&\n                                     \"ct-step__closed\"\n                                 }`}\n        >\n            <StepHeader\n                title={intl.formatMessage({id: \"step2.headerTitle\", defaultMessage: \"Kredieten en leningen\"})}\n                stepSummary={stepHeaderSummary}\n                stepNumber={stepNumber}\n                stepState={state}\n                openStep={openStep}\n                onClose={handleSubmit(onSubmit)}\n            />\n\n            <div\n                className={`ct-step__body ${\n                    state === stepStates.active ? \"ct-step__body-opened\" : null\n                }`}\n            >\n                <form onSubmit={handleSubmit(onSubmit)} noValidate>\n                    <div className=\"ct-step__body-primary-question\">\n                      <FormattedMessage\n                      id=\"step2.financialObligations\"\n                      defaultMessage=\"{salutation} maandelijkse financiële verplichtingen? *\"\n                      values={{\n                        salutation: HasPartner ?\n                        intl.formatMessage({ id: 'step2.financialObligations.hasPartner.yes', defaultMessage: 'Hebben jullie' }) :\n                        intl.formatMessage({ id: 'step2.financialObligations.hasPartner.no', defaultMessage: 'Heb je' })\n                      }}\n                      />\n                    </div>\n\n                    <div className=\"ct-step__body-tip\">\n                      <FormattedMessage id=\"step2.financialObligations.tip\" defaultMessage=\"Hieronder vallen o.a. een private lease auto, partner alimentatie, (studie)schulden of kredieten. Vul alleen in wat van toepassing is.\"/>\n                    </div>\n\n                    <RadioGroup\n                        onChange={onRadioChange}\n                        value={HasLoans}\n                        horizontal\n                        className=\"ct-step__radio-group financial-obligations\"\n                    >\n                        <ReversedRadioButton\n                            value=\"1\"\n                            rootColor=\"#000000\"\n                            pointColor=\"#000000\"\n                            iconInnerSize={18}\n                            iconSize={18}\n                        >\n                          <FormattedMessage id=\"step2.financialObligations.answer.yes\" defaultMessage=\"Ja\"/>\n\n                        </ReversedRadioButton>\n\n                        <ReversedRadioButton\n                            value=\"0\"\n                            rootColor=\"#000000\"\n                            pointColor=\"#000000\"\n                            iconInnerSize={18}\n                            iconSize={18}\n                        >\n                          <FormattedMessage id=\"step2.financialObligations.answer.no\" defaultMessage=\"Nee\"/>\n\n                        </ReversedRadioButton>\n                    </RadioGroup>\n\n                    {HasLoans === \"1\" ? (\n                        <div className=\"ct-step__sections\">\n                            <StepSection title={intl.formatMessage({ id: 'step2.parts.loans.title', defaultMessage: 'Leningen'})}>\n                                <div className=\"ct-step__body-tip\">\n                                  <FormattedMessage id=\"step2.parts.loans.question\" defaultMessage=\"Hoeveel betaal je maandelijks aan de aflossing van je lening, inclusief rente?\"/>\n                                </div>\n\n                                <Input\n                                    placeholder=\"€ 200\"\n                                    register={register}\n                                    type=\"currency\"\n                                    name=\"Loans\"\n                                    className=\"ct-step__section-input\"\n                                />\n                            </StepSection>\n\n                            <StepSection title={intl.formatMessage({ id: 'step2.parts.alimony.title', defaultMessage: 'Partneralimentatie'})}>\n                              <div className=\"ct-step__body-tip\">\n                                <FormattedMessage id=\"step2.parts.alimony.question\" defaultMessage=\"Hoeveel betaal je maandelijks aan partneralimentatie?\"/>\n                              </div>\n                                <Input\n                                    placeholder=\"€ 500\"\n                                    register={register}\n                                    type=\"currency\"\n                                    name=\"Alimony\"\n                                    className=\"ct-step__section-input\"\n                                />\n                            </StepSection>\n\n                            <StepSection title={intl.formatMessage({ id: 'step2.parts.studentDebt.title', defaultMessage: 'Studieschuld'})}>\n                                <div className=\"ct-step__body-tip\">\n                                  <div className=\"margin-bottom-5\">\n                                    <FormattedMessage id=\"step2.parts.studentDebt.question.title\"\n                                      defaultMessage=\"Hoeveel {salutation} maandelijks (gaan) aflossen op {salutation2} studieschuld?\"\n                                      values={{\n                                        salutation: HasPartner ?\n                                        intl.formatMessage({ id: 'step2.parts.studentDebt.question.title.salutation.hasPartner.yes', defaultMessage: 'moeten jullie' }) :\n                                        intl.formatMessage({ id: 'step2.parts.studentDebt.question.title.salutation.hasPartner.no', defaultMessage: 'moet je' }),\n                                        salutation2: HasPartner ?\n                                        intl.formatMessage({ id: 'step2.parts.studentDebt.question.title.salutation2.hasPartner.yes', defaultMessage: 'de' }) :\n                                        intl.formatMessage({ id: 'step2.parts.studentDebt.question.title.salutation2.hasPartner.no', defaultMessage: 'je' })\n                                      }}\n                                    />\n                                  </div>\n                                  <div>\n                                    <FormattedMessage id=\"step2.parts.studentDebt.question.description\"\n                                                      defaultMessage=\"Vul hier het wettelijke maandbedrag in. Niet het bedrag dat {salutation} op basis van {salutation2} huidige inkomen.\"\n                                                      values={{\n                                                        salutation: HasPartner ?\n                                                        intl.formatMessage({\n                                                          id: 'step2.parts.studentDebt.question.description.salutation.hasPartner.yes',\n                                                          defaultMessage: 'betaald wordt'\n                                                        }) :\n                                                        intl.formatMessage({\n                                                          id: 'step2.parts.studentDebt.question.description.salutation.hasPartner.no',\n                                                          defaultMessage: 'je betaalt'\n                                                        }),\n                                                        salutation2: HasPartner ?\n                                                        intl.formatMessage({\n                                                          id: 'step2.parts.studentDebt.question.description.salutation2.hasPartner.yes',\n                                                          defaultMessage: 'het'\n                                                        }) :\n                                                        intl.formatMessage({\n                                                          id: 'step2.parts.studentDebt.question.description.salutation2.hasPartner.no',\n                                                          defaultMessage: 'je'\n                                                        })\n                                                      }}\n                                    />\n                                    <img\n                                    className=\"ct-step__tool-tip ct-step__tool-tip--align-middle\"\n                                    data-tip={intl.formatMessage({\n                                      id: 'step2.parts.studentDebt.tip.tooltip',\n                                      defaultMessage: 'Het wettelijk maandbedrag is het bedrag dat je moet betalen om de studieschuld binnen de looptijd af te betalen. Als je inkomen te laag is, wordt er o.b.v. je inkomen bekeken wat je naar draagkracht kunt betalen.'\n                                    })}\n                                    src={`${assetsBaseUrl}/assets/svg/info.svg`}\n                                    alt=\"\"\n                                    />\n                                    <ReactTooltip place={\"right\"} effect={\"solid\"}/>\n                                  </div>\n                                </div>\n\n                              <Input\n                              placeholder=\"€ 150\"\n                              register={register}\n                              type=\"currency\"\n                              name=\"StudentDebtAmount\"\n                              className=\"ct-step__section-input\"\n                              />\n                              <div className=\"ct-step__body-tip margin-bottom-20\">\n                                <FormattedMessage id={`step2.parts.studentDebt.tip`}\n                                                  defaultMessage={`Weet je de maandelijkse aflossing niet? Dit kun je vinden op {linkInfo}. Als je nog niet aflost, doe dan op {linkCalc} de proefberekening om je maandlast in te schatten.`}\n                                                  values={{\n                                                    linkInfo: <a className={`ct-step__hypo-type-link`}\n                                                                 href={`https://duo.nl/particulier/inloggen-op-mijn-duo.jsp`}\n                                                                 target={`_blank`}>Mijn DUO</a>,\n                                                    linkCalc: <a className={`ct-step__hypo-type-link`}\n                                                                 href={`https://duo.nl/particulier/rekenhulp-studiefinanciering.jsp#/nl/terugbetalen/start`}\n                                                                 target={`_blank`}>duo.nl</a>\n                                                  }}\n                                />\n\n                              </div>\n\n                            </StepSection>\n\n                          <StepSection title={intl.formatMessage({\n                            id: 'step2.parts.privateLease.title',\n                            defaultMessage: 'Private Lease'\n                          })}>\n                            <div className=\"ct-step__body-tip ct-step__body-tip--flex\">\n                              <FormattedMessage id=\"step2.parts.privateLease.question\"\n                                                defaultMessage=\"Wat is het maandbedrag van je private lease auto?\"/>\n                            </div>\n\n                            <Input\n                            placeholder=\"€ 400\"\n                            register={register}\n                            type=\"currency\"\n                            name=\"PrivateLeaseAmount\"\n                            className=\"ct-step__section-input\"\n                            />\n                          </StepSection>\n                        </div>\n                    ) : null}\n\n                    <NextButton\n                        loading={loading}\n                        isFormValid={isFormValid}\n                        formState={formState}\n                    ></NextButton>\n                </form>\n            </div>\n        </div>\n    );\n}\n\nexport default Step2;\n","import {RadioGroup, ReversedRadioButton} from \"react-radio-buttons\";\nimport React from \"react\";\nimport {FormattedMessage} from \"react-intl\";\n\n\nconst StepHouseOptions = {\n all : (onRadioChange, IsNieuwbouw) => {\n    return (\n      <RadioGroup\n      onChange={onRadioChange}\n      value={IsNieuwbouw}\n      className=\"ct-step__radio-group ct-step__radio-group-vertical already-found-a-house\"\n      >\n        <ReversedRadioButton\n        value=\"0\"\n        rootColor=\"#000000\"\n        pointColor=\"#000000\"\n        iconInnerSize={18}\n        iconSize={18}\n        >\n          <FormattedMessage id={\"stepParts.stepHouseOptions.all.no\"} defaultMessage={\"Nee, nog niet\"} />\n        </ReversedRadioButton>\n\n        <ReversedRadioButton\n        value=\"1\"\n        rootColor=\"#000000\"\n        pointColor=\"#000000\"\n        iconInnerSize={18}\n        iconSize={18}\n        >\n          <FormattedMessage id={\"stepParts.stepHouseOptions.all.existing\"} defaultMessage={\"Ja, bestaande bouw\"} />\n\n        </ReversedRadioButton>\n\n        <ReversedRadioButton\n        value=\"2\"\n        rootColor=\"#000000\"\n        pointColor=\"#000000\"\n        iconInnerSize={18}\n        iconSize={18}\n        >\n\n          <FormattedMessage id={\"stepParts.stepHouseOptions.all.new\"} defaultMessage={\"Ja, nieuwbouw\"} />\n\n        </ReversedRadioButton>\n      </RadioGroup>\n    );\n  },\n  partial : (onRadioChange, IsNieuwbouw) => {\n    return (\n    <RadioGroup\n    onChange={onRadioChange}\n    value={IsNieuwbouw}\n    className=\"ct-step__radio-group ct-step__radio-group-vertical already-found-a-house\"\n    >\n      <ReversedRadioButton\n      value=\"1\"\n      rootColor=\"#000000\"\n      pointColor=\"#000000\"\n      iconInnerSize={18}\n      iconSize={18}\n      >\n        <FormattedMessage id={\"stepParts.stepHouseOptions.partial.existing\"} defaultMessage={\"Bestaande bouw\"} />\n      </ReversedRadioButton>\n\n      <ReversedRadioButton\n      value=\"2\"\n      rootColor=\"#000000\"\n      pointColor=\"#000000\"\n      iconInnerSize={18}\n      iconSize={18}\n      >\n        <FormattedMessage id={\"stepParts.stepHouseOptions.partial.new\"} defaultMessage={\"Nieuwbouw\"} />\n      </ReversedRadioButton>\n    </RadioGroup>\n    );\n  }\n}\n\n\nexport default StepHouseOptions;\n","import React, { useEffect, useState} from \"react\";\nimport Select from \"react-select\";\nimport {useForm} from \"react-hook-form\";\nimport StepHeader from \"./stepParts/StepHeader\";\nimport {\n  currencyToNumber,\n  rewriteRadioOptionsClasses,\n  stepStates,\n  getCalculatorType,\n  CALCULATOR_TYPES,\n  numberToCurrency, checkMobileBrowser,\n} from \"../../services/helpers\";\nimport Input from \"../core/Input\";\nimport {gtm} from \"../../services/gtm\";\nimport {useSelector} from \"react-redux\";\nimport StepHouseOptions from \"./stepParts/StepHouseOptions\";\nimport {getStep3HeaderSummary, getStepParams} from \"../../services/stepHelpers\";\nimport NextButton from \"./stepParts/NextButton\";\nimport {getMortgageProviderAction} from \"../../store/actions/calculatorActions\";\nimport {assetsBaseUrl} from \"../../services/calculationsApi\";\nimport ReactTooltip from \"react-tooltip\";\nimport {RadioGroup, ReversedRadioButton} from \"react-radio-buttons\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\n\nfunction Step3({\n                 stepNumber,\n                 state,\n                 loading,\n                 openStep,\n                 onStepSubmit,\n                 dispatch,\n                 shouldReset,\n                 setResetForms,\n               }) {\n  const intl = useIntl();\n  const [params] = useState(getStepParams());\n  const { EnergyLabel } = useSelector((state) => state.calculator);\n  const [calculatorType, setCalculatorType] = useState();\n  const [stepHeaderSummary, setStepHeaderSummary] = useState();\n  const [IsNieuwbouw, setIsNieuwbouw] = useState();\n  const [sustainabilityUplift, setSustainabilityUplift] = useState(params?.SustainabilityUplift ? params.SustainabilityUplift.toString() : `0`);\n  const [AmountAboveNhg, setAmountAboveNhg] = useState(false);\n  const [energyLabel, setEnergyLabel] = useState(EnergyLabel?.value ? EnergyLabel : {value: \"\", label: intl.formatMessage({ id: 'step3.whatIsEnergyLabel.NoLabel' , defaultMessage: 'Geen Label'})});\n\n  const {\n    HasPartner,\n    IsNieuwbouw: StateIsNieuwbouw,\n    SelectedMortgageProvider,\n    Nhg\n  } = useSelector((state) => state.calculator);\n  const getDefaultValues = (params) => {\n    return {\n      Woning: numberToCurrency(params?.Woning, true),\n    }\n  }\n\n  const options = [\n    {value: \"APPPP\", label: intl.formatMessage({ id: 'step3.whatIsEnergyLabel.Egp' , defaultMessage: 'A++++ incl. energieprestatiegarantie'})},\n    {value: \"APPPP\", label: \"A++++\"},\n    {value: \"APPP\", label: \"A+++\"},\n    {value: \"APP\", label: \"A++\"},\n    {value: \"AP\", label: \"A+\"},\n    {value: \"A\", label: \"A\"},\n    {value: \"B\", label: \"B\"},\n    {value: \"C\", label: \"C\"},\n    {value: \"D\", label: \"D\"},\n    {value: \"E\", label: \"E\"},\n    {value: \"F\", label: \"F\"},\n    {value: \"G\", label: \"G\"},\n    {value: \"\", label: intl.formatMessage({ id: 'step3.whatIsEnergyLabel.NoLabel' , defaultMessage: 'Geen Label'})}\n  ];\n\n  const {register, handleSubmit, formState, errors, reset, watch} = useForm({\n    mode: \"onChange\",\n    defaultValues: getDefaultValues(params),\n  });\n\n  const watchWoning = watch(\"Woning\");\n\n  useEffect(() => {\n    const handleMobileFocus = () => {\n      if (checkMobileBrowser(navigator.userAgent || navigator.vendor || window.opera)) {\n        document.activeElement.scrollIntoView(true);\n      }\n    };\n\n    document.addEventListener(\"focus\", handleMobileFocus, true);\n    return document.removeEventListener(\"focus\", handleMobileFocus);\n  }, []);\n\n\n  useEffect(() => {\n    if (params) {\n      setStepHeaderSummary(\n      getStep3HeaderSummary(currencyToNumber(params?.Woning), intl)\n      );\n    }\n  }, [params, intl]);\n\n  useEffect(() => {\n    if (shouldReset) {\n      reset(getDefaultValues({}));\n      setStepHeaderSummary(\"\");\n      setResetForms(false);\n    }\n  }, [shouldReset, reset, setResetForms]);\n\n  useEffect(() => {\n    const housePrice = currencyToNumber(watchWoning);\n    if (typeof SelectedMortgageProvider === \"object\" && SelectedMortgageProvider?.initial?.isNhg) {\n\n      const lookupId = housePrice > Nhg.existingBuilding ? SelectedMortgageProvider?.initial?.nonNhgLookupId : SelectedMortgageProvider?.initial?.nhglookupId;\n      const amountAboveNhg = housePrice > Nhg.existingBuilding;\n\n      if (lookupId !== SelectedMortgageProvider.lookupId) {\n        dispatch(getMortgageProviderAction(lookupId, (params?.isnewbuilding) ? params?.isnewbuilding : false))\n        setAmountAboveNhg(amountAboveNhg)\n      }\n    }\n  }, [dispatch, watchWoning, SelectedMortgageProvider, setAmountAboveNhg, Nhg, params]);\n\n  useEffect(() => {\n    setCalculatorType(getCalculatorType());\n    (StateIsNieuwbouw) ? setIsNieuwbouw(StateIsNieuwbouw.toString()) : setIsNieuwbouw(getCalculatorType() === CALCULATOR_TYPES.hoeveelKanIkLenen ? \"0\" : \"1\");\n  }, [calculatorType, StateIsNieuwbouw]);\n\n  rewriteRadioOptionsClasses(\"already-found-a-house\", [\n    \"no\",\n    \"yes-existing\",\n    \"yes-new\",\n  ]);\n\n  const onHouseOptionsChange = (value) => {\n    setIsNieuwbouw(value);\n  };\n\n  const onSustainabilityUpliftChange = (value) => {\n    setSustainabilityUplift(value);\n  }\n\n  const onEnergyLabelChange = (value) => {\n    setEnergyLabel(value)\n  }\n\n  const onSubmit = (data) => {\n    data.Woning = currencyToNumber(data.Woning);\n    data.IsNieuwbouw = parseInt(IsNieuwbouw);\n    data.SustainabilityUplift = parseInt(sustainabilityUplift);\n    data.EnergyLabel = energyLabel;\n    setStepHeaderSummary(getStep3HeaderSummary(data.Woning, intl));\n\n    if (IsNieuwbouw === \"0\" && calculatorType !==\n    CALCULATOR_TYPES.watWordenMijnMaandLasten) {\n      data.Woning = 0;\n    }\n\n    // general event\n    const tagManagerArgs = {\n      gtmId: \"GTM-T78CX5\",\n      dataLayer: {\n        event: \"gtm.calculators\",\n        eventCategory: \"Calculator\",\n        eventAction: \"Woning\",\n        eventLabel:\n        IsNieuwbouw === \"0\"\n        ? \"nog niet\"\n        : IsNieuwbouw === \"1\"\n        ? \"huis-bestaande bouw\"\n        : \"huis-nieuwbouw\",\n      },\n    };\n\n    gtm(tagManagerArgs);\n\n    onStepSubmit(data, stepNumber);\n  };\n\n  const isFormValid = formState.isValid && IsNieuwbouw;\n\n  return (\n  <div\n  className={`ct-step ${\n  state === stepStates.inactive && \"ct-step__inactive\"\n  }\n                                 ${\n  state === stepStates.filled &&\n  \"ct-step__filled\"\n  }\n                                 ${\n  state === stepStates.closed &&\n  \"ct-step__closed\"\n  }`}\n  >\n    <StepHeader\n    title={`${\n    calculatorType === CALCULATOR_TYPES.watWordenMijnMaandLasten\n    ? intl.formatMessage({ id: 'step3.headerTitle.watWordenMijnMaandLasten', defaultMessage: 'Hypotheek' })\n    : intl.formatMessage({ id: 'step3.headerTitle.default', defaultMessage: 'Woning' })\n    }`}\n    stepSummary={stepHeaderSummary}\n    stepNumber={stepNumber}\n    stepState={state}\n    openStep={openStep}\n    onClose={handleSubmit(onSubmit)}\n    />\n\n    <div\n    className={`ct-step__body ${\n    state === stepStates.active ? \"ct-step__body-opened\" : null\n    }`}\n    >\n      <form onSubmit={handleSubmit(onSubmit)} noValidate>\n        <div>\n          <div className=\"ct-step__body-primary-question\">\n\n            {(calculatorType === CALCULATOR_TYPES.watWordenMijnMaandLasten || calculatorType === CALCULATOR_TYPES.kanIkDitHuisBetalen) && (\n            <FormattedMessage id=\"step3.wantToBuyAHouse\" defaultMessage=\"{question}\"\n                              values={{\n                                question: calculatorType === CALCULATOR_TYPES.watWordenMijnMaandLasten ?\n                                intl.formatMessage({ id: 'step3.wantToBuyAHouse.watWordenMijnMaandLasten', defaultMessage: 'Wat worden mijn maandlasten?' }) :\n                                intl.formatMessage({ id: 'step3.wantToBuyAHouse.kanIkDitHuisBetalen', defaultMessage: 'Kan ik dit huis betalen?' })\n                                }}\n            />\n            )}\n\n            {calculatorType === CALCULATOR_TYPES.hoeveelKanIkLenen && (\n            <>\n              <FormattedMessage\n              id=\"step3.wantToBuyAHouse.hoeveelKanIkLenen\"\n              defaultMessage=\"{salutation} al een huis op het oog?*\"\n              values={{\n                salutation: HasPartner ?\n                intl.formatMessage({ id: 'step2.wantToBuyAHouse.hasPartner.yes', defaultMessage: 'Hebben jullie' }) :\n                intl.formatMessage({ id: 'step2.wantToBuyAHouse.hasPartner.no', defaultMessage: 'Heb je' })\n              }}\n              />\n\n              <img\n                className=\"ct-step__tool-tip ct-step__tool-tip--align-middle\"\n                data-tip={intl.formatMessage({ id: 'step3.wantToBuyAHouse.hoeveelKanIkLenen.tooltip', defaultMessage: 'We vragen naar het type bouw om voor je uit te rekenen met hoeveel eigen inleg je rekening moet houden. Onder nieuwbouw verstaan we woningen die nog gebouwd moeten worden of nog in aanbouw zijn.'})}\n                src={`${assetsBaseUrl}/assets/svg/info.svg`}\n                alt=\"\"\n              />\n              <ReactTooltip place={\"right\"} effect={\"solid\"} />\n            </>\n            )}\n          </div>\n\n          <div className=\"ct-step__body-secondary-subquestions\">\n            <div className=\"ct-step__body-subquestion\">\n\n                {calculatorType === CALCULATOR_TYPES.watWordenMijnMaandLasten &&\n                <div className=\"ct-step__body-tip margin-bottom-10\">\n                <FormattedMessage id=\"step3.wantToBuyAHouse.watWordenMijnMaandLasten.tip\"\n                                  defaultMessage=\"We rekenen graag voor je uit wat de maandlasten zijn bij het gewenste hypotheekbedrag. Zo kun je makkelijk zien welk bedrag je elke maand kwijt bent aan hypotheeklasten.\"/>\n                </div>\n                }\n                {calculatorType === CALCULATOR_TYPES.hoeveelKanIkLenen &&\n                <div className=\"ct-step__body-tip\">\n                  <FormattedMessage id=\"step3.wantToBuyAHouse.hoeveelKanIkLenen.tip\"\n                                    defaultMessage=\"Bij het kopen van een woning komen extra kosten kijken die je als koper zelf moet financieren, de hoogte hiervan hangt af van de koopsom.\"/>\n\n                  {calculatorType === CALCULATOR_TYPES.hoeveelKanIkLenen &&\n                  StepHouseOptions.all(onHouseOptionsChange, IsNieuwbouw)\n                  }\n                </div>\n                }\n\n              {IsNieuwbouw !== \"0\" &&\n              <>\n                {calculatorType !== CALCULATOR_TYPES.watWordenMijnMaandLasten ?\n                <FormattedMessage id=\"step3.housePrice.askingPrice\"\n                                  defaultMessage=\"Wat is de vraagprijs van deze woning?*\"/>\n                :\n                <FormattedMessage id=\"step3.housePrice.mortgageAmount\"\n                                defaultMessage=\"Wat is het hypotheekbedrag?*\"/>\n                }\n\n                <Input\n                placeholder=\"€\"\n                type=\"currency\"\n                register={register}\n                validationRules={{\n                  required: true,\n                  min: 1,\n                }}\n                error={errors.Woning}\n                name=\"Woning\"\n                errorTitle={intl.formatMessage({id: 'step3.housePrice.label', defaultMessage: 'koopsom'})}\n                />\n              </>\n              }\n            </div>\n          </div>\n\n          {calculatorType === CALCULATOR_TYPES.kanIkDitHuisBetalen &&\n          <>\n            <div className=\"ct-step__body-tip\">\n              <FormattedMessage id=\"step3.housePrice.houseType\" defaultMessage=\"Is het huis dat je op het oog hebt een bestaande woning of nieuwbouwwoning?*\" />\n              <img\n              className=\"ct-step__tool-tip\"\n              data-tip={intl.formatMessage({ id: 'step3.housePrice.houseType.tooltip', defaultMessage: 'We vragen naar het type bouw om voor je uit te rekenen met hoeveel eigen inleg je rekening moet houden. Onder nieuwbouw verstaan we woningen die nog gebouwd moeten worden of nog in aanbouw zijn.'})}\n              src={`${assetsBaseUrl}/assets/svg/info.svg`}\n              alt=\"\"\n              />\n              <ReactTooltip\n              place={\"right\"}\n              effect={\"solid\"}\n              />\n            </div>\n            {StepHouseOptions.partial(onHouseOptionsChange, IsNieuwbouw)}\n          </>\n          }\n\n\n          {(calculatorType === CALCULATOR_TYPES.hoeveelKanIkLenen || calculatorType === CALCULATOR_TYPES.kanIkDitHuisBetalen) && IsNieuwbouw !== \"0\" &&\n          <div className=\"ct-step__body-secondary-subquestions\">\n            <div className=\"ct-step__body-subquestion\">\n              <FormattedMessage id=\"step3.makeHousSustainable\" defaultMessage=\"Wil je deze woning verduurzamen?\" />\n            </div>\n            <RadioGroup\n            onChange={onSustainabilityUpliftChange}\n            value={sustainabilityUplift}\n            className=\"ct-step__radio-group ct-step__radio-group-vertical already-found-a-house\"\n            >\n              <ReversedRadioButton\n              value={`1`}\n              rootColor=\"#000000\"\n              pointColor=\"#000000\"\n              iconInnerSize={18}\n              iconSize={18}\n              >\n                <FormattedMessage id=\"step3.makeHousSustainable.yes\" defaultMessage=\"Ja\" />\n              </ReversedRadioButton>\n\n              <ReversedRadioButton\n              value={`0`}\n              rootColor=\"#000000\"\n              pointColor=\"#000000\"\n              iconInnerSize={18}\n              iconSize={18}\n              >\n                <FormattedMessage id=\"step3.makeHousSustainable.no\" defaultMessage=\"Nee\" />\n              </ReversedRadioButton>\n            </RadioGroup>\n            <div className=\"ct-step__body-subquestion\">\n              <FormattedMessage id=\"step3.whatIsEnergyLabel.no\" defaultMessage=\"Wat is het (voorlopig) energielabel van deze woning?\" />\n\n            </div>\n            <div className=\"ct-step__energy-label\">\n              <Select\n              value={energyLabel}\n              onChange={onEnergyLabelChange}\n              options={options}\n              />\n            </div>\n          </div>\n          }\n        </div>\n\n\n        {AmountAboveNhg && getCalculatorType() === CALCULATOR_TYPES.watWordenMijnMaandLasten && (\n          <div className=\"ct-input_error-msg margin-bottom-70\">\n            <FormattedMessage\n            id=\"nhgError\"\n            defaultMessage=\"Je hebt gekozen voor een rente met Nationale Hypotheekgarantie (NHG). NHG is een garantie op hypotheken tot {existingBuilding} euro. Het gewenste hypotheekbedrag is hoger dan {existingBuilding} euro. Om een goede berekening te kunnen doen, hebben wij de laagste hypotheekrente zonder NHG (100% marktwaarde) gebruikt.\"\n            values={{existingBuilding: Nhg.existingBuilding}}\n            />\n          </div>\n        )}\n        <NextButton\n        loading={loading}\n        isFormValid={isFormValid}\n        formState={formState}\n        ></NextButton>\n      </form>\n    </div>\n  </div>\n  );\n}\n\nexport default Step3;\n","import React from \"react\";\nimport {Controller} from \"react-hook-form\";\nimport {RadioGroup, ReversedRadioButton} from \"react-radio-buttons\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\n\nfunction HomeMortgageStart({ register, watchHomeMortgageStartNotKnown,  control, paidOff }) {\n  const intl = useIntl();\n  return (\n  <div>\n    {!watchHomeMortgageStartNotKnown &&\n    <div className='ct-input_wrapper'>\n      <div className=\"ct-step__body-subquestion\">\n        <FormattedMessage id={'stepParts.homeMortgageStart.startDate'}\n                          defaultMessage={'{question}'}\n                          values={{\n                            question: (paidOff) ?\n                            intl.formatMessage({id: 'stepParts.homeMortgageStart.startDate.paidOff', defaultMessage: 'Wat is de startdatum van de hypotheek?*'}) :\n                            intl.formatMessage({id: 'stepParts.homeMortgageStart.startDate.notPaidOff', defaultMessage: 'Wat is de startdatum van de annuïtaire/lineaire hypotheek?*'})\n                          }}\n        />\n      </div>\n      <div className='ct-input'>\n        <input\n        className=''\n        name=\"HomeMortgageStart\"\n        type=\"date\"\n        ref={register({required: true})}\n        ></input>\n      </div>\n    </div>\n    }\n\n    <div className=\"ct-input_wrapper\">\n\n      <label className=\"ct-checkbox\"><span className='ct-step__body-subquestion'>\n        <FormattedMessage id={'stepParts.homeMortgageStart.dataNotKnown'} defaultMessage={'Ik weet de exacte datum niet zeker'} />\n      </span>\n        <input name=\"HomeMortgageStartNotKnown\"\n               type=\"checkbox\"\n               value=\"true\"\n               ref={register({ required: false })}></input>\n        <span className=\"checkmark\"></span>\n      </label>\n\n    </div>\n\n    {watchHomeMortgageStartNotKnown &&\n    <div>\n      <div className=\"ct-step__body-subquestion\">\n\n        <FormattedMessage id={'stepParts.homeMortgageStart.before2013'} defaultMessage={'Om een goede indicatie van de nieuwe maximale hypotheek te geven, willen we graag weten of de hypotheek voor 1-1-2013 is gestart'} />\n      </div>\n\n      <Controller\n      as={\n        <RadioGroup\n        horizontal\n        className=\"ct-step__radio-group\"\n        >\n          <ReversedRadioButton\n          value=\"true\"\n          rootColor=\"#000000\"\n          pointColor=\"#000000\"\n          iconInnerSize={18}\n          iconSize={18}\n          >\n            <FormattedMessage id={'stepParts.homeMortgageStart.before2013.yes'} defaultMessage={'Ja'} />\n          </ReversedRadioButton>\n\n          <ReversedRadioButton\n          value=\"false\"\n          rootColor=\"#000000\"\n          pointColor=\"#000000\"\n          iconInnerSize={18}\n          iconSize={18}\n          >\n            <FormattedMessage id={'stepParts.homeMortgageStart.before2013.no'} defaultMessage={'Nee'} />\n          </ReversedRadioButton>\n        </RadioGroup>\n      }\n      defaultValue=\"false\"\n      name=\"HomeMortgageStartBefore2013\"\n      control={control}\n      />\n\n    </div>\n  }\n\n  </div>\n  )};\n\nexport default HomeMortgageStart;\n","import React, {useEffect, useState} from \"react\";\nimport { RadioGroup, ReversedRadioButton } from \"react-radio-buttons\";\nimport {Controller, useForm} from \"react-hook-form\";\nimport StepHeader from \"./stepParts/StepHeader\";\nimport {\n  addOfficeIdParamToLink,\n  CALCULATOR_TYPES,\n  currencyToNumber, getCalculatorType, numberToCurrency,\n  rewriteRadioOptionsClasses,\n  stepStates,\n} from \"../../services/helpers\";\nimport Input from \"../core/Input\";\nimport { gtm } from \"../../services/gtm\";\nimport { useSelector } from \"react-redux\";\nimport {getStep4HeaderSummary, getStepParams} from \"../../services/stepHelpers\";\nimport HomeMortgageStart from \"./stepParts/HomeMortgageStart\";\nimport NextButton from \"./stepParts/NextButton\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\n\nfunction Step4({\n    stepNumber,\n    state,\n    openStep,\n    loading,\n    onStepSubmit,\n    shouldReset,\n    setResetForms,\n}) {\n    const intl = useIntl();\n    const { HasPartner, Woning } = useSelector((state) => state.calculator);\n    const [HasHouse, setHasHouse] = useState();\n    const [stepHeaderSummary, setStepHeaderSummary] = useState();\n    const [params] = useState(getStepParams());\n    const getDefaultValues = (params) => {\n      return {\n        OwnResources: numberToCurrency(params?.OwnResources, true),\n        HomeEquity: numberToCurrency(params?.HomeEquity, true),\n        HomeEquityCosts: numberToCurrency(params?.HomeEquityCosts, true),\n        HomeMortgageAmount: numberToCurrency(params?.HomeMortgageAmount, true),\n        HomeMortgageStart: params?.HomeMortgageStart,\n        HomeMortgageStartNotKnown: params?.HomeMortgageStartNotKnown?.toString(),\n        HomeMortgageStartBefore2013: params?.HomeMortgageStartBefore2013?.toString(),\n        HomeMortgageIsBeingPaidOff: params?.HomeMortgageIsBeingPaidOff?.toString(),\n        HomeMortgageOtherPartAmount: numberToCurrency(params?.HomeMortgageOtherPartAmount, true),\n        WantsToSkipMortgageQuestions: (params?.WantsToSkipMortgageQuestions) ? params?.WantsToSkipMortgageQuestions?.toString() : \"true\",\n      };\n    }\n    const {\n        register,\n        handleSubmit,\n        formState,\n        errors,\n        control,\n        setValue,\n        watch,\n        getValues,\n        reset,\n    } = useForm({\n        mode: \"onChange\",\n        defaultValues: getDefaultValues(params),\n    });\n\n    const watchHomeMortgageIsBeingPaidOff = watch(\"HomeMortgageIsBeingPaidOff\");\n    const watchWantsToSkipMortgageQuestions = watch(\"WantsToSkipMortgageQuestions\");\n    const watchHomeMortgageOtherPartAmount = watch(\"HomeMortgageOtherPartAmount\");\n    const watchHomeEquity = watch(\"HomeEquity\");\n\n    const watchHomeMortgageStartNotKnown = watch(\"HomeMortgageStartNotKnown\");\n\n    useEffect(() => {\n        if (currencyToNumber(watchHomeEquity) > 0) {\n            setValue(\n                \"HomeEquityCosts\",\n            numberToCurrency(Math.round(\n                    (currencyToNumber(watchHomeEquity) / 100) * 2\n                ), true),\n                { shouldDirty: true }\n            );\n        }\n    }, [watchHomeEquity, setValue]);\n\n    useEffect(() => {\n        params &&\n            setStepHeaderSummary(\n                getStep4HeaderSummary(\n                    params?.HomeEquity,\n                    params?.OwnResources,\n                    params?.HomeEquityCosts,\n                    params?.HomeMortgageAmount,\n                    params.Woning,\n      false,\n                    intl\n                )\n            );\n    }, [setStepHeaderSummary, params, intl]);\n\n    useEffect(() => {\n        if (shouldReset) {\n            reset(getDefaultValues({}));\n            setStepHeaderSummary(\"\");\n            setResetForms(false);\n        }\n    }, [shouldReset, setResetForms, reset]);\n\n    const watchValues = watch([\"HomeEquity\", \"OwnResources\"]);\n    // fix merge master with HAM-848!\n    const MortgageLessThenSurplus =\n        Woning > 0\n            ? currencyToNumber(watchValues.HomeEquity) +\n                  currencyToNumber(watchValues.OwnResources) >\n              Woning\n            : false;\n    const isFormValid =\n        formState.isValid && HasHouse && !MortgageLessThenSurplus;\n\n    useEffect(() => {\n        setHasHouse(params?.HasHouse ? params?.HasHouse.toString() : \"false\");\n        //setWantsToSkipMortgageQuestions(\"false\");\n    }, [setHasHouse, params]);\n\n    rewriteRadioOptionsClasses(\"already-own-a-house\", [\"yes\", \"no\"]);\n\n    const onHasHouseChange = (value) => setHasHouse(value);\n\n    const onSubmit = (data) => {\n        data.HasHouse = HasHouse;\n        data.HomeEquity = currencyToNumber(data.HomeEquity);\n        data.HomeEquityCosts = currencyToNumber(data.HomeEquityCosts);\n        data.HomeMortgageAmount = currencyToNumber(data.HomeMortgageAmount);\n        data.HomeMortgageIsBeingPaidOff = data.HomeMortgageIsBeingPaidOff === \"true\";\n        data.HomeMortgageStartNotKnown = data.HomeMortgageStartNotKnown === \"true\";\n        data.HomeMortgageStartBefore2013 = data.HomeMortgageStartBefore2013 === \"true\";\n        data.WantsToSkipMortgageQuestions = data.WantsToSkipMortgageQuestions === \"true\"\n        data.HomeMortgageOtherPartAmount = currencyToNumber(\n            data.HomeMortgageOtherPartAmount\n        );\n        data.OwnResources = currencyToNumber(data.OwnResources);\n\n        setStepHeaderSummary(\n            getStep4HeaderSummary(\n                data.HomeEquity,\n                data.OwnResources,\n                data.HomeEquityCosts,\n                data.HomeMortgageAmount,\n                Woning,\n            false,\n            intl\n            )\n        );\n\n        const tagManagerArgs = {\n            gtmId: \"GTM-T78CX5\",\n            dataLayer: {\n                event: \"gtm.calculators\",\n                eventCategory: \"Calculator\",\n                eventAction: \"Inleg eigen geld\",\n                eventLabel: \"koophuis-\" + HasHouse,\n            },\n        };\n\n        gtm(tagManagerArgs);\n\n        onStepSubmit(data, stepNumber);\n    };\n\n    return (\n        <div\n            className={`ct-step ${\n                state === stepStates.inactive && \"ct-step__inactive\"\n            }\n                                 ${\n                                     state === stepStates.filled &&\n                                     \"ct-step__filled\"\n                                 }\n                                 ${\n                                     state === stepStates.closed &&\n                                     \"ct-step__closed\"\n                                 }`}\n        >\n            <StepHeader\n                title={intl.formatMessage({id: \"step4.headerTitle\", defaultMessage: \"Inleg eigen geld\"})}\n                stepSummary={stepHeaderSummary}\n                stepNumber={stepNumber}\n                stepState={state}\n                openStep={openStep}\n                onClose={handleSubmit(onSubmit)}\n            />\n\n            <div\n                className={`ct-step__body ${\n                    state === stepStates.active ? \"ct-step__body-opened\" : null\n                }`}\n            >\n                <form onSubmit={handleSubmit(onSubmit)} noValidate>\n                    {Woning > 0 &&\n                        <div>\n                            <div className=\"ct-step__body-primary-question\">\n                              <FormattedMessage\n                              id=\"step4.ownResources\"\n                              defaultMessage=\"Hoeveel eigen geld {salutation}  inbrengen?\"\n                              values={{\n                                salutation: HasPartner ?\n                                intl.formatMessage({ id: 'step4.ownResources.hasPartner.yes', defaultMessage: 'willen jullie' }) :\n                                intl.formatMessage({ id: 'step4.ownResources.hasPartner.no', defaultMessage: 'wil je' })\n                              }}\n                              />\n                            </div>\n\n                            <div className=\"ct-step__body-tip\">\n                              <FormattedMessage id={\"step4.ownResources.tip\"} defaultMessage={\"Bij de aankoop van een huis moet je rekening houden met een deel eigen geld. Dit is gemiddeld ongeveer 6% van de woningwaarde. Vul hier in hoeveel eigen geld je kunt of wilt inleggen.\"} />\n                            </div>\n\n                            <Input\n                                placeholder=\"€\"\n                                type=\"currency\"\n                                register={register}\n                                validationRules={{ required: false }}\n                                error={errors.OwnResources}\n                                name=\"OwnResources\"\n                                errorTitle={intl.formatMessage({ id: 'step4.ownResources.errorTitle', defaultMessage: 'eigen geld' })}\n                            />\n                          </div>\n                    }\n                    <div className=\"ct-step__body-secondary-questions-block\">\n                        <div className=\"ct-step__body-secondary-question\">\n                            <FormattedMessage\n                            id=\"step4.hasHouse\"\n                            defaultMessage=\"{salutation} al een koophuis?*\"\n                            values={{\n                              salutation: HasPartner ?\n                              intl.formatMessage({ id: 'step4.hasHouse.hasPartner.yes', defaultMessage: 'Hebben jullie' }) :\n                              intl.formatMessage({ id: 'step4.hasHouse.hasPartner.no', defaultMessage: 'Heb je' })\n                            }}\n                            />\n                        </div>\n\n                        <div className=\"ct-step__body-tip\">\n                          <FormattedMessage id={\"step4.hasHouse.tip\"} defaultMessage={\"Heb je al een koophuis? Dan kan je de overwaarde van je woning gebruiken voor de aanschaf van je nieuwe woning.\"} />\n                        </div>\n\n                        <RadioGroup\n                            onChange={onHasHouseChange}\n                            value={HasHouse}\n                            horizontal\n                            className=\"ct-step__radio-group already-own-a-house\"\n                        >\n                            <ReversedRadioButton\n                                value=\"true\"\n                                rootColor=\"#000000\"\n                                pointColor=\"#000000\"\n                                iconInnerSize={18}\n                                iconSize={18}\n                            >\n                              <FormattedMessage id={\"step4.hasHouse.yes\"} defaultMessage={\"Ja\"} />\n                            </ReversedRadioButton>\n\n                            <ReversedRadioButton\n                                value=\"false\"\n                                rootColor=\"#000000\"\n                                pointColor=\"#000000\"\n                                iconInnerSize={18}\n                                iconSize={18}\n                            >\n                              <FormattedMessage id={\"step4.hasHouse.no\"} defaultMessage={\"Nee\"} />\n                            </ReversedRadioButton>\n                        </RadioGroup>\n\n                        {HasHouse === \"true\" &&\n                        <div>\n                          {!MortgageLessThenSurplus && HasHouse === \"true\" && getCalculatorType() !== CALCULATOR_TYPES.watWordenMijnMaandLasten && (\n                            <div className=\"ct-input_info-msg ct-input_error-msg--no-margin-top margin-bottom-20\">\n                              <FormattedMessage id={'step4.mortgageLessThenSurplus'}\n                                                defaultMessage={'Je huidige hypotheek heeft invloed op de hoogte van je nieuwe maximale hypotheek. Voor een goede indicatie van de nieuwe maximale hypotheek stellen we hieronder wat vragen over je huidige hypotheek. Heb je deze gegevens niet bij de hand of wil je nu alleen een snelle berekening doen dan kan je dit gedeelte overslaan. Let er dan wel op dat je maximale hypotheek lager kan uitvallen dan de uitslag van deze berekening. Onze adviseurs kunnen een gedetailleerde berekening voor je maken bij {appointmentLink} bij je in de buurt.'}\n                                                values={{\n                                                  appointmentLink: <a\n                                                  href={addOfficeIdParamToLink(`https://www.hypotheker.nl/afspraak-maken-hypotheekadviseur/`)}\n                                                  target=\"_blank\"\n                                                  rel=\"noopener noreferrer\"\n                                                  >\n                                                    {intl.formatMessage({ id: 'step4.mortgageLessThenSurplus.appointmentLink', defaultMessage: 'een vestiging' })}\n                                                  </a>\n                                                }}\n                              />\n                            </div>\n                          )\n                          }\n                            <div className=\"ct-step__body-tip\">\n                              <FormattedMessage\n                              id=\"step4.skipHasHouseQuestions\"\n                              defaultMessage=\"Wil je de vragen over {salutation} huidige hypotheek overslaan?*\"\n                              values={{\n                                salutation: HasPartner ?\n                                intl.formatMessage({ id: 'step4.skipHasHouseQuestions.hasPartner.yes', defaultMessage: 'jullie' }) :\n                                intl.formatMessage({ id: 'step4.skipHasHouseQuestions.hasPartner.no', defaultMessage: 'je' })\n                              }}\n                              />\n                            </div>\n\n                          <Controller\n                          as={\n                            <RadioGroup\n                                horizontal\n                                className=\"ct-step__radio-group already-own-a-house\"\n                            >\n                              <ReversedRadioButton\n                                  value=\"true\"\n                                  rootColor=\"#000000\"\n                                  pointColor=\"#000000\"\n                                  iconInnerSize={18}\n                                  iconSize={18}\n                              >\n                                <FormattedMessage id={\"step4.skipHasHouseQuestions.yes\"} defaultMessage={\"Ja\"} />\n\n                              </ReversedRadioButton>\n\n                              <ReversedRadioButton\n                                  value=\"false\"\n                                  rootColor=\"#000000\"\n                                  pointColor=\"#000000\"\n                                  iconInnerSize={18}\n                                  iconSize={18}\n                              >\n                                <FormattedMessage id={\"step4.skipHasHouseQuestions.no\"} defaultMessage={\"Nee\"} />\n\n                              </ReversedRadioButton>\n                            </RadioGroup>\n                          }\n                          rules={{ required: true }}\n                          name=\"WantsToSkipMortgageQuestions\"\n                          control={control}\n                          />\n                        </div>\n                        }\n                    </div>\n\n                    {HasHouse === \"true\" && watchWantsToSkipMortgageQuestions === \"false\" &&\n                        <div className={\"ct-step__body-secondary-subquestions\"}>\n                            <div>\n                                <div>\n                                    <div className=\"ct-step__body-subquestion\">\n\n                                      <FormattedMessage\n                                      id=\"step4.HomeEquity\"\n                                      defaultMessage=\"Wat is de verkoopprijs van {salutation} huidige koophuis?*\"\n                                      values={{\n                                        salutation: HasPartner ?\n                                        intl.formatMessage({ id: 'step4.HomeEquity.hasPartner.yes', defaultMessage: 'jullie' }) :\n                                        intl.formatMessage({ id: 'step4.HomeEquity.hasPartner.no', defaultMessage: 'je' })\n                                      }}\n                                      />\n                                    </div>\n\n                                    <div className=\"ct-step__body-tip\">\n                                      <FormattedMessage id={\"step4.HomeEquity.tip\"} defaultMessage={\"Als je deze niet weet, kun je hier de vraagprijs van je woning noteren of een schatting maken.\"} />\n                                    </div>\n\n                                    <Input\n                                        placeholder=\"€\"\n                                        type=\"currency\"\n                                        register={register}\n                                        validationRules={{ required: true, min: 1.0 }}\n                                        name=\"HomeEquity\"\n                                        errorTitle={intl.formatMessage({ id: 'step4.HomeEquity.errorTitle', defaultMessage: 'vraagprijs' })}\n                                    />\n                                </div>\n                                <div>\n                                    <div className=\"ct-step__body-subquestion\">\n                                      <FormattedMessage id={\"step4.HomeEquityCosts\"} defaultMessage={\"Wat zijn de verkoopkosten?*\"} />\n                                    </div>\n\n                                    <div className=\"ct-step__body-tip\">\n                                      <FormattedMessage id={\"step4.HomeEquityCosts.tip\"} defaultMessage={\"Bij het verkopen van je huis heb je te maken met o.a. de kosten van de makelaar. Dit is vaak rond de 2% van de verkooprijs.\"} />\n                                    </div>\n\n                                    <Input\n                                        placeholder=\"€\"\n                                        type=\"currency\"\n                                        register={register}\n                                        validationRules={{ required: true }}\n                                        name=\"HomeEquityCosts\"\n                                        errorTitle={intl.formatMessage({ id: 'step4.HomeEquityCosts.errorTitle', defaultMessage: 'verkoop kosten' })}\n                                    />\n                                </div>\n                                <div>\n                                    <div className=\"ct-step__body-subquestion\">\n                                      <FormattedMessage id={\"step4.homeMortgageAmount\"} defaultMessage={\"Wat is de actuele hoogte van {salutation} huidige hypotheek?*\"} values={{\n                                        salutation: HasPartner ?\n                                        intl.formatMessage({ id: 'step4.homeMortgageAmount.hasPartner.yes', defaultMessage: 'jullie' }) :\n                                        intl.formatMessage({ id: 'step4.HomeMortgageAmount.hasPartner.no', defaultMessage: 'je' })\n                                      }} />\n                                    </div>\n\n                                    <Input\n                                        placeholder=\"€\"\n                                        type=\"currency\"\n                                        register={register}\n                                        validationRules={{ required: true }}\n                                        name=\"HomeMortgageAmount\"\n                                        errorTitle={intl.formatMessage({ id: 'step4.homeMortgageAmount.errorTitle', defaultMessage: 'huidige hypotheek' })}\n                                    />\n                                </div>\n                                <div>\n                                    <div className=\"ct-step__body-subquestion\">\n                                      <FormattedMessage id={\"step4.homeMortgageType\"} defaultMessage={\"Is deze hypotheek een volledig annuïtair en/of lineair?*\"} />\n                                    </div>\n\n                                    <Controller\n                                        as={\n                                            <RadioGroup\n                                                horizontal\n                                                className=\"ct-step__radio-group\"\n                                            >\n                                                <ReversedRadioButton\n                                                    value=\"true\"\n                                                    rootColor=\"#000000\"\n                                                    pointColor=\"#000000\"\n                                                    iconInnerSize={18}\n                                                    iconSize={18}\n                                                >\n\n                                                  <FormattedMessage id={\"step4.homeMortgageType.yes\"} defaultMessage={\"Ja\"} />\n                                                </ReversedRadioButton>\n\n                                                <ReversedRadioButton\n                                                    value=\"false\"\n                                                    rootColor=\"#000000\"\n                                                    pointColor=\"#000000\"\n                                                    iconInnerSize={18}\n                                                    iconSize={18}\n                                                >\n\n                                                  <FormattedMessage id={\"step4.homeMortgageType.no\"} defaultMessage={\"Nee\"} />\n                                                </ReversedRadioButton>\n                                            </RadioGroup>\n                                        }\n                                        rules={{ required: true }}\n                                        defaultValue={\"true\"}\n                                        name=\"HomeMortgageIsBeingPaidOff\"\n                                        control={control}\n                                    />\n                                </div>\n\n                                {watchHomeMortgageIsBeingPaidOff === \"true\" && (\n                                    <HomeMortgageStart\n                                        register={register}\n                                        control={control}\n                                        watchHomeMortgageStartNotKnown={\n                                            watchHomeMortgageStartNotKnown\n                                        }\n                                        paidOff={\n                                            watchHomeMortgageIsBeingPaidOff ===\n                                            \"true\"\n                                        }\n                                    ></HomeMortgageStart>\n                                )}\n                                {watchHomeMortgageIsBeingPaidOff ===\n                                    \"false\" && (\n                                    <div>\n                                        <div>\n                                            <div className=\"ct-step__body-subquestion\">\n                                              <FormattedMessage id={\"step4.homeMortgageOtherPartAmount\"} defaultMessage={\"Wat is de actuele hoogte van het (deel) van de hypotheek dat een andere hypotheekvorm heeft?*\"} />\n                                            </div>\n\n                                            <Input\n                                                placeholder=\"€\"\n                                                type=\"currency\"\n                                                register={register}\n                                                validationRules={{\n                                                    required: true,\n                                                }}\n                                                name=\"HomeMortgageOtherPartAmount\"\n                                                errorTitle={intl.formatMessage({ id: 'step4.homeMortgageOtherPartAmount.errorTitle', defaultMessage: 'huidige hypotheek' })}\n                                            />\n                                        </div>\n\n                                        {watchHomeMortgageOtherPartAmount &&\n                                            currencyToNumber(\n                                                watchHomeMortgageOtherPartAmount\n                                            ) <\n                                                currencyToNumber(\n                                                    getValues(\n                                                        \"HomeMortgageAmount\"\n                                                    )\n                                                ) && (\n                                                <HomeMortgageStart\n                                                    register={register}\n                                                    control={control}\n                                                    watchHomeMortgageStartNotKnown={\n                                                        watchHomeMortgageStartNotKnown\n                                                    }\n                                                    paidOff={\n                                                        watchHomeMortgageIsBeingPaidOff ===\n                                                        \"true\"\n                                                    }\n                                                ></HomeMortgageStart>\n                                            )}\n                                    </div>\n                                )}\n                            </div>\n                        </div>\n                    }\n\n                  {MortgageLessThenSurplus &&\n                  getCalculatorType() !==\n                  CALCULATOR_TYPES.watWordenMijnMaandLasten && (\n                  <div className=\"ct-input_error-msg margin-bottom-20\">\n                  <FormattedMessage id={'step4.housePriceLessThenSurplus'}\n                                    defaultMessage={'De vraagprijs van de woning die je op het oog hebt, is lager dan de overwaarde van je huidige woning en de eigen middelen die je wilt inbrengen. In dit geval zal je geen hypotheek nodig hebben. Wil je wel een hypotheek? Maak dan een afspraak bij {appointmentLink} in de buurt voor advies over je persoonlijke situatie.'}\n                                    values={{\n                                      appointmentLink: <a\n                                      href={addOfficeIdParamToLink(`https://www.hypotheker.nl/afspraak-maken-hypotheekadviseur/`)}\n                                      target=\"_blank\"\n                                      rel=\"noopener noreferrer\"\n                                      >\n                                        {intl.formatMessage({ id: 'step4.housePriceLessThenSurplus.appointmentLink', defaultMessage: 'een vestiging' })}\n                                      </a>\n                                    }}\n                  />\n                  </div>\n                  )}\n\n                    <NextButton\n                        loading={loading}\n                        isFormValid={isFormValid}\n                        formState={formState}\n                    ></NextButton>\n                </form>\n            </div>\n        </div>\n    );\n}\n\nexport default Step4;\n","import React from 'react';\n\n\nfunction HypoTypeBlock({title, text, active, handleHypoChange}) {\n\n    return (\n        <div\n            className={`ct-step__hypo-type-block ${active ? 'ct-step__hypo-type-block-active' : null}`}\n            onClick={() => handleHypoChange(title === 'Annuïteiten')}\n        >\n            <div>\n                {title}\n            </div>\n            <div>\n                {text}\n            </div>\n        </div>\n    );\n}\n\nexport default HypoTypeBlock;\n","import React from 'react';\n\nimport {assetsBaseUrl} from \"../../../services/calculationsApi\";\n\n\nfunction CheckLine({text}) {\n    return (\n        <div className=\"ct-step__sidebar-checkline\">\n            <div>\n                <img src={`${assetsBaseUrl}/assets/svg/check-secondary.svg`} alt=\"\"/>\n            </div>\n\n            <div>\n                {text}\n            </div>\n        </div>\n    );\n}\n\nexport default CheckLine;\n","import React from 'react';\nimport {Tab, Tabs, TabList, TabPanel} from 'react-tabs';\n\nimport CheckLine from \"./CheckLine\";\nimport {assetsBaseUrl} from \"../../../services/calculationsApi\";\nimport {FormattedMessage} from \"react-intl\";\n\nfunction StepSidebar({toggleSidebar, sidebarType, intl}) {\n\n    return (\n        <div className=\"ct-step__sidebar\">\n            <div className=\"ct-step__sidebar-close\">\n                <img src={`${assetsBaseUrl}/assets/svg/close.svg`} alt=\"\" onClick={toggleSidebar}/>\n            </div>\n\n            <div className=\"ct-step__sidebar-content\">\n\n                <div className=\"ct-step__sidebar-title\">\n                    {(sidebarType === 'mortgage-info') ? intl.formatMessage({ id: 'stepSidebar.mortgageInfo.title' , defaultMessage: 'Hypotheekvormen'})\n                    : intl.formatMessage({ id: 'stepSidebar.period.title' , defaultMessage: 'Rentevaste periode'})}\n                </div>\n\n                {(sidebarType === 'mortgage-info') ? (\n                    <Tabs>\n                        <TabList>\n                            <Tab>\n                              <FormattedMessage id={'stepSidebar.mortgageInfo.annuity.title'} defaultMessage={'Annuïteiten'} />\n                            </Tab>\n\n                            <Tab>\n                              <FormattedMessage id={'stepSidebar.mortgageInfo.linear.title'} defaultMessage={'Lineair'} />\n                            </Tab>\n                        </TabList>\n\n                        <TabPanel>\n                            <div className=\"ct-tab__title\">\n                              <FormattedMessage id={'stepSidebar.mortgageInfo.annuity.payoff'} defaultMessage={'In het begin meer rente, tegen het einde meer aflossing'} />\n                            </div>\n\n                            <div className=\"ct-tab__text\">\n                              <FormattedMessage id={'stepSidebar.mortgageInfo.annuity.text'} defaultMessage={'Met een annuïteitenhypotheek blijft het totaal van de bruto rente en de aflossing gedurende de looptijd gelijk. De verhouding tussen de aflossing en het rentebedrag verandert iedere maand. In het begin betaal je het grootste deel rente en los je in verhouding minder af. Tegen het einde van de looptijd los je juist meer af en betaal je steeds minder hypotheekrente.'} />\n                            </div>\n\n                            <div className=\"ct-step__sidebar-checklines-block\">\n                                <CheckLine\n                                    text={intl.formatMessage({id: 'stepSidebar.mortgageInfo.annuity.checkline1', defaultMessage: 'Gelijkblijvende bruto maandlasten.'})}\n\n                                />\n\n                                <CheckLine\n                                    text={intl.formatMessage({id: 'stepSidebar.mortgageInfo.annuity.checkline2', defaultMessage: 'In vergelijking met een lineaire hypotheek, is bij aanvang het maandbedrag minder hoog.'})}\n                                />\n\n                                <CheckLine\n                                    text={intl.formatMessage({id: 'stepSidebar.mortgageInfo.annuity.checkline3', defaultMessage: 'Zekerheid dat je de hypotheek helemaal aflost.'})}\n                                />\n                            </div>\n                        </TabPanel>\n\n                        <TabPanel>\n                            <div className=\"ct-tab__title\">\n                              <FormattedMessage id={'stepSidebar.mortgageInfo.linear.payoff'} defaultMessage={'Steeds lagere maandlasten'} />\n                            </div>\n\n                            <div className=\"ct-tab__text\">\n                              <FormattedMessage id={`stepSidebar.mortgageInfo.linear.text`} defaultMessage={`Een lineaire hypotheek heeft lineaire (gelijke) aflossing. Iedere maand wordt dus hetzelfde bedrag afgelost. De bijbehorende rente is hiermee in het begin het hoogst en bouwt af gedurende de looptijd. Bij een lineaire hypotheek moet je dus rekening houden met een relatief hoog maandbedrag bij aanvang.`} />\n                            </div>\n\n                            <div className=\"ct-step__sidebar-checklines-block\">\n                                <CheckLine\n                                    text={intl.formatMessage({id: 'stepSidebar.mortgageInfo.linear.checkline1', defaultMessage: 'Tijdens de looptijd los je elke maand hetzelfde bedrag af.'})}\n                                />\n\n                                <CheckLine\n                                    text={intl.formatMessage({id: 'stepSidebar.mortgageInfo.linear.checkline2', defaultMessage: 'Hogere maandbedrag bij aanvang maar over de gehele looptijd betaal je minder rente.'})}\n                                />\n\n                                <CheckLine\n                                    text={intl.formatMessage({id: 'stepSidebar.mortgageInfo.linear.checkline3', defaultMessage: 'Zekerheid dat je de hypotheek helemaal aflost.'})}\n                                />\n                            </div>\n                        </TabPanel>\n                    </Tabs>\n                ) : (\n                    <div>\n                        <div className=\"ct-step__sidebar-subtitle\">\n                          <FormattedMessage id={'stepSidebar.period.payoff'} defaultMessage={'Rentevaste periode is de afgesproken periode dat de rente gelijk blijft.'} />\n                        </div>\n\n                        <div className=\"ct-step__sidebar-text\">\n                            <FormattedMessage id={'stepSidebar.period.text1'} defaultMessage={'Het rentepercentage voor jouw hypotheek kun je voor verschillende rentevaste perioden vastzetten. Je kan kiezen voor variabele of vaste rente. En als je kiest voor vaste rente, dan zijn de keuzes van 1 jaar tot en met 30 jaar, dit verschilt per geldverstrekker. In de meeste gevallen geldt: bij een langere rentevaste periode hoort ook een hoger rentepercentage.'} />\n                            <br/><br/>\n                            <FormattedMessage id={'stepSidebar.period.text2'} defaultMessage={'Aan de hand van een aantal vragen stelt de hypotheekadviseur vast wat de beste optie is voor jou. Houd je van zekerheid en wil je niet voor verrassingen komen te staan? Dan is het verstandiger om je hypotheekrente voor een langere periode vast te zetten. Verwacht je dat je in de toekomst meer kan verdienen en daarmee grotere stijgingen in de rente kunt veroorloven, dan kun je ervoor kiezen om de rente voor een kortere periode vast te zetten.'} />\n                        </div>\n                    </div>\n                )}\n\n\n            </div>\n\n        </div>\n    );\n}\n\nexport default StepSidebar;\n","import React from 'react';\nimport {assetsBaseUrl} from \"../../services/calculationsApi\";\nimport {FormattedMessage} from \"react-intl\";\n\n\nconst LoadingModal = () => {\n    return (\n        <div className=\"ct-step__modal-wrapper\">\n            <div className=\"ct-step__loading-modal\">\n                <div className=\"ct-step__loading-modal-title\">\n                    <FormattedMessage id={'loadingModal.title'} defaultMessage={'We zijn nu je beste deal aan het opzoeken'}/>\n                </div>\n\n                <div className=\"ct-step__loading-modal-text\">\n                    <img src={`${assetsBaseUrl}/assets/svg/check.svg`} alt=\"\"/>\n                    <FormattedMessage id={'loadingModal.text'} defaultMessage={'Wij vergelijken meer dan 40 banken en zoeken de beste deal'}/>\n                </div>\n\n                <img src={`${assetsBaseUrl}/assets/svg/loader-dots.svg`} alt=\"\"/>\n            </div>\n        </div>\n    );\n};\n\nexport default LoadingModal;\n","import React from 'react';\nimport {useDispatch} from \"react-redux\";\nimport {SET_OTHER_BANK} from \"../../store/actionTypes/calculatorActionTypes\";\nimport {assetsBaseUrl} from \"../../services/calculationsApi\";\nimport {FormattedMessage} from \"react-intl\";\nimport {numberToCurrency} from \"../../services/helpers\";\n\nfunction BankCard({isMain, bankData, grossMonthlyCost, selector, selected}) {\n  const dispatch = useDispatch();\n  const toggleBank = (item, action) => {\n    dispatch({\n      type: SET_OTHER_BANK,\n      action: action,\n      bank: item\n    })\n  }\n\n\n  return (\n        <div className={`ct-step__summary-bank-card ${isMain ? 'ct-step__summary-bank-card-main' : ''} ${!selector ? 'ct-step__summary-bank-card--fixed-width' : ''}` }>\n            <div>\n                <img src={`https://www.hypotheker.nl/assets/images/logos_hypotheekaanbieders/${bankData.logoUrl}`} alt=\"\"/>\n            </div>\n\n            <div className=\"ct-step__summary-bank-card-fields\">\n                {isMain ? (\n                    <>\n                        <div>\n                            <div>\n                              <FormattedMessage id={'allBanksModal.overviewModal.bankCard.mortgageType'} defaultMessage={'Hypotheekvorm'} />\n                            </div>\n\n                            <div>\n                                {bankData.hypotheekVorm === 'Annuïteitenhypotheek' || bankData.hypotheekVorm === 'Annuiteitenhypotheek'? 'Annuïteiten' : 'Lineair'}\n                            </div>\n                        </div>\n\n                        <div>\n                            <div>\n                              <FormattedMessage id={'allBanksModal.overviewModal.bankCard.interestPeriod'} defaultMessage={'Rentevaste periode'} />\n                            </div>\n\n                            <div>\n                                {bankData.rentevastePeriode} Jaar\n                            </div>\n                        </div>\n                    </>\n                ) : null}\n\n                <div>\n                    <div>\n                      <FormattedMessage id={'allBanksModal.overviewModal.bankCard.interestRate'} defaultMessage={'Rentepercentage'} />\n                    </div>\n\n                    <div>\n                        {bankData.rentestand?.toFixed(2)}%\n                    </div>\n                </div>\n                {grossMonthlyCost &&\n                <div>\n                    <div>\n                      <FormattedMessage id={'allBanksModal.overviewModal.bankCard.monthly'} defaultMessage={'Per maand'} />\n                    </div>\n\n                    <div className=\"ct-step__summary-bank-card-fields-monthly\">\n                        {numberToCurrency(grossMonthlyCost)}\n                    </div>\n                </div>\n                }\n            </div>\n            {selector &&\n            <div  className={'ct-step__summary-bank-card__selector'}>\n              {selected &&\n              <button  onClick={() => toggleBank(bankData, \"remove\")} className=\"ct__button ct__button__summary ct__button__summary--grey ct__button-icon\">\n                <img src={`${assetsBaseUrl}/assets/svg/remove.svg`} alt=\"\"/>\n              </button>\n              }\n              {!selected &&\n              <button  onClick={() => toggleBank(bankData, \"add\")} className=\"ct__button ct__button__summary ct__button__summary--grey ct__button-icon\">\n                <img src={`${assetsBaseUrl}/assets/svg/add.svg`} alt=\"\"/>\n              </button>\n              }\n            </div>\n            }\n        </div>\n    );\n}\n\nexport default BankCard;\n","import React, {useState, useRef, useEffect, useCallback} from \"react\";\nimport ReactDOM from \"react-dom\";\nimport Select from \"react-select\";\nimport { useMediaQuery } from \"@react-hook/media-query\";\n\nimport StepHeader from \"./stepParts/StepHeader\";\nimport {\n  CALCULATOR_TYPES,\n  getCalculatorType, hasShareParam,\n  rewriteSelectIds,\n  stepStates,\n} from \"../../services/helpers\";\nimport HypoTypeBlock from \"./stepParts/HypoTypeBlock\";\nimport StepSidebar from \"./stepParts/StepSidebar\";\nimport {\n  setField,\n  mortgageCalcAction,\n  getBankByIdAction,\n  affordCalcAction,\n} from \"../../store/actions/calculatorActions\";\nimport LoadingModal from \"../modals/LoadingModal\";\nimport { mainMediaMobile } from \"../../services/helpers\";\nimport { useSelector } from \"react-redux\";\nimport { gtm } from \"../../services/gtm\";\nimport BankCard from \"../summary/BankCard\";\nimport {getStep5HeaderSummary} from \"../../services/stepHelpers\";\nimport {getMortgageProvider} from \"../../services/calculationsApi\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\n\nconst rentevasteDropdownStyles = {\n    control: (provided) => ({\n        ...provided,\n        minHeight: \"50px\",\n    }),\n\n    indicatorSeparator: () => ({\n        display: \"none\",\n    }),\n};\n\nconst scrollToRef = (ref) => window.scrollTo(0, ref.current.offsetTop + 250);\n\nfunction Step5({ stepNumber, state, openStep, dispatch }) {\n    const intl = useIntl();\n    const [stepHeaderSummary, setStepHeaderSummary] = useState('');\n    const [hypoType, setHypoType] = useState(true);\n    const [handledHasShareParam, SetHandledHasShareParam] = useState(false);\n    const [isLoading, setIsLoading] = useState(false);\n    const {Woning, SelectedMortgageProvider, MortgageType, IsNieuwbouw, RentevastePeriode} = useSelector((state) => state.calculator);\n    const [rentevastePeriod, setRentevastePeriod] = useState();\n    const [sidebarVisibility, setSidebarVisibility] = useState(false);\n    const [sidebarType, setSidebarType] = useState();\n    const mediaMatches = useMediaQuery(mainMediaMobile);\n    const myRef = useRef(null);\n\n    const yearLabel = intl.formatMessage({id: 'step5.year', defaultMessage: 'jaar'})\n\n    const options = [\n      { value: 5, label: `5 ${yearLabel}` },\n      { value: 10, label: `10 ${yearLabel}`},\n      { value: 15, label: `15 ${yearLabel}` },\n      { value: 20, label: `20 ${yearLabel}` },\n      { value: 30, label: `30 ${yearLabel}` },\n    ];\n\n\n  const onBestDealCLick = useCallback(async ($event, triggeredByShare) => {\n        let setMortgageType = null;\n        let setMortgagePeriod = null;\n        setIsLoading(true);\n\n        if (triggeredByShare) {\n            if (SelectedMortgageProvider) {\n\n                const response = await getMortgageProvider(SelectedMortgageProvider, IsNieuwbouw);\n                setMortgageType = response.hypotheekVorm;\n                setMortgagePeriod = response.rentevastePeriode;\n\n            } else {\n                setRentevastePeriod(options.find((options) => options.value === RentevastePeriode))\n                setHypoType(MortgageType !== 'Lineaire_hypotheek')\n                setMortgageType = MortgageType;\n                setMortgagePeriod = RentevastePeriode;\n            }\n        } else {\n            setMortgageType = hypoType ? \"Annuïteitenhypotheek\" : \"Lineaire_hypotheek\";\n            setMortgagePeriod = rentevastePeriod?.value;\n\n            if (SelectedMortgageProvider) {\n                setMortgageType = SelectedMortgageProvider.hypotheekVorm;\n                setMortgagePeriod = SelectedMortgageProvider.rentevastePeriode;\n            }\n        }\n\n        setStepHeaderSummary(getStep5HeaderSummary(setMortgageType, intl));\n\n        dispatch(setField(\"MortgageType\", setMortgageType));\n        dispatch(setField(\"RentevastePeriode\", setMortgagePeriod));\n\n        if (mediaMatches) {\n            dispatch(setField(\"lastActiveStepIndex\", stepNumber));\n        }\n\n        await dispatch(getBankByIdAction());\n\n        if (Woning > 0) {\n            //await dispatch(mortgageCalcAction());\n            await dispatch(affordCalcAction(stepNumber, true ,true));\n        } else {\n            await dispatch(mortgageCalcAction(true));\n        }\n\n        await dispatch(setField(\"summaryWithBanksOpened\", true));\n        openStep(stepNumber, false, false, true);\n        const tagManagerArgs = {\n            gtmId: \"GTM-T78CX5\",\n            dataLayer: {\n                event: \"gtm.calculators\",\n                eventCategory: \"Calculator\",\n                eventAction: \"Hypotheekvorm\",\n                eventLabel: `${(MortgageType === \"Annuïteitenhypotheek\" || MortgageType === \"Annuiteitenhypotheek\") ? 'Annuïteiten' : 'Lineair'}-${setMortgagePeriod}jaar`,\n            },\n        };\n\n\n        gtm(tagManagerArgs);\n\n\n        setTimeout(() => {\n            setIsLoading(false);\n        }, 1000);\n    }, [RentevastePeriode, IsNieuwbouw, MortgageType, SelectedMortgageProvider, rentevastePeriod, setRentevastePeriod, Woning, dispatch, hypoType, mediaMatches, openStep, stepNumber, intl, options]);\n\n\n    useEffect(() => {\n      async function fetchData() {\n        await onBestDealCLick(null,true);\n      }\n      if (hasShareParam() && !handledHasShareParam) {\n        fetchData();\n        SetHandledHasShareParam(true);\n      }\n    }, [onBestDealCLick, handledHasShareParam]);\n\n\n    useEffect(() => {\n      if (!SelectedMortgageProvider && state === \"active\") {\n        scrollToRef(myRef);\n      }\n    }, [SelectedMortgageProvider, state]);\n\n\n  const toggleSidebar = (type) => {\n        setSidebarVisibility(!sidebarVisibility);\n        setSidebarType(type);\n        let tagManagerArgs;\n\n        if (type === \"mortgage-info\") {\n            const MortgageType = hypoType ? \"Annuïteiten\" : \"Lineair\";\n\n            tagManagerArgs = {\n                gtmId: \"GTM-T78CX5\",\n                dataLayer: {\n                    event: \"gtm.virtualPageview\",\n                    virtualURL: `zelf-berekenen/${getCalculatorType()}/hypotheekvorm-meer-info/${MortgageType}`,\n                    virtualTitle: \"Hypotheekvorm - \" + MortgageType,\n                },\n            };\n        } else {\n            tagManagerArgs = {\n                gtmId: \"GTM-T78CX5\",\n                dataLayer: {\n                    event: \"gtm.virtualPageview\",\n                    virtualURL: `zelf-berekenen/${getCalculatorType()}/hypotheekvorm-meer-info/rentevaste-periode`,\n                    virtualTitle: \"Hypotheekvorm - Rentevase periode\",\n                },\n            };\n        }\n\n        gtm(tagManagerArgs);\n        //TagManager.initialize(tagManagerArgs);\n    };\n\n    const handleYearChange = (rentevastePeriod) => {\n        setRentevastePeriod(rentevastePeriod);\n        rewriteSelectIds(\n            \"interest-year-select__menu-list\",\n            \"interest-year-select\"\n        );\n    };\n\n    const rewriteClasses = () =>  rewriteSelectIds(\"interest-year-select__menu-list\",\"interest-year-select\");\n\n    const handleHypoChange = (value) => {\n        setHypoType(value);\n        (mediaMatches) && scrollToRef(myRef);\n    };\n\n    return (\n        <div\n            className={`ct-step ${\n                state === stepStates.inactive && \"ct-step__inactive\"\n            }\n                                 ${\n                                     state === stepStates.filled &&\n                                     \"ct-step__filled\"\n                                 }\n                                 ${\n                                     state === stepStates.closed &&\n                                     \"ct-step__closed\"\n                                 }`}\n        >\n            <StepHeader\n                title={intl.formatMessage({id: 'step5.headerTitle', defaultMessage: 'Hypotheekvorm'})}\n                stepSummary={stepHeaderSummary}\n                stepNumber={stepNumber}\n                stepState={state}\n                openStep={openStep}\n            />\n\n            <div\n                className={`ct-step__body ${\n                    state === stepStates.active ? \"ct-step__body-opened\" : null\n                }`}\n            >\n                <div>\n                    <div className=\"ct-step__body-primary-question\">\n                      {!SelectedMortgageProvider ? (\n                        <FormattedMessage\n                        id=\"step5.selectMortgageType\"\n                        defaultMessage=\"Kies een hypotheekvorm*\"\n                        />\n                      ) : (\n                        <FormattedMessage\n                        id=\"step5.selectedInterestRate\"\n                        defaultMessage=\"Gekozen rente\"\n                        />\n                      )}\n\n                    </div>\n                    {SelectedMortgageProvider && (\n                        <div className=\"ct-step__body-tip\">\n                            <FormattedMessage id={'step5.selectedInterestRate.tip'} defaultMessage={'Om in aanmerking te komen voor hypotheekrenteaftrek, kun je een annuïteitenhypotheek of een lineaire hypotheek afsluiten.'} />\n                        </div>\n                    )}\n                    {!SelectedMortgageProvider && (\n                        <div\n                            className=\"ct-step__hypo-type-link\"\n                            onClick={() => toggleSidebar(\"mortgage-info\")}\n                            role=\"button\"\n                        >\n                          <FormattedMessage id={'step5.selectMortgageType.moreInformation'} defaultMessage={'Niet zeker welke hypotheekvorm bij je past? Lees meer over de annuïteitenhypotheek en de lineaire hypotheek.'} />\n\n                        </div>\n                    )}\n                </div>\n                {SelectedMortgageProvider && (\n                    <BankCard\n                        isMain={true}\n                        bankData={SelectedMortgageProvider}\n                    />\n                )}\n\n                {!SelectedMortgageProvider && (\n                    <div>\n                        <div className=\"ct-step__hypo-type-blocks\">\n                            <HypoTypeBlock\n                                title={intl.formatMessage({id: 'step5.mortgageType.annuïteiten.title', defaultMessage: 'Annuïteiten'})}\n                                text={intl.formatMessage({id: 'step5.mortgageType.annuïteiten.text', defaultMessage: 'Een annuïteitenhypotheek is een hypotheek waarbij het totale maandbedrag (bestaande uit rente en aflossing) gedurende de rentevaste periode gelijk blijft.'})}\n                                active={hypoType}\n                                handleHypoChange={handleHypoChange}\n                            />\n\n                            <HypoTypeBlock\n                                title={intl.formatMessage({id: 'step5.mortgageType.lineair.title', defaultMessage: 'Lineair'})}\n                                text={intl.formatMessage({id: 'step5.mortgageType.lineair.text', defaultMessage: 'Een lineaire hypotheek is een hypotheek waarbij je gedurende de looptijd elke maand hetzelfde bedrag aflost. De rente is in het begin het hoogst en loopt gedurende de looptijd af. Je start dus met een hoog maandbedrag.'})}\n                                active={!hypoType}\n                                handleHypoChange={handleHypoChange}\n                            />\n                        </div>\n\n                        <div className=\"ct-step__body-divider\" ref={myRef} />\n\n                        <div className=\"ct-step__body-secondary-questions-block\">\n                            <div className=\"ct-step__body-secondary-question\">\n                              <FormattedMessage id={'step5.determineInterestRatePeriod'} defaultMessage={'Bepaal je rentevaste periode*'} />\n                            </div>\n\n                            <div className=\"ct-step__body-tip\">\n                              <FormattedMessage id={'step5.determineInterestRatePeriod.tip'} defaultMessage={'De rentevaste periode is de afgesproken periode waarin de rente gelijk blijft. Het rentepercentage voor jouw hypotheek kun je voor verschillende rentevaste perioden vastzetten.'} />\n                            </div>\n\n                            <div\n                                className=\"ct-step__hypo-type-link\"\n                                onClick={() => toggleSidebar(\"period\")}\n                            >\n                              <FormattedMessage id={'step5.determineInterestRatePeriod.link'} defaultMessage={'Lees meer over rentevaste periode'} />\n                            </div>\n                        </div>\n\n                        <div className=\"ct-step__year-select\">\n                            <Select\n                                value={rentevastePeriod}\n                                isSearchable={false}\n                                onChange={handleYearChange}\n                                onMenuOpen={rewriteClasses}\n                                className={\"interest-year-select\"}\n                                classNamePrefix={\"interest-year-select\"}\n                                styles={rentevasteDropdownStyles}\n                                options={options}\n                                placeholder={intl.formatMessage({ id: 'step5.determineInterestRatePeriod.select', defaultMessage: 'Selecteren'})}\n                            />\n                        </div>\n                    </div>\n                )}\n                <div className=\"ct-step__best-deal\">\n                    <button\n                        onClick={onBestDealCLick}\n                        disabled={\n                            !SelectedMortgageProvider\n                                ? !rentevastePeriod\n                                : false\n                        }\n                        className={`ct__button ct-header__afspraak ${\n                            !SelectedMortgageProvider\n                                ? !rentevastePeriod\n                                : false && \"ct__button-disabled\"\n                        }`}\n                    >\n                      {getCalculatorType() !== CALCULATOR_TYPES.hoeveelKanIkLenen ?\n                      <FormattedMessage id={'step5.bestDeal'} defaultMessage={'Bekijk de beste deal'} /> :\n                      <FormattedMessage id={'step5.maxMortgage'} defaultMessage={'Bekijk maximale hypotheek'} />\n                      }\n                    </button>\n                </div>\n\n                {sidebarVisibility\n                    ? ReactDOM.createPortal(\n                          <StepSidebar\n                              toggleSidebar={toggleSidebar}\n                              sidebarType={sidebarType}\n                              intl={intl}\n                          />,\n                          document.getElementById(\"sidebar-portal\")\n                      )\n                    : null}\n\n                {isLoading\n                    ? ReactDOM.createPortal(\n                          <LoadingModal />,\n                          document.getElementById(\"loading-modal-portal\")\n                      )\n                    : null}\n            </div>\n        </div>\n    );\n}\n\nexport default Step5;\n","import React from 'react';\nimport {stepStates} from \"../../../services/helpers\";\n\nfunction StepsIndication({stepsState}) {\n\n    const bullets = stepsState.map((item, i) => {\n        return (\n            <div key={i} className={`${(item === stepStates.inactive || item === stepStates.closed) ? 'ct-step__indication-empty' : 'ct-step__indication-filled' }`}>{ i + 1}</div>\n        )\n    });\n\n    return (\n        <div className=\"ct-step__indication\">\n            {bullets}\n        </div>\n    );\n}\n\nexport default StepsIndication;\n","import React from 'react';\n\nconst ErrorModal = () => {\n    return (\n        <div className=\"ct-step__modal-wrapper\">\n            <div className=\"ct-step__loading-modal\">\n                <div className=\"ct-step__loading-modal-title\">\n                  Er is een onverwacht probleem opgetreden\n                </div>\n\n                <div className=\"ct-step__loading-modal-text ct-step__loading-modal-text__d-inline\">\n                   Klik <a href={window.location.href}>hier</a> om de berekening opnieuw te starten. Onze excuses voor het ongemak.\n                </div>\n\n            </div>\n        </div>\n    );\n};\n\nexport default ErrorModal;\n","import React, { useState } from \"react\";\n\nimport Step1 from \"./steps/Step1\";\nimport Step2 from \"./steps/Step2\";\nimport Step3 from \"./steps/Step3\";\nimport Step4 from \"./steps/Step4\";\nimport Step5 from \"./steps/Step5\";\nimport StepsIndication from \"./steps/stepParts/StepsIndication\";\n\nimport {\n    CALCULATOR_TYPES,\n    getCalculatorType\n} from \"../services/helpers\";\nimport ErrorModal from \"./modals/ErrorModal\";\nimport {useSelector} from \"react-redux\";\nimport {FormattedMessage} from \"react-intl\";\n\n\n\nfunction Steps({\n    openStep,\n    loading,\n    stepsState,\n    onStepSubmit,\n    dispatch,\n    error,\n    onStateClear\n}) {\n  //kan-ik-dit-huis-betalen\n  //wat-worden-mijn-maandlasten\n    const components = () => {\n      let steps = {\n        //Step1: Step5,\n        Step1: Step1,\n        Step2: Step2,\n        Step3: Step3,\n        Step4: Step4,\n        Step5: Step5,\n      };\n\n      const calculatorType = getCalculatorType();\n      if (calculatorType === CALCULATOR_TYPES.kanIkDitHuisBetalen) {\n        steps = {\n          Step1: Step3,\n          Step2: Step1,\n          Step3: Step4,\n          Step4: Step2,\n          Step5: Step5,\n        };\n      }\n      if (calculatorType === CALCULATOR_TYPES.watWordenMijnMaandLasten) {\n        steps = {\n          Step1: Step3,\n          Step2: Step1,\n          Step3: Step2,\n          Step4: Step5,\n        };\n      }\n\n      return steps;\n    };\n\n\n    const [resetForms, setResetForms] = useState(() => false);\n    const [showResetBtn, setShowResetBtn] = useState(() => false);\n    const { summaryWithBanksOpened } = useSelector((state) => state.calculator);\n    const steps = stepsState.map((item, i) => {\n        const Component = components()[`Step${i + 1}`];\n        return (\n            <Component\n                key={i}\n                stepNumber={i}\n                loading={loading}\n                state={stepsState[i]}\n                openStep={openStep}\n                stepsState={stepsState}\n                onStepSubmit={onStepSubmit}\n                dispatch={dispatch}\n                shouldReset={resetForms}\n                setResetForms={setResetForms}\n                setShowResetBtn={setShowResetBtn}\n            />\n        );\n    });\n\n    return (\n        <div className={`ct-step__steps ${summaryWithBanksOpened ? \"ct-step__steps__summary-opened\" : undefined}`}>\n            <StepsIndication stepsState={stepsState} />\n\n            <div>\n                {showResetBtn ? <button\n                    className=\"ct-step__reset-button\"\n                    type=\"button\"\n                    onClick={() => {\n                        setResetForms(true);\n                        onStateClear();\n                    }}\n                >\n\n                  <FormattedMessage id={\"steps.resetAnswers\"} defaultMessage={`Antwoorden wissen`} />\n                </button> : null}\n\n                {steps}\n            </div>\n\n            {error && <ErrorModal />}\n            <div id=\"sidebar-portal\" />\n            <div id=\"loading-modal-portal\" />\n            <div id=\"overview-modal-portal\" />\n            <div id=\"income-calculator-modal-portal\" />\n        </div>\n    );\n}\n\nexport default Steps;\n","import React from 'react';\nimport {useSelector} from \"react-redux\";\nimport {assetsBaseUrl} from \"../../services/calculationsApi\";\nimport ReactTooltip from \"react-tooltip\";\nimport {useMediaQuery} from \"@react-hook/media-query\";\nimport {CALCULATOR_TYPES, getCalculatorType, mainMediaMobile, numberToCurrency} from \"../../services/helpers\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\n\nconst OverviewModal = ({toggleOverview, componentRef}) => {\n    const intl = useIntl();\n    const mediaMatches = useMediaQuery(mainMediaMobile);\n    const {\n        RentevastePeriode,\n        ApplicantYearlyIncome,\n        PartnerYearlyIncome,\n        IsNieuwbouw,\n        OwnResources,\n        bankData,\n        Woning,\n        Interest,\n        HasLoans,\n        PrivateLeaseAmount,\n        Loans,\n        Alimony,\n        StudentDebtMonthlyPayment,\n        response: {\n            maxMortgageAmount,\n            grossMonthlyCost,\n            grossMonthlyCostHouse,\n            netMonthlyCost,\n            netMonthlyCostHouse,\n            riskClass,\n            isNhg\n        }\n    } = useSelector(state => state.calculator);\n\n    const mortgageTypeLabel = (getCalculatorType() !== CALCULATOR_TYPES.watWordenMijnMaandLasten) ?\n    intl.formatMessage({id: 'overviewModal.house.askingPrice', defaultMessage: 'Vraagprijs woning'}) :\n    intl.formatMessage({id: 'overviewModal.house.desiredMortgage', defaultMessage: 'Gewenste hypotheek'});\n    return (\n        <div className=\"ct-step__modal-wrapper\">\n            <div className={`ct-step__overview-modal-wrapper ${mediaMatches && 'ct-step__overview-modal-wrapper--mobile' }`}>\n\n                <div className=\"close-overview\" onClick={toggleOverview}>\n                    <img src={`${assetsBaseUrl}/assets/svg/close.svg`} alt=\"\"/>\n                </div>\n\n                <div className=\"ct-step__overview-modal\" ref={componentRef}>\n                    <div ref={componentRef}>\n                        <div className=\"ct-step__overview-modal-title\">\n                          <FormattedMessage id={'overviewModal.house'} defaultMessage={'Jouw berekening'}/>\n                        </div>\n\n                        {Woning > 0 &&\n                        <div>\n                            <div className=\"ct-step__overview-modal-subtitle\">\n                              <FormattedMessage id={'overviewModal.house.subtitle'} defaultMessage={'Woning'}/>\n                            </div>\n\n                            <div\n                            className=\"ct-step__overview-modal-field ct-step__overview-modal-field-gray\">\n                              <div>\n                                { mortgageTypeLabel }\n                              </div>\n\n                              <div>\n                                {numberToCurrency(Woning ? Woning : 0)}\n                              </div>\n                            </div>\n\n                            <div className=\"ct-step__overview-modal-field ct-step__overview-modal-field-gray\">\n                              <div>\n                                <FormattedMessage id={'overviewModal.house.grossMonthlyCost'} defaultMessage={'Bruto maandlasten'}/>\n                              </div>\n\n                              <div>\n                                {numberToCurrency(Woning > 0 ? grossMonthlyCostHouse : 0)}\n                              </div>\n                            </div>\n\n\n                            <div className=\"ct-step__overview-modal-field ct-step__overview-modal-field-gray\">\n                              <div>\n                                <FormattedMessage id={'overviewModal.house.netMonthlyCost'} defaultMessage={'Netto maandlasten'}/>\n                              </div>\n\n                              <div>\n                                {numberToCurrency(Woning > 0 ? netMonthlyCostHouse : 0)}\n                              </div>\n                            </div>\n                        </div>\n                        }\n                        <div className=\"ct-step__overview-modal-subtitle\">\n                          <FormattedMessage id={'overviewModal.maxMortgage'} defaultMessage={'Maximale hypotheek'}/>\n                        </div>\n\n\n                        <div className=\"ct-step__overview-modal-field ct-step__overview-modal-field-gray\">\n                            <div>\n                              <FormattedMessage id={'overviewModal.maxMortgage.applicantYearlyIncome'} defaultMessage={'Bruto jaarinkomen'}/>\n                            </div>\n\n                            <div>\n                                {numberToCurrency(ApplicantYearlyIncome ? ApplicantYearlyIncome : 0)}\n                            </div>\n                        </div>\n\n                        {PartnerYearlyIncome > 0 &&\n                        <div className=\"ct-step__overview-modal-field ct-step__overview-modal-field-gray\">\n                            <div>\n                              <FormattedMessage id={'overviewModal.maxMortgage.partnerYearlyIncome'} defaultMessage={'Bruto partner jaarinkomen'}/>\n                            </div>\n\n                            <div>\n                                {numberToCurrency(PartnerYearlyIncome ? PartnerYearlyIncome : 0)}\n                            </div>\n                        </div>\n                        }\n                        {HasLoans &&\n                        <div className=\"ct-step__overview-modal-field ct-step__overview-modal-field-gray\">\n                            <div>\n                              <FormattedMessage id={'overviewModal.maxMortgage.loans'} defaultMessage={'Kredieten en leningen'}/>\n                            </div>\n                            {HasLoans &&\n                                <div>\n                                    {numberToCurrency((+Loans +StudentDebtMonthlyPayment +Alimony +PrivateLeaseAmount))}\n                                </div>\n                            }\n                            {!HasLoans &&\n                                <div>\n                                  <FormattedMessage id={'overviewModal.maxMortgage.loans.no'} defaultMessage={'Nee'}/>\n                                </div>\n                            }\n                        </div>\n                        }\n\n                        <div\n                            className=\"ct-step__overview-modal-subtitle ct-step__overview-modal-subtitle-with-background ct-step__overview-modal-field \">\n                            <div>\n                              <FormattedMessage id={'overviewModal.maxMortgage.maxMortgage'} defaultMessage={'Maximale hypotheek'}/>\n                            </div>\n\n                            <div>\n                                {numberToCurrency(maxMortgageAmount ? maxMortgageAmount : 0)}\n                            </div>\n                        </div>\n\n                        <div className=\"ct-step__overview-modal-field\">\n                            <div>\n                              <FormattedMessage id={'overviewModal.maxMortgage.grossMonthlyCost'} defaultMessage={'Bruto maandlasten'}/>\n                            </div>\n\n                            <div>\n                                {numberToCurrency(grossMonthlyCost > 0 ? grossMonthlyCost : 0)}\n                            </div>\n                        </div>\n\n\n                        <div className=\"ct-step__overview-modal-field\">\n                            <div>\n                              <FormattedMessage id={'overviewModal.maxMortgage.netMonthlyCost'} defaultMessage={'Netto maandlasten'}/>\n                            </div>\n\n                            <div>\n                                {numberToCurrency(netMonthlyCost > 0 ? netMonthlyCost : 0)}\n                            </div>\n                        </div>\n                        <div className=\"ct-step__overview-modal-text\">\n                            {parseInt(IsNieuwbouw) !== 2 &&\n                                <span>\n                                  <FormattedMessage id={'overviewModal.maxMortgage.extraCosts'} defaultMessage={'Bij het kopen van een woning komen extra kosten kijken die de koper zelf dient te financieren, ook wel kosten koper genoemd. Dit zijn in ieder geval de overdrachtsbelasting, notariskosten, taxatiekosten. Daarnaast kan er sprake zijn van o.a. advies- en bemiddelingskosten en eventueel kosten voor NHG.'}/>\n                                </span>\n                            }\n                            {parseInt(IsNieuwbouw) === 2 &&\n                                <span>\n                                  <FormattedMessage id={'overviewModal.maxMortgage.extraCostsNew'} defaultMessage={'Bij het kopen van een nieuwbouwwoning komen extra kosten kijken die de koper zelf dient te financieren, ook wel kosten koper genoemd. Dit zijn in ieder geval de notariskosten voor de hypotheekakte, advies- en bemiddelingskosten en eventueel kosten voor NHG.'}/>\n                                </span>\n                            }\n                        </div>\n\n                        { parseInt(OwnResources) > 0 &&\n                        <div className=\"ct-step__overview-modal-own-money\">\n                          <div className=\"ct-step__overview-modal-subtitle\">\n                            <FormattedMessage id={'overviewModal.ownMoney'} defaultMessage={'Eigen inleg'}/>\n                          </div>\n\n                          <div className=\"ct-step__overview-modal-field ct-step__overview-modal-field-gray\">\n                              <div>\n                                  <span>\n                                    <FormattedMessage id={'overviewModal.ownMoney.ownMoney'} defaultMessage={'Inleg eigen geld'}/>\n                                  </span>\n                                  <img className=\"ct-step__tool-tip\"\n                                        data-tip={intl.formatMessage({id: 'overviewModal.ownMoney.ownMoney.toolTip', defaultMessage: `Dit is het bedrag dat je hebt aangegeven in te willen brengen bij de aankoop van je nieuwe woning`})} src={`${assetsBaseUrl}/assets/svg/info.svg`} alt=\"\"/>\n                                  <ReactTooltip\n                                  place={\"right\"}\n                                  effect={\"solid\"}\n                                  />\n                              </div>\n\n                              <div>\n                                  {numberToCurrency(OwnResources ? OwnResources : 0)}\n                              </div>\n                          </div>\n                        </div>\n                        }\n\n                        <div className=\"ct-step__overview-modal-deze-wrapper\">\n\n                            <div className=\"ct-step__overview-modal-deze\">\n                              <FormattedMessage id={'overviewModal.basedOn'} defaultMessage={'Deze berekening is gebaseerd op:'}/>\n                            </div>\n\n                            <div className=\"ct-step__overview-modal-field\">\n                                <div>\n                                  <FormattedMessage id={'overviewModal.basedOn.mortgageType'} defaultMessage={'Hypotheekvorm'}/>\n                                </div>\n\n                                <div>\n                                    {bankData.mainBank.hypotheekVorm === 'Annuïteitenhypotheek' ? 'Annuïteiten' : 'Lineair'}\n                                </div>\n                            </div>\n\n                            <div className=\"ct-step__overview-modal-field\">\n                                <div>\n                                  <FormattedMessage id={'overviewModal.basedOn.duration'} defaultMessage={'Looptijd'}/>\n                                </div>\n\n                                <div>\n                                  <FormattedMessage id={'overviewModal.basedOn.duration.years'} defaultMessage={'30 jaar'}/>\n                                </div>\n                            </div>\n\n                            <div className=\"ct-step__overview-modal-field\">\n                                <div>\n                                  <FormattedMessage id={'overviewModal.basedOn.interest'} defaultMessage={'Rente'}/>\n                                </div>\n\n                                <div>\n                                    {Interest ? Interest : 0} %\n                                </div>\n                            </div>\n\n                            <div className=\"ct-step__overview-modal-field\">\n                                <div>\n                                  <FormattedMessage id={'overviewModal.basedOn.interestPeriod'} defaultMessage={'Rentevaste periode'}/>\n                                </div>\n\n                                <div>\n                                  <FormattedMessage id={'overviewModal.basedOn.interestYears'} defaultMessage={'{rentevastePeriode} jaar{plural} rentevast'} values={\n                                      {rentevastePeriode: RentevastePeriode, plural: RentevastePeriode > 1 && intl.locale === 'en' ? 's' : ''}\n                                  }/>\n                                </div>\n                            </div>\n                            { riskClass > 0 &&\n                                <div className=\"ct-step__overview-modal-field\">\n                                    <div>\n                                      <FormattedMessage id={'overviewModal.basedOn.riskClass'} defaultMessage={'Risicoklasse'}/>\n                                    </div>\n\n                                    <div>\n                                        {riskClass} %\n                                    </div>\n                                </div>\n                            }\n                            <div className=\"ct-step__overview-modal-field\">\n                                <div>\n                                  <FormattedMessage id={'overviewModal.basedOn.nhg'} defaultMessage={'Nationale Hypotheek Garantie (NHG)'}/>\n                                </div>\n\n                                <div>\n                                  <FormattedMessage id={'overviewModal.basedOn.nhg.yes'} defaultMessage={'{answer}'} values={\n                                      {answer: isNhg ? 'Ja' : 'Nee'}\n                                  }/>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n\n    );\n};\n\nexport default OverviewModal;\n","import {CALCULATOR_TYPES, defaultStepsState, getCalculatorType, hasShareParam, remapObject} from \"./helpers\";\nimport {currencyToNumber} from \"./helpers\";\nimport {parseSearchQuery} from \"../store/actions/calculatorActions\";\n\n// update every time the state structure changes\nconst stateVersion = '16052024';\n\nconst mappingValuesState = [\n  'MortgageType',\n  'RentevastePeriode',\n  'Interest',\n  'MortgageParts', //[]\n  'response',\n  'SelectedMortgageProvider', // alleen product id opslaan\n  'ApplicantAge',\n  'ApplicantYearlyIncome',\n  'ApplicantAnnualPensionIncome',\n  'ApplicantAOW',\n  'HasPartner',\n  'PartnerAge',\n  'PartnerYearlyIncome',\n  'PartnerAnnualPensionIncome',\n  'PartnerAOW',\n  'HasLoans',\n  'Loans',\n  'RiskClass',\n  'Alimony',\n  'StudentDebtAmount',\n  'Woning',\n  'IsNieuwbouw',\n  'HasHouse',\n  'HomeEquity',\n  'HomeEquityCosts',\n  'HomeMortgageAmount',\n  'HomeMortgageStart',\n  'HomeMortgageStartNotKnown',\n  'HomeMortgageStartBefore2013',\n  'HomeMortgageIsBeingPaidOff',\n  'HomeMortgageOtherPartAmount',\n  'OwnResources',\n  'PrivateLeaseAmount',\n  'WantsToSkipMortgageQuestions',\n  'SustainabilityUplift',\n  'EnergyLabel',\n];\n\nconst stepFields = [\n  // step 1\n  \"ApplicantAge\",\n  \"ApplicantYearlyIncome\",\n  \"ApplicantAnnualPensionIncome\",\n  \"ApplicantAOW\",\n  \"HasPartner\",\n  \"PartnerAge\",\n  \"PartnerYearlyIncome\",\n  \"PartnerAnnualPensionIncome\",\n  \"PartnerAOW\",\n  // step 2\n  \"HasLoans\",\n  \"Loans\",\n  \"Alimony\",\n  \"StudentDebtAmount\",\n  \"PrivateLeaseAmount\",\n  // step 3\n  \"Woning\",\n  \"IsNieuwbouw\",\n  // step 4\n  \"HomeEquity\",\n  \"OwnResources\",\n\n];\n\n\nexport const getInitialState = () => {\n\n  let defaultState = {};\n  defaultState = {\n    MortgageType: \"Annuïteitenhypotheek\",\n    RentevastePeriode: 10,\n    Interest: 0,\n    MortgageParts: [],\n    IsNieuwbouw: 0,\n    response: {\n      maxMortgageAmount: 0,\n      interest: 0,\n      grossMonthlyCostHouse: 0,\n      netMonthlyCostHouse: 0,\n      extraMoneyNeeded: 0\n    },\n    sharePdf: {\n      state: 'not_mailed',\n      success: null,\n      message: false\n    },\n    stepState: defaultStepsState,\n    SelectedMortgageProvider: false,\n    stepNumber: 0\n  };\n\n  stepFields.forEach((item) => {\n    defaultState[item] = 0;\n  });\n\n  const shareParam = hasShareParam()\n\n  if (shareParam) {\n    defaultState = {...defaultState, ...getStateFromBase64(shareParam, mappingValuesState)};\n  } else {\n\n    // check for stateVersion\n    if (window.localStorage.getItem('state.version') !== stateVersion) {\n      window.localStorage.removeItem(`state.${CALCULATOR_TYPES.hoeveelKanIkLenen}`)\n      window.localStorage.removeItem(`state.${CALCULATOR_TYPES.watWordenMijnMaandLasten}`)\n      window.localStorage.removeItem(`state.${CALCULATOR_TYPES.kanIkDitHuisBetalen}`)\n      window.localStorage.setItem(`state.version`, stateVersion);\n    }\n    // and check for session state\n    const storedState = window.localStorage.getItem(`state.${getCalculatorType()}`)\n    if (storedState) {\n      defaultState = {\n        ...defaultState,\n        ...getStateFromBase64(storedState, mappingValuesState)\n      }\n    };\n\n    // check if there are any request params, if so we need to add them to the default state\n    const requestParams = parseSearchQuery(window.location.search, true);\n    const paramsState = remapObject(requestParams, {\n      Klant_Jaarinkomen: \"ApplicantYearlyIncome\",\n      Klant_Leeftijd: \"ApplicantAge\",\n      Partner_Jaarinkomen: \"PartnerYearlyIncome\",\n      Partner_Leeftijd: \"PartnerAge\",\n      HeeftPartner: \"HasPartner\",\n      Onderpand_Koopsom: \"Woning\",\n      Onderpand_IsNieuwbouw: \"IsNieuwbouw\",\n      Heeft_Woning: \"HasHouse\",\n      Overslaan_Hypotheek: \"WantsToSkipMortgageQuestions\",\n      Huis_Prijs: \"HomeEquity\",\n      Verkoop_Kosten: \"HomeEquityCosts\",\n      Hoogte_Hypotheek: \"HomeMortgageAmount\",\n      Student_Debt_Amount: \"StudentDebtAmount\"\n    })\n\n    if (requestParams?.Onderpand_IsNieuwbouw || requestParams?.isnewbuilding) {\n      paramsState.IsNieuwbouw = paramsState.IsNieuwbouw === 'true' || requestParams?.isnewbuilding === \"true\" ? 2 : 1;\n    }\n\n    if (requestParams?.energylabel) {\n      paramsState.EnergyLabel = {value: requestParams.energylabel, label: requestParams.energylabel}\n    }\n\n    if (Object.keys(paramsState).length) {\n      defaultState = {\n        ...defaultState,\n        ...paramsState\n      }\n    }\n\n  }\n\n  return defaultState;\n\n}\n\nexport function saveStateToSession(state, calculatorType) {\n  window.localStorage.setItem(\n      `state.${calculatorType}`,\n      getBase64FromState(state, mappingValuesState)\n  );\n}\n\n// create share link, to send to bitly\nexport function getStateAsShareableLink(state) {\n\n  const { origin, pathname, hostname} = window.location;\n  let domain = `${origin}${pathname}?share=${getBase64FromState(state, mappingValuesState)}`;\n  if (hostname.indexOf('localhost') !== -1) {\n    domain += `&type=${getCalculatorType()}`\n  } else {\n    //console.log(domain);\n  }\n  return domain;\n}\n\n//  internal functions\nconst encodeMortgageParts = (mortgageParts) => {\n  const mortgagePartsToString = [];\n  if (mortgageParts.length) {\n    mortgageParts.forEach((mortgagePart) => {\n      mortgagePart.mortgageType = Object.values(mortgagePart.mortgageType).join('#');\n      mortgagePart.currentMortgageAmount = currencyToNumber(mortgagePart.currentMortgageAmount)\n      mortgagePart.fixedInterestAmount = currencyToNumber(mortgagePart.fixedInterestAmount);\n      mortgagePartsToString.push(Object.values(mortgagePart).join('|'));\n    });\n  }\n\n  return mortgagePartsToString;\n}\n\nconst decodeMortgageParts = (mortgageParts) => {\n  const mappingValuesMortgageParts = [\n    'mortgageDate',\n    'currentMortgageInterest',\n    'fixedInterestYears',\n    'fixedInterestAmount',\n    'currentMortgageAmount',\n    'mortgageType',\n    'takeMortgage'\n  ];\n\n  const reconstructedMortgageParts = [];\n  if (mortgageParts.length) {\n    mortgageParts.forEach((mortgagePart) => {\n      const mortgagePartArray = mortgagePart.split('|');\n      let mortgagePartObject = {};\n      mortgagePartArray.forEach((value, index) => {\n        switch (mappingValuesMortgageParts[index]) {\n          case \"mortgageType\":\n            mortgagePartObject = {...mortgagePartObject, ...{[mappingValuesMortgageParts[index]] : {'value': mortgagePartArray[index].split('#')[0], 'label' : mortgagePartArray[index].split('#')[1]}}}\n            break;\n          default:\n            mortgagePartObject = {...mortgagePartObject, ...{[mappingValuesMortgageParts[index]] : mortgagePartArray[index] }}\n            break;\n        }\n      })\n      reconstructedMortgageParts.push(mortgagePartObject);\n    });\n  }\n  return reconstructedMortgageParts;\n}\n\nconst getBase64FromState = (state, mappingValues) => {\n\n  let valuesArray = [];\n\n  // foreach stateMapping array and pick values from state\n  mappingValues.forEach((value, index) => {\n\n    switch (value) {\n      case \"MortgageType\":\n        valuesArray.push((state.MortgageType === \"Annuïteitenhypotheek\" || state.MortgageType === \"Annuiteitenhypotheek\") ? 4 : 9)\n        break;\n      case \"MortgageParts\":\n        valuesArray.push(encodeMortgageParts(state.MortgageParts))\n        break;\n      case \"response\":\n        valuesArray.push({riskClass: state.response?.riskClass, isNhg: state.response?.isNhg, maxMortgageAmount: state.response?.maxMortgageAmount});\n        break;\n      case \"SelectedMortgageProvider\":\n        valuesArray.push((state.SelectedMortgageProvider) ? state.SelectedMortgageProvider.lookupId : false)\n        break;\n      default:\n        valuesArray.push(state[value])\n        break\n    }\n  })\n\n  //console.log(valuesArray);\n  return btoa(JSON.stringify(valuesArray));\n}\n\nconst getStateFromBase64 = (base64State, mappingValues) => {\n  const decodedStateValues = JSON.parse(atob(base64State));\n  let reconstructedState = {};\n  mappingValues.forEach((value, index) => {\n    switch (value) {\n      case \"MortgageType\":\n        reconstructedState = {...reconstructedState, ...{[value]: (decodedStateValues[index] === 4) ? 'Annuïteitenhypotheek' : 'Lineaire_hypotheek' }};\n        break;\n      case \"MortgageParts\":\n        reconstructedState = {...reconstructedState, ...{[value]: decodeMortgageParts(decodedStateValues[index]) }};\n        break;\n      default:\n        reconstructedState = {...reconstructedState, ...{[value]: decodedStateValues[index]}};\n        break;\n    }\n  });\n\n  return reconstructedState;\n\n}\n","import React from 'react';\nimport Input from \"../core/Input\";\nimport {useForm} from \"react-hook-form\";\n\n\nimport {assetsBaseUrl, getShortUrl} from \"../../services/calculationsApi\";\nimport {mainMediaMobile, removeDotsComas, setBodyDataForPdf} from \"../../services/helpers\";\nimport {sharePdfAction} from \"../../store/actions/calculatorActions\";\nimport {useDispatch, useSelector} from \"react-redux\";\nimport {useMediaQuery} from \"@react-hook/media-query\";\nimport {getStateAsShareableLink} from \"../../services/stateHelper\";\nimport {SHARE_PDF} from \"../../store/actionTypes/calculatorActionTypes\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\n\n\nconst SharePdfModal = ({ toggleOverview, toolData, componentRef }) => {\n  const intl = useIntl();\n  const { sharePdf } = useSelector((state) => state.calculator);\n  const mediaMatches = useMediaQuery(mainMediaMobile);\n  const {register, handleSubmit, formState, errors} = useForm({\n    mode: 'onChange',\n    defaultValues: {\n      SenderName: '',\n      RecipientName: '',\n      RecipientEmail: '',\n    }\n  });\n  const dispatch = useDispatch();\n  const onSubmit = async (data) => {\n    dispatch({\n      type: SHARE_PDF,\n      response: {\n        state: 'mailing',\n        success: true,\n        message: intl.formatMessage({id: 'sharePdfModal.mailingDispatch', defaultMessage: 'Email is bezig met versturen'})\n      }\n    })\n    const shortUrl = await getShortUrl(getStateAsShareableLink(removeDotsComas(toolData)), '&utm_source=berekening&utm_medium=email');\n    const bodyData = {\n      ...setBodyDataForPdf(toolData), ...{\n        \"senderName\": data.SenderName,\n        \"bitlyLink\" : shortUrl.link,\n        \"recipientName\": data.RecipientName,\n        \"recipientEmail\": data.RecipientEmail}\n    }\n    await dispatch(sharePdfAction(bodyData, intl.locale));\n  };\n\n  return (\n  <div className=\"ct-step__modal-wrapper c-share-email\">\n    <div className={`ct-step__overview-modal-wrapper ct-step__overview-modal-wrapper--no-scroll ct-step__overview-modal-wrapper--auto\n    ${mediaMatches && 'ct-step__overview-modal-wrapper--mobile' }`}>\n\n      <div className=\"close-overview\" onClick={toggleOverview}>\n        <img src={`${assetsBaseUrl}/assets/svg/close.svg`} alt=\"\"/>\n      </div>\n\n      <div className=\"ct-step__overview-modal\" ref={componentRef}>\n        <div ref={componentRef}>\n          <div className=\"ct-step__overview-modal-title\">\n            <FormattedMessage id={'sharePdfModal.title'} defaultMessage={'Deel je berekening!'} />\n          </div>\n          {sharePdf.state === 'not_mailed' &&\n          <form onSubmit={handleSubmit(onSubmit)}>\n            <div>\n              <div className=\"ct-step__body-subquestion\">\n                <FormattedMessage id={'sharePdfModal.senderName'} defaultMessage={'Naam verzender'} />\n              </div>\n              <Input\n              className=\"ct-input\"\n              name=\"SenderName\"\n              register={register}\n              error={errors.SenderName}\n              validationRules={{required: true}}\n              errorTitle={intl.formatMessage({id: 'sharePdfModal.senderName.errorTitle', defaultMessage: `naam verzender`})}\n              />\n            </div>\n            <div>\n              <div className=\"ct-step__body-subquestion\">\n                <FormattedMessage id={'sharePdfModal.recipientName'} defaultMessage={'Naam ontvanger'} />\n              </div>\n              <Input\n              className=\"ct-input\"\n              name=\"RecipientName\"\n              register={register}\n              error={errors.RecipientName}\n              validationRules={{required: true}}\n              errorTitle={intl.formatMessage({id: 'sharePdfModal.recipientName.errorTitle', defaultMessage: `naam ontvanger`})}\n              />\n            </div>\n            <div>\n              <div className=\"ct-step__body-subquestion\">\n                <FormattedMessage id={'sharePdfModal.recipientEmail'} defaultMessage={'E-mailadres ontvanger'} />\n              </div>\n              <Input\n              className=\"ct-input\"\n              name=\"RecipientEmail\"\n              register={register}\n              error={errors.RecipientEmail}\n              validationRules={{required: true, pattern: /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/ }}\n              errorTitle={intl.formatMessage({id: 'sharePdfModal.recipientEmail.errorTitle', defaultMessage: `e-mailadres`})}\n              />\n            </div>\n            <button\n            className={`ct__button`}\n            disabled={!formState.isValid}\n            type=\"submit\">\n              <FormattedMessage id={'sharePdfModal.submit'} defaultMessage={'Verstuur'} />\n            </button>\n          </form>\n          }\n\n          {sharePdf.state === 'mailing' &&\n          <div className=\"ct-step__overview-modal-subtitle\">\n            <FormattedMessage id={'sharePdfModal.mailing'} defaultMessage={'Bezig met het versturen van de email.'} /><br/>\n            <img src={`${assetsBaseUrl}/assets/svg/loader-dots.svg`} alt=\"\" />\n          </div>\n          }\n\n          {sharePdf.state === 'mailed' &&\n            <div className=\"ct-step__overview-modal-subtitle\">\n              <FormattedMessage id={'sharePdfModal.mailed'} defaultMessage={'Je e-mail is verstuurd.'} />\n            </div>\n          }\n        </div>\n      </div>\n    </div>\n  </div>\n\n  );\n};\n\nexport default SharePdfModal;\n","import {CALCULATOR_TYPES, getCalculatorType, numberToCurrency} from \"./helpers\";\n\nexport const getWhatsAppShareText = (state, shareUrl, intl) => {\n\n  //console.log('getWhatsAppShareText', state, shareUrl, intl)\n  let shareText = '';\n  if (getCalculatorType() === CALCULATOR_TYPES.hoeveelKanIkLenen) {\n    //console.log(state);\n    if (!state.HasPartner && state.Woning === 0) {\n      //Scenario 1: Hoeveel kan ik lenen – no partner – no new house\n      //shareText = shareText + `Ik heb mijn maximale hypotheek berekend op hypotheker.nl. Ik mag maximaal ${numberToCurrency(state.response.maxMortgageAmount, true)} lenen. Dat kost bruto per maand ${numberToCurrency(state.response.grossMonthlyCost, true)}.`;\n      shareText += intl.formatMessage({\n        id: 'shareHelper.howMuchCanIBorrowNoPartnerNoNewHouse',\n        defaultMessage: 'Ik heb mijn maximale hypotheek berekend op hypotheker.nl. Ik mag maximaal {maxMortgageAmount} lenen. Dat kost bruto per maand {grossMonthlyCost}.'\n      },\n      {\n        maxMortgageAmount: numberToCurrency(state.response.maxMortgageAmount, true),\n        grossMonthlyCost: numberToCurrency(state.response.grossMonthlyCost, true)\n      });\n    }\n\n    if (!state.HasPartner && state.Woning > 0) {\n      //Scenario 2: Hoeveel kan ik lenen – no partner - new house\n      //shareText = shareText + `Ik heb mijn maximale hypotheek berekend op hypotheker.nl. Ik mag maximaal ${numberToCurrency(state.response.maxMortgageAmount, true)} lenen. Dat kost bruto per maand ${numberToCurrency(state.response.grossMonthlyCost, true)}. Voor de woning die ik op het oog heb, moet ik nog ${numberToCurrency(state.response.extraMoneyNeeded, true)} bijleggen. De maandlasten worden voor deze woning ${numberToCurrency(state.response.netMonthlyCostHouse, true)}.`\n      shareText += intl.formatMessage({\n        id: 'shareHelper.howMuchCanIBorrowNoPartnerNewHouse',\n        defaultMessage: 'Ik heb mijn maximale hypotheek berekend op hypotheker.nl. Ik mag maximaal {maxMortgageAmount} lenen. Dat kost bruto per maand {grossMonthlyCost}. Voor de woning die ik op het oog heb, moet ik nog {extraMoneyNeeded} bijleggen. De maandlasten worden voor deze woning {netMonthlyCostHouse}.'\n      },\n      {\n        maxMortgageAmount: numberToCurrency(state.response.maxMortgageAmount, true),\n        grossMonthlyCost: numberToCurrency(state.response.grossMonthlyCost, true),\n        extraMoneyNeeded: numberToCurrency(state.response.extraMoneyNeeded, true),\n        netMonthlyCostHouse: numberToCurrency(state.response.netMonthlyCostHouse, true)\n      });\n    }\n\n    if (state.HasPartner && state.Woning === 0) {\n      // Scenario 3: Hoeveel kan ik lenen – with partner – no new house\n      //shareText = shareText + `Ik heb onze maximale hypotheek berekend op hypotheker.nl. We mogen maximaal ${numberToCurrency(state.response.maxMortgageAmount, true)} lenen. Dat kost bruto per maand  ${numberToCurrency(state.response.grossMonthlyCost, true)}.`\n      shareText += intl.formatMessage({\n        id: 'shareHelper.howMuchCanIBorrowWithPartnerNoNewHouse',\n        defaultMessage: 'Ik heb onze maximale hypotheek berekend op hypotheker.nl. We mogen maximaal {maxMortgageAmount} lenen. Dat kost bruto per maand {grossMonthlyCost}.'\n      },\n      {\n        maxMortgageAmount: numberToCurrency(state.response.maxMortgageAmount, true),\n        grossMonthlyCost: numberToCurrency(state.response.grossMonthlyCost, true)\n      }\n      );\n    }\n\n    if (state.HasPartner && state.Woning > 0) {\n      // Scenario 4: Hoeveel kan ik lenen – with partner – new house\n      //shareText = shareText + `Ik heb onze maximale hypotheek berekend op hypotheker.nl. We mogen maximaal ${numberToCurrency(state.response.maxMortgageAmount, true)} lenen. Dat kost bruto per maand  ${numberToCurrency(state.response.grossMonthlyCost, true)}. Voor de woning die we op het oog hebben, moeten we nog ${numberToCurrency(state.response.extraMoneyNeeded, true)} bijleggen. De maandlasten voor deze woning worden ${numberToCurrency(state.response.netMonthlyCostHouse, true)}.`\n      shareText += intl.formatMessage({\n        id: 'shareHelper.howMuchCanIBorrowWithPartnerNewHouse',\n        defaultMessage: 'Ik heb onze maximale hypotheek berekend op hypotheker.nl. We mogen maximaal {maxMortgageAmount} lenen. Dat kost bruto per maand {grossMonthlyCost}. Voor de woning die we op het oog hebben, moeten we nog {extraMoneyNeeded} bijleggen. De maandlasten voor deze woning worden {netMonthlyCostHouse}.'\n      },\n      {\n        maxMortgageAmount: numberToCurrency(state.response.maxMortgageAmount, true),\n        grossMonthlyCost: numberToCurrency(state.response.grossMonthlyCost, true),\n        extraMoneyNeeded: numberToCurrency(state.response.extraMoneyNeeded, true),\n        netMonthlyCostHouse: numberToCurrency(state.response.netMonthlyCostHouse, true)\n      }\n      );\n    }\n  }\n\n  if (getCalculatorType() === CALCULATOR_TYPES.watWordenMijnMaandLasten) {\n    if (!state.HasPartner) {\n      // Scenario 5: Wat worden mijn maandlasten – no partner\n      //shareText = shareText + `Ik heb mijn maandlasten uitgerekend op hypotheker.nl. Voor een gewenste hypotheek van ${numberToCurrency(state.response.purchasePrice, true)} zijn de netto maandlasten ${numberToCurrency(state.response.netMonthlyCostHouse, true)}`\n      shareText += intl.formatMessage({\n        id: 'shareHelper.whatWillBeMyMonthlyCostsNoPartner',\n        defaultMessage: 'Ik heb mijn maandlasten uitgerekend op hypotheker.nl. Voor een gewenste hypotheek van {purchasePrice} zijn de netto maandlasten {netMonthlyCostHouse}'\n      },\n      {\n        purchasePrice: numberToCurrency(state.response.purchasePrice, true),\n        netMonthlyCostHouse: numberToCurrency(state.response.netMonthlyCostHouse, true)\n      }\n      );\n    }\n    if (state.HasPartner) {\n      // Scenario 6: Wat worden mijn maandlasten – with partner\n      //shareText = shareText + `Ik heb onze maandlasten uitgerekend op hypotheker.nl. Voor een gewenste hypotheek van ${numberToCurrency(state.response.purchasePrice, true)} zijn de netto maandlasten ${numberToCurrency(state.response.netMonthlyCostHouse, true)}`\n      shareText += intl.formatMessage({\n        id: 'shareHelper.whatWillBeMyMonthlyCostsWithPartner',\n        defaultMessage: 'Ik heb onze maandlasten uitgerekend op hypotheker.nl. Voor een gewenste hypotheek van {purchasePrice} zijn de netto maandlasten {netMonthlyCostHouse}'\n      },\n      {\n        purchasePrice: numberToCurrency(state.response.purchasePrice, true),\n        netMonthlyCostHouse: numberToCurrency(state.response.netMonthlyCostHouse, true) }\n      );\n    }\n  }\n\n  if (getCalculatorType() === CALCULATOR_TYPES.kanIkDitHuisBetalen) {\n\n    if (!state.HasPartner && state.isHouseAffordable) {\n      //Scenario 7: Kan ik dit huis betalen? – no partner – can afford the house\n      //shareText = shareText + `Ik heb op hypotheker.nl berekend of ik de woning die ik op het oog heb, kan betalen. Ik mag maximaal ${numberToCurrency(state.response.maxMortgageAmount, true)} lenen en kan dus de woning van ${numberToCurrency(state.Woning, true)}. betalen. Dat kost ${numberToCurrency(state.response.netMonthlyCostHouse, true)} per maand en ik heb ${numberToCurrency(state.response.extraMoneyNeeded, true)} eigen geld nodig.`\n      shareText += intl.formatMessage({\n        id: 'shareHelper.canIAffordThisHouseNoPartnerCanAfford',\n        defaultMessage: 'Ik heb op hypotheker.nl berekend of ik de woning die ik op het oog heb, kan betalen. Ik mag maximaal {maxMortgageAmount} lenen en kan dus de woning van {Woning}. betalen. Dat kost {netMonthlyCostHouse} per maand en ik heb {extraMoneyNeeded} eigen geld nodig.'\n      },\n      {\n        maxMortgageAmount: numberToCurrency(state.response.maxMortgageAmount, true),\n        Woning: numberToCurrency(state.Woning, true),\n        netMonthlyCostHouse: numberToCurrency(state.response.netMonthlyCostHouse, true),\n        extraMoneyNeeded: numberToCurrency(state.response.extraMoneyNeeded, true)\n      }\n      );\n    }\n\n    if (!state.HasPartner && !state.isHouseAffordable) {\n      // Scenario 8: Kan ik dit huis betalen? – no partner – can’t afford the house\n      //shareText = shareText + `Ik heb op hypotheker.nl berekend of ik de woning die ik op het oog heb, kan betalen. Ik mag maximaal ${numberToCurrency(state.response.maxMortgageAmount, true)} lenen en kan dus de woning van ${numberToCurrency(state.Woning, true)}. niet betalen.`\n      shareText += intl.formatMessage({\n        id: 'shareHelper.canIAffordThisHouseNoPartnerCantAfford',\n        defaultMessage: 'Ik heb op hypotheker.nl berekend of ik de woning die ik op het oog heb, kan betalen. Ik mag maximaal {maxMortgageAmount} lenen en kan dus de woning van {Woning}. niet betalen.'\n      },\n      {\n        maxMortgageAmount: numberToCurrency(state.response.maxMortgageAmount, true),\n        Woning: numberToCurrency(state.Woning, true)\n      }\n      );\n    }\n\n    if (state.HasPartner && state.isHouseAffordable) {\n      // Scenario 9: Kan ik dit huis betalen? – with partner – can afford the house\n      //shareText = shareText + `Ik heb op hypotheker.nl berekend of wij de woning die we op het oog hebben, kunnen betalen. We  mogen maximaal ${numberToCurrency(state.response.maxMortgageAmount, true)} lenen en kunnen dus de woning van ${numberToCurrency(state.Woning, true)}. betalen. Dat kost ${numberToCurrency(state.response.netMonthlyCostHouse, true)} maand en we hebben ${numberToCurrency(state.response.extraMoneyNeeded, true)} eigen geld nodig.`\n      shareText += intl.formatMessage({\n        id: 'shareHelper.canIAffordThisHouseWithPartnerCanAfford',\n        defaultMessage: 'Ik heb op hypotheker.nl berekend of wij de woning die we op het oog hebben, kunnen betalen. We  mogen maximaal {maxMortgageAmount} lenen en kunnen dus de woning van {Woning}. betalen. Dat kost {netMonthlyCostHouse} maand en we hebben {extraMoneyNeeded} eigen geld nodig.'\n      },\n      {\n        maxMortgageAmount: numberToCurrency(state.response.maxMortgageAmount, true),\n        Woning: numberToCurrency(state.Woning, true),\n        netMonthlyCostHouse: numberToCurrency(state.response.netMonthlyCostHouse, true),\n        extraMoneyNeeded: numberToCurrency(state.response.extraMoneyNeeded, true)\n      }\n      );\n    }\n\n    if (state.HasPartner && !state.isHouseAffordable) {\n      //Scenario 10: Kan ik dit huis betalen? – with partner – can’t afford the house\n      //shareText = shareText + `Ik heb op hypotheker.nl berekend of wij de woning die we op het oog hebben, kunnen betalen. We  mogen maximaal ${numberToCurrency(state.response.maxMortgageAmount, true)} lenen en kunnen dus de woning van ${numberToCurrency(state.Woning, true)}. niet betalen.`\n      shareText += intl.formatMessage({\n        id: 'shareHelper.canIAffordThisHouseWithPartnerCantAfford',\n        defaultMessage: 'Ik heb op hypotheker.nl berekend of wij de woning die we op het oog hebben, kunnen betalen. We  mogen maximaal {maxMortgageAmount} lenen en kunnen dus de woning van {Woning}. niet betalen.'\n      },\n      {\n        maxMortgageAmount: numberToCurrency(state.response.maxMortgageAmount, true),\n        Woning: numberToCurrency(state.Woning, true)\n      });\n    }\n  }\n\n  shareText += ` Bekijk de berekening ${shareUrl}`;\n  return shareText;\n}\n","import React, {useCallback, useEffect, useMemo} from 'react';\nimport ReactTooltip from 'react-tooltip';\nimport {\n  CALCULATOR_TYPES,\n  getAdditionalEnergyLabelAmount,\n  getCalculatorType, numberToCurrency,\n  stepStates\n} from '../../services/helpers';\nimport { getStep4HeaderSummary } from '../../services/stepHelpers';\nimport { setField } from '../../store/actions/calculatorActions';\nimport { assetsBaseUrl } from '../../services/calculationsApi';\nimport {FormattedMessage, useIntl} from \"react-intl\";\nimport {confetti} from \"@tsparticles/confetti\";\nconst ToolInfoComponent = ({\n                             toolData,\n                             mediaMatches,\n                             toggleMobileSummary,\n                             mobileSummaryOpened,\n                             dispatch,\n                             summaryWithBanksOpened,\n                             changeStepState,\n                             showNotCompleted,\n                           }) => {\n  const intl = useIntl();\n  const calculatorType = getCalculatorType();\n\n  const {\n    OwnResources,\n    Woning,\n    HomeEquity,\n    lastActiveStepIndex,\n    stepState,\n    HomeEquityCosts,\n    HomeMortgageAmount,\n    SustainabilityUplift,\n    EnergyLabel,\n    response: {\n      maxMortgageAmount,\n      grossMonthlyCost,\n      grossMonthlyCostHouse,\n      netMonthlyCostHouse,\n      totalNeededToBuyHouse,\n      extraMoneyNeeded,\n      isHouseAffordable\n    }\n  } = toolData;\n\n  const getTitle = useCallback(() => {\n    if (calculatorType === CALCULATOR_TYPES.kanIkDitHuisBetalen) {\n      return intl.formatMessage({ id: 'summary.kanIkDitHuisBetalen.title', defaultMessage: 'Kan ik dit huis betalen?' });\n    }\n    if (calculatorType === CALCULATOR_TYPES.watWordenMijnMaandLasten) {\n      return intl.formatMessage({ id: 'summary.watWordenMijnMaandLasten.title', defaultMessage: 'Wat worden mijn maandlasten' });\n    }\n    return intl.formatMessage({ id: 'summary.hoeveelKanIkLenen.title', defaultMessage: 'Hoeveel kan ik lenen?' });\n  }, [calculatorType, intl]);\n\n  const mortgagePreferenceAddition = useCallback(() => {\n    const getMortgagePreference = () => {\n      return (getCalculatorType() !== CALCULATOR_TYPES.watWordenMijnMaandLasten)\n      ? intl.formatMessage({\n        id: 'summary.titleMonthlyCost.mortgagePreference.maximum',\n        defaultMessage: 'maximale'\n      })\n      : intl.formatMessage({\n        id: 'summary.titleMonthlyCost.mortgagePreference.preferred',\n        defaultMessage: 'gewenste'\n      });\n    }\n\n    return Woning > 0\n    ? <FormattedMessage\n    id='summary.titleMonthlyCost.addition'\n    defaultMessage='o.b.v. {mortgagePreference} hypotheek'\n    values={{ mortgagePreference: getMortgagePreference()}}\n    />\n    : '';\n  }, [Woning, intl]);\n\n  useEffect(() => {\n    if (getCalculatorType() === CALCULATOR_TYPES.kanIkDitHuisBetalen && isHouseAffordable !== false) {\n\n      var defaults = {\n        particleCount: 100,\n        spread: 70,\n        origin: { y: 0.6 },\n      };\n\n      confetti({\n        ...defaults,\n        shapes: [\"image\"],\n        shapeOptions: {\n          image: {\n            src: `${assetsBaseUrl}/assets/svg/triangle.svg`,\n            replaceColor: true,\n            width: 32,\n            height: 40,\n          },\n        },\n        colors: [\"#0F916C\", \"#00325D\", \"#59b2fc\", \"#ce182d\", \"#F5B220\"],\n      });\n    }\n  }, [isHouseAffordable]);\n\n  const data = useMemo(() => {\n    let fields = [];\n    const ownMoney = getStep4HeaderSummary(HomeEquity, OwnResources, HomeEquityCosts, HomeMortgageAmount, Woning, true, intl);\n    const title = getTitle();\n    const showMaxMortgage = stepState[0] === \"filled\" && stepState[1] === \"filled\";\n    const sustainabilityBudget = getAdditionalEnergyLabelAmount(EnergyLabel?.value, SustainabilityUplift === 1);\n\n    const titleGrossMonthlyCost= <FormattedMessage id=\"summary.titleMonthlyCost.gross\" defaultMessage=\"Indicatie bruto maandlasten {addition}\" values={{ addition: mortgagePreferenceAddition()}} />\n    const titleNetMonthlyCost = <FormattedMessage id=\"summary.titleMonthlyCost.net\" defaultMessage=\"Indicatie netto maandlasten {addition}\" values={{ addition: mortgagePreferenceAddition()}} />\n\n    const ownMoneyInformation = intl.formatMessage({ id:'summary.ownMoneyInformation', defaultMessage : 'Dit is het bedrag dat je hebt aangegeven in te willen brengen bij de aankoop van je nieuwe woning.'});\n    const extraMoneyNeededInformation = intl.formatMessage({ id:'summary.extraMoneyNeededInformation', defaultMessage : 'Dit is het extra bedrag aan eigen geld dat je nodig hebt om deze woning te kunnen betalen. Met dit bedrag worden o.a. de kosten voor de notaris, hypotheekakte, taxatie en hypotheekadvies betaald. Eventuele kosten om te overbieden zitten hier niet bij inbegrepen.'});\n    const sustainabilityUpliftInformation = intl.formatMessage({ id:'summary.sustainabilityUpliftInformation', defaultMessage : 'Als je de woning die je op het oog hebt wilt verduurzamen, kan je mogelijk aanspraak maken op een verduurzamingsbudget bovenop je maximale leenbedrag. Let op: dit bedrag mag alleen besteed worden aan energiebesparende voorzieningen in en aan de woning en de uiteindelijke hoogte van het additionele verduurzamingsbudget hangt af van de taxatiewaarde van de woning.'});\n    const sustainabilityUpliftInformationNoLabel = intl.formatMessage({ id:'summary.sustainabilityUpliftInformationNoLabel', defaultMessage : 'Als je de woning die je op het oog hebt wilt verduurzamen, kan je mogelijk aanspraak maken op een verduurzamingsbudget bovenop je maximale leenbedrag. Let op: dit bedrag mag alleen besteed worden aan energiebesparende voorzieningen in en aan de woning en de uiteindelijke hoogte van het additionele verduurzamingsbudget hangt af van de taxatiewaarde van de woning. Je geeft aan dat er je woning (nog) geen energielabel heeft. Bij de verkoop van een woning moet een energielabel overhandigd worden. Het daadwerkelijke energielabel kan van invloed zijn op de hoogte van het verduurzamingsbudget.'});\n    const maxMortgageInformationNoHouse = intl.formatMessage({ id:'summary.maxMortgageInformationNoHouse', defaultMessage : 'Je geeft aan dat je nog geen woning op het oog hebt. Om je maximale hypotheekbedrag te berekenen zijn we uitgegaan van het laagste energielabel. Afhankelijk van het energielabel kan je maximale hypotheek € 5000-€ 50.000 hoger zijn dan het bedrag dat hier getoond wordt.'});\n    const maxMortgageInformationNoLabel = intl.formatMessage({ id:'summary.maxMortgageInformationNoLabel', defaultMessage : 'Je geeft aan dat de woning die je op het oog hebt (nog) geen energielabel heeft. Bij de verkoop van een woning moet een energielabel overhandigd worden. Afhankelijk van het energielabel kan je maximale hypotheek € 5000-€ 50.000 hoger zijn dan het bedrag dat hier getoond wordt.'});\n\n\n    if (calculatorType === CALCULATOR_TYPES.hoeveelKanIkLenen) {\n      fields = [\n        {\n          title: <FormattedMessage id={'summary.list.maxMortgageAmount.title'} defaultMessage={'Jouw maximale hypotheek'} />,\n          value: maxMortgageAmount,\n          toolTip: (Woning > 0) ? EnergyLabel?.value === \"-\" ? maxMortgageInformationNoLabel: false : maxMortgageInformationNoHouse\n        },\n        {\n          title: titleGrossMonthlyCost,\n          value: grossMonthlyCost,\n        },\n        {\n          title: <FormattedMessage id={'summary.list.sustainabilityBudget.title'} defaultMessage={'Verduurzamingsbudget'} />,\n          value: sustainabilityBudget,\n          hide: SustainabilityUplift === 0 || sustainabilityBudget === 0 || Woning === 0,\n          toolTip: EnergyLabel?.value === \"-\" ? sustainabilityUpliftInformationNoLabel : sustainabilityUpliftInformation\n        },\n        {\n          title: <FormattedMessage id={'summary.list.housePrice.title'} defaultMessage={'Vraagprijs woning'} />,\n          value: Woning,\n          hide: Woning === 0,\n        },\n        {\n          title:  <FormattedMessage id={'summary.list.titleMonthlyCostHouse.gross'} defaultMessage={'Indicatie bruto maandlasten o.b.v. woning'} />,\n          value: grossMonthlyCostHouse,\n          hide: grossMonthlyCostHouse === 0 || Woning === 0\n        },\n        {\n          title: <FormattedMessage id={'summary.list.ownMoney.title'} defaultMessage={'Inleg eigen geld'} />,\n          value: ownMoney,\n          hide: ownMoney === 0 || Woning === 0,\n          toolTip: ownMoneyInformation\n        },\n\n      ];\n    }\n\n\n    if (calculatorType === CALCULATOR_TYPES.kanIkDitHuisBetalen) {\n      fields = [\n        {\n          title: <FormattedMessage id={'summary.list.totalNeededToBuyHouse.title'} defaultMessage={'Totaal nodig voor je huis'} />,\n          value: totalNeededToBuyHouse,\n          addResultRedClass: isHouseAffordable === false,\n          hide: typeof totalNeededToBuyHouse === 'undefined'\n        },\n        {\n          title: <FormattedMessage id={'summary.list.maxMortgageAmount.title'} defaultMessage={'Jouw maximale hypotheek'} />,\n          value: maxMortgageAmount,\n          iamNeverTheFirstItem: true,\n          toolTip: (Woning > 0) ? EnergyLabel?.value === \"-\" ? maxMortgageInformationNoLabel: false : maxMortgageInformationNoHouse\n        },\n        {\n          title: <FormattedMessage id={'summary.list.sustainabilityBudget.title'} defaultMessage={'Verduurzamingsbudget'} />,\n          value: sustainabilityBudget,\n          hide: SustainabilityUplift === 0 || sustainabilityBudget === 0 || Woning === 0,\n          toolTip: EnergyLabel?.value === \"-\" ? sustainabilityUpliftInformationNoLabel : sustainabilityUpliftInformation\n        },\n        {\n          title: titleGrossMonthlyCost,\n          value: grossMonthlyCost\n        },\n        {\n          title: <FormattedMessage id={'summary.list.housePrice.title'} defaultMessage={'Vraagprijs woning'} />,\n          value: Woning,\n          hide: Woning === 0,\n        },\n        {\n          title:  <FormattedMessage id={'summary.list.titleMonthlyCostHouse.gross'} defaultMessage={'Indicatie bruto maandlasten o.b.v. woning'} />,\n          value: grossMonthlyCostHouse,\n          hide: grossMonthlyCostHouse === 0 || Woning === 0\n        },\n        {\n          title: <FormattedMessage id={'summary.list.extraMoneyNeeded.title'} defaultMessage={'Extra in te leggen'} />,\n          value: extraMoneyNeeded,\n          hide: extraMoneyNeeded === 0,\n          toolTip: extraMoneyNeededInformation\n        },\n        {\n          title: <FormattedMessage id={'summary.list.ownMoney.title'} defaultMessage={'Inleg eigen geld'} />,\n          value: ownMoney,\n          hide: ownMoney === 0 || Woning === 0,\n          toolTip: ownMoneyInformation\n        }\n      ];\n\n    }\n\n    if (calculatorType === CALCULATOR_TYPES.watWordenMijnMaandLasten) {\n      fields = [\n        {\n          title: titleGrossMonthlyCost,\n          value: grossMonthlyCostHouse,\n        },\n        {\n          title: titleNetMonthlyCost,\n          value: netMonthlyCostHouse,\n        },\n        {\n          title: <FormattedMessage id={'summary.list.preferredMortgageAmount.title'} defaultMessage={'Gewenst hypotheekbedrag'} />,\n          value: Woning,\n          hide: Woning === 0,\n        },\n        {\n          title: <FormattedMessage id={'summary.list.ownMoney.title'} defaultMessage={'Inleg eigen geld'} />,\n          value: ownMoney,\n          hide: ownMoney === 0 || Woning === 0,\n          toolTip: ownMoneyInformation,\n        },\n        {\n          title: <FormattedMessage id={'summary.list.maxMortgageAmount.title'} defaultMessage={'Jouw maximale hypotheek'} />,\n          value: maxMortgageAmount,\n          hide: maxMortgageAmount === 0 || !showMaxMortgage,\n          toolTip: maxMortgageInformationNoHouse\n        },\n      ];\n    }\n\n    // Filter out hidden fields and return the result\n    return { fields: fields.filter(field => !field.hide), title};\n\n  }, [stepState, Woning, EnergyLabel, SustainabilityUplift, maxMortgageAmount, grossMonthlyCost, grossMonthlyCostHouse, totalNeededToBuyHouse, extraMoneyNeeded, isHouseAffordable, HomeEquity, HomeEquityCosts, HomeMortgageAmount, OwnResources, calculatorType, getTitle, intl, mortgagePreferenceAddition, netMonthlyCostHouse]);\n\n  const toggleSummary = () => {\n    if (typeof summaryWithBanksOpened !== \"boolean\") {\n      toggleMobileSummary();\n    } else {\n      dispatch(setField(\"summaryWithBanksOpened\", !summaryWithBanksOpened));\n      changeStepState(lastActiveStepIndex, stepStates.filled);\n    }\n  };\n\n  return (\n  <>\n    <div className=\"ct-step__summary-title\">\n      {data.title}\n    </div>\n    {showNotCompleted && (\n    <div className=\"ct-step__summary-text\">\n      <FormattedMessage id={'summary.notCompleted.text'} defaultMessage={'Dit resultaat is gebaseerd op je leeftijd en inkomen. Maak de berekening af voor een compleet overzicht van hoeveel je kunt lenen.'} />\n    </div>\n    )}\n\n    {getCalculatorType() === CALCULATOR_TYPES.kanIkDitHuisBetalen &&\n    totalNeededToBuyHouse > 0 ? (\n    <div\n    className={`ct-step__summary-answer ${isHouseAffordable === false ? 'ct-step__summary-answer__red' : 'ct-step__summary-answer__green'}`}>\n\n      <div className={`ct-step__summary-answer__wrapper`}>\n        <img src={`${assetsBaseUrl}/assets/svg/${isHouseAffordable === false ? 'round-circle-close.svg' : 'round-circle-check.svg'}`} alt=\"\"/>\n        <div className={`ct-step__summary-answer__wrapper__text`}>\n        <FormattedMessage\n          id=\"summary.isHouseAffordable\"\n          defaultMessage=\"Het lijkt erop dat je het huis {isHouseAffordable} kunt betalen\"\n          values={{\n            isHouseAffordable: isHouseAffordable === false ?\n            intl.formatMessage({id: 'summary.isHouseAffordable.no', defaultMessage: 'niet'}) :\n            ''\n          }}\n          />\n        </div>\n      </div>\n      {isHouseAffordable !== false && (\n      <img className={`ct-step__summary-answer__triangles`} src={`${assetsBaseUrl}/assets/images/triangles-confirmation.png`} alt=\"success\" />\n      )}\n\n      <div id={\"tsparticles\"}></div>\n    </div>\n    ) : null}\n\n    <div className=\"ct-step__summary-results\">\n      {data.fields && data.fields.map((item, i) => (\n      <div key={i} className={`${(i === 0 && !item.iamNeverTheFirstItem) && `ct-step__summary-results-maximale ct-step__summary-results-maximale__${getCalculatorType()}`}`}>\n        <div className='ct-step__summary-results__key'>\n          <span>{item.title}</span>\n          {item.toolTip && (\n          <span>\n                <img className=\"ct-step__tool-tip ct-step__tool-tip--summary\"\n                     data-tip={item.toolTip}\n                     src={`${assetsBaseUrl}/assets/svg/info.svg`} alt=\"\"/>\n                <ReactTooltip place={\"top\"} effect={\"solid\"} html={true} disabled={true}/>\n              </span>\n          )}\n        </div>\n        <div\n        className={`ct-step__summary-results__value ct-step__summary-results__value--${calculatorType} ${item.addResultRedClass && 'ct-step__summary-results-red'}`}>\n          {numberToCurrency(item.value ? item.value : 0)}\n        </div>\n        {i === 0 && mediaMatches && summaryWithBanksOpened !== true && (\n        <img\n        src={`${assetsBaseUrl}/assets/svg/arrow-down-secondary.svg`}\n        className={`${mobileSummaryOpened && \"ct-step__summary-mobile-arrow-rotated\"}`}\n        onClick={toggleSummary}\n        alt=\"\"\n        />\n        )}\n      </div>\n      ))}\n    </div>\n  </>\n  );\n};\n\nexport default ToolInfoComponent;\n","import React, {useRef, useState} from \"react\";\nimport {useReactToPrint} from \"react-to-print\";\nimport {useSelector} from \"react-redux\";\nimport ReactDOM from \"react-dom\";\nimport {useMediaQuery} from \"@react-hook/media-query\";\n\nimport BankCard from \"./summary/BankCard\";\nimport {\n  addOfficeIdParamToLink,\n  CALCULATOR_TYPES,\n  getCalculatorType,\n  mainMediaMobile,\n  removeDotsComas,\n  setBodyDataForPdf\n} from \"../services/helpers\";\nimport {assetsBaseUrl, getShortUrl} from \"../services/calculationsApi\";\nimport {stepTitles} from \"./steps/stepParts/StepHeader\";\nimport {setField, getSummaryPdfAction} from \"../store/actions/calculatorActions\";\nimport {stepStates} from \"../services/helpers\";\nimport OverviewModal from \"./modals/OverviewModal\";\nimport SharePdfModal from \"./modals/SharePdfModal\";\nimport {getStateAsShareableLink} from \"../services/stateHelper\";\nimport {getWhatsAppShareText} from \"../services/shareHelper\";\nimport {SHARE_PDF} from \"../store/actionTypes/calculatorActionTypes\";\nimport ToolInfoComponent from \"./summary/ToolInfoComp\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\n\nfunction Summary({dispatch, changeStepState}) {\n  const intl = useIntl();\n  const toolData = useSelector((state) => state.calculator);\n  const mediaMatches = useMediaQuery(mainMediaMobile);\n  const [mobileSummaryOpened, setMobileSummaryOpened] = useState(false);\n  const [isOverviewOpened, setIsOverviewOpened] = useState(false);\n  const [isSharePdfOpened, setIsSharePdfOpened] = useState(false);\n  const [showPdfSpinner, setShowPdfSpinner] = useState(false);\n\n  const fetchPdf = () => {\n    dispatch(\n    getSummaryPdfAction(setBodyDataForPdf(toolData), intl.locale)\n    ).then(() => setShowPdfSpinner(false))\n  }\n\n  const {\n    stepState,\n    lastActiveStepIndex,\n    summaryWithBanksOpened,\n    bankData,\n    response: {\n      totalNeededToBuyHouse\n    },\n  } = toolData;\n\n  const showNotCompleted = (getCalculatorType() !== CALCULATOR_TYPES.hoeveelKanIkLenen) ? stepState[0] === \"filled\" && stepState[1] === \"filled\" && stepState[2] !== \"filled\" : stepState[0] === \"filled\" && stepState[1] !== \"filled\";\n\n\n  const toggleMobileSummary = (value) => {\n    setMobileSummaryOpened(\n    typeof value === \"boolean\" ? value : !mobileSummaryOpened\n    );\n  };\n\n  const closeSummary = () => {\n    toggleMobileSummary(false);\n\n    dispatch(setField(\"summaryWithBanksOpened\", false));\n\n    changeStepState(lastActiveStepIndex, stepStates.active);\n  };\n\n\n  const componentRef = useRef();\n  const handlePrint = useReactToPrint({\n    content: () => componentRef.current,\n  });\n\n  const openedCondition = mediaMatches && mobileSummaryOpened;\n\n  const toggleOverview = () => {\n    setIsOverviewOpened(!isOverviewOpened);\n  };\n\n  const toggleSharePdf = () => {\n    setIsSharePdfOpened(!isSharePdfOpened);\n    dispatch({\n      type: SHARE_PDF,\n      response: {\n        state: 'not_mailed',\n        success: null,\n        message: false\n      }\n    })\n  };\n\n  const print = () => {\n    toggleOverview();\n\n    setTimeout(() => {\n      handlePrint();\n    }, 200);\n  };\n\n  const shareWhatsApp = async () => {\n    const url = getStateAsShareableLink(removeDotsComas(toolData));\n    const {hostname} = window.location;\n\n    if (hostname.indexOf('localhost') === -1) {\n      const shortUrl = await getShortUrl(url, '&utm_source=berekening&utm_medium=whatsapp');\n      const shareText = getWhatsAppShareText(toolData, shortUrl.link, intl)\n      window.open(`https://api.whatsapp.com/send?text=${shareText}`)\n    } else {\n      console.log(url);\n      console.log(getWhatsAppShareText(toolData, window.location, intl))\n    }\n\n  };\n\n  return (\n  <div\n  className={`ct-step__summary\n                ${\n  toolData.bankData && !mediaMatches\n  ? \"ct-step__summary-no-sticky\"\n  : undefined\n  }\n                ${\n  getCalculatorType() ===\n  CALCULATOR_TYPES.kanIkDitHuisBetalen &&\n  totalNeededToBuyHouse > 0\n  ? \"ct-step__summary--kanIkDitHuisBetalen\"\n  : \"\"\n  }\n                ${openedCondition ? \"ct-step__summary-opened\" : undefined}\n                ${\n  summaryWithBanksOpened\n  ? \"ct-step__summary-opened-banks\"\n  : undefined\n  }`}\n  id=\"summary\"\n  >\n    <ToolInfoComponent\n    toolData={toolData}\n    mediaMatches={mediaMatches}\n    toggleMobileSummary={toggleMobileSummary}\n    mobileSummaryOpened={mobileSummaryOpened}\n    dispatch={dispatch}\n    summaryWithBanksOpened={summaryWithBanksOpened}\n    changeStepState={changeStepState}\n    showNotCompleted={showNotCompleted}\n    ></ToolInfoComponent>\n\n    { /* <div className=\"ct-step__summary-title\">\n      {toolInfo.title}</div>\n    {showNotCompleted && (\n    <div className=\"ct-step__summary-text\">\n      {\" \"}\n      Dit resultaat is gebaseerd op je leeftijd en inkomen. Maak\n      de berekening af voor een compleet overzicht van hoeveel je\n      kunt lenen.\n    </div>\n    )}\n\n    {getCalculatorType() === CALCULATOR_TYPES.kanIkDitHuisBetalen &&\n    totalNeededToBuyHouse > 0 ? (\n    <div className=\"ct-step__summary-answer\">\n      Het lijkt erop dat je het huis{\" \"}\n      {isHouseAffordable ? \"\" : \"niet\"} kunt betalen\n    </div>\n    ) : null}\n\n    <div className=\"ct-step__summary-results\">\n      {toolInfo.fields}\n    </div> */ }\n\n    {summaryWithBanksOpened &&\n    <div className=\"ct-step__summary-buttons\">\n      <div className=\"ct-step__summary-print-and-pdf-buttons\">\n        <button\n        className=\"ct__button ct__button__summary ct__button-icon\"\n        disabled={!summaryWithBanksOpened}\n        onClick={print}\n        >\n          <img\n          src={`${assetsBaseUrl}/assets/svg/${\n          !summaryWithBanksOpened ? \"grey/\" : \"\"\n          }print.svg`}\n          alt=\"\"\n          />\n        </button>\n        {showPdfSpinner}\n        <button\n        className=\"ct__button ct__button__summary ct__button-icon\"\n        disabled={!summaryWithBanksOpened}\n        onClick={() => {\n          setShowPdfSpinner(true);\n          fetchPdf();\n        }}\n        >\n          {showPdfSpinner ? (\n          <img className={\"ct__button__summary--loading\"} src={`${assetsBaseUrl}/assets/svg/loader-dots.svg`} alt=\"\"/>\n          ) : (\n          <img\n          src={`${assetsBaseUrl}/assets/svg/${\n          !summaryWithBanksOpened ? \"grey/\" : \"\"\n          }pdf.svg`}\n          alt=\"pdf icon\"\n          />\n          )}\n        </button>\n        <button\n        className=\"ct__button ct__button__summary ct__button-icon\"\n        disabled={!summaryWithBanksOpened}\n        onClick={shareWhatsApp}\n        >\n          <img\n          src={`${assetsBaseUrl}/assets/svg/${\n          !summaryWithBanksOpened ? \"grey/\" : \"\"\n          }whatsapp.svg`}\n          alt=\"\"\n          />\n        </button>\n\n        <button\n        className=\"ct__button ct__button__summary ct__button-icon\"\n        disabled={!summaryWithBanksOpened}\n        onClick={toggleSharePdf}\n        >\n          <img\n          src={`${assetsBaseUrl}/assets/svg/${\n          !summaryWithBanksOpened ? \"grey/\" : \"\"\n          }mail.svg`}\n          alt=\"\"\n          />\n        </button>\n      </div>\n      <div className=\"ct-step__summary-actions\">\n\n        {getCalculatorType() === CALCULATOR_TYPES.hoeveelKanIkLenen &&\n        <a href={addOfficeIdParamToLink(`https://www.hypotheker.nl/afspraak-maken-hypotheekadviseur/`)}\n           className={`ct__button ct__button--small ct__button--full-width ct-step__summary-actions__advisor ${toolData.bankData ? \"ct-header__afspraak\" : \"ct-step__summary__afspraak\"}`}>\n          <FormattedMessage id=\"summary.findAdvisor\" defaultMessage=\"Zoek een adviseur\"/>\n        </a>\n        }\n\n        <button\n        className=\"ct__button ct__button--full-width ct__button__summary ct__button__summary--no-margin ct__button__summary--calculation\"\n        disabled={!summaryWithBanksOpened || !bankData}\n        onClick={toggleOverview}\n        >\n          <FormattedMessage id={\"summary.showCalculation\"} defaultMessage={\"Toon volledige berekening\"}/>\n        </button>\n      </div>\n    </div>\n    }\n\n    <div className=\"ct-step__summary_bank-results\">\n      {toolData.bankData ? (\n      <>\n        <div className=\"ct-step__summary-title ct-step__summary-title--deal\">\n          <FormattedMessage id={\"summary.bestDeal\"} defaultMessage={\"Dit is jouw beste deal\"}/>\n        </div>\n\n        <div className=\"ct-step__summary-text\">\n          <FormattedMessage id={\"summary.bestDealText\"} defaultMessage={\"Jouw beste deal is berekend aan de hand van de gegevens die je hebt ingevoerd. Dit kun je zien als indicatie, alleen gebaseerd op de geboden laagste rente op dit moment. Een hypotheekadviseur van De Hypotheker kijkt meer uitgebreid naar jouw situatie. Hij of zij vergelijkt vervolgens alle aanbieders (ook je eigen bank), zodat je zeker weet dat je de beste deal krijgt.\"}/>\n        </div>\n\n        <div className=\"ct-step__summary-banks-list\">\n          <BankCard\n          isMain\n          bankData={\n          toolData.bankData &&\n          toolData.bankData.mainBank\n          }\n          grossMonthlyCost={\n            //(getCalculatorType() === CALCULATOR_TYPES.watWordenMijnMaandLasten) ? toolData.response.grossMonthlyCostHouse : toolData.response.grossMonthlyCost\n            toolData.Woning > 0\n            ? toolData.response\n            .grossMonthlyCostHouse\n            : toolData.response.grossMonthlyCost\n          }\n          />\n        </div>\n      </>\n      ) : null}\n\n      <div className=\"ct-step__summary-divider\"/>\n\n      <div>\n        <div className=\"ct-step__summary-subtitle\">\n          <FormattedMessage id={\"summary.advisorAppointment\"} defaultMessage={\"Afspraak met een adviseur\"}/>\n        </div>\n\n                    <div className=\"ct-step__summary-text\">\n                      <FormattedMessage id={\"summary.advisorAppointmentText\"} defaultMessage={\"Jouw maximale leenbedrag is mogelijk hoger dan dit resultaat. Het leenbedrag in onze berekening is gebaseerd op de laagste rente op dit moment. Een hogere rente kan in sommige gevallen een hoger leenbedrag opleveren. Maak een vrijblijvende afspraak bij een vestiging bij je in buurt voor inzicht in jouw financiële mogelijkheden\"}/>\n                    </div>\n\n                    <a\n                        href={addOfficeIdParamToLink(`https://www.hypotheker.nl/afspraak-maken-hypotheekadviseur/`)}\n                        className={`margin-top__xs-sm ct__button ${\n                            toolData.bankData\n                                ? \"ct-header__afspraak\"\n                                : \"ct-step__summary__afspraak\"\n                        }`}\n                    >\n                      <FormattedMessage id={\"summary.makeAppointment\"} defaultMessage={\"Afspraak maken\"}/>\n                    </a>\n\n      </div>\n    </div>\n\n    {mediaMatches && summaryWithBanksOpened ? (\n    <div className=\"ct-step__summary-mobile-header\">\n      <button\n      className=\"ct_back-button-mobile ct_back-button-summary\"\n      onClick={closeSummary}\n      >\n        <img\n        src={`${assetsBaseUrl}/assets/svg/arrow-down-secondary.svg`}\n        alt=\"\"\n        />\n        {stepTitles[lastActiveStepIndex]}\n      </button>\n    </div>\n    ) : null}\n\n    {isOverviewOpened\n    ? ReactDOM.createPortal(\n    <OverviewModal\n    toggleOverview={toggleOverview}\n    componentRef={componentRef}\n    />,\n    document.getElementById(\"overview-modal-portal\")\n    )\n    : null}\n    {isSharePdfOpened\n    ? ReactDOM.createPortal(\n    <SharePdfModal\n    toggleOverview={toggleSharePdf}\n    toolData={toolData}\n    componentRef={componentRef}\n    />,\n    document.getElementById(\"overview-modal-portal\")\n    )\n    : null}\n\n  </div>\n  );\n}\n\nexport default Summary;\n","import React from 'react';\nimport {assetsBaseUrl} from \"../services/calculationsApi\";\n\nfunction Usp() {\n\n\n  return (\n  <>\n  <div className=\"ct-usp\">\n    <div class=\"ct-usp__list\">\n      <h2>Waarom De Hypotheker</h2>\n      <ul>\n        <li>\n          <span>\n            <img\n            src={`${assetsBaseUrl}/assets/svg/check.svg`}\n            alt=\"\"\n            />\n          </span>\n          Wij vergelijken meer dan 40 banken\n        </li>\n        <li>\n          <span>\n           <img\n           src={`${assetsBaseUrl}/assets/svg/check.svg`}\n           alt=\"\"\n           />\n          </span>\n          Met ruim 180 vestigingen zitten we altijd bij je in de buurt\n        </li>\n        <li>\n          <span>\n            <img\n            src={`${assetsBaseUrl}/assets/svg/check.svg`}\n            alt=\"\"\n            />\n          </span>\n          De eerste afspraak is altijd kosteloos\n        </li>\n      </ul>\n    </div>\n\n    <div class=\"ct-usp__reviews\">\n      <div class=\"ct-usp__reviews__payoff\">\n        <div class=\"ct-usp__reviews__payoff__score u-h1\">9,7</div>\n        <div class=\"ct-usp__reviews__payoff__text u-h3\">Wat onze klanten van ons vinden</div>\n      </div>\n      <div>\n        <div class=\"u-h5\">31.121 beoordelingen</div>\n      </div>\n      <img\n      class=\"ct-usp__reviews__logo\"\n      alt=\"Advieskeuze logo\"\n      src={`${assetsBaseUrl}/assets/images/logo-advies-keuze-horizontal.png`}\n      />\n    </div>\n  </div>\n\n</>\n);\n}\n\nexport default Usp;\n","import React, {useEffect, useState} from 'react';\nimport {useMediaQuery} from \"@react-hook/media-query\";\nimport {useDispatch, useSelector} from \"react-redux\";\nimport Header from './Header';\nimport {assetsBaseUrl, getNhg} from \"../services/calculationsApi\";\nimport Steps from \"./Steps\";\nimport {getCalculatorType, stepStates, CALCULATOR_TYPES, removeDotsComas} from \"../services/helpers\";\nimport Summary from \"./Summary\";\nimport {\n    affordCalcAction,\n    getMortgageProviderAction,\n    mortgageCalcAction,\n    parseSearchQuery,\n    setField\n} from \"../store/actions/calculatorActions\";\nimport {defaultStepsState, mainMediaMobile} from \"../services/helpers\";\nimport {saveStateToSession} from \"../services/stateHelper\";\nimport { RESET_STEPS } from \"../store/actionTypes/calculatorActionTypes\";\nimport {FormattedMessage} from \"react-intl\";\nimport Usp from \"./Usp\";\n\nfunction App() {\n    const [stepsState, setStepsState] = useState(defaultStepsState);\n    const [loading, setLoading] = useState(false);\n    const {Woning, error, summaryWithBanksOpened } = useSelector((state) => state.calculator);\n    const state = useSelector((state) => state.calculator);\n    const dispatch = useDispatch();\n    const mediaMatches = useMediaQuery(mainMediaMobile);\n\n    useEffect(() => {\n        const params = parseSearchQuery(window.location.search)\n\n        if (typeof params?.productid !== 'undefined') {\n           dispatch(getMortgageProviderAction(params.productid, (params?.isnewbuilding) ? params?.isnewbuilding : false , { value: params.energylabel }))\n        }\n    }, [dispatch]);\n\n    useEffect(() => {\n      saveStateToSession(removeDotsComas(state), getCalculatorType());\n    }, [state]);\n\n    useEffect(() => {\n      const fetchData = async () => {\n        const nhg = await getNhg();\n        dispatch(setField('Nhg', nhg));\n      };\n\n      fetchData();\n    }, [dispatch]);\n\n    const onStepSubmit = async (data, stepNumber) => {\n        setLoading(true);\n        for (let field in data) {\n          //console.log('field',field, data[field])\n            dispatch(setField(field, data[field]));\n        }\n\n      const houseValue = (typeof data.Woning !== \"undefined\") ? data?.Woning : Woning;\n\n        if (houseValue > 0) {\n            if (getCalculatorType() === CALCULATOR_TYPES.kanIkDitHuisBetalen) {\n                if (stepNumber >= 1 || stepsState[1] === 'filled') {\n                    //dispatch(mortgageCalcAction());\n                    await dispatch(affordCalcAction(stepNumber, false, true));\n                } else {\n                  await dispatch(mortgageCalcAction());\n                }\n            }\n\n            if(getCalculatorType() === CALCULATOR_TYPES.watWordenMijnMaandLasten) {\n                // fix for not having the default interest\n                if(stepsState[1] === 'inactive' && stepNumber === 0) {\n                    //await dispatch(mortgageCalcAction());\n                }\n\n                await dispatch(affordCalcAction(stepNumber, false, true));\n            }\n\n            if (getCalculatorType() === CALCULATOR_TYPES.hoeveelKanIkLenen) {\n                await dispatch(affordCalcAction(stepNumber, false, true));\n            }\n\n        } else {\n            await dispatch(mortgageCalcAction());\n        }\n\n        if (mediaMatches) {\n            dispatch(setField('lastActiveStepIndex', stepNumber));\n        }\n\n        saveStateToSession(removeDotsComas(state), getCalculatorType());\n        setLoading(false);\n        openStep(stepNumber, true);\n    };\n\n    const changeStepState = (stepIndex, newState, nextStepUpdate, prevStepUpdate) => {\n\n\n        const newStepsState = [...stepsState];\n        newStepsState[stepIndex] = newState;\n\n        if (nextStepUpdate) {\n            newStepsState[stepIndex + 1] = stepStates.active;\n        }\n\n        if (prevStepUpdate) {\n            newStepsState[stepIndex - 1] = stepStates.active;\n        }\n\n        setStepsState(newStepsState);\n        dispatch(setField('stepState', newStepsState));\n    };\n\n    const openStep = (stepNumber, nextStepUpdate, prevStepUpdate, isLastStepFilled) => {\n        const currentStepState = stepsState[stepNumber];\n        let newState;\n\n        //const isLastStepFilled = (stepNumber === 4) && summaryWithBanksOpened && currentStepState === stepStates.active;\n\n        if (nextStepUpdate || currentStepState === stepStates.active || isLastStepFilled) {\n            newState = stepStates.filled;\n        } else if (currentStepState === stepStates.active) {\n            newState = stepStates.closed;\n        } else {\n            newState = stepStates.active;\n        }\n\n        changeStepState(stepNumber, newState, nextStepUpdate, prevStepUpdate);\n    };\n\n    const clearState = () => {\n        window.localStorage.removeItem(`state.${getCalculatorType()}`);\n        setStepsState(defaultStepsState);\n        dispatch({\n            type: RESET_STEPS,\n            stepState: [],\n        });\n    };\n\n    return (\n        <div className=\"ct-container\">\n            <Header />\n\n            <a href={document.referrer} className=\"ct_back-button\">\n                <img\n                    src={`${assetsBaseUrl}/assets/svg/arrow-down-secondary.svg`}\n                    alt=\"\"\n                />\n               <FormattedMessage id=\"header.back\" defaultMessage=\"Terug\" />\n            </a>\n\n            <div className=\"ct-content\">\n                <Steps\n                    openStep={openStep}\n                    stepsState={stepsState}\n                    error={error}\n                    loading={loading}\n                    onStepSubmit={onStepSubmit}\n                    dispatch={dispatch}\n                    onStateClear={clearState}\n                />\n              {summaryWithBanksOpened && (\n                <Summary\n                    dispatch={dispatch}\n                    changeStepState={changeStepState}\n                />\n              )}\n              {!summaryWithBanksOpened && (\n                <Usp>\n\n                </Usp>\n              )}\n            </div>\n        </div>\n    );\n}\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n  window.location.hostname === 'localhost' ||\n    // [::1] is the IPv6 localhost address.\n    window.location.hostname === '[::1]' ||\n    // 127.0.0.0/8 are considered localhost for IPv4.\n    window.location.hostname.match(\n      /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n    )\n);\n\nexport function register(config) {\n  if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n    // The URL constructor is available in all browsers that support SW.\n    const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n    if (publicUrl.origin !== window.location.origin) {\n      // Our service worker won't work if PUBLIC_URL is on a different origin\n      // from what our page is served on. This might happen if a CDN is used to\n      // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n      return;\n    }\n\n    window.addEventListener('load', () => {\n      const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n      if (isLocalhost) {\n        // This is running on localhost. Let's check if a service worker still exists or not.\n        checkValidServiceWorker(swUrl, config);\n\n        // Add some additional logging to localhost, pointing developers to the\n        // service worker/PWA documentation.\n        navigator.serviceWorker.ready.then(() => {\n          console.log(\n            'This web app is being served cache-first by a service ' +\n              'worker. To learn more, visit https://bit.ly/CRA-PWA'\n          );\n        });\n      } else {\n        // Is not localhost. Just register service worker\n        registerValidSW(swUrl, config);\n      }\n    });\n  }\n}\n\nfunction registerValidSW(swUrl, config) {\n  navigator.serviceWorker\n    .register(swUrl)\n    .then(registration => {\n      registration.onupdatefound = () => {\n        const installingWorker = registration.installing;\n        if (installingWorker == null) {\n          return;\n        }\n        installingWorker.onstatechange = () => {\n          if (installingWorker.state === 'installed') {\n            if (navigator.serviceWorker.controller) {\n              // At this point, the updated precached content has been fetched,\n              // but the previous service worker will still serve the older\n              // content until all client tabs are closed.\n              console.log(\n                'New content is available and will be used when all ' +\n                  'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n              );\n\n              // Execute callback\n              if (config && config.onUpdate) {\n                config.onUpdate(registration);\n              }\n            } else {\n              // At this point, everything has been precached.\n              // It's the perfect time to display a\n              // \"Content is cached for offline use.\" message.\n              console.log('Content is cached for offline use.');\n\n              // Execute callback\n              if (config && config.onSuccess) {\n                config.onSuccess(registration);\n              }\n            }\n          }\n        };\n      };\n    })\n    .catch(error => {\n      console.error('Error during service worker registration:', error);\n    });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n  // Check if the service worker can be found. If it can't reload the page.\n  fetch(swUrl, {\n    headers: { 'Service-Worker': 'script' },\n  })\n    .then(response => {\n      // Ensure service worker exists, and that we really are getting a JS file.\n      const contentType = response.headers.get('content-type');\n      if (\n        response.status === 404 ||\n        (contentType != null && contentType.indexOf('javascript') === -1)\n      ) {\n        // No service worker found. Probably a different app. Reload the page.\n        navigator.serviceWorker.ready.then(registration => {\n          registration.unregister().then(() => {\n            window.location.reload();\n          });\n        });\n      } else {\n        // Service worker found. Proceed as normal.\n        registerValidSW(swUrl, config);\n      }\n    })\n    .catch(() => {\n      console.log(\n        'No internet connection found. App is running in offline mode.'\n      );\n    });\n}\n\nexport function unregister() {\n  if ('serviceWorker' in navigator) {\n    navigator.serviceWorker.ready\n      .then(registration => {\n        registration.unregister();\n      })\n      .catch(error => {\n        console.error(error.message);\n      });\n  }\n}\n","import {\n    SET_FIELD,\n    CALCULATE,\n    CALCULATE_INCOME,\n    GET_BANK_BY_ID,\n    CALCULATE_YEARLY_INCOME,\n    CALCULATE_YEARLY_INCOME_INDEPENDENT,\n    GET_MORTGAGE_PROVIDER,\n    SHARE_PDF,\n    RESET_STEPS,\n    SET_OTHER_BANK,\n} from \"../actionTypes/calculatorActionTypes\";\nimport {getInitialState} from \"../../services/stateHelper\";\n\nexport const initialState = getInitialState();\n\nconst calculatorReducer = (state = initialState, action) => {\n    switch (action.type) {\n        case SET_FIELD:\n            return {\n                ...state,\n                [action.field]: action.value,\n            };\n\n        case CALCULATE:\n            return {\n                ...state,\n                response: {\n                    ...state.response,\n                    ...action.response\n                }\n            };\n\n        case SHARE_PDF:\n            return {\n                ...state,\n                sharePdf: {\n                    ...state.sharePdf,\n                    ...action.response\n                },\n            };\n\n        case CALCULATE_YEARLY_INCOME:\n            return {\n                ...state,\n                [action.field]: action.response.yearlyIncome,\n            };\n\n        case CALCULATE_YEARLY_INCOME_INDEPENDENT:\n            const yearlyIncomeIndependent = parseFloat(action.response.it);\n\n            return {\n                ...state,\n                [action.field]:\n                    yearlyIncomeIndependent % 1 !== 0\n                        ? yearlyIncomeIndependent.toFixed(2)\n                        : yearlyIncomeIndependent,\n            };\n\n        case CALCULATE_INCOME:\n            return {\n                ...state,\n                Interest: (state.SelectedMortgageProvider) ? state.SelectedMortgageProvider.rentestand : action.response.interest,\n                response: {\n                    ...state.response,\n                    ...action.response,\n                    //BrutoMaandlasten: action?.response?.MonthlyCosts?.GrossMonthlyCosts,\n                },\n            };\n\n      case GET_MORTGAGE_PROVIDER:\n\n            return {\n                ...state,\n                Interest: action.response.rentestand,\n                RentevastePeriode: action.response.rentevastePeriode,\n                MortgageType: action.response.hypotheekVorm,\n                SelectedMortgageProvider: (typeof state.SelectedMortgageProvider === \"object\") ? {...state.SelectedMortgageProvider, ...action.response } : action.response\n            };\n\n        case GET_BANK_BY_ID:\n\n            return {\n                ...state,\n                InterestBestDeal: action.bankData.mainBank.rentestand,\n                bankData: action.bankData,\n            };\n\n        case RESET_STEPS:\n            return {\n                ...getInitialState()\n            };\n      case SET_OTHER_BANK:\n\n            // remove or add check action.action\n            if (action.action === \"add\") {\n              state.bankData.otherBanks.push(action.bank);\n            } else {\n              state.bankData.otherBanks = state.bankData.otherBanks.filter((bank) => bank.lookupId !== action.bank.lookupId)\n            }\n            const bankData = state.bankData;\n\n            return {\n              ...state,\n              bankData: bankData\n            };\n\n\n\n        default:\n            return state;\n    }\n};\n\nexport default calculatorReducer;\n","import 'react-app-polyfill/ie11';\nimport 'react-app-polyfill/stable';\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport {createStore, combineReducers, applyMiddleware} from 'redux';\nimport {Provider} from 'react-redux';\nimport ReduxThunk from 'redux-thunk';\nimport { composeWithDevTools } from 'redux-devtools-extension';\n\nimport App from './components/App';\nimport * as serviceWorker from './serviceWorker';\nimport './scss/main.scss';\nimport calculatorReducer from './store/reducers/calculatorReducer';\nimport {IntlProvider} from 'react-intl'\nimport {parseSearchQuery} from \"./store/actions/calculatorActions\";\n\nfunction loadLocaleData(locale) {\n  switch (locale) {\n    case 'en':\n      return import('./compiled-lang/en.json')\n    case 'nl':\n      return import('./compiled-lang/nl.json')\n    default:\n      return import('./compiled-lang/nl.json')\n  }\n}\n\n// npm run extract -- 'src/**/*.js*' --ignore='**/*.d.js' --out-file lang/nl.json --id-interpolation-pattern '[sha512:contenthash:base64:6]'\n\n\nconst rootReducer = combineReducers({\n    calculator: calculatorReducer\n});\n\nexport const store = createStore(rootReducer, composeWithDevTools(\n    applyMiddleware(ReduxThunk),\n));\n\nasync  function init() {\n\n  const requestParams = parseSearchQuery(window.location.search, true);\n\n  const locale = requestParams?.lang ? requestParams?.lang : window.location.pathname.includes('/en/') ? 'en' : 'nl';\n  const messages = await loadLocaleData(locale)\n\n  ReactDOM.render(\n  <React.StrictMode>\n    <Provider store={store}>\n      <IntlProvider messages={messages} locale={locale}>\n        <App/>\n      </IntlProvider>\n    </Provider>\n  </React.StrictMode>,\n  document.getElementById('root')\n  );\n\n}\n\ninit();\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}