"use client"; import { useEffect, useState } from "react"; interface PlayerStatsProps { username?: string; avatar?: string; hp?: number; maxHp?: number; xp?: number; maxXp?: number; level?: number; } // Format number with consistent locale to avoid hydration mismatch const formatNumber = (num: number): string => { return num.toLocaleString("en-US"); }; export default function PlayerStats({ username = "DragonSlayer99", avatar = "/got-2.jpg", hp = 750, maxHp = 1000, xp = 3250, maxXp = 5000, level = 42, }: PlayerStatsProps) { const [hpPercentage, setHpPercentage] = useState(0); const [xpPercentage, setXpPercentage] = useState(0); useEffect(() => { // Animate HP bar const hpTimer = setTimeout(() => { setHpPercentage((hp / maxHp) * 100); }, 100); // Animate XP bar const xpTimer = setTimeout(() => { setXpPercentage((xp / maxXp) * 100); }, 200); return () => { clearTimeout(hpTimer); clearTimeout(xpTimer); }; }, [hp, maxHp, xp, maxXp]); const hpColor = hpPercentage > 60 ? "from-green-600 to-green-700" : hpPercentage > 30 ? "from-yellow-600 to-orange-700" : "from-red-700 to-red-900"; return (
{/* Avatar */}
{username}
{/* Stats */}
{/* Username & Level */}
{username}
Lv.{level}
{/* Bars side by side */}
{/* HP Bar */}
{hpPercentage < 30 && (
)}
{/* XP Bar */}
{/* Labels */}
HP {hp} / {maxHp}
XP {formatNumber(xp)} / {formatNumber(maxXp)}
); }