"use client"; import { useEffect, useState } from "react"; type Status = { smtp: { host: string; port: number; user: string; from: string; passGesetzt: boolean }; telegram: { botTokenGesetzt: boolean }; logo: { secretGesetzt: boolean; publishableKey: string }; verschluesselungBereit: boolean; }; const inputClass = "mt-1.5 h-11 w-full rounded-field border border-line bg-white px-3.5 text-sm text-ink placeholder:text-muted/60"; async function saveSection(section: string, values: Record) { const res = await fetch("/api/settings/integrations", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ section, values }), }); const data = await res.json().catch(() => ({})); if (!res.ok) throw new Error(data.message ?? `Fehler: ${(data.errors ?? []).join(", ")}`); return data.status as Status; } function Section({ title, children, }: { title: string; children: React.ReactNode; }) { return (

{title}

{children}
); } function SecretHint({ gesetzt }: { gesetzt: boolean }) { return (

{gesetzt ? "Gespeichert. Leer lassen, um den Wert zu behalten." : "Noch nicht gespeichert."}

); } export default function IntegrationsForm() { const [status, setStatus] = useState(null); const [loadError, setLoadError] = useState(""); const [notice, setNotice] = useState(""); const [smtp, setSmtp] = useState({ host: "", port: "587", user: "", pass: "", from: "" }); const [telegramToken, setTelegramToken] = useState(""); const [logoSecret, setLogoSecret] = useState(""); const [logoPublic, setLogoPublic] = useState(""); useEffect(() => { fetch("/api/settings/integrations") .then((r) => (r.ok ? r.json() : Promise.reject(new Error("laden fehlgeschlagen")))) .then((s: Status) => { setStatus(s); setSmtp({ host: s.smtp.host, port: String(s.smtp.port), user: s.smtp.user, pass: "", from: s.smtp.from }); setLogoPublic(s.logo.publishableKey); }) .catch(() => setLoadError("Einstellungen konnten nicht geladen werden.")); }, []); async function onSave(section: "smtp" | "telegram" | "logo", values: Record, okText: string) { setNotice(""); try { const s = await saveSection(section, values); setStatus(s); if (section === "smtp") setSmtp((v) => ({ ...v, pass: "" })); if (section === "telegram") setTelegramToken(""); if (section === "logo") { setLogoSecret(""); setLogoPublic(s.logo.publishableKey); } setNotice(okText); } catch (e) { setNotice(e instanceof Error ? e.message : "Speichern fehlgeschlagen"); } } if (loadError) return

{loadError}

; if (!status) return

Wird geladen …

; return (
setSmtp({ ...smtp, host: e.target.value })} placeholder="mail.beispiel.de" autoComplete="off" className={inputClass} />
setSmtp({ ...smtp, port: e.target.value })} placeholder="587" autoComplete="off" className={inputClass} />
setSmtp({ ...smtp, user: e.target.value })} autoComplete="username" className={inputClass} />
setSmtp({ ...smtp, pass: e.target.value })} autoComplete="new-password" placeholder={status.smtp.passGesetzt ? "••••••••" : ""} className={inputClass} />
setSmtp({ ...smtp, from: e.target.value })} placeholder="gutscheine@beispiel.de" autoComplete="email" className={inputClass} />
setTelegramToken(e.target.value)} autoComplete="off" placeholder={status.telegram.botTokenGesetzt ? "••••••••" : "123456:ABC-DEF…"} className={inputClass} />
setLogoSecret(e.target.value)} autoComplete="off" placeholder={status.logo.secretGesetzt ? "••••••••" : "sk_…"} className={inputClass} />
setLogoPublic(e.target.value)} autoComplete="off" placeholder="pk_…" className={inputClass} />
{notice &&

{notice}

}
); }