{"version":3,"sources":["pages/event/EventRepository.jsx","components/Delta.jsx","components/Matches.jsx","pages/event/EventPage.jsx","pages/events/EventsRepository.jsx","pages/events/EventsTable.jsx","pages/events/EventsPage.jsx","images/logo.svg","images/cm.svg","images/qm.svg","images/bm.svg","images/sm.svg","images/lm.svg","components/Leaderboard.jsx","pages/HomePage.jsx","components/Rank.jsx","pages/UserPage.jsx","pages/LeaderboardPage.jsx","images/icon.svg","App.jsx","reportWebVitals.js","index.jsx"],"names":["eventKey","apiURI","eventsRoute","loadEvent","eventId","a","uniqueEventKey","event","eventEndpoint","axios","get","response","data","success","console","log","localStorage","JSON","stringify","undefined","cachedData","Delta","delta","deltaUI","className","parseInt","Matches","heading","matches","someUser","matchRows","map","match","to","id","src","image","alt","height","p1","name","elo","p2","class","score","Date","time","toLocaleDateString","scope","ResultCell","isWin","resultUI","EventPage","location","useLocation","useState","setEvent","info","setInfo","setMatches","useEffect","fetchEvent","pathname","split","sort","sortByLatestDate","window","scrollTo","b","dateA","renderDateRange","dates","descrptionHTML","description","links","style","textDecoration","color","dateRange","locale","options","weekday","year","month","day","startDate","start","endDate","end","EventDescription","parse","Links","eventSources","Object","keys","source","_","href","target","rel","word","toUpperCase","substring","toLowerCase","eventsKey","loadEvents","events","reverse","EventsTable","setEvents","currentEvents","error","fetchEvents","tableRows","eventPreview","EventsPage","Leaderboard","props","state","this","setState","players","player","i","CM","QM","BM","SM","LM","rank","icon","cm","qm","bm","sm","lm","backgroundColor","wins","losses","norms","React","Component","HomePage","logo","Rank","UserPage","user","setUser","ratings","setRatings","fetchUser","uid","matchesReverse","slice","date","push","after","matchesUI","populateUI","width","fontSize","fontWeight","length","LineChart","margin","top","right","left","bottom","CartesianGrid","strokeDasharray","verticalPoints","YAxis","interval","domain","ticks","Tooltip","content","payload","textAlign","padding","borderRadius","opacity","Line","type","dataKey","stroke","dot","LeaderboardPage","App","exact","path","element","reportWebVitals","onPerfEntry","Function","then","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.3c943567.chunk.js","sourcesContent":["import axios from 'axios';\n\nconst eventKey = `beatquest_event`;\nconst apiURI = \"https://api.beatquest.com\";\nconst eventsRoute = \"/event/\";\n\n/**\n * Tries to fetch event from endpoint asynchronously.\n * If not available, the function checks if there is\n * a cache of `events` in localStorage, before just\n * returning an empty array (WIP).\n * @returns Array of events\n */\nexport async function loadEvent(eventId) {\n let uniqueEventKey = eventKey + eventId;\n let event = {};\n const eventEndpoint = apiURI + eventsRoute + eventId;\n const response = await axios.get(eventEndpoint);\n if (response.data.success) {\n console.log(`Successfully retrieved data for event ${eventId}`);\n localStorage[uniqueEventKey] = JSON.stringify(response.data);\n event = response.data.data;\n } else if (localStorage[uniqueEventKey] !== undefined) {\n console.log(`Using cached data for event ${eventId}`);\n let cachedData = localStorage[uniqueEventKey];\n event = cachedData.data;\n } else {\n console.log(`Unable to reach server and there was not a local cache of event with id ${eventId}`);\n }\n\n return event;\n}","const Delta = ({ delta }) => {\n let deltaUI = ⬤ 0;\n if (delta > 0) {\n deltaUI = (\n ▲ {parseInt(delta)}\n );\n } else if (delta < 0) {\n deltaUI = (\n ▼ {parseInt(delta)}\n );\n }\n return deltaUI;\n};\n\nexport default Delta;\n","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport Delta from './Delta';\n\n/**\n *\n * @param {String} heading The title of the matches.\n * @param {Match[]} matches Array of matches object to populate the table.\n * @param {User?} someUser An optional User object that will add an extra \"Result\" column, specifying if the player won or lost when used\n * @returns {HTML div} Formatted Table DOM element with \"matches.\"\n */\nexport const Matches = ({\n heading = 'Recent Matches',\n matches,\n someUser = null,\n}) => {\n const buildMatchRow = (match) => {\n return (\n \n \n \n {match.event.image}\n \n \n \n
\n {match.p1.name}{' '}\n \n
\n {match.p2.name}{' '}\n \n \n \n
{match.p1.score}
\n {match.p2.score}\n \n \n \n {new Date(match.time).toLocaleDateString()}\n \n \n );\n };\n let matchRows = matches.map(buildMatchRow);\n\n return (\n
\n

{}

\n \n \n \n \n \n \n {someUser ? : <>}\n \n \n \n {matchRows}\n
EventPlayersScoreResultDate
\n
\n );\n};\n\nconst ResultCell = ({ match, someUser = null }) => {\n if (!someUser) return <>;\n\n const user = someUser;\n\n const player = user.name === match.p1.name ? 'p1' : 'p2';\n\n const isWin = (delta) => {\n return delta > 0;\n };\n\n let win;\n player === 'p1'\n ? (win = isWin(match.p1.elo.delta))\n : (win = isWin(match.p2.elo.delta));\n const resultUI =\n win === true ? (\n
W
\n ) : (\n
L
\n );\n\n return {resultUI};\n};\n","/*\n> transition from clicking on the specific event\nMatches\n{ An idividual match\n(rank logo) Player 1 (Elo before) vs. (rank logo) [Player 2 ](links to the individual player)(Elo before)\nScore: 2-0 (this comes from the players)\n}\n*/\n\n// TODO: Sort matches\n\nimport React, {useState, useEffect} from 'react';\nimport { useLocation, Link } from 'react-router-dom';\nimport { loadEvent } from \"./EventRepository\";\nimport parse from 'html-react-parser';\nimport { Matches } from '../../components/Matches';\n\nexport function EventPage() {\n\n const location = useLocation();\n const [event, setEvent] = useState(null);\n const [info, setInfo] = useState();\n const [matches, setMatches] = useState([]);\n\n useEffect(() => {\n // Moved inside the function (see react-hooks/exhaustive-deps)\n const fetchEvent = async () => {\n if (location.pathname) {\n const id = location.pathname.split('/')[2];\n const data = await loadEvent(id);\n data.matches = data.matches.sort(sortByLatestDate);\n setEvent(data);\n \n console.log(data);\n }\n }\n\n window.scrollTo(0,0);\n fetchEvent();\n }, [location]);\n\n useEffect(() => {\n const populateUI = () => {\n if (!event) return;\n \n setInfo(event.info);\n setMatches(event.matches);\n }\n\n populateUI();\n }, [event]);\n\n const sortByLatestDate = (a, b) => {\n let dateA = new Date(a.time),\n dateB = new Date(b.time);\n return dateB - dateA;\n } \n\n return
\n {info ? (\n
\n {info.name}\n

{info.name}

\n

{renderDateRange(info.dates)}

\n

Description

\n \n \n \n \n See all events\n \n
\n ) :

Loading...

}\n
;\n}\n\nfunction capitalize(word) {\n return word[0].toUpperCase() + word.substring(1).toLowerCase();\n}\n\nfunction renderDateRange(dateRange, locale=\"en-us\") {\n if (dateRange != null) {\n var options = { weekday: 'short', year: 'numeric', month: 'long', day: 'numeric' };\n let startDate = new Date(dateRange.start);\n let endDate = new Date(dateRange.end);\n return `${startDate.toLocaleDateString(locale, options)} - ${endDate.toLocaleDateString(locale, options)}`;\n } else {\n return \"No dates reported.\"\n }\n}\n\nconst EventDescription = ({descrptionHTML}) => {\n return
\n { descrptionHTML ?\n parse(descrptionHTML) :\n

\"No Description. Just a cool event!\"

\n }\n
\n}\n\nconst Links = ({links}) => {\n let eventSources = links ? Object.keys(links).map((source, _) => {\n return (\n \n \n \n {capitalize(source)}\n \n \n \n )\n }) : Loading...;\n\n return (\n
\n

Links

\n \n \n {eventSources}\n \n
\n
\n )\n}\n\n","import axios from 'axios';\n\nconst eventsKey = `beatquest_events`;\nconst apiURI = \"https://api.beatquest.com\";\nconst eventsRoute = \"/events\";\n\n/**\n * Tries to fetch event from endpoint asynchronously.\n * If not available, the function checks if there is\n * a cache of `events` in localStorage, before just\n * returning an empty array (WIP).\n * @returns Array of events\n */\nexport default async function loadEvents() {\n let events = [];\n const eventsEndpoint = apiURI + eventsRoute;\n const response = await axios.get(eventsEndpoint);\n if (response.data.success) {\n localStorage[eventsKey] = JSON.stringify(response.data);\n events = response.data.data;\n } else if (localStorage[eventsKey] !== undefined) {\n let cachedData = localStorage[eventsKey];\n events = cachedData.data;\n } \n\n return events.sort().reverse();\n}","import React, {useState, useEffect} from 'react';\nimport loadEvents from './EventsRepository';\nimport { Link } from 'react-router-dom';\n\nexport default function EventsTable() {\n\n const [events, setEvents] = useState([]);\n\n useEffect(() => {\n async function fetchEvents() {\n try {\n const currentEvents = await loadEvents();\n console.log(`Successfully set events to ${currentEvents[0].name}`);\n setEvents(currentEvents);\n } catch (error) {\n console.error(error);\n }\n }\n fetchEvents();\n }, []);\n\n const tableRows = events.map((eventPreview, _) => {\n console.log(`eventPreview.id: ${eventPreview.id}`);\n return (\n \n \n {\n \"\"\n }\n {{eventPreview.name}}\n

