Ajoute une pastille sur le raccourci du Mur de la Honte
Nombre de publications du jour, façon notification iOS, sur le raccourci /mur de /leaderboard — via wall_notes_for_date() (une lecture directe de wall_notes ne montrerait, à cause de la RLS, que ses propres notes, pas le total). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -15,12 +15,17 @@ export default async function LeaderboardPage() {
|
||||
redirect("/login");
|
||||
}
|
||||
|
||||
const [{ data: profiles, error }, { data: settings }] = await Promise.all([
|
||||
const [{ data: profiles, error }, { data: settings }, { data: wallNotesToday }] = await Promise.all([
|
||||
supabase
|
||||
.from("profiles")
|
||||
.select("id, pseudo, avatar_url, points, previous_rank, role")
|
||||
.order("points", { ascending: false }),
|
||||
supabase.from("settings").select("tribunal_date").eq("id", true).single(),
|
||||
// wall_notes_for_date() (jamais une lecture directe de wall_notes, dont
|
||||
// la RLS ne laisserait voir que ses propres notes) : seul moyen de
|
||||
// connaître le nombre total de publications du jour sans exposer qui a
|
||||
// publié quoi — sert juste de compteur pour la pastille du raccourci.
|
||||
supabase.rpc("wall_notes_for_date"),
|
||||
]);
|
||||
|
||||
const isJudge = profiles?.find((p) => p.id === user.id)?.role === "judge";
|
||||
@@ -37,7 +42,7 @@ export default async function LeaderboardPage() {
|
||||
{tribunalDate && <p className="text-xs text-marble/50">{formatTribunalDateTime(tribunalDate)}</p>}
|
||||
</div>
|
||||
|
||||
<QuickLinks />
|
||||
<QuickLinks wallNoteCount={wallNotesToday?.length ?? 0} />
|
||||
|
||||
{error && (
|
||||
<p role="alert" className="text-sm text-oxblood">
|
||||
|
||||
@@ -15,19 +15,33 @@ const LINKS = [
|
||||
{ href: "/journal", label: "Le Crieur", icon: IconScroll },
|
||||
] as const;
|
||||
|
||||
export function QuickLinks() {
|
||||
export function QuickLinks({ wallNoteCount }: { wallNoteCount: number }) {
|
||||
return (
|
||||
<nav aria-label="Raccourcis" className="mb-6 grid grid-cols-3 gap-2 sm:grid-cols-6 sm:gap-3">
|
||||
{LINKS.map(({ href, label, icon: Icon }) => (
|
||||
<Link
|
||||
key={href}
|
||||
href={href}
|
||||
className="marble-surface flex flex-col items-center gap-1.5 rounded-xl border border-gold/25 px-2 py-3 text-center shadow-sm transition hover:border-gold/50 hover:shadow-md"
|
||||
>
|
||||
<Icon className="h-6 w-6 text-gold" />
|
||||
<span className="text-[0.65rem] leading-tight font-medium text-text-marble sm:text-xs">{label}</span>
|
||||
</Link>
|
||||
))}
|
||||
{LINKS.map(({ href, label, icon: Icon }) => {
|
||||
// Pastille "façon iPhone" (nombre de publications du jour) : pour
|
||||
// l'instant seul le Mur en a une, les autres raccourcis n'ont pas
|
||||
// d'équivalent "à consulter aujourd'hui" aussi direct.
|
||||
const badge = href === "/mur" ? wallNoteCount : 0;
|
||||
return (
|
||||
<Link
|
||||
key={href}
|
||||
href={href}
|
||||
className="marble-surface relative flex flex-col items-center gap-1.5 rounded-xl border border-gold/25 px-2 py-3 text-center shadow-sm transition hover:border-gold/50 hover:shadow-md"
|
||||
>
|
||||
{badge > 0 && (
|
||||
<span
|
||||
className="absolute -top-1.5 -right-1.5 flex h-5 min-w-5 items-center justify-center rounded-full bg-oxblood px-1 text-[0.65rem] font-bold text-marble shadow"
|
||||
aria-label={`${badge} publication${badge > 1 ? "s" : ""} aujourd'hui sur le Mur de la Honte`}
|
||||
>
|
||||
{badge}
|
||||
</span>
|
||||
)}
|
||||
<Icon className="h-6 w-6 text-gold" />
|
||||
<span className="text-[0.65rem] leading-tight font-medium text-text-marble sm:text-xs">{label}</span>
|
||||
</Link>
|
||||
);
|
||||
})}
|
||||
</nav>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user