'use client' import { useState, useEffect } from 'react' import { Search, ChevronLeft, ChevronRight, ArrowUpDown, Eye } from 'lucide-react' import { Lead } from '@/lib/db' interface LeadsTableProps { initialLeads: Lead[] initialPagination: any } export default function LeadsTable({ initialLeads, initialPagination }: LeadsTableProps) { const [leads, setLeads] = useState(initialLeads) const [pagination, setPagination] = useState(initialPagination) const [loading, setLoading] = useState(false) const [search, setSearch] = useState('') const [sortBy, setSortBy] = useState('created_at') const [sortOrder, setSortOrder] = useState('DESC') const [selectedLead, setSelectedLead] = useState(null) const fetchLeads = async (params: { page?: number; search?: string; sortBy?: string; sortOrder?: string } = {}) => { setLoading(true) try { const searchParams = new URLSearchParams({ page: (params.page || pagination.page).toString(), search: params.search ?? search, sortBy: params.sortBy || sortBy, sortOrder: params.sortOrder || sortOrder, }) const response = await fetch(`/api/leads?${searchParams}`) const data = await response.json() setLeads(data.leads) setPagination(data.pagination) } catch (error) { console.error('Failed to fetch leads:', error) } finally { setLoading(false) } } const handleSort = (column: string) => { const newOrder = sortBy === column && sortOrder === 'ASC' ? 'DESC' : 'ASC' setSortBy(column) setSortOrder(newOrder) fetchLeads({ sortBy: column, sortOrder: newOrder }) } const handleSearch = (e: React.FormEvent) => { e.preventDefault() fetchLeads({ page: 1, search }) } const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString('en-AU', { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit', }) } return (
{/* Header */}

Lead Management

setSearch(e.target.value)} className="pl-10 pr-4 py-2 border border-sand-300 dark:border-carbon-600 rounded-lg bg-white dark:bg-carbon-800 text-carbon-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-mulberry-500 focus:border-mulberry-500 shadow-sm" />
{/* Table */}
{loading ? ( ) : leads.length === 0 ? ( ) : ( leads.map((lead) => ( )) )}
Actions
Loading...
No leads found
{formatDate(lead.created_at.toString())}
{lead.first_name} {lead.last_name}
{lead.company_role && (
{lead.company_role}
)}
{lead.email} {lead.company_name || '-'} {lead.lead_source.replace('_', ' ').replace(/\b\w/g, l => l.toUpperCase())}
{/* Pagination */}
Showing {(pagination.page - 1) * pagination.limit + 1} to{' '} {Math.min(pagination.page * pagination.limit, pagination.total)} of{' '} {pagination.total} results
Page {pagination.page} of {pagination.totalPages}
{/* Lead Detail Modal */} {selectedLead && (

Lead Details

{selectedLead.first_name} {selectedLead.last_name}

{selectedLead.email}

{selectedLead.company_name && (

{selectedLead.company_name}

)} {selectedLead.company_role && (

{selectedLead.company_role}

)}

{selectedLead.lead_source.replace('_', ' ').replace(/\b\w/g, l => l.toUpperCase())}

{formatDate(selectedLead.created_at.toString())}

{selectedLead.inquiry_details && (

{selectedLead.inquiry_details}

)} {selectedLead.custom_message && (

{selectedLead.custom_message}

)}

{selectedLead.ip_address}

{selectedLead.country_code && (

{selectedLead.country_code}

)}

{selectedLead.gdpr_consent_given ? 'Given' : 'Not Given'}

{selectedLead.marketing_consent ? 'Given' : 'Not Given'}

)}
) }