const { useState, useEffect } = React; function ContactsList({ onSelectContact }) { const [contacts, setContacts] = useState([]); const [filteredContacts, setFilteredContacts] = useState([]); const [loading, setLoading] = useState(true); const [tierFilter, setTierFilter] = useState(''); const [warmthFilter, setWarmthFilter] = useState(''); const [searchTerm, setSearchTerm] = useState(''); useEffect(() => { loadContacts(); }, []); useEffect(() => { filterContacts(); }, [contacts, tierFilter, warmthFilter, searchTerm]); const loadContacts = async () => { try { const res = await fetch('/api/contacts'); const data = await res.json(); setContacts(data); setLoading(false); } catch (err) { console.error('Error loading contacts:', err); setLoading(false); } }; const filterContacts = () => { let filtered = contacts; if (tierFilter) { filtered = filtered.filter(c => c.tier === tierFilter); } if (warmthFilter) { filtered = filtered.filter(c => c.warmth_status === warmthFilter); } if (searchTerm) { filtered = filtered.filter(c => c.full_name.toLowerCase().includes(searchTerm.toLowerCase()) || c.organisation?.toLowerCase().includes(searchTerm.toLowerCase()) ); } setFilteredContacts(filtered); }; if (loading) return
Loading contacts...
; return (

Contacts ({filteredContacts.length})

{/* Filters */}
setSearchTerm(e.target.value)} style={{ width: '100%', padding: '8px', marginBottom: '10px', border: '1px solid #ddd', borderRadius: '4px' }} />
{/* Contacts List */}
{filteredContacts.length === 0 ? (

No contacts found

) : ( filteredContacts.map(contact => (
onSelectContact(contact.id)} style={{ cursor: 'pointer' }} >
{contact.full_name}
{contact.current_title && `${contact.current_title} at `} {contact.organisation} • {contact.location}
Last contacted: {contact.last_contacted ? new Date(contact.last_contacted).toLocaleDateString() : 'Never'}
{contact.tier}
{contact.warmth_status}
)) )}
); }