import { useEffect, useState } from 'react'; import { useTranslation } from '../contexts/LanguageContext'; import { useSidebar } from '../contexts/SidebarContext'; import { apiKeysAPI } from '../api/client'; import type { ApiKeyItem } from '../api/client'; import '../styles/APIKeys.css'; export default function APIKeys() { const { t } = useTranslation(); const { toggleMobileMenu } = useSidebar(); const [items, setItems] = useState([]); const [loading, setLoading] = useState(true); const [busy, setBusy] = useState(false); const [error, setError] = useState(''); const [name, setName] = useState(''); const [createdKey, setCreatedKey] = useState(null); const load = async () => { setLoading(true); setError(''); try { const data = await apiKeysAPI.list(); setItems(data.items || []); } catch (err: any) { setError(err?.response?.data?.detail || t.common.error); } finally { setLoading(false); } }; useEffect(() => { load(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const create = async () => { setBusy(true); setError(''); setCreatedKey(null); try { const created = await apiKeysAPI.create({ name: name.trim() }); setCreatedKey(created.key); setName(''); await load(); } catch (err: any) { setError(err?.response?.data?.detail || t.common.error); } finally { setBusy(false); } }; const revoke = async (id: string) => { setBusy(true); setError(''); try { await apiKeysAPI.revoke(id); await load(); } catch (err: any) { setError(err?.response?.data?.detail || t.common.error); } finally { setBusy(false); } }; const deleteKey = async (id: string) => { setBusy(true); setError(''); try { await apiKeysAPI.delete(id); await load(); } catch (err: any) { setError(err?.response?.data?.detail || t.common.error); } finally { setBusy(false); } }; const copy = async () => { if (!createdKey) return; try { await navigator.clipboard.writeText(createdKey); } catch { // ignore } }; return (
{t.apiKeysPage.title}
{error &&
{error}
}

{t.apiKeysPage.createTitle}

{t.apiKeysPage.createDesc}

setName(e.target.value)} placeholder={t.apiKeysPage.namePlaceholder} disabled={busy} />
{createdKey && (
{t.apiKeysPage.showOnce}
{createdKey}
)}

{t.apiKeysPage.listTitle}

{loading ? (
{t.common.loading}
) : items.length === 0 ? (
{t.apiKeysPage.empty}
) : (
{items.map((k) => ( ))}
{t.apiKeysPage.name} {t.apiKeysPage.prefix} {t.apiKeysPage.status} {t.apiKeysPage.lastUsed} {t.apiKeysPage.usage} {t.apiKeysPage.actions}
{k.name} {k.key_prefix} {k.is_active ? t.settings.enabled : t.settings.disabled} {k.last_used_at ? new Date(k.last_used_at).toLocaleString() : '—'} {k.usage_count} {k.is_active ? ( ) : ( {t.apiKeysPage.revoked} )}
)}
); }