Squashed commit of the following:
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
This commit is contained in:
@@ -0,0 +1,103 @@
|
||||
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,
|
||||
];
|
||||
Reference in New Issue
Block a user