pablo.mourato
PROJETS / CHOCO BAROU QUIZÉTUDE DE CAS · 05 / 05

Choco Barou
Quiz

Une application de quiz en temps réel pour faire s'affronter 6 équipes pendant un événement d'entreprise — conçue, développée et mise en ligne seul.

RÔLE
Conception, développement, déploiement
CONTEXTE
Événement interne — Choco Barou (filiale d'Andros).
ANNÉE · DURÉE
2026 · 1 mois et demi
STACK
React, Vite, Tailwind CSS, Firebase (Firestore + Hosting)
Chocobarou Quiz : le tableau de bord d’une équipe en thème sombre et le tableau des scores en thème clair
01/ — CONTEXTE

Le besoin.

Une entreprise voulait animer un événement interne avec un quiz entre 6 équipes. Il fallait que chaque équipe réponde depuis son propre écran, que les scores s'affichent en direct pour tout le monde, et que l'ambiance soit là : chrono et écran de classement.

Contraintes : une seule soirée pour que tout fonctionne du premier coup, aucun serveur à maintenir derrière, et des questions fournies par l'organisateur au dernier moment. L'organisateur demandait un quiz interactif chronométré et un tableau des scores dynamique.

OBJECTIF 16 équipes connectées en même temps, chacune sur son écran
OBJECTIF 2Un classement mis à jour instantanément, sans recharger
OBJECTIF 3Des questions faciles à ajouter, sans toucher au code
02/ — ARCHITECTURE

Temps réel,
sans serveur.

J'ai choisi Firebase pour ne pas avoir de back-end à héberger : Firestore joue le rôle de base de données partagée et pousse chaque changement à tous les écrans connectés. Le front est une application React construite avec Vite et servie par Firebase Hosting.

Écrans des équipesReact + Vite · connexion par équipe, réponses chronométrées
↓ écrit les réponses↑ reçoit l’état du quiz
Cloud FirestoreScores, questions, état de la partie · règles de sécurité
↓ onSnapshot()↑ aucune écriture
Écran de classementTableau de bord projeté, mis à jour en direct
FIREBASE HOSTING — SERT L'APPLICATION À TOUS LES ÉCRANS
03/ — FONCTIONNALITÉS

Ce que voit le joueur.

Chaque écran a été pensé pour être lisible de loin, compris en une seconde et agréable à regarder sur un vidéoprojecteur.

Chocobarou Quiz : écran de connexion des équipes, titre en dégradé sur fond de grille rétro
01

Connexion par équipe

Un écran d'accueil en verre dépoli (glassmorphism) où chaque équipe choisit son nom avant de rejoindre la partie.

Tableau des scores : les six équipes avec leur score par série
02

Classement en direct

Les points s'ajoutent à la seconde près sur l'écran projeté, grâce aux écouteurs temps réel de Firestore.

Exemple de question vrai/faux avec la progression et le chrono de cinq minutes
03

Chrono évolutif

Le compte à rebours passe progressivement d'une couleur calme à une couleur d'alerte pour mettre la pression dans les dernières secondes.

Règles du quiz : deux séries de 193 questions aléatoires, cinq minutes par série
04

Questions mélangées

L'ordre des questions est tiré au hasard à chaque partie, pour qu'aucune équipe ne puisse anticiper.

Le tableau de bord coupé en deux : thème sombre à gauche, thème clair à droite
05

Thème clair / sombre

Un contexte React (ThemeContext) permet de basculer tout le quiz en clair ou en sombre selon la salle.

← FAITES DÉFILER →
04/ — DÉFIS TECHNIQUES

Ce qui a
résisté.

DÉFI 01

Un classement juste, en direct

LE PROBLÈME

Six équipes marquent des points en même temps et l'écran projeté doit suivre sans jamais être rechargé. Sans garde-fou, n'importe quel écran connecté aurait aussi pu modifier le score d'une autre équipe.

MA SOLUTION

Chaque équipe écrit uniquement dans son propre document Firestore ; l'écran de classement s'abonne à la collection avec onSnapshot() et retrie à chaque changement. Les règles de sécurité Firestore refusent toute écriture sur le score d'une autre équipe.

Leaderboard.jsx — principe simplifié
// L'écran projeté écoute les scores, sans jamais écrire
const q = query(collection(db, 'teams'), orderBy('score', 'desc'));

useEffect(() => onSnapshot(q, (snap) => {
  // Chaque point marqué par une équipe arrive ici, à tous les écrans
  setTeams(snap.docs.map((d) => ({ id: d.id, ...d.data() })));
}), []);
DÉFI 02

Ajouter des questions sans toucher au code

LE PROBLÈME

L'organisateur envoyait ses questions au fil de l'eau, parfois avec une image. Les recopier à la main dans les composants aurait été long et source d'erreurs.

MA SOLUTION

Toutes les questions vivent dans un fichier JSON au format fixe (id, question, points, réponses, bonne réponse, image). Le quiz les charge et les mélange : ajouter une question, c'est ajouter un objet.

questions.json — une entrée
{
  "id": 12,
  "question": "Le lavage des mains est obligatoire avant de prendre son poste et après chaque pause ?",
  "points": 10,
  "answers": ["oui", "non"],
  "correct": 0,
  "image": "/questions/12.webp"
}
05/ — RÉSULTATS

Le jour J.

6équipes en compétition, en même temps
374questions jouées pendant l’événement
0serveur à maintenir grâce à Firebase.
CE QUE J'EN RETIENS

Assurer la synchronisation en temps réel des données partagées entre plusieurs écrans, sécuriser les écritures de chaque équipe et garantir le bon fonctionnement de l’application lors de sa présentation à un public réel.