Files
chesskit/src/components/board/playerHeader.tsx
GuillaumeSD 74a2adbb7d Squashed commit of the following:
commit dfc79cf287823383a25a650d5788ee5250b1c316
Author: GuillaumeSD <47183782+GuillaumeSD@users.noreply.github.com>
Date:   Sun May 11 01:32:35 2025 +0200

    fix : style

commit bccfa5a3358302c2f037cc2dcfbd0a1df5e2974e
Author: GuillaumeSD <47183782+GuillaumeSD@users.noreply.github.com>
Date:   Sun May 11 01:01:12 2025 +0200

    feat : players clocks v1

commit 5f65009f200686433904710d5f9ceb1ba166fa9d
Author: GuillaumeSD <47183782+GuillaumeSD@users.noreply.github.com>
Date:   Sat May 10 21:58:02 2025 +0200

    fix : merge issues

commit f93dc6104e2d3fbb60088f578c2d1f13bf6519e9
Merge: a9f3728 fea1f3f
Author: GuillaumeSD <47183782+GuillaumeSD@users.noreply.github.com>
Date:   Sat May 10 21:53:11 2025 +0200

    Merge branch 'main' into feat/add-players-clocks

commit a9f372808ef403dfb823c4cf93c837412cc55c53
Author: GuillaumeSD <gsd.lfny@gmail.com>
Date:   Mon Jan 6 23:10:28 2025 +0100

    fix : rename

commit aedf9c252023bebe4da4327b7526371fa75b7b3e
Author: GuillaumeSD <gsd.lfny@gmail.com>
Date:   Sun Jan 5 17:30:27 2025 +0100

    feat : add players clocks
2025-05-11 01:33:10 +02:00

114 lines
3.0 KiB
TypeScript

import { Color } from "@/types/enums";
import { Player } from "@/types/game";
import { Avatar, Grid2 as Grid, Stack, Typography } from "@mui/material";
import CapturedPieces from "./capturedPieces";
import { PrimitiveAtom, useAtomValue } from "jotai";
import { Chess } from "chess.js";
import { useMemo } from "react";
import { getPaddedNumber } from "@/lib/helpers";
export interface Props {
player: Player;
color: Color;
gameAtom: PrimitiveAtom<Chess>;
}
export default function PlayerHeader({ color, player, gameAtom }: Props) {
const game = useAtomValue(gameAtom);
const gameFen = game.fen();
const clock = useMemo(() => {
const turn = game.turn();
if (turn === color) {
const history = game.history({ verbose: true });
const previousFen = history.at(-1)?.before;
const comment = game
.getComments()
.find(({ fen }) => fen === previousFen)?.comment;
return getClock(comment);
}
const comment = game.getComment();
return getClock(comment);
}, [game, color]);
return (
<Grid
container
justifyContent="space-between"
alignItems="center"
size={12}
>
<Stack direction="row">
<Avatar
src={player.avatarUrl}
alt={player.name}
variant="circular"
sx={{
width: 40,
height: 40,
backgroundColor: color === Color.White ? "white" : "black",
color: color === Color.White ? "black" : "white",
border: "1px solid black",
}}
>
{player.name[0].toUpperCase()}
</Avatar>
<Stack marginLeft={1}>
<Stack direction="row">
<Typography fontSize="0.9rem">{player.name}</Typography>
{player.rating && (
<Typography marginLeft={0.5} fontSize="0.9rem" fontWeight="200">
({player.rating})
</Typography>
)}
</Stack>
<CapturedPieces fen={gameFen} color={color} />
</Stack>
</Stack>
{clock && (
<Typography
align="center"
sx={{
backgroundColor: color === Color.White ? "white" : "black",
color: color === Color.White ? "black" : "white",
}}
borderRadius="5px"
padding={0.8}
border="1px solid #424242"
width="5rem"
textAlign="right"
>
{clock.hours ? `${clock.hours}:` : ""}
{getPaddedNumber(clock.minutes)}:{getPaddedNumber(clock.seconds)}
{clock.hours || clock.minutes || clock.seconds > 20
? ""
: `.${clock.tenths}`}
</Typography>
)}
</Grid>
);
}
const getClock = (comment: string | undefined) => {
if (!comment) return undefined;
const match = comment.match(/\[%clk (\d+):(\d+):(\d+)(?:\.(\d*))?\]/);
if (!match) return undefined;
return {
hours: parseInt(match[1]),
minutes: parseInt(match[2]),
seconds: parseInt(match[3]),
tenths: match[4] ? parseInt(match[4]) : 0,
};
};