import React, { useState, useEffect, useMemo } from 'react'; import { CheckCircle2, Loader2, Link2, Search, Plus, } from 'lucide-react'; import { cn } from '@/lib/utils'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; export function transactionDate(tx) { return tx?.posted_date || String(tx?.transacted_at || '').slice(0, 10) || '—'; } export function transactionTitle(tx) { return tx?.payee || tx?.description || tx?.memo || 'Transaction'; } export function formatTransactionAmount(amount, currency = 'USD') { const value = Math.abs(Number(amount || 0)) / 100; const sign = Number(amount || 0) < 0 ? '-' : '+'; return `${sign}${new Intl.NumberFormat(undefined, { style: 'currency', currency: currency || 'USD', }).format(value)}`; } export function MatchBillDialog({ open, onOpenChange, transaction, bills, onConfirm, loading, onCreateBill }) { const [query, setQuery] = useState(''); const [selectedBillId, setSelectedBillId] = useState(''); useEffect(() => { if (open) { setQuery(''); setSelectedBillId(transaction?.matched_bill_id ? String(transaction.matched_bill_id) : ''); } }, [open, transaction?.id, transaction?.matched_bill_id]); const filteredBills = useMemo(() => { const q = query.trim().toLowerCase(); if (!q) return bills.slice(0, 40); return bills .filter(bill => String(bill.name || '').toLowerCase().includes(q)) .slice(0, 40); }, [bills, query]); const selectedBill = bills.find(bill => String(bill.id) === String(selectedBillId)); return ( Match Transaction Choose the bill this transaction paid. Nothing changes until you confirm. {transaction && (

{transactionTitle(transaction)}

{transactionDate(transaction)} · {transaction.source_label || transaction.source_type_label || 'Transaction'}

{formatTransactionAmount(transaction.amount, transaction.currency)}

{transaction.description && transaction.description !== transactionTitle(transaction) && (

{transaction.description}

)}
)}
{filteredBills.length === 0 ? (

No bills found.

{onCreateBill && (() => { const af = transaction?.advisory_filter; const label = query.trim() ? `Create "${query.trim()}" as a new bill` : 'Create a new bill'; if (af?.confidence === 'high') { return ( Probably not a bill ·{' '} ); } return ( ); })()}
) : (
{filteredBills.map(bill => ( ))}
)}
{onCreateBill && (() => { const af = transaction?.advisory_filter; if (af?.confidence === 'high') { return ( Probably not a bill ); } return ( ); })()}
); }