'use client' import { useState, useEffect } from 'react' interface Lead { id: number firstname: string lastname: string company: string email: string phone: string country: string status: string total_spent: string segment: string dormancy_flag: string email_status: string } interface Pagination { page: number limit: number total: number totalPages: number } export default function HPLeadsPage() { const [leads, setLeads] = useState([]) const [loading, setLoading] = useState(true) const [filter, setFilter] = useState('all') const [page, setPage] = useState(1) const [pagination, setPagination] = useState({ page: 1, limit: 100, total: 0, totalPages: 0 }) const [search, setSearch] = useState('') const [showSearch, setShowSearch] = useState(false) const [jumpPage, setJumpPage] = useState('') const [sortBy, setSortBy] = useState('total_spent') const [sortOrder, setSortOrder] = useState('DESC') useEffect(() => { fetchLeads() }, [filter, page, sortBy, sortOrder]) const fetchLeads = async () => { setLoading(true) const segmentParam = filter !== 'all' ? `&segment=${filter}` : '' const res = await fetch(`/api/mission-control/hp-leads?page=${page}&limit=100${segmentParam}&sortBy=${sortBy}&sortOrder=${sortOrder}`) const data = await res.json() setLeads(data.leads || []) setPagination(data.pagination || { page: 1, limit: 100, total: 0, totalPages: 0 }) setLoading(false) } const handleSort = (column: string) => { if (sortBy === column) { setSortOrder(sortOrder === 'ASC' ? 'DESC' : 'ASC') } else { setSortBy(column) setSortOrder('DESC') } } const handleJump = (e: React.FormEvent) => { e.preventDefault() const pageNum = parseInt(jumpPage) if (pageNum > 0 && pageNum <= pagination.totalPages) { setPage(pageNum) setJumpPage('') } } const handleSearch = (e: React.FormEvent) => { e.preventDefault() setPage(1) fetchSearch() } const fetchSearch = async () => { setLoading(true) const segmentParam = filter !== 'all' ? `&segment=${filter}` : '' const searchParam = search ? `&search=${encodeURIComponent(search)}` : '' const res = await fetch(`/api/mission-control/hp-leads?page=1&limit=100${segmentParam}${searchParam}&sortBy=${sortBy}&sortOrder=${sortOrder}`) const data = await res.json() setLeads(data.leads || []) setPagination(data.pagination || { page: 1, limit: 100, total: 0, totalPages: 0 }) setLoading(false) } const clearSearch = () => { setSearch('') setFilter('all') setPage(1) fetchLeads() } const SortIcon = ({ column }: { column: string }) => ( {sortBy === column && sortOrder === 'ASC' ? '↑' : '↓'} ) return (

HP Leads

{pagination.total.toLocaleString()} total records

{showSearch && (
setSearch(e.target.value)} placeholder="Search name, email, company, phone..." style={{ flex: 1, padding: '0.75rem 1rem', borderRadius: '0.5rem', border: '1px solid #334155', background: '#1e293b', color: '#fff', minWidth: '200px' }} />
)}
Filter: {['all', 'VIP', 'Standard', 'Re-engage'].map(f => ( ))}
{['firstname', 'lastname', 'company', 'email', 'phone', 'country', 'total_spent', 'segment', 'dormancy_flag'].map(col => ( ))} {loading ? ( ) : leads.length === 0 ? ( ) : leads.map(lead => ( ))}
handleSort(col)} style={{ padding: '1rem', textAlign: 'left', borderBottom: '1px solid #334155', cursor: 'pointer', userSelect: 'none' }} > {col === 'firstname' ? 'First Name' : col === 'lastname' ? 'Last Name' : col === 'company' ? 'Company' : col === 'email' ? 'Email' : col === 'phone' ? 'Phone' : col === 'country' ? 'Country' : col === 'total_spent' ? 'Spent' : col === 'segment' ? 'Segment' : col === 'dormancy_flag' ? 'Status' : col}
Loading...
No results found
{lead.firstname} {lead.lastname} {lead.company || '-'} {lead.email} {lead.phone || '-'} {lead.country} ${Number(lead.total_spent).toFixed(2)} {lead.segment} {lead.dormancy_flag}
Go to: setJumpPage(e.target.value)} placeholder="#" min={1} max={pagination.totalPages} style={{ width: '60px', padding: '0.5rem', borderRadius: '0.25rem', border: '1px solid #334155', background: '#1e293b', color: '#fff', textAlign: 'center' }} />
{page} / {pagination.totalPages}
{[1, Math.floor(pagination.totalPages/4), Math.floor(pagination.totalPages/2), Math.floor(pagination.totalPages*3/4), pagination.totalPages].filter((p, i, arr) => arr.indexOf(p) === i && p > 0 && p <= pagination.totalPages).map(p => ( ))}

Showing {leads.length} of {pagination.total.toLocaleString()} records

) }