import { notFound } from "next/navigation"; import { api } from "~/trpc/server"; import { Card, CardContent, CardHeader, CardTitle } from "~/components/ui/card"; import { Button } from "~/components/ui/button"; import { Badge } from "~/components/ui/badge"; import Link from "next/link"; import { Edit, Mail, Phone, MapPin, Building, Calendar, DollarSign, } from "lucide-react"; interface ClientDetailPageProps { params: Promise<{ id: string }>; } export default async function ClientDetailPage({ params, }: ClientDetailPageProps) { const { id } = await params; const client = await api.clients.getById({ id }); if (!client) { notFound(); } const formatDate = (date: Date) => { return new Intl.DateTimeFormat("en-US", { year: "numeric", month: "long", day: "numeric", }).format(date); }; const formatCurrency = (amount: number) => { return new Intl.NumberFormat("en-US", { style: "currency", currency: "USD", }).format(amount); }; const totalInvoiced = client.invoices?.reduce((sum, invoice) => sum + invoice.totalAmount, 0) || 0; const paidInvoices = client.invoices?.filter((invoice) => invoice.status === "paid").length || 0; const pendingInvoices = client.invoices?.filter((invoice) => invoice.status === "sent").length || 0; return (
{/* Header */}

{client.name}

Client Details

{/* Client Information Card */}
Contact Information {/* Basic Info */}
{client.email && (

Email

{client.email}

)} {client.phone && (

Phone

{client.phone}

)}
{/* Address */} {(client.addressLine1 ?? client.city ?? client.state) && (

Address

{client.addressLine1 &&

{client.addressLine1}

} {client.addressLine2 &&

{client.addressLine2}

} {(client.city ?? client.state ?? client.postalCode) && (

{[client.city, client.state, client.postalCode] .filter(Boolean) .join(", ")}

)} {client.country &&

{client.country}

}
)} {/* Client Since */}

Client Since

{formatDate(client.createdAt)}

{/* Stats Card */}
Invoice Summary

{formatCurrency(totalInvoiced)}

Total Invoiced

{paidInvoices}

Paid

{pendingInvoices}

Pending

{/* Recent Invoices */} {client.invoices && client.invoices.length > 0 && ( Recent Invoices
{client.invoices.slice(0, 3).map((invoice) => (

{invoice.invoiceNumber}

{formatDate(invoice.issueDate)}

{formatCurrency(invoice.totalAmount)}

{invoice.status}
))}
)}
); }