import { useEffect, useState } from 'react' import { analyticsApi } from '../api' import { useProject } from '../contexts/ProjectContext' const STATUS_COLOR = { new: '#0073ea', contacted: '#fdab3d', qualified: '#00c875', converted: '#a25ddc', archived: '#9699a6', } const SOURCE_COLOR = { csv: '#0073ea', excel: '#00c875', linkedin: '#a25ddc', web_scrape: '#e2445c', manual: '#fdab3d', } function StatCard({ label, value, sub, color }) { return (
{label}
{value}
{sub &&
{sub}
}
) } function BarChart({ data, colorMap, title }) { const total = Object.values(data).reduce((a, b) => a + b, 0) if (!total) return null return (
{title}
{Object.entries(data).sort((a, b) => b[1] - a[1]).map(([key, count]) => (
{key} {count} ({Math.round(count / total * 100)}%)
))}
) } export default function Dashboard() { const { activeProject } = useProject() const [data, setData] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) useEffect(() => { setLoading(true) analyticsApi.get(activeProject?.id ?? null) .then(setData) .catch(e => setError(e.message)) .finally(() => setLoading(false)) }, [activeProject]) if (loading) return
Loading...
if (error) return
{error}
if (!data) return null return (

Dashboard

{activeProject &&
Showing data for {activeProject.name}
}
{Object.keys(data.leads_by_industry).length > 0 && ( )}
Recent Leads
{data.recent_leads.length === 0 ?
No leads yet — import data or run the scraper.
: (
{data.recent_leads.map(lead => (
{lead.company_name || lead.contact_name || 'Unknown'}
{lead.email && {lead.email} · } {lead.source && {lead.source}}
))}
)}
) }