79 lines
2.8 KiB
JavaScript
79 lines
2.8 KiB
JavaScript
import React, { useState, useEffect, useContext } from 'react';
|
|
import ReactLoading from 'react-loading';
|
|
import { PlayerDataContext, SocketContext } from '../../App';
|
|
import Map from './Map/Map';
|
|
import Navbar from '../Navbar/Navbar';
|
|
|
|
const Gameboard = () => {
|
|
const socket = useContext(SocketContext);
|
|
const context = useContext(PlayerDataContext);
|
|
|
|
const [pawns, setPawns] = useState([]);
|
|
const [players, setPlayers] = useState([]);
|
|
|
|
const [rolledNumber, setRolledNumber] = useState(null);
|
|
const [time, setTime] = useState();
|
|
const [isReady, setIsReady] = useState();
|
|
const [nowMoving, setNowMoving] = useState(false);
|
|
const [started, setStarted] = useState(false);
|
|
|
|
const [movingPlayer, setMovingPlayer] = useState('red');
|
|
|
|
useEffect(() => {
|
|
socket.emit('room:data', context.roomId);
|
|
socket.on('room:data', data => {
|
|
data = JSON.parse(data);
|
|
if (data.players == null) return;
|
|
// Filling navbar with empty player nick container
|
|
while (data.players.length !== 4) {
|
|
data.players.push({ name: '...' });
|
|
}
|
|
// Checks if client is currently moving player by session ID
|
|
const nowMovingPlayer = data.players.find(player => player.nowMoving === true);
|
|
if (nowMovingPlayer) {
|
|
if (nowMovingPlayer._id === context.playerId) {
|
|
setNowMoving(true);
|
|
} else {
|
|
setNowMoving(false);
|
|
}
|
|
setMovingPlayer(nowMovingPlayer.color);
|
|
}
|
|
const currentPlayer = data.players.find(player => player._id === context.playerId);
|
|
setIsReady(currentPlayer.ready);
|
|
setRolledNumber(data.rolledNumber);
|
|
setPlayers(data.players);
|
|
setPawns(data.pawns);
|
|
setTime(data.nextMoveTime);
|
|
setStarted(data.started);
|
|
});
|
|
}, [socket]);
|
|
|
|
const rolledNumberCallback = number => {
|
|
setRolledNumber(number);
|
|
};
|
|
|
|
return (
|
|
<>
|
|
{(players[0] && !started) || (time && started) ? (
|
|
<div className='container'>
|
|
<Navbar
|
|
players={players}
|
|
started={started}
|
|
time={time}
|
|
isReady={isReady}
|
|
movingPlayer={movingPlayer}
|
|
rolledNumber={rolledNumber}
|
|
nowMoving={nowMoving}
|
|
rolledNumberCallback={rolledNumberCallback}
|
|
/>
|
|
<Map pawns={pawns} nowMoving={nowMoving} rolledNumber={rolledNumber} />
|
|
</div>
|
|
) : (
|
|
<ReactLoading type='spinningBubbles' color='white' height={667} width={375} />
|
|
)}
|
|
</>
|
|
);
|
|
};
|
|
|
|
export default Gameboard;
|