"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 { StatusBadge, type StatusType } from "~/components/ui/status-badge"; import { toast } from "sonner"; import { FileText, Calendar, DollarSign, Edit, Trash2, Eye, Plus, User, } from "lucide-react"; 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}
{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.
); }