import { redirect } from "next/navigation" import { eq, asc } from "drizzle-orm" import { db } from "@/lib/db" import { leases as leasesTable } from "@/lib/db/schema" import { getSessionUser } from "@/lib/session" import Link from "next/link" import { FileText, AlertTriangle, ArrowRight } from "lucide-react" import { EmptyState } from "@/components/shared/empty-state" import { formatDate, daysUntil } from "@/lib/utils" import { cn } from "@/lib/utils" export const metadata = { title: "Leases" } const statusColors: Record = { active: "text-emerald-400 bg-emerald-500/10 border-emerald-500/20", expired: "text-red-400 bg-red-500/10 border-red-500/20", terminated: "text-white/40 bg-white/5 border-white/10", renewed: "text-blue-400 bg-blue-500/10 border-blue-500/20", } function DaysChip({ days, status }: { days: number; status: string }) { if (status !== "active") return if (days <= 0) return Expired const color = days <= 7 ? "text-red-400" : days <= 30 ? "text-amber-400" : days <= 60 ? "text-yellow-400" : "text-white/40" return ( {days}d {days <= 60 && } ) } export default async function LeasesPage() { const user = await getSessionUser() if (!user) redirect("/login") const leases = await db.query.leases.findMany({ where: eq(leasesTable.user_id, user.id), with: { tenant: { columns: { first_name: true, last_name: true } }, property: { columns: { name: true } }, unit: { columns: { unit_number: true } }, }, orderBy: asc(leasesTable.lease_end), }) const active = leases?.filter((l: any) => l.status === "active").length ?? 0 const expiring = leases?.filter((l: any) => l.status === "active" && daysUntil(l.lease_end) <= 60).length ?? 0 const expired = leases?.filter((l: any) => l.status === "expired").length ?? 0 return (
{/* Stats */}
{[ { label: "Active", value: active, color: "text-emerald-400" }, { label: "Expiring (60 days)", value: expiring, color: "text-amber-400" }, { label: "Expired", value: expired, color: "text-red-400" }, ].map((s) => (

{s.label}

{s.value}

))}
{!leases?.length ? ( ) : ( <> {/* Desktop table */}
{["Tenant", "Property / Unit", "Period", "Rent", "Status", "Ends in", ""].map((h) => ( ))} {leases.map((lease) => { const days = daysUntil(lease.lease_end) const canRenew = (lease.status === "active" && days <= 60) || lease.status === "expired" return ( ) })}
{h}

{lease.tenant?.first_name} {lease.tenant?.last_name}

{lease.property?.name}

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

{formatDate(lease.lease_start)}

→ {formatDate(lease.lease_end)}

${lease.rent_amount}/mo

{lease.status} {canRenew && ( Renew )}
{/* Mobile cards */}
{leases.map((lease) => { const days = daysUntil(lease.lease_end) const canRenew = (lease.status === "active" && days <= 60) || lease.status === "expired" return (

{lease.tenant?.first_name} {lease.tenant?.last_name}

{lease.property?.name} · Unit {lease.unit?.unit_number ?? "—"}

{lease.status}
{formatDate(lease.lease_start)} → {formatDate(lease.lease_end)} ${lease.rent_amount}/mo
{canRenew && ( Renew → )}
) })}
)}
) }