Files
chesskit/src/sections/analysis/panelHeader/analyzeButton.tsx
2025-04-20 03:49:15 +02:00

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