{"version":3,"sources":["context/scoreContext.js","components/Buttons/Buttons.jsx","components/Score/Score.jsx","pages/RetryMenu.jsx","pages/SavedMenu.jsx","pages/SaveScorePage.jsx","pages/HighScores.jsx","components/Keyboard/KeyboardKey.jsx","components/Keyboard/KeyboardLayout.jsx","components/Keyboard/Keyboard.jsx","components/WordStack/WordStack.jsx","utils/ArrayShuffle.jsx","pages/Game.jsx","components/Instructions/Instructions.jsx","App.js","index.js"],"names":["ScoreContext","createContext","Play","props","handlePlay","className","onClick","PlayButtons","reset","useContext","setScore","setLevel","SaveButton","SaveScore","handleSave","saved","HighScores","GoBack","Score","score","level","multiplier","RetryMenu","setActive","setSaved","to","username","useState","position","setPosition","a","axios","get","data","findIndex","useEffect","getPosition","style","marginBottom","SaveScorePage","setUsername","success","setSuccess","failed","setFailed","type","placeholder","onChange","e","target","value","post","then","res","setTimeout","catch","err","scores","setScores","allScores","setAllScores","console","log","average","i","length","toFixed","map","KeyboardKey","letter","active","upHandler","key","downHandler","window","addEventListener","useKeyPress","toUpperCase","KeyboardLayout","index","Keyboard","WordStack","wordMatch","selWordIndex","isActive","setMultiplier","words","setWords","handleWordStack","randomWords","setRandomWords","typed","setTyped","correct","setCorrect","inputRef","useRef","keyInput","setKeyInput","time","setTime","elapsedTime","setElapsedTime","wordCountdown","prevState","array","randomIndex","currentIndex","Math","floor","random","ArrayShuffle","d","pop","temp","push","current","focus","elem","text","highlight","highlighted","RegExp","parts","split","indexOf","part","highlightMatchedText","test","preventDefault","ref","id","onKeyUp","Date","now","timeSpent","splice","handleKeyUp","onKeyDown","keyCode","handleKeyDown","Game","init","setInit","wordStack","setWordStack","Instructions","App","start","setStart","Provider","path","exact","ReactDOM","render","StrictMode","basename","process","document","getElementById"],"mappings":"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","file":"static/js/main.731014f3.chunk.js","sourcesContent":["import { createContext } from \"react\";\n\n\nexport const ScoreContext = createContext(null);\n\n\n","import React, { useContext } from 'react'\nimport { ScoreContext } from '../../context/scoreContext';\nimport './Buttons.css'\n\nfunction Play(props) {\n\n const handlePlay = props.handlePlay;\n\n return (\n \n )\n}\n\n\nfunction PlayButtons(props) {\n\n const reset = props.reset;\n\n const { setScore, setLevel } = useContext(ScoreContext);\n\n function handlePlayButton() {\n setScore(0);\n setLevel(1);\n reset();\n }\n\n return (\n \n\n )\n}\n\nfunction SaveButton(props) {\n return ()\n}\n\nfunction SaveScore(props) {\n const handleSave = props.handleSave;\n const saved = props.saved;\n return (\n \n )\n}\n\nfunction HighScores(props) {\n return (\n \n )\n}\n\nfunction GoBack(props) {\n return (\n \n )\n}\n\nexport { Play, PlayButtons, SaveButton, SaveScore, HighScores, GoBack };\n","import React, { useContext } from 'react'\nimport { ScoreContext } from '../../context/scoreContext';\nimport './Score.css'\n\n\nexport default function Score(props) {\n\n const { score, level, multiplier } = useContext(ScoreContext);\n\n return (\n
\n

Score: {score}

\n

Level: {level}

\n {multiplier === 0 ? \" \" :

Multiplier: {multiplier}

}\n
\n )\n}\n","import React, { useContext } from 'react'\nimport { ScoreContext } from '../context/scoreContext'\nimport { PlayButtons, SaveButton, HighScores } from '../components/Buttons/Buttons'\nimport './MenuStyles.css'\nimport Score from '../components/Score/Score';\nimport { Link } from 'react-router-dom';\n\nexport default function RetryMenu() {\n const { setActive, setSaved } = useContext(ScoreContext);\n\n function resetGame() {\n setActive(true);\n setSaved(0);\n }\n\n return (\n
\n \n

Stack limit reached

\n \n \n \n \n \n \n \n
\n )\n}","import React, { useContext, useEffect, useState } from 'react'\nimport { ScoreContext } from '../context/scoreContext'\nimport { PlayButtons, HighScores } from '../components/Buttons/Buttons'\nimport './MenuStyles.css'\nimport axios from 'axios';\nimport { Link } from 'react-router-dom';\n\nexport default function RetryMenu(props) {\n const { setActive, score, level, setSaved } = useContext(ScoreContext);\n\n const username = props.username;\n\n const [position, setPosition] = useState(null);\n\n function resetGame() {\n setActive(true);\n setSaved(0);\n }\n\n useEffect(() => {\n getPosition();\n })\n\n async function getPosition() {\n const {data} = await axios.get('https://word-racer-server.herokuapp.com/scores/all');\n // let position = data.filter(score => score.username === username)\n let position = data.findIndex(score => score.username === username)\n setPosition(position + 1);\n }\n\n return (\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
PosUsernameScoreLevel
{position}{username}{score}{level}
\n \n \n \n \n
\n )\n}","import React, { useContext, useState } from 'react';\nimport { SaveScore } from '../components/Buttons/Buttons';\nimport Score from '../components/Score/Score';\nimport { ScoreContext } from '../context/scoreContext';\nimport { Link } from 'react-router-dom';\nimport { GoBack } from '../components/Buttons/Buttons';\nimport axios from 'axios';\nimport SavedMenu from './SavedMenu';\n\n\nexport default function SaveScorePage() {\n\n const { score, level, saved, setSaved, username, setUsername } = useContext(ScoreContext);\n \n\n const [success, setSuccess] = useState(0);\n const [failed, setFailed] = useState(0);\n\n const data = { username, score, level };\n\n function handleSave() {\n if(!username) {\n setSuccess(2);\n setTimeout(() => { setSuccess(0) }, 1500);\n } else {\n setSaved(1);\n axios\n .post(`https://word-racer-server.herokuapp.com/scores`, data)\n .then((res) => {\n setSaved(2);\n // alert(\"Saved Successfully\");\n setSuccess(1);\n setTimeout(() => { setSuccess(0) }, 400);\n // setTimeout(() => { setSaved(0) }, 3000);\n })\n .catch((err) => {setFailed(1); setSaved(0); setTimeout(() => {setFailed(0)}, 2000)});\n \n }\n }\n\n return (\n <>\n \n { saved !== 2 ? \n
\n

{success === 0 && success !== 1 ? \"\" : \"Username cannot be empty.\"}

\n

{failed === 1 ? \"Username already exists.\" : \"\"}

\n setUsername(e.target.value)} />\n \n \n \n \n
\n : }\n \n )\n}\n","import React, { useState } from 'react'\nimport { useEffect } from 'react';\nimport axios from 'axios';\nimport { GoBack } from '../components/Buttons/Buttons';\nimport { Link } from 'react-router-dom'\n\n\nexport default function SaveScorePage() {\n\n const [scores, setScores] = useState(null);\n const [allScores, setAllScores] = useState(null);\n\n useEffect(() => {\n // axios.get('http://localhost:5000/scores').then(({ data }) => setScores(data)).catch((err) => console.log(err));\n axios.get('https://word-racer-server.herokuapp.com/scores').then(({ data }) => setScores(data)).catch((err) => console.log(err));\n axios.get('https://word-racer-server.herokuapp.com/scores/all').then(({ data }) => setAllScores(data)).catch((err) => console.log(err));\n }, [])\n\n let average = 0;\n\n if (allScores) {\n\n\n for (let i = 0; i < allScores.length; i++) {\n average = average + allScores[i].score;\n }\n\n average = (average / allScores.length).toFixed(0);\n }\n\n return (\n
\n

High Scores

\n \n \n \n \n \n
Average score: {average ? average : \"\"}Max level reached: {scores ? scores[0].level : \"\"}
\n \n \n \n \n \n \n \n \n \n\n \n {\n scores ? scores.map(({ username, score, level }, i) => (\n \n \n \n \n \n \n )) : \"loading\"\n }\n \n
PosUsernameScoreLevel
{i + 1}{username}{score}{level}
\n\n \n \n \n
\n )\n}\n","import { useState, useEffect } from 'react'\n\nconst KeyboardKey = (props) => {\n\n const letter = props.data;\n\n const [active, setActive] = useState(false);\n\n\n function useKeyPress() {\n function upHandler({ key }) {\n if (key === letter) {\n setActive(false);\n }\n }\n\n function downHandler({ key }) {\n if (key === letter) {\n setActive(true);\n }\n }\n\n useEffect(() => {\n window.addEventListener(\"keydown\", downHandler);\n window.addEventListener(\"keyup\", upHandler);\n }, []);\n }\n\n useKeyPress();\n\n return (\n \n )\n}\n\nexport default KeyboardKey","import React from 'react'\nimport KeyboardKey from './KeyboardKey';\n\nexport default function KeyboardLayout() {\n const row_qwerty = [\n \"q\", \"w\", \"e\", \"r\", \"t\", \"y\", \"u\", \"i\", \"o\", \"p\",\n ];\n\n const row_asdf = [\n \"a\", \"s\", \"d\", \"f\", \"g\", \"h\", \"j\", \"k\", \"l\",\n ]\n\n const row_zxcv = [\"z\", \"x\", \"c\", \"v\", \"b\", \"n\", \"m\",]\n\n return (\n
\n {row_qwerty.map((key, index) => )}\n
{row_asdf.map((key, index) => )}
\n {row_zxcv.map((key, index) => )}\n
\n )\n}\n","import './Keyboard.css'\nimport KeyboardLayout from \"./KeyboardLayout\";\n\nconst Keyboard = (props) => {\n\n\n return (\n
\n \n
\n );\n}\n\nexport default Keyboard;","import \"./WordStack.css\";\nimport { useState, useRef, useEffect, useContext } from \"react\";\nimport { ScoreContext } from \"../../context/scoreContext\";\nimport ArrayShuffle from \"../../utils/ArrayShuffle\";\n\nexport default function WordStack(props) {\n\n const { score, setScore, setLevel, isActive, setActive, level, multiplier, setMultiplier } = useContext(ScoreContext);\n\n const words = props.words;\n const setWords = props.handleWordStack;\n\n const [randomWords, setRandomWords] = useState([\"cleannesses\", \"deceivable\", \"enfeebled\", \"cattle\", \"recrudesce\", \"propagandizing\", \"epigrapher\", \"grandeur\", \"sporulating\", \"proglottis\", \"vanpoolings\", \"cohosted\", \"drains\", \"untitled\", \"moundbirds\", \"circumstantial\", \"curricles\", \"thrombus\", \"repellents\", \"weirdie\", \"contrivers\", \"pedometer\", \"fanaticism\", \"exchanged\", \"harmfulness\", \"rearousing\", \"hysterectomy\", \"digressional\", \"tomcats\", \"prelector\", \"stakeout\", \"signalizes\", \"fictionalized\", \"clank\", \"unicolor\", \"nulled\", \"kittens\", \"algometers\", \"reactions\", \"referral\", \"aures\", \"multimode\", \"tonne\", \"wildlings\", \"armlets\", \"toilsome\", \"priggisms\", \"tacklings\", \"academician\", \"paupered\"]);\n\n\n\n const DEFAULT_SCORE = 100;\n\n const [typed, setTyped] = useState(\"\");\n const [correct, setCorrect] = useState(null);\n const inputRef = useRef();\n const [keyInput, setKeyInput] = useState('');\n\n const [time, setTime] = useState(null);\n const [elapsedTime, setElapsedTime] = useState(null);\n\n \n let wordMatch;\n let selWordIndex;\n\n const wordCountdown = 3000;\n\n useEffect(() => {\n\n if (score >= 300 * level) {\n setLevel(prevState => prevState + 1);\n }\n let levelUpTimer = (wordCountdown - ((wordCountdown / 10) * level)) > 1200 ? wordCountdown - ((wordCountdown / 10) * level) : 1200;\n\n setTimeout(() => {\n let data = ArrayShuffle([...randomWords])\n let d = data.pop();\n // console.log(d);\n let temp = [...words];\n temp.push(d);\n setRandomWords(data);\n setWords(temp);\n }, levelUpTimer)\n\n setActive(true);\n\n if (words.length === 7) {\n // alert(\"Game Over\");\n setMultiplier(0);\n setActive(false);\n return;\n }\n\n if (isActive && typed === \"\") {\n inputRef.current.focus();\n }\n }, [typed, words, setActive, isActive, setWords]);\n\n function highlightMatchedText(text, highlight, i) {\n\n const highlighted = new RegExp(`^(${highlight})`, 'iy');\n const parts = text.split(highlighted);\n\n if(parts[0] === '' && parts[2] === '') {\n selWordIndex = words.indexOf(parts[1]);\n wordMatch = parts[1];\n }\n\n return
{ parts.map((part, i) => \n \n { part }\n )\n }
;\n }\n\n const handleKeyUp = ({ key }) => {\n\n if (key.length !== 1) {\n setTyped(\"\");\n return;\n }\n\n let word = wordMatch;\n \n if (words && word && word.toUpperCase() === (keyInput).toUpperCase()) {\n setElapsedTime(Date.now());\n\n let timeSpent = elapsedTime ? ((time - elapsedTime) / 1000) : 0;\n\n setKeyInput('');\n inputRef.current.value = \"\";\n\n if (score === 0 || timeSpent < 0) { setScore(prevState => prevState + DEFAULT_SCORE); }\n else {\n setScore(prevState => prevState + Math.floor((DEFAULT_SCORE * multiplier - (timeSpent * 10))));\n }\n\n // console.log(\"matched\");\n let temp = words;\n temp.splice(selWordIndex, 1);\n setWords(temp);\n setMultiplier((multiplier * 1.2).toFixed(2));\n // console.log(\"Multiplier: \" + multiplier);\n setCorrect(true);\n\n setTimeout(() => { setCorrect(false); }, 400);\n\n } else {\n setTime(Date.now());\n }\n };\n\n const handleKeyDown = (e) => {\n if(e.keyCode === 8) {\n setMultiplier(1);\n }\n }\n\n\n return (\n <>\n {isActive ?\n <>\n
\n {words.map((elem, i) => highlightMatchedText(elem, keyInput, i))}\n\n
\n { \n let re = /[0-9a-zA-Z]+/g; \n if (re.test(e.target.value)) {\n setKeyInput(e.target.value)\n } else { e.preventDefault() };\n }}\n ref={inputRef}\n type=\"text\"\n className={`words--keys ${correct ? \"words--keys--correct\" : ''}`}\n id=\"keys\"\n onKeyUp={(e) => handleKeyUp(e)}\n onKeyDown={(e) => handleKeyDown(e)}\n />\n
\n
\n \n : \"\"}\n \n );\n}","export default function ArrayShuffle(array) {\n var currentIndex = array.length, randomIndex;\n\n // While there remain elements to shuffle...\n while (0 !== currentIndex) {\n\n // Pick a remaining element...\n randomIndex = Math.floor(Math.random() * currentIndex);\n currentIndex--;\n\n // And swap it with the current element.\n [array[currentIndex], array[randomIndex]] = [\n array[randomIndex], array[currentIndex]];\n }\n\n return array;\n}\n","import React, { useState, useContext } from 'react'\nimport Keyboard from '../components/Keyboard/Keyboard'\nimport WordStack from '../components/WordStack/WordStack'\nimport Score from '../components/Score/Score'\nimport axios from 'axios';\nimport { ScoreContext } from '../context/scoreContext';\n\nexport default function Game() {\n\n const [init, setInit] = useState(false);\n\n const [wordStack, setWordStack] = useState([]);\n let randomWords = [];\n\n // const [currWord]\n\n const { setMultiplier } = useContext(ScoreContext);\n\n const getWords = () => {\n axios.get('https://random-word-api.herokuapp.com/word?number=4').then(({ data }) => {setWordStack(data.splice(0, 4)); randomWords = data.splice(4,100)}).catch((err) => console.log(err));\n }\n\n if (!init) {\n getWords();\n setMultiplier(1);\n setInit(true);\n }\n\n return (\n <>\n \n {wordStack.length === 0 ? \"Loading...\" : }\n \n \n )\n}\n","import React from 'react'\nimport { Play } from '../Buttons/Buttons';\nimport \"./Instructions.css\"\nexport default function Instructions(props) {\n\n const setInit = props.setInit;\n\n const handleSetInit = () => {\n return setInit(true);\n }\n\n return (\n
\n

MERN Word Racer

\n

Instructions to play the game

\n
    \n
  • Words will appear upon starting the game
  • \n
  • Start typing any word from the stack
  • \n
  • Words will appear one by one with initial stack size of 4
  • \n
  • Words will appear faster as you score and level up
  • \n
  • If the stack reaches 7 words, the game is over
  • \n
\n Start\n
\n )\n}","import { useState } from \"react\";\nimport \"./components/Keyboard/Keyboard.css\";\nimport { ScoreContext } from \"./context/scoreContext\";\nimport RetryMenu from \"./pages/RetryMenu\";\nimport SaveScorePage from \"./pages/SaveScorePage\";\nimport { Switch, Route, Redirect } from \"react-router-dom\";\nimport HighScores from \"./pages/HighScores\";\nimport Game from \"./pages/Game\";\nimport Instructions from \"./components/Instructions/Instructions\";\n\nfunction App() {\n const [score, setScore] = useState(0);\n const [level, setLevel] = useState(1);\n const [isActive, setActive] = useState(true);\n const [start, setStart] = useState(false);\n const [multiplier, setMultiplier] = useState(1);\n const [saved, setSaved] = useState(0);\n const [username, setUsername] = useState(null);\n\n return (\n
\n \n \n \n \n \n \n {score !== 0 ? : }\n \n \n {start ? (\n isActive ? (\n \n ) : (\n \n )\n ) : (\n \n )}\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';\nimport { BrowserRouter as Router } from \"react-router-dom\";\n\nReactDOM.render(\n \n \n \n \n ,\n document.getElementById('root')\n);\n\n"],"sourceRoot":""}