'use client' import { useState } from 'react' import { Card, CardContent } from '@/components/ui/card' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { formatCurrency, formatDate } from '@/lib/utils' import { getCategoryDisplayName } from '@/lib/tax/expense-warnings' import { Search, ArrowUpRight, ArrowDownRight, ArrowLeftRight, Check, Link2, FileText } from 'lucide-react' import type { TransactionWithInvoice } from './transaction-types' import type { HistoryFilter } from './transaction-types' interface TransactionHistoryListProps { transactions: TransactionWithInvoice[] onOpenMatchDialog: (transaction: TransactionWithInvoice) => void onOpenCategoryDialog: (transaction: TransactionWithInvoice) => void } export default function TransactionHistoryList({ transactions, onOpenMatchDialog, onOpenCategoryDialog, }: TransactionHistoryListProps) { const [searchTerm, setSearchTerm] = useState('') const [filter, setFilter] = useState('all') const filtered = transactions.filter((t) => { const matchesSearch = t.description.toLowerCase().includes(searchTerm.toLowerCase()) const matchesFilter = filter === 'all' || (filter === 'business' && t.is_business === true) || (filter === 'private' && t.is_business === false) return matchesSearch && matchesFilter }) return (
{/* Search + filter pills */}
setSearchTerm(e.target.value)} className="pl-10" />
{(['all', 'business', 'private'] as const).map((f) => ( ))}
{/* Transaction list */} {filtered.length === 0 ? (

Inga transaktioner

{searchTerm ? 'Inga transaktioner matchar din sökning' : 'Inga transaktioner att visa med valt filter'}

) : (
{filtered.map((transaction) => (
{transaction.amount > 0 ? ( ) : ( )}

{transaction.description}

{formatDate(transaction.date)} {transaction.is_business !== null && !( transaction.is_business && transaction.category === 'uncategorized' && transaction.journal_entry_id ) && ( <> · {transaction.is_business ? getCategoryDisplayName(transaction.category) : 'Privat'} )} {transaction.invoice_id && ( <> · Kopplad till faktura )} {transaction.journal_entry_id ? ( <> · Bokförd ) : transaction.is_business === null ? ( <> · onOpenCategoryDialog(transaction)} > Ej bokförd ) : null} {transaction.potential_invoice && !transaction.invoice_id && ( <> · onOpenMatchDialog(transaction)} > Möjlig match: Faktura {transaction.potential_invoice.invoice_number} )}
{transaction.is_business === null && !transaction.journal_entry_id && ( )}

{transaction.amount > 0 ? '+' : ''} {formatCurrency(transaction.amount, transaction.currency)}

{transaction.currency !== 'SEK' && transaction.amount_sek && (

{formatCurrency(transaction.amount_sek)}

)}
))}
)}
) }