'use client' import { motion } from 'framer-motion' import { Card, CardContent } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { Checkbox } from '@/components/ui/checkbox' import { formatCurrency, formatDate } from '@/lib/utils' import { ArrowUpRight, ArrowDownRight, FileText, Loader2 } from 'lucide-react' import { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from '@/components/ui/info-tooltip' import type { TransactionWithInvoice, CategorizeHandler } from './transaction-types' import type { SuggestedCategory } from '@/lib/transactions/category-suggestions' interface TransactionInboxCardProps { transaction: TransactionWithInvoice suggestions?: SuggestedCategory[] processingId: string | null isBatchMode: boolean isSelected: boolean entityType?: string onCategorize: CategorizeHandler onMarkPrivate: (id: string) => void onOpenMatchDialog: (transaction: TransactionWithInvoice) => void onOpenCategoryDialog: (transaction: TransactionWithInvoice) => void onOpenQuickReview?: (transaction: TransactionWithInvoice, suggestion: SuggestedCategory) => void onToggleSelect: (id: string) => void onAnimationComplete?: (id: string) => void } export default function TransactionInboxCard({ transaction, suggestions, processingId, isBatchMode, isSelected, entityType = 'enskild_firma', onCategorize, onMarkPrivate, onOpenMatchDialog, onOpenCategoryDialog, onOpenQuickReview, onToggleSelect, onAnimationComplete, }: TransactionInboxCardProps) { const isProcessing = processingId === transaction.id const isDisabled = processingId !== null && processingId !== transaction.id const isIncome = transaction.amount > 0 const hasInvoiceMatch = !!transaction.potential_invoice && !transaction.invoice_id const topSuggestion = suggestions?.[0] const isUncategorized = transaction.is_business === null && !transaction.journal_entry_id const showCheckbox = isBatchMode && isUncategorized function handleSuggestionClick(suggestion: SuggestedCategory) { if (onOpenQuickReview) { onOpenQuickReview(transaction, suggestion) } else { onCategorize(transaction.id, true, suggestion.category) } } return ( { // Only call on exit animation if (typeof definition === 'object' && 'opacity' in definition && definition.opacity === 0) { onAnimationComplete?.(transaction.id) } }} > onToggleSelect(transaction.id) : undefined} >
{/* Left: checkbox + icon + info */}
{showCheckbox && ( onToggleSelect(transaction.id)} onClick={(e) => e.stopPropagation()} className="mt-1" /> )}
{isIncome ? ( ) : ( )}

{transaction.description}

{formatDate(transaction.date)}

{/* Right: amount */}

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

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

{formatCurrency(transaction.amount_sek)}

)}
{/* Inline action buttons - only shown when not in batch mode */} {!isBatchMode && (
{/* Primary action: invoice match or top suggestion */} {hasInvoiceMatch ? ( ) : topSuggestion ? ( ) : null} {/* Secondary suggestions (up to 1 more) */} {!hasInvoiceMatch && suggestions && suggestions.length > 1 && ( )} {/* Private button */}

{entityType === 'aktiebolag' ? 'Privat utgift med företagets kort \u2014 bokförs som skuld till ägaren (konto 2893)' : 'Privat uttag \u2014 bokförs mot konto 2013 (Övriga egna uttag)'}

{/* Open category dialog */}
)}
) }