import { useState, useEffect } from 'react' import axios from 'axios' import { Users, Search, Upload, Mail, Building, LayoutGrid, List, ChevronLeft, ChevronRight, X, ArrowDownUp } from 'lucide-react' import clsx from 'clsx' interface ContactsTableProps { apiBase: string onCompanyClick: (id: number) => void onContactClick: (companyId: number, contactId: number) => void } export function ContactsTable({ apiBase, onCompanyClick, onContactClick }: ContactsTableProps) { const [data, setData] = useState([]) const [total, setTotal] = useState(0) const [page, setPage] = useState(0) const [search, setSearch] = useState("") const [sortBy, setSortBy] = useState('name_asc') const [loading, setLoading] = useState(false) const [viewMode, setViewMode] = useState<'grid' | 'list'>('grid') const limit = 50 const [isImportOpen, setIsImportOpen] = useState(false) const [importText, setImportText] = useState("") const [importStatus, setImportStatus] = useState(null) const fetchContacts = () => { setLoading(true) axios.get(`${apiBase}/contacts/all?skip=${page * limit}&limit=${limit}&search=${search}&sort_by=${sortBy}`) .then(res => { setData(res.data.items); setTotal(res.data.total); }) .finally(() => setLoading(false)) } useEffect(() => { const timeout = setTimeout(fetchContacts, 300) return () => clearTimeout(timeout) }, [page, search, sortBy]) const handleImport = async () => { if (!importText) return setImportStatus("Parsing...") try { const lines = importText.split('\n').filter(l => l.trim()) const contacts = lines.map(line => { const parts = line.split(/[;,|]+/).map(p => p.trim()) if (parts.length < 3) return null return { company_name: parts[0], first_name: parts[1], last_name: parts[2], email: parts[3] || null, job_title: parts[4] || null } }).filter(Boolean) if (contacts.length === 0) { setImportStatus("Error: No valid contacts found. Format: Company, First, Last, Email") return } setImportStatus(`Importing ${contacts.length} contacts...`) const res = await axios.post(`${apiBase}/contacts/bulk`, { contacts }) setImportStatus(`Success! Added: ${res.data.added}, Created Companies: ${res.data.companies_created}, Skipped: ${res.data.skipped}`) setImportText("") setTimeout(() => { setIsImportOpen(false) setImportStatus(null) fetchContacts() }, 2000) } catch (e) { console.error(e) setImportStatus("Import Failed.") } } return (
{/* Toolbar */}

All Contacts ({total})

{ setSearch(e.target.value); setPage(0); }}/>
{/* Import Modal */} {isImportOpen && (

Bulk Import Contacts

Paste CSV data (no header). Format:
Company Name, First Name, Last Name, Email, Job Title