{"version":3,"sources":["DevicesChooser.js","DayChooser.js","apiCalls.js","constants.js","TemperatureGraph.js","Devices.js","App.js","index.js"],"names":["DeviceChooser","props","handleChange","bind","event","this","onDeviceChange","target","value","currentDevice","onChange","disabled","devices","map","_device","key","ID","name","React","Component","DayChooser","onDayChange","currentDay","days","_day","getAllDevices","a","out","fetch","then","response","json","data","sort","b","lastSeen","catch","error","console","log","getDeviceFiles","_devId","getFile","_file","text","chartOptions","title","curveType","legend","position","TemperatureGraph","state","chartData","type","label","prevProps","currentFile","ApiCalls","newChartData","split","forEach","_ll","length","lljson","JSON","parse","push","moment","time","toDate","temp","e","setState","chartType","loader","options","Devices","devicesList","files","handleDeviceChange","handleFileChange","device","devFiles","newfile","undefined","batV","className","getDeviceBatV","App","id","ReactDOM","render","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.e7d7320c.chunk.js","sourcesContent":["import React from 'react';\n\nclass DeviceChooser extends React.Component {\n constructor(props) {\n super(props)\n\n this.handleChange = this.handleChange.bind(this)\n }\n\n handleChange(event) {\n this.props.onDeviceChange(event.target.value)\n }\n\n render() {\n return (\n \n )\n }\n}\n\nexport default DeviceChooser;\n","import React from 'react';\n\nclass DayChooser extends React.Component {\n constructor(props) {\n super(props)\n\n this.handleChange = this.handleChange.bind(this)\n }\n\n handleChange(event) {\n this.props.onDayChange(event.target.value)\n }\n\n render() {\n return (\n \n )\n }\n}\n\nexport default DayChooser;\n","import * as Constants from './constants'\n\nexport const getAllDevices = async () => {\n let out = []\n await fetch(Constants.API_ALL_DEVICES)\n .then(response => response.json())\n .then(data => {\n data.sort((a, b) => (a.lastSeen < b.lastSeen) ? 1 : -1)\n // console.log(data)\n out = data\n }).catch((error) => {\n console.log(error)\n out = []\n })\n\n return out\n}\n\nexport const getDeviceFiles = async _devId => {\n let out = []\n await fetch(Constants.API_DEVICE_FILES + `/${_devId}`)\n .then(response => response.json())\n .then(data => {\n data.sort((a, b) => (a < b) ? 1 : -1)\n // console.log(data)\n out = data\n }).catch((error) => {\n console.log(error)\n out = []\n })\n\n return out\n}\n\nexport const getDeviceInfo = async _devId => {\n let out = []\n await fetch(Constants.API_DEVICE_INFO + `/${_devId}`)\n .then(response => response.json())\n .then(data => {\n console.log(data)\n out = data\n }).catch((error) => {\n console.log(error)\n out = {}\n })\n\n return out\n}\n\nexport const getFile = async (_device, _file) => {\n let out = []\n\n await fetch(Constants.API_SINGLE_FILE + `/${_device}/${_file}`)\n .then(response => response.text())\n .then(data => {\n out = data\n }).catch((error) => {\n console.log(error)\n })\n\n return out\n}\n\n\n","export const API_ALL_DEVICES = '/alldevices'\nexport const API_DEVICE_FILES = '/datafilenames'\nexport const API_SINGLE_FILE = '/datafiles'\nexport const API_DEVICE_INFO = '/deviceinfo'\n","import React from 'react';\nimport Chart from 'react-google-charts'\nimport moment from 'moment'\nimport * as ApiCalls from './apiCalls'\n\nconst chartOptions = {\n title: 'Temperature in my room (Celsius)',\n curveType: 'function',\n legend: { position: 'bottom' }\n}\n\nexport default class TemperatureGraph extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n chartData: [\n [\n { type: 'date', label: 'Time' },\n { type: 'number', label: 'Temperature' }\n ]\n ]\n }\n }\n\n async componentDidUpdate(prevProps) {\n if (\n (prevProps.currentFile !== this.props.currentFile && this.props.currentFile!=='')\n || prevProps.currentDevice !== this.props.currentDevice\n ) {\n let data = await ApiCalls.getFile(this.props.currentDevice, this.props.currentFile)\n \n let newChartData = [[\n { type: 'date', label: 'Time' },\n { type: 'number', label: 'Temperature' }\n ]]\n \n let loglist = data.split('\\n')\n loglist.forEach(_ll => {\n // extra newline at the end causes a zero length string to try be decoded\n // adds extra noise to the console debugging\n if (_ll.length > 0) {\n try {\n let lljson = JSON.parse(_ll)\n newChartData.push([moment(lljson.time).toDate(), lljson.temp])\n } catch(e) {\n console.log('invalid json in log file', _ll)\n }\n }\n })\n \n this.setState({\n chartData: newChartData\n })\n }\n }\n\n render() {\n return (\n Loading Chart}\n data={this.state.chartData}\n options={chartOptions}\n />\n )\n }\n}\n","import React from 'react'\nimport DeviceChooser from './DevicesChooser'\nimport DayChooser from './DayChooser'\nimport TemperatureGraph from './TemperatureGraph'\n\nimport * as ApiCalls from './apiCalls'\n\nclass Devices extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n devices: {},\n devicesList: [],\n currentDevice: '',\n files: [],\n currentFile: ''\n }\n\n this.handleDeviceChange = this.handleDeviceChange.bind(this)\n this.handleFileChange = this.handleFileChange.bind(this)\n }\n\n async componentDidMount() {\n let devicesList = await ApiCalls.getAllDevices()\n let currentDevice = (devicesList.length > 0)?devicesList[0].ID:''\n\n let devices = {}\n devicesList.forEach(_device => {\n devices[_device.ID] = _device\n })\n\n this.setState({\n devicesList,\n devices,\n currentDevice\n })\n this.handleDeviceChange(currentDevice)\n\n console.log(devices, currentDevice)\n }\n\n async handleDeviceChange(device) {\n console.log('this ran')\n this.setState({currentDevice: device})\n \n let devFiles = await ApiCalls.getDeviceFiles(device)\n console.log(devFiles)\n this.setState({\n files: devFiles,\n currentFile: (devFiles.length > 0)?devFiles[0]:''\n })\n }\n\n handleFileChange(newfile) {\n this.setState({currentFile: newfile})\n }\n\n getDeviceBatV() {\n let currentDevice = this.state.devices[this.state.currentDevice]\n if (currentDevice === undefined) return ''\n else return currentDevice.batV\n }\n\n render() {\n return (\n <>\n
\n Choose device: \n \n
\n Choose date: \n \n
\n
\n \n
\n
\n Battery voltage: {this.getDeviceBatV()}
\n
\n \n )\n }\n}\n\nexport default Devices\n","import React from 'react';\nimport './App.css';\nimport Devices from './Devices'\n\nclass App extends React.Component {\n render() {\n return <>\n
\n
\n

My room temperature

\n

Because why not...

\n \n
\n
\n \n }\n}\n\nexport default App;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n\n"],"sourceRoot":""}