codex-proxy / shared /hooks /use-settings.ts
icebear0828
feat: editable proxy_api_key from Dashboard settings panel
69a8388
raw
history blame
1.98 kB
import { useState, useEffect, useCallback } from "preact/hooks";
export function useSettings() {
const [apiKey, setApiKey] = useState<string | null>(null);
const [loaded, setLoaded] = useState(false);
const [saving, setSaving] = useState(false);
const [error, setError] = useState<string | null>(null);
const [saved, setSaved] = useState(false);
const load = useCallback(async () => {
try {
const resp = await fetch("/admin/settings");
if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
const data: { proxy_api_key: string | null } = await resp.json();
setApiKey(data.proxy_api_key);
setLoaded(true);
setError(null);
} catch (err) {
setError(err instanceof Error ? err.message : String(err));
}
}, []);
const save = useCallback(async (newKey: string | null) => {
setSaving(true);
setSaved(false);
setError(null);
try {
const headers: Record<string, string> = { "Content-Type": "application/json" };
// Send current key for auth if one exists
if (apiKey) {
headers["Authorization"] = `Bearer ${apiKey}`;
}
const resp = await fetch("/admin/settings", {
method: "POST",
headers,
body: JSON.stringify({ proxy_api_key: newKey }),
});
if (!resp.ok) {
const data = await resp.json().catch(() => ({ error: `HTTP ${resp.status}` }));
throw new Error((data as { error?: string }).error ?? `HTTP ${resp.status}`);
}
const result: { proxy_api_key: string | null } = await resp.json();
setApiKey(result.proxy_api_key);
setSaved(true);
// Auto-clear saved indicator after 3s
setTimeout(() => setSaved(false), 3000);
} catch (err) {
setError(err instanceof Error ? err.message : String(err));
} finally {
setSaving(false);
}
}, [apiKey]);
useEffect(() => { load(); }, [load]);
return { apiKey, loaded, saving, saved, error, save, load };
}