{"version":3,"sources":["components/generalComponents/ButtonComponent.js","components/dashboardComponents.js/SetSummaryComponent.js","components/generalComponents/LoadingComponent.js","pages/DashboardPage.js","components/newSetComponents/InputCellComponent.js","components/newSetComponents/InputRowComponent.js","components/newSetComponents/CellTitleComponent.js","apiHandler.js","pages/NewSetPage.js","components/testSetComponents/CubeComponent.js","components/testSetComponents/KeyIconComponent.js","components/testSetComponents/FaceSelectComponent.js","components/generalComponents/ProgressBarComponent.js","components/testSetComponents/FakeCubeComponent.js","components/testSetComponents/NextCubeComponent.js","pages/TestSetPage.js","components/generalComponents/HeaderComponent.js","pages/LoginPage.js","App.js","index.js"],"names":["ButtonComponent","className","this","props","size","onClick","disabled","text","Component","SetSummaryComponent","confirmDelete","state","delete","setState","deleteText","onActualDelete","deleteSet","set","id","date_created","onCancelDelete","name","selectSet","style","marginLeft","editSet","data","length","LoadingComponent","DashboardPage","sets","forEach","index","push","key","switchPage","noSets","textAlign","InputCellComponent","onKeyDown","event","onTab","valueCount","rows","value","onChange","updateCell","target","InputRowComponent","cells","values","row","CellTitleComponent","titles","title","titleCount","placeholder","shiftColumn","removeColumn","APIHandler","user","callback","params","method","fetch","config","apiEndpoint","response","json","Items","body","JSON","stringify","password","NewSetPage","onColumnTitleUpdate","columnNames","onCellUpdate","col","onTitleUpdate","addRow","rowCount","columnCount","addColumn","column","i","splice","removeRow","direction","offset","onSave","username","isNew","Date","now","apiHandler","createSet","err","setToEdit","loadSetToEdit","singleRow","CubeComponent","faces","face","currentFace","mode","faceValues","KeyIconComponent","FaceSelectComponent","select","ProgressBarComponent","width","Math","round","extraText","FakeCubeComponent","class","NextCubeComponent","TestSetPage","onRepeat","currentCube","correctCount","correct","complete","rotateToFace","faceNames","nextCube","min","concat","faceCount","faceTitles","document","addEventListener","Number","selectors","percentCorrect","cube","indexOf","map","hidden","marginTop","HeaderComponent","loggedIn","LoginPage","onLogin","loginUsername","loginPassword","login","successful","setUser","loginErrorMessage","onSignup","signupUsername","signupPassword","signupConfirmPassword","signupErrorMessage","signup","type","App","page","setToOpen","currentPage","getSets","padding","margin","ReactDOM","render","getElementById"],"mappings":"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","file":"static/js/main.8ffe64df.chunk.js","sourcesContent":["import React, { Component } from 'react';\r\nimport \"../../css/general.css\";\r\n\r\nclass ButtonComponent extends Component {\r\n render() {\r\n let className = `button button_${this.props.size}`;\r\n let onClick = this.props.onClick;\r\n if (this.props.disabled) {\r\n onClick = () => {};\r\n }\r\n return (\r\n
\r\n {this.props.text}\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport default ButtonComponent\r\n","import React, { Component } from 'react'\r\nimport \"../../css/dashboardPage.css\";\r\nimport ButtonComponent from '../generalComponents/ButtonComponent';\r\n\r\nclass SetSummaryComponent extends Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n delete: false,\r\n deleteText: \"Delete\"\r\n };\r\n }\r\n\r\n confirmDelete = () => {\r\n if (this.state.delete) {\r\n this.setState({\r\n delete: false,\r\n deleteText: \"Delete\"\r\n });\r\n } else {\r\n this.setState({\r\n delete: true,\r\n deleteText: \"Are you sure?\"\r\n });\r\n }\r\n }\r\n\r\n onActualDelete = () => {\r\n this.props.deleteSet(this.props.set.id, this.props.set.date_created);\r\n }\r\n\r\n onCancelDelete = () => {\r\n this.setState({\r\n delete: false,\r\n deleteText: \"Delete\"\r\n });\r\n }\r\n\r\n render() {\r\n let set = this.props.set;\r\n return (\r\n
\r\n
\r\n \r\n \r\n this.props.editSet(set.id)}/>\r\n \r\n \r\n {\r\n this.state.delete && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n
\r\n
\r\n
\r\n {this.props.set.data[0].length} Cards | {this.props.set.data.length} Sides Per Card\r\n
\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport default SetSummaryComponent;\r\n","import React, { Component } from 'react'\r\n\r\nclass LoadingComponent extends Component {\r\n render() {\r\n return (\r\n
\r\n
\r\n Loading\r\n .\r\n .\r\n .\r\n
\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport default LoadingComponent;\r\n","import React, { Component } from 'react'\r\nimport SetSummaryComponent from '../components/dashboardComponents.js/SetSummaryComponent';\r\nimport LoadingComponent from '../components/generalComponents/LoadingComponent';\r\n\r\nclass DashboardPage extends Component {\r\n\r\n render() {\r\n\r\n if (!this.props.sets) {\r\n return (\r\n \r\n );\r\n }\r\n\r\n let sets = [];\r\n this.props.sets.forEach((set, index) => {\r\n sets.push(\r\n this.props.switchPage(\"test\", null, this.props.sets[index])}\r\n editSet={() => this.props.switchPage(\"new\", this.props.sets[index], null)}\r\n deleteSet={(id, date_created) => this.props.deleteSet(id, date_created)}/>\r\n );\r\n });\r\n\r\n let noSets = (\r\n
\r\n You don't have any sets yet.
\r\n Click \"New Set\" to add one!\r\n
\r\n );\r\n\r\n return (\r\n
\r\n {/* */}\r\n {\r\n sets.length ? \r\n sets :\r\n noSets\r\n }\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport default DashboardPage;\r\n","import React, { Component } from 'react'\r\n\r\nclass InputCellComponent extends Component {\r\n\r\n onKeyDown = event => {\r\n if (event.key === \"Tab\") {\r\n this.props.onTab();\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n this.props.updateCell(event.target.value)}\r\n onKeyDown={this.onKeyDown}/>\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport default InputCellComponent;\r\n","import React, { Component } from 'react'\r\nimport InputCellComponent from './InputCellComponent';\r\n\r\nclass InputRowComponent extends Component {\r\n\r\n render() {\r\n let cells = [];\r\n this.props.values.forEach((value, index) => {\r\n cells.push(\r\n this.props.updateCell(text, index, this.props.row)}\r\n value={value}\r\n valueCount={this.props.valueCount}\r\n onTab={() => this.props.onTab(index, this.props.row)}/>\r\n );\r\n });\r\n\r\n return (\r\n
\r\n {cells}\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport default InputRowComponent;\r\n","import React, { Component } from 'react'\r\n\r\nclass CellTitleComponent extends Component {\r\n render() {\r\n\r\n let titles = [];\r\n this.props.titles.forEach((title, index) => {\r\n titles.push(\r\n
\r\n this.props.onChange(event.target.value, index)}/>\r\n
\r\n {\r\n index > 0 &&\r\n this.props.shiftColumn(index, \"left\")}>\r\n {\"<\"}\r\n \r\n }\r\n this.props.removeColumn(index)}>\r\n {\"X\"}\r\n \r\n {\r\n index < this.props.titleCount - 1 &&\r\n this.props.shiftColumn(index, \"right\")}>\r\n {\">\"}\r\n \r\n }\r\n
\r\n );\r\n });\r\n\r\n return (\r\n
\r\n {titles}\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport default CellTitleComponent;\r\n","import config from \"./config.json\";\r\n\r\nclass APIHandler {\r\n\r\n async getSets(user, callback) {\r\n const params = {\r\n method: \"GET\",\r\n };\r\n const response = await fetch(`${config.apiEndpoint}/sets/${user}`, params);\r\n const json = await response.json();\r\n callback(json.data.Items);\r\n }\r\n\r\n async createSet(set, callback) {\r\n const params = {\r\n method: \"POST\",\r\n body: JSON.stringify({set})\r\n };\r\n const response = await fetch(`${config.apiEndpoint}/set`, params);\r\n const json = await response.json();\r\n callback(json);\r\n }\r\n\r\n async deleteSet(id, date_created, callback) {\r\n const params = {\r\n method: \"DELETE\",\r\n body: JSON.stringify({ id, date_created })\r\n };\r\n const response = await fetch(`${config.apiEndpoint}/set`, params);\r\n const json = await response.json();\r\n callback(json);\r\n }\r\n\r\n async signup(user, password, callback) {\r\n const params = {\r\n method: \"POST\",\r\n body: JSON.stringify({ user, password })\r\n };\r\n const response = await fetch(`${config.apiEndpoint}/signup`, params);\r\n const json = await response.json();\r\n callback(json);\r\n }\r\n\r\n async login(user, password, callback) {\r\n const params = {\r\n method: \"POST\",\r\n body: JSON.stringify({ user, password })\r\n };\r\n const response = await fetch(`${config.apiEndpoint}/login`, params);\r\n const json = await response.json();\r\n callback(json);\r\n }\r\n\r\n}\r\n\r\nexport default APIHandler;","import React, { Component } from 'react'\r\nimport \"../css/newSetPage.css\"\r\nimport InputRowComponent from '../components/newSetComponents/InputRowComponent';\r\nimport CellTitleComponent from '../components/newSetComponents/CellTitleComponent';\r\nimport ButtonComponent from '../components/generalComponents/ButtonComponent';\r\nimport APIHandler from '../apiHandler';\r\n\r\nclass NewSetPage extends Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n title: \"\",\r\n data: [[\"\"], [\"\"]],\r\n\t\t\trowCount: 1,\r\n columnCount: 2,\r\n columnNames: [\"\", \"\"],\r\n isNew: true\r\n };\r\n this.apiHandler = new APIHandler();\r\n }\r\n\r\n componentDidMount() {\r\n if (this.props.setToEdit) this.loadSetToEdit(this.props.setToEdit);\r\n }\r\n\r\n loadSetToEdit(set) {\r\n this.setState({\r\n title: set.name,\r\n data: set.data,\r\n rowCount: set.data[0].length,\r\n columnCount: set.data.length,\r\n columnNames: set.titles,\r\n isNew: false,\r\n id: set.id,\r\n date_created: set.date_created\r\n });\r\n }\r\n\r\n onColumnTitleUpdate = (text, index) => {\r\n let columnNames = this.state.columnNames;\r\n columnNames[index] = text;\r\n this.setState({columnNames});\r\n }\r\n\r\n onCellUpdate = (text, col, row) => {\r\n let data = this.state.data;\r\n data[col][row] = text;\r\n this.setState({data});\r\n }\r\n\r\n onTitleUpdate = event => {\r\n this.setState({title: event.target.value});\r\n }\r\n\r\n addRow = () => {\r\n let data = this.state.data;\r\n let rowCount = this.state.rowCount + 1;\r\n for (let col = 0; col < this.state.columnCount; col++) {\r\n data[col].push(\"\");\r\n }\r\n this.setState({data, rowCount});\r\n }\r\n\r\n addColumn = () => {\r\n if (this.state.columnCount === 6) return;\r\n \r\n let data = this.state.data;\r\n let columnCount = this.state.columnCount + 1;\r\n let columnNames = this.state.columnNames;\r\n let column = [];\r\n for (let i = 0; i < this.state.rowCount; i++) {\r\n column.push(\"\");\r\n }\r\n data.push(column);\r\n columnNames.push(\"\");\r\n this.setState({data, columnCount, columnNames});\r\n }\r\n\r\n removeColumn = index => {\r\n let data = this.state.data;\r\n let columnNames = this.state.columnNames;\r\n let columnCount = this.state.columnCount - 1;\r\n data.splice(index, 1);\r\n columnNames.splice(index, 1);\r\n this.setState({data, columnNames, columnCount});\r\n }\r\n\r\n removeRow = index => {\r\n\r\n }\r\n\r\n shiftColumn = (index, direction) => {\r\n let offset = direction === \"left\" ? -1 : 1;\r\n\r\n let data = this.state.data;\r\n let columnNames = this.state.columnNames;\r\n\r\n let column = data.splice(index, 1)[0];\r\n let name = columnNames.splice(index, 1)[0];\r\n\r\n data.splice(index + offset, 0, column);\r\n columnNames.splice(index + offset, 0, name);\r\n\r\n this.setState({\r\n data,\r\n columnNames\r\n });\r\n\r\n }\r\n\r\n onTab = (col, row) => {\r\n if (col === this.state.columnCount - 1 && row === this.state.rowCount - 1) {\r\n this.addRow();\r\n }\r\n }\r\n\r\n onSave = () => {\r\n let set = {\r\n username: this.props.user,\r\n date_created: this.state.isNew ? Date.now() : this.state.date_created,\r\n data: this.state.data,\r\n name: this.state.title,\r\n titles: this.state.columnNames\r\n };\r\n if (!this.state.isNew) {\r\n set.id = this.state.id;\r\n }\r\n this.apiHandler.createSet(set, err => {\r\n this.props.switchPage(\"dashboard\");\r\n });\r\n \r\n }\r\n\r\n render() {\r\n\r\n let rows = [];\r\n for (let row = 0; row < this.state.rowCount; row++) {\r\n let singleRow = [];\r\n for (let col = 0; col < this.state.columnCount; col++) {\r\n singleRow.push(this.state.data[col][row]);\r\n }\r\n rows.push(\r\n \r\n );\r\n }\r\n\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 this.onColumnTitleUpdate(text, index)}\r\n removeColumn={this.removeColumn}\r\n shiftColumn={this.shiftColumn}/>\r\n {rows}\r\n \r\n
\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport default NewSetPage;\r\n","import React, { Component } from 'react';\r\nimport { Textfit } from 'react-textfit';\r\nimport \"../../css/testPage.css\";\r\n\r\nclass CubeComponent extends Component {\r\n\r\n render() {\r\n\r\n let faces = [];\r\n this.props.faces.forEach((face, index) => {\r\n faces.push(\r\n
\r\n \r\n {this.props.faceValues[index]}\r\n \r\n
\r\n );\r\n });\r\n\r\n return (\r\n
\r\n
\r\n
\r\n {faces}\r\n
\r\n
\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport default CubeComponent;\r\n","import React, { Component } from 'react'\r\n\r\nclass KeyIconComponent extends Component {\r\n render() {\r\n return (\r\n
\r\n {this.props.value}\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport default KeyIconComponent;\r\n","import React, { Component } from 'react';\r\nimport KeyIconComponent from \"./KeyIconComponent\";\r\n\r\nclass FaceSelectComponent extends Component {\r\n render() {\r\n return (\r\n this.props.select(this.props.index - 1)}>\r\n {this.props.title}\r\n
.
\r\n \r\n \r\n )\r\n }\r\n}\r\n\r\nexport default FaceSelectComponent;\r\n","import React, { Component } from 'react'\r\n\r\nclass ProgressBarComponent extends Component {\r\n\r\n render() {\r\n return (\r\n
\r\n
\r\n
.
\r\n
\r\n
\r\n {Math.round(this.props.value)}%\r\n {this.props.extraText}\r\n
\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport default ProgressBarComponent;\r\n","import React, { Component } from 'react'\r\n\r\nclass FakeCubeComponent extends Component {\r\n render() {\r\n return (\r\n
\r\n
\r\n {this.props.text}\r\n
\r\n
\r\n \r\n )\r\n }\r\n}\r\n\r\nexport default FakeCubeComponent;\r\n","import React, { Component } from 'react'\r\nimport KeyIconComponent from './KeyIconComponent'\r\n\r\nclass NextCubeComponent extends Component {\r\n render() {\r\n return (\r\n
\r\n
\r\n
Incorrect
\r\n \r\n
\r\n
\r\n
Correct
\r\n \"/>\r\n
\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport default NextCubeComponent;\r\n","import React, { Component } from 'react'\r\nimport CubeComponent from \"../components/testSetComponents/CubeComponent\";\r\nimport FaceSelectComponent from '../components/testSetComponents/FaceSelectComponent';\r\nimport ProgressBarComponent from '../components/generalComponents/ProgressBarComponent';\r\nimport FakeCubeComponent from '../components/testSetComponents/FakeCubeComponent';\r\nimport ButtonComponent from '../components/generalComponents/ButtonComponent';\r\nimport \"../css/testPage.css\";\r\nimport NextCubeComponent from '../components/testSetComponents/NextCubeComponent';\r\n\r\nclass TestSetPage extends Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n const set = this.props.set;\r\n this.state = {\r\n currentFace: \"front\",\r\n currentCube: 0,\r\n faceCount: set.data.length,\r\n data: set.data,\r\n faceTitles: set.titles,\r\n faceNames: [\"front\", \"right\", \"back\", \"left\", \"top\", \"bottom\"],\r\n correctCount: 0,\r\n correct: [],\r\n complete: false\r\n };\r\n\r\n document.addEventListener(\"keydown\", event => {\r\n if (this.state.complete) return;\r\n if (Number(event.key) && Number(event.key) >= 1 && Number(event.key) <= this.state.faceCount) {\r\n this.rotateToFace(Number(event.key) - 1);\r\n } else if (event.key === \"ArrowLeft\") {\r\n this.nextCube(false);\r\n } else if (event.key === \"ArrowRight\") {\r\n this.nextCube(true);\r\n }\r\n });\r\n }\r\n\r\n onRepeat = () => {\r\n this.setState({\r\n currentFace: \"front\",\r\n currentCube: 0,\r\n correctCount: 0,\r\n correct: [],\r\n complete: false\r\n });\r\n }\r\n\r\n rotateToFace = face => {\r\n this.setState({\r\n currentFace: this.state.faceNames[face]\r\n });\r\n }\r\n\r\n nextCube = correct => {\r\n let complete = this.state.currentCube >= this.state.data[0].length - 1;\r\n this.setState({\r\n currentCube: Math.min(this.state.currentCube + 1, this.state.data[0].length),\r\n correctCount: this.state.correctCount + (correct ? 1 : 0),\r\n correct: this.state.correct.concat([correct]),\r\n currentFace: complete ? this.state.currentFace : \"front\",\r\n complete: complete\r\n });\r\n }\r\n \r\n render() {\r\n let selectors = [];\r\n this.state.faceTitles.forEach((text, index) => {\r\n selectors.push(\r\n \r\n );\r\n });\r\n\r\n let percentCorrect = 0;\r\n if (this.state.currentCube > 0) percentCorrect = this.state.correctCount / this.state.currentCube * 100;\r\n let cube = this.state.complete ? \r\n (\r\n \r\n ) : (\r\n col[this.state.currentCube])}\r\n hidden={this.state.complete}/>\r\n );\r\n\r\n return (\r\n
\r\n
\r\n {cube}\r\n
\r\n {selectors}\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n {\r\n this.state.complete && (\r\n \r\n )\r\n }\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default TestSetPage;\r\n","import React, { Component } from 'react'\r\nimport \"../../css/general.css\"\r\nimport ButtonComponent from './ButtonComponent'\r\n\r\nclass HeaderComponent extends Component {\r\n\r\n render() {\r\n return (\r\n
\r\n this.props.switchPage(this.props.loggedIn ? \"dashboard\" : \"login\")}>\r\n cubes\r\n \r\n {\r\n this.props.loggedIn && (\r\n
\r\n this.props.switchPage(\"\")}/>\r\n |\r\n this.props.switchPage(\"new\")}/>\r\n
\r\n )\r\n }\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport default HeaderComponent;\r\n","import React, { Component } from 'react'\r\nimport \"../css/loginPage.css\";\r\nimport ButtonComponent from \"../components/generalComponents/ButtonComponent\";\r\nimport APIHandler from '../apiHandler';\r\n\r\nclass LoginPage extends Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n loginUsername: \"\",\r\n loginPassword: \"\",\r\n signupUsername: \"\",\r\n signupPassword: \"\",\r\n signupConfirmPassword: \"\",\r\n loginErrorMessage: \"\",\r\n signupErrorMessage: \"\"\r\n };\r\n this.apiHandler = new APIHandler();\r\n }\r\n\r\n onLogin = () => {\r\n if (!this.state.loginUsername || !this.state.loginPassword) {\r\n this.setState({loginErrorMessage: \"Fill out both fields\"});\r\n } else {\r\n this.apiHandler.login(this.state.loginUsername, this.state.loginPassword, json => {\r\n if (!json || !json.successful) {\r\n this.setState({loginErrorMessage: \"Incorrect login\"});\r\n } else {\r\n this.props.setUser(this.state.loginUsername);\r\n this.props.switchPage(\"dashboard\");\r\n }\r\n });\r\n }\r\n }\r\n\r\n onSignup = () => {\r\n if (!this.state.signupUsername || !this.state.signupPassword || !this.state.signupConfirmPassword) {\r\n this.setState({signupErrorMessage: \"Fill out all fields\"});\r\n } else if (this.state.signupPassword !== this.state.signupConfirmPassword) {\r\n this.setState({\r\n signupConfirmPassword: \"\",\r\n signupErrorMessage: \"Passwords do not match\"\r\n });\r\n } else {\r\n this.apiHandler.signup(this.state.signupUsername, this.state.signupPassword, json => {\r\n if (!json || !json.successful) {\r\n this.setState({signupErrorMessage: json.err});\r\n } else {\r\n this.props.setUser(this.state.signupUsername);\r\n this.props.switchPage(\"dashboard\");\r\n }\r\n });\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n\r\n
\r\n
Login
\r\n
\r\n Username\r\n
\r\n {this.setState({loginUsername: event.target.value})}}/>\r\n
\r\n
\r\n
\r\n Password\r\n
\r\n {this.setState({loginPassword: event.target.value})}}/>\r\n
\r\n
\r\n \r\n
\r\n \r\n {this.state.loginErrorMessage}\r\n \r\n
\r\n
\r\n\r\n
\r\n
Signup
\r\n
\r\n Username\r\n
\r\n {this.setState({signupUsername: event.target.value})}}/>\r\n
\r\n
\r\n
\r\n Password\r\n
\r\n {this.setState({signupPassword: event.target.value})}}/>\r\n
\r\n
\r\n
\r\n Confirm Password\r\n
\r\n {this.setState({signupConfirmPassword: event.target.value})}}/>\r\n
\r\n
\r\n \r\n
\r\n \r\n {this.state.signupErrorMessage}\r\n \r\n
\r\n \r\n
\r\n\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport default LoginPage;\r\n","import React, { Component } from 'react';\nimport DashboardPage from \"./pages/DashboardPage\";\nimport NewSetPage from \"./pages/NewSetPage\";\nimport TestSetPage from \"./pages/TestSetPage\";\nimport HeaderComponent from \"./components/generalComponents/HeaderComponent\";\nimport './css/App.css';\nimport APIHandler from './apiHandler';\nimport LoginPage from './pages/LoginPage';\n\nclass App extends Component {\n\n\tconstructor(props) {\n\t\tsuper(props);\n\t\tthis.state = {\n\t\t\tuser: null,\n\t\t\tcurrentPage: \"login\",\n\t\t\tsetToEdit: null,\n\t\t\tsetToOpen: null,\n\t\t\tsets: null,\n\t\t\tloggedIn: false\n\t\t};\n\t\tthis.apiHandler = new APIHandler();\n\t}\n\n\tcomponentDidMount() {\n\t\tthis.apiHandler.getSets(this.state.user, sets => this.setState({sets}));\n\t}\n\n\tsetUser = user => {\n\t\tthis.setState({user, loggedIn: true});\n\t}\n\n\tswitchPage = (page, setToEdit, setToOpen) => {\n\t\tthis.setState({\n\t\t\tcurrentPage: page,\n\t\t\tsetToEdit: setToEdit ? setToEdit : this.state.setToEdit,\n\t\t\tsetToOpen: setToOpen ? setToOpen : this.state.setToOpen,\n\t\t\tsets: page === \"dashboard\" ? null : this.state.sets\n\t\t}, () => {\n\t\t\t// API calls to refresh, only after state has been updated\n\t\t\tif (page === \"dashboard\") {\n\t\t\t\tthis.apiHandler.getSets(this.state.user, sets => this.setState({sets}));\n\t\t\t}\n\t\t});\n\t}\n\n\tdeleteSet = (id, date_created) => {\n\t\tthis.apiHandler.deleteSet(id, date_created, err => {\n\t\t\tthis.switchPage(\"dashboard\");\n\t\t});\n\t}\n\n\trender() {\n\t\tlet page = null;\n\t\tswitch (this.state.currentPage) {\n\t\t\tcase \"new\":\n\t\t\t\tpage = (\n\t\t\t\t\t\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"test\":\n\t\t\t\tpage = ;\n\t\t\t\tbreak;\n\t\t\tcase \"login\":\n\t\t\t\tpage = (\n\t\t\t\t\t\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tpage = (\n\t\t\t\t\t\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn (\n\t\t\t
\n\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t{ page }\n\t\t\t\t
\n\t\t\t
\n\t\t );\n\t}\n}\n\nexport default App;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\n\nReactDOM.render(, document.getElementById('root'));\n"],"sourceRoot":""}