import React, { useState, useEffect, useContext, useRef, useMemo, useCallback } from "react"; import equal from "fast-deep-equal"; import Paper from '@material-ui/core/Paper'; import Button from '@material-ui/core/Button'; import "./Winner.css"; import {Resource} from './Resource.js'; import {PlayerColor} from './PlayerColor.js'; import { GlobalContext } from "./GlobalContext.js"; const Winner = ({ winnerDismissed, setWinnerDismissed }) => { const { ws } = useContext(GlobalContext); const [winner, setWinner] = useState(undefined); const [state, setState] = useState(undefined); const fields = useMemo(() => [ 'winner', 'state' ], []); const onWsMessage = (event) => { const data = JSON.parse(event.data); switch (data.type) { case 'game-update': console.log(`winner - game update`, data.update); if ('winner' in data.update && !equal(data.update.winner, winner)) { setWinner(data.update.winner); } if ('state' in data.update && data.update.state !== state) { if (data.update.state !== 'winner') { setWinner(undefined); } setWinnerDismissed(false); setState(data.update.state); } break; default: break; } }; const refWsMessage = useRef(onWsMessage); useEffect(() => { refWsMessage.current = onWsMessage; }); useEffect(() => { if (!ws) { return; } const cbMessage = e => refWsMessage.current(e); ws.addEventListener('message', cbMessage); return () => { ws.removeEventListener('message', cbMessage); } }, [ws, refWsMessage]); useEffect(() => { if (!ws) { return; } ws.send(JSON.stringify({ type: 'get', fields })); }, [ws, fields]); const quitClicked = useCallback((event) => { if (!winnerDismissed) { setWinnerDismissed(true); ws.send(JSON.stringify({ type: 'goto-lobby' })); } }, [ws, winnerDismissed, setWinnerDismissed]); if (!winner || winnerDismissed) { return <>>; } let losers = []; for (let key in winner.players) { if (key === winner.color || winner.players[key].status === 'Not active') { continue; } losers.push(winner.players[key]); } const turnCount = Math.floor(winner.turns / (losers.length + 1)); losers = losers.map(player => { const averageSeconds = Math.floor(player.totalTime / turnCount / 1000), average = `${Math.floor(averageSeconds / 60)}m:${averageSeconds % 60}s`; return