Afficher les réponses
Afficher les réponses possibles d'une question à choix multiples.

Notions théoriques
Les composants interactifs
Un composant interactif est un composant sur lequel l'utilisateur peut cliquer, écrire, faire une action... et le composant va réagir.
Dans notre projet, nous voulons que l'utilisateur puisse cliquer sur une réponse.
Pour cela, nous allons utiliser :
- des composants visuels (comme les boutons de ShadCN/UI),
- et des fonctions JavaScript qui se déclenchent au clic.
Les événements en React
Un événement est une action faite par l'utilisateur : un clic, une touche pressée, un mouvement de souris, etc.
En React, on utilise souvent l’événement onClick.
Exemple :
<button onClick={() => alert("Vous avez cliqué !")}>
Cliquez ici
</button>
Ici, au clic, une alerte s’affiche.
Afficher une liste
Afficher une liste de réponses cliquables
Nous avons déjà une question avec plusieurs réponses possibles. Ces réponses sont stockées dans un tableau.
Exemple :
const question = {
texte: "Quel est le mot de passe le plus sécurisé ?",
reponses: [
"123456",
"azerty",
"Une phrase longue avec des caractères spéciaux"
],
};
Pour afficher chaque réponse dans un bouton cliquable, on utilise .map() :
{question.reponses.map((reponse, index) => (
<button key={index} onClick={() => handleClick(reponse)}>
{reponse}
</button>
))}
Afficher un bouton
Utiliser un composant pour les boutons
ShadCN propose un composant Button très pratique.
Pour l’installer :
npx shadcn@latest add button
Ensuite, on peut remplacer les <button> classiques par :
<Button onClick={() => handleClick(reponse)}>
{reponse}
</Button>
Exemple pratique
Afficher des réponses cliquables
Voici un exemple complet d'affichage d'une question avec ses réponses cliquables :
import { Button } from "@/components/ui/button";
const question = {
texte: "Quel est le mot de passe le plus sécurisé ?",
reponses: [
"123456",
"azerty",
"Une phrase longue avec des caractères spéciaux",
],
};
function handleClick(reponse: string) {
console.log("Vous avez choisi :", reponse);
}
return (
<div>
<h2>{question.texte}</h2>
{question.reponses.map((reponse, index) => (
<Button key={index} onClick={() => handleClick(reponse)} className="mt-2 block">
{reponse}
</Button>
))}
</div>
);
Décryptage du code


Quelques méthodes à connaître
| Méthode | Description |
|---|---|
console.log() | Affiche une information dans la console |
.map() | Parcourt un tableau et retourne un nouvel élément JSX pour chaque élément |
Button (ShadCN) | Composant stylisé pour les boutons |
key={index} | Permet à React d’identifier chaque élément de liste |
onClick={() => ...} | Déclenche une action lorsque l'utilisateur clique |
Test de mémorisation / compréhension
TP pour réfléchir et résoudre des problèmes
Afficher les réponses d’une question dans la page, sous forme de boutons cliquables.
Contexte
Pour l'instant, le fichier app/page.tsx affiche uniquement une seule question, récupérée depuis Supabase.

Nous allons maintenant :
- Modifier la requête Supabase pour récupérer aussi les réponses associées à cette question.
- Afficher ces réponses sous forme de boutons cliquables.
- Afficher un message lorsque l’utilisateur clique sur une réponse, indiquant si elle est correcte ou non.
Étape 1 : Créer une nouvelle branche Git
git checkout -b affichage-reponses
Étape 2 — Structure des données
Comprendre la structure des données

Tables concernées
question: contient les champsid,texte, etc.reponse: contient les champsid,texte,est_correcte, et une clé étrangèreid_questionversquestion.id.
Relation
Chaque question peut avoir plusieurs réponses.
Chaque réponse appartient à une seule question (via id_question).
Étape 3 — Désactiver les RLS
Désactiver les RLS pour la table
reponse
Pour que notre application puisse lire les réponses, il faut désactiver les RLS (Row Level Security) pour la table reponse.
-
Allez dans Supabase > Table Editor > reponse

-
Cliquez sur le bouton Add RLS policy

-
Cliquez sur le bouton Disable RLS.

-
Cliquez sur le bouton Confirm.
- La RLS sera réactivée plus tard (pour la sécurité). Nous verrons, à une étape ultérieure, comment faire ça bien.
- Pour l’instant, nous voulons juste récupérer des données facilement.
Étape 4 — Préparer l’IDE
Préparer l’environnement de développement
- Démarrer VSCode et ré-ouvrir le dossier du projet :
- Ouvrir le terminal intégré dans VS Code.
Menu
Terminal→New Terminal.
- Lancer le serveur de développement (si ce n’est pas déjà fait) :
npm run dev

Étape 5 — Modifier la requête Supabase
Dans la fonction fetchQuestion(), il faut remplacer :
.select('*')
par une requête avec jointure, pour récupérer les réponses liées à la question :
.select(`
id,
texte,
reponses:reponse (
id,
texte,
est_correcte
)
`)
Cette nouvelle requête permet de :
- Récupérer les champs
idettextede la question - Récupérer les réponses associées via la table
reponse, et les renommer localement sous le champreponses
