63 lines
1.8 KiB
TypeScript
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;
|
|
};
|