import React, { useCallback, useState } from 'react'; function CorrespondentsPanel({ correspondents = [], onRefresh, onCreate, onUpdate, onDelete, onNotify, }) { const [editingId, setEditingId] = useState(null); const [draftName, setDraftName] = useState(''); const [createName, setCreateName] = useState(''); const [saving, setSaving] = useState(false); const [creating, setCreating] = useState(false); const [deletingId, setDeletingId] = useState(null); const startEdit = useCallback((correspondent) => { setEditingId(correspondent.id); setDraftName(correspondent.name || ''); }, []); const cancelEdit = useCallback(() => { setEditingId(null); setDraftName(''); setSaving(false); }, []); const handleSave = useCallback(async () => { if (!editingId) return; const trimmed = draftName.trim(); if (!trimmed) { onNotify?.('Correspondent name cannot be empty.', 'error'); return; } setSaving(true); try { await onUpdate(editingId, { name: trimmed }); cancelEdit(); } catch ( // eslint-disable-next-line no-empty error ) {} }, [editingId, draftName, onUpdate, cancelEdit, onNotify]); const handleDelete = useCallback( async (correspondent) => { if (!correspondent?.id) return; setDeletingId(correspondent.id); try { await onDelete(correspondent.id); if (editingId === correspondent.id) { cancelEdit(); } } catch ( // eslint-disable-next-line no-empty error ) { return; } finally { setDeletingId(null); } }, [onDelete, editingId, cancelEdit], ); const handleCreate = useCallback( async (event) => { event.preventDefault(); const trimmed = createName.trim(); if (!trimmed) { onNotify?.('Correspondent name cannot be empty.', 'error'); return; } setCreating(true); try { await onCreate({ name: trimmed }); setCreateName(''); } catch ( // eslint-disable-next-line no-empty error ) { return; } finally { setCreating(false); } }, [createName, onCreate, onNotify], ); const handleKeyDown = useCallback( (event) => { if (event.key === 'Enter') { event.preventDefault(); handleSave(); } else if (event.key === 'Escape') { event.preventDefault(); cancelEdit(); } }, [handleSave, cancelEdit], ); const renderUsage = useCallback((usage) => { if (!usage) { return '0'; } const total = typeof usage.total === 'number' ? usage.total : 0; const entries = usage.by_role ? Object.entries(usage.by_role) : []; if (!entries.length) { return total.toString(); } const roleSummary = entries .map(([role, count]) => `${role}: ${count}`) .join(', '); return `${total} (${roleSummary})`; }, []); return (

Correspondents

{correspondents.length} total
setCreateName(event.target.value)} disabled={creating} />
{correspondents.length === 0 ? (
No correspondents created yet.
) : (
{correspondents.map((correspondent) => { const isEditing = editingId === correspondent.id; return ( ); })}
Name Usage Actions
{isEditing ? ( setDraftName(event.target.value)} onKeyDown={handleKeyDown} disabled={saving} autoFocus /> ) : ( {correspondent.name} )} {renderUsage(correspondent.usage)} {isEditing ? (
) : (
)}
)}
); } export default CorrespondentsPanel;