"use client" import { useState } from "react" import { ChevronLeft, ChevronRight, CreditCard, FileText } from "lucide-react" import { cn, formatCurrency } from "@/lib/utils" const DAYS = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] const MONTHS = ["January","February","March","April","May","June","July","August","September","October","November","December"] interface CalendarClientProps { payments: any[] leases: any[] } export function CalendarClient({ payments, leases }: CalendarClientProps) { const today = new Date() const [year, setYear] = useState(today.getFullYear()) const [month, setMonth] = useState(today.getMonth()) const [selected, setSelected] = useState(null) function prevMonth() { if (month === 0) { setMonth(11); setYear(y => y - 1) } else setMonth(m => m - 1) } function nextMonth() { if (month === 11) { setMonth(0); setYear(y => y + 1) } else setMonth(m => m + 1) } // Build calendar grid const firstDay = new Date(year, month, 1).getDay() const daysInMonth = new Date(year, month + 1, 0).getDate() const cells: (number | null)[] = [ ...Array(firstDay).fill(null), ...Array.from({ length: daysInMonth }, (_, i) => i + 1), ] // Pad to complete last row while (cells.length % 7 !== 0) cells.push(null) function dateKey(day: number) { return `${year}-${String(month + 1).padStart(2, "0")}-${String(day).padStart(2, "0")}` } // Group events by date const eventsByDate: Record = {} for (const p of payments) { const key = p.due_date?.slice(0, 10) if (!key) continue if (!eventsByDate[key]) eventsByDate[key] = [] eventsByDate[key].push({ type: "payment", item: p }) } for (const l of leases) { const key = l.lease_end?.slice(0, 10) if (!key) continue if (!eventsByDate[key]) eventsByDate[key] = [] eventsByDate[key].push({ type: "lease", item: l }) } const selectedEvents = selected ? (eventsByDate[selected] ?? []) : [] const todayKey = `${today.getFullYear()}-${String(today.getMonth() + 1).padStart(2, "0")}-${String(today.getDate()).padStart(2, "0")}` return (
{/* Calendar grid */}
{/* Month nav */}

{MONTHS[month]} {year}

{/* Day headers */}
{DAYS.map((d) => (
{d}
))}
{/* Days */}
{cells.map((day, i) => { const key = day ? dateKey(day) : null const events = key ? (eventsByDate[key] ?? []) : [] const isToday = key === todayKey const isSelected = key === selected const paymentEvents = events.filter((e) => e.type === "payment") const leaseEvents = events.filter((e) => e.type === "lease") return (
day && key && setSelected(isSelected ? null : key)} className={cn( "relative min-h-[72px] border-b border-r border-white/[0.03] p-1.5 transition-colors", day ? "cursor-pointer hover:bg-white/[0.03]" : "opacity-0 pointer-events-none", isSelected && "bg-indigo-600/10 border-indigo-500/20", )} > {day && ( <> {day}
{paymentEvents.slice(0, 2).map((e, j) => (
{e.item.tenant?.first_name} {formatCurrency(e.item.amount)}
))} {leaseEvents.slice(0, 1).map((e, j) => (
Lease ends: {e.item.tenant?.first_name}
))} {events.length > 3 && (
+{events.length - 3} more
)}
)}
) })}
{/* Side panel */}

{selected ? new Date(selected + "T12:00:00").toLocaleDateString("en-US", { weekday: "long", month: "long", day: "numeric" }) : "Select a date"}

{!selected ? (

Click any day to see events

) : selectedEvents.length === 0 ? (

No events this day

) : (
{selectedEvents.map((e, i) => (
{e.type === "payment" ? : }
{e.type === "payment" ? ( <>

{e.item.tenant?.first_name} {e.item.tenant?.last_name}

{formatCurrency(e.item.amount)} due

{e.item.status} ) : ( <>

Lease Expiry

{e.item.tenant?.first_name} {e.item.tenant?.last_name}

{e.item.property?.name}

)}
))}
)} {/* Legend */}

Legend

{[ { color: "bg-indigo-500/20 text-indigo-400", label: "Rent pending" }, { color: "bg-emerald-500/20 text-emerald-400", label: "Rent paid" }, { color: "bg-red-500/20 text-red-400", label: "Rent overdue" }, { color: "bg-amber-500/20 text-amber-400", label: "Lease expiry" }, ].map((l) => (
{l.label}
))}
) }