1
0

Started hooking in players-status

Signed-off-by: James Ketrenos <james_eikona@ketrenos.com>
This commit is contained in:
James Ketrenos 2022-03-12 19:53:03 -08:00
parent 70a65b1665
commit a281c539cc
6 changed files with 102 additions and 56 deletions

View File

@ -59,6 +59,11 @@ body {
padding: 1rem; padding: 1rem;
} }
.Table .PlayersStatus {
z-index: 5000;
}
.Table .Game { .Table .Game {
position: relative; position: relative;
display: flex; display: flex;

View File

@ -20,6 +20,7 @@ import { base, gamesPath } from './Common.js';
import { GameOrder } from "./GameOrder.js"; import { GameOrder } from "./GameOrder.js";
import { Activities } from "./Activities.js"; import { Activities } from "./Activities.js";
import { SelectPlayer } from "./SelectPlayer.js"; import { SelectPlayer } from "./SelectPlayer.js";
import { PlayersStatus } from "./PlayersStatus.js";
import history from "./history.js"; import history from "./history.js";
import "./App.css"; import "./App.css";
@ -296,7 +297,8 @@ const Table = () => {
{ color && state === 'game-order' && <GameOrder/> } { color && state === 'game-order' && <GameOrder/> }
<Board/> <Board/>
<PlayersStatus/>
<PlayersStatus active={true}/>
{ /* state === 'winner' && { /* state === 'winner' &&
<Winner color={winner}/> <Winner color={winner}/>
} }

View File

@ -19,12 +19,7 @@ const City = ({ color, onClick }) => {
return <div className="City" onClick={() => onClick('city')}><div className={['Shape', classes[color]].join(' ')}/></div>; return <div className="City" onClick={() => onClick('city')}><div className={['Shape', classes[color]].join(' ')}/></div>;
} }
const BoardPieces = ({ table, color, onClick }) => { const BoardPieces = ({ player, onClick, color }) => {
if (!table.game || !table.game.player) {
return <></>;
}
const player = table.game.players[color];
if (!player) { if (!player) {
return <></>; return <></>;
} }
@ -51,4 +46,4 @@ const BoardPieces = ({ table, color, onClick }) => {
); );
}; };
export default BoardPieces; export {BoardPieces};

View File

@ -72,11 +72,14 @@ const MediaAgent = () => {
return; return;
} }
const connection = new RTCPeerConnection({ const connection = new RTCPeerConnection({
/*configuration: { configuration: {
offerToReceiveAudio: true, offerToReceiveAudio: true,
offerToReceiveVideo: false offerToReceiveVideo: false
},*/ },
iceServers: [ { urls: "stun:stun.l.google.com:19302" } ] iceServers: [
{ urls: "stun:stun.l.google.com:19302" },
{ urls: "stun:stun.stunprotocol.org:3478" }
]
}, { }, {
/* this will no longer be needed by chrome /* this will no longer be needed by chrome
* eventually (supposedly), but is necessary * eventually (supposedly), but is necessary

View File

@ -76,4 +76,4 @@ const Placard = ({table, type, active, disabled, count}) => {
} }
}; };
export default Placard; export {Placard};

View File

@ -1,17 +1,18 @@
import React from "react"; import React, { useContext, useState, useMemo, useRef, useEffect } from "react";
import Resource from './Resource.js'; import equal from "fast-deep-equal";
import "./PlayersStatus.css";
import BoardPieces from './BoardPieces.js';
import { getPlayerName } from './Common.js';
import PlayerColor from './PlayerColor.js';
import Placard from './Placard.js';
const Player = ({ table, color, onClick, reverse }) => { import "./PlayersStatus.css";
if (!table.game) { 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, largestArmySize, isSelf, longestRoad, longestRoadLength }) => {
if (!player) {
return <></>; return <></>;
} }
const game = table.game;
const player = game.players[color];
const developmentCards = player.unplayed const developmentCards = player.unplayed
? <Resource label={true} type={'progress-back'} ? <Resource label={true} type={'progress-back'}
@ -29,28 +30,28 @@ const Player = ({ table, color, onClick, reverse }) => {
disabled/><b>{player.points}</b></>; disabled/><b>{player.points}</b></>;
} }
const longestRoad = game.longestRoad && game.longestRoad === color ? const longestRoadPlacard = longestRoad && longestRoad === color ?
<Placard <Placard
disabled disabled
active={false} active={false}
type='longest-road' type='longest-road'
count={game.longestRoadLength} count={longestRoadLength}
/> : undefined; /> : undefined;
const largestArmy = game.largestArmy && game.largestArmy === color ? const largestArmyPlacard = largestArmy && largestArmy === color ?
<Placard <Placard
disabled disabled
active={false} active={false}
type='largest-army' type='largest-army'
count={game.largestArmySize} count={largestArmySize}
/> : undefined; /> : undefined;
return <div className="Player"> return <div className="Player">
<div className="Who"> <div className="Who">
<PlayerColor color={color}/>{getPlayerName(game.sessions, color)} <PlayerColor color={color}/>{player.name}
</div> </div>
<div className="What"> <div className="What">
{ game.color === color && { isSelf &&
<div className="LongestRoad"> <div className="LongestRoad">
Longest road: {player.longestRoad ? player.longestRoad : 0} Longest road: {player.longestRoad ? player.longestRoad : 0}
</div> </div>
@ -59,58 +60,98 @@ const Player = ({ table, color, onClick, reverse }) => {
{ (largestArmy || longestRoad || armyCards || developmentCards) && <> { (largestArmy || longestRoad || armyCards || developmentCards) && <>
<div className="Has"> <div className="Has">
{ !reverse && <> { !reverse && <>
{ largestArmy } { largestArmyPlacard }
{ longestRoad } { longestRoadPlacard }
{ !largestArmy && armyCards } { !largestArmyPlacard && armyCards }
{ developmentCards } { developmentCards }
</> } </> }
{ reverse && <> { reverse && <>
{ developmentCards } { developmentCards }
{ !largestArmy && armyCards } { !largestArmyPlacard && armyCards }
{ longestRoad } { longestRoadPlacard }
{ largestArmy } { largestArmyPlacard }
</> } </> }
</div> </div>
</> } </> }
</div> </div>
<div className={`${onClick ? 'Normal' : 'Shrunken'}`}> <div className={`${onClick ? 'Normal' : 'Shrunken'}`}>
<BoardPieces onClick={onClick} table={table} color={color}/> <BoardPieces onClick={onClick} player={player}/>
</div> </div>
</div> </div>
}; };
const PlayersStatus = ({ table, onClick, color, active }) => { const PlayersStatus = ({ active }) => {
if (!table.game) { const { ws } = useContext(GlobalContext);
const [players, setPlayers] = useState(undefined);
const [color, setColor] = useState(undefined);
const fields = useMemo(() => [
'players', 'color'
], []);
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);
}
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 <></>; return <></>;
} }
const game = table.game; const buildItem = () => {
let players; console.log(`player-status - build-item`);
if (color) { }
players = <Player
onClick={onClick} let elements;
if (active) {
elements = <Player
player={players[color]}
onClick={buildItem}
reverse reverse
key={`PlayerStatus-${getPlayerName(game.sessions, color)}`} key={`PlayerStatus-${color}`}
table={table}
color={color}/>; color={color}/>;
} else { } else {
players = Object.getOwnPropertyNames(game.players) elements = Object.getOwnPropertyNames(players)
.filter(color => game.players[color].status === 'Active' .filter(key => players[key].status === 'Active'
&& game.color !== color) && color !== key)
.map(color => { .map(key => {
return <Player return <Player
onClick={onClick} player={players[key]}
key={`PlayerStatus-${getPlayerName(game.sessions, color)}`} key={`PlayerStatus-${key}}`}
table={table} color={key}/>;
color={color}/>;
}); });
} }
return ( return (
<div className={`PlayersStatus ${active ? 'ActivePlayer' : ''}`}> <div className={`PlayersStatus ${active ? 'ActivePlayer' : ''}`}>
{ players } { elements }
</div> </div>
); );
} }
export default PlayersStatus; export { PlayersStatus };