From 15b3ca8996a00826e4b6e253da38afcbed70af3e Mon Sep 17 00:00:00 2001 From: GuillaumeSD <47183782+GuillaumeSD@users.noreply.github.com> Date: Mon, 12 May 2025 01:42:36 +0200 Subject: [PATCH] fix : show current opening --- src/lib/engine/helpers/moveClassification.ts | 2 +- .../analysis/hooks/useCurrentPosition.ts | 19 ++++++++++++++++--- .../panelBody/analysisTab/opening.tsx | 18 ++++-------------- src/types/eval.ts | 1 + 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/src/lib/engine/helpers/moveClassification.ts b/src/lib/engine/helpers/moveClassification.ts index 4dbc078..532bfbf 100644 --- a/src/lib/engine/helpers/moveClassification.ts +++ b/src/lib/engine/helpers/moveClassification.ts @@ -13,7 +13,7 @@ export const getMovesClassification = ( fens: string[] ): PositionEval[] => { const positionsWinPercentage = rawPositions.map(getPositionWinPercentage); - let currentOpening: string = "Unknown opening"; + let currentOpening: string | undefined = undefined; const positions = rawPositions.map((rawPosition, index) => { if (index === 0) return rawPosition; diff --git a/src/sections/analysis/hooks/useCurrentPosition.ts b/src/sections/analysis/hooks/useCurrentPosition.ts index 139b897..5fd3470 100644 --- a/src/sections/analysis/hooks/useCurrentPosition.ts +++ b/src/sections/analysis/hooks/useCurrentPosition.ts @@ -14,6 +14,7 @@ import { useEngine } from "../../../hooks/useEngine"; import { EngineName } from "@/types/enums"; import { getEvaluateGameParams } from "@/lib/chess"; import { getMovesClassification } from "@/lib/engine/helpers/moveClassification"; +import { openings } from "@/data/openings"; export const useCurrentPosition = (engineName?: EngineName) => { const [currentPosition, setCurrentPosition] = useAtom(currentPositionAtom); @@ -26,16 +27,17 @@ export const useCurrentPosition = (engineName?: EngineName) => { const [savedEvals, setSavedEvals] = useAtom(savedEvalsAtom); useEffect(() => { + const boardHistory = board.history({ verbose: true }); const position: CurrentPosition = { - lastMove: board.history({ verbose: true }).at(-1), + lastMove: boardHistory.at(-1), }; - const boardHistory = board.history(); const gameHistory = game.history(); if ( boardHistory.length <= gameHistory.length && - gameHistory.slice(0, boardHistory.length).join() === boardHistory.join() + gameHistory.slice(0, boardHistory.length).join() === + boardHistory.map((m) => m.san).join() ) { position.currentMoveIdx = boardHistory.length; @@ -59,6 +61,17 @@ export const useCurrentPosition = (engineName?: EngineName) => { } } + if (!position.eval?.opening) { + for (const move of boardHistory.toReversed()) { + const moveFen = move.after.split(" ")[0]; + const opening = openings.find((opening) => opening.fen === moveFen); + if (opening) { + position.opening = opening.name; + break; + } + } + } + setCurrentPosition(position); if ( diff --git a/src/sections/analysis/panelBody/analysisTab/opening.tsx b/src/sections/analysis/panelBody/analysisTab/opening.tsx index bf840fc..9dc6b3a 100644 --- a/src/sections/analysis/panelBody/analysisTab/opening.tsx +++ b/src/sections/analysis/panelBody/analysisTab/opening.tsx @@ -1,24 +1,14 @@ -import { useState } from "react"; -import { useCurrentPosition } from "../../hooks/useCurrentPosition"; +import { useAtomValue } from "jotai"; import { Grid2 as Grid, Skeleton, Typography } from "@mui/material"; +import { currentPositionAtom } from "../../states"; export default function Opening() { - const position = useCurrentPosition(); - const [lastOpening, setLastOpening] = useState(""); + const position = useAtomValue(currentPositionAtom); const lastMove = position?.lastMove; - if (!lastMove && lastOpening) { - setLastOpening(""); - } if (!lastMove) return null; - const opening = - position?.eval?.opening && !position?.eval?.opening.includes("Unknown") - ? position.eval.opening - : lastOpening; - if (opening && opening !== lastOpening) { - setLastOpening(opening); - } + const opening = position?.eval?.opening || position.opening; if (!opening) { return ( diff --git a/src/types/eval.ts b/src/types/eval.ts index ed36bd6..396f9c9 100644 --- a/src/types/eval.ts +++ b/src/types/eval.ts @@ -52,6 +52,7 @@ export interface CurrentPosition { eval?: PositionEval; lastEval?: PositionEval; currentMoveIdx?: number; + opening?: string; } export interface EvaluateGameParams {