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; } 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 ( {player.name[0].toUpperCase()} {player.name} {player.rating && ( ({player.rating}) )} {clock && ( {clock.hours ? `${clock.hours}:` : ""} {getPaddedNumber(clock.minutes)}:{getPaddedNumber(clock.seconds)} {clock.hours || clock.minutes || clock.seconds > 20 ? "" : `.${clock.tenths}`} )} ); } 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, }; };