"use client"; import { useState } from "react"; import Link from "next/link"; import { api } from "~/trpc/react"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "~/components/ui/card"; import { Button } from "~/components/ui/button"; import { Input } from "~/components/ui/input"; import { Label } from "~/components/ui/label"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "~/components/ui/dialog"; import { toast } from "sonner"; import { FileText, Calendar, DollarSign, Edit, Trash2, Eye, Plus, User } from "lucide-react"; const statusColors = { draft: "bg-gray-100 text-gray-800", sent: "bg-blue-100 text-blue-800", paid: "bg-green-100 text-green-800", overdue: "bg-red-100 text-red-800", }; const statusLabels = { draft: "Draft", sent: "Sent", paid: "Paid", overdue: "Overdue", }; export function InvoiceList() { const [searchTerm, setSearchTerm] = useState(""); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const [invoiceToDelete, setInvoiceToDelete] = useState(null); const { data: invoices, isLoading, refetch } = api.invoices.getAll.useQuery(); const deleteInvoice = api.invoices.delete.useMutation({ onSuccess: () => { toast.success("Invoice deleted successfully"); refetch(); setDeleteDialogOpen(false); setInvoiceToDelete(null); }, onError: (error) => { toast.error(error.message || "Failed to delete invoice"); }, }); const filteredInvoices = invoices?.filter(invoice => invoice.invoiceNumber.toLowerCase().includes(searchTerm.toLowerCase()) || invoice.client.name.toLowerCase().includes(searchTerm.toLowerCase()) ) || []; const handleDelete = (invoiceId: string) => { setInvoiceToDelete(invoiceId); setDeleteDialogOpen(true); }; const confirmDelete = () => { if (invoiceToDelete) { deleteInvoice.mutate({ id: invoiceToDelete }); } }; const formatDate = (date: Date) => { return new Date(date).toLocaleDateString(); }; const formatCurrency = (amount: number) => { return new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', }).format(amount); }; if (isLoading) { return (
{[...Array(3)].map((_, i) => (
))}
); } if (!invoices || invoices.length === 0) { return ( No Invoices Yet Get started by creating your first invoice ); } return (
setSearchTerm(e.target.value)} />
{filteredInvoices.map((invoice) => ( {invoice.invoiceNumber}
{statusLabels[invoice.status as keyof typeof statusLabels]} {formatCurrency(invoice.totalAmount)}
{invoice.client.name}
Due: {formatDate(invoice.dueDate)}
{invoice.items.length} item{invoice.items.length !== 1 ? 's' : ''}
))}
Delete Invoice Are you sure you want to delete this invoice? This action cannot be undone.
); }