import { useEffect, useState, type ChangeEvent, type ReactElement } from 'react'; import { loadSettings, saveSettings, testConnection } from '../../lib/api.js'; import { AccountsTab } from './accounts-tab.js'; import { SettingsTab } from './settings-tab.js'; import { SourcesTab } from './sources-tab.js'; type TabId = 'sources' | 'accounts' | 'settings'; const TABS: { id: TabId; label: string }[] = [ { id: 'sources', label: 'Credentials' }, { id: 'accounts', label: 'Accounts' }, { id: 'settings', label: 'Settings' }, ]; type TestResult = { ok: true; latencyMs: number } | { ok: false; error: string }; function ConnectionBar(): ReactElement { const [serverUrl, setServerUrl] = useState(''); const [apiKey, setApiKey] = useState(''); const [testing, setTesting] = useState(false); const [testResult, setTestResult] = useState(null); useEffect(() => { loadSettings().then(s => { setServerUrl(s.serverUrl ?? ''); setApiKey(s.apiKey ?? ''); }); }, []); function handleUrlBlur(e: ChangeEvent) { setTestResult(null); void saveSettings({ serverUrl: e.target.value || undefined }); } function handleKeyBlur(e: ChangeEvent) { setTestResult(null); void saveSettings({ apiKey: e.target.value || undefined }); } async function handleTestConnection() { setTesting(true); setTestResult(null); try { const result = await testConnection(); setTestResult( result.ok ? { ok: true, latencyMs: result.latencyMs ?? 0 } : { ok: false, error: result.error ?? 'Unknown error' }, ); } catch (err) { setTestResult({ ok: false, error: err instanceof Error ? err.message : String(err) }); } finally { setTesting(false); } } return (

Server connection

setServerUrl(e.target.value)} onBlur={handleUrlBlur} placeholder="https://your-accounter-server" style={{ padding: '4px 8px', width: 260 }} />
setApiKey(e.target.value)} onBlur={handleKeyBlur} placeholder="your-api-key" style={{ padding: '4px 8px', width: 200 }} />
{testResult && (

{testResult.ok ? `✓ Connected (${testResult.latencyMs} ms)` : `✕ ${testResult.error}`}

)}
); } export function Config(): ReactElement { const [active, setActive] = useState('sources'); return (
{active === 'sources' && ( <> )} {active === 'accounts' && } {active === 'settings' && }
); }