commit d9209a78cff1c05be3e6a87e27cd1a5a4d5f91c5 Author: GuillaumeSD <47183782+GuillaumeSD@users.noreply.github.com> Date: Wed Jul 24 11:55:35 2024 +0200 style : UI analysis panel adjustment commit 3c2e19bdb9d97f3bb7e8ceaefd630aad64d755c4 Author: GuillaumeSD <47183782+GuillaumeSD@users.noreply.github.com> Date: Wed Jul 24 11:10:07 2024 +0200 feat : graph dot color match move classification commit 4a99ccb2fe19d3806ff320370ebc55af984d719a Author: GuillaumeSD <47183782+GuillaumeSD@users.noreply.github.com> Date: Wed Jul 24 11:09:35 2024 +0200 fix : load pgn with no moves commit 9eeb0e7f2869e544700b7da963b74f707fa6ea2f Author: GuillaumeSD <47183782+GuillaumeSD@users.noreply.github.com> Date: Wed Jul 24 00:09:03 2024 +0200 feat : add current move reference line in graph commit febb9962a0b366aeac1dc266e0470b75bd619e68 Author: GuillaumeSD <47183782+GuillaumeSD@users.noreply.github.com> Date: Tue Jul 23 23:08:17 2024 +0200 fix : handle tab change on new game commit a105239a728dc05211a0ae99d8fd56f179108a0e Author: GuillaumeSD <47183782+GuillaumeSD@users.noreply.github.com> Date: Tue Jul 23 03:46:49 2024 +0200 style : small chart UI tweaks commit 4878ebf87b4ddbac75db70619fe452a3a317ca09 Author: GuillaumeSD <47183782+GuillaumeSD@users.noreply.github.com> Date: Tue Jul 23 03:38:40 2024 +0200 feat : add eval graph commit 29c5a001da03ee288d2a2c133426b1d2ca435930 Author: GuillaumeSD <47183782+GuillaumeSD@users.noreply.github.com> Date: Tue Jul 23 00:30:25 2024 +0200 refacto : analysis directory commit a8b966cc07152bb117b8c68f54af3498ca2a5d2f Author: GuillaumeSD <47183782+GuillaumeSD@users.noreply.github.com> Date: Tue Jul 23 00:07:07 2024 +0200 style : add settings floating button commit 7edc54f09ce7d4b4c4beb310a9c7f985363ff5ee Author: GuillaumeSD <47183782+GuillaumeSD@users.noreply.github.com> Date: Sun Jul 21 22:29:48 2024 +0200 feat : tab analysis panel
104 lines
2.7 KiB
TypeScript
104 lines
2.7 KiB
TypeScript
import { MoveClassification } from "@/types/enums";
|
|
import { Grid, Typography } from "@mui/material";
|
|
import Image from "next/image";
|
|
import { useAtomValue } from "jotai";
|
|
import { boardAtom, currentPositionAtom, gameAtom } from "../../../states";
|
|
import { useChessActions } from "@/hooks/useChessActions";
|
|
import { useEffect } from "react";
|
|
import { isInViewport } from "@/lib/helpers";
|
|
import { moveClassificationColors } from "@/lib/chess";
|
|
|
|
interface Props {
|
|
san: string;
|
|
moveClassification?: MoveClassification;
|
|
moveIdx: number;
|
|
}
|
|
|
|
export default function MoveItem({ san, moveClassification, moveIdx }: Props) {
|
|
const game = useAtomValue(gameAtom);
|
|
const { goToMove } = useChessActions(boardAtom);
|
|
const position = useAtomValue(currentPositionAtom);
|
|
const color = getMoveColor(moveClassification);
|
|
|
|
const isCurrentMove = position?.currentMoveIdx === moveIdx;
|
|
|
|
useEffect(() => {
|
|
if (!isCurrentMove) return;
|
|
const moveItem = document.getElementById(`move-${moveIdx}`);
|
|
if (!moveItem) return;
|
|
|
|
const movePanel = document.getElementById("moves-panel");
|
|
if (!movePanel || !isInViewport(movePanel)) return;
|
|
|
|
moveItem.scrollIntoView({ behavior: "smooth", block: "center" });
|
|
}, [isCurrentMove, moveIdx]);
|
|
|
|
const handleClick = () => {
|
|
if (isCurrentMove) return;
|
|
goToMove(moveIdx, game);
|
|
};
|
|
|
|
return (
|
|
<Grid
|
|
item
|
|
container
|
|
justifyContent="center"
|
|
alignItems="center"
|
|
gap={1}
|
|
width="5rem"
|
|
wrap="nowrap"
|
|
onClick={handleClick}
|
|
paddingY={0.6}
|
|
sx={(theme) => ({
|
|
cursor: isCurrentMove ? undefined : "pointer",
|
|
backgroundColor:
|
|
isCurrentMove && theme.palette.mode === "dark"
|
|
? "#4f4f4f"
|
|
: undefined,
|
|
border:
|
|
isCurrentMove && theme.palette.mode === "light"
|
|
? "1px solid #424242"
|
|
: undefined,
|
|
borderRadius: 1,
|
|
})}
|
|
id={`move-${moveIdx}`}
|
|
>
|
|
{color && (
|
|
<Image
|
|
src={`/icons/${moveClassification}.png`}
|
|
alt="move-icon"
|
|
width={14}
|
|
height={14}
|
|
style={{
|
|
maxWidth: "3.5vw",
|
|
maxHeight: "3.5vw",
|
|
}}
|
|
/>
|
|
)}
|
|
<Typography
|
|
color={getMoveColor(moveClassification)}
|
|
fontSize="0.9rem"
|
|
lineHeight="0.9rem"
|
|
>
|
|
{san}
|
|
</Typography>
|
|
</Grid>
|
|
);
|
|
}
|
|
|
|
const getMoveColor = (moveClassification?: MoveClassification) => {
|
|
if (
|
|
!moveClassification ||
|
|
moveClassificationsToIgnore.includes(moveClassification)
|
|
) {
|
|
return undefined;
|
|
}
|
|
|
|
return moveClassificationColors[moveClassification];
|
|
};
|
|
|
|
const moveClassificationsToIgnore: MoveClassification[] = [
|
|
MoveClassification.Good,
|
|
MoveClassification.Excellent,
|
|
];
|