diff --git a/packages/play-node-go/src/components/GameUI/PlayerArea/PlayerArea.js b/packages/play-node-go/src/components/GameUI/PlayerArea/PlayerArea.js
index c8778f4..e0b9d75 100644
--- a/packages/play-node-go/src/components/GameUI/PlayerArea/PlayerArea.js
+++ b/packages/play-node-go/src/components/GameUI/PlayerArea/PlayerArea.js
@@ -1,7 +1,7 @@
import React from "react";
import "./PlayerArea.scss";
-const PlayerArea = ({ playerMeta, turn }) => {
+const PlayerArea = ({ handleResignClick, playerMeta, turn }) => {
const { stones, player, rank, captures } = playerMeta;
const isTurn =
(stones === "black" && turn === 1) || (stones === "white" && turn === -1);
@@ -28,6 +28,7 @@ const PlayerArea = ({ playerMeta, turn }) => {
>
handleResignClick(stones) } : null)}
>
Resign?
diff --git a/packages/play-node-go/src/io.js b/packages/play-node-go/src/io.js
index 0e4b9a7..460c2dc 100644
--- a/packages/play-node-go/src/io.js
+++ b/packages/play-node-go/src/io.js
@@ -42,6 +42,10 @@ const launch = (nsp, dispatch) => {
dispatch({ type: "GAMES", message: "UPDATE_BOARD", body: data });
});
+ socket.on("game_resign", (data) => {
+ dispatch({ type: "GAMES", message: "GAME_RESIGN", body: data });
+ });
+
return socket;
};
diff --git a/packages/play-node-go/src/pages/Game/Game.js b/packages/play-node-go/src/pages/Game/Game.js
index e366152..cb34e49 100644
--- a/packages/play-node-go/src/pages/Game/Game.js
+++ b/packages/play-node-go/src/pages/Game/Game.js
@@ -61,17 +61,39 @@ const Game = (props) => {
});
}, [playerState, game]);
+ const handleResignClick = (player) => {
+ const action = {
+ type: "SOCKET",
+ message: "RESIGN",
+ body: { game, player },
+ };
+ dispatch(action);
+ };
+
return (
{state.socket ? "✓" : " ⃠"}
+ {state?.meta?.winner ? (
+
+ {`winner: ${
+ state.meta.winner === 1
+ ? playerBlackMeta?.player
+ : playerWhiteMeta?.player
+ }
+ `}
+
+ ) : (
+ <>>
+ )}
Timer
? Game Tree
{
board={state.board}
/>
{
- switch(action.message) {
+ switch (action.message) {
+ case "SET_GAMES": {
+ const games = formatGames(action);
+ return { ...state, games };
+ }
- case 'SET_GAMES':
- const games = formatGames(action);;
- return {...state, games};
-
- case 'JOIN_REQUEST':
+ case "JOIN_REQUEST": {
if (!Object.entries(state.user).length) {
const errAction = {
- type: 'ERR',
- message: 'JOIN_GAME_ERROR',
- body: {joinGameError: 'user not logged in'}
- }
- return stateReducer(state, errAction)
+ type: "ERR",
+ message: "JOIN_GAME_ERROR",
+ body: { joinGameError: "user not logged in" },
+ };
+ return stateReducer(state, errAction);
}
const id = action.body;
- return {...state, joinGame: id};
+ return { ...state, joinGame: id };
+ }
- case 'UPDATE_BOARD':
+ case "UPDATE_BOARD": {
const { gameRecord, pass, turn, winner, playerState } = action.body.meta;
- return {...state, board: action.body.board, meta: {gameRecord, pass, turn, winner, playerState } };
+ return {
+ ...state,
+ board: action.body.board,
+ meta: { gameRecord, pass, turn, winner, playerState },
+ };
+ }
- case 'SET_ACTIVE':
- return {...state, active: action.body};
-
- default:
+ case "GAME_RESIGN": {
+ const { gameRecord, pass, turn, winner, playerState } = action.body.meta;
+ return {
+ ...state,
+ meta: { gameRecord, pass, turn, winner, playerState },
+ };
+ }
+
+ case "SET_ACTIVE": {
+ return { ...state, active: action.body };
+ }
+
+ default: {
return state;
+ }
}
-}
+};
function parseRank(rank) {
- switch(rank[0]) {
- case 'D':
- return `${rank.slice(1)}${rank[0].toLowerCase()}`
- case 'K':
- return `${rank.slice(1)}${rank[0].toLowerCase()}`
- case 'U':
- return '?'
- default:
- return '?'
+ switch (rank[0]) {
+ case "D":
+ return `${rank.slice(1)}${rank[0].toLowerCase()}`;
+ case "K":
+ return `${rank.slice(1)}${rank[0].toLowerCase()}`;
+ case "U":
+ return "?";
+ default:
+ return "?";
}
}
function formatGames(action) {
- const games = [...action.body].map(game => {
-
+ const games = [...action.body].map((game) => {
if (game.playerBlackRank) {
- game.playerBlackRank = parseRank(game.playerBlackRank)
+ game.playerBlackRank = parseRank(game.playerBlackRank);
}
if (game.playerWhiteRank) {
- game.playerWhiteRank = parseRank(game.playerWhiteRank)
+ game.playerWhiteRank = parseRank(game.playerWhiteRank);
}
return game;
- })
+ });
return games;
-}
\ No newline at end of file
+}
diff --git a/packages/play-node-go/src/reducers/socket/reducer.socket.js b/packages/play-node-go/src/reducers/socket/reducer.socket.js
index 832abad..882da99 100644
--- a/packages/play-node-go/src/reducers/socket/reducer.socket.js
+++ b/packages/play-node-go/src/reducers/socket/reducer.socket.js
@@ -34,6 +34,10 @@ export const socketReducer = (state, action) => {
return makeMove(state, action);
}
+ case "RESIGN": {
+ return resign(state, action);
+ }
+
default:
return state;
}
@@ -58,8 +62,13 @@ function connectGame(state, action) {
}
function makeMove(state, action) {
- // const { user, game, room, board, move } = action.body;
const socket = state.socket;
socket.emit("make_move", { ...action.body });
return state;
}
+
+function resign(state, action) {
+ const socket = state.socket;
+ socket.emit("resign", { ...action.body });
+ return state;
+}
diff --git a/packages/server/services/gameServices.js b/packages/server/services/gameServices.js
index f1df37b..22028e0 100644
--- a/packages/server/services/gameServices.js
+++ b/packages/server/services/gameServices.js
@@ -70,6 +70,10 @@ const GameService = (moveQueries) => {
getAllGames: () => {
return gamesInProgress;
},
+
+ resign: ({ id, player }) => {
+ return gamesInProgress[id].submitResign(player).getMeta();
+ },
};
};
diff --git a/packages/server/socket.js b/packages/server/socket.js
index 14bad8d..03aa3d2 100644
--- a/packages/server/socket.js
+++ b/packages/server/socket.js
@@ -21,8 +21,6 @@ io.on("connection", async (socket) => {
const game = `game-${data.game.id}`;
socket.join(game, async () => {
const gameRecord = await moveQueries.findGameRecord(data.game.id);
- console.log("gameRecord from db");
- console.log(gameRecord);
await gameServices.initGame({ id: data.game.id, gameRecord });
const { board, ...meta } = await gameServices.getDataForUI(
data.game.id
@@ -52,6 +50,21 @@ io.on("connection", async (socket) => {
});
}
});
+ socket.on("resign", async ({ game, player }) => {
+ const { id, room } = game;
+ const gameNsp = `game-${id}`;
+ try {
+ const meta = await gameServices.resign({
+ id,
+ player,
+ });
+ socket.join(gameNsp, () => {
+ io.of(room).to(gameNsp).emit("game_resign", meta);
+ });
+ } catch (e) {
+ console.log(e);
+ }
+ });
});
});
});