"use client"; import { useEffect, useState } from "react"; import Link from "next/link"; import { loadStats } from "@/lib/stats"; import { GameId, GAME_META } from "@/lib/levels"; interface Props { game: GameId; date: string; dateLabel: string; children: React.ReactNode; } function fmt(s: number) { return `${String(Math.floor(s / 60)).padStart(2, "0")}:${String(s % 60).padStart(2, "0")}`; } /** * Wraps a daily puzzle page with: * - Already-solved banner (if player already solved today) * - Live date header * - "Entraîne-toi" link to /game/levels */ export default function DailyPageShell({ game, date, dateLabel, children }: Props) { const [solvedToday, setSolvedToday] = useState(false); const [stats, setStats] = useState | null>(null); const { accent } = GAME_META[game]; useEffect(() => { const s = loadStats(game); setStats(s); if (s.lastDate === date) { setSolvedToday(true); } }, [game, date]); return (
{/* Header */}

{GAME_META[game].name}

{dateLabel}

{/* Already-solved banner */} {solvedToday && stats && (

Déjà résolu aujourd'hui

{stats.bestTime > 0 && (

Meilleur temps : {fmt(stats.bestTime)}

)}
Niveaux →
)} {/* Board */} {children} {/* Footer links */}
Archives · Entraînement
); }