| 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; |
| |
| 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; |