import { useState } from "react"; import { useQuery } from "@tanstack/react-query"; import { useNavigate } from "react-router-dom"; import { Search, Users, Mail, Phone, DollarSign, Calendar, ChevronRight, Sparkles } from "lucide-react"; import { api } from "../lib/api"; import { PageHeader, Avatar, Spinner, EmptyState } from "../components/ui"; import { formatCurrency, formatDate, formatRelative } from "../lib/format"; import { CrmSyncPanel } from "../components/CrmSyncPanel"; export function ClientsPage() { const navigate = useNavigate(); const [q, setQ] = useState(""); const [debounced, setDebounced] = useState(""); const [timer, setTimer] = useState(null); const onChange = (v: string) => { setQ(v); if (timer) clearTimeout(timer); const t = setTimeout(() => setDebounced(v), 250); setTimer(t); }; const { data, isFetching } = useQuery({ queryKey: ["clients", debounced], queryFn: () => api.clients.list(debounced), }); return (
onChange(e.target.value)} /> {isFetching && }
{isFetching && !data ? (
) : !data?.clients.length ? ( ) : (
{/* Mobile card list */}
{data.clients.map((c) => ( ))}
{/* Desktop table */}
{data.clients.map((c) => ( navigate(`/clients/${c.id}`)} className="group cursor-pointer border-b border-slate-50 transition-colors hover:bg-slate-50/60" > ))}
Cliente Contacto Visitas Gasto total Última visita
{c.name} {c.tags?.split(",").map((t) => ( {t.trim()} ))}
Desde {formatDate(c.created_at)}
{c.phone && {c.phone}} {c.email && {c.email}}
{c.stats?.visits ?? 0} {formatCurrency(c.stats?.total_spent ?? 0)} {formatRelative(c.stats?.last_visit ?? null)}
Mostrando {data.clients.length} cliente{data.clients.length !== 1 ? "s" : ""}
)}
); }