From b7e6fa844b4f381345499ee2dc403b8b2debe482 Mon Sep 17 00:00:00 2001 From: matthieureynier Date: Fri, 26 Jun 2026 14:48:50 +0200 Subject: [PATCH] Contact: correction doublon likes dans Carte + enonce guide persistance des jeux (ajout/suppression/modif au refresh) --- CORRECTION_likes_doublon.md | 51 +++++++++++ ENONCE_persistance_jeux.md | 166 ++++++++++++++++++++++++++++++++++++ 2 files changed, 217 insertions(+) create mode 100644 CORRECTION_likes_doublon.md create mode 100644 ENONCE_persistance_jeux.md diff --git a/CORRECTION_likes_doublon.md b/CORRECTION_likes_doublon.md new file mode 100644 index 0000000..39b16c0 --- /dev/null +++ b/CORRECTION_likes_doublon.md @@ -0,0 +1,51 @@ +# 🔧 Correction — il reste deux compteurs de likes en parallèle + +Bravo, le boss est presque parfait : `App` centralise `jeux` et `likes`, `Detail` retrouve le bon jeu, le Hall of Fame, les stats et le filtre 2D/3D marchent. Reste **un fil débranché** dans `Carte.jsx`. + +## 🐛 Le bug : `Carte` garde encore SON propre compteur + +Dans `Carte.jsx`, tu as gardé l'ancienne version locale des likes : +```jsx +const [likes, setLikes] = useState( + () => Number(localStorage.getItem("likes-" + props.gameId)) || 0, +); +useEffect(() => { + localStorage.setItem("likes-" + props.gameId, likes); +}, [likes]); +// ... + +``` + +Du coup il existe **deux compteurs différents** pour un même jeu : +- celui d'`App` (l'objet `likes`, rangé dans `localStorage["likes"]`) → utilisé par le Hall of Fame, les stats et la page Détail ; +- celui de `Carte` (son `useState` + `localStorage["likes-3"]`) → affiché sur le bouton de la carte. + +Au clic, tu incrémentes **les deux** (`setLikes` ET `props.onLike`), donc ça « a l'air » de marcher. Mais les deux peuvent **diverger** : la carte affiche son chiffre à elle, pendant que le podium affiche celui d'`App`. Et tu te retrouves avec deux clés de stockage qui font la même chose. + +> 🧩 La règle (encore elle) : **une seule source de vérité**. Les likes vivent dans `App`. `Carte` doit juste les **afficher** (`props.likes`) et **demander** l'incrément (`props.onLike`), sans tenir son propre compte. + +## ✅ La correction dans `Carte.jsx` + +1. Supprime le `useState` et le `useEffect` des likes (et les imports `useState`/`useEffect` s'ils ne servent plus à rien d'autre). +2. Affiche `props.likes` au lieu de `likes`. +3. Au clic, appelle seulement `props.onLike`. + +```jsx + +``` + +`Accueil` passe déjà `likes={likes[jeu.id] || 0}` et `onLike={() => onLike(jeu.id)}` → la carte a tout ce qu'il faut. + +> 🧽 Pense aussi à supprimer dans le navigateur les vieilles clés `likes-1`, `likes-2`… (onglet *Application → Local Storage* des outils dev) : elles ne servent plus. + +## 🧹 Petit bonus : `class` → `className` + +Dans `Accueil.jsx` et `Carte.jsx`, tes séparateurs sont écrits `
`. En React, l'attribut s'appelle **`className`** (`class` est un mot réservé en JavaScript). Le navigateur l'ignore tel quel → ouvre la console (F12), tu verras l'avertissement `Invalid DOM property 'class'. Did you mean 'className'?`. + +```jsx +
+``` + +> 💡 À retenir : en JSX, `class` devient `className`, et `for` (sur un `