{"version":3,"sources":["images/logo.png","images/Avatars sync /^/.*/.PNG$","images/Avatars/Amir.PNG","images/Avatars/Avishai.PNG","images/Avatars/Dror.PNG","images/Avatars/Elad.PNG","images/Avatars/Eran.PNG","images/Avatars/Fabel.PNG","images/Avatars/Haim.PNG","images/Avatars/Lior.PNG","images/Avatars/Naor.PNG","images/Avatars/Omri.PNG","images/Avatars/Yaniv.PNG","components/common/Layout.tsx","config.ts","components/common/Loader/Loader.tsx","services/statsService.ts","components/common/AppContext.ts","components/PlayerFormBars.tsx","components/PlayerProfile.tsx","components/Players.tsx","components/common/Button.ts","components/Stats.tsx","components/Participant.tsx","components/Participants.tsx","components/GamePlayer.tsx","components/Game.tsx","components/Home.tsx","mockData.ts","components/Main.tsx","App.jsx","serviceWorker.js","index.js"],"names":["module","exports","map","webpackContext","req","id","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","Object","resolve","useStyles","makeStyles","root","bottom","width","container","Wrapper","styled","div","MainWrapper","BottomWrapper","Layout","children","classes","React","useState","value","setValue","BottomNavigation","onChange","event","newValue","showLabels","BottomNavigationAction","to","component","Link","label","icon","winner","loser","tablePlayer","playerCircleStat","mainColor","buttonBG1","buttonBG2","buttonColor","buttonSelectedBG1","buttonSelectedBG2","buttonSelectedColor","mainBGColor1","mainBGColor2","mainBGColor3","GameStatus","animation","keyframes","StyledLoader","config","StyledContainer","Loader","AppContext","createContext","getPlayerLastGame","game","player","isNaN","parseInt","gameScores","p","maxScore","_","max","minScore","min","playerScore","Score","IsFirst","IsLast","getPlayerGamesResults","games","name","index","Number","MIN_VALUE","MAX_VALUE","maxPlayers","minPlayers","score","status","includes","Lost","Won","Absent","Mediocre","gameIndex","length","reverse","getPlayerStats","gameData","allResults","playerScores","filter","g1","undefined","Array","isArray","g2","Appearances","Balance","sum","BiggestLoss","BiggestWin","FinishedFirst","result","FinishedLast","Name","getGameTable","players","forEach","playerResults","gamesPlayed","res","balance","sumBy","playerSummary","Games","First","Last","LastGame","last","push","sort","a","b","getHostsTable","hostCount","g","Host","Count","getWeekByWeekGamesTable","row","Week","total","MaxScore","MinScore","Genaya","getPlayesGameCount","count","StyledPlayerForm","Arrow","props","visible","StyledPlayerFormValue","isAbsent","StyledWeek","StyledWonLost","calcHeight","factor","val","height","Math","abs","Bar","gameResult","getColor","y","PlayerFormBars","playerGameResult","maxScoreEntry","maxBy","minScoreEntry","minBy","maxSize","startIndex","setStartIndex","itemsToDisplay","slice","onSetRangeClick","direction","fontSize","onClick","key","Row1Wrapper","Row2Wrapper","StyledName","StyledStatText","Avatar","img","ItemContainer","StyledPlayerStats","StyledPlayerStat","StyledBalance","StyledCircle","PlayerProfile","showBars","imgImport","require","Size","Carousel","Players","appData","useContext","setShowBars","playerData","useEffect","stats","statsService","defaultColors","text","selectedText","selectedBorder","background","selectedBackground","Button","_colors","colors","isSelected","size","small","big","Table","Header","WeeksItem","isHeader","WeeksRow","Row","TableItem","Winner","Loser","PlayerHeader","SliderWrapper","ButtonsWrapper","DatesWrapper","Tabs","TabsLabel","selected","DatesLabel","DatesValue","HostsWrapper","WeeksWrapper","Views","Stats","allGames","useMemo","range","setRange","tableData","setTableData","view","setView","handleChange","_event","getRangeText","GameDate","renderPlayerRow","data","i","lastGame","Slider","valueLabelDisplay","aria-labelledby","valueLabelFormat","weekByWeekGames","pl","renderWeekRow","getWeekByWeekView","hosts","renderHostRow","getHostsView","Participant","ItemWrapper","Participants","participants","onParticipantClick","selectionCriteria","muiTheme","createMuiTheme","overrides","MuiSlider","thumb","color","track","rail","RebuyWrapper","Input","input","RebuyButton","PlayerStatusWrapper","isIn","IconWrapper","MenuWrapper","GamePlayer","amount","onPlayerRequest","showActions","setShowActions","rebuySelection","setRebuySelection","cashoutRequest","setCashoutRequest","cashoutAmount","setCashoutAmount","rebuyAmount","setRebuyAmount","cashoutAmountRef","useRef","current","focus","iconsStyle","fill","Clear","style","Menu","onDoubleClick","ShoppingCart","Replay","TimeToLeave","ThemeProvider","theme","defaultValue","step","marks","type","target","ref","MiddleContentWrapper","Margin","ActionButtonWrapper","Title","TotalMoney","error","TotalMoneyText","span","PasswordInput","Game","availablePlayers","rebuys","quit","setParticipants","password","setPassword","notStarted","gameStatus","setGameStatus","saveDataToLS","isClear","dataToSave","localStorage","JSON","stringify","console","parse","loadDataFromLS","finishedSuccessfully","time","Date","toUTCString","onHostSelection","isHost","gameOn","getTotalMoney","getPlayers","getPlayerRebuys","onCancelGameApprove","initializedPlayers","active","submitGame","hostObject","host","toLocaleDateString","toString","fetch","method","headers","body","then","ok","alert","finishedWithError","hostSelection","request","find","pop","playerSelection","actionButtonColors","cancelling","WorkOutline","playerJoining","some","finishing","placeholder","ev","window","location","href","getContentToRender","HomepageLogo","Home","texts","round","random","logo","image","Amir","Avishai","Eran","Lior","Naor","Yaniv","ErrorWrapper","Main","setAppData","dataLoadingError","setDataLoadingError","mockData","response","statusText","json","d","catch","Provider","basename","path","exact","AppStyles","App","onload","setTimeout","scrollTo","Boolean","hostname","match","ReactDOM","render","document","getElementById","navigator","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.94ed552d.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/logo.cf547a6a.png\";","var map = {\n\t\"./Amir.PNG\": 79,\n\t\"./Avishai.PNG\": 80,\n\t\"./Dror.PNG\": 81,\n\t\"./Elad.PNG\": 82,\n\t\"./Eran.PNG\": 83,\n\t\"./Fabel.PNG\": 84,\n\t\"./Haim.PNG\": 85,\n\t\"./Lior.PNG\": 86,\n\t\"./Naor.PNG\": 87,\n\t\"./Omri.PNG\": 88,\n\t\"./Yaniv.PNG\": 89\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 78;","module.exports = __webpack_public_path__ + \"static/media/Amir.88b9de4e.PNG\";","module.exports = __webpack_public_path__ + \"static/media/Avishai.4c80df8d.PNG\";","module.exports = __webpack_public_path__ + \"static/media/Dror.a425e6ec.PNG\";","module.exports = __webpack_public_path__ + \"static/media/Elad.2278f09d.PNG\";","module.exports = __webpack_public_path__ + \"static/media/Eran.9a63c888.PNG\";","module.exports = __webpack_public_path__ + \"static/media/Fabel.60249eb9.PNG\";","module.exports = __webpack_public_path__ + \"static/media/Haim.d7de9efc.PNG\";","module.exports = __webpack_public_path__ + \"static/media/Lior.308707ab.PNG\";","module.exports = __webpack_public_path__ + \"static/media/Naor.7dd04a09.PNG\";","module.exports = __webpack_public_path__ + \"static/media/Omri.e61c283f.PNG\";","module.exports = __webpack_public_path__ + \"static/media/Yaniv.182a9968.PNG\";","import React from \"react\";\r\nimport { Link } from \"react-router-dom\";\r\nimport BottomNavigation from \"@material-ui/core/BottomNavigation\";\r\nimport BottomNavigationAction from \"@material-ui/core/BottomNavigationAction\";\r\nimport StatsIcon from \"@material-ui/icons/Equalizer\";\r\nimport PlayersIcon from \"@material-ui/icons/People\";\r\nimport NewGameIcon from \"@material-ui/icons/AddCircle\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport styled from \"styled-components\";\r\n\r\nconst useStyles = makeStyles({\r\n root: {\r\n //position: \"absolute\",\r\n bottom: 0,\r\n width: \"100%\"\r\n },\r\n container: {}\r\n});\r\n\r\nconst Wrapper = styled.div`\r\n display: flex;\r\n flex-direction: column-reverse;\r\n height: 100%;\r\n justify-content: flex-end;\r\n`;\r\nconst MainWrapper = styled.div`\r\n flex: 90% 0 0;\r\n overflow: auto;\r\n`;\r\nconst BottomWrapper = styled.div`\r\n flex: 10% 0 0;\r\n`;\r\n\r\nconst Layout = ({ children }: any) => {\r\n const classes = useStyles();\r\n\r\n const [value, setValue] = React.useState(-1);\r\n\r\n return (\r\n \r\n {children} \r\n\r\n \r\n {\r\n if (event) setValue(newValue);\r\n }}\r\n showLabels\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 Layout;\r\n","export default {\r\n useMock: false,\r\n colors:{\r\n winner: '#00ff00',\r\n loser: '#b70000',\r\n tablePlayer: '#52ebca',\r\n\r\n playerCircleStat: '#95c0bc',\r\n mainColor: '#e9c146',\r\n\r\n buttonBG1: '#e9c146',\r\n buttonBG2: '#ac8b26',\r\n buttonColor: '#fff',\r\n buttonSelectedBG1: '#44c1e9',\r\n buttonSelectedBG2: '#5c6fd5',\r\n buttonSelectedColor: '#fff',\r\n\r\n mainBGColor1: '#cd004c8f',\r\n mainBGColor2: '#0037b38f',\r\n mainBGColor3: '#b30e4b8f',\r\n\r\n },\r\n serviceUrl: !process.env.NODE_ENV || process.env.NODE_ENV === 'development' ? 'http://localhost:8080' : ''\r\n};","import React from \"react\";\r\nimport styled, { keyframes } from \"styled-components\";\r\nimport config from '../../../config';\r\n\r\nconst animation = keyframes`\r\n 0% {\r\n transform: rotate(0);\r\n animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\r\n }\r\n 50% {\r\n transform: rotate(900deg);\r\n animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\r\n }\r\n 100% {\r\n transform: rotate(1800deg);\r\n }\r\n`;\r\n\r\nconst StyledLoader = styled.div`\r\n display: inline-block;\r\n width: 10rem;\r\n height: 10rem;\r\n text-align: center;\r\n &:after {\r\n content: \" \";\r\n display: block;\r\n border-radius: 50%;\r\n width: 0;\r\n height: 0;\r\n margin: 0.8rem;\r\n box-sizing: border-box;\r\n border: 3rem solid red;\r\n border-color: ${config.colors.mainColor} transparent ${config.colors.mainColor} transparent;\r\n animation: ${animation} 1.2s infinite;\r\n }\r\n`;\r\n\r\nconst StyledContainer = styled.div`\r\n position: absolute;\r\n left: 50%;\r\n transform: translateX(-4rem);\r\n top: 50%;\r\n `;\r\n\r\nconst Loader = () => {\r\n return (\r\n \r\n Loading... \r\n \r\n );\r\n};\r\n\r\nexport default Loader;\r\n","import _ from 'lodash';\r\n\r\nexport type PlayerStats = {\r\n Name: string;\r\n Appearances: number;\r\n FinishedFirst: number;\r\n FinishedLast: number;\r\n BiggestWin: number;\r\n BiggestLoss: number;\r\n Balance: number;\r\n};\r\n\r\nexport type PlayerTableResults = {\r\n Name: string;\r\n Games: number;\r\n First: number;\r\n Last: number;\r\n Balance: number;\r\n LastGame: PlayerLastGame | string;\r\n};\r\n\r\nexport type Host = {\r\n Name: string;\r\n Count: number;\r\n};\r\n\r\nexport type PlayerLastGame = {\r\n IsFirst: boolean;\r\n IsLast: boolean;\r\n Score: number;\r\n};\r\n\r\nexport type WeekByWeekRow = {\r\n Week: number;\r\n maxScore: string;\r\n MinScore: string;\r\n Genaya: string;\r\n};\r\n\r\nexport type PlayerGameResult = {\r\n score: number;\r\n status: GameStatus;\r\n gameIndex: number\r\n}\r\n\r\nexport enum GameStatus {\r\n Won,\r\n Lost,\r\n Absent,\r\n Mediocre\r\n};\r\n\r\nconst getHostsTable = (games: any[], players: string[]): Host[] => {\r\n\r\n const result: Host[] = [];\r\n\r\n players.forEach(p => {\r\n const hostCount = games.filter(g => g.Host === p).length;\r\n result.push({ Name: p, Count: hostCount });\r\n });\r\n\r\n const res = result.sort((a: Host, b: Host) => a.Count > b.Count ? 1 : -1).reverse();\r\n return res;\r\n}\r\n\r\nconst getGameTable = (games: any[], players: string[]): PlayerTableResults[] => {\r\n\r\n const result: PlayerTableResults[] = [];\r\n\r\n players.forEach(p => {\r\n const playerResults = getPlayerGamesResults(games, p);\r\n\r\n const gamesPlayed = playerResults.filter(res => res.status !== GameStatus.Absent);\r\n const balance = _.sumBy(gamesPlayed, 'score');\r\n\r\n const playerSummary: PlayerTableResults = {\r\n Name: p,\r\n Games: gamesPlayed.length,\r\n First: playerResults.filter(res => res.status === GameStatus.Won).length,\r\n Last: playerResults.filter(res => res.status === GameStatus.Lost).length,\r\n Balance: balance,\r\n LastGame: getPlayerLastGame(_.last(games), p)\r\n };\r\n\r\n result.push(playerSummary);\r\n });\r\n\r\n const res = result.sort((a: PlayerTableResults, b: PlayerTableResults) => a.Balance > b.Balance ? 1 : -1).reverse();\r\n return res;\r\n}\r\n\r\nconst getPlayerLastGame = (game: any, player: string): PlayerLastGame | string => {\r\n\r\n if (!game || isNaN(parseInt(game[player]))) {\r\n return '-';\r\n }\r\n\r\n const gameScores = Object.keys(game).map(p => parseInt(game[p]));\r\n const maxScore = _.max(gameScores);\r\n const minScore = _.min(gameScores);\r\n const playerScore = parseInt(game[player]);\r\n\r\n return {\r\n Score: playerScore,\r\n IsFirst: playerScore === maxScore,\r\n IsLast: playerScore === minScore\r\n };\r\n}\r\n\r\nconst getWeekByWeekGamesTable = (games: any[]) => {\r\n\r\n const results: WeekByWeekRow[] = games.map((game: any, index: number) => {\r\n\r\n let maxScore = Number.MIN_VALUE;\r\n let minScore = Number.MAX_VALUE;\r\n\r\n const row: any = { Week: index + 1 };\r\n\r\n let total = 0;\r\n \r\n // find min/max\r\n for (let player in game) {\r\n if(isNaN(game[player])) continue;\r\n\r\n let score = parseInt(game[player]);\r\n total += score;\r\n\r\n (row[player] as any) = score;\r\n\r\n if (score > maxScore) {\r\n maxScore = score;\r\n }\r\n if (score < minScore) {\r\n minScore = score;\r\n }\r\n\r\n }\r\n\r\n row.MaxScore = maxScore;\r\n row.MinScore = minScore;\r\n row.Genaya = -total;\r\n\r\n return row;\r\n });\r\n\r\n return results.reverse();\r\n};\r\n\r\nconst getPlayerGamesResults = (games: any[], name: string) => {\r\n\r\n const results: PlayerGameResult[] = games.map((game: any, index: number) => {\r\n\r\n let maxScore = Number.MIN_VALUE;\r\n let minScore = Number.MAX_VALUE;\r\n let maxPlayers: string[] = [], minPlayers: string[] = [];\r\n\r\n // find winners/losers\r\n for (let player in game) {\r\n let score = parseInt(game[player]);\r\n if (score > maxScore) {\r\n maxScore = score;\r\n maxPlayers = [player];\r\n }\r\n else if (score === maxScore) {\r\n maxPlayers = [player, ...maxPlayers];\r\n }\r\n if (score < minScore) {\r\n minScore = score;\r\n minPlayers = [player];\r\n }\r\n else if (score === minScore) {\r\n minPlayers = [player, ...minPlayers];\r\n }\r\n }\r\n\r\n // find where is the player\r\n let status: GameStatus;\r\n let playerScore = parseInt(game[name]);\r\n if (minPlayers.includes(name)) {\r\n status = GameStatus.Lost;\r\n }\r\n else if (maxPlayers.includes(name)) {\r\n status = GameStatus.Won;\r\n }\r\n else if (!isNaN(playerScore)) {\r\n status = GameStatus.Mediocre;\r\n }\r\n else {\r\n status = GameStatus.Absent;\r\n }\r\n\r\n return { score: playerScore, status, gameIndex: games.length - index };\r\n });\r\n\r\n return results.reverse();\r\n};\r\n\r\nconst getPlayesGameCount = (games: any, players: string[]) => {\r\n\r\n const result = players.map(player=> {\r\n const count = games.filter((g: any) => g[player] !== undefined && !Array.isArray(g[player])).length;\r\n return { name: player, games: count};\r\n });\r\n\r\n const res = result.sort((a: any, b: any) => a.games > b.games ? 1 : -1).reverse();\r\n return res;\r\n};\r\n\r\n\r\nconst getPlayerStats = (gameData: any[], name: string) => {\r\n\r\n let allResults = getPlayerGamesResults(gameData, name);\r\n\r\n const gamesOfPlayer = _.filter(gameData, g1 => g1[name] !== undefined && !Array.isArray(g1[name]));\r\n const playerScores = gamesOfPlayer.map(\r\n g2 => parseInt(g2[name])\r\n );\r\n\r\n const stats: PlayerStats = {\r\n Appearances: playerScores.length,\r\n Balance: _.sum(playerScores),\r\n BiggestLoss: _.min(playerScores) || 0,\r\n BiggestWin: _.max(playerScores) || 0,\r\n FinishedFirst: allResults.filter(result => result.status === GameStatus.Won).length,\r\n FinishedLast: allResults.filter(result => result.status === GameStatus.Lost).length,\r\n Name: name\r\n };\r\n\r\n return stats;\r\n};\r\n\r\nexport default {\r\n getPlayerStats,\r\n getPlayerGamesResults,\r\n getGameTable,\r\n getHostsTable,\r\n getWeekByWeekGamesTable,\r\n getPlayesGameCount\r\n};","import { createContext} from \"react\";\r\n\r\nexport type Player = {\r\n name: string;\r\n image: string;\r\n}\r\n\r\nexport interface AppContext{\r\n Players: Player[];\r\n Games: [];\r\n}\r\n\r\nconst AppContext = createContext(null);\r\nexport default AppContext;\r\n","import React, { useState } from \"react\";\r\nimport styled, { keyframes } from \"styled-components\";\r\nimport _ from \"lodash\";\r\nimport NavigateBeforeIcon from \"@material-ui/icons/NavigateBefore\";\r\nimport NavigateNextIcon from \"@material-ui/icons/NavigateNext\";\r\nimport SentimentVeryDissatisfiedIcon from \"@material-ui/icons/SentimentVeryDissatisfied\";\r\nimport StarIcon from \"@material-ui/icons/Star\";\r\nimport { PlayerGameResult, GameStatus } from \"services/statsService\";\r\n\r\nconst StyledPlayerForm = styled.div`\r\n display: flex;\r\n align-items: flex-end;\r\n flex: 90% 0 0;\r\n`;\r\n\r\nconst Wrapper = styled.div`\r\n display: flex;\r\n flex-direction: row;\r\n width: 100%;\r\n`;\r\n\r\nconst Arrow = styled.div<{ visible: boolean }>`\r\n flex: 5% 0 0;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: flex-end;\r\n align-items: center;\r\n visibility: ${props => (props.visible ? \"visible\" : \"hidden\")};\r\n`;\r\n\r\nconst heightAnimation = (y: number) => keyframes`\r\n 0% {\r\n height: 0;\r\n opacity: 0;\r\n }\r\n 100% {\r\n opacity: 1;\r\n height: ${y}%;\r\n }\r\n`;\r\n\r\nconst StyledPlayerFormValue = styled.div<{ isAbsent: boolean }>`\r\n position: absolute;\r\n width: 100%;\r\n text-align: center;\r\n font-size: 0.7rem;\r\n bottom: ${props => (props.isAbsent ? \"0rem\" : \"null\")};\r\n`;\r\n\r\nconst StyledWeek = styled.div`\r\n position: absolute;\r\n width: 100%;\r\n text-align: center;\r\n font-size: 0.7rem;\r\n bottom: -1.6rem;\r\n`;\r\n\r\nconst StyledWonLost = styled.div<{ visible: boolean }>`\r\n visibility: ${props => (props.visible ? \"visible\" : \"hidden\")};\r\n position: absolute;\r\n width: 100%;\r\n text-align: center;\r\n font-size: 0.7rem;\r\n top: -1.5rem;\r\n`;\r\n\r\nconst absentHeight = 1;\r\n\r\nconst calcHeight = (factor: number, val: number | undefined) => {\r\n if (val === undefined || isNaN(val)) return absentHeight;\r\n\r\n let height = Math.abs(val / factor) * 80;\r\n return Math.max(height, 10);\r\n};\r\n\r\nconst getColor = (gameResult: PlayerGameResult) => {\r\n switch (gameResult.status) {\r\n case GameStatus.Absent:\r\n return \"grey\";\r\n case GameStatus.Won:\r\n return \"#b28604\";\r\n case GameStatus.Lost:\r\n return \"#4d4343\";\r\n case GameStatus.Mediocre:\r\n if (gameResult.score > 0) {\r\n return \"green\";\r\n } else if (gameResult.score < 0) {\r\n return \"red\";\r\n } else {\r\n // even\r\n return \"#154115\";\r\n }\r\n }\r\n return \"\";\r\n};\r\n\r\nconst Bar = styled.div<{\r\n gameResult: PlayerGameResult;\r\n factor: number;\r\n}>`\r\n width: 100%;\r\n display: inline-block;\r\n position: relative;\r\n margin: 0 0.2rem;\r\n background: ${props => getColor(props.gameResult)};\r\n height: ${props =>\r\n props.gameResult.status === GameStatus.Absent\r\n ? 1\r\n : calcHeight(props.factor, props.gameResult.score)}%;\r\n animation: ${props =>\r\n heightAnimation(calcHeight(props.factor, props.gameResult.score))}\r\n 2s normal;\r\n`;\r\n\r\nconst PlayerFormBars: React.FC<{\r\n playerGameResult: PlayerGameResult[];\r\n}> = ({ playerGameResult }) => {\r\n let maxScoreEntry = _.maxBy(playerGameResult, result => result.score);\r\n let minScoreEntry = _.minBy(playerGameResult, result => result.score);\r\n\r\n // max value for bar height\r\n const maxSize = Math.max(\r\n maxScoreEntry ? maxScoreEntry.score : 0,\r\n minScoreEntry ? Math.abs(minScoreEntry.score) : 0\r\n );\r\n\r\n const rangeSize = 15;\r\n\r\n const [startIndex, setStartIndex] = useState(\r\n playerGameResult.length - rangeSize\r\n );\r\n\r\n let itemsToDisplay = playerGameResult.slice(\r\n startIndex,\r\n startIndex + rangeSize\r\n );\r\n\r\n const onSetRangeClick = (direction: \"previous\" | \"next\") => {\r\n if (direction === \"previous\") {\r\n setStartIndex(Math.max(startIndex - rangeSize, 0));\r\n } else {\r\n setStartIndex(\r\n Math.min(startIndex + rangeSize, playerGameResult.length - rangeSize)\r\n );\r\n }\r\n };\r\n\r\n return (\r\n \r\n 0}>\r\n onSetRangeClick(\"previous\")}\r\n > \r\n \r\n \r\n {itemsToDisplay.map((gameResult, index) => (\r\n \r\n \r\n {gameResult.status === GameStatus.Absent ? \"x\" : gameResult.score}\r\n \r\n #{gameResult.gameIndex} \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n onSetRangeClick(\"next\")}\r\n > \r\n \r\n \r\n );\r\n};\r\n\r\nexport default PlayerFormBars;\r\n","import { PlayerStats, PlayerGameResult } from \"services/statsService\";\r\nimport React from \"react\";\r\nimport styled from \"styled-components\";\r\nimport PlayerFormBars from \"./PlayerFormBars\";\r\nimport config from '../config';\r\n\r\nconst MainWrapper = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n background: black;\r\n color: white;\r\n padding: 0;\r\n text-align: center;\r\n height: 100%;\r\n font-size: 1rem;\r\n text-align: left;\r\n line-height: 1.5rem;\r\n /* border: 2px solid green; */\r\n`;\r\n\r\nconst Row1Wrapper = styled.div`\r\n display: flex;\r\n flex-direction: row;\r\n flex: 70% 0 0;\r\n align-items: stretch;\r\n padding: 1rem 0;\r\n text-align: center;\r\n height: 100%;\r\n background: linear-gradient(0deg, ${config.colors.mainBGColor1} 0%, ${config.colors.mainBGColor2} 100%);\r\n /* border: 2px solid orange; */\r\n`;\r\n\r\nconst Row2Wrapper = styled.div<{ visible: boolean }>`\r\n visibility: ${props => (props.visible ? \"visible\" : \"hidden\")};\r\n display: flex;\r\n flex: 30% 1 1;\r\n flex-direction: row;\r\n justify-content: space-around;\r\n padding: 0;\r\n text-align: center;\r\n height: 100%;\r\n /* border: 2px solid white; */\r\n padding-bottom: 2rem;\r\n background: ${config.colors.mainBGColor3};\r\n`;\r\n\r\nconst StyledName = styled.div`\r\n display: flex;\r\n flex-direction: row;\r\n padding: 1rem 0;\r\n justify-content: center;\r\n font-size: 3rem;\r\n`;\r\n\r\nconst StyledStatText = styled.div`\r\n text-align: center;\r\n font-size: 1.2rem;\r\n`;\r\n\r\nconst Avatar = styled.div<{ img: any }>`\r\n background-image: ${props => `url(${props.img} )`};\r\n background-repeat: no-repeat;\r\n background-size: contain !important;\r\n display: block;\r\n height: 100%;\r\n margin: 0px auto;\r\n width: 100%;\r\n background-position: center;\r\n`;\r\n\r\nconst ItemContainer = styled.div<{ width: number }>`\r\n flex: ${props => `${props.width}% 1 1`};\r\n height: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: space-evenly;\r\n padding: 1rem;\r\n text-align: left;\r\n`;\r\n\r\nconst StyledPlayerStats = styled.div`\r\n display: flex;\r\n flex-direction: row;\r\n flex-wrap: wrap;\r\n justify-content: center;\r\n`;\r\n\r\nconst StyledPlayerStat = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n margin: 0.5rem;\r\n text-align: center;\r\n`;\r\n\r\nconst StyledBalance = styled.div`\r\n width: 100%;\r\n text-align: center;\r\n font-size: 1.7rem;\r\n margin-top: 2rem;\r\n`;\r\n\r\nconst StyledCircle = styled.div`\r\n font-size: 1.3rem;\r\n height: 4rem;\r\n width: 4rem;\r\n background-color: ${config.colors.playerCircleStat};\r\n border-radius: 50%;\r\n display: flex;\r\n border: 0.3rem solid white;\r\n text-align: center;\r\n flex-direction: column;\r\n justify-content: center;\r\n`;\r\n\r\nconst PlayerProfile: React.FC = ({\r\n Name,\r\n Appearances,\r\n BiggestWin,\r\n BiggestLoss,\r\n Balance,\r\n FinishedFirst,\r\n FinishedLast,\r\n showBars,\r\n playerGameResult\r\n}) => {\r\n const imgImport = require(`images/Avatars/${Name}.PNG`);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {Name} \r\n \r\n \r\n {Appearances} \r\n Games \r\n \r\n \r\n {BiggestWin} \r\n MaxPrize \r\n \r\n \r\n {BiggestLoss} \r\n MaxLoss \r\n \r\n \r\n {FinishedFirst} \r\n First \r\n \r\n \r\n {FinishedLast} \r\n Last \r\n \r\n \r\n Balance: {Balance} \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default PlayerProfile;\r\n\r\n\r\n\r\n","import React, { useContext, useState, useEffect } from \"react\";\r\nimport AppContext, { Player } from \"./common/AppContext\";\r\nimport PlayerProfile from \"./PlayerProfile\";\r\nimport statsService, { PlayerGameResult } from \"services/statsService\";\r\nimport styled from \"styled-components\";\r\nconst Carousel = require(\"re-carousel\");\r\n\r\nconst Wrapper = styled.div`\r\n height: 100%;\r\n width: 100%;\r\n /* border: 2px solid yellow; */\r\n`;\r\n\r\nconst Players = () => {\r\n const appData = useContext(AppContext);\r\n const [showBars, setShowBars] = useState(false);\r\n\r\n const playerData = appData!.Players;\r\n\r\n useEffect(() => {\r\n setShowBars(true);\r\n }, []);\r\n\r\n return (\r\n \r\n \r\n {playerData &&\r\n playerData.map((player: Player) => {\r\n const stats = statsService.getPlayerStats(\r\n appData!.Games,\r\n player.name\r\n );\r\n const playerResults: PlayerGameResult[] = statsService.getPlayerGamesResults(appData!.Games, player.name);\r\n\r\n return (\r\n \r\n );\r\n })}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default Players;\r\n","import styled from \"styled-components\";\r\nimport config from \"../../config\";\r\n\r\nexport type Colors = {\r\n text: string;\r\n selectedText: string;\r\n background: string[]\r\n selectedBackground: string[]\r\n selectedBorder: string\r\n};\r\n\r\nexport enum Size {\r\n small,\r\n big\r\n};\r\n\r\nexport const defaultColors: Colors = {\r\n text: config.colors.buttonColor,\r\n selectedText: config.colors.buttonSelectedColor,\r\n selectedBorder: config.colors.buttonSelectedBG1,\r\n background:[config.colors.buttonBG1, config.colors.buttonBG2],\r\n selectedBackground: [config.colors.buttonSelectedBG1, config.colors.buttonSelectedBG2]\r\n}\r\n\r\nconst Button = styled.div<{ isSelected?: boolean, colors?: Colors, size? : Size }>`\r\n\r\nbox-shadow:inset 0rem 0.1rem 0rem 0rem #ffffff;\r\n\r\nbackground:${props => { \r\n const _colors = props.colors || defaultColors;\r\n return (props.isSelected || props.isSelected === null) ? `linear-gradient(to bottom, ${_colors.selectedBackground[0]} 5%, ${_colors.selectedBackground[1]} 100%)`: \r\n `linear-gradient(to bottom, ${_colors.background[0]} 5%, ${_colors.background[1]} 100%)`}};\r\nborder-radius:0.3rem;\r\ncursor:pointer;\r\ncolor:${props => { \r\n const _colors = props.colors || defaultColors;\r\n return props.isSelected ? _colors.selectedText: _colors.text}};\r\nfont-size:${props => props.size === Size.small ? '1rem' : '1.5rem'};\r\npadding: ${props=> props.size === Size.big ? '0' : '0.4rem'};\r\ntext-decoration:none;\r\nmin-width: ${props=> props.size === Size.small ? '2rem' : '8rem'};\r\nheight: ${props => props.size === Size.small ? '1rem' : '3rem'};\r\ndisplay: flex;\r\n justify-content: center;\r\n align-items: center;\r\n margin: 0.2rem;\r\n white-space: nowrap;\r\n`;\r\n\r\nexport default Button;","import React, { useContext, useEffect, useMemo, useState } from \"react\";\r\nimport AppContext from \"./common/AppContext\";\r\nimport statsService, {\r\n PlayerTableResults,\r\n PlayerLastGame,\r\n Host\r\n} from \"services/statsService\";\r\nimport styled from \"styled-components\";\r\nimport _ from \"lodash\";\r\nimport { Slider } from \"@material-ui/core\";\r\nimport Button, { Size } from \"./common/Button\";\r\nimport config from '../config';\r\n\r\nconst Wrapper = styled.div`\r\n height: 100%;\r\n width: 100%;\r\n overflow-x: hidden;\r\n`;\r\n\r\nconst Table = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n font-size: 1.4rem;\r\n padding: 1rem;\r\n`;\r\nconst Header = styled.div`\r\n color: ${config.colors.mainColor};\r\n display: flex;\r\n justify-content: space-around;\r\n padding-bottom: 2rem;\r\n text-align: center;\r\n`;\r\n\r\nconst WeeksItem = styled.div<{isHeader?: boolean}>`\r\n color: ${props=> props.isHeader ? config.colors.mainColor : ''};\r\n padding-bottom: 2rem;\r\n text-align: center;\r\n width: 55px;\r\n`;\r\n\r\nconst WeeksRow = styled.div`\r\n display: flex;\r\n justify-content: flex-start;\r\n width: fit-content;\r\n`;\r\n\r\nconst Row = styled.div`\r\n display: flex;\r\n justify-content: space-around;\r\n padding-bottom: 2rem;\r\n text-align: center;\r\n`;\r\n\r\nconst TableItem = styled.div`\r\n flex: 15% 0 0;\r\n`;\r\n\r\nconst Winner = styled.div`\r\n color: ${config.colors.winner};\r\n`;\r\n\r\nconst Loser = styled.div`\r\n color: ${config.colors.loser};\r\n`;\r\n\r\nconst Name = styled.div`\r\n text-align: left;\r\n color: ${config.colors.tablePlayer};\r\n`;\r\n\r\nconst PlayerHeader = styled.div`\r\n text-align: left;\r\n`;\r\n\r\nconst SliderWrapper = styled.div`\r\n display: flex;\r\n padding: 0 2rem;\r\n`;\r\n\r\nconst ButtonsWrapper = styled.div`\r\n display: flex;\r\n width: 50%;\r\n margin: 1rem;\r\n`;\r\n\r\nconst DatesWrapper = styled.div`\r\n display: flex;\r\n padding: 0 2rem;\r\n font-size: 1rem;\r\n line-height: 1.3rem;\r\n width: 45%;\r\n`;\r\n\r\nconst Tabs = styled.div`\r\n display: flex;\r\n width: 100%;\r\n justify-content: space-evenly;\r\n margin: 12px 0;\r\n `;\r\n\r\nconst TabsLabel = styled.div<{ selected: boolean }>`\r\n color: ${props => props.selected ? 'white' : '#ababab'};\r\n text-decoration: underline;\r\n font-size: ${props => props.selected ? '13px' : '12px'};\r\n`;\r\n\r\nconst DatesLabel = styled.div`\r\n text-align: right;\r\n`;\r\n\r\nconst DatesValue = styled.div`\r\n text-align: left;\r\n margin-left: 1rem;\r\n width: 30%;\r\n`;\r\n\r\nconst HostsWrapper = styled.div`\r\n width: 50%;\r\n`;\r\n\r\nconst WeeksWrapper = styled.div`\r\n width: auto;\r\n overflow: auto;\r\n`;\r\n\r\nconst Views = {\r\n Rankings: 0,\r\n WeekByWeek: 1,\r\n Hosts: 2\r\n}\r\n\r\nconst Stats = () => {\r\n const appData = useContext(AppContext);\r\n const allGames: any[] = useMemo(() => [...appData!.Games].reverse(), []);\r\n const [range, setRange] = useState([1, allGames.length]);\r\n const [tableData, setTableData] = useState([]);\r\n const [view, setView] = useState(Views.Rankings);\r\n\r\n\r\n const handleChange = (_event: any, newValue: any) => {\r\n setRange(newValue);\r\n };\r\n\r\n function getRangeText(value: any) {\r\n const game: any = allGames[value - 1];\r\n return game ? game.GameDate : value;\r\n }\r\n\r\n useEffect(() => {\r\n let res: any[] = allGames.slice(range[0] - 1, range[1]);\r\n setTableData(\r\n statsService.getGameTable(res, _.map(appData!.Players, \"name\"))\r\n );\r\n }, [range]);\r\n\r\n const renderLastScore = (lastGame: PlayerLastGame) => {\r\n if (lastGame.IsFirst) {\r\n return {lastGame.Score} ;\r\n }\r\n\r\n if (lastGame.IsLast) {\r\n return {lastGame.Score} ;\r\n }\r\n\r\n return lastGame.Score;\r\n };\r\n\r\n const renderPlayerRow = (data: PlayerTableResults, i: number) => {\r\n return (\r\n \r\n #{i + 1} \r\n \r\n {data.Name} \r\n \r\n \r\n {typeof data.LastGame === \"string\"\r\n ? data.LastGame\r\n : renderLastScore(data.LastGame)}\r\n \r\n {data.Games} \r\n {data.First} \r\n {data.Last} \r\n {data.Balance} \r\n
\r\n );\r\n };\r\n\r\n const renderWeekRow = (data: any, players: string[]) => {\r\n return (\r\n \r\n #{data.Week} \r\n {data.Genaya} \r\n {players.map(pl => {\r\n const score = data[pl];\r\n\r\n if (score === data.MaxScore) return {score} ;\r\n if (score === data.MinScore) return {score} ;\r\n\r\n return {score === undefined ? '-' : score} \r\n\r\n })}\r\n \r\n );\r\n };\r\n\r\n const renderHostRow = (data: Host, i: number) => {\r\n return (\r\n \r\n #{i + 1} \r\n {data.Name} \r\n {data.Count} \r\n
\r\n );\r\n };\r\n\r\n if (tableData === null) return <>>;\r\n\r\n const getTableView = () => (<>\r\n \r\n Rank \r\n \r\n Player \r\n \r\n Last Game \r\n Games \r\n Wins \r\n Losses \r\n Balance \r\n \r\n {tableData.map((data: PlayerTableResults, i: number) => renderPlayerRow(data, i))}\r\n
\r\n \r\n `#${value}`}\r\n />\r\n \r\n \r\n \r\n From:
\r\n To:
\r\n \r\n \r\n Game #{range[0]}
\r\n Game #{range[1]}
\r\n \r\n \r\n {getRangeText(range[0])}
\r\n {getRangeText(range[1])}
\r\n \r\n \r\n \r\n setRange([allGames.length - 3, allGames.length])}\r\n >\r\n 1M\r\n \r\n setRange([allGames.length - 7, allGames.length])}\r\n >\r\n 2M\r\n \r\n setRange([allGames.length - 11, allGames.length])}\r\n >\r\n 3M\r\n \r\n setRange([allGames.length - 15, allGames.length])}\r\n >\r\n 4M\r\n \r\n setRange([allGames.length - 25, allGames.length])}\r\n >\r\n 6M\r\n \r\n >);\r\n\r\n const getWeekByWeekView = () => {\r\n\r\n const weekByWeekGames: any[] = statsService.getWeekByWeekGamesTable(allGames);\r\n\r\n const players = statsService.getPlayesGameCount(allGames, _.map(appData!.Players, \"name\"));\r\n\r\n return (\r\n \r\n Week \r\n Genaya \r\n {players.map(pl => {pl.name} )}\r\n \r\n {weekByWeekGames.map((data: any) => renderWeekRow(data, players.map(p=> p.name)))}\r\n
);\r\n };\r\n\r\n const getHostsView = () => {\r\n\r\n const hosts: Host[] = statsService.getHostsTable(allGames, _.map(appData!.Players, \"name\"));\r\n\r\n return (\r\n \r\n Rank \r\n Host \r\n Games \r\n \r\n {hosts.map((data: Host, i: number) => renderHostRow(data, i))}\r\n
);\r\n };\r\n\r\n return (\r\n \r\n \r\n setView(Views.Rankings)}>Ranking \r\n setView(Views.WeekByWeek)}>Week by Week \r\n setView(Views.Hosts)}>Hosts \r\n \r\n {view === Views.Rankings && getTableView()}\r\n {view === Views.WeekByWeek && getWeekByWeekView()}\r\n {view === Views.Hosts && getHostsView()}\r\n \r\n );\r\n};\r\n\r\nexport default Stats;\r\n","import React from 'react';\r\n//import styled from \"styled-components\";\r\nimport Button from './common/Button';\r\n\r\ntype props = {\r\n name: string;\r\n isSelected: boolean;\r\n onClick: any;\r\n};\r\n\r\n// const Wrapper = styled.div<{ isSelected: boolean }>`\r\n// box-shadow:inset 0rem 0.1rem 0rem 0rem #ffffff;\r\n// background:${props => props.isSelected ? 'linear-gradient(to bottom, #b8e356 5%, #a5cc52 100%)': 'linear-gradient(to bottom, #f9f9f9 5%, #e9e9e9 100%)'};\r\n// border-radius:0.5rem;\r\n// border:0.1rem solid ${props => props.isSelected ? '#83c41a' : '#dcdcdc'};\r\n// cursor:pointer;\r\n// color:${props => props.isSelected ? '#ffffff' : '#666666'};\r\n// font-size:1rem;\r\n// font-weight:bold;\r\n// text-decoration:none;\r\n// min-width: 8rem;\r\n// height: 3rem;\r\n// display: flex;\r\n// justify-content: center;\r\n// align-items: center;\r\n// margin: 0.2rem;\r\n// `;\r\n\r\n\r\nconst Participant = ({ name, isSelected, onClick }: props) => {\r\n\r\n return (\r\n {name} \r\n );\r\n\r\n};\r\n\r\nexport default Participant;\r\n","import React from 'react';\r\nimport { ParticipantType } from './types';\r\nimport Participant from './Participant';\r\nimport styled from \"styled-components\";\r\n\r\n\r\ntype props = {\r\n participants: ParticipantType[];\r\n onParticipantClick: any;\r\n selectionCriteria: any;\r\n};\r\n\r\nconst Wrapper = styled.div`\r\n display: flex;\r\n flex-wrap: wrap;\r\n justify-content: flex-start;\r\n`;\r\n\r\nconst ItemWrapper = styled.div`\r\n flex: 90% 1 0;\r\n`;\r\n\r\nconst Participants = ({ participants, onParticipantClick, selectionCriteria }: props) => {\r\n\r\n const onClick = (p:ParticipantType) => () =>{\r\n onParticipantClick(p);\r\n };\r\n\r\n return (<>\r\n \r\n {participants.map((p: ParticipantType) => )}\r\n >);\r\n};\r\n\r\nexport default Participants;\r\n","import React, { useEffect, useRef, useState } from \"react\";\r\nimport styled from \"styled-components\";\r\nimport Button, { Size } from \"./common/Button\";\r\nimport {\r\n Clear,\r\n Menu,\r\n ShoppingCart,\r\n TimeToLeave,\r\n Replay\r\n} from \"@material-ui/icons\";\r\nimport { Slider } from \"@material-ui/core\";\r\nimport { createMuiTheme } from \"@material-ui/core/styles\";\r\nimport { ThemeProvider } from \"@material-ui/styles\";\r\nimport config from \"../config\";\r\n\r\nconst muiTheme = createMuiTheme({\r\n overrides: {\r\n MuiSlider: {\r\n thumb: {\r\n color: config.colors.buttonBG1\r\n },\r\n track: {\r\n color: config.colors.buttonSelectedBG1\r\n },\r\n rail: {\r\n color: config.colors.buttonSelectedBG1\r\n }\r\n }\r\n }\r\n});\r\n\r\ntype props = {\r\n name: string;\r\n amount: number;\r\n score?: number;\r\n onPlayerRequest: (name: string, request: string, data?: number) => void;\r\n};\r\n\r\nconst Wrapper = styled.div`\r\n display: flex;\r\n flex-direction: row;\r\n justify-content: left;\r\n align-items: center;\r\n margin: 2rem 0;\r\n height: 2.5rem;\r\n`;\r\n\r\nconst RebuyWrapper = styled.div`\r\n flex: auto 1 1;\r\n display: flex;\r\n padding-right: 2rem;\r\n`;\r\n\r\nconst Input = styled.input`\r\n width: 4rem;\r\n border-radius: 0.7rem;\r\n`;\r\n\r\nconst RebuyButton = styled.div`\r\n flex: auto 1 0;\r\n align-self: center;\r\n`;\r\n\r\nconst PlayerStatusWrapper = styled.div<{ isIn: boolean }>`\r\n font-size: 1.8rem;\r\n padding: 0 0.5rem;\r\n color: ${props => (props.isIn ? \"#fff\" : \"#aeaeae\")};\r\n flex: auto 0 0;\r\n cursor: pointer;\r\n`;\r\n\r\nconst IconWrapper = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n margin: 0 0.5rem;\r\n`;\r\n\r\n// const animation = keyframes`\r\n// 0% {\r\n// transform: translateX(-3%);\r\n// opacity: 0.3;\r\n// color: red;\r\n\r\n// }\r\n// 100% {\r\n// color: green;\r\n// transform: translateX(0);\r\n// opacity: 1;\r\n// }\r\n// `;\r\n// // animation: ${animation} 2s normal;\r\n\r\nconst MenuWrapper = styled.div`\r\n flex: 80% 1 1;\r\n display: flex;\r\n`;\r\n\r\nconst GamePlayer = ({ name, amount, score, onPlayerRequest }: props) => {\r\n \r\n const DEFAULT_REBUY = 50;\r\n \r\n const [showActions, setShowActions] = useState(score !== undefined);\r\n const [rebuySelection, setRebuySelection] = useState(false);\r\n const [cashoutRequest, setCashoutRequest] = useState(false);\r\n const [cashoutAmount, setCashoutAmount] = useState(\"\");\r\n const [rebuyAmount, setRebuyAmount] = useState(DEFAULT_REBUY);\r\n const cashoutAmountRef = useRef(null);\r\n\r\n const onCashoutAmountChange = (e: any) => {\r\n if (e.target.value === \"-\") {\r\n setCashoutAmount(\"-\");\r\n } else if (isNaN(e.target.value as any)) {\r\n setCashoutAmount(\"\");\r\n } else {\r\n setCashoutAmount(e.target.value);\r\n }\r\n };\r\n\r\n const isDuringAction = () => rebuySelection || cashoutRequest;\r\n\r\n const cashoutClicked = () => {\r\n setCashoutRequest(false);\r\n setShowActions(false);\r\n onPlayerRequest(name, \"cashout\", Number(cashoutAmount));\r\n setCashoutAmount(\"\");\r\n };\r\n\r\n useEffect(()=>{\r\n if(cashoutRequest && cashoutAmountRef.current){\r\n cashoutAmountRef.current.focus();\r\n }\r\n\r\n\r\n }, [cashoutRequest])\r\n\r\n const getLabel = () => {\r\n if (score !== undefined) {\r\n return `${name} (${score})`;\r\n }\r\n\r\n if (amount !== 0) {\r\n return `${name} (-${amount})`;\r\n }\r\n\r\n return `${name} (${amount})`;\r\n };\r\n\r\n const handleSliderChange = (event: any, value: any) => {\r\n //debugger;\r\n if (!event) return;\r\n setRebuyAmount(typeof value === \"number\" ? value : 0);\r\n //console.log(value);\r\n };\r\n\r\n const onRebuyClick = () => {\r\n onPlayerRequest(name, \"rebuy\", rebuyAmount);\r\n setRebuyAmount(DEFAULT_REBUY); \r\n setShowActions(false);\r\n setRebuySelection(false);\r\n };\r\n\r\n const onUndoRebuy = () => {\r\n onPlayerRequest(name, \"undo\");\r\n setShowActions(false);\r\n setRebuySelection(false);\r\n };\r\n\r\n const onCancel = () => {\r\n setShowActions(false);\r\n setCashoutRequest(false);\r\n setRebuySelection(false);\r\n setCashoutRequest(false);\r\n };\r\n\r\n const iconsStyle = {\r\n fontSize: \"2.2rem\",\r\n fill: config.colors.mainColor\r\n };\r\n\r\n return (\r\n \r\n {showActions ? (\r\n \r\n ) : (\r\n setShowActions(true)}> \r\n )}\r\n onPlayerRequest(name, \"rebuy\", DEFAULT_REBUY)}>\r\n {getLabel()}\r\n \r\n {showActions && !isDuringAction() && (\r\n \r\n \r\n setRebuySelection(true)}\r\n style={iconsStyle}\r\n > \r\n Rebuy\r\n \r\n \r\n onUndoRebuy()} style={iconsStyle}> \r\n Undo rebuy\r\n \r\n \r\n onPlayerRequest(name, \"remove\")}\r\n />\r\n Remove\r\n \r\n \r\n setCashoutRequest(true)}\r\n > \r\n Cashout\r\n \r\n \r\n )}\r\n\r\n {rebuySelection && (\r\n \r\n \r\n \r\n Rebuy\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {cashoutRequest && (\r\n <>\r\n \r\n \r\n {cashoutAmount !== \"\" ? \"Cashout\" : \"No chips\"}\r\n \r\n >\r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default GamePlayer;\r\n","import React, { useContext, useState, useMemo, useEffect } from \"react\";\r\nimport AppContext from \"./common/AppContext\";\r\nimport { ParticipantType } from \"./types\";\r\nimport Participants from \"./Participants\";\r\nimport _ from \"lodash\";\r\nimport GamePlayer from \"./GamePlayer\";\r\nimport styled from \"styled-components\";\r\nimport Button, { defaultColors, Colors } from \"./common/Button\";\r\nimport { WorkOutline } from \"@material-ui/icons\";\r\nimport config from \"../config\";\r\n\r\nenum GameStatus {\r\n notStarted,\r\n playerSelection,\r\n hostSelection,\r\n gameOn,\r\n playerJoining,\r\n finishing,\r\n finishedWithError,\r\n finishedSuccessfully,\r\n cancelling\r\n}\r\n\r\nconst Wrapper = styled.div`\r\n margin: 1.5rem;\r\n`;\r\n\r\nconst MiddleContentWrapper = styled.div`\r\n margin-top: 10rem;\r\n`;\r\n\r\nconst Margin = styled.div`\r\n padding-bottom: 0.2rem;\r\n`;\r\n\r\nconst ActionButtonWrapper = styled.div`\r\n display: flex;\r\n margin: 10% 0;\r\n color: ${config.colors.mainColor};\r\n justify-content: center;\r\n`;\r\n\r\nconst Title = styled.div`\r\n margin: 5% 0;\r\n font-size: 3rem;\r\n color: ${config.colors.mainColor};\r\n text-align: center;\r\n`;\r\n\r\nconst TotalMoney = styled.div<{ error: boolean }>`\r\n margin: 5% 0;\r\n color: ${props => (props.error ? \"red\" : \"white\")};\r\n display: flex;\r\n align-items: center;\r\n`;\r\n\r\nconst TotalMoneyText = styled.span`\r\n font-size: 2rem;\r\n margin-left: 0.7rem;\r\n`;\r\n\r\nconst PasswordInput = styled.input`\r\n font-size: 1.8rem;\r\n width: 98%;\r\n border-radius: 0.5rem;\r\n text-align: center;\r\n`;\r\n\r\nconst Game = () => {\r\n const appData: any = useContext(AppContext);\r\n const REBUY_AMOUNT: number = 50;\r\n\r\n const availablePlayers: ParticipantType[] = useMemo(() => {\r\n return appData!.Players.map((p: any) => {\r\n return {\r\n name: p.name,\r\n score: undefined,\r\n rebuys: [],\r\n quit: false\r\n };\r\n });\r\n }, [appData]);\r\n\r\n const [participants, setParticipants] = useState(availablePlayers);\r\n const [password, setPassword] = useState(\"\");\r\n const [gameStatus, setGameStatus] = useState(\r\n GameStatus.notStarted\r\n );\r\n\r\n const saveDataToLS = (isClear = false) => {\r\n try {\r\n const dataToSave = isClear ? null : { participants, gameStatus };\r\n localStorage[\"GameData\"] = JSON.stringify(dataToSave);\r\n } catch {\r\n console.error(\"cant save game to LS\");\r\n }\r\n };\r\n\r\n const loadDataFromLS = () => {\r\n try {\r\n const data = JSON.parse(localStorage[\"GameData\"]);\r\n setParticipants(data.participants);\r\n setGameStatus(data.gameStatus);\r\n } catch {\r\n console.error(\"cant load game from LS\");\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n loadDataFromLS();\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (gameStatus === GameStatus.finishedSuccessfully) {\r\n saveDataToLS(true);\r\n } else {\r\n saveDataToLS();\r\n }\r\n }, [participants, gameStatus]);\r\n\r\n const onParticipantClick = (p: ParticipantType) => {\r\n p.isIn = !p.isIn;\r\n p.rebuys = p.isIn\r\n ? [{ amount: REBUY_AMOUNT, time: new Date().toUTCString() }]\r\n : [];\r\n setParticipants([...participants]);\r\n };\r\n\r\n const onHostSelection = (p: ParticipantType) => {\r\n p.isHost = !p.isHost;\r\n setGameStatus(GameStatus.gameOn);\r\n setParticipants([...participants]);\r\n };\r\n\r\n const onCancelGameRequest = () => {\r\n setGameStatus(GameStatus.cancelling);\r\n };\r\n\r\n const getTotalMoney = (): number => {\r\n const result = _.sum(\r\n getPlayers().map(p => {\r\n const rebuys = getPlayerRebuys(p);\r\n const cashoutAmount =\r\n p.score !== undefined ? p.score + getPlayerRebuys(p) : 0;\r\n return rebuys - cashoutAmount;\r\n })\r\n );\r\n return result;\r\n };\r\n\r\n const onCancelGameApprove = () => {\r\n const initializedPlayers = participants.map((p: any) => {\r\n return {\r\n name: p.name,\r\n score: undefined,\r\n rebuys: [],\r\n quit: false\r\n };\r\n });\r\n\r\n setParticipants(initializedPlayers);\r\n setGameStatus(GameStatus.notStarted);\r\n };\r\n\r\n const getPlayers = (active: boolean = true): ParticipantType[] =>\r\n participants.filter(p => (active ? p.isIn : !p.isIn));\r\n\r\n const getPlayerRebuys = (p: ParticipantType) => _.sumBy(p.rebuys, \"amount\");\r\n\r\n const areAllPlayersCashedOut = (): boolean =>\r\n !_.some(participants, p => p.isIn && p.score === undefined);\r\n\r\n const submitGame = () => {\r\n const hostObject = getPlayers().filter(p => p.isHost);\r\n const host = hostObject.length ? hostObject[0].name : \"Not found\";\r\n\r\n const gameData: any = {\r\n GameDate: (new Date()).toLocaleDateString('he-IL'),\r\n Host: host\r\n };\r\n\r\n getPlayers().forEach((p: ParticipantType) => {\r\n gameData[p.name] = p.score !== undefined ? p.score.toString() : \"\";\r\n });\r\n\r\n const data = {\r\n gameData,\r\n password\r\n };\r\n\r\n const url = config.serviceUrl + \"/api/data\";\r\n\r\n fetch(url, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\"\r\n },\r\n body: JSON.stringify(data)\r\n }).then(res => {\r\n if (!res.ok) {\r\n res.text().then(text => {\r\n alert(\"error: \" + text);\r\n setGameStatus(GameStatus.finishedWithError);\r\n });\r\n } else {\r\n setGameStatus(GameStatus.finishedSuccessfully);\r\n }\r\n });\r\n };\r\n\r\n useEffect(()=>{\r\n if(!getPlayers()?.length && gameStatus === GameStatus.hostSelection){\r\n onCancelGameApprove();\r\n }\r\n\r\n },[gameStatus]);\r\n\r\n const onPlayerRequest = (name: string, request: string, data?: number) => {\r\n const player = participants.find((p: ParticipantType) => p.name === name);\r\n if (!player) return;\r\n\r\n switch (request) {\r\n case \"rebuy\":\r\n if (player.score !== undefined) {\r\n player.score = undefined;\r\n }\r\n player.rebuys.push({ amount: data!, time: new Date().toUTCString() });\r\n break;\r\n\r\n case \"undo\":\r\n player.rebuys.pop();\r\n break;\r\n\r\n case \"remove\":\r\n player.isIn = false;\r\n player.rebuys = [];\r\n player.score = undefined;\r\n break;\r\n\r\n case \"cashout\":\r\n player.score = data! - getPlayerRebuys(player);\r\n\r\n break;\r\n }\r\n\r\n setParticipants([...participants]);\r\n };\r\n\r\n const getContentToRender = () => {\r\n switch (gameStatus) {\r\n case GameStatus.notStarted:\r\n return (\r\n <>\r\n Ready? \r\n \r\n {\r\n setGameStatus(GameStatus.playerSelection);\r\n }}\r\n >\r\n Start game\r\n \r\n {\r\n localStorage[\"GameData\"] = '';\r\n }}\r\n >\r\n Clear Data\r\n \r\n \r\n >\r\n );\r\n\r\n case GameStatus.playerSelection:\r\n const actionButtonColors: Colors = {\r\n ...defaultColors,\r\n ...{ background: [config.colors.mainColor, config.colors.mainColor] }\r\n };\r\n\r\n return (\r\n <>\r\n Choose Players \r\n p.isIn || false}\r\n onParticipantClick={onParticipantClick}\r\n participants={participants}\r\n />\r\n \r\n {\r\n if(!getPlayers()?.length) return;\r\n setGameStatus(GameStatus.hostSelection);\r\n }}\r\n >\r\n Next\r\n \r\n \r\n >\r\n );\r\n\r\n case GameStatus.hostSelection:\r\n return (\r\n <>\r\n Choose Host \r\n p.isHost || false}\r\n onParticipantClick={onHostSelection}\r\n participants={getPlayers()}\r\n />\r\n >\r\n );\r\n\r\n case GameStatus.gameOn:\r\n case GameStatus.cancelling:\r\n return (\r\n <>\r\n Game on! \r\n {getPlayers().map((p: ParticipantType) => (\r\n \r\n ))}\r\n \r\n \r\n Total {getTotalMoney()} \r\n \r\n {\r\n setGameStatus(GameStatus.playerJoining);\r\n }}\r\n >\r\n Join player\r\n \r\n \r\n {\r\n gameStatus === GameStatus.cancelling\r\n ? onCancelGameApprove()\r\n : onCancelGameRequest();\r\n }}\r\n >\r\n {gameStatus === GameStatus.cancelling\r\n ? \"I'm sure, Cancel game! \"\r\n : \"Cancel game\"}\r\n \r\n {areAllPlayersCashedOut() && (\r\n <>\r\n \r\n {\r\n setGameStatus(GameStatus.finishing);\r\n }}\r\n >\r\n Submit game\r\n \r\n >\r\n )}\r\n >\r\n );\r\n\r\n case GameStatus.playerJoining:\r\n return (\r\n <>\r\n Who just joined? \r\n p.isIn || false}\r\n onParticipantClick={(p: ParticipantType) => {\r\n setGameStatus(GameStatus.gameOn);\r\n onParticipantClick(p);\r\n }}\r\n participants={getPlayers(false)}\r\n />\r\n >\r\n );\r\n\r\n case GameStatus.finishing:\r\n return (\r\n <>\r\n Finishing up... \r\n \r\n setPassword(ev.target.value)}\r\n > \r\n Submit \r\n \r\n >\r\n );\r\n\r\n case GameStatus.finishedWithError:\r\n return (\r\n <>\r\n Oops... \r\n Game was not saved \r\n \r\n { setPassword(''); setGameStatus(GameStatus.gameOn); }}>\r\n back to game\r\n \r\n \r\n >\r\n );\r\n\r\n case GameStatus.finishedSuccessfully:\r\n return (\r\n <>\r\n Game saved! \r\n \r\n { setPassword(''); setGameStatus(GameStatus.gameOn); }}>\r\n back to game (Fix results)\r\n \r\n window.location.href = '/stats' }>View Stats \r\n \r\n >\r\n );\r\n }\r\n };\r\n\r\n return {getContentToRender()} ;\r\n};\r\n\r\nexport default Game;\r\n","import React from \"react\";\r\nimport logo from \"../images/logo.png\";\r\nimport styled from \"styled-components\";\r\nimport config from \"config\";\r\n\r\nconst HomepageLogo = styled.div<{ img: any }>`\r\n background-image: ${props => `url(${props.img} )`};\r\n background-repeat: no-repeat;\r\n background-size: contain !important;\r\n display: block;\r\n height: 100%;\r\n margin: 0px auto;\r\n width: 100%;\r\n background-position: center;\r\n height: 15rem;\r\n margin-top: 10rem;\r\n`;\r\n\r\nconst Title = styled.div`\r\n margin: 5% 0;\r\n font-size: 1.5rem;\r\n color: ${config.colors.mainColor};\r\n text-align: center;\r\n`;\r\n\r\nconst Home = () => {\r\n const texts = [\r\n \"Ready to lose?\",\r\n \"One player to rule them all\",\r\n \"Why bother? just transfer via bit\",\r\n \"The Genaya always has the upper hand\",\r\n \"Ready to play until 5am?\",\r\n \"Omaha 6/2 post river\",\r\n \"Are the snacks ready?\",\r\n \"Ready to spill some Beer on the table?\",\r\n \"Tell me something YS - why MY ass?\",\r\n \"Ja is done\",\r\n \"Rape me my friend\",\r\n \"Genaya of 600 nis\",\r\n \"Naor is on the roll\",\r\n \"Is Dror cumming?\"\r\n\r\n ];\r\n\r\n const text = texts[Math.round(Math.random() * (texts.length - 1))];\r\n\r\n return (\r\n \r\n \r\n
{text} \r\n
\r\n );\r\n};\r\n\r\nexport default Home;\r\n","export default {\r\n\r\n Players: [{ name: \"Amir\", image: \"Amir.png\" }, { name: \"Avishai\", image: \"Avishai.png\" }, { name: \"Dror\", image: \"Dror.png\" }, { name: \"Eran\", image: \"Eran.png\" }, { name: \"Elad\", image: \"Elad.png\" }, { name: \"Fabel\", image: \"Fabel.png\" }, { name: \"Lior\", image: \"Lior.png\" }, { name: \"Naor\", image: \"Naor.png\" }, { name: \"Omri\", image: \"Omri.png\" }, { name: \"Haim\", image: \"Haim.png\" }, { name: \"Yaniv\", image: \"Yaniv.png\" }],\r\n Games: [\r\n {GameDate:\"18.6.2021\", Amir:\"100\",Avishai:\"-100\",Eran:\"-300\",Lior: \"-350\",Naor:\"285\",Yaniv:\"70\",Host:\"Avishai\"},\r\n {GameDate:\"17.6.2021\", Amir:\"120\",Avishai:\"100\",Eran:\"200\",Lior: \"-120\",Naor:\"20\",Yaniv:\"170\",Host:\"Yaniv\"},\r\n {GameDate:\"15.6.2020\", Amir:\"430\",Avishai:\"200\",Eran:\"-20\",Lior: \"100\",Naor:\"85\",Yaniv:\"70\",Host:\"Amir\"},\r\n {GameDate:\"13.6.2020\", Amir:\"30\",Avishai:\"300\",Eran:\"100\",Naor:\"25\",Yaniv:\"70\",Host:\"Avishai\"},\r\n {GameDate:\"12.6.2020\", Avishai:\"300\",Eran:\"100\",Lior: \"-10\",Naor:\"25\",Yaniv:\"70\",Host:\"Avishai\"},\r\n {GameDate:\"11.6.2020\", Avishai:\"0\",Eran:\"100\",Lior: \"-10\",Naor:\"25\",Yaniv:\"70\",Host:\"Yaniv\"},\r\n {GameDate:\"10.6.2020\", Amir:\"30\",Avishai:\"300\",Eran:\"100\",Lior: \"-10\",Naor:\"25\",Yaniv:\"70\",Host:\"Yaniv\"},\r\n {GameDate:\"18.6.2020\", Amir:\"30\",Avishai:\"300\",Naor:\"25\",Yaniv:\"70\",Host:\"Yaniv\"},\r\n {GameDate:\"18.6.2020\", Amir:\"30\",Avishai:\"300\",Naor:\"25\",Yaniv:\"70\",Host:\"Yaniv\"},\r\n {GameDate:\"18.6.2020\", Amir:\"1\",Avishai:\"-10\"},\r\n {GameDate:\"18.6.2019\", Amir:\"30\",Avishai:\"300\",Lior: \"-10\",Naor:\"25\",Yaniv:\"70\",Host:\"Avishai\"}\r\n \r\n ]\r\n};\r\n","import Layout from \"../components/common/Layout\";\r\nimport Loader from \"./common/Loader/Loader\";\r\nimport React, { useEffect, useState } from \"react\";\r\nimport { Route } from \"react-router\";\r\nimport Players from \"./Players\";\r\nimport Stats from \"./Stats\";\r\nimport Game from \"./Game\";\r\nimport Home from \"./Home\";\r\nimport { BrowserRouter as Router } from \"react-router-dom\";\r\nimport AppContext from \"./common/AppContext\";\r\nimport config from \"../config\";\r\nimport styled from \"styled-components\";\r\nimport mockData from '../mockData';\r\n\r\nconst ErrorWrapper = styled.div`\r\n font-size: 2rem;\r\n padding: 2rem;\r\n`;\r\n\r\nconst Main = () => {\r\n const [appData, setAppData] = useState(null);\r\n const [dataLoadingError, setDataLoadingError] = useState(false);\r\n \r\n useEffect(() => {\r\n\r\n if(config.useMock){\r\n setAppData(mockData);\r\n return;\r\n }\r\n const url = config.serviceUrl + \"/api/data\";\r\n fetch(url)\r\n .then((response: Response) => {\r\n if (!response.ok) {\r\n throw Error(response.statusText);\r\n }\r\n response.json().then(d => {\r\n // issue in prod env (web api) - returns string\r\n let data = typeof(d) === 'string' ? JSON.parse(d) : d;\r\n setAppData(data);\r\n });\r\n })\r\n .catch(() => {\r\n setDataLoadingError(true);\r\n });\r\n }, []);\r\n\r\n return (\r\n \r\n {appData ? (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n dataLoadingError ? Sorry, something went wrong :( : \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default Main;\r\n","import React, { useEffect } from 'react';\r\n// import './App.css';\r\nimport Main from './components/Main';\r\nimport styled from 'styled-components';\r\nimport config from 'config';\r\n\r\nconst AppStyles = styled.div`\r\n background-color: black;\r\n height: 100%;\r\n overflow: auto;\r\n background: linear-gradient(0deg, ${config.colors.mainBGColor1} 0%, ${config.colors.mainBGColor2} 100%);\r\n`;\r\n\r\nfunction App() {\r\n\r\n useEffect(()=>\r\n window.onload=function(){ \r\n setTimeout(function(){ \r\n window.scrollTo(0, 1); })\r\n },[]);\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default App;\r\n\r\n\r\n","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.0/8 are considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\nexport function register(config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl, config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log(\r\n 'New content is available and will be used when all ' +\r\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\r\n );\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl, config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl, {\r\n headers: { 'Service-Worker': 'script' }\r\n })\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (\r\n response.status === 404 ||\r\n (contentType != null && contentType.indexOf('javascript') === -1)\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport './index.css';\r\nimport App from './App';\r\nimport * as serviceWorker from './serviceWorker';\r\n\r\nReactDOM.render( , document.getElementById('root'));\r\n\r\n// If you want your app to work offline and load faster, you can change\r\n// unregister() to register() below. Note this comes with some pitfalls.\r\n// Learn more about service workers: https://bit.ly/CRA-PWA\r\nserviceWorker.unregister();\r\n"],"sourceRoot":""}