From ed3df9c653d8911a0b1738e2edad0df1f523828e Mon Sep 17 00:00:00 2001 From: matthieureynier Date: Fri, 26 Jun 2026 16:26:06 +0200 Subject: [PATCH] Services: correction crash Versus (find undefined .nom), Versus a afficher, sync likes a la suppression + nettoyages --- CORRECTION_versus_et_suppression.md | 109 ++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 CORRECTION_versus_et_suppression.md diff --git a/CORRECTION_versus_et_suppression.md b/CORRECTION_versus_et_suppression.md new file mode 100644 index 0000000..4c09605 --- /dev/null +++ b/CORRECTION_versus_et_suppression.md @@ -0,0 +1,109 @@ +# 🔧 Correction — un crash caché + le Versus à finir + +Beau commit : le boss est bien rebranché (tu lis `trilogies` via les props, plus de liste locale en double), le **podium** s'affiche, le bouton **🗑️ supprimer** marche. Trois choses à régler, dans l'ordre d'urgence. + +--- + +## 1. 💥 Le bug qui fait planter la page (à corriger en premier) + +Regarde ton bloc Versus, en haut d'`Accueil` : +```jsx +const [a, setA] = useState(trilogies[0].id); +const gagnante = + likesA === likesB ? "Égalité" + : likesA > likesB ? trilogies.find((t) => t.id === Number(a)).nom + : trilogies.find((t) => t.id === Number(b)).nom; +``` + +Ce calcul tourne **à chaque affichage** de la page. Le piège est dans `.find(...).nom` : + +> `trilogies.find(...)` renvoie la trilogie trouvée… **ou `undefined` si elle n'existe pas**. Et `undefined.nom` plante (« Cannot read properties of undefined »), ce qui fait **écran blanc**. + +Le scénario qui déclenche le crash est juste sous ton nez : `a` vaut l'id de la **1ʳᵉ trilogie** au démarrage. Si tu **supprimes cette trilogie** (avec ton tout nouveau bouton 🗑️), `find` ne la trouve plus → `undefined.nom` → 💥. Ton module Supprimer fait donc planter ton module Versus. + +### ✅ La correction : ne jamais supposer que `find` a trouvé + +Récupère d'abord les trilogies, **puis** vérifie qu'elles existent avant de lire `.nom` : +```jsx +const triloA = trilogies.find((t) => t.id === Number(a)); +const triloB = trilogies.find((t) => t.id === Number(b)); + +const gagnante = + !triloA || !triloB ? "—" // une des deux a été supprimée + : likesA === likesB ? "Égalité" + : likesA > likesB ? triloA.nom : triloB.nom; +``` + +> 🔎 Autre écriture possible avec l'« optional chaining » : `trilogies.find(...)?.nom`. Le `?.` veut dire « si c'est `undefined`, ne lis pas `.nom`, renvoie `undefined` au lieu de planter ». Très pratique à retenir. + +> ⚠️ Même piège au montage : `useState(trilogies[1].id)` planterait s'il y avait **moins de 2 trilogies** au démarrage. Avec tes 5 trilogies de départ, c'est OK — mais garde en tête que `trilogies[1]` n'existe pas toujours. + +--- + +## 2. Le Versus n'est affiché nulle part + +Tu calcules `a`, `b`, `likesA`, `likesB`, `gagnante`… mais il n'y a **aucun ` setA(e.target.value)}> + {trilogies.map((t) => ( + + ))} + + +

🏆 Gagnante : {gagnante}

+ +``` + +> 🔎 La valeur d'un `` ne sert à rien → tu peux laisser le `