import { MoveClassification } from "@/types/enums"; import { Grid, Typography } from "@mui/material"; import { moveClassificationColors } from "@/components/board/squareRenderer"; 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"; 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 || !isInViewport(moveItem)) return; moveItem.scrollIntoView({ behavior: "smooth", block: "center" }); }, [isCurrentMove, moveIdx]); const handleClick = () => { if (isCurrentMove) return; goToMove(moveIdx, game); }; return ( {color && ( move-icon )} {san} ); } const getMoveColor = (moveClassification?: MoveClassification) => { if ( !moveClassification || moveClassificationsToIgnore.includes(moveClassification) ) { return undefined; } return moveClassificationColors[moveClassification]; }; const moveClassificationsToIgnore: MoveClassification[] = [ MoveClassification.Good, MoveClassification.Excellent, ];