"use client"; import { useEffect, useState } from "react"; import { CheckboxField, useToast } from "@nexarch/shl"; import { ApiError, KNOWN_CHANNELS, KNOWN_EVENT_TYPES, Preference, fetchMyPreferences, setPreference, } from "../../lib/api"; const EVENT_LABELS: Record = { welcome: "Willkommen", invoice_ready: "Rechnung verfügbar", password_reset: "Passwort-Zurücksetzung", security_alert: "Sicherheitshinweis", }; const CHANNEL_LABELS: Record = { email: "E-Mail", in_app: "In-App", }; export default function SettingsPage() { const { push } = useToast(); const [prefs, setPrefs] = useState(null); const [loadError, setLoadError] = useState(null); const [pending, setPending] = useState(null); useEffect(() => { fetchMyPreferences() .then(setPrefs) .catch(() => setLoadError("Einstellungen konnten nicht geladen werden. Bitte melden Sie sich an.")); }, []); // Default: aktiviert, solange keine explizite Praeferenz existiert // (Akzeptanzkriterium 1) — gleicher Opt-out-Default wie im Backend. function isEnabled(eventType: string, channel: string): boolean { const explicit = prefs?.find((p) => p.EventType === eventType && p.Channel === channel); return explicit ? explicit.Enabled : true; } async function onToggle(eventType: string, channel: string, nextEnabled: boolean) { const key = `${eventType}:${channel}`; setPending(key); try { // Akzeptanzkriterium 2: sofort speichern, kein Sammel-Speichern-Button — // wirkt unmittelbar auf künftige Zustellungen (EnqueueIfAllowed prüft // bei jedem Aufruf live, kein Cache dazwischen). await setPreference(eventType, channel, nextEnabled); setPrefs((current) => { const withoutThis = (current ?? []).filter((p) => !(p.EventType === eventType && p.Channel === channel)); return [...withoutThis, { TenantSlug: "", UserID: "", EventType: eventType, Channel: channel, Enabled: nextEnabled }]; }); push(nextEnabled ? "Benachrichtigung aktiviert." : "Benachrichtigung deaktiviert.", "success"); } catch (err) { push(err instanceof ApiError ? err.message : "Einstellung konnte nicht gespeichert werden.", "danger"); } finally { setPending(null); } } if (loadError) { return (

{loadError}

); } return (

Benachrichtigungseinstellungen

Wählen Sie je Ereignis, über welche Kanäle Sie benachrichtigt werden möchten.

{KNOWN_EVENT_TYPES.map((eventType) => (
{EVENT_LABELS[eventType] ?? eventType} {KNOWN_CHANNELS.map((channel) => { const key = `${eventType}:${channel}`; return ( onToggle(eventType, channel, e.target.checked)} /> ); })}
))}
); }