90 lines
2.4 KiB
TypeScript
90 lines
2.4 KiB
TypeScript
import { Icon } from "@iconify/react";
|
|
import {
|
|
engineDepthAtom,
|
|
engineMultiPvAtom,
|
|
engineNameAtom,
|
|
evaluationProgressAtom,
|
|
gameAtom,
|
|
gameEvalAtom,
|
|
savedEvalsAtom,
|
|
} from "../states";
|
|
import { useAtom, useAtomValue, useSetAtom } from "jotai";
|
|
import { getEvaluateGameParams } from "@/lib/chess";
|
|
import { useGameDatabase } from "@/hooks/useGameDatabase";
|
|
import { LoadingButton } from "@mui/lab";
|
|
import { useEngine } from "@/hooks/useEngine";
|
|
import { logAnalyticsEvent } from "@/lib/firebase";
|
|
import { SavedEvals } from "@/types/eval";
|
|
|
|
export default function AnalyzeButton() {
|
|
const engineName = useAtomValue(engineNameAtom);
|
|
const engine = useEngine(engineName);
|
|
const [evaluationProgress, setEvaluationProgress] = useAtom(
|
|
evaluationProgressAtom
|
|
);
|
|
const engineDepth = useAtomValue(engineDepthAtom);
|
|
const engineMultiPv = useAtomValue(engineMultiPvAtom);
|
|
const { setGameEval, gameFromUrl } = useGameDatabase();
|
|
const [gameEval, setEval] = useAtom(gameEvalAtom);
|
|
const game = useAtomValue(gameAtom);
|
|
const setSavedEvals = useSetAtom(savedEvalsAtom);
|
|
|
|
const readyToAnalyse =
|
|
engine?.getIsReady() && game.history().length > 0 && !evaluationProgress;
|
|
|
|
const handleAnalyze = async () => {
|
|
const params = getEvaluateGameParams(game);
|
|
if (
|
|
!engine?.getIsReady() ||
|
|
params.fens.length === 0 ||
|
|
evaluationProgress
|
|
) {
|
|
return;
|
|
}
|
|
|
|
const newGameEval = await engine.evaluateGame({
|
|
...params,
|
|
depth: engineDepth,
|
|
multiPv: engineMultiPv,
|
|
setEvaluationProgress,
|
|
});
|
|
|
|
setEval(newGameEval);
|
|
setEvaluationProgress(0);
|
|
|
|
if (gameFromUrl) {
|
|
setGameEval(gameFromUrl.id, newGameEval);
|
|
}
|
|
|
|
const gameSavedEvals: SavedEvals = params.fens.reduce((acc, fen, idx) => {
|
|
acc[fen] = { ...newGameEval.positions[idx], engine: engineName };
|
|
return acc;
|
|
}, {} as SavedEvals);
|
|
setSavedEvals((prev) => ({
|
|
...prev,
|
|
...gameSavedEvals,
|
|
}));
|
|
|
|
logAnalyticsEvent("analyze_game", {
|
|
engine: engineName,
|
|
depth: engineDepth,
|
|
multiPv: engineMultiPv,
|
|
nbPositions: params.fens.length,
|
|
});
|
|
};
|
|
|
|
if (evaluationProgress) return null;
|
|
|
|
return (
|
|
<LoadingButton
|
|
variant="contained"
|
|
size="small"
|
|
startIcon={<Icon icon="streamline:magnifying-glass-solid" />}
|
|
onClick={handleAnalyze}
|
|
disabled={!readyToAnalyse}
|
|
>
|
|
{gameEval ? "Analyze again" : "Analyze"}
|
|
</LoadingButton>
|
|
);
|
|
}
|