import { useCallback, useEffect, useState } from "react"; import { getUserConfig, updateUserConfig, type UserConfig, type UserConfigUpdate } from "../api/settings"; import { Icon } from "../components/icon"; type SettingsStatus = "loading" | "ready" | "error"; const THEME_OPTIONS = [ { value: "system", label: "System" }, { value: "light", label: "Light" }, { value: "dark", label: "Dark" }, ]; export const SettingsPage = () => { const [status, setStatus] = useState("loading"); const [config, setConfig] = useState({ theme: "system", default_editor: null, git_user_name: null, git_user_email: null, last_session_id: null, }); const [saveStatus, setSaveStatus] = useState<"idle" | "saving" | "saved" | "error">("idle"); const loadConfig = useCallback(async () => { try { const data = await getUserConfig(); setConfig(data); setStatus("ready"); } catch { setStatus("error"); } }, []); useEffect(() => { void loadConfig(); }, [loadConfig]); const handleChange = (key: keyof UserConfigUpdate, value: string | null) => { setConfig((prev) => ({ ...prev, [key]: value })); setSaveStatus("idle"); }; const handleSave = async () => { setSaveStatus("saving"); try { const update: UserConfigUpdate = { theme: config.theme, default_editor: config.default_editor ?? undefined, git_user_name: config.git_user_name ?? undefined, git_user_email: config.git_user_email ?? undefined, }; const updated = await updateUserConfig(update); setConfig(updated); setSaveStatus("saved"); // Apply theme immediately const theme = updated.theme ?? "system"; if (theme === "system") { document.documentElement.removeAttribute("data-theme"); } else { document.documentElement.setAttribute("data-theme", theme); } setTimeout(() => setSaveStatus("idle"), 2000); } catch { setSaveStatus("error"); } }; if (status === "loading") { return

Loading settings...

; } if (status === "error") { return (

Failed to load settings

); } return (

Settings

Appearance

Git Identity

Editor

{saveStatus === "saved" && Settings saved!} {saveStatus === "error" && Failed to save}
); };