{"version":3,"sources":["Spinner.js","Categories.js","App.js","index.js"],"names":["Spinner","props","spin","items","length","state","selectedItem","Math","floor","random","setState","setTimeout","update","reset","display","document","querySelector","currItem","updater","undefined","cat","innerHTML","this","wheelVars","spinning","className","style","map","item","index","type","id","onClick","Component","Categories","handleSubmit","e","preventDefault","scroller","category","classList","contains","remove","handleChange","target","value","name","handleResize","body","clientWidth","add","hide","parseInt","delete","window","addEventListener","removeEventListener","onSubmit","placeholder","onChange","wordWrap","width","checked","App","prevState","ary","things","push","localStorage","setItem","JSON","stringify","filtered","filter","displayed","splice","stored","storedThings","parse","getItem","ReactDOM","render","getElementById"],"mappings":"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","file":"static/js/main.1c3ab92d.chunk.js","sourcesContent":["// Robert Leslie\r\n// 2021\r\n// wheel decider\r\n\r\n// https://codesandbox.io/s/github/hadriengerard/spinning-wheel-game-react?file=/src/components/wheel/index.js updated from this source\r\n\r\nimport React, { Component } from 'react';\r\nimport './App.css';\r\n\r\nclass Spinner extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n selectedItem: null\r\n };\r\n }\r\n\r\n // unused see spin and reset\r\n // selectItem = () => {\r\n // if (this.state.selectedItem === null) {\r\n // const selectedItem = Math.floor(Math.random() * this.props.items.length);\r\n // if (this.props.onSelectItem) {\r\n // this.props.onSelectItem(selectedItem);\r\n // }\r\n // this.setState({ selectedItem });\r\n // setTimeout(this.update, 4000);\r\n // } else {\r\n // this.setState({ selectedItem: null });\r\n // setTimeout(this.update, 500);\r\n // setTimeout(this.selectItem, 500);\r\n // }\r\n // }\r\n\r\n\r\n // \"spins\" the wheel only if there are choices to choose from\r\n // it does this by selecting a random number from our array and then updating our state\r\n //this forces a rerender of our component and updates css variables\r\n // also calls update after four seconds to show the result\r\n spin = () => {\r\n if(this.props.items.length === 0){\r\n return\r\n }\r\n if (this.state.selectedItem === null) {\r\n const selectedItem = Math.floor(Math.random() * this.props.items.length);\r\n this.setState({ selectedItem });\r\n setTimeout(this.update, 4000);\r\n }\r\n }\r\n\r\n // resets the button to spin, and the spinner back to the starting position\r\n // as well as updating the current value displayed\r\n reset = () => {\r\n this.setState({ selectedItem: null });\r\n setTimeout(this.update, 500);\r\n }\r\n\r\n // updates the current value displayed\r\n update = () => {\r\n const display = document.querySelector(\"#display\");\r\n let currItem = this.props.items[this.state.selectedItem];\r\n let updater = \"\";\r\n if(currItem !== undefined){\r\n updater = currItem.cat;\r\n }\r\n display.innerHTML = updater;\r\n }\r\n\r\n render() {\r\n const { selectedItem } = this.state;\r\n const items = this.props.items;\r\n\r\n const wheelVars = {\r\n '--nb-item': items.length,\r\n '--selected-item': selectedItem,\r\n };\r\n const spinning = selectedItem !== null ? 'spinning' : '';\r\n\r\n return (\r\n
\r\n
\r\n
\r\n {items.map((item, index) => (\r\n item.display &&
\r\n {item.cat}\r\n
\r\n ))}\r\n
\r\n
\r\n {spinning ? (\r\n \r\n ) : (\r\n \r\n )}\r\n

Current Selection:

\r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\n\r\nexport default Spinner;\r\n","// Robert Leslie\r\n// 2021\r\n// wheel decider\r\n\r\nimport React, {Component} from 'react';\r\n\r\nclass Categories extends Component{\r\n\r\n constructor(){\r\n super();\r\n this.state = {\r\n category: \"\"\r\n }\r\n }\r\n\r\n // calls parent with new category if category isn't empty\r\n // updates state when submitting and updates our scroller if it is hidden\r\n handleSubmit = (e) => {\r\n e.preventDefault();\r\n const scroller = document.querySelector(\".scrollable\");\r\n if(this.state.category !== \"\"){\r\n this.props.handleSubmit(this.state.category);\r\n if(scroller.classList.contains('hide')){\r\n scroller.classList.remove('hide');\r\n }\r\n }\r\n this.setState({\r\n category: \"\"\r\n });\r\n }\r\n\r\n // handles when someone enters a value into our input\r\n handleChange = (e) => {\r\n const {value, name} = e.target;\r\n this.setState({\r\n [name]: value\r\n });\r\n }\r\n\r\n // handles when screen is resized, it checks if the window is under 1200\r\n // it will hide our scroll area if there are no items or show it if we are above 1200px\r\n handleResize = () => {\r\n const scroller = document.querySelector(\".scrollable\");\r\n if(document.body.clientWidth < 1200 && !this.props.items.length > 0){\r\n scroller.classList.add('hide');\r\n }else if (document.body.clientWidth > 1200){\r\n scroller.classList.remove('hide');\r\n }\r\n }\r\n\r\n // calls parent with current index to hide item\r\n hide = (e) => {\r\n this.props.hide(parseInt(e.target.name));\r\n }\r\n\r\n // calls parent with current index to delete item\r\n delete = (e) => {\r\n this.props.delete(parseInt(e.target.name));\r\n }\r\n\r\n // adds window event to close scroller if needed\r\n componentDidMount(){\r\n window.addEventListener('resize', this.handleResize);\r\n }\r\n\r\n // removes window event to close scroller if needed\r\n componentWillUnmount(){\r\n window.removeEventListener('resize', this.handleResize);\r\n }\r\n\r\n render(){\r\n return(\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n

Categories:

\r\n
\r\n

Hide:

\r\n

Delete:

\r\n
\r\n \r\n
\r\n {
\r\n { this.props.items.map((item, index) => (\r\n
\r\n

{item.cat}

\r\n
\r\n \r\n \r\n \r\n\r\n
\r\n \r\n
\r\n ))}\r\n
}\r\n \r\n
\r\n \r\n )\r\n }\r\n}\r\n\r\nexport default Categories;\r\n","// Robert Leslie\n// 2021\n// wheel decider\n\nimport React, {Component} from 'react';\nimport Spinner from './Spinner';\nimport Categories from './Categories';\n\nclass App extends Component {\n constructor(){\n super();\n let stored = [];\n let filtered = [];\n if(localStorage.storedThings !== undefined){\n stored = JSON.parse(localStorage.getItem(\"storedThings\"));\n filtered = stored.filter(item => {\n return item.display\n });\n } \n this.state = {\n things: stored,//['Pizzas', 'Sandwiches', 'Salads', 'Soup', 'Japanese food', 'Pastas']\n displayed: filtered\n }\n }\n\n // called from component, given new category\n // appends cat to array then sets new state with updated value\n // it also sets a filtered array based on which is currently checked to be displayed\n handleSubmit = (cat) => {\n this.setState(prevState => {\n let ary = prevState.things;\n ary.push({cat, display:true})\n localStorage.setItem(\"storedThings\", JSON.stringify(ary));\n let filtered = ary.filter(item => {\n return item.display\n });\n return{\n things: ary,\n displayed: filtered\n }\n });\n }\n\n // called from component, given an index into things array\n // changes display value of current item then sets new state with updated value\n // it also sets a filtered array based on which is currently checked to be displayed\n hide = (index) => {\n this.setState(prevState => {\n let ary = prevState.things;\n ary[index].display = !ary[index].display;\n localStorage.setItem(\"storedThings\", JSON.stringify(ary));\n let filtered = ary.filter(item => {\n return item.display\n })\n return{\n things: ary,\n displayed: filtered\n }\n });\n }\n\n // called from component, given current index into things array\n // deletes item from things array then sets new state with updated value\n // it also sets a filtered array based on which is currently checked to be displayed\n delete = (index) => {\n this.setState(prevState => {\n let ary = prevState.things;\n ary.splice(index, 1);\n localStorage.setItem(\"storedThings\", JSON.stringify(ary));\n let filtered = ary.filter(item => {\n return item.display\n })\n return{\n things: ary,\n displayed: filtered\n }\n });\n }\n\n render(){\n return (\n
\n

Wheely Good Choices

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