import React, { useState, useEffect } from 'react'; import { Player } from '../types'; import { motion, useSpring, useTransform } from 'framer-motion'; import { BarChart, Bar, XAxis, YAxis, ResponsiveContainer, Cell, LabelList } from 'recharts'; import { Loader2 } from 'lucide-react'; import { PlayerAvatar } from './PlayerAvatar'; const AnimatedScoreLabel: React.FC<{ x: number; y: number; width: number; value: number; }> = ({ x, y, width, value }) => { const spring = useSpring(0, { duration: 500 }); const display = useTransform(spring, (latest) => Math.round(latest)); const [displayValue, setDisplayValue] = useState(0); useEffect(() => { spring.set(value); const unsubscribe = display.on('change', (v) => setDisplayValue(v)); return () => unsubscribe(); }, [value, spring, display]); return ( {displayValue} ); }; interface ScoreboardProps { players: Player[]; onNext: () => void; isHost: boolean; currentPlayerId: string | null; } export const Scoreboard: React.FC = ({ players, onNext, isHost, currentPlayerId }) => { const playersWithDisplayName = players.map(p => ({ ...p, displayName: p.id === currentPlayerId ? `${p.name} (You)` : p.name })); const sortedPlayers = [...playersWithDisplayName].sort((a, b) => b.score - a.score).slice(0, 5); return ( Scoreboard {sortedPlayers.map((player) => ( {player.displayName} ))} {sortedPlayers.map((entry, index) => ( ))} ( )} /> {isHost ? ( Next ) : ( Waiting for host... )} ); };