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