diff --git a/src/App.js b/src/App.js index e018745..e7114fa 100644 --- a/src/App.js +++ b/src/App.js @@ -1,4 +1,4 @@ -import { React, useState } from 'react'; +import { React, useState, useEffect } from 'react'; import { ChakraProvider, @@ -18,14 +18,15 @@ import { import { FlatSelectionCard, FlatDetailsCard, SelfEvaluationCard, ResultsCard } from './Solimieten'; import { Nav } from './Nav'; - +import { minRent, maxRent } from './Data'; function App() { const [selectedFlat, setSelectedFlat] = useState(); const [selectedRoom, setSelectedRoom] = useState(); - const [numAdults, setNumAdults] = useState(1); + const [numAdults, setNumAdults] = useState(); - const [rent, setRent] = useState(0); + const [rent, setRent] = useState(); + const [flatRent, setFlatRent] = useState(); const theme = extendTheme({ "colors": { @@ -44,7 +45,30 @@ function App() { } }); + useEffect(() => { + setFlatRent(null); + if (selectedFlat && numAdults && (selectedFlat.wgRoomList.length === 0 || selectedRoom)) { + console.log("Recalculating Rent..."); + var commonAreaShare = 60 * numAdults; + var kitchenCost = 50; + var sizePrivate = selectedFlat.sizePrivate; + var internalAreaShare = 0; + if (selectedFlat.wgRoomList.length > 0) { + internalAreaShare = selectedFlat.calcInternalAreaShare(selectedRoom); + sizePrivate = selectedRoom.size; + kitchenCost = kitchenCost / selectedFlat.wgRoomList.length; + } + + var newRent = { + min: (sizePrivate + internalAreaShare) * minRent + kitchenCost, + minCovering: (sizePrivate + internalAreaShare) * minRent + kitchenCost + commonAreaShare, + maxCovering: (sizePrivate + internalAreaShare) * maxRent + kitchenCost + commonAreaShare + } + + setFlatRent(newRent); + } + }, [selectedFlat, selectedRoom, numAdults]) return ( @@ -55,7 +79,7 @@ function App() { - Allemende Solimieten-Helferlein + Allmende Solimieten-Helferlein Im Rahmen des Konzept für solidarische Mieten, kann jede Partei in der Allmende ihre Miethöhe selbst bestimmen. Dieses Tool soll als Orientierungshilfe bei der Selbsteinschätzung dienen. @@ -75,13 +99,13 @@ function App() { - + Selbsteinschätzung - + diff --git a/src/Solimieten.js b/src/Solimieten.js index fcb1a5e..3108d4a 100644 --- a/src/Solimieten.js +++ b/src/Solimieten.js @@ -25,7 +25,7 @@ import { Tooltip } from '@chakra-ui/react'; -import { flatData, minRent, maxRent } from './Data'; +import { flatData } from './Data'; export function FlatSelectionCard({ setSelectedFlat, onRoomSelected, onNumAdultsSelected }) { const [levelOptions, setLevelOption] = useState([{ value: 0, label: "EG" }, { value: 1, label: "1. OG" }, { value: 2, label: "2. OG" }, { value: 3, label: "3. OG" }]); @@ -99,20 +99,17 @@ export function FlatSelectionCard({ setSelectedFlat, onRoomSelected, onNumAdults } -export function FlatDetailsCard({ flat, room, numAdults }) { +export function FlatDetailsCard({ flat, room, flatRent }) { var body = Bitte auswählen ; var badges = ""; - var kitchenCost = 50; - var commonAreaShare = 60 * numAdults; - if (flat && (room || flat.wgRoomList.length === 0)) { + if (flat && (flat.wgRoomList.length === 0 || room) && flatRent) { var sizePrivate = flat.sizePrivate; if (room) { sizePrivate = room.size; - kitchenCost = kitchenCost / flat.wgRoomList.length; } var sizeSharedBox = null; @@ -171,7 +168,7 @@ export function FlatDetailsCard({ flat, room, numAdults }) { Die Mindestmiete ergibt sich aus dem WBS Satz für die private Fläche (9,45 €/m²), den Nebenkosten (1,20 €/m²) und der Küchen-Nutzungspauschale von 50€ pro Küche (in Clustern und WGs auf Parteien aufgeteilt) - {((sizePrivate + internalAreaShare) * minRent + kitchenCost).toFixed(2)} € + {(flatRent.min).toFixed(2)} € @@ -180,7 +177,7 @@ export function FlatDetailsCard({ flat, room, numAdults }) { Die Deckungsmiete beinhaltet einen Beitrag von 60 € pro erwachsener Person für die Gemeinschaftsflächen - {((sizePrivate + internalAreaShare) * minRent + kitchenCost + commonAreaShare).toFixed(2)} € + {(flatRent.minCovering).toFixed(2)} € @@ -189,7 +186,7 @@ export function FlatDetailsCard({ flat, room, numAdults }) { Das ist die Miete, die für diese Wohnung ohne solidarischen Ausgleich anfallen würde{flat.isWbs ? ", wenn Sie frei finanziert wäre " : " "}und ergibt sich aus 13,06 €/m² plus 1,20 €/m² Nebenkosten und Gemeinschaftsflächen-Pauschale. - {((sizePrivate + internalAreaShare) * maxRent + kitchenCost + commonAreaShare).toFixed(2)} € + {(flatRent.maxCovering).toFixed(2)} € @@ -298,13 +295,14 @@ export function SelfEvaluationCard({ rent, setRent }) { } -export function ResultsCard({ rent, flat, room }) { +export function ResultsCard({ rent, flat, room, numAdults, flatRent }) { var body = - if (flat && (room || flat.wgRoomList.length === 0)) { + if (flat && (room || flat.wgRoomList.length === 0) && flatRent) { var totalSize = flat.calcTotalPayedArea(room) + var kitchenCost = flat.wgRoomList.length > 0 ? 50 / flat.wgRoomList.length : 50; + var relativeRent = (rent - kitchenCost - (60 * numAdults)) / totalSize; - var relativeRent = rent / totalSize; - var rangePosition = ((relativeRent - minRent) / (maxRent - minRent)) * 100; + var rangePosition = ((rent - flatRent.min) / (flatRent.maxCovering - flatRent.min)) * 100; if (rangePosition < 0) { rangePosition = 0; } if (rangePosition > 100) { rangePosition = 100; } var color = "green"; @@ -330,13 +328,13 @@ export function ResultsCard({ rent, flat, room }) { - WBS Miete - {minRent.toFixed(2)} € + Mindestmiete + {flatRent.min.toFixed(2)} € - Max - {maxRent.toFixed(2)} € + Deckungsmiete freifinanziert + {flatRent.maxCovering.toFixed(2)} €