import type { Nip95Config } from '@/lib/configStorageTypes' import { t } from '@/lib/i18n' import { DragHandle } from '../DragHandle' import { getApiCardClassName } from './getApiCardClassName' export function Nip95ApiCard(params: { api: Nip95Config priority: number isEditing: boolean draggedId: string | null dragOverId: string | null onStartEditing: (id: string) => void onStopEditing: () => void onUpdateUrl: (id: string, url: string) => void onToggleEnabled: (id: string, enabled: boolean) => void onRemoveApi: (id: string) => void onDragStart: (e: React.DragEvent, id: string) => void onDragOver: (e: React.DragEvent, id: string) => void onDragLeave: () => void onDrop: (e: React.DragEvent, targetId: string) => void }): React.ReactElement { return (
params.onDragOver(e, params.api.id)} onDragLeave={params.onDragLeave} onDrop={(e) => params.onDrop(e, params.api.id)} className={`bg-cyber-dark border rounded p-4 space-y-3 transition-all ${getApiCardClassName(params.api.id, params.draggedId, params.dragOverId)}`} >
) } function DragGrip(params: { apiId: string; onDragStart: (e: React.DragEvent, id: string) => void }): React.ReactElement { return (
{ params.onDragStart(e, params.apiId) e.stopPropagation() }} onMouseDown={(e) => e.stopPropagation()} >
) } function UrlCell(params: { api: Nip95Config isEditing: boolean onStartEditing: (id: string) => void onStopEditing: () => void onUpdateUrl: (id: string, url: string) => void }): React.ReactElement { return
{params.isEditing ? : }
} function UrlText(params: { api: Nip95Config; onStartEditing: (id: string) => void }): React.ReactElement { return (
params.onStartEditing(params.api.id)} title={t('settings.nip95.list.editUrl')} > {params.api.url}
) } function UrlEditor(params: { api: Nip95Config; onStop: () => void; onUpdate: (id: string, url: string) => void }): React.ReactElement { return ( { const next = e.target.value if (next !== params.api.url) { params.onUpdate(params.api.id, next) } else { params.onStop() } }} onKeyDown={(e) => { if (e.key === 'Enter') { e.currentTarget.blur() } else if (e.key === 'Escape') { params.onStop() } }} 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 /> ) } function ActionsCell(params: { api: Nip95Config; onToggleEnabled: (id: string, enabled: boolean) => void; onRemoveApi: (id: string) => void }): React.ReactElement { return (
) } function EnabledToggle(params: { api: Nip95Config; onToggleEnabled: (id: string, enabled: boolean) => void }): React.ReactElement { return ( ) } function RemoveButton(params: { apiId: string; onRemove: (id: string) => void }): React.ReactElement { return ( ) } function PriorityRow(params: { priority: number; apiId: string }): React.ReactElement { return (
{t('settings.nip95.list.priorityLabel', { priority: params.priority, id: params.apiId })}
) }