Files
chesskit/src/sections/analysis/hooks/useCurrentPosition.ts
2024-03-29 03:53:16 +01:00

63 lines
1.8 KiB
TypeScript

import {
boardAtom,
currentPositionAtom,
engineDepthAtom,
engineMultiPvAtom,
gameAtom,
gameEvalAtom,
} from "@/sections/analysis/states";
import { CurrentPosition, PositionEval } from "@/types/eval";
import { useAtom, useAtomValue } from "jotai";
import { useEffect } from "react";
import { useEngine } from "../../../hooks/useEngine";
import { EngineName } from "@/types/enums";
export const useCurrentPosition = (engineName?: EngineName) => {
const [currentPosition, setCurrentPosition] = useAtom(currentPositionAtom);
const engine = useEngine(engineName);
const gameEval = useAtomValue(gameEvalAtom);
const game = useAtomValue(gameAtom);
const board = useAtomValue(boardAtom);
const depth = useAtomValue(engineDepthAtom);
const multiPv = useAtomValue(engineMultiPvAtom);
useEffect(() => {
const position: CurrentPosition = {
lastMove: board.history({ verbose: true }).at(-1),
};
if (gameEval) {
const boardHistory = board.history();
const gameHistory = game.history();
if (
boardHistory.length <= gameHistory.length &&
gameHistory.slice(0, boardHistory.length).join() === boardHistory.join()
) {
const evalIndex = boardHistory.length;
position.eval = gameEval.positions[evalIndex];
position.lastEval =
evalIndex > 0 ? gameEval.positions[evalIndex - 1] : undefined;
}
}
if (!position.eval && engine?.isReady()) {
const setPartialEval = (positionEval: PositionEval) => {
setCurrentPosition({ ...position, eval: positionEval });
};
engine.evaluatePositionWithUpdate({
fen: board.fen(),
depth,
multiPv,
setPartialEval,
});
}
setCurrentPosition(position);
}, [gameEval, board, game, engine, depth, multiPv, setCurrentPosition]);
return currentPosition;
};