Started hooking in players-status
Signed-off-by: James Ketrenos <james_eikona@ketrenos.com>
This commit is contained in:
parent
70a65b1665
commit
a281c539cc
@ -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;
|
||||||
|
@ -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}/>
|
||||||
}
|
}
|
||||||
|
@ -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};
|
@ -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
|
||||||
|
@ -76,4 +76,4 @@ const Placard = ({table, type, active, disabled, count}) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export default Placard;
|
export {Placard};
|
||||||
|
@ -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 };
|
Loading…
x
Reference in New Issue
Block a user