Ajoute Le Jeu de l'Agora : Le Char et Le Gardien du Silence
Build and deploy / deploy (push) Successful in 36s
Build and deploy / deploy (push) Successful in 36s
Page /char (16:9, projetée) pour piloter les deux jeux physiques du Tribunal : Le Char (2 colonnes de 3 emplacements côte à côte avec un VS et une illustration de char vu du dessus, sélection en un clic, duels, compteur et classement des passages) et Le Gardien du Silence (tirage aléatoire parmi les Citoyens, minuteur avec reroll auto et manuel). Banque de questions gérée séparément sur /char/questions (pensée pour être pilotée depuis un téléphone pendant que /char est projetée depuis un ordinateur).
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
import Link from "next/link";
|
||||
import { redirect } from "next/navigation";
|
||||
import { createClient } from "@/lib/supabase/server";
|
||||
import { QuestionsView } from "./questions-view";
|
||||
|
||||
export type QuestionRow = {
|
||||
id: string;
|
||||
text: string;
|
||||
position: number;
|
||||
created_at: string;
|
||||
};
|
||||
|
||||
export default async function CharQuestionsPage() {
|
||||
const supabase = await createClient();
|
||||
const {
|
||||
data: { user },
|
||||
} = await supabase.auth.getUser();
|
||||
|
||||
if (!user) {
|
||||
redirect("/login");
|
||||
}
|
||||
|
||||
const { data: callerProfile } = await supabase
|
||||
.from("profiles")
|
||||
.select("role")
|
||||
.eq("id", user.id)
|
||||
.single();
|
||||
|
||||
// Page entièrement réservée aux Archontes : contrairement à /char (projeté,
|
||||
// partagé avec tous), rien ici n'a de sens pour un Citoyen — et exposer la
|
||||
// liste complète des questions à venir serait un spoiler du jeu en cours.
|
||||
if (callerProfile?.role !== "judge") {
|
||||
redirect("/char");
|
||||
}
|
||||
|
||||
const { data: questions } = await supabase
|
||||
.from("chariot_questions")
|
||||
.select("id, text, position, created_at")
|
||||
.order("position", { ascending: true })
|
||||
.order("created_at", { ascending: true });
|
||||
|
||||
const { data: settings } = await supabase
|
||||
.from("settings")
|
||||
.select("chariot_revealed_question_id")
|
||||
.eq("id", true)
|
||||
.single();
|
||||
|
||||
return (
|
||||
<div className="mx-auto w-full max-w-2xl px-4 py-8">
|
||||
<div className="mb-6 text-center">
|
||||
<h1 className="font-heading text-2xl tracking-[0.1em] text-gold-bright uppercase">Les Questions du Char</h1>
|
||||
<p className="font-serif text-sm text-marble/60 italic">
|
||||
Réservé aux Archontes — /char (projetée) n'affiche que la question choisie ici.
|
||||
</p>
|
||||
<Link
|
||||
href="/char"
|
||||
className="mt-2 inline-block text-xs font-medium text-marble/60 underline hover:text-gold-bright"
|
||||
>
|
||||
← Retourner au Char
|
||||
</Link>
|
||||
</div>
|
||||
<QuestionsView
|
||||
initialQuestions={questions ?? []}
|
||||
initialRevealedId={settings?.chariot_revealed_question_id ?? null}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user