{"version":3,"sources":["theme.config.js","helpers/number.helpers.js","LoanCalculator/LoanCalculationChart.js","helpers/calculation.helpers.js","LoanCalculator/LoanCalculator.config.js","LoanCalculator/LoanCalculator.hooks.js","LoanCalculator/LoanCalculationTable.js","Link/BaseLink/BaseLink.js","Button/Button.js","icons/IconArrow.js","icons/IconCheck.js","icons/IconClose.js","icons/IconDownload.js","icons/IconFacebook.js","icons/IconHamburger.js","icons/IconHome.js","icons/IconInfo.js","icons/IconInstagram.js","icons/IconLinkedIn.js","icons/IconLogin.js","icons/IconQuestion.js","icons/IconSearch.js","icons/IconPlus.js","icons/IconMinus.js","icons/IconTwitter.js","icons/IconUpload.js","icons/IconWifi.js","icons/IconYoutube.js","icons/IconFallback.js","icons/Icon.js","Heading/Heading.styles.js","Heading/Heading.js","AdvancedLoanCalculatorBlock/AdvancedLoanCalculatorBlock.js","App.js","index.js"],"names":["colors","orange","gray","brand","components","Heading","baseStyle","fontWeight","Input","variants","outline","field","borderRadius","borderColor","boxShadow","_hover","_focus","_placeholder","color","Select","Table","striped","tbody","tr","_odd","td","background","border","thead","borderBottom","th","fontSize","textTransform","Radio","parts","control","borderWidth","_checked","sizes","md","_before","width","height","Textarea","theme","extendTheme","styles","global","body","bg","p","marginTop","marginBottom","fonts","heading","fontSizes","sm","lg","xl","lineHeights","shorter","short","tall","fontWeights","light","normal","bold","shadows","formatCurrency","num","separator","toString","replace","LoanCalculationChart","payments","remainingLabel","language","actualPayments","slice","paymentsAsChartData","map","payment","remaining","settings","data","labels","_","index","String","datasets","label","backgroundColor","fill","options","scales","y","ticks","callback","value","Number","toLocaleString","paddingBottom","error","nil","Error","div0","ref","name","na","parseNumber","string","undefined","isNaN","parseFloat","isFlat","array","i","length","Array","isArray","flattenShallow","reduce","a","b","aIsArray","bIsArray","concat","push","argsToArray","args","result","iteratee","arrayEach","utils","arr","len","parsed","apply","arguments","n","PMT","rate","periods","present","future","type","term","Math","pow","FV","loanCalculationRuleSet","SV","from","to","maxYears","NO","DK","FREE","LoanTypes","useCalculatedLoan","loanType","amount","years","interestRate","establishmentFee","paymentFee","numberOfYearlyPayments","console","log","numberOfRepayments","nominalInterestRate","downPayment","prevClosingBalance","calcPayment","fees","isLast","_interestCost","period","IPMT","amortization","round","abs","interestCost","_payment","monthlyDiscountRate","values","guess","irrResult","dates","r","irrResultDeriv","frac","positive","negative","newRate","epsRate","resultValue","resultRate","contLoop","IRR","APR","totalPayment","acc","curr","totalAmount","monthlyPayment","effectiveInterestRate","totalCost","CalculationTh","children","base","LoanCalculationTable","_numberOfYearlyPayments","installmentPaymentLabel","installmentLabel","interestCostLabel","feesLabel","amortizationLabel","monthLabel","yearLabel","quarterLabel","spaceRemoverDk","thousandDelimiterDk","langSpecificKRsuffix","_installmentLabel","overflowX","css","variant","BaseLink","motion","Link","withMotion","innerRef","props","withRef","display","minHeight","justifyContent","alignItems","textAlign","paddingY","paddingX","lineHeight","textDecoration","primary","transition","secondary","secondaryInverted","alternative","alternativeInverted","ButtonVariants","Button","title","isButton","Component","ChakraButton","getVariantStyles","IconArrow","d","stroke","strokeWidth","strokeMiterlimit","strokeLinecap","strokeLinejoin","IconCheck","IconClose","clipPath","id","IconDownload","IconFacebook","cx","cy","fillRule","clipRule","IconHamburger","IconHome","IconInfo","IconInstagram","IconLinkedIn","IconLogin","IconQuestion","viewBox","IconSearch","IconPlus","IconMinus","IconTwitter","IconUpload","IconWifi","IconYoutube","IconFallback","Icon","icon","size","iconSize","getSize","iconProps","IconComponent","getIcon","h1","h2","h3","h4","h5","h6","breakpointSize","useBreakpointValue","_size","TooltipIcon","tooltip","useState","isLabelOpen","setIsLabelOpen","position","hasArrow","placement","whiteSpace","isOpen","top","onMouseEnter","onMouseLeave","onClick","LabelWithTooltip","AdvancedLoanCalculatorBlock","initialLoanAmount","initialLoanYears","initialInterestRate","initialNumberOfYearlyPayments","minInterestRate","maxInterestRate","initialPaymentFee","loanTypeLabel","content","loanTypeTooltip","loanAmountLabel","loanAmountTooltip","loanYearsLabel","loanYearsTooltip","yearlyPaymentsLabel","yearlyPaymentsTooltip","interestRateLabel","interestRateTooltip","paymentFeeLabel","paymentFeeTooltip","establishmentFeeLabel","establishmentFeeTooltip","yourLoanCostLabel","effectiveInterestRateLabel","totalCostLabel","paymentPlanLabel","viewPaymentPlanLabel","hidePaymentPlanLabel","monthly","quarterly","yearly","annuityLoanLabel","serialLoanLabel","numberSeparator","handleNumberChange","stripped","loanAmount","setLoanAmount","loanYears","setLoanYears","setPaymentFee","_establishmentFee","setEstablishmentFee","viewPlanRef","useRef","isPlanVisible","setIsPlanVisible","loanCalculator","initialEstablishmentFee","initialLoanType","version","setLoanType","setAmount","setYears","setInterestRate","setNumberOfYearlyPayments","minLoanAmount","setMinLoanAmount","maxLoanAmount","setMaxLoanAmount","maxLoanYears","setMaxLoanYears","calculationRules","useEffect","rule","filter","minLoanYears","useLoanCalculatorController","calculatedLoan","templateColumns","gap","colSpan","defaultValue","onChange","e","spacing","direction","currentTarget","onBlur","paddingRight","right","columns","as","marginY","current","window","scrollTo","scrollY","getBoundingClientRect","behavior","App","currentLang","LOAN_CALCULATOR_LANGUAGE","languageProps","lang","languageFile","output","key","hasOwnProperty","getLanguageProps","resetCSS","process","ReactDOM","render","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.ceaf137f.chunk.js","sourcesContent":["import { extendTheme } from \"@chakra-ui/react\";\r\n\r\nconst colors = {\r\n orange: {\r\n 100: \"#FEF9F2\",\r\n 400: \"#FF9F1A\",\r\n 500: \"#F28D00\",\r\n 600: \"#B36800\",\r\n },\r\n gray: {\r\n 50: \"#FAF9F8\",\r\n 500: \"#E0DED8\",\r\n 700: \"#696969\",\r\n },\r\n brand: {\r\n 500: \"orange.500\",\r\n },\r\n};\r\n\r\nconst fonts = {\r\n body: '\"akzidenz-grotesk\",\"Helvetica Neue\",Helvetica,Arial,sans-serif',\r\n heading: '\"akzidenz-grotesk\",\"Helvetica Neue\",Helvetica,Arial,sans-serif',\r\n};\r\n\r\nconst fontSizes = {\r\n sm: \"14px\",\r\n md: \"16px\",\r\n lg: \"20px\",\r\n xl: \"22px\",\r\n \"2xl\": \"25px\",\r\n \"3xl\": \"36px\",\r\n \"4xl\": \"54px\",\r\n};\r\n\r\nconst lineHeights = {\r\n shorter: 1.18,\r\n short: 1.35,\r\n tall: 1.65,\r\n};\r\n\r\nconst fontWeights = {\r\n light: 300,\r\n normal: 400,\r\n bold: 600,\r\n};\r\n\r\nconst shadows = {\r\n outline: \"0 0 0 3px rgba(242, 141, 0, 0.2)\",\r\n};\r\n\r\nconst styles = {\r\n global: {\r\n body: {\r\n height: \"100%\",\r\n bg: \"white\",\r\n },\r\n p: {\r\n marginTop: \"0.625rem\",\r\n marginBottom: \"0.625rem\",\r\n },\r\n },\r\n};\r\n\r\nconst components = {\r\n Heading: {\r\n baseStyle: {\r\n fontWeight: \"light\",\r\n },\r\n },\r\n Input: {\r\n variants: {\r\n outline: {\r\n field: {\r\n borderRadius: 0,\r\n borderColor: \"#000\",\r\n boxShadow: \"0 0 0 1px #000\",\r\n _hover: {\r\n borderColor: \"#000\",\r\n },\r\n _focus: {\r\n boxShadow: `0 0 0 1px ${colors.orange[\"500\"]}`,\r\n borderColor: \"orange.500\",\r\n },\r\n _placeholder: {\r\n color: \"gray.700\",\r\n },\r\n },\r\n },\r\n },\r\n },\r\n Select: {\r\n variants: {\r\n outline: {\r\n field: {\r\n borderRadius: 0,\r\n borderColor: \"#000\",\r\n boxShadow: \"0 0 0 1px #000\",\r\n _hover: {\r\n borderColor: \"#000\",\r\n },\r\n _focus: {\r\n boxShadow: `0 0 0 1px ${colors.orange[\"500\"]}`,\r\n borderColor: \"orange.500\",\r\n },\r\n _placeholder: {\r\n color: \"gray.700\",\r\n },\r\n },\r\n },\r\n },\r\n },\r\n Table: {\r\n variants: {\r\n striped: {\r\n tbody: {\r\n tr: {\r\n _odd: {\r\n td: {\r\n background: colors.gray[\"50\"],\r\n },\r\n },\r\n td: {\r\n background: \"white\",\r\n border: 0,\r\n },\r\n },\r\n },\r\n thead: {\r\n borderBottom: \"2px solid\",\r\n },\r\n th: {\r\n color: \"black\",\r\n fontWeight: \"normal\",\r\n fontSize: \"sm\",\r\n textTransform: \"none\",\r\n border: 0,\r\n },\r\n },\r\n },\r\n },\r\n Radio: {\r\n parts: [\"control\"],\r\n baseStyle: {\r\n control: {\r\n borderColor: \"black\",\r\n borderWidth: \"1px\",\r\n _checked: {\r\n borderWidth: \"2px\",\r\n borderColor: \"orange.500\",\r\n color: \"orange.500\",\r\n _hover: {\r\n borderColor: \"orange.500\",\r\n },\r\n },\r\n },\r\n },\r\n sizes: {\r\n md: {\r\n control: {\r\n _checked: {\r\n _before: {\r\n border: \"3px solid white\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n },\r\n },\r\n width: 6,\r\n height: 6,\r\n },\r\n },\r\n },\r\n },\r\n Textarea: {\r\n variants: {\r\n outline: {\r\n borderWidth: \"2px\",\r\n borderRadius: 0,\r\n borderColor: \"black\",\r\n _hover: {\r\n borderColor: \"black\",\r\n },\r\n _focus: {\r\n borderColor: \"black\",\r\n boxShadow: \"outline\",\r\n },\r\n },\r\n },\r\n },\r\n};\r\n\r\nexport const theme = extendTheme({\r\n colors,\r\n styles,\r\n components,\r\n fonts,\r\n fontSizes,\r\n lineHeights,\r\n fontWeights,\r\n shadows,\r\n});\r\n","export const formatCurrency = (num, separator = ' ') =>\r\n num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, separator); // 160 == Non-breakable space","import { Box } from \"@chakra-ui/layout\";\r\nimport PropTypes from \"prop-types\";\r\nimport { Line } from \"react-chartjs-2\";\r\nimport { theme } from \"../theme.config\";\r\nimport { formatCurrency } from \"../helpers/number.helpers\";\r\n\r\nexport const LoanCalculationChart = ({\r\n payments,\r\n remainingLabel,\r\n language,\r\n}) => {\r\n const actualPayments = [...payments].slice(1);\r\n\r\n const paymentsAsChartData = actualPayments.map((payment) => {\r\n return payment.remaining;\r\n });\r\n const paymentsAsLabels = actualPayments.map((_, index) => {\r\n return String(index + 1);\r\n });\r\n\r\n const settings = {\r\n data: {\r\n labels: paymentsAsLabels,\r\n datasets: [\r\n {\r\n label: remainingLabel,\r\n data: paymentsAsChartData,\r\n borderColor: theme.colors.orange[\"500\"],\r\n backgroundColor: theme.colors.orange[\"200\"],\r\n fill: true,\r\n },\r\n ],\r\n },\r\n options: {\r\n scales: {\r\n y: {\r\n ticks: {\r\n callback(value) {\r\n if (language == \"sv\") {\r\n return formatCurrency(value, \" \");\r\n }\r\n\r\n if (language == \"dk\") {\r\n return Number(value).toLocaleString(\"da\");\r\n }\r\n\r\n return Number(value).toLocaleString();\r\n },\r\n },\r\n },\r\n },\r\n },\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nLoanCalculationChart.propTypes = {\r\n payments: PropTypes.arrayOf({\r\n calcPayment: PropTypes.number,\r\n payment: PropTypes.number,\r\n interestCost: PropTypes.number,\r\n fees: PropTypes.number,\r\n amortization: PropTypes.number,\r\n remaining: PropTypes.number,\r\n }),\r\n remainingLabel: PropTypes.string,\r\n};\r\n","// Cherrypicked code from @formulajs/formulajs@2.6.5\r\n\r\nconst error = {\r\n nil: new Error('#NULL!'),\r\n div0: new Error('#DIV/0!'),\r\n value: new Error('#VALUE!'),\r\n ref: new Error('#REF!'),\r\n name: new Error('#NAME?'),\r\n num: new Error('#NUM!'),\r\n na: new Error('#N/A'),\r\n error: new Error('#ERROR!'),\r\n data: new Error('#GETTING_DATA'),\r\n};\r\n\r\nconst parseNumber = function (string) {\r\n if (string === undefined || string === '') {\r\n return error.value;\r\n }\r\n if (!isNaN(string)) {\r\n return parseFloat(string);\r\n }\r\n\r\n return error.value;\r\n};\r\n\r\nconst isFlat = function (array) {\r\n if (!array) {\r\n return false;\r\n }\r\n\r\n for (var i = 0; i < array.length; ++i) {\r\n if (Array.isArray(array[i])) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n};\r\n\r\nconst flattenShallow = function (array) {\r\n if (!array || !array.reduce) {\r\n return array;\r\n }\r\n\r\n return array.reduce(function (a, b) {\r\n var aIsArray = Array.isArray(a);\r\n var bIsArray = Array.isArray(b);\r\n\r\n if (aIsArray && bIsArray) {\r\n return a.concat(b);\r\n }\r\n if (aIsArray) {\r\n a.push(b);\r\n\r\n return a;\r\n }\r\n if (bIsArray) {\r\n return [a].concat(b);\r\n }\r\n\r\n return [a, b];\r\n });\r\n};\r\n\r\nconst parseNumberArray = function (arr) {\r\n var len;\r\n\r\n if (!arr || (len = arr.length) === 0) {\r\n return error.value;\r\n }\r\n\r\n var parsed;\r\n\r\n while (len--) {\r\n parsed = parseNumber(arr[len]);\r\n if (parsed === error.value) {\r\n return parsed;\r\n }\r\n arr[len] = parsed;\r\n }\r\n\r\n return arr;\r\n};\r\n\r\nconst arrayEach = function (array, iteratee) {\r\n var index = -1,\r\n length = array.length;\r\n\r\n while (++index < length) {\r\n if (iteratee(array[index], index, array) === false) {\r\n break;\r\n }\r\n }\r\n\r\n return array;\r\n};\r\n\r\nconst argsToArray = function (args) {\r\n var result = [];\r\n\r\n arrayEach(args, function (value) {\r\n result.push(value);\r\n });\r\n\r\n return result;\r\n};\r\n\r\nconst flatten = function () {\r\n var result = argsToArray.apply(null, arguments);\r\n\r\n while (!isFlat(result)) {\r\n result = flattenShallow(result);\r\n }\r\n\r\n return result;\r\n};\r\n\r\nconst anyIsError = function () {\r\n var n = arguments.length;\r\n while (n--) {\r\n if (arguments[n] instanceof Error) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n};\r\n\r\nconst utils = {\r\n parseNumber,\r\n parseNumberArray,\r\n flatten,\r\n anyIsError,\r\n};\r\n\r\nexport const PMT = function (rate, periods, present, future, type) {\r\n // Credits: algorithm inspired by Apache OpenOffice\r\n\r\n future = future || 0;\r\n type = type || 0;\r\n\r\n rate = utils.parseNumber(rate);\r\n periods = utils.parseNumber(periods);\r\n present = utils.parseNumber(present);\r\n future = utils.parseNumber(future);\r\n type = utils.parseNumber(type);\r\n if (utils.anyIsError(rate, periods, present, future, type)) {\r\n return error.value;\r\n }\r\n\r\n // Return payment\r\n var result;\r\n if (rate === 0) {\r\n result = (present + future) / periods;\r\n } else {\r\n var term = Math.pow(1 + rate, periods);\r\n if (type === 1) {\r\n result =\r\n ((future * rate) / (term - 1) + (present * rate) / (1 - 1 / term)) /\r\n (1 + rate);\r\n } else {\r\n result = (future * rate) / (term - 1) + (present * rate) / (1 - 1 / term);\r\n }\r\n }\r\n return -result;\r\n};\r\n\r\nexport const IPMT = function (rate, period, periods, present, future, type) {\r\n // Credits: algorithm inspired by Apache OpenOffice\r\n\r\n future = future || 0;\r\n type = type || 0;\r\n\r\n rate = utils.parseNumber(rate);\r\n period = utils.parseNumber(period);\r\n periods = utils.parseNumber(periods);\r\n present = utils.parseNumber(present);\r\n future = utils.parseNumber(future);\r\n type = utils.parseNumber(type);\r\n if (utils.anyIsError(rate, period, periods, present, future, type)) {\r\n return error.value;\r\n }\r\n\r\n // Compute payment\r\n var payment = PMT(rate, periods, present, future, type);\r\n\r\n // Compute interest\r\n var interest;\r\n if (period === 1) {\r\n if (type === 1) {\r\n interest = 0;\r\n } else {\r\n interest = -present;\r\n }\r\n } else {\r\n if (type === 1) {\r\n interest = FV(rate, period - 2, payment, present, 1) - payment;\r\n } else {\r\n interest = FV(rate, period - 1, payment, present, 0);\r\n }\r\n }\r\n\r\n // Return interest\r\n return interest * rate;\r\n};\r\n\r\nexport const IRR = function (values, guess) {\r\n // Credits: algorithm inspired by Apache OpenOffice\r\n\r\n guess = guess || 0;\r\n\r\n values = utils.parseNumberArray(utils.flatten(values));\r\n guess = utils.parseNumber(guess);\r\n if (utils.anyIsError(values, guess)) {\r\n return error.value;\r\n }\r\n\r\n // Calculates the resulting amount\r\n var irrResult = function (values, dates, rate) {\r\n var r = rate + 1;\r\n var result = values[0];\r\n for (var i = 1; i < values.length; i++) {\r\n result += values[i] / Math.pow(r, (dates[i] - dates[0]) / 365);\r\n }\r\n return result;\r\n };\r\n\r\n // Calculates the first derivation\r\n var irrResultDeriv = function (values, dates, rate) {\r\n var r = rate + 1;\r\n var result = 0;\r\n for (var i = 1; i < values.length; i++) {\r\n var frac = (dates[i] - dates[0]) / 365;\r\n result -= (frac * values[i]) / Math.pow(r, frac + 1);\r\n }\r\n return result;\r\n };\r\n\r\n // Initialize dates and check that values contains at least one positive value and one negative value\r\n var dates = [];\r\n var positive = false;\r\n var negative = false;\r\n for (var i = 0; i < values.length; i++) {\r\n dates[i] = i === 0 ? 0 : dates[i - 1] + 365;\r\n if (values[i] > 0) {\r\n positive = true;\r\n }\r\n if (values[i] < 0) {\r\n negative = true;\r\n }\r\n }\r\n\r\n // Return error if values does not contain at least one positive value and one negative value\r\n if (!positive || !negative) {\r\n return error.num;\r\n }\r\n\r\n // Initialize guess and resultRate\r\n guess = guess === undefined ? 0.1 : guess;\r\n var resultRate = guess;\r\n\r\n // Set maximum epsilon for end of iteration\r\n var epsMax = 1e-10;\r\n\r\n // Implement Newton's method\r\n var newRate, epsRate, resultValue;\r\n var contLoop = true;\r\n do {\r\n resultValue = irrResult(values, dates, resultRate);\r\n newRate =\r\n resultRate - resultValue / irrResultDeriv(values, dates, resultRate);\r\n epsRate = Math.abs(newRate - resultRate);\r\n resultRate = newRate;\r\n contLoop = epsRate > epsMax && Math.abs(resultValue) > epsMax;\r\n } while (contLoop);\r\n\r\n // Return internal rate of return\r\n return resultRate;\r\n};\r\n\r\nexport const FV = function (rate, periods, payment, value, type) {\r\n // Credits: algorithm inspired by Apache OpenOffice\r\n\r\n value = value || 0;\r\n type = type || 0;\r\n\r\n rate = utils.parseNumber(rate);\r\n periods = utils.parseNumber(periods);\r\n payment = utils.parseNumber(payment);\r\n value = utils.parseNumber(value);\r\n type = utils.parseNumber(type);\r\n if (utils.anyIsError(rate, periods, payment, value, type)) {\r\n return error.value;\r\n }\r\n\r\n // Return future value\r\n var result;\r\n if (rate === 0) {\r\n result = value + payment * periods;\r\n } else {\r\n var term = Math.pow(1 + rate, periods);\r\n if (type === 1) {\r\n result = value * term + (payment * (1 + rate) * (term - 1)) / rate;\r\n } else {\r\n result = value * term + (payment * (term - 1)) / rate;\r\n }\r\n }\r\n return -result;\r\n};\r\n","export const loanCalculationRuleSet = {\r\n SV: [\r\n {\r\n from: 10000,\r\n to: 29999,\r\n maxYears: 5,\r\n },\r\n {\r\n from: 30000,\r\n to: 49999,\r\n maxYears: 6,\r\n },\r\n {\r\n from: 50000,\r\n to: 69999,\r\n maxYears: 9,\r\n },\r\n {\r\n from: 70000,\r\n to: 99999,\r\n maxYears: 10,\r\n },\r\n {\r\n from: 100000,\r\n to: 349999,\r\n maxYears: 12,\r\n },\r\n {\r\n from: 350000,\r\n to: 500000,\r\n maxYears: 15,\r\n },\r\n ],\r\n NO: [\r\n {\r\n from: 10000,\r\n to: 29999,\r\n maxYears: 5,\r\n },\r\n {\r\n from: 30000,\r\n to: 49999,\r\n maxYears: 6,\r\n },\r\n {\r\n from: 50000,\r\n to: 69999,\r\n maxYears: 9,\r\n },\r\n {\r\n from: 70000,\r\n to: 99999,\r\n maxYears: 10,\r\n },\r\n {\r\n from: 100000,\r\n to: 349999,\r\n maxYears: 12,\r\n },\r\n {\r\n from: 350000,\r\n to: 500000,\r\n maxYears: 15,\r\n },\r\n ],\r\n DK: [\r\n {\r\n from: 10000,\r\n to: 29999,\r\n maxYears: 4,\r\n },\r\n {\r\n from: 30000,\r\n to: 49999,\r\n maxYears: 6,\r\n },\r\n {\r\n from: 50000,\r\n to: 69999,\r\n maxYears: 9,\r\n },\r\n {\r\n from: 70000,\r\n to: 99999,\r\n maxYears: 10,\r\n },\r\n {\r\n from: 100000,\r\n to: 349999,\r\n maxYears: 12,\r\n },\r\n {\r\n from: 350000,\r\n to: 500000,\r\n maxYears: 15,\r\n },\r\n ],\r\n FREE: [\r\n {\r\n from: 1,\r\n to: 99999999,\r\n maxYears: 30,\r\n },\r\n ],\r\n};\r\n","import { useEffect, useState } from \"react\";\r\nimport { PMT, IRR, IPMT } from \"../helpers/calculation.helpers\";\r\nimport { loanCalculationRuleSet } from \"./LoanCalculator.config\";\r\n\r\nexport const useLoanCalculatorController = ({\r\n initialLoanAmount,\r\n initialLoanYears,\r\n initialInterestRate,\r\n initialPaymentFee,\r\n initialEstablishmentFee,\r\n initialNumberOfYearlyPayments,\r\n initialLoanType,\r\n minInterestRate,\r\n maxInterestRate,\r\n version,\r\n}) => {\r\n const [loanType, setLoanType] = useState(initialLoanType);\r\n const [amount, setAmount] = useState(initialLoanAmount);\r\n const [years, setYears] = useState(initialLoanYears);\r\n const [interestRate, setInterestRate] = useState(initialInterestRate);\r\n const [paymentFee, setPaymentFee] = useState(initialPaymentFee);\r\n const [establishmentFee, setEstablishmentFee] = useState(\r\n initialEstablishmentFee\r\n );\r\n const [numberOfYearlyPayments, setNumberOfYearlyPayments] = useState(\r\n initialNumberOfYearlyPayments\r\n );\r\n const [minLoanAmount, setMinLoanAmount] = useState(0);\r\n const [maxLoanAmount, setMaxLoanAmount] = useState(0);\r\n const [maxLoanYears, setMaxLoanYears] = useState(0);\r\n const minLoanYears = 1;\r\n const calculationRules = loanCalculationRuleSet[version];\r\n\r\n useEffect(() => {\r\n setMinLoanAmount(calculationRules[0].from);\r\n setMaxLoanAmount(calculationRules[calculationRules.length - 1].to);\r\n }, [calculationRules]);\r\n\r\n useEffect(() => {\r\n const rule = calculationRules.filter(\r\n (rule) => amount >= rule.from && amount <= rule.to\r\n )[0];\r\n\r\n if (rule) {\r\n setMaxLoanYears(rule.maxYears);\r\n\r\n if (years > rule.maxYears) {\r\n setYears(rule.maxYears);\r\n }\r\n }\r\n\r\n if (maxLoanAmount !== 0 && minLoanAmount !== 0) {\r\n if (amount > maxLoanAmount) {\r\n setAmount(maxLoanAmount);\r\n } else if (amount < minLoanAmount) {\r\n setAmount(minLoanAmount);\r\n }\r\n }\r\n }, [amount, calculationRules]);\r\n\r\n useEffect(() => {\r\n if (maxLoanYears !== 0) {\r\n if (years > maxLoanYears) {\r\n setYears(maxLoanYears);\r\n } else if (years < minLoanYears) {\r\n setYears(minLoanYears);\r\n }\r\n }\r\n console.log(years);\r\n }, [years]);\r\n\r\n useEffect(() => {\r\n if (interestRate > maxInterestRate) {\r\n setInterestRate(maxInterestRate);\r\n } else if (interestRate < minInterestRate) {\r\n setInterestRate(minInterestRate);\r\n }\r\n }, [interestRate]);\r\n\r\n return {\r\n loanType,\r\n setLoanType,\r\n amount,\r\n setAmount,\r\n years,\r\n setYears,\r\n interestRate,\r\n setInterestRate,\r\n paymentFee,\r\n setPaymentFee,\r\n establishmentFee,\r\n setEstablishmentFee,\r\n numberOfYearlyPayments,\r\n setNumberOfYearlyPayments,\r\n minLoanAmount,\r\n maxLoanAmount,\r\n minLoanYears,\r\n maxLoanYears,\r\n };\r\n};\r\n\r\nexport const LoanTypes = {\r\n Annuity: \"Annuity\",\r\n Serial: \"Serial\",\r\n};\r\n\r\nexport const useCalculatedLoan = ({\r\n loanType,\r\n amount,\r\n years,\r\n interestRate,\r\n establishmentFee,\r\n paymentFee,\r\n numberOfYearlyPayments,\r\n}) => {\r\n console.log(loanType);\r\n const yearlyInterestRateDecimal = interestRate / 100;\r\n const numberOfRepayments = years * numberOfYearlyPayments;\r\n const nominalInterestRate =\r\n yearlyInterestRateDecimal / numberOfYearlyPayments;\r\n\r\n const downPayment =\r\n PMT(nominalInterestRate, numberOfRepayments, amount + establishmentFee) -\r\n paymentFee;\r\n\r\n let prevClosingBalance = 0;\r\n const payments = Array.apply(0, Array(numberOfRepayments + 1)).map(\r\n (_, index) => {\r\n if (index === 0) {\r\n prevClosingBalance = amount + establishmentFee;\r\n return { calcPayment: amount };\r\n } else {\r\n const fees = paymentFee;\r\n const isLast = index === numberOfRepayments;\r\n\r\n if (loanType === LoanTypes.Annuity) {\r\n const _interestCost = IPMT(\r\n nominalInterestRate,\r\n index,\r\n numberOfRepayments,\r\n amount + establishmentFee\r\n );\r\n\r\n const amortization = isLast\r\n ? prevClosingBalance\r\n : Math.round(\r\n Math.abs(downPayment) - Math.abs(_interestCost) - fees\r\n );\r\n\r\n // Om sista betalningen\r\n\r\n const payment = !isLast\r\n ? Math.round(Math.abs(downPayment))\r\n : Math.round(\r\n prevClosingBalance + paymentFee + Math.abs(_interestCost)\r\n );\r\n\r\n const remaining = isLast ? 0 : prevClosingBalance - amortization;\r\n prevClosingBalance = remaining;\r\n\r\n return {\r\n calcPayment: downPayment,\r\n payment,\r\n interestCost: Math.round(Math.abs(_interestCost)),\r\n fees,\r\n amortization,\r\n remaining,\r\n };\r\n } else {\r\n const _interestCost = prevClosingBalance * nominalInterestRate;\r\n const amortization = Math.round(\r\n (amount + establishmentFee) / numberOfRepayments\r\n );\r\n const remaining = isLast ? 0 : prevClosingBalance - amortization;\r\n const _payment = amortization + _interestCost + fees;\r\n prevClosingBalance = remaining;\r\n\r\n return {\r\n calcPayment: -_payment,\r\n interestCost: Math.round(_interestCost),\r\n payment: Math.round(_payment),\r\n fees,\r\n amortization: amortization,\r\n remaining,\r\n };\r\n }\r\n }\r\n }\r\n );\r\n\r\n const monthlyDiscountRate = IRR(\r\n payments.map(({ calcPayment }) => calcPayment)\r\n );\r\n const APR = Math.pow(1 + monthlyDiscountRate, numberOfYearlyPayments) - 1;\r\n console.log(APR);\r\n const totalPayment =\r\n loanType === LoanTypes.Annuity\r\n ? downPayment * numberOfRepayments\r\n : payments.reduce(\r\n (acc, curr, index) =>\r\n index > 0 ? acc + Math.abs(curr.calcPayment) : 0,\r\n 0\r\n ) + establishmentFee;\r\n\r\n return {\r\n totalAmount: Math.round(Math.abs(totalPayment)),\r\n monthlyPayment: Math.round(Math.abs(downPayment)),\r\n effectiveInterestRate: Math.round(APR * 10000) / 100,\r\n totalCost: Math.round(Math.abs(totalPayment)) - amount,\r\n payments,\r\n };\r\n};\r\n","import React from \"react\";\r\nimport { formatCurrency } from \"../helpers/number.helpers\";\r\nimport { Box, Table, Tbody, Tr, Td, Th, Thead } from \"@chakra-ui/react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nconst CalculationTh = ({ children }) => (\r\n {children}\r\n);\r\nCalculationTh.propTypes = {\r\n children: PropTypes.node,\r\n};\r\n\r\nexport const LoanCalculationTable = ({\r\n payments,\r\n installmentLabel,\r\n installmentPaymentLabel,\r\n interestCostLabel,\r\n feesLabel,\r\n amortizationLabel,\r\n remainingLabel,\r\n numberOfYearlyPayments,\r\n monthLabel,\r\n yearLabel,\r\n quarterLabel,\r\n language\r\n}) => { \r\n const spaceRemoverDk = language === \"dk\" ? \"\" : \" \";\r\n const thousandDelimiterDk = language === \"dk\" ? \".\" : \" \";\r\n const langSpecificKRsuffix = language === \"dk\" ? \".\" : \"\";\r\n const getInstallmentLabel = (_numberOfYearlyPayments) => {\r\n if (_numberOfYearlyPayments === 12) {\r\n return monthLabel;\r\n } else if (_numberOfYearlyPayments === 4) {\r\n return quarterLabel;\r\n } else if (_numberOfYearlyPayments === 1) {\r\n return yearLabel;\r\n }\r\n }\r\n const _installmentLabel = getInstallmentLabel(numberOfYearlyPayments);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {_installmentLabel}\r\n {installmentPaymentLabel}\r\n {interestCostLabel}\r\n {feesLabel}\r\n {amortizationLabel}\r\n {remainingLabel}\r\n \r\n \r\n \r\n {payments.map((downPayment, index) =>\r\n index > 0 ? (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : null\r\n )}\r\n \r\n
{index}\r\n {formatCurrency(downPayment.payment, spaceRemoverDk)} kr\r\n {langSpecificKRsuffix}\r\n \r\n {formatCurrency(downPayment.interestCost, spaceRemoverDk)} kr\r\n {langSpecificKRsuffix}\r\n \r\n {formatCurrency(downPayment.fees, spaceRemoverDk)} kr\r\n {langSpecificKRsuffix}\r\n \r\n {formatCurrency(downPayment.amortization, spaceRemoverDk)} kr\r\n {langSpecificKRsuffix}\r\n \r\n {formatCurrency(downPayment.remaining, thousandDelimiterDk)} kr\r\n {langSpecificKRsuffix}\r\n
\r\n \r\n );};\r\n\r\nLoanCalculationTable.propTypes = {\r\n payments: PropTypes.arrayOf({\r\n calcPayment: PropTypes.number,\r\n payment: PropTypes.number,\r\n interestCost: PropTypes.number,\r\n fees: PropTypes.number,\r\n amortization: PropTypes.number,\r\n remaining: PropTypes.number,\r\n }),\r\n installmentLabel: PropTypes.string,\r\n installmentPaymentLabel: PropTypes.string,\r\n interestCostLabel: PropTypes.string,\r\n feesLabel: PropTypes.string,\r\n amortizationLabel: PropTypes.string,\r\n remainingLabel: PropTypes.string,\r\n numberSeparator: PropTypes.string,\r\n};\r\n","import { Link } from \"@chakra-ui/react\";\r\nimport { motion } from \"framer-motion\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nconst MotionLink = motion(Link);\r\n\r\nexport const BaseLink = ({ withMotion, innerRef, ...props }) => {\r\n // TODO: Temporary to make links testable locally\r\n if (process.env.NODE_ENV !== \"production\") {\r\n const href =\r\n props.href.replace(\"http://remember-next.azurewebsites.net\", \"\") ||\r\n props.href ||\r\n \"\";\r\n props = {\r\n ...props,\r\n href,\r\n };\r\n }\r\n\r\n const withRef = innerRef ? { ref: innerRef } : {};\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n};\r\n\r\nBaseLink.propTypes = {\r\n href: PropTypes.string,\r\n children: PropTypes.node,\r\n innerRef: PropTypes.any,\r\n /** Set to true if Framer Motion is needed for animating */\r\n withMotion: PropTypes.bool,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { BaseLink } from '../Link';\r\nimport { Button as ChakraButton } from '@chakra-ui/react';\r\nconst base = {\r\n display: 'inline-flex',\r\n width: '100%',\r\n minHeight: '14',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n fontWeight: 'normal',\r\n fontSize: 'lg',\r\n textAlign: 'center',\r\n paddingY: '3',\r\n paddingX: '2',\r\n lineHeight: '1.2',\r\n borderRadius: 0,\r\n _hover: {\r\n textDecoration: 'none',\r\n },\r\n};\r\n\r\nconst primary = {\r\n ...base,\r\n bg: 'orange.500',\r\n transition: 'background-color .2s',\r\n _hover: {\r\n bg: 'orange.400',\r\n },\r\n};\r\n\r\nexport const secondary = {\r\n ...base,\r\n bg: 'transparent',\r\n boxShadow: '0 0 0 1px black inset',\r\n\r\n _hover: {\r\n boxShadow: '0 0 0 2px black inset',\r\n },\r\n};\r\n\r\nconst secondaryInverted = {\r\n ...secondary,\r\n borderColor: 'white',\r\n boxShadow: '0 0 0 1px white inset',\r\n _hover: {\r\n boxShadow: '0 0 0 2px white inset',\r\n },\r\n color: 'white',\r\n};\r\n\r\nexport const alternative = {\r\n ...base,\r\n bg: 'black',\r\n color: 'white',\r\n _hover: {\r\n bg: '#333333',\r\n },\r\n};\r\n\r\nconst alternativeInverted = {\r\n ...base,\r\n bg: 'white',\r\n color: 'black',\r\n _hover: {\r\n bg: 'gray.500',\r\n },\r\n};\r\n\r\nexport const ButtonVariants = {\r\n primary: 'primary',\r\n secondary: 'secondary',\r\n secondaryInverted: 'secondary-inverted',\r\n alternative: 'alternative',\r\n alternativeInverted: 'alternative-inverted',\r\n};\r\n\r\nconst getVariantStyles = (variant) => {\r\n switch (variant) {\r\n case ButtonVariants.secondary:\r\n return secondary;\r\n case ButtonVariants.secondaryInverted:\r\n return secondaryInverted;\r\n case ButtonVariants.alternative:\r\n return alternative;\r\n case ButtonVariants.alternativeInverted:\r\n return alternativeInverted;\r\n case ButtonVariants.primary:\r\n return primary;\r\n default:\r\n return primary;\r\n }\r\n};\r\n\r\nexport const Button = ({\r\n title,\r\n isButton,\r\n variant = ButtonVariants.primary,\r\n ...props\r\n}) => {\r\n const Component = isButton ? ChakraButton : BaseLink;\r\n const styles = getVariantStyles(variant);\r\n\r\n return (\r\n \r\n {title}\r\n \r\n );\r\n};\r\n\r\nButton.propTypes = {\r\n title: PropTypes.string,\r\n variant: PropTypes.oneOf(Object.values(ButtonVariants)),\r\n isButton: PropTypes.bool,\r\n};\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconArrow = (props) => (\r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconCheck = (props) => (\r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconClose = (props) => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconDownload = (props) => (\r\n \r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconFacebook = (props) => (\r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconHamburger = (props) => (\r\n \r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconHome = (props) => (\r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconInfo = (props) => (\r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconInstagram = (props) => (\r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconLinkedIn = (props) => (\r\n \r\n \r\n\r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconLogin = (props) => (\r\n \r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconQuestion = (props) => (\r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconSearch = (props) => (\r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconPlus = (props) => (\r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconMinus = (props) => (\r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconTwitter = (props) => (\r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconUpload = (props) => (\r\n \r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconWifi = (props) => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconYoutube = (props) => (\r\n \r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport { Icon } from '@chakra-ui/react';\r\n\r\nexport const IconFallback = (props) => (\r\n \r\n \r\n \r\n \r\n);\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { IconArrow } from './IconArrow';\r\nimport { IconCheck } from './IconCheck';\r\nimport { IconClose } from './IconClose';\r\nimport { IconDownload } from './IconDownload';\r\nimport { IconFacebook } from './IconFacebook';\r\nimport { IconHamburger } from './IconHamburger';\r\nimport { IconHome } from './IconHome';\r\nimport { IconInfo } from './IconInfo';\r\nimport { IconInstagram } from './IconInstagram';\r\nimport { IconLinkedIn } from './IconLinkedIn';\r\nimport { IconLogin } from './IconLogin';\r\nimport { IconQuestion } from './IconQuestion';\r\nimport { IconSearch } from './IconSearch';\r\nimport { IconPlus } from './IconPlus';\r\nimport { IconMinus } from './IconMinus';\r\nimport { IconTwitter } from './IconTwitter';\r\nimport { IconUpload } from './IconUpload';\r\nimport { IconWifi } from './IconWifi';\r\nimport { IconYoutube } from './IconYoutube';\r\nimport { IconFallback } from './IconFallback';\r\n\r\n//TODO: Add smaller IconCheck\r\nconst getIcon = (icon) => {\r\n switch (icon) {\r\n case 'arrow':\r\n return IconArrow;\r\n case 'hamburger':\r\n return IconHamburger;\r\n case 'download':\r\n return IconDownload;\r\n case 'upload':\r\n return IconUpload;\r\n case 'login':\r\n return IconLogin;\r\n case 'info':\r\n return IconInfo;\r\n case 'question':\r\n return IconQuestion;\r\n case 'close':\r\n return IconClose;\r\n case 'home':\r\n return IconHome;\r\n case 'check':\r\n return IconCheck;\r\n case 'wifi':\r\n return IconWifi;\r\n case 'facebook':\r\n return IconFacebook;\r\n case 'linkedin':\r\n return IconLinkedIn;\r\n case 'youtube':\r\n return IconYoutube;\r\n case 'instagram':\r\n return IconInstagram;\r\n case 'twitter':\r\n return IconTwitter;\r\n case 'plus':\r\n return IconPlus;\r\n case 'minus':\r\n return IconMinus;\r\n case 'search':\r\n return IconSearch;\r\n\r\n default:\r\n return IconFallback;\r\n }\r\n};\r\n\r\nconst getSize = (size) => {\r\n switch (size) {\r\n case 'xs':\r\n return 3;\r\n case 'sm':\r\n return 4;\r\n case 'md':\r\n return 7;\r\n case 'lg':\r\n return 9;\r\n\r\n default:\r\n return 7;\r\n }\r\n};\r\n\r\nexport const Icon = ({ icon, size, ...props }) => {\r\n const iconSize = getSize(size);\r\n\r\n const iconProps = {\r\n ...props,\r\n width: iconSize,\r\n height: iconSize,\r\n viewBox: '0 0 30 30',\r\n };\r\n\r\n const IconComponent = getIcon(icon);\r\n\r\n return ;\r\n};\r\n\r\nIcon.propTypes = {\r\n icon: PropTypes.oneOf([\r\n 'arrow',\r\n 'hamburger',\r\n 'download',\r\n 'upload',\r\n 'login',\r\n 'info',\r\n 'question',\r\n 'close',\r\n 'home',\r\n 'check',\r\n 'wifi',\r\n 'facebook',\r\n 'linkedin',\r\n 'youtube',\r\n 'instagram',\r\n 'twitter',\r\n 'plus',\r\n 'minus',\r\n 'search',\r\n ]),\r\n size: PropTypes.oneOf(['xs', 'sm', 'md', 'lg']),\r\n};\r\n","export default {\r\n h1: {\r\n fontSize: { base: '2xl', lg: '4xl' },\r\n lineHeight: { base: 'short', lg: 'shorter' },\r\n fontWeight: { base: 'light', lg: 'light' },\r\n },\r\n h2: {\r\n fontSize: { base: '2xl', lg: '3xl' },\r\n lineHeight: { base: 'short' },\r\n fontWeight: { base: 'light', lg: 'light' },\r\n },\r\n h3: {\r\n fontSize: { base: 'lg', lg: '2xl' },\r\n lineHeight: { base: 'short' },\r\n fontWeight: { base: 'light', lg: 'light' },\r\n },\r\n h4: {\r\n fontSize: { base: 'md', lg: 'xl' },\r\n lineHeight: { base: 'short' },\r\n fontWeight: { base: 'bold', lg: 'light' },\r\n },\r\n h5: {\r\n fontSize: { base: 'md', lg: 'md' },\r\n lineHeight: { base: 'short' },\r\n fontWeight: { base: 'bold' },\r\n },\r\n h6: {\r\n fontSize: { base: 'sm', lg: 'sm' },\r\n lineHeight: { base: 'short' },\r\n fontWeight: { base: 'bold' },\r\n },\r\n};\r\n","import { Text } from \"@chakra-ui/layout\";\r\nimport { useBreakpointValue } from \"@chakra-ui/media-query\";\r\nimport PropTypes from \"prop-types\";\r\nimport styles from \"./Heading.styles\";\r\n\r\nexport const Heading = ({ children, size = 0, ...props }) => {\r\n const breakpointSize = useBreakpointValue(size);\r\n const _size = typeof size === \"object\" ? breakpointSize : size;\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nHeading.propTypes = {\r\n size: PropTypes.oneOfType([\r\n PropTypes.oneOf([\"1\", \"2\", \"3\", \"4\", \"5\", \"6\"]),\r\n PropTypes.object,\r\n ]).isRequired,\r\n children: PropTypes.node,\r\n};\r\n","import React, { useRef, useState } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { LoanCalculationChart } from \"../LoanCalculator/LoanCalculationChart\";\r\nimport {\r\n Grid,\r\n GridItem,\r\n SimpleGrid,\r\n Input,\r\n FormControl,\r\n FormLabel,\r\n Select,\r\n Radio,\r\n RadioGroup,\r\n Stack,\r\n Box,\r\n Tooltip,\r\n Text,\r\n} from \"@chakra-ui/react\";\r\nimport { formatCurrency } from \"../helpers/number.helpers\";\r\nimport {\r\n LoanTypes,\r\n useCalculatedLoan,\r\n useLoanCalculatorController,\r\n} from \"../LoanCalculator/LoanCalculator.hooks\";\r\nimport { LoanCalculationTable } from \"../LoanCalculator/LoanCalculationTable\";\r\nimport { Button, ButtonVariants } from \"../Button/Button\";\r\nimport { Icon } from \"../icons/Icon\";\r\nimport { Heading } from \"../Heading/Heading\";\r\n\r\n\r\nconst TooltipIcon = ({ tooltip }) => {\r\n const [isLabelOpen, setIsLabelOpen] = useState(false);\r\n\r\n return (\r\n \r\n \r\n {tooltip}} isOpen={isLabelOpen} >\r\n setIsLabelOpen(true)}\r\n onMouseLeave={() => setIsLabelOpen(false)}\r\n onClick={() => setIsLabelOpen(true)} />\r\n \r\n \r\n)};\r\nTooltipIcon.propTypes = {\r\n tooltip: PropTypes.string,\r\n};\r\n\r\nconst LabelWithTooltip = ({ label, tooltip }) => (\r\n \r\n {label}:\r\n \r\n \r\n);\r\n\r\nLabelWithTooltip.propTypes = {\r\n label: PropTypes.string,\r\n tooltip: PropTypes.string,\r\n};\r\n\r\n// TODO: Handle languages / currencys\r\nexport const AdvancedLoanCalculatorBlock = ({\r\n title,\r\n initialLoanAmount = 50000,\r\n initialLoanYears = 5,\r\n initialInterestRate = 7.95,\r\n initialNumberOfYearlyPayments = 12,\r\n minInterestRate = 0.01,\r\n maxInterestRate = 99.99,\r\n establishmentFee = 395,\r\n initialPaymentFee = 29,\r\n content,\r\n loanTypeLabel,\r\n loanTypeTooltip,\r\n loanAmountLabel,\r\n loanAmountTooltip,\r\n loanYearsLabel,\r\n loanYearsTooltip,\r\n yearlyPaymentsLabel,\r\n yearlyPaymentsTooltip,\r\n interestRateLabel,\r\n interestRateTooltip,\r\n paymentFeeLabel,\r\n paymentFeeTooltip,\r\n establishmentFeeLabel,\r\n establishmentFeeTooltip,\r\n installmentLabel,\r\n installmentPaymentLabel,\r\n interestCostLabel,\r\n feesLabel,\r\n amortizationLabel,\r\n remainingLabel,\r\n yourLoanCostLabel,\r\n effectiveInterestRateLabel,\r\n totalCostLabel,\r\n paymentPlanLabel,\r\n viewPaymentPlanLabel,\r\n hidePaymentPlanLabel,\r\n monthly,\r\n quarterly,\r\n yearly,\r\n annuityLoanLabel,\r\n serialLoanLabel,\r\n monthLabel,\r\n yearLabel,\r\n quarterLabel,\r\n language\r\n}) => {\r\n const langSpecificKRsuffix = language === \"dk\" ? \".\" : \"\";\r\n const numberSeparator = language === 'dk' ? '.' : ' ';\r\n const handleNumberChange = (value) => {\r\n const string = String(value);\r\n const stripped = string.replace(/\\D+/g, '');\r\n\r\n const output = stripped;\r\n return formatCurrency(output, numberSeparator);\r\n }\r\n const [loanAmount, setLoanAmount] = useState(handleNumberChange(initialLoanAmount));\r\n const [loanYears, setLoanYears] = useState(initialLoanYears);\r\n const [paymentFee, setPaymentFee] = useState(initialPaymentFee);\r\n const [_establishmentFee, setEstablishmentFee] = useState(establishmentFee);\r\n\r\n const viewPlanRef = useRef(null);\r\n const [isPlanVisible, setIsPlanVisible] = useState(false);\r\n const loanCalculator = useLoanCalculatorController({\r\n initialLoanType: LoanTypes.Annuity,\r\n initialLoanAmount,\r\n initialLoanYears,\r\n initialInterestRate,\r\n initialPaymentFee,\r\n initialEstablishmentFee: establishmentFee,\r\n initialNumberOfYearlyPayments,\r\n minInterestRate,\r\n maxInterestRate,\r\n version: \"FREE\",\r\n });\r\n\r\n const calculatedLoan = useCalculatedLoan({\r\n loanType: loanCalculator.loanType,\r\n amount: loanCalculator.amount,\r\n years: loanCalculator.years,\r\n interestRate: loanCalculator.interestRate,\r\n establishmentFee: loanCalculator.establishmentFee,\r\n paymentFee: loanCalculator.paymentFee,\r\n numberOfYearlyPayments: loanCalculator.numberOfYearlyPayments,\r\n });\r\n\r\n \r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n loanCalculator.setLoanType(e)}\r\n >\r\n \r\n \r\n {annuityLoanLabel}\r\n {serialLoanLabel}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n setLoanAmount(handleNumberChange(e.currentTarget.value))\r\n }\r\n onBlur={(e) =>\r\n loanCalculator.setAmount(\r\n Number(e.currentTarget.value.replace(/\\D+/g, \"\"))\r\n )\r\n }\r\n textAlign=\"right\"\r\n paddingRight=\"8\"\r\n />\r\n \r\n kr{langSpecificKRsuffix}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n setLoanYears(handleNumberChange(e.currentTarget.value))\r\n }\r\n onBlur={(e) =>\r\n loanCalculator.setYears(\r\n Number(e.currentTarget.value.replace(/\\D+/g, \"\")) | 0\r\n )\r\n }\r\n textAlign=\"right\"\r\n paddingRight=\"8\"\r\n />\r\n \r\n år\r\n \r\n \r\n \r\n \r\n \r\n \r\n loanCalculator.setNumberOfYearlyPayments(\r\n Number(e.currentTarget.value)\r\n )\r\n }\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n loanCalculator.setInterestRate(Number(e.currentTarget.value))\r\n }\r\n textAlign=\"right\"\r\n paddingRight=\"8\"\r\n />\r\n \r\n %\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n setPaymentFee(handleNumberChange(e.currentTarget.value))\r\n }\r\n onBlur={(e) =>\r\n loanCalculator.setPaymentFee(\r\n Number(e.currentTarget.value.replace(/\\D+/g, \"\"))\r\n )\r\n }\r\n textAlign=\"right\"\r\n paddingRight=\"8\"\r\n />\r\n \r\n kr{langSpecificKRsuffix}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n setEstablishmentFee(handleNumberChange(e.currentTarget.value))\r\n }\r\n onBlur={(e) =>\r\n loanCalculator.setEstablishmentFee(\r\n Number(e.currentTarget.value.replace(/\\D+/g, \"\"))\r\n )\r\n }\r\n textAlign=\"right\"\r\n paddingRight=\"8\"\r\n />\r\n \r\n kr{langSpecificKRsuffix}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {yourLoanCostLabel}:\r\n \r\n \r\n \r\n {interestCostLabel}:\r\n \r\n {formatCurrency(calculatedLoan.totalCost, numberSeparator)} kr\r\n \r\n {language === \"dk\" && \".\"}\r\n \r\n \r\n \r\n {effectiveInterestRateLabel}:\r\n \r\n {calculatedLoan.effectiveInterestRate.toString().replace(\".\", \",\")}%\r\n \r\n \r\n \r\n {totalCostLabel}:\r\n \r\n {formatCurrency(calculatedLoan.totalAmount, numberSeparator)} kr\r\n \r\n {language === \"dk\" && \".\"}\r\n \r\n \r\n \r\n \r\n {\r\n if (!isPlanVisible && viewPlanRef.current) {\r\n window.scrollTo({\r\n top:\r\n window.scrollY +\r\n viewPlanRef.current.getBoundingClientRect().top,\r\n behavior: \"smooth\",\r\n });\r\n }\r\n setIsPlanVisible(!isPlanVisible);\r\n }}\r\n />\r\n \r\n {isPlanVisible && (\r\n <>\r\n \r\n {paymentPlanLabel}\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nAdvancedLoanCalculatorBlock.propTypes = {\r\n title: PropTypes.string,\r\n initialLoanAmount: PropTypes.number,\r\n initialLoanYears: PropTypes.number,\r\n initialInterestRate: PropTypes.number,\r\n initialNumberOfYearlyPayments: PropTypes.number,\r\n minInterestRate: PropTypes.number,\r\n maxInterestRate: PropTypes.number,\r\n establishmentFee: PropTypes.number,\r\n initialPaymentFee: PropTypes.number,\r\n content: PropTypes.string,\r\n loanTypeLabel: PropTypes.string,\r\n loanTypeTooltip: PropTypes.string,\r\n loanAmountLabel: PropTypes.string,\r\n loanAmountTooltip: PropTypes.string,\r\n loanYearsLabel: PropTypes.string,\r\n loanYearsTooltip: PropTypes.string,\r\n yearlyPaymentsLabel: PropTypes.string,\r\n yearlyPaymentsTooltip: PropTypes.string,\r\n interestRateLabel: PropTypes.string,\r\n interestRateTooltip: PropTypes.string,\r\n paymentFeeLabel: PropTypes.string,\r\n paymentFeeTooltip: PropTypes.string,\r\n establishmentFeeLabel: PropTypes.string,\r\n establishmentFeeTooltip: PropTypes.string,\r\n installmentLabel: PropTypes.string,\r\n installmentPaymentLabel: PropTypes.string,\r\n interestCostLabel: PropTypes.string,\r\n feesLabel: PropTypes.string,\r\n amortizationLabel: PropTypes.string,\r\n remainingLabel: PropTypes.string,\r\n yourLoanCostLabel: PropTypes.string,\r\n effectiveInterestRateLabel: PropTypes.string,\r\n totalCostLabel: PropTypes.string,\r\n paymentPlanLabel: PropTypes.string,\r\n viewPaymentPlanLabel: PropTypes.string,\r\n hidePaymentPlanLabel: PropTypes.string,\r\n language: PropTypes.oneOf(['sv','dk','no'])\r\n};\r\n","import { ChakraProvider } from \"@chakra-ui/react\";\r\nimport { AdvancedLoanCalculatorBlock } from \"./AdvancedLoanCalculatorBlock/AdvancedLoanCalculatorBlock\";\r\nimport { theme } from \"./theme.config\";\r\nimport languageFile from './language.json';\r\nimport { Global } from \"@emotion/react\";\r\n\r\nfunction App() {\r\n const currentLang = window.LOAN_CALCULATOR_LANGUAGE || 'sv';\r\n\r\n const getLanguageProps = () => {\r\n \r\n const lang = languageFile || {};\r\n\r\n let output = {};\r\n for(const key in lang) {\r\n if (lang.hasOwnProperty(key)) {\r\n output = {\r\n ...output,\r\n [key]: lang[key][currentLang],\r\n }\r\n }\r\n }\r\n\r\n return output;\r\n };\r\n\r\n const languageProps = getLanguageProps();\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default App;\r\n","import React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport App from \"./App\";\r\n\r\nReactDOM.render(\r\n \r\n \r\n ,\r\n document.getElementById(\"general-loan-calculator\")\r\n);\r\n"],"sourceRoot":""}