'use client' import { useState } from 'react' type SettingStatus = { set: boolean; updated_at: string | null } interface Props { settings: Record } const KEY_LABELS: Record = { ANTHROPIC_API_KEY: 'Anthropic API Key (Claude)', VOYAGE_API_KEY: 'Voyage AI API Key (Embeddings)', } export function ApiKeyForm({ settings }: Props) { const [values, setValues] = useState>({ ANTHROPIC_API_KEY: '', VOYAGE_API_KEY: '', }) const [saving, setSaving] = useState>({}) const [results, setResults] = useState>({}) async function save(key: string) { setSaving(s => ({ ...s, [key]: true })) setResults(r => ({ ...r, [key]: undefined as never })) try { const res = await fetch('/ims/api/settings', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ key, value: values[key] }), }) setResults(r => ({ ...r, [key]: res.ok ? 'ok' : 'error' })) if (res.ok) setValues(v => ({ ...v, [key]: '' })) } catch { setResults(r => ({ ...r, [key]: 'error' })) } finally { setSaving(s => ({ ...s, [key]: false })) } } return (
{Object.keys(KEY_LABELS).map(key => { const status = settings[key] return (
{status?.set ? 'Configured' : 'Not set'}
{status?.set && status.updated_at && (

Last updated {new Date(status.updated_at).toLocaleDateString('en-MY')}

)}
setValues(v => ({ ...v, [key]: e.target.value }))} placeholder={status?.set ? 'Enter new key to replace…' : 'Enter API key…'} className="flex-1 border border-gray-300 rounded-lg px-3 py-2 text-sm focus:ring-2 focus:ring-blue-500 focus:border-transparent font-mono" />
{results[key] === 'ok' && (

Saved. Reload the page to confirm.

)} {results[key] === 'error' && (

Save failed. Check your permissions.

)}
) })}
) }