chessGame / frontend /src /hooks /useChess.jsx
ilhamdev's picture
Upload folder using huggingface_hub
ece5841 verified
raw
history blame
3.57 kB
import { useReducer } from "react";
import { ChessModified, chessInit } from "../utils/chess"
import { DISPATCH_EVENTS } from "../constants";
const { SELECT_PIECE, MOVE_PIECE, CAPTURE_PIECE, SET_GAME_HISTORY } = DISPATCH_EVENTS
let BLACK = 'b', WHITE = 'w';
function chessStateInit() {
let chess = chessInit();
let moveHints = [];
let gameHistory = [];
let capturedPieces = { 'w': [], 'b': [] };
let selected = null;
// represents which move is viewed in history
let currentHistoryIndex = -1;
let hasEnded = false;
return { chess, moveHints, selected, gameHistory, currentHistoryIndex, hasEnded, capturedPieces }
}
const reducer = (state, action) => {
console.log(action);
switch (action.type) {
case SELECT_PIECE: {
let moveHints = state.chess.getMoves(action.val);
let selected = action.val
return { ...state, moveHints, selected };
}
case MOVE_PIECE: {
let newChess = new ChessModified(state.chess.fen());
console.log(newChess.ascii());
let updatedGameHistory = [...state.gameHistory];
let { san, after } = newChess.move(action.val);
updatedGameHistory.push({ move: san, fen: after });
return { ...state, chess: newChess, moveHints: [], gameHistory: updatedGameHistory, currentHistoryIndex: updatedGameHistory.length - 1, selected: null };
}
case CAPTURE_PIECE: {
let newChess = new ChessModified(state.chess.fen());
let updatedGameHistory = [...state.gameHistory];
let { san, after } = newChess.move(action.val);
updatedGameHistory.push({ move: san, fen: after });
return { ...state, chess: newChess, moveHints: [], gameHistory: updatedGameHistory, currentHistoryIndex: updatedGameHistory.length - 1, selected: null };
}
case SET_GAME_HISTORY: {
let fetchedGameHistory = action.val;
let newChess = new ChessModified();
let updatedGameHistory = [];
let capturedPieces = { 'w': [], 'b': [] }
for (let i = 0; i < fetchedGameHistory.length; i++) {
let { san, after, captured, color } = newChess.move(fetchedGameHistory[i]);
updatedGameHistory.push({ fen: after, move: san });
if (captured) {
color === WHITE ? capturedPieces[BLACK].push(captured) : capturedPieces[WHITE].push(captured);
}
}
return { ...state, chess: newChess, gameHistory: updatedGameHistory, currentHistoryIndex: updatedGameHistory.length - 1, capturedPieces }
}
}
}
const useChess = () => {
const [{ chess, moveHints, selected, gameHistory, currentHistoryIndex, capturedPieces, hasEnded }, dispatch] = useReducer(reducer, null, chessStateInit);
function selectPiece(square) {
dispatch({ type: SELECT_PIECE, val: square })
}
function movePiece(from, to) {
dispatch({ type: MOVE_PIECE, val: { from, to } })
}
function capturePiece(from, to) {
dispatch({ type: CAPTURE_PIECE, val: { from, to } })
}
function setGameHistory(gameHistory) {
dispatch({ type: SET_GAME_HISTORY, val: gameHistory })
}
return {
chessState: {
chess, selected, moveHints, gameHistory, currentHistoryIndex, capturedPieces, hasEnded
},
chessStateModifiers: {
selectPiece, movePiece, capturePiece, setGameHistory
}
}
}
export default useChess;