diff --git a/backend/constants.js b/backend/constants.js index aefaa8c..b6ed1c9 100644 --- a/backend/constants.js +++ b/backend/constants.js @@ -7,6 +7,7 @@ const SOCKET_EVENTS = { CHESS_MOVE: "move", CHESS_OPPONENT_MOVE: "opponent-move", USER_JOINED_ROOM: "user-joined-room", + USER_RESIGNED: "user-resigned", }; module.exports = { diff --git a/backend/socket.js b/backend/socket.js index 30eb142..754adf0 100644 --- a/backend/socket.js +++ b/backend/socket.js @@ -1,7 +1,16 @@ const socket = require("socket.io"); const { SOCKET_EVENTS } = require("./constants"); -const { CHESS_MOVE, CHESS_OPPONENT_MOVE, CONNECTION, JOIN_ROOM, JOIN_ROOM_ERROR, JOIN_ROOM_SUCCESS, ROOM_FULL } = - SOCKET_EVENTS; +const { + CHESS_MOVE, + CHESS_OPPONENT_MOVE, + CONNECTION, + JOIN_ROOM, + JOIN_ROOM_ERROR, + JOIN_ROOM_SUCCESS, + ROOM_FULL, + USER_JOINED_ROOM, + USER_RESIGNED, +} = SOCKET_EVENTS; // roomID => { timeLimit,gameHistory , players:[{username: {color}}] } let activeRooms = new Map(); @@ -63,6 +72,7 @@ function socketIOServerInit(server) { io.to(roomID).emit("new user joined the room"); console.log(data, "joined"); let room = getRoom(roomID); + io.to(roomID).emit(USER_JOINED_ROOM, data.username); socket.emit(result, room.gameHistory); // room joined successfully } else { socket.emit(result); // room is full @@ -78,6 +88,10 @@ function socketIOServerInit(server) { room.gameHistory.push(moveData); socket.to(roomID).emit(CHESS_OPPONENT_MOVE, moveData); }); + + socket.on(USER_RESIGNED, (roomID, username) => { + socket.to(roomID).emit(USER_RESIGNED, username); + }); }); } diff --git a/frontend/src/constants.js b/frontend/src/constants.js index 5adac31..a1c8e1a 100644 --- a/frontend/src/constants.js +++ b/frontend/src/constants.js @@ -1,6 +1,6 @@ export const SOCKET_EVENTS = { - CONNECT:'connect', - DISCONNECT:'disconnect', + CONNECT: "connect", + DISCONNECT: "disconnect", CONNECTION: "connection", JOIN_ROOM: "join-room", JOIN_ROOM_SUCCESS: "join-room-success", @@ -9,6 +9,7 @@ export const SOCKET_EVENTS = { CHESS_MOVE: "move", CHESS_OPPONENT_MOVE: "opponent-move", USER_JOINED_ROOM: "user-joined-room", + USER_RESIGNED: "user-resigned", }; export const DISPATCH_EVENTS = { @@ -17,4 +18,5 @@ export const DISPATCH_EVENTS = { CAPTURE_PIECE: "CAPTURE_PIECE", JUMP_TO: "JUMP_TO", SET_GAME_HISTORY: "SET_GAME_HISTORY", + END_GAME: "END_GAME", }; diff --git a/frontend/src/context/chess-game-context.jsx b/frontend/src/context/chess-game-context.jsx index f94987f..23c64af 100644 --- a/frontend/src/context/chess-game-context.jsx +++ b/frontend/src/context/chess-game-context.jsx @@ -1,7 +1,7 @@ import React, { createContext, useReducer, useRef, useState } from 'react' import { ChessModified, chessInit } from '../../utils/chess'; import { DISPATCH_EVENTS } from '../constants'; -const { CAPTURE_PIECE, MOVE_PIECE, SELECT_PIECE, JUMP_TO, SET_GAME_HISTORY } = DISPATCH_EVENTS +const { CAPTURE_PIECE, MOVE_PIECE, SELECT_PIECE, JUMP_TO, SET_GAME_HISTORY, END_GAME } = DISPATCH_EVENTS export const ChessGameContext = createContext(); // myColor: null, chess: null, chessBoard: null, moveHints: null, selected: null, dispatch: null, handleOpponentMove: null, handleSquareClick: null, getSquareColor: null, isSquareMarked: null, selectPiece: null, handleDrop: null @@ -57,6 +57,10 @@ const reducer = (state, action) => { } return { ...state, chess: newChessObj, chessBoard: newChessObj.getBoard(state.chess.myColor), gameHistory: updatedGameHistory, currentIndex: updatedGameHistory.length - 1 } } + case END_GAME: + { + return { ...state, hasGameEnded: true, gameEndedReason: action.val } + } default: return state; } @@ -200,11 +204,15 @@ const ChessGameContextProvider = ({ children }) => { dispatch({ type: SET_GAME_HISTORY, val: fetchedGameHistory }) } + function endGame(reason) { + dispatch({ type: END_GAME, val: reason }) + } + return ( {children}