diff --git a/asset-manifest.json b/asset-manifest.json index 6920a0d..c0a4ec8 100644 --- a/asset-manifest.json +++ b/asset-manifest.json @@ -1,8 +1,8 @@ { "files": { "main.css": "/your_wealth/static/css/main.7ede9628.chunk.css", - "main.js": "/your_wealth/static/js/main.dbd130ae.chunk.js", - "main.js.map": "/your_wealth/static/js/main.dbd130ae.chunk.js.map", + "main.js": "/your_wealth/static/js/main.554fb693.chunk.js", + "main.js.map": "/your_wealth/static/js/main.554fb693.chunk.js.map", "runtime-main.js": "/your_wealth/static/js/runtime-main.3909f482.js", "runtime-main.js.map": "/your_wealth/static/js/runtime-main.3909f482.js.map", "static/js/2.beb6e91a.chunk.js": "/your_wealth/static/js/2.beb6e91a.chunk.js", @@ -16,6 +16,6 @@ "static/js/runtime-main.3909f482.js", "static/js/2.beb6e91a.chunk.js", "static/css/main.7ede9628.chunk.css", - "static/js/main.dbd130ae.chunk.js" + "static/js/main.554fb693.chunk.js" ] } \ No newline at end of file diff --git a/index.html b/index.html index c4a1923..189a442 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -YOUR_WEALTH
\ No newline at end of file +YOUR_WEALTH
\ No newline at end of file diff --git a/static/js/main.554fb693.chunk.js b/static/js/main.554fb693.chunk.js new file mode 100644 index 0000000..71fcae8 --- /dev/null +++ b/static/js/main.554fb693.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonpyour_wealth=this.webpackJsonpyour_wealth||[]).push([[0],{33:function(e,t,n){},36:function(e,t,n){},42:function(e,t,n){},43:function(e,t,n){},44:function(e,t,n){},45:function(e,t,n){},46:function(e,t,n){},47:function(e,t,n){"use strict";n.r(t);var c=n(0),a=n.n(c),r=n(24),s=n.n(r),i=(n(33),n(11)),o=n(28),u=n(12),l=n.n(u),d=n(16),j=n(18),b=n(5),f=[{label:"Gold g",rate:1},{label:"Gold kg",rate:1e3},{label:"Gold oz",rate:31.1034768}],p=n(1),O=Object(c.createContext)(null),h=function(e){var t=e.children,n=Object(c.useState)([]),a=Object(b.a)(n,2),r=a[0],s=a[1],i=Object(c.useState)(0),u=Object(b.a)(i,2),h=u[0],m=u[1],x=Object(c.useState)({}),v=Object(b.a)(x,2),_=v[0],N=v[1],y=Object(c.useState)([]),g=Object(b.a)(y,2),U=g[0],k=g[1],w=Object(c.useState)([]),S=Object(b.a)(w,2),C=S[0],E=S[1],L=Object(c.useState)(f.map((function(e){return e.label}))),M=Object(b.a)(L,1)[0],T=function(){var e=Object(j.a)(l.a.mark((function e(){var t,n;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,fetch("https://api.nbp.pl/api/exchangerates/tables/a");case 3:return t=e.sent,e.next=6,t.json();case 6:n=e.sent,n=[{currency:"z\u0142oty",code:"PLN",mid:1}].concat(Object(d.a)(n[0].rates)),s(n),e.next=14;break;case 11:e.prev=11,e.t0=e.catch(0),console.warn(e.t0);case 14:case"end":return e.stop()}}),e,null,[[0,11]])})));return function(){return e.apply(this,arguments)}}(),I=function(){var e=Object(j.a)(l.a.mark((function e(){var t,n;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,fetch("http://api.nbp.pl/api/cenyzlota");case 3:return t=e.sent,e.next=6,t.json();case 6:n=e.sent,m(n[0].cena),e.next=13;break;case 10:e.prev=10,e.t0=e.catch(0),console.warn(e.t0);case 13:case"end":return e.stop()}}),e,null,[[0,10]])})));return function(){return e.apply(this,arguments)}}(),P=function(){var e=Object(j.a)(l.a.mark((function e(){var t,n;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,fetch("https://api.zonda.exchange/rest/trading/ticker");case 3:return t=e.sent,e.next=6,t.json();case 6:n=e.sent,N(n.items),e.next=13;break;case 10:e.prev=10,e.t0=e.catch(0),console.warn(e.t0);case 13:case"end":return e.stop()}}),e,null,[[0,10]])})));return function(){return e.apply(this,arguments)}}(),G=function(){T(),I(),P()};Object(c.useEffect)((function(){G()}),[]);return Object(c.useEffect)((function(){var e=r.map((function(e){return e.code}));e.sort(),k(e)}),[r]),Object(c.useEffect)((function(){var e=Object(o.a)({},_);for(var t in e)"PLN"!==t.slice(t.indexOf("-")+1)&&delete e[t];(e=Object.keys(e).map((function(e){return e=e.slice(0,e.indexOf("-"))}))).sort(),E(e)}),[_]),Object(p.jsx)(O.Provider,{value:{currenciesMarket:r,gramOfGoldValue:h,cryptoCurrenciesMarket:_,possibleCurrencies:U,possibleCrypto:C,possibleGoldUnits:M,refreshRates:G},children:t})},m=n(49),x=n(50),v=(n(36),function(e){var t=e.content,n=Object(c.useContext)(O).refreshRates;return Object(p.jsxs)("div",{className:"header",children:[Object(p.jsx)(i.b,{to:"/",className:"header__link",children:Object(p.jsxs)("div",{className:"header__logo",children:[" ",Object(p.jsx)(m.a,{})," "]})}),Object(p.jsx)("h1",{className:"header__text",children:t}),Object(p.jsx)("button",{className:"header__button tooltip","data-tooltip-content":"update data",onClick:n,children:Object(p.jsx)(x.a,{className:"icon"})})]})}),_=n(3),N=(n(42),function(){return Object(p.jsxs)("div",{className:"home",children:[Object(p.jsx)("h2",{className:"home__title",children:"ABOUT"}),Object(p.jsx)("p",{className:"home__paragraph",children:'This is "YOUR_WEALTH" - a simple web app, done for training purposes. The app is fetching data from public API ( api.nbp.pl and api.zonda.exchange) on currencies, cryptocurrencies, and gold rate. You can input assets in various units and the app will calculate for you the sum of these assets in a unit of your choice using the current rate. Used: React.js, Sass, ant-design/icons.'}),Object(p.jsx)(i.b,{className:"button home__button",to:"/main",children:"START"})]})}),y=n(52),g=n(51),U="currency",k="crypto",w="gold",S=function(e){var t=e.defaultUnits,n=e.exportUnit,a=e.className,r=Object(c.useContext)(O),s=r.possibleCurrencies,i=r.possibleCrypto,o=r.possibleGoldUnits,u=Object(c.useState)(t.code),l=Object(b.a)(u,2),d=l[0],j=l[1];Object(c.useEffect)((function(){var e;s.findIndex((function(e){return e===d}))>=0?e=U:i.findIndex((function(e){return e===d}))>=0?e=k:o.findIndex((function(e){return e===d}))>=0&&(e=w),n({code:d,type:e})}),[d]);var f=s.map((function(e){return Object(p.jsx)("option",{value:e,children:e},e)})),h=i.map((function(e){return Object(p.jsx)("option",{value:e,children:e},e)})),m=o.map((function(e,t){return Object(p.jsx)("option",{value:e,children:e},t)}));return Object(p.jsxs)("select",{name:"unit",value:d,onChange:function(e){j(e.target.value)},className:a,children:[Object(p.jsx)("optgroup",{label:"Fiat",children:f}),Object(p.jsx)("optgroup",{label:"Crypto",children:h}),Object(p.jsx)("optgroup",{label:"Gold",children:m})]})},C=a.a.memo(S),E=(n(43),function(e){var t=e.id,n=e.defaultUnit,a=e.deleteField,r=e.updateInputField,s=Object(c.useState)(""),i=Object(b.a)(s,2),o=i[0],u=i[1],l=Object(c.useState)(n),d=Object(b.a)(l,2),j=d[0],f=d[1];return Object(c.useEffect)((function(){r({id:t,value:o,unit:j})}),[o,j]),Object(c.useEffect)((function(){0===o&&u("")}),[o]),Object(p.jsxs)("form",{onSubmit:function(e){e.preventDefault()},className:"form",children:[Object(p.jsx)("input",{className:"form__number",type:"number",min:"0",name:"value",value:o,onChange:function(e){u(Number(e.target.value))},placeholder:"Input value"}),Object(p.jsx)(C,{defaultUnits:j,exportUnit:function(e){f(e)},className:"form__select"}),Object(p.jsx)("button",{type:"button",onClick:function(){a(t)},className:"form__delete tooltip","data-tooltip-content":"close",children:Object(p.jsx)(g.a,{})})]})}),L=a.a.memo(E),M=(n(44),function(e){var t=e.sum,n=e.mainUnit,c=e.setMainUnit;return Object(p.jsxs)("div",{className:"sum",children:[Object(p.jsx)("h3",{className:"sum__text",children:t}),Object(p.jsx)(C,{defaultUnits:n,exportUnit:c,className:"sum__select"})]})}),T=(n(45),0),I=function(){var e=Object(c.useContext)(O),t=e.currenciesMarket,n=e.gramOfGoldValue,a=e.cryptoCurrenciesMarket,r=Object(c.useState)({code:"PLN",type:U}),s=Object(b.a)(r,2),i=s[0],o=s[1],u=Object(c.useState)([{id:0,value:0,unit:i}]),l=Object(b.a)(u,2),j=l[0],h=l[1],m=Object(c.useState)(0),x=Object(b.a)(m,2),v=x[0],_=x[1],N=function(e){var t=j.filter((function(t){return t.id!==e}));h(t)},g=function(e){var t=j.findIndex((function(t){return t.id===e.id})),n=Object(d.a)(j);n[t]=e,h(n)};Object(c.useEffect)((function(){!function(){var e,c,r=j.reduce((function(e,c){if(0===c.value||"PLN"===c.unit.code)return e+c.value;if(c.unit.type===U){var r=t.find((function(e){return e.code===c.unit.code})).mid;return e+c.value*r}if(c.unit.type===k){var s=a["".concat(c.unit.code,"-PLN")].rate;return e+c.value*s}if(c.unit.type===w){var i=f.find((function(e){return e.label===c.unit.code})).rate,o=n*i;return e+c.value*o}}),0);"PLN"===i.code||0===r?c=1:i.type===U?c=t.find((function(e){return i.code===e.code})).mid:i.type===k?c=a["".concat(i.code,"-PLN")].rate:i.type===w&&(c=f.find((function(e){return i.code===e.label})).rate*n),e=r/c;var s=i.type===k||i.type===w;e=e<1&&s?Math.round(1e5*e)/1e5:e<5&&s?Math.round(1e3*e)/1e3:Math.round(100*e)/100,_(e)}()}),[j,i,t,n,a]);var S=j.map((function(e){return Object(p.jsx)(L,{id:e.id,defaultUnit:e.unit,deleteField:N,updateInputField:g},e.id)}));return Object(p.jsxs)("div",{className:"main",children:[Object(p.jsx)("h2",{className:"main__title",children:"INPUT_YOUR_WEALTH"}),S,Object(p.jsx)("button",{className:"main__add tooltip",onClick:function(){var e={id:T+1,value:0,unit:i};T++,h((function(t){return[].concat(Object(d.a)(t),[e])}))},"data-tooltip-content":"add new field",children:Object(p.jsx)(y.a,{})}),Object(p.jsx)("h2",{className:"main__sumTitle",children:"SUM_OF_YOUR_WEALTH"}),Object(p.jsx)(M,{sum:v,mainUnit:i,setMainUnit:o})]})},P=function(){return Object(p.jsxs)(_.d,{children:[Object(p.jsx)(_.b,{path:"/",exact:!0,component:N}),Object(p.jsx)(_.b,{path:"/main",component:I}),Object(p.jsx)(_.a,{to:"/"})]})},G=function(e){var t=e.content;return Object(p.jsx)("footer",{className:"footer",children:Object(p.jsx)("p",{className:"footer__text",children:t})})};n(46);var R=function(){return Object(p.jsx)(h,{children:Object(p.jsxs)(i.a,{children:[Object(p.jsxs)("div",{className:"app",children:[Object(p.jsx)("header",{className:"app__header",children:Object(p.jsx)(v,{content:"YOUR_WEALTH"})}),Object(p.jsx)("main",{className:"app__main",children:Object(p.jsx)(P,{})})]}),Object(p.jsx)("footer",{className:"app__footer",children:Object(p.jsx)(G,{content:"contact: functionalweasel@gmail.com"})})]})})};s.a.render(Object(p.jsx)(a.a.StrictMode,{children:Object(p.jsx)(R,{})}),document.getElementById("root"))}},[[47,1,2]]]); +//# sourceMappingURL=main.554fb693.chunk.js.map \ No newline at end of file diff --git a/static/js/main.dbd130ae.chunk.js.map b/static/js/main.554fb693.chunk.js.map similarity index 55% rename from static/js/main.dbd130ae.chunk.js.map rename to static/js/main.554fb693.chunk.js.map index cfa279d..2748f10 100644 --- a/static/js/main.dbd130ae.chunk.js.map +++ b/static/js/main.554fb693.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["helpers/goldUnits.js","store/StoreProvider.jsx","layouts/Header.jsx","pages/Home.jsx","helpers/VAR.js","components/SelectUnits.jsx","components/InputField.jsx","components/Sum.jsx","pages/Main.jsx","layouts/Content.jsx","layouts/Footer.jsx","App.js","index.js"],"names":["goldUnits","label","rate","StoreContext","createContext","StoreProvider","children","useState","currenciesMarket","setCurrenciesMarket","gramOfGoldValue","setGramOfGoldValue","cryptoCurrenciesMarket","setCryptoCurrenciesMarket","possibleCurrencies","setPossibleCurrencies","possibleCrypto","setPossibleCrypto","map","unit","possibleGoldUnits","fetchCurrencies","a","fetch","response","json","data","currency","code","mid","rates","console","warn","fetchGramOfGoldValue","cena","fetchCryptoCurrencies","items","fetchData","useEffect","units","curr","sort","slice","indexOf","Object","keys","item","Provider","value","refreshRates","Header","content","useContext","className","to","DollarOutlined","onClick","SyncOutlined","Home","CURRENCY","CRYPTO","GOLD","SelectUnits","defaultUnits","exportUnit","setUnit","unitType","findIndex","crypto","goldUnit","type","optionsCurrencies","optionsCrypto","optionsGold","index","name","onChange","event","target","React","memo","InputField","id","defaultUnit","deleteField","updateInputField","setValue","onSubmit","e","preventDefault","min","Number","placeholder","CloseOutlined","Sum","sum","mainUnit","setMainUnit","lastId","Main","inputFields","setInputFields","setSum","newInputFields","filter","field","updatedField","sumInPLN","reduce","total","current","rateToPLN","find","IsCryptoOrGold","Math","round","calculateSum","displayInputFields","newField","prevState","PlusOutlined","Content","path","exact","component","Footer","App","ReactDOM","render","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.dbd130ae.chunk.js","sourcesContent":["const goldUnits = [\r\n {label: 'Gold g', rate: 1},\r\n {label: 'Gold kg', rate: 1000},\r\n {label: 'Gold oz', rate: 31.1034768 }\r\n]\r\n \r\nexport default goldUnits;\r\n","import React, {createContext, useEffect, useState} from 'react';\r\n\r\nimport goldUnits from '../helpers/goldUnits';\r\n\r\nexport const StoreContext = createContext(null);\r\n\r\nconst StoreProvider = ({children}) => {\r\n const [ currenciesMarket, setCurrenciesMarket ] = useState([]);\r\n const [ gramOfGoldValue, setGramOfGoldValue ] = useState(0);\r\n const [ cryptoCurrenciesMarket, setCryptoCurrenciesMarket ] = useState({});\r\n const [ possibleCurrencies, setPossibleCurrencies ] = useState([]);\r\n const [ possibleCrypto, setPossibleCrypto ] = useState([]);\r\n const [ possibleGoldUnits ] = useState(goldUnits.map(unit => unit.label));\r\n\r\n const fetchCurrencies = async () => {\r\n try {\r\n const response = await fetch('https://api.nbp.pl/api/exchangerates/tables/a');\r\n let data = await response.json();\r\n data = [{currency: 'złoty', code: 'PLN', mid: 1}, ...data[0].rates]\r\n setCurrenciesMarket(data);\r\n } catch(error) {\r\n console.warn(error);\r\n }\r\n }\r\n\r\n const fetchGramOfGoldValue = async () => {\r\n try {\r\n const response = await fetch('http://api.nbp.pl/api/cenyzlota');\r\n const data = await response.json();\r\n setGramOfGoldValue(data[0].cena);\r\n } catch(error) {\r\n console.warn(error);\r\n }\r\n }\r\n\r\n const fetchCryptoCurrencies = async () => {\r\n try {\r\n const response = await fetch('https://api.zonda.exchange/rest/trading/ticker');\r\n const data = await response.json();\r\n setCryptoCurrenciesMarket(data.items);\r\n } catch(error) {\r\n console.warn(error);\r\n }\r\n }\r\n\r\n const fetchData = () => {\r\n fetchCurrencies()\r\n fetchGramOfGoldValue();\r\n fetchCryptoCurrencies();\r\n }\r\n\r\n useEffect(()=> {\r\n fetchData();\r\n }, []);\r\n\r\n const getCurrenciesCodes = () => {\r\n const units = currenciesMarket.map(curr => curr.code);\r\n units.sort()\r\n setPossibleCurrencies(units);\r\n };\r\n\r\n const getCryptoCodes = () => {\r\n let units = {...cryptoCurrenciesMarket};\r\n\r\n for(const code in units) {\r\n if(code.slice(code.indexOf('-')+1) !== 'PLN') {\r\n delete units[code];\r\n }\r\n }\r\n\r\n units = Object.keys(units).map(item => {\r\n item = item.slice(0, item.indexOf('-'))\r\n return item;\r\n });\r\n\r\n units.sort();\r\n setPossibleCrypto(units);\r\n };\r\n\r\n useEffect(getCurrenciesCodes, [currenciesMarket]);\r\n\r\n useEffect(getCryptoCodes, [cryptoCurrenciesMarket]);\r\n\r\n return(\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nexport default StoreProvider;\r\n","import React, { useContext } from 'react';\r\nimport { DollarOutlined, SyncOutlined } from '@ant-design/icons';\r\nimport { Link } from 'react-router-dom'\r\n\r\nimport { StoreContext } from '../store/StoreProvider';\r\n\r\nimport './Header.scss'\r\n\r\nconst Header = ({content}) => {\r\n const { refreshRates } = useContext(StoreContext);\r\n\r\n return (\r\n
\r\n \r\n
\r\n \r\n

