"use client"; import { useEffect, useState } from "react"; import Link from "next/link"; import { loadStats } from "@/lib/stats"; import { GameId, GAME_META } from "@/lib/levels"; import RuleOverlay, { useRuleOverlay } from "@/components/RuleOverlay"; 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: * - Rule overlay on first visit (auto) + "?" button to re-open * - Already-solved banner (if player already solved today) * - Live date header * - Footer links to Archives / Training */ export default function DailyPageShell({ game, date, dateLabel, children }: Props) { const [solvedToday, setSolvedToday] = useState(false); const [stats, setStats] = useState | null>(null); const { accent, name } = GAME_META[game]; // Rule overlay — auto on first visit, manual via "?" const { visible: ruleVisible, dismiss: ruleDismiss, open: ruleOpen } = useRuleOverlay(game); const [forceRule, setForceRule] = useState(false); useEffect(() => { const s = loadStats(game); setStats(s); if (s.lastDate === date) { setSolvedToday(true); } }, [game, date]); const handleOpenRule = () => { setForceRule(true); ruleOpen(); }; const handleCloseRule = () => { setForceRule(false); ruleDismiss(); }; return ( <>
{/* Header */}

{name}

{dateLabel}

{/* "?" rule button */}
{/* 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 ·
); }