import React, { useContext, useState, useMemo, useRef, useEffect } from "react"; import equal from "fast-deep-equal"; import "./PlayersStatus.css"; import { BoardPieces } from './BoardPieces.js'; import { Resource } from './Resource.js'; import { PlayerColor } from './PlayerColor.js'; import { Placard } from './Placard.js'; import { GlobalContext } from './GlobalContext.js'; const Player = ({ player, onClick, reverse, color, largestArmy, isSelf, longestRoad, mostPorts, mostDeveloped }) => { if (!player) { return <>You are an observer.; } const developmentCards = player.unplayed ? : undefined; const resourceCards = player.resources ? : undefined; const armyCards = player.army ? : undefined; let points = <>; if (player.points && reverse) { points = <>{player.points}; } else if (player.points) { points = <>{player.points}; } const mostPortsPlacard = mostPorts && mostPorts === color ? : undefined; const mostDevelopedPlacard = mostDeveloped && mostDeveloped === color ? : undefined; const longestRoadPlacard = longestRoad && longestRoad === color ? : undefined; const largestArmyPlacard = largestArmy && largestArmy === color ? : undefined; return
{player.name}
{ isSelf &&
Longest road: {player.longestRoad ? player.longestRoad : 0}
}
{points}
{ (largestArmy || longestRoad || armyCards || resourceCards || developmentCards || mostPorts || mostDeveloped) && <>
{ !reverse && <> { mostDevelopedPlacard } { mostPortsPlacard } { largestArmyPlacard } { longestRoadPlacard } { !largestArmyPlacard && armyCards } { developmentCards } { resourceCards } } { reverse && <> { resourceCards } { developmentCards } { !largestArmyPlacard && armyCards } { longestRoadPlacard } { largestArmyPlacard } { mostPortsPlacard } { mostDevelopedPlacard } }
}
}; const PlayersStatus = ({ active }) => { const { ws } = useContext(GlobalContext); const [players, setPlayers] = useState(undefined); const [color, setColor] = useState(undefined); const [largestArmy, setLargestArmy] = useState(undefined); const [longestRoad, setLongestRoad] = useState(undefined); const [mostPorts, setMostPorts] = useState(undefined); const [mostDeveloped, setMostDeveloped] = useState(undefined); const fields = useMemo(() => [ 'players', 'color', 'longestRoad', 'largestArmy', 'mostPorts', 'mostDeveloped' ], []); const onWsMessage = (event) => { const data = JSON.parse(event.data); switch (data.type) { case 'game-update': console.log(`players-status - game-update: `, data.update); if ('players' in data.update && !equal(players, data.update.players)) { setPlayers(data.update.players); } if ('color' in data.update && data.update.color !== color) { setColor(data.update.color); } if ('longestRoad' in data.update && data.update.longestRoad !== longestRoad) { setLongestRoad(data.update.longestRoad); } if ('largestArmy' in data.update && data.update.largestArmy !== largestArmy) { setLargestArmy(data.update.largestArmy); } if ('mostDeveloped' in data.update && data.update.mostDeveloped !== mostDeveloped) { setMostDeveloped(data.update.mostDeveloped); } if ('mostPorts' in data.update && data.update.mostPorts !== mostPorts) { setMostPorts(data.update.mostPorts); } 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]); if (!players) { return <>; } const buildItem = () => { console.log(`player-status - build-item`); } let elements; if (active) { elements = ; } else { elements = Object.getOwnPropertyNames(players) .filter(key => color !== key) .map(key => { return ; }); } return (
{ elements }
); } export { PlayersStatus };