{"version":3,"sources":["components/Exchange/index.js","components/CoinCard/index.js","components/App/api.js","components/App/transform.js","components/App/index.js","reportWebVitals.js","index.js"],"names":["Exchange","props","className","name","style","opacity","buyNow","sellNow","buyPrice","sellPrice","CoinCard","loaded","alt","src","icon","Object","keys","exchanges","map","exchange","buy","sell","transformers","data","ask","bid","d","result","parseFloat","a","toFixed","b","getPrices","coin","Promise","resolve","reject","url","markets","api","forEach","prices","minBuy","price","Infinity","maxSell","all","u","fetch","then","responses","r","json","i","t","App","state","coins","error","symbols","setInterval","s","symbol","setState","catch","this","onClick","window","location","reload","React","Component","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.9a2c0982.chunk.js","sourcesContent":["import './index.scss'\n\n/**\n * @param name\n * @param icon\n * @param buy\n * @param sell\n * @param buyRank\n * @param sellRank\n */\n\nconst Exchange = (props) => {\n\treturn
\n\t\t
\n\t\t\t

{props.name}

\n\t\t\t
\n\t\t\t\t

buy

\n\t\t\t\t

sell

\n\t\t\t
\n\t\t
\n\n\t\t
\n\t\t\t
\n\t\t\t\t

${props.buyPrice} Buy

\n\t\t\t
\n\t\t\t
\n\t\t\t\t

${props.sellPrice} Sell

\n\t\t\t
\n\t\t
\n\t
\n}\n\nexport default Exchange","import Exchange from \"../Exchange\"\nimport './index.scss'\nimport 'glyphicons-only-bootstrap/css/bootstrap.min.css'\n\n/**\n * \n * @param name \n * @param icon \n * @param exchanges\n */\nconst CoinCard = (props) =>
\n\t
\n\t\t\"icon\"\n\t\t

{props.name}

\n\t\t{/* */}\n\t
\n\n\t
\n\t\t{\n\t\t\tObject.keys(props.exchanges).map(exchange => )\n\t\t}\n\t
\n
\n\nexport default CoinCard","import api from '../../api.json'\nimport { kraken, gemini } from './transform'\n\nconst transformers = {\n 'gemini': gemini,\n 'kraken': kraken\n}\n\nconst getPrices = (coin) => {\n return new Promise((resolve, reject) => {\n const url = {}\n const markets = Object.keys(api)\n markets.forEach(a => url[a] = api[a][coin])\n const prices = {}\n\n const minBuy = {\n exchange: null,\n price: Infinity \n }\n\n const maxSell = {\n exchange: null,\n price: 0 \n }\n\n Promise.all(markets.map(u => fetch(url[u])))\n .then(responses => Promise.all(responses.map(r => r.json())))\n .then(data => data.forEach((d, i) => {\n const t = transformers[markets[i]]\n prices[markets[i]] = t(d)\n\n if(prices[markets[i]].buy < minBuy.price){\n minBuy.price = prices[markets[i]].buy\n minBuy.exchange = markets[i]\n }\n if(prices[markets[i]].sell > maxSell.price){\n maxSell.price = prices[markets[i]].sell\n maxSell.exchange = markets[i]\n }\n }))\n .then(() => {\n prices[minBuy.exchange].buyNow = true\n prices[maxSell.exchange].sellNow = true\n })\n .then(() => resolve(prices))\n })\n}\n\nexport default getPrices","const kraken = (data) => {\n const d = Object.keys(data.result)[0]\n\n return {\n buy: parseFloat(data.result[d].a[0]).toFixed(2),\n sell: parseFloat(data.result[d].b[0]).toFixed(2)\n }\n}\n\nconst gemini = (data) => {\n return {\n buy: data.ask,\n sell: data.bid \n }\n}\n\nexport {kraken, gemini}","import React from 'react';\nimport CoinCard from '../CoinCard';\nimport getPrices from './api';\n\nimport './index.scss'\n\nclass App extends React.Component {\n\tstate = {\n\t\tcoins: null,\n\t\terror: null,\n\t\tloaded: false\n\t}\n\n\tcomponentDidMount() {\n\t\tconst symbols = [\n\t\t\t\"eth\",\n\t\t\t\"btc\"\n\t\t]\n\n\t\tsetInterval(() => {\n\t\t\tPromise.all(symbols.map(s => getPrices(s)))\n\t\t\t\t.then(data => {\n\t\t\t\t\tconst coins = {}\n\t\t\t\t\tsymbols.forEach((symbol, i) => {\n\t\t\t\t\t\tcoins[symbol] = { exchanges: data[i] }\n\t\t\t\t\t\tcoins[symbol].loaded = true\n\t\t\t\t\t})\n\t\t\t\t\tthis.setState({\n\t\t\t\t\t\tcoins: coins,\n\t\t\t\t\t\tloaded: true\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t.catch(() => this.setState({\n\t\t\t\t\terror: \"Cannot make initial fetch\",\n\t\t\t\t\tloaded: true\n\t\t\t\t}))\n\t\t}, 1000)\n\t}\n\n\trender() {\n\t\tif (!this.state.loaded) {\n\t\t\treturn
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t

CoinPicker

\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t}\n\n\t\treturn
\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t

CoinPicker

\n\t\t\t\t
\n\n\t\t\t\t{this.state.error ?\n\t\t\t\t\t
\n\t\t\t\t\t\t

Something went wrong. window.location.reload()\n\t\t\t\t\t\t}>Retry

\n\t\t\t\t\t
\n\t\t\t\t\t: null}\n\n\t\t\t\t
\n\t\t\t\t\t{\n\t\t\t\t\t\t!this.state.coins ? null :\n\t\t\t\t\t\t\tObject.keys(this.state.coins).map(coin => {\n\t\t\t\t\t\t\t// \tconst coins = this.state.coins\n\t\t\t\t\t\t\t// \tcoins[coin].loaded = false\n\t\t\t\t\t\t\t// \tthis.setState({coins: coins})\n\n\t\t\t\t\t\t\t// \tfetch(`${process.env.REACT_APP_BACKEND}/${coin}`)\n\t\t\t\t\t\t\t// \t.then(response => response.json())\n\t\t\t\t\t\t\t// \t.then(data => {\n\t\t\t\t\t\t\t// \t\tconst coins = this.state.coins\n\t\t\t\t\t\t\t// \t\tcoins[coin].exchanges=data\n\t\t\t\t\t\t\t// \t\tcoins[coin].loaded = true \n\t\t\t\t\t\t\t// \t\tthis.setState({coins: coins})\n\t\t\t\t\t\t\t// \t})\n\t\t\t\t\t\t\t// \t.catch(error => this.setState({error: `Cannot fetch ${process.env.REACT_APP_BACKEND}/${coin}`}))\n\t\t\t\t\t\t\t// }}\n\t\t\t\t\t\t\t/>)\n\t\t\t\t\t}\n\t\t\t\t
\n\t\t\t
{/* end container */}\n\t\t
\n\t}\n}\n\nexport default App","const reportWebVitals = onPerfEntry => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './components/App';\nimport reportWebVitals from './reportWebVitals';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"sourceRoot":""}