"use client" import { useState } from "react" import Link from "next/link" import { Mail, Search, ArrowRight, ArrowUpDown, ArrowUp, ArrowDown } from "lucide-react" import { formatDate, formatCurrency } from "@/lib/utils" import { DeleteTenantButton } from "@/components/forms/delete-tenant-button" type SortKey = "name" | "property" | "move_in" | "rent" type SortDir = "asc" | "desc" function SortIcon({ col, active, dir }: { col: SortKey; active: SortKey; dir: SortDir }) { if (active !== col) return return dir === "asc" ? : } export function TenantsTable({ tenants }: { tenants: any[] }) { const [search, setSearch] = useState("") const [sortKey, setSortKey] = useState("name") const [sortDir, setSortDir] = useState("asc") function toggleSort(key: SortKey) { if (sortKey === key) setSortDir((d) => (d === "asc" ? "desc" : "asc")) else { setSortKey(key); setSortDir("asc") } } const filtered = tenants .filter((t) => { const q = search.toLowerCase() return ( !q || `${t.first_name} ${t.last_name}`.toLowerCase().includes(q) || t.email?.toLowerCase().includes(q) || t.property?.name?.toLowerCase().includes(q) ) }) .sort((a, b) => { let av: string | number = "" let bv: string | number = "" if (sortKey === "name") { av = `${a.first_name} ${a.last_name}`; bv = `${b.first_name} ${b.last_name}` } if (sortKey === "property") { av = a.property?.name ?? ""; bv = b.property?.name ?? "" } if (sortKey === "move_in") { av = a.move_in_date ?? ""; bv = b.move_in_date ?? "" } if (sortKey === "rent") { av = a.unit?.rent_amount ?? 0; bv = b.unit?.rent_amount ?? 0 } if (av < bv) return sortDir === "asc" ? -1 : 1 if (av > bv) return sortDir === "asc" ? 1 : -1 return 0 }) const th = (label: string, key: SortKey) => ( toggleSort(key)} > {label} ) return (
{/* Search */}
setSearch(e.target.value)} placeholder="Search by name, email or property…" className="w-full rounded-xl border border-white/[0.08] bg-white/[0.03] py-2.5 pl-10 pr-4 text-sm text-white placeholder-white/25 outline-none transition focus:border-indigo-500/50 focus:bg-white/[0.05] focus:ring-1 focus:ring-indigo-500/30" />
{filtered.length === 0 ? (

No tenants match “{search}”

) : ( <> {/* Desktop table */}
{th("Tenant", "name")} {th("Property / Unit", "property")} {th("Move In", "move_in")} {th("Rent / mo", "rent")} {filtered.map((tenant) => ( ))}
{tenant.first_name?.[0]}{tenant.last_name?.[0]}

{tenant.first_name} {tenant.last_name}

{tenant.email && ( {tenant.email} )}

{tenant.property?.name ?? "—"}

Unit {tenant.unit?.unit_number ?? "—"}

{tenant.move_in_date ? formatDate(tenant.move_in_date) : "—"}

{tenant.unit?.rent_amount ? formatCurrency(tenant.unit.rent_amount) : "—"}

View
{/* Mobile cards */}
{filtered.map((tenant) => (
{tenant.first_name?.[0]}{tenant.last_name?.[0]}

{tenant.first_name} {tenant.last_name}

{tenant.property?.name && {tenant.property.name}} {tenant.unit?.unit_number && · Unit {tenant.unit.unit_number}}
{tenant.unit?.rent_amount && (

{formatCurrency(tenant.unit.rent_amount)}

)}

per mo

))}
)}
) }