import { useState, useEffect } from 'react' import { configStorage } from '@/lib/configStorage' import type { Nip95Config } from '@/lib/configStorageTypes' import { t } from '@/lib/i18n' interface Nip95ConfigManagerProps { onConfigChange?: () => void } export function Nip95ConfigManager({ onConfigChange }: Nip95ConfigManagerProps) { const [apis, setApis] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [editingId, setEditingId] = useState(null) const [newUrl, setNewUrl] = useState('') const [showAddForm, setShowAddForm] = useState(false) useEffect(() => { void loadApis() }, []) async function loadApis() { try { setLoading(true) setError(null) const config = await configStorage.getConfig() setApis(config.nip95Apis.sort((a, b) => a.priority - b.priority)) } catch (e) { const errorMessage = e instanceof Error ? e.message : t('settings.nip95.error.loadFailed') setError(errorMessage) console.error('Error loading NIP-95 APIs:', e) } finally { setLoading(false) } } async function handleToggleEnabled(id: string, enabled: boolean) { try { await configStorage.updateNip95Api(id, { enabled }) await loadApis() onConfigChange?.() } catch (e) { const errorMessage = e instanceof Error ? e.message : t('settings.nip95.error.updateFailed') setError(errorMessage) console.error('Error updating NIP-95 API:', e) } } async function handleUpdatePriority(id: string, priority: number) { try { await configStorage.updateNip95Api(id, { priority }) await loadApis() onConfigChange?.() } catch (e) { const errorMessage = e instanceof Error ? e.message : t('settings.nip95.error.priorityFailed') setError(errorMessage) console.error('Error updating priority:', e) } } async function handleUpdateUrl(id: string, url: string) { try { await configStorage.updateNip95Api(id, { url }) await loadApis() setEditingId(null) onConfigChange?.() } catch (e) { const errorMessage = e instanceof Error ? e.message : t('settings.nip95.error.urlFailed') setError(errorMessage) console.error('Error updating URL:', e) } } async function handleAddApi() { if (!newUrl.trim()) { setError(t('settings.nip95.error.urlRequired')) return } try { // Validate URL format new URL(newUrl) await configStorage.addNip95Api(newUrl.trim(), false) setNewUrl('') setShowAddForm(false) await loadApis() onConfigChange?.() } catch (e) { if (e instanceof TypeError && e.message.includes('Invalid URL')) { setError(t('settings.nip95.error.invalidUrl')) } else { const errorMessage = e instanceof Error ? e.message : t('settings.nip95.error.addFailed') setError(errorMessage) } console.error('Error adding NIP-95 API:', e) } } async function handleRemoveApi(id: string) { if (!confirm(t('settings.nip95.remove.confirm'))) { return } try { await configStorage.removeNip95Api(id) await loadApis() onConfigChange?.() } catch (e) { const errorMessage = e instanceof Error ? e.message : t('settings.nip95.error.removeFailed') setError(errorMessage) console.error('Error removing NIP-95 API:', e) } } if (loading) { return (
{t('settings.nip95.loading')}
) } return (
{error && (
{error}
)}

{t('settings.nip95.title')}

{showAddForm && (
setNewUrl(e.target.value)} placeholder={t('settings.nip95.add.placeholder')} className="w-full px-4 py-2 bg-cyber-darker border border-cyber-accent/30 rounded text-cyber-light focus:border-neon-cyan focus:outline-none" />
)}
{apis.length === 0 ? (
{t('settings.nip95.empty')}
) : ( apis.map((api) => (
{editingId === api.id ? (
{ if (e.target.value !== api.url) { void handleUpdateUrl(api.id, e.target.value) } else { setEditingId(null) } }} onKeyDown={(e) => { if (e.key === 'Enter') { e.currentTarget.blur() } else if (e.key === 'Escape') { setEditingId(null) } }} className="w-full px-3 py-2 bg-cyber-darker border border-neon-cyan/50 rounded text-cyber-light focus:border-neon-cyan focus:outline-none" autoFocus />
) : (
setEditingId(api.id)} title={t('settings.nip95.list.editUrl')} > {api.url}
)}
{t('settings.nip95.list.priorityLabel', { priority: api.priority, id: api.id })}
)) )}

{t('settings.nip95.note.title')} {t('settings.nip95.note.priority')}

{t('settings.nip95.note.fallback')}

) }