{eventPreview.matches} Matches

\n \n {eventPreview.matches} Matches\n \n )\n });\n\n return (\n \n \n \n \n \n \n \n \n {tableRows}\n \n
EventMatches
\n );\n}\n","import React from 'react';\nimport EventsTable from './EventsTable';\n\nexport function EventsPage() {\n return (\n
\n

Events

\n \n
\n )\n}\n","export default __webpack_public_path__ + \"static/media/logo.66638786.svg\";","export default __webpack_public_path__ + \"static/media/cm.e41e4851.svg\";","export default __webpack_public_path__ + \"static/media/qm.4e6f67e0.svg\";","export default __webpack_public_path__ + \"static/media/bm.c6f8f347.svg\";","export default __webpack_public_path__ + \"static/media/sm.f76459ab.svg\";","export default __webpack_public_path__ + \"static/media/lm.5869fc5f.svg\";","import React from 'react';\nimport axios from 'axios';\n\nimport cm from '../images/cm.svg';\nimport qm from '../images/qm.svg';\nimport bm from '../images/bm.svg';\nimport sm from '../images/sm.svg';\nimport lm from '../images/lm.svg';\nimport { Link } from 'react-router-dom';\n\nclass Leaderboard extends React.Component {\n constructor(props) {\n super(props);\n this.state = {};\n }\n\n async componentDidMount() {\n const data = await axios.get('https://api.beatquest.com/leaderboard');\n this.setState({ data: data.data.data });\n }\n\n render() {\n if (this.state.data) {\n const players = this.state.data.map((player, i) => {\n var delta =
⬤ 0
;\n if (player.delta > 0) {\n delta = (\n
▲ {player.delta}
\n );\n } else if (player.delta < 0) {\n delta = (\n
▼ {player.delta}
\n );\n }\n var color = {\n CM: '#e47d22',\n QM: '#cfd2d3',\n BM: '#f0f328',\n SM: '#a0ddd1',\n LM: '#51ebfd',\n }[player.rank];\n var icon = {\n CM: cm,\n QM: qm,\n BM: bm,\n SM: sm,\n LM: lm,\n }[player.rank];\n return (\n \n {i + 1}\n \n {player.elo}\n {player.matches < 5 && <> (??)}\n {delta}\n \n \n {player.name}\n {{player.name}}\n {player.rank !== 'N' && (\n <>\n
\n \n \n {player.rank}\n {' '}\n {player.rank}\n \n \n )}\n \n \n {player.matches} Matches\n
\n \n {player.wins + player.losses} Maps\n \n \n \n {player.wins}/{player.losses}\n
\n {player.norms} Norms\n \n \n );\n });\n return (\n \n \n \n \n \n \n \n \n \n \n {players}\n
#RatingPlayerMatchesW/L
\n );\n } else return <>;\n }\n}\n\nexport default Leaderboard;\n","import React from 'react';\n\nimport logo from '../images/logo.svg';\nimport cm from '../images/cm.svg';\nimport qm from '../images/qm.svg';\nimport bm from '../images/bm.svg';\nimport sm from '../images/sm.svg';\nimport lm from '../images/lm.svg';\n\nimport Leaderboard from '../components/Leaderboard';\nimport EventsTable from './events/EventsTable';\n\nfunction HomePage() {\n var color = {\n CM: '#e47d22',\n QM: '#cfd2d3',\n BM: '#f0f328',\n SM: '#a0ddd1',\n LM: '#51ebfd',\n };\n var icon = {\n CM: cm,\n QM: qm,\n BM: bm,\n SM: sm,\n LM: lm,\n };\n\n return (<>\n
\n
\n
\n \"logo\"\n
\n
\n

Beat Saber Competitive Rankings

\n

\n \n \n \"CM\"\n \n CM\n  \n Candidate Master: Has played 5+ matches and 1500+ peak elo\n

\n

\n \n \n \"CM\"\n \n QM\n  \n Quest Master: Has played 5+ matches and 1800+ peak elo\n

\n

\n \n \n \"CM\"\n \n BM\n  \n Beat Master: Has played 5+ matches and 2000+ peak elo\n

\n

\n \n \n \"CM\"\n \n SM\n  \n Saber Master: Has 2200+ peak elo and 5+ norm matches\n

\n

\n \n \n \"CM\"\n \n LM\n  \n Legendary Master: Has achieved SM and 2500+ peak elo\n

\n
\n
\n
\n
\n

Top Players

\n \n
\n
\n

Top Events

\n \n
\n
\n );\n}\n\nexport default HomePage;\n","import cm from '../images/cm.svg';\nimport qm from '../images/qm.svg';\nimport bm from '../images/bm.svg';\nimport sm from '../images/sm.svg';\nimport lm from '../images/lm.svg';\n\nconst Rank = ({ rank }) => {\n const color = {\n CM: '#e47d22',\n QM: '#cfd2d3',\n BM: '#f0f328',\n SM: '#a0ddd1',\n LM: '#51ebfd',\n }[rank];\n\n const icon = {\n CM: cm,\n QM: qm,\n BM: bm,\n SM: sm,\n LM: lm,\n }[rank];\n\n return (\n <>\n {rank !== 'N' && (\n \n \n {rank}\n \n {rank}\n \n )}\n \n );\n};\n\nexport default Rank;\n","import { useEffect, useState } from 'react';\nimport { LineChart, Line, YAxis, CartesianGrid, Tooltip } from 'recharts';\nimport { useLocation } from 'react-router-dom';\nimport axios from 'axios';\nimport Rank from '../components/Rank';\nimport { Matches } from '../components/Matches';\n\nconst UserPage = () => {\n const location = useLocation();\n const [user, setUser] = useState(null);\n const [ratings, setRatings] = useState([]);\n const [matches, setMatches] = useState();\n console.log(user);\n\n useEffect(() => {\n const fetchUser = async () => {\n if (location.pathname) {\n const uid = location.pathname.split('/')[2];\n const user = await axios.get(`https://api.beatquest.com/user/${uid}`);\n user.data.data.matches = user.data.data.matches.sort(function (a, b) {\n var dateA = new Date(a.time),\n dateB = new Date(b.time);\n return dateB - dateA;\n });\n setUser(user.data.data);\n }\n };\n\n window.scrollTo(0, 0);\n fetchUser();\n }, [location]);\n\n useEffect(() => {\n const populateUI = () => {\n if (!user) return;\n\n // Populate Elo Rating Graph\n let ratings = [];\n const matchesReverse = user.matches.slice().reverse();\n for (const match of matchesReverse) {\n const date = new Date(match.time);\n ratings.push({\n elo: parseInt(match.p1.elo.after),\n date: date.toLocaleDateString(),\n });\n }\n setRatings(ratings);\n\n // Populate Recent Matches Table\n const matchesUI = ;\n setMatches(matchesUI);\n };\n populateUI();\n // eslint-disable-next-line\n }, [user]);\n\n const renderDurationTooltip = (data) => {\n const { payload } = data;\n if (payload.length) {\n return (\n \n Elo: {payload[0].payload.elo}\n
Date: {payload[0].payload.date}
\n \n );\n }\n return null;\n };\n\n return (\n
\n {user ? (\n \n
\n
\n
\n \n
\n
\n {user.name} \n
\n
\n
Elo
\n
{user.elo}
\n
\n
\n
Wins
\n
{user.wins}
\n
\n
\n
Losses
\n
{user.losses}
\n
\n
\n
Matches
\n
{user.matches.length}
\n
\n
\n
\n
\n
\n\n

Elo Rating

\n \n \n \n \n \n \n\n

Recent Matches

\n {matches}\n
\n ) : (\n <>\n )}\n \n );\n};\n\nexport default UserPage;\n","import React from 'react';\nimport Leaderboard from '../components/Leaderboard';\n\nfunction LeaderboardPage() {\n return (\n
\n
\n

Leaderboard

\n \n
\n
\n );\n}\n\nexport default LeaderboardPage;\n","export default __webpack_public_path__ + \"static/media/icon.4ce885f6.svg\";","import React from 'react';\nimport { Route, Routes, Link, NavLink } from 'react-router-dom';\nimport { EventPage } from './pages/event/EventPage';\nimport { EventsPage } from './pages/events/EventsPage';\nimport HomePage from './pages/HomePage';\nimport UserPage from './pages/UserPage';\nimport LeaderboardPage from './pages/LeaderboardPage';\nimport logo from './images/icon.svg';\n\nfunction App() {\n return (<>\n \n
\n \n } />\n } />\n } />\n } />\n } />\n \n
\n );\n}\n\nexport default App;\n","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 './index.scss';\nimport App from './App';\nimport reportWebVitals from './reportWebVitals';\nimport { BrowserRouter } from 'react-router-dom';\n\nReactDOM.render(\n \n \n \n \n ,\n document.getElementById('root')\n);\n\nreportWebVitals();\n"],"sourceRoot":""}