{content}

\r\n \r\n
\r\n )\r\n}\r\n\r\nexport default Header;","import React from 'react';\r\nimport { Link } from 'react-router-dom';\r\n\r\nimport './Home.scss';\r\n\r\nconst Home = () => {\r\n return (\r\n
\r\n

ABOUT

\r\n

\r\n This is \"YOUR_WEALTH\" - a simple web app, done for training purposes. The app is fetching data from public API (\r\n api.nbp.pl and api.zonda.exchange) on currencies, cryptocurrencies, and gold rate. You can input assets in\r\n various units and the app will calculate for you the sum of these assets in a unit of your choice using the\r\n current rate. Used: React.js, Sass.\r\n

\r\n \r\n START\r\n \r\n
\r\n );\r\n};\r\n\r\nexport default Home;\r\n","export const CURRENCY = 'currency';\r\nexport const CRYPTO = 'crypto';\r\nexport const GOLD = 'gold';\r\n","import React, { useContext, useState, useEffect } from 'react';\r\n\r\nimport { StoreContext } from '../store/StoreProvider';\r\n\r\nimport { CURRENCY, CRYPTO, GOLD } from '../helpers/VAR'\r\n\r\nconst SelectUnits = ({defaultUnits, exportUnit, className}) => {\r\n const { possibleCurrencies, possibleCrypto, possibleGoldUnits } = useContext(StoreContext);\r\n const [ unit, setUnit ] = useState(defaultUnits.code);\r\n\r\n const handleUnitChange = (event) =>{\r\n setUnit(event.target.value)\r\n }\r\n\r\n useEffect(()=>{\r\n let unitType\r\n if (possibleCurrencies.findIndex(currency => currency === unit) >= 0){\r\n unitType = CURRENCY\r\n } else if (possibleCrypto.findIndex(crypto => crypto === unit) >= 0){\r\n unitType = CRYPTO\r\n } else if (possibleGoldUnits.findIndex(goldUnit => goldUnit === unit) >=0){\r\n unitType = GOLD\r\n };\r\n exportUnit({code: unit, type: unitType})\r\n },[ unit ])\r\n\r\n const optionsCurrencies = possibleCurrencies.map(currency =>(\r\n \r\n ));\r\n const optionsCrypto = possibleCrypto.map(crypto => (\r\n \r\n ));\r\n const optionsGold = possibleGoldUnits.map((unit, index) => (\r\n \r\n ));\r\n\r\n return ( \r\n \r\n );\r\n}\r\n \r\nexport default React.memo(SelectUnits);","import React, { useEffect, useState } from 'react';\r\nimport { CloseOutlined } from '@ant-design/icons';\r\n\r\nimport SelectUnits from './SelectUnits';\r\nimport './InputField.scss';\r\n\r\nconst InputField = ({id, defaultUnit, deleteField, updateInputField}) => {\r\n const [ value, setValue ] = useState('');\r\n const [ unit, setUnit ] = useState(defaultUnit);\r\n\r\n const handleValueChange = (event) => {\r\n setValue(Number(event.target.value));\r\n }\r\n\r\n const importUnit = (unit) => {\r\n setUnit(unit);\r\n }\r\n\r\n useEffect(()=>{\r\n updateInputField({id, value, unit})\r\n },[value, unit]);\r\n\r\n useEffect(()=>{\r\n if (value === 0){\r\n setValue('');\r\n }\r\n },[value]);\r\n\r\n return(\r\n
{e.preventDefault()}} className=\"form\">\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default React.memo(InputField);\r\n\r\n","import React from 'react';\r\n\r\nimport SelectUnits from './SelectUnits'\r\nimport './Sum.scss';\r\n\r\nconst Sum = ({sum, mainUnit, setMainUnit}) => {\r\n\r\n return (\r\n
\r\n

{sum}

\r\n < SelectUnits defaultUnits={mainUnit} exportUnit={setMainUnit} className=\"sum__select\"/>\r\n
\r\n )\r\n}\r\n\r\nexport default Sum;","import React, { useContext, useEffect, useState } from 'react';\r\nimport { PlusOutlined } from '@ant-design/icons';\r\n\r\nimport { StoreContext } from '../store/StoreProvider';\r\nimport goldUnits from '../helpers/goldUnits';\r\nimport InputField from '../components/InputField'\r\nimport Sum from '../components/Sum'\r\nimport { CURRENCY, CRYPTO, GOLD } from '../helpers/VAR'\r\n\r\nimport './Main.scss';\r\n\r\nlet lastId = 0;\r\n\r\nconst Main = () => {\r\n const { currenciesMarket, gramOfGoldValue, cryptoCurrenciesMarket } = useContext(StoreContext);\r\n const [ mainUnit, setMainUnit ] = useState({code:'PLN', type: CURRENCY});\r\n const [ inputFields, setInputFields ] = useState([{id:0, value: 0, unit: mainUnit}]);\r\n const [ sum, setSum ] = useState(0);\r\n\r\n const addField = () => {\r\n const newField = {\r\n id: lastId + 1,\r\n value: 0,\r\n unit: mainUnit\r\n }\r\n lastId++;\r\n setInputFields(prevState => [...prevState, newField]);\r\n }\r\n\r\n const deleteField = (id) => {\r\n const newInputFields = inputFields.filter((field)=>(\r\n field.id !== id\r\n ));\r\n setInputFields(newInputFields);\r\n }\r\n\r\n const updateInputField = (updatedField) => {\r\n const index = inputFields.findIndex(field => {return field.id === updatedField.id});\r\n const newInputFields = [...inputFields]\r\n newInputFields[index] = updatedField;\r\n setInputFields(newInputFields);\r\n }\r\n\r\n const calculateSum = () => {\r\n let sum;\r\n let rate;\r\n\r\n const sumInPLN = inputFields.reduce((total, current) => {\r\n if ( current.value === 0 || current.unit.code === 'PLN' ) {\r\n return total + current.value\r\n }\r\n if ( current.unit.type === CURRENCY ) {\r\n const rateToPLN = (currenciesMarket.find(currency => currency.code === current.unit.code )).mid\r\n return total + (current.value * rateToPLN);\r\n }\r\n if ( current.unit.type === CRYPTO) {\r\n const rateToPLN = cryptoCurrenciesMarket[`${current.unit.code}-PLN`].rate;\r\n return total + (current.value * rateToPLN);\r\n }\r\n if ( current.unit.type === GOLD) {\r\n const rate = (goldUnits.find(unit => unit.label === current.unit.code)).rate;\r\n const rateToPLN = gramOfGoldValue * rate;\r\n return total + (current.value * rateToPLN);\r\n }\r\n }, 0); \r\n\r\n if (mainUnit.code === 'PLN' || sumInPLN === 0) {\r\n rate = 1;\r\n } else if ( mainUnit.type === CURRENCY) {\r\n rate = (currenciesMarket.find(currency => mainUnit.code === currency.code)).mid\r\n } else if ( mainUnit.type === CRYPTO ) {\r\n rate = cryptoCurrenciesMarket[`${mainUnit.code}-PLN`].rate;\r\n } else if ( mainUnit.type === GOLD ) {\r\n rate = (goldUnits.find(unit => mainUnit.code === unit.label)).rate * gramOfGoldValue;\r\n }\r\n\r\n sum = sumInPLN / rate;\r\n\r\n const IsCryptoOrGold = mainUnit.type === CRYPTO || mainUnit.type === GOLD;\r\n\r\n if (sum < 1 && IsCryptoOrGold) {\r\n sum = Math.round(sum * 100000)/100000;\r\n } else if (sum < 5 && IsCryptoOrGold) {\r\n sum = Math.round(sum * 1000)/1000;\r\n } else {\r\n sum = Math.round(sum * 100)/100;\r\n }\r\n\r\n setSum(sum);\r\n }\r\n\r\n useEffect(()=>{\r\n calculateSum();\r\n }, [ \r\n inputFields, \r\n mainUnit, \r\n currenciesMarket, \r\n gramOfGoldValue, \r\n cryptoCurrenciesMarket \r\n ])\r\n\r\n const displayInputFields = inputFields.map(item => (\r\n \r\n ))\r\n\r\n return (\r\n
\r\n

INPUT_YOUR_WEALTH

\r\n {displayInputFields}\r\n \r\n

SUM_OF_YOUR_WEALTH

\r\n \r\n
\r\n )\r\n}\r\n\r\nexport default Main;\r\n","import React from 'react'\r\nimport { Route, Switch, Redirect } from 'react-router-dom';\r\n\r\nimport Home from '../pages/Home';\r\nimport Main from '../pages/Main';\r\n\r\nconst Content = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n};\r\n\r\nexport default Content","import React from \"react\";\r\n\r\nconst Footer = ({content}) => {\r\n return (\r\n
\r\n

{content}

\r\n
\r\n )\r\n}\r\n\r\nexport default Footer;\r\n","import React from 'react';\r\nimport { BrowserRouter as Router } from 'react-router-dom';\r\n\r\nimport StoreProvider from './store/StoreProvider';\r\nimport Header from './layouts/Header';\r\nimport Content from './layouts/Content';\r\nimport Footer from './layouts/Footer';\r\n\r\nimport './layouts/layouts.scss'\r\n\r\nfunction App() {\r\n return (\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n