import { createFileRoute, Link } from "@tanstack/react-router"; import { useEffect, useState } from "react"; import { ProtectedLayout } from "@/components/protected-layout"; import { PageContainer, PageHeader } from "@/components/app-shell"; import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Badge } from "@/components/ui/badge"; import { supabase } from "@/integrations/supabase/client"; import { ClientFormDialog } from "@/components/clients/client-form-dialog"; import { Plus, Search, Building2, User, Briefcase as Building } from "lucide-react"; import { formatDate } from "@/lib/format"; export const Route = createFileRoute("/clients/")({ component: () => ( ), }); function ClientsList() { const [clients, setClients] = useState([]); const [q, setQ] = useState(""); const [open, setOpen] = useState(false); const load = async () => { const { data } = await supabase .from("clients") .select("*") .order("name", { ascending: true }); setClients(data ?? []); }; useEffect(() => { load(); }, []); const filtered = clients.filter((c) => [c.name, c.management_company, c.primary_contact_name, c.primary_contact_email] .filter(Boolean) .join(" ") .toLowerCase() .includes(q.toLowerCase()), ); const typeIcon = (t: string) => t === "hoa" ? Building2 : t === "business" ? Building : User; return ( setOpen(true)}> New client } />
setQ(e.target.value)} placeholder="Search by name, contact, manager…" className="pl-9" />
{filtered.length === 0 && ( )} {filtered.map((c) => { const Icon = typeIcon(c.client_type); return ( ); })}
Name Type Contact Units Created
{clients.length === 0 ? "No clients yet. Add your first one." : "No matches."}
{c.name} {c.management_company && (
{c.management_company}
)}
{c.client_type} {c.primary_contact_name || "—"} {c.primary_contact_email && (
{c.primary_contact_email}
)}
{c.num_units ?? "—"} {formatDate(c.created_at)}
); }