# 🏁 Énoncé FINAL — « Boss de fin » 😈 Dernier jour ! 🎉 Tu as déjà tout l'arsenal : composants, props, state, lifting state up, `useEffect`, **`fetch`**, formulaire, tri, filtre, **React Router**, **`localStorage`**. Aujourd'hui on **s'amuse** : 4 modules courts et stylés. Fais-en autant que tu veux, dans l'ordre que tu veux — mais le **Module L** est le vrai boss, attaque-le en premier. 💪 | Module | Tu fais | Niveau | Fun | |---|---|---|---| | L | La page détail **complète** (state remonté au routeur) | ⭐⭐⭐ | 🔑 | | M | Bouton **🎲 « Au hasard »** (page d'un jeu aléatoire) | ⭐⭐ | 😄 | | N | **🏆 Le Hall of Fame** des jeux les plus likés | ⭐⭐ | 🥇 | | O | **🌗 Thème sombre** qui se souvient de ton choix | ⭐⭐ | 🌙 | --- ## 🔑 Module L — Le boss : centraliser les données dans `App` Dans `CORRECTION_page_detail.md` tu as fait une version simple (la page détail re-`fetch` toute seule). Ses limites : les jeux **ajoutés au formulaire** et les **likes** n'arrivent pas dans le détail, parce que chacun vit dans son coin. On corrige ça **proprement**. **L'idée :** le `fetch`, la liste `jeux` **et** les likes doivent vivre **au-dessus** des deux pages → dans `App`. `App` les passe ensuite **en props** aux routes. ### L.1 — Remonter le `fetch` et les états dans `App.jsx` ```jsx import { useState, useEffect } from "react"; import { Routes, Route } from "react-router-dom"; import Header from "./components/Header"; import Footer from "./components/Footer"; import Accueil from "./pages/Accueil"; import Detail from "./pages/Detail"; function App() { const [jeux, setJeux] = useState([]); const [likes, setLikes] = useState(() => JSON.parse(localStorage.getItem("likes") || "{}") ); useEffect(() => { fetch("/zelda.json").then((r) => r.json()).then(setJeux); }, []); useEffect(() => { localStorage.setItem("likes", JSON.stringify(likes)); }, [likes]); function liker(id) { setLikes((prev) => ({ ...prev, [id]: (prev[id] || 0) + 1 })); } return ( <>
} /> } />