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
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}}
))}
)}
)
}