fix : lint errors & bump chess.js version

This commit is contained in:
GuillaumeSD
2025-04-21 15:44:47 +02:00
parent d8fe0ed79f
commit cff6b61bc7
11 changed files with 256 additions and 53 deletions

View File

@@ -9,11 +9,11 @@ export function useAtomLocalStorage<T>(
const [storedValue, setStoredValue] = useAtom(atom);
useEffect(() => {
const item = window.localStorage.getItem(key);
if (item) {
setStoredValue(parseJSON<T>(item));
}
setKeyTemp(key);
const item = window.localStorage.getItem(key);
if (!item) return;
const value = parseJSON<T>(item);
if (value) setStoredValue(value);
}, [key, setStoredValue]);
useEffect(() => {
@@ -24,6 +24,6 @@ export function useAtomLocalStorage<T>(
return [storedValue, setStoredValue];
}
function parseJSON<T>(value: string): T {
function parseJSON<T>(value: string): T | undefined {
return value === "undefined" ? undefined : JSON.parse(value);
}

View File

@@ -2,7 +2,7 @@ import { Dispatch, SetStateAction, useEffect, useState } from "react";
type SetValue<T> = Dispatch<SetStateAction<T>>;
export function useLocalStorage<T = string | number | boolean | undefined>(
export function useLocalStorage<T = string | number | boolean>(
key: string,
initialValue: T
): [T | null, SetValue<T>] {
@@ -11,10 +11,13 @@ export function useLocalStorage<T = string | number | boolean | undefined>(
useEffect(() => {
const item = window.localStorage.getItem(key);
if (item) {
setStoredValue(parseJSON<T>(item));
} else {
setStoredValue(initialValue);
const value = parseJSON<T>(item);
if (value) {
setStoredValue(value);
return;
}
}
setStoredValue(initialValue);
}, [key, initialValue]);
const setValue: SetValue<T> = (value) => {
@@ -28,6 +31,6 @@ export function useLocalStorage<T = string | number | boolean | undefined>(
return [storedValue, setValue];
}
function parseJSON<T>(value: string): T {
function parseJSON<T>(value: string): T | undefined {
return value === "undefined" ? undefined : JSON.parse(value);
}

View File

@@ -5,17 +5,13 @@ import { useGameDatabase } from "./useGameDatabase";
export const usePlayersNames = (gameAtom: PrimitiveAtom<Chess>) => {
const game = useAtomValue(gameAtom);
const { gameFromUrl } = useGameDatabase();
const headers = game.getHeaders();
const whiteName =
gameFromUrl?.white?.name || game.header()["White"] || "White";
const blackName =
gameFromUrl?.black?.name || game.header()["Black"] || "Black";
const whiteName = gameFromUrl?.white?.name || headers.White || "White";
const blackName = gameFromUrl?.black?.name || headers.Black || "Black";
const whiteElo =
gameFromUrl?.white?.rating || game.header()["WhiteElo"] || undefined;
const blackElo =
gameFromUrl?.black?.rating || game.header()["BlackElo"] || undefined;
const whiteElo = gameFromUrl?.white?.rating || headers.WhiteElo || undefined;
const blackElo = gameFromUrl?.black?.rating || headers.BlackElo || undefined;
return {
whiteName,

View File

@@ -25,7 +25,7 @@ export const getGameFromPgn = (pgn: string): Chess => {
};
export const formatGameToDatabase = (game: Chess): Omit<Game, "id"> => {
const headers: Record<string, string | undefined> = game.header();
const headers: Record<string, string | undefined> = game.getHeaders();
return {
pgn: game.pgn(),
@@ -56,24 +56,24 @@ export const setGameHeaders = (
game: Chess,
params: { whiteName?: string; blackName?: string; resigned?: Color } = {}
): Chess => {
game.header("Event", "Chesskit Game");
game.header("Site", "Chesskit");
game.header(
game.setHeader("Event", "Chesskit Game");
game.setHeader("Site", "Chesskit");
game.setHeader(
"Date",
new Date().toISOString().split("T")[0].replaceAll("-", ".")
);
const { whiteName, blackName, resigned } = params;
if (whiteName) game.header("White", whiteName);
if (blackName) game.header("Black", blackName);
if (whiteName) game.setHeader("White", whiteName);
if (blackName) game.setHeader("Black", blackName);
const whiteNameToUse = game.header().White || "White";
const blackNameToUse = game.header().Black || "Black";
const whiteNameToUse = game.getHeaders().White || "White";
const blackNameToUse = game.getHeaders().Black || "Black";
if (resigned) {
game.header("Result", resigned === "w" ? "0-1" : "1-0");
game.header(
game.setHeader("Result", resigned === "w" ? "0-1" : "1-0");
game.setHeader(
"Termination",
`${resigned === "w" ? blackNameToUse : whiteNameToUse} won by resignation`
);
@@ -82,8 +82,8 @@ export const setGameHeaders = (
if (!game.isGameOver()) return game;
if (game.isCheckmate()) {
game.header("Result", game.turn() === "w" ? "0-1" : "1-0");
game.header(
game.setHeader("Result", game.turn() === "w" ? "0-1" : "1-0");
game.setHeader(
"Termination",
`${
game.turn() === "w" ? blackNameToUse : whiteNameToUse
@@ -92,18 +92,18 @@ export const setGameHeaders = (
}
if (game.isInsufficientMaterial()) {
game.header("Result", "1/2-1/2");
game.header("Termination", "Draw by insufficient material");
game.setHeader("Result", "1/2-1/2");
game.setHeader("Termination", "Draw by insufficient material");
}
if (game.isStalemate()) {
game.header("Result", "1/2-1/2");
game.header("Termination", "Draw by stalemate");
game.setHeader("Result", "1/2-1/2");
game.setHeader("Termination", "Draw by stalemate");
}
if (game.isThreefoldRepetition()) {
game.header("Result", "1/2-1/2");
game.header("Termination", "Draw by threefold repetition");
game.setHeader("Result", "1/2-1/2");
game.setHeader("Termination", "Draw by threefold repetition");
}
return game;

View File

@@ -34,7 +34,7 @@ export const playSoundFromMove = async (move: Move | null) => {
playPromoteSound();
} else if (move.captured) {
playCaptureSound();
} else if (move.flags.includes("k") || move.flags.includes("q")) {
} else if (move.isKingsideCastle() || move.isQueensideCastle()) {
playCastleSound();
} else {
playMoveSound();

View File

@@ -6,17 +6,18 @@ import { gameAtom } from "../states";
export default function GamePanel() {
const { gameFromUrl } = useGameDatabase();
const game = useAtomValue(gameAtom);
const gameHeaders = game.getHeaders();
const hasGameInfo = gameFromUrl !== undefined || !!game.header().White;
const hasGameInfo = gameFromUrl !== undefined || !!gameHeaders.White;
if (!hasGameInfo) return null;
const termination =
gameFromUrl?.termination || game.header().Termination || "?";
gameFromUrl?.termination || gameHeaders.Termination || "?";
const result =
termination.split(" ").length > 2
? termination
: gameFromUrl?.result || game.header().Result || "?";
: gameFromUrl?.result || gameHeaders.Result || "?";
return (
<Grid
@@ -29,13 +30,13 @@ export default function GamePanel() {
>
<Grid container justifyContent="center" alignItems="center" size="grow">
<Typography noWrap fontSize="0.9rem">
Site : {gameFromUrl?.site || game.header().Site || "?"}
Site : {gameFromUrl?.site || gameHeaders.Site || "?"}
</Typography>
</Grid>
<Grid container justifyContent="center" alignItems="center" size="grow">
<Typography noWrap fontSize="0.9rem">
Date : {gameFromUrl?.date || game.header().Date || "?"}
Date : {gameFromUrl?.date || gameHeaders.Date || "?"}
</Typography>
</Grid>

View File

@@ -49,7 +49,7 @@ export default function LoadGame() {
loadGame();
}, [gameFromUrl, game, resetAndSetGamePgn, setEval]);
const isGameLoaded = gameFromUrl !== undefined || !!game.header().White;
const isGameLoaded = gameFromUrl !== undefined || !!game.getHeaders().White;
if (evaluationProgress) return null;