"use client"; import { FileText, Loader2 } from "lucide-react"; import { Card, CardContent, CardHeader, CardTitle } from "~/components/ui/card"; import { Button } from "~/components/ui/button"; import { cn } from "~/lib/utils"; import { api } from "~/trpc/react"; export type InvoicePdfPreviewInput = { invoiceNumber: string; invoicePrefix: string; businessId: string; clientId: string; issueDate: Date; dueDate: Date; status: "draft" | "sent" | "paid"; notes: string; emailMessage: string; taxRate: number; currency: string; items: Array<{ date: Date; description: string; hours: number; rate: number; }>; }; function canPreview(input: InvoicePdfPreviewInput | null): input is InvoicePdfPreviewInput { if (!input?.clientId) return false; if (input.items.length === 0) return false; return input.items.every((item) => item.description.trim().length > 0); } type InvoicePdfPreviewPanelProps = { input: InvoicePdfPreviewInput | null; enabled?: boolean; className?: string; heightClassName?: string; /** Renders only the preview body (no card/header) for embedding in a parent pane. */ embedded?: boolean; }; export function InvoicePdfPreviewPanel({ input, enabled = true, className, heightClassName = "h-[min(80vh,760px)]", embedded = false, }: InvoicePdfPreviewPanelProps) { const previewReady = canPreview(input); const { data: pdfPreview, isFetching, error, refetch } = api.invoices.previewPdf.useQuery(input!, { enabled: enabled && previewReady, refetchOnWindowFocus: false, staleTime: 5_000, }); const previewBody = (
{error.message}