"use client"; import { BeakerIcon, BellAlertIcon, CheckCircleIcon, ClockIcon, FireIcon, } from "@heroicons/react/24/outline"; import { useEffect, useState } from "react"; import { useSession } from "@/lib/auth-client"; import { ReminderKind, ReminderRule, ReminderSettings, defaultReminderSettings, loadHellthData, saveHellthData, } from "@/lib/hellth-data"; const reminderMeta: Record< ReminderKind, { title: string; description: string; icon: typeof BeakerIcon; color: string } > = { water: { title: "Wasser trinken", description: "Regelmäßig kleine Trinkimpulse statt abends alles nachholen.", icon: BeakerIcon, color: "text-blue-500", }, snack: { title: "Snack prüfen", description: "Hilft, geplante Snacks bewusst zu essen und ungeplantes Snacken zu vermeiden.", icon: FireIcon, color: "text-orange-500", }, movement: { title: "Kurz bewegen", description: "Steh vom Schreibtisch auf, streck dich oder geh ein paar Schritte.", icon: ClockIcon, color: "text-emerald-500", }, }; function permissionLabel(permission: NotificationPermission | "unsupported") { if (permission === "granted") return "Benachrichtigungen sind erlaubt."; if (permission === "denied") return "Benachrichtigungen sind im Browser blockiert."; if (permission === "unsupported") return "Dieser Browser unterstützt keine Web-Benachrichtigungen."; return "Benachrichtigungen sind noch nicht aktiviert."; } export default function ErinnerungenPage() { const { data: session } = useSession(); const userKey = session?.user?.id ?? session?.user?.email ?? null; const [settings, setSettings] = useState(defaultReminderSettings); const [permission, setPermission] = useState("default"); const [saved, setSaved] = useState(false); useEffect(() => { if (!userKey) return; setSettings(loadHellthData(userKey).reminders); setPermission(typeof Notification === "undefined" ? "unsupported" : Notification.permission); }, [userKey]); function persist(nextSettings: ReminderSettings) { if (!userKey) return; setSettings(nextSettings); const data = loadHellthData(userKey); saveHellthData({ ...data, reminders: nextSettings }, userKey); setSaved(true); window.setTimeout(() => setSaved(false), 1500); } function updateRule(kind: ReminderKind, patch: Partial) { persist({ ...settings, rules: { ...settings.rules, [kind]: { ...settings.rules[kind], ...patch }, }, }); } async function requestPermission() { if (typeof Notification === "undefined") { setPermission("unsupported"); return; } const result = await Notification.requestPermission(); setPermission(result); persist({ ...settings, enabled: result === "granted" ? settings.enabled : false, permissionRequestedAt: new Date().toISOString(), }); } async function sendTest(kind: ReminderKind) { if (typeof Notification === "undefined" || Notification.permission !== "granted") return; const rule = settings.rules[kind]; if ("serviceWorker" in navigator) { try { const registration = await navigator.serviceWorker.ready; await registration.showNotification(`Hellth Hub: ${reminderMeta[kind].title}`, { body: rule.message, tag: `hellth-test-${kind}`, }); return; } catch { // Fall through to regular notification. } } new Notification(`Hellth Hub: ${reminderMeta[kind].title}`, { body: rule.message }); } return (

Coach Impulse

Erinnerungen

Kleine Push-Impulse für Wasser, geplante Snacks und Bewegung im Arbeitsalltag.

Benachrichtigungen

{permissionLabel(permission)}

{(Object.keys(settings.rules) as ReminderKind[]).map((kind) => { const meta = reminderMeta[kind]; const rule = settings.rules[kind]; return (

{meta.title}

{meta.description}