updated packages
This commit is contained in:
parent
9d2900ec6e
commit
8721737897
12883
package-lock.json
generated
12883
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
26
package.json
26
package.json
@ -3,22 +3,24 @@
|
|||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@material-ui/core": "^4.11.3",
|
"@emotion/react": "^11.11.1",
|
||||||
"@testing-library/jest-dom": "^5.11.9",
|
"@emotion/styled": "^11.11.0",
|
||||||
"@testing-library/react": "^11.2.5",
|
"@mui/material": "^5.14.20",
|
||||||
"@testing-library/user-event": "^12.8.3",
|
"@testing-library/jest-dom": "^6.1.5",
|
||||||
"axios": "^0.21.1",
|
"@testing-library/react": "^14.1.2",
|
||||||
|
"@testing-library/user-event": "^14.5.1",
|
||||||
|
"axios": "^1.6.2",
|
||||||
"prop-types": "^15.8.1",
|
"prop-types": "^15.8.1",
|
||||||
"react": "^17.0.1",
|
"react": "^18.2.0",
|
||||||
"react-beforeunload": "^2.4.0",
|
"react-beforeunload": "^2.6.0",
|
||||||
"react-dom": "^17.0.1",
|
"react-dom": "^18.2.0",
|
||||||
"react-loading": "^2.0.3",
|
"react-loading": "^2.0.3",
|
||||||
"react-router-dom": "^5.2.0",
|
"react-router-dom": "^6.20.1",
|
||||||
"react-scripts": "^5.0.1",
|
"react-scripts": "^5.0.1",
|
||||||
"react-transition-group": "^4.4.5",
|
"react-transition-group": "^4.4.5",
|
||||||
"socket.io": "^4.5.1",
|
"socket.io": "^4.7.2",
|
||||||
"socket.io-client": "^4.5.1",
|
"socket.io-client": "^4.7.2",
|
||||||
"web-vitals": "^1.1.0"
|
"web-vitals": "^3.5.0"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "react-scripts start",
|
"start": "react-scripts start",
|
||||||
|
|||||||
68
src/App.js
68
src/App.js
@ -1,6 +1,6 @@
|
|||||||
import React, { useEffect, useState, createContext } from 'react';
|
import React, { useEffect, useState, createContext } from 'react';
|
||||||
import { io } from 'socket.io-client';
|
import { io } from 'socket.io-client';
|
||||||
import { BrowserRouter as Router, Route, Redirect, Switch } from 'react-router-dom';
|
import { BrowserRouter as Router, Routes, Route, Navigate } from 'react-router-dom';
|
||||||
import ReactLoading from 'react-loading';
|
import ReactLoading from 'react-loading';
|
||||||
import Gameboard from './components/Gameboard/Gameboard';
|
import Gameboard from './components/Gameboard/Gameboard';
|
||||||
import LoginPage from './components/LoginPage/LoginPage';
|
import LoginPage from './components/LoginPage/LoginPage';
|
||||||
@ -12,13 +12,14 @@ function App() {
|
|||||||
const [playerData, setPlayerData] = useState();
|
const [playerData, setPlayerData] = useState();
|
||||||
const [playerSocket, setPlayerSocket] = useState();
|
const [playerSocket, setPlayerSocket] = useState();
|
||||||
const [redirect, setRedirect] = useState();
|
const [redirect, setRedirect] = useState();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const socket = io('http://localhost:8080', { withCredentials: true });
|
const socket = io('http://localhost:8080', { withCredentials: true });
|
||||||
socket.on('player:data', data => {
|
socket.on('player:data', data => {
|
||||||
data = JSON.parse(data);
|
data = JSON.parse(data);
|
||||||
setPlayerData(data);
|
setPlayerData(data);
|
||||||
data.roomId != null ? setRedirect(true) : setRedirect(false);
|
if (data.roomId != null) {
|
||||||
|
setRedirect(true);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
setPlayerSocket(socket);
|
setPlayerSocket(socket);
|
||||||
}, []);
|
}, []);
|
||||||
@ -26,26 +27,47 @@ function App() {
|
|||||||
return (
|
return (
|
||||||
<SocketContext.Provider value={playerSocket}>
|
<SocketContext.Provider value={playerSocket}>
|
||||||
<Router>
|
<Router>
|
||||||
{redirect ? <Redirect to='/game' /> : <Redirect to='/login' />}
|
<Routes>
|
||||||
<Switch>
|
<Route
|
||||||
<Route exact path='/'>
|
exact
|
||||||
LOADING...
|
path='/'
|
||||||
</Route>
|
Component={() => {
|
||||||
<Route path='/login'>
|
if (redirect) {
|
||||||
{playerSocket ? (
|
return <Navigate to='/game' />;
|
||||||
<LoginPage />
|
} else if (playerSocket) {
|
||||||
) : (
|
return <LoginPage />;
|
||||||
<ReactLoading type='spinningBubbles' color='white' height={667} width={375} />
|
} else {
|
||||||
)}
|
return <ReactLoading type='spinningBubbles' color='white' height={667} width={375} />;
|
||||||
</Route>
|
}
|
||||||
<Route path='/game'>
|
}}
|
||||||
{playerData ? (
|
></Route>
|
||||||
<PlayerDataContext.Provider value={playerData}>
|
<Route
|
||||||
<Gameboard />
|
path='/login'
|
||||||
</PlayerDataContext.Provider>
|
Component={() => {
|
||||||
) : null}
|
if (redirect) {
|
||||||
</Route>
|
return <Navigate to='/game' />;
|
||||||
</Switch>
|
} else if (playerSocket) {
|
||||||
|
return <LoginPage />;
|
||||||
|
} else {
|
||||||
|
return <ReactLoading type='spinningBubbles' color='white' height={667} width={375} />;
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
></Route>
|
||||||
|
<Route
|
||||||
|
path='/game'
|
||||||
|
Component={() => {
|
||||||
|
if (playerData) {
|
||||||
|
return (
|
||||||
|
<PlayerDataContext.Provider value={playerData}>
|
||||||
|
<Gameboard />
|
||||||
|
</PlayerDataContext.Provider>
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return <Navigate to='/login' />;
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
></Route>
|
||||||
|
</Routes>
|
||||||
</Router>
|
</Router>
|
||||||
</SocketContext.Provider>
|
</SocketContext.Provider>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -21,7 +21,7 @@ const Dice = ({ rolledNumberCallback, rolledNumber, nowMoving, color, movingPlay
|
|||||||
socket.on('game:roll', number => {
|
socket.on('game:roll', number => {
|
||||||
rolledNumberCallback(number);
|
rolledNumberCallback(number);
|
||||||
});
|
});
|
||||||
}, []);
|
}, [socket, rolledNumberCallback]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={`dice-container dice-${color}`}>
|
<div className={`dice-container dice-${color}`}>
|
||||||
|
|||||||
@ -19,19 +19,6 @@ const Gameboard = () => {
|
|||||||
|
|
||||||
const [movingPlayer, setMovingPlayer] = useState('red');
|
const [movingPlayer, setMovingPlayer] = useState('red');
|
||||||
|
|
||||||
const checkWin = () => {
|
|
||||||
// Player wins when all pawns with same color are inside end base
|
|
||||||
if (pawns.filter(pawn => pawn.color === 'red' && pawn.position === 73).length === 4) {
|
|
||||||
alert('Red Won');
|
|
||||||
} else if (pawns.filter(pawn => pawn.color === 'blue' && pawn.position === 79).length === 4) {
|
|
||||||
alert('Blue Won');
|
|
||||||
} else if (pawns.filter(pawn => pawn.color === 'green' && pawn.position === 85).length === 4) {
|
|
||||||
alert('Green Won');
|
|
||||||
} else if (pawns.filter(pawn => pawn.color === 'yellow' && pawn.position === 91).length === 4) {
|
|
||||||
alert('Yellow Won');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
socket.emit('room:data', context.roomId);
|
socket.emit('room:data', context.roomId);
|
||||||
socket.on('room:data', data => {
|
socket.on('room:data', data => {
|
||||||
@ -52,7 +39,6 @@ const Gameboard = () => {
|
|||||||
setMovingPlayer(nowMovingPlayer.color);
|
setMovingPlayer(nowMovingPlayer.color);
|
||||||
}
|
}
|
||||||
const currentPlayer = data.players.find(player => player._id === context.playerId);
|
const currentPlayer = data.players.find(player => player._id === context.playerId);
|
||||||
checkWin();
|
|
||||||
setIsReady(currentPlayer.ready);
|
setIsReady(currentPlayer.ready);
|
||||||
setRolledNumber(data.rolledNumber);
|
setRolledNumber(data.rolledNumber);
|
||||||
setPlayers(data.players);
|
setPlayers(data.players);
|
||||||
|
|||||||
@ -19,9 +19,8 @@ const Map = ({ pawns, nowMoving, rolledNumber }) => {
|
|||||||
touchableArea.arc(x, y, 12, 0, 2 * Math.PI);
|
touchableArea.arc(x, y, 12, 0, 2 * Math.PI);
|
||||||
const image = new Image();
|
const image = new Image();
|
||||||
image.src = pawnImages[color];
|
image.src = pawnImages[color];
|
||||||
image.onload = function () {
|
// image.onload = function () {
|
||||||
context.drawImage(image, x - 17, y - 14, 35, 30);
|
context.drawImage(image, x - 17, y - 14, 35, 30);
|
||||||
};
|
|
||||||
return touchableArea;
|
return touchableArea;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -73,29 +72,30 @@ const Map = ({ pawns, nowMoving, rolledNumber }) => {
|
|||||||
setHintPawn(null);
|
setHintPawn(null);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
const rerenderCanvas = () => {
|
|
||||||
const canvas = canvasRef.current;
|
|
||||||
const ctx = canvas.getContext('2d');
|
|
||||||
const image = new Image();
|
|
||||||
image.src = mapImage;
|
|
||||||
image.onload = function () {
|
|
||||||
ctx.drawImage(image, 0, 0);
|
|
||||||
pawns.forEach((pawn, index) => {
|
|
||||||
pawns[index].touchableArea = paintPawn(
|
|
||||||
ctx,
|
|
||||||
positions[pawn.position].x,
|
|
||||||
positions[pawn.position].y,
|
|
||||||
pawn.color
|
|
||||||
);
|
|
||||||
});
|
|
||||||
if (hintPawn) {
|
|
||||||
paintPawn(ctx, positions[hintPawn.position].x, positions[hintPawn.position].y, hintPawn.color);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
const rerenderCanvas = () => {
|
||||||
|
const canvas = canvasRef.current;
|
||||||
|
const ctx = canvas.getContext('2d');
|
||||||
|
const image = new Image();
|
||||||
|
image.src = mapImage;
|
||||||
|
image.onload = function () {
|
||||||
|
ctx.drawImage(image, 0, 0);
|
||||||
|
pawns.forEach((pawn, index) => {
|
||||||
|
pawns[index].touchableArea = paintPawn(
|
||||||
|
ctx,
|
||||||
|
positions[pawn.position].x,
|
||||||
|
positions[pawn.position].y,
|
||||||
|
pawn.color
|
||||||
|
);
|
||||||
|
});
|
||||||
|
if (hintPawn) {
|
||||||
|
paintPawn(ctx, positions[hintPawn.position].x, positions[hintPawn.position].y, hintPawn.color);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
rerenderCanvas();
|
rerenderCanvas();
|
||||||
}, [hintPawn, pawns, rerenderCanvas]);
|
}, [hintPawn, pawns]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<canvas
|
<canvas
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
export default (pawn, rolledNumber) => {
|
const canPawnMove = (pawn, rolledNumber) => {
|
||||||
// If is in base
|
// If is in base
|
||||||
if ((rolledNumber === 1 || rolledNumber === 6) && pawn.position === pawn.basePos) {
|
if ((rolledNumber === 1 || rolledNumber === 6) && pawn.position === pawn.basePos) {
|
||||||
return true;
|
return true;
|
||||||
@ -24,3 +24,4 @@ export default (pawn, rolledNumber) => {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
export default canPawnMove;
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
export default (pawn, rolledNumber) => {
|
const getPositionAfterMove = (pawn, rolledNumber) => {
|
||||||
const { position, color } = pawn;
|
const { position, color } = pawn;
|
||||||
switch (color) {
|
switch (color) {
|
||||||
case 'red':
|
case 'red':
|
||||||
@ -55,5 +55,9 @@ export default (pawn, rolledNumber) => {
|
|||||||
} else {
|
} else {
|
||||||
return position;
|
return position;
|
||||||
}
|
}
|
||||||
|
default:
|
||||||
|
return position;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default getPositionAfterMove;
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import React, { useState, useContext, useEffect } from 'react';
|
import React, { useState, useContext, useEffect } from 'react';
|
||||||
import './AddServer.css';
|
import './AddServer.css';
|
||||||
import Switch from '@material-ui/core/Switch';
|
import Switch from '@mui/material/Switch';
|
||||||
import { SocketContext } from '../../../App';
|
import { SocketContext } from '../../../App';
|
||||||
const AddServer = () => {
|
const AddServer = () => {
|
||||||
const socket = useContext(SocketContext);
|
const socket = useContext(SocketContext);
|
||||||
@ -12,7 +12,7 @@ const AddServer = () => {
|
|||||||
socket.on('room:created', () => {
|
socket.on('room:created', () => {
|
||||||
socket.emit('room:rooms');
|
socket.emit('room:rooms');
|
||||||
});
|
});
|
||||||
}, []);
|
}, [socket]);
|
||||||
|
|
||||||
const handleButtonClick = e => {
|
const handleButtonClick = e => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
import './LoginPage.css';
|
import './LoginPage.css';
|
||||||
import AddServer from './AddServer/AddServer';
|
import AddServer from './AddServer/AddServer';
|
||||||
import ServerList from './ServerList/ServerList';
|
import ServerList from './ServerList/ServerList';
|
||||||
import NameInput from './NameInput/NameInput';
|
|
||||||
const LoginPage = () => {
|
const LoginPage = () => {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|||||||
@ -1,15 +1,19 @@
|
|||||||
import React, { useState, useContext, useEffect } from 'react';
|
import React, { useState, useContext, useEffect, useCallback } from 'react';
|
||||||
import { SocketContext } from '../../../App';
|
import { SocketContext } from '../../../App';
|
||||||
import useInput from '../../../hooks/useInput';
|
import useInput from '../../../hooks/useInput';
|
||||||
import './NameInput.css';
|
import './NameInput.css';
|
||||||
|
import Overlay from '../../Overlay/Overlay';
|
||||||
|
|
||||||
const NameInput = ({ isRoomPrivate, roomId }) => {
|
const NameInput = ({ isRoomPrivate, roomId }) => {
|
||||||
const socket = useContext(SocketContext);
|
const socket = useContext(SocketContext);
|
||||||
const nickname = useInput('');
|
const nickname = useInput('');
|
||||||
const password = useInput('');
|
const password = useInput('');
|
||||||
const [isPasswordWrong, setIsPasswordWrong] = useState(false);
|
const [isPasswordWrong, setIsPasswordWrong] = useState(false);
|
||||||
const handleButtonClick = () => {
|
|
||||||
|
const handleButtonClick = useCallback(() => {
|
||||||
socket.emit('player:login', { name: nickname.value, password: password.value, roomId: roomId });
|
socket.emit('player:login', { name: nickname.value, password: password.value, roomId: roomId });
|
||||||
};
|
}, [socket, nickname.value, password.value, roomId]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
socket.on('error:wrongPassword', () => {
|
socket.on('error:wrongPassword', () => {
|
||||||
setIsPasswordWrong(true);
|
setIsPasswordWrong(true);
|
||||||
@ -24,7 +28,7 @@ const NameInput = ({ isRoomPrivate, roomId }) => {
|
|||||||
return () => {
|
return () => {
|
||||||
document.removeEventListener('keydown', keyDownHandler);
|
document.removeEventListener('keydown', keyDownHandler);
|
||||||
};
|
};
|
||||||
}, []);
|
}, [socket, handleButtonClick]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='name-overlay'>
|
<div className='name-overlay'>
|
||||||
|
|||||||
@ -18,7 +18,7 @@ const ServerList = () => {
|
|||||||
data = JSON.parse(data);
|
data = JSON.parse(data);
|
||||||
setRooms(data);
|
setRooms(data);
|
||||||
});
|
});
|
||||||
}, []);
|
}, [socket]);
|
||||||
|
|
||||||
const getRooms = () => {
|
const getRooms = () => {
|
||||||
setRooms(null);
|
setRooms(null);
|
||||||
@ -35,7 +35,7 @@ const ServerList = () => {
|
|||||||
<div className='title-container'>
|
<div className='title-container'>
|
||||||
<h1>Server List</h1>
|
<h1>Server List</h1>
|
||||||
<div className='refresh'>
|
<div className='refresh'>
|
||||||
<img src={refresh} onClick={getRooms}></img>
|
<img src={refresh} alt='refresh' onClick={getRooms}></img>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className='server-container content-container'>
|
<div className='server-container content-container'>
|
||||||
@ -53,7 +53,7 @@ const ServerList = () => {
|
|||||||
<tbody>
|
<tbody>
|
||||||
{rooms.map((room, index) => (
|
{rooms.map((room, index) => (
|
||||||
<tr key={index}>
|
<tr key={index}>
|
||||||
<td>{room.private ? <img src={lock} /> : null}</td>
|
<td>{room.private ? <img src={lock} alt='private' /> : null}</td>
|
||||||
<td className='room-name'>{room.name}</td>
|
<td className='room-name'>{room.name}</td>
|
||||||
<td>{`${room.players.length}/4`}</td>
|
<td>{`${room.players.length}/4`}</td>
|
||||||
<td>{room.isStarted ? 'started' : 'waiting'}</td>
|
<td>{room.isStarted ? 'started' : 'waiting'}</td>
|
||||||
|
|||||||
@ -53,7 +53,7 @@ function handle() {
|
|||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
const animation = document.styleSheets[0].insertRule(
|
document.styleSheets[0].insertRule(
|
||||||
`
|
`
|
||||||
@keyframes timerAnimation {
|
@keyframes timerAnimation {
|
||||||
${keyframes.join('\n')}
|
${keyframes.join('\n')}
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import React, { useState, useContext, useEffect } from 'react';
|
import React, { useState, useContext } from 'react';
|
||||||
import { SocketContext } from '../../../App';
|
import { SocketContext } from '../../../App';
|
||||||
import Switch from '@material-ui/core/Switch';
|
import Switch from '@mui/material/Switch';
|
||||||
import '../Navbar.css';
|
import '../Navbar.css';
|
||||||
import '../NameContainer/AnimatedOverlay/TimerAnimation';
|
import '../NameContainer/AnimatedOverlay/TimerAnimation';
|
||||||
|
|
||||||
|
|||||||
@ -4,10 +4,12 @@ import redPawn from '../images/pawns/red-pawn.png';
|
|||||||
import yellowPawn from '../images/pawns/yellow-pawn.png';
|
import yellowPawn from '../images/pawns/yellow-pawn.png';
|
||||||
import greyPawn from '../images/pawns/grey-pawn.png';
|
import greyPawn from '../images/pawns/grey-pawn.png';
|
||||||
|
|
||||||
export default {
|
const pawnImages = {
|
||||||
green: greenPawn,
|
green: greenPawn,
|
||||||
blue: bluePawn,
|
blue: bluePawn,
|
||||||
red: redPawn,
|
red: redPawn,
|
||||||
yellow: yellowPawn,
|
yellow: yellowPawn,
|
||||||
grey: greyPawn,
|
grey: greyPawn,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default pawnImages;
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 124 KiB After Width: | Height: | Size: 408 KiB |
11
src/index.js
11
src/index.js
@ -1,11 +1,8 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import ReactDOM from 'react-dom';
|
import ReactDOM from 'react-dom/client';
|
||||||
import './index.css';
|
import './index.css';
|
||||||
import App from './App';
|
import App from './App';
|
||||||
|
|
||||||
ReactDOM.render(
|
const container = document.getElementById('root');
|
||||||
<React.StrictMode>
|
const root = ReactDOM.createRoot(container);
|
||||||
<App />
|
root.render(<App />);
|
||||||
</React.StrictMode>,
|
|
||||||
document.getElementById('root')
|
|
||||||
);
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user