import {useState, useEffect} from 'react'; import {Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle} from '@/components/ui/dialog'; import {Select, SelectContent, SelectItem, SelectTrigger, SelectValue} from '@/components/ui/select'; import {Button} from '@/components/ui/button'; import {useAppDispatch, updateInvoiceStatus, removeInvoice, type Invoice, type Client} from '@/store'; import {formatCurrency} from '@/lib/formatters'; import {format} from 'date-fns'; interface Props { open: boolean; onOpenChange: (open: boolean) => void; invoice: Invoice | null; clients: Client[]; } const statusColors: Record = { draft: 'text-gray-400', sent: 'text-blue-400', paid: 'text-green-400', overdue: 'text-red-400', cancelled: 'text-gray-500' }; export default function InvoiceDetailsDialog({open, onOpenChange, invoice, clients}: Props) { const dispatch = useAppDispatch(); const [selectedStatus, setSelectedStatus] = useState('draft'); // Sync status when invoice changes - intentional pattern for controlled form dialogs useEffect(() => { if (invoice) { // eslint-disable-next-line react-hooks/set-state-in-effect -- intentional pattern for form dialog setSelectedStatus(invoice.status); } }, [invoice]); const handleStatusChange = () => { if (!invoice) return; if (selectedStatus !== invoice.status) { dispatch(updateInvoiceStatus({id: invoice.id, status: selectedStatus})); } onOpenChange(false); }; const handleDelete = () => { if (!invoice) return; if (confirm(`Are you sure you want to delete invoice ${invoice.invoiceNumber}?`)) { dispatch(removeInvoice(invoice.id)); onOpenChange(false); } }; if (!invoice) return null; const client = clients.find(c => c.id === invoice.clientId); return ( Invoice {invoice.invoiceNumber} {invoice.status} View invoice details and update status
{/* Client Info */}

Client

{client?.name || 'Unknown'}

{client?.email}

Dates

Issued: {format(new Date(invoice.issueDate), 'MMM d, yyyy')}

Due: {format(new Date(invoice.dueDate), 'MMM d, yyyy')}

{/* Line Items */}

Line Items

{invoice.lineItems.map(item => (

{item.description}

{item.quantity} × {formatCurrency(item.unitPrice)}

{formatCurrency(item.total)}

))}
Subtotal {formatCurrency(invoice.subtotal)}
{invoice.tax > 0 && (
Tax {formatCurrency(invoice.tax)}
)}
Total {formatCurrency(invoice.total)}
{/* Notes */} {invoice.notes && (

Notes

{invoice.notes}

)} {/* Status Update */}

Update Status

); }