Remove ESLint configuration file and update type imports across components: Deleted eslint.config.js to streamline project setup. Updated type imports in layout, login, register, and other components to use direct imports for improved clarity and consistency. Enhanced error handling in various components and replaced apostrophes with HTML entities for better rendering.

This commit is contained in:
Julien Froidefond
2025-12-10 06:01:34 +01:00
parent 13b8971cc7
commit 44be5d2e98
12 changed files with 75 additions and 130 deletions

View File

@@ -51,40 +51,48 @@ export default function PlayerStats({ initialUserData }: PlayerStatsProps) {
.then((res) => res.json())
.then((data) => {
if (data) {
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,
// 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,
});
});
}
})
.catch(() => {
// Utiliser les données de session si l'API échoue
setUserData({
username: session.user.username || "Guest",
avatar: null,
hp: 1000,
maxHp: 1000,
xp: 0,
maxXp: 5000,
level: 1,
requestAnimationFrame(() => {
setUserData({
username: session.user.username || "Guest",
avatar: null,
hp: 1000,
maxHp: 1000,
xp: 0,
maxXp: 5000,
level: 1,
});
});
});
} else {
setUserData(defaultUserData);
} else if (!initialUserData) {
// Utiliser requestAnimationFrame pour éviter les cascades de rendu
requestAnimationFrame(() => {
setUserData(defaultUserData);
});
}
}, [session, initialUserData]);
const { username, avatar, hp, maxHp, xp, maxXp, level } = userData;
// Calculer les pourcentages cibles
const targetHpPercentage = (hp / maxHp) * 100;
const targetXpPercentage = (xp / maxXp) * 100;
// Initialiser les pourcentages à 0 si on a des données initiales (pour l'animation)
// Sinon utiliser directement les valeurs calculées
const [hpPercentage, setHpPercentage] = useState(
@@ -109,11 +117,13 @@ export default function PlayerStats({ initialUserData }: PlayerStatsProps) {
clearTimeout(hpTimer);
clearTimeout(xpTimer);
};
} else {
// Sinon, mettre à jour directement (pour les pages Client Components)
}
// Sinon, mettre à jour directement (pour les pages Client Components)
// Utiliser requestAnimationFrame pour éviter les cascades de rendu
requestAnimationFrame(() => {
setHpPercentage(targetHpPercentage);
setXpPercentage(targetXpPercentage);
}
});
}, [targetHpPercentage, targetXpPercentage, initialUserData]);
const hpColor =
@@ -126,7 +136,10 @@ export default function PlayerStats({ initialUserData }: PlayerStatsProps) {
return (
<div className="flex items-center gap-3">
{/* Avatar */}
<Link href="/profile" className="cursor-pointer hover:opacity-80 transition-opacity">
<Link
href="/profile"
className="cursor-pointer hover:opacity-80 transition-opacity"
>
<div className="w-10 h-10 rounded-full border border-pixel-gold/20 overflow-hidden bg-gray-900 flex items-center justify-center">
{avatar ? (
<img
@@ -146,7 +159,10 @@ export default function PlayerStats({ initialUserData }: PlayerStatsProps) {
<div className="flex flex-col gap-1.5 min-w-[200px]">
{/* Username & Level */}
<div className="flex items-center gap-2">
<Link href="/profile" className="cursor-pointer hover:text-pixel-gold/80 transition-colors">
<Link
href="/profile"
className="cursor-pointer hover:text-pixel-gold/80 transition-colors"
>
<div className="text-pixel-gold font-gaming font-bold text-sm tracking-wider">
{username}
</div>
@@ -155,7 +171,7 @@ export default function PlayerStats({ initialUserData }: PlayerStatsProps) {
Lv.{level}
</div>
</div>
{/* Bars side by side */}
<div className="flex flex-col gap-1">
<div className="flex items-center gap-2">
@@ -210,4 +226,3 @@ export default function PlayerStats({ initialUserData }: PlayerStatsProps) {
</div>
);
}