"use client"; import { useEffect, useState } from "react"; import { getPlayMode, savePlayMode, PlayMode } from "@/lib/session"; import { GAMES } from "@/lib/levels"; import { loadStats, getRitualStreak } from "@/lib/stats"; function todayISO() { const d = new Date(); return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`; } function formatTime(secs: number) { if (!secs) return "—"; return `${Math.floor(secs / 60)}:${String(secs % 60).padStart(2, "0")}`; } export default function SettingsPage() { const [mode, setMode] = useState("free"); const [storageOk, setStorageOk] = useState(null); const [isIOS, setIsIOS] = useState(false); const [isStandalone, setIsStandalone] = useState(false); const [exportDone, setExportDone] = useState(false); useEffect(() => { setMode(getPlayMode()); setIsIOS(/iPhone|iPad|iPod/.test(navigator.userAgent)); setIsStandalone(window.matchMedia("(display-mode: standalone)").matches); // Check storage persistence if ("storage" in navigator && "persisted" in navigator.storage) { navigator.storage.persisted().then(p => setStorageOk(p)); } }, []); function handleModeChange(m: PlayMode) { setMode(m); savePlayMode(m); } async function requestPersist() { if ("storage" in navigator && "persist" in navigator.storage) { const granted = await navigator.storage.persist(); setStorageOk(granted); } } function exportData() { const data: Record = { exportDate: todayISO() }; GAMES.forEach(g => { const raw = localStorage.getItem(`stats-${g}`); if (raw) data[`stats-${g}`] = JSON.parse(raw); const lvl = localStorage.getItem(`levels-${g}`); if (lvl) data[`levels-${g}`] = JSON.parse(lvl); }); data["pt-mode"] = localStorage.getItem("pt-mode"); data["ritual"] = localStorage.getItem("ritual-streak"); const blob = new Blob([JSON.stringify(data, null, 2)], { type: "application/json" }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = `puzzle-trainer-${todayISO()}.json`; a.click(); URL.revokeObjectURL(url); setExportDone(true); setTimeout(() => setExportDone(false), 2000); } const ritual = typeof window !== "undefined" ? getRitualStreak() : { streak: 0, lastDate: "" }; return (
{/* Header */}

Réglages

{/* Stats summary */}

Résumé

Série quotidienne {ritual.streak > 0 ? `🔥 ${ritual.streak} jour${ritual.streak > 1 ? "s" : ""}` : "—"}
{GAMES.map(g => { const stats = typeof window !== "undefined" ? loadStats(g) : null; return (
{g} {stats?.total ?? 0} résolus · meilleur {formatTime(stats?.bestTime ?? 0)}
); })}
{/* Mode de jeu */}

Mode de jeu

{/* Données */}

Données

Stockage persistant

Évite la suppression des données par Safari

{storageOk === true ? ( Activé ) : storageOk === false ? ( ) : ( )}
{/* iOS Install guide */} {isIOS && !isStandalone && (

Installer l'app

Ajouter à l'écran d'accueil

{[ { n: 1, text: "Appuie sur l'icône Partager (carré avec flèche vers le haut) en bas de Safari" }, { n: 2, text: "Fais défiler et appuie sur « Sur l'écran d'accueil »" }, { n: 3, text: "Appuie sur « Ajouter » en haut à droite" }, ].map(step => (
{step.n}

{step.text}

))}

L'app sera disponible hors connexion une fois installée.

)} {/* À propos */}

À propos

Version 1.0
Données stockées 100% sur votre appareil
); }