import { useEffect, useState } from 'react' import { useNavigate } from 'react-router-dom' import { useAppPath } from '@core/hooks/useAppPath' import { apiFetch } from '@core/lib/api' import { Input } from '@core/components/ui/input' import { Badge } from '@core/components/ui/badge' import { Skeleton } from '@core/components/ui/skeleton' import { Button } from '@core/components/ui/button' import { Building2, ChevronRight } from 'lucide-react' interface Account { id: string slug: string display_name?: string created_at: string data?: { segment?: string status?: string lifecycle_stage?: string lead_score?: number temperature?: 'cold' | 'warm' | 'hot' last_signal_at?: string } } type Filter = 'all' export default function AccountsPage() { const navigate = useNavigate() const appPath = useAppPath() const [accounts, setAccounts] = useState([]) const [loading, setLoading] = useState(true) const [search, setSearch] = useState('') const [filter] = useState('all') useEffect(() => { apiFetch('/api/admin-data?action=list&entity=accounts&limit=500') .then(r => r.json()) .then(json => setAccounts(Array.isArray(json?.data) ? json.data : Array.isArray(json) ? json : [])) .catch(() => setAccounts([])) .finally(() => setLoading(false)) }, []) const filtered = accounts.filter(a => { const q = search.toLowerCase() return !q || (a.display_name || a.slug || '').toLowerCase().includes(q) }) return (

Accounts

{accounts.length} accounts

setSearch(e.target.value)} placeholder="Search accounts…" className="w-72" />
{loading ? (
{Array.from({ length: 5 }).map((_, i) => )}
) : filtered.length === 0 ? (

{search ? 'No accounts match your search.' : 'No accounts yet.'}

) : ( {filtered.map(account => ( navigate(appPath(`/crm/accounts/${account.id}`))} className="hover:bg-accent/50 cursor-pointer transition-colors" > ))}
Account Stage Score Temp Last Signal
{account.display_name || account.slug}
{account.slug}
{account.data?.lifecycle_stage ? ( {account.data.lifecycle_stage.replace(/_/g, ' ')} ) : ( )} {account.data?.lead_score !== undefined ? (
= 70 ? 'bg-green-500' : account.data.lead_score >= 40 ? 'bg-yellow-500' : 'bg-gray-400' }`} style={{ width: `${Math.min(account.data.lead_score, 100)}%` }} />
{account.data.lead_score}
) : ( )}
{account.data?.temperature ? ( {account.data.temperature} ) : ( )} {account.data?.last_signal_at ? new Date(account.data.last_signal_at).toLocaleDateString() : 'Never' }
)}
) }