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 (
Client Details
{client.email}
Phone
{client.phone}
Address
{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
{formatDate(client.createdAt)}
{formatCurrency(totalInvoiced)}
Total Invoiced
{paidInvoices}
Paid
{pendingInvoices}
Pending
{invoice.invoiceNumber}
{formatDate(invoice.issueDate)}
{formatCurrency(invoice.totalAmount)}