Squashed commit of the following:
commit 933ba823d5f991b9ab1f66bd94262c181e9d0267 Author: GuillaumeSD <gsd.lfny@gmail.com> Date: Mon Apr 21 20:13:37 2025 +0200 fix : new chessjs version commit b9376bcbc718f6eaa9a0fd9caada6b957f73b85a Author: GuillaumeSD <gsd.lfny@gmail.com> Date: Mon Apr 21 19:34:12 2025 +0200 chore : chessjs bump version
This commit is contained in:
@@ -1,28 +1,25 @@
|
|||||||
import { getCapturedPieces, getMaterialDifference } from "@/lib/chess";
|
import { getCapturedPieces, getMaterialDifference } from "@/lib/chess";
|
||||||
import { Color } from "@/types/enums";
|
import { Color } from "@/types/enums";
|
||||||
import { Grid2 as Grid, Typography } from "@mui/material";
|
import { Grid2 as Grid, Typography } from "@mui/material";
|
||||||
import { Chess } from "chess.js";
|
|
||||||
import { PrimitiveAtom, useAtomValue } from "jotai";
|
|
||||||
import { CSSProperties, useMemo } from "react";
|
import { CSSProperties, useMemo } from "react";
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
gameAtom: PrimitiveAtom<Chess>;
|
fen: string;
|
||||||
color: Color;
|
color: Color;
|
||||||
}
|
}
|
||||||
|
|
||||||
const PIECE_SCALE = 0.6;
|
const PIECE_SCALE = 0.6;
|
||||||
|
|
||||||
export default function CapturedPieces({ gameAtom, color }: Props) {
|
export default function CapturedPieces({ fen, color }: Props) {
|
||||||
const game = useAtomValue(gameAtom);
|
|
||||||
const cssProps = useMemo(() => {
|
const cssProps = useMemo(() => {
|
||||||
const capturedPieces = getCapturedPieces(game.fen(), color);
|
const capturedPieces = getCapturedPieces(fen, color);
|
||||||
return getCapturedPiecesCSSProps(capturedPieces, color);
|
return getCapturedPiecesCSSProps(capturedPieces, color);
|
||||||
}, [game, color]);
|
}, [fen, color]);
|
||||||
|
|
||||||
const materialDiff = useMemo(() => {
|
const materialDiff = useMemo(() => {
|
||||||
const materialDiff = getMaterialDifference(game.fen());
|
const materialDiff = getMaterialDifference(fen);
|
||||||
return color === Color.White ? materialDiff : -materialDiff;
|
return color === Color.White ? materialDiff : -materialDiff;
|
||||||
}, [game, color]);
|
}, [fen, color]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Grid container alignItems="end" columnGap={0.6} size="auto">
|
<Grid container alignItems="end" columnGap={0.6} size="auto">
|
||||||
|
|||||||
@@ -254,7 +254,7 @@ export default function Board({
|
|||||||
</Typography>
|
</Typography>
|
||||||
|
|
||||||
<CapturedPieces
|
<CapturedPieces
|
||||||
gameAtom={gameAtom}
|
fen={gameFen}
|
||||||
color={boardOrientation === Color.White ? Color.Black : Color.White}
|
color={boardOrientation === Color.White ? Color.Black : Color.White}
|
||||||
/>
|
/>
|
||||||
</Grid>
|
</Grid>
|
||||||
@@ -302,7 +302,7 @@ export default function Board({
|
|||||||
{boardOrientation === Color.White ? whitePlayer : blackPlayer}
|
{boardOrientation === Color.White ? whitePlayer : blackPlayer}
|
||||||
</Typography>
|
</Typography>
|
||||||
|
|
||||||
<CapturedPieces gameAtom={gameAtom} color={boardOrientation} />
|
<CapturedPieces fen={gameFen} color={boardOrientation} />
|
||||||
</Grid>
|
</Grid>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ export interface resetGameParams {
|
|||||||
fen?: string;
|
fen?: string;
|
||||||
whiteName?: string;
|
whiteName?: string;
|
||||||
blackName?: string;
|
blackName?: string;
|
||||||
|
noHeaders?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const useChessActions = (chessAtom: PrimitiveAtom<Chess>) => {
|
export const useChessActions = (chessAtom: PrimitiveAtom<Chess>) => {
|
||||||
@@ -29,7 +30,7 @@ export const useChessActions = (chessAtom: PrimitiveAtom<Chess>) => {
|
|||||||
const reset = useCallback(
|
const reset = useCallback(
|
||||||
(params?: resetGameParams) => {
|
(params?: resetGameParams) => {
|
||||||
const newGame = new Chess(params?.fen);
|
const newGame = new Chess(params?.fen);
|
||||||
setGameHeaders(newGame, params);
|
if (!params?.noHeaders) setGameHeaders(newGame, params);
|
||||||
setGame(newGame);
|
setGame(newGame);
|
||||||
},
|
},
|
||||||
[setGame]
|
[setGame]
|
||||||
@@ -40,7 +41,10 @@ export const useChessActions = (chessAtom: PrimitiveAtom<Chess>) => {
|
|||||||
|
|
||||||
if (game.history().length === 0) {
|
if (game.history().length === 0) {
|
||||||
const pgnSplitted = game.pgn().split("]");
|
const pgnSplitted = game.pgn().split("]");
|
||||||
if (pgnSplitted.at(-1)?.includes("1-0")) {
|
if (
|
||||||
|
pgnSplitted.at(-1)?.includes("1-0") ||
|
||||||
|
pgnSplitted.at(-1) === "\n *"
|
||||||
|
) {
|
||||||
newGame.loadPgn(pgnSplitted.slice(0, -1).join("]") + "]");
|
newGame.loadPgn(pgnSplitted.slice(0, -1).join("]") + "]");
|
||||||
return newGame;
|
return newGame;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,8 +7,13 @@ export const usePlayersNames = (gameAtom: PrimitiveAtom<Chess>) => {
|
|||||||
const { gameFromUrl } = useGameDatabase();
|
const { gameFromUrl } = useGameDatabase();
|
||||||
const headers = game.getHeaders();
|
const headers = game.getHeaders();
|
||||||
|
|
||||||
const whiteName = gameFromUrl?.white?.name || headers.White || "White";
|
const headersWhiteName =
|
||||||
const blackName = gameFromUrl?.black?.name || headers.Black || "Black";
|
headers.White && headers.White !== "?" ? headers.White : undefined;
|
||||||
|
const headersBlackName =
|
||||||
|
headers.Black && headers.Black !== "?" ? headers.Black : undefined;
|
||||||
|
|
||||||
|
const whiteName = gameFromUrl?.white?.name || headersWhiteName || "White";
|
||||||
|
const blackName = gameFromUrl?.black?.name || headersBlackName || "Black";
|
||||||
|
|
||||||
const whiteElo = gameFromUrl?.white?.rating || headers.WhiteElo || undefined;
|
const whiteElo = gameFromUrl?.white?.rating || headers.WhiteElo || undefined;
|
||||||
const blackElo = gameFromUrl?.black?.rating || headers.BlackElo || undefined;
|
const blackElo = gameFromUrl?.black?.rating || headers.BlackElo || undefined;
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ import {
|
|||||||
useMediaQuery,
|
useMediaQuery,
|
||||||
useTheme,
|
useTheme,
|
||||||
} from "@mui/material";
|
} from "@mui/material";
|
||||||
import { Chess } from "chess.js";
|
|
||||||
import { useAtom, useAtomValue, useSetAtom } from "jotai";
|
import { useAtom, useAtomValue, useSetAtom } from "jotai";
|
||||||
import { useRouter } from "next/router";
|
import { useRouter } from "next/router";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
@@ -35,7 +34,7 @@ export default function GameReview() {
|
|||||||
const isMobile = useMediaQuery(theme.breakpoints.down("sm"));
|
const isMobile = useMediaQuery(theme.breakpoints.down("sm"));
|
||||||
|
|
||||||
const { reset: resetBoard } = useChessActions(boardAtom);
|
const { reset: resetBoard } = useChessActions(boardAtom);
|
||||||
const { setPgn: setGamePgn } = useChessActions(gameAtom);
|
const { reset: resetGame } = useChessActions(gameAtom);
|
||||||
const [gameEval, setGameEval] = useAtom(gameEvalAtom);
|
const [gameEval, setGameEval] = useAtom(gameEvalAtom);
|
||||||
const game = useAtomValue(gameAtom);
|
const game = useAtomValue(gameAtom);
|
||||||
const setBoardOrientation = useSetAtom(boardOrientationAtom);
|
const setBoardOrientation = useSetAtom(boardOrientationAtom);
|
||||||
@@ -48,9 +47,9 @@ export default function GameReview() {
|
|||||||
resetBoard();
|
resetBoard();
|
||||||
setGameEval(undefined);
|
setGameEval(undefined);
|
||||||
setBoardOrientation(true);
|
setBoardOrientation(true);
|
||||||
setGamePgn(new Chess().pgn());
|
resetGame({ noHeaders: true });
|
||||||
}
|
}
|
||||||
}, [gameId, setGameEval, setBoardOrientation, resetBoard, setGamePgn]);
|
}, [gameId, setGameEval, setBoardOrientation, resetBoard, resetGame]);
|
||||||
|
|
||||||
const isGameLoaded = game.history().length > 0;
|
const isGameLoaded = game.history().length > 0;
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,9 @@ export default function GamePanel() {
|
|||||||
const game = useAtomValue(gameAtom);
|
const game = useAtomValue(gameAtom);
|
||||||
const gameHeaders = game.getHeaders();
|
const gameHeaders = game.getHeaders();
|
||||||
|
|
||||||
const hasGameInfo = gameFromUrl !== undefined || !!gameHeaders.White;
|
const hasGameInfo =
|
||||||
|
gameFromUrl !== undefined ||
|
||||||
|
(!!gameHeaders.White && gameHeaders.White !== "?");
|
||||||
|
|
||||||
if (!hasGameInfo) return null;
|
if (!hasGameInfo) return null;
|
||||||
|
|
||||||
|
|||||||
@@ -49,7 +49,10 @@ export default function LoadGame() {
|
|||||||
loadGame();
|
loadGame();
|
||||||
}, [gameFromUrl, game, resetAndSetGamePgn, setEval]);
|
}, [gameFromUrl, game, resetAndSetGamePgn, setEval]);
|
||||||
|
|
||||||
const isGameLoaded = gameFromUrl !== undefined || !!game.getHeaders().White;
|
const isGameLoaded =
|
||||||
|
gameFromUrl !== undefined ||
|
||||||
|
(!!game.getHeaders().White && game.getHeaders().White !== "?") ||
|
||||||
|
game.history().length > 0;
|
||||||
|
|
||||||
if (evaluationProgress) return null;
|
if (evaluationProgress) return null;
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ export default function PanelToolBar() {
|
|||||||
|
|
||||||
const boardHistory = board.history();
|
const boardHistory = board.history();
|
||||||
const game = useAtomValue(gameAtom);
|
const game = useAtomValue(gameAtom);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const onKeyDown = (e: KeyboardEvent) => {
|
const onKeyDown = (e: KeyboardEvent) => {
|
||||||
if (boardHistory.length === 0) return;
|
if (boardHistory.length === 0) return;
|
||||||
|
|||||||
Reference in New Issue
Block a user