From e6f0ce6116adc726b7deb2d1ff268a749c49eba3 Mon Sep 17 00:00:00 2001 From: Jonny Date: Mon, 14 Sep 2026 08:16:33 +0200 Subject: [PATCH] feat: add Settings component Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01V57jSQPqwkGG8BuAXg59X5 --- web/src/components/Settings.tsx | 96 +++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 web/src/components/Settings.tsx diff --git a/web/src/components/Settings.tsx b/web/src/components/Settings.tsx new file mode 100644 index 0000000..c2fe833 --- /dev/null +++ b/web/src/components/Settings.tsx @@ -0,0 +1,96 @@ +// web/src/components/Settings.tsx +import { useEffect, useState } from "react"; +import { apiFetch } from "../api"; + +type SettingsData = { assistant_name: string; company_name: string; contact_email: string }; + +export default function Settings() { + const [settings, setSettings] = useState(null); + const [error, setError] = useState(null); + const [saving, setSaving] = useState(false); + const [saved, setSaved] = useState(false); + + useEffect(() => { + async function load() { + try { + const response = await apiFetch("/api/v1/settings"); + if (!response.ok) { + setError("Einstellungen nicht verfuegbar"); + return; + } + setSettings(await response.json()); + } catch { + setError("Einstellungen nicht verfuegbar"); + } + } + load(); + }, []); + + function updateField(field: keyof SettingsData, value: string) { + setSettings((prev) => (prev ? { ...prev, [field]: value } : prev)); + setSaved(false); + } + + async function save() { + if (!settings) return; + setSaving(true); + setError(null); + try { + const response = await apiFetch("/api/v1/settings", { + method: "PUT", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(settings), + }); + if (!response.ok) { + setError("Speichern fehlgeschlagen"); + return; + } + setSettings(await response.json()); + setSaved(true); + } catch { + setError("Speichern fehlgeschlagen"); + } finally { + setSaving(false); + } + } + + if (!settings) { + return ( +
+ {error ?

{error}

:

Lade Einstellungen...

} +
+ ); + } + + return ( +
+

Einstellungen

+ {error &&

{error}

} + + + + + {saved &&

Gespeichert.

} +
+ ); +}