"use client"; import { useEffect, useState } from "react"; import { useSession } from "next-auth/react"; import Link from "next/link"; import { Avatar } from "@/components/ui"; interface UserData { username: string; avatar: string | null; hp: number; maxHp: number; xp: number; maxXp: number; level: number; score: number; } interface PlayerStatsProps { initialUserData?: UserData | null; } // Format number with consistent locale to avoid hydration mismatch const formatNumber = (num: number): string => { return num.toLocaleString("en-US"); }; const defaultUserData: UserData = { username: "Guest", avatar: null, hp: 1000, maxHp: 1000, xp: 0, maxXp: 5000, level: 1, score: 0, }; export default function PlayerStats({ initialUserData }: PlayerStatsProps) { const { data: session } = useSession(); const [userData, setUserData] = useState( initialUserData || defaultUserData ); useEffect(() => { // Si on a déjà des données initiales, ne rien faire (déjà initialisé dans useState) if (initialUserData) { return; } // Sinon, fallback sur le fetch côté client (pour les pages Client Components) if (session?.user?.id) { fetch(`/api/users/${session.user.id}`) .then((res) => res.json()) .then((data) => { if (data) { // Utiliser requestAnimationFrame pour éviter les cascades de rendu requestAnimationFrame(() => { setUserData({ username: data.username || "Guest", avatar: data.avatar, hp: data.hp || 1000, maxHp: data.maxHp || 1000, xp: data.xp || 0, maxXp: data.maxXp || 5000, level: data.level || 1, score: data.score || 0, }); }); } }) .catch(() => { // Utiliser les données de session si l'API échoue requestAnimationFrame(() => { setUserData({ username: session.user.username || "Guest", avatar: null, hp: 1000, maxHp: 1000, xp: 0, maxXp: 5000, level: 1, score: 0, }); }); }); } else if (!initialUserData) { // Utiliser requestAnimationFrame pour éviter les cascades de rendu requestAnimationFrame(() => { setUserData(defaultUserData); }); } }, [session, initialUserData]); const { username, avatar, level, score } = userData; return (
{/* Avatar */} {/* Stats */}
{/* Username & Level */}
{username}
Lv.{level}
{/* Score Display */}
Score
{formatNumber(score)}
); }