"use client"; import { useEffect, useState } from "react"; import { currencyFormatter, formatCondition, formatDate, formatPeriod, } from "@/features/transactions/formatting-helpers"; import { TransactionTypeBadge } from "@/shared/components/transaction-type-badge"; import { Badge } from "@/shared/components/ui/badge"; import { Button } from "@/shared/components/ui/button"; import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/shared/components/ui/dialog"; import { Separator } from "@/shared/components/ui/separator"; import { parseLocalDateString } from "@/shared/utils/date"; import { getPaymentMethodIcon } from "@/shared/utils/icons"; import { AttachmentSection } from "../attachments/attachment-section"; import { InstallmentTimeline } from "../shared/installment-timeline"; import type { TransactionItem } from "../types"; interface TransactionDetailsDialogProps { open: boolean; onOpenChange: (open: boolean) => void; transaction: TransactionItem | null; onEdit?: (transaction: TransactionItem) => void; } export function TransactionDetailsDialog({ open, onOpenChange, transaction, onEdit, }: TransactionDetailsDialogProps) { const [attachmentCount, setAttachmentCount] = useState(null); // biome-ignore lint/correctness/useExhaustiveDependencies: transaction?.id é trigger intencional para reset do contador useEffect(() => { setAttachmentCount(null); }, [transaction?.id]); if (!transaction) return null; const isInstallment = transaction.condition?.toLowerCase() === "parcelado" && transaction.currentInstallment && transaction.installmentCount; const valorParcela = Math.abs(transaction.amount); const totalParcelas = transaction.installmentCount ?? 1; const parcelaAtual = transaction.currentInstallment ?? 1; const valorTotal = isInstallment ? valorParcela * totalParcelas : valorParcela; const valorRestante = isInstallment ? valorParcela * (totalParcelas - parcelaAtual) : 0; const isBoleto = transaction.paymentMethod === "Boleto"; const handleEdit = () => { onOpenChange(false); onEdit?.(transaction); }; return ( {transaction.name} {formatDate(transaction.purchaseDate)}

Resumo

{currencyFormatter.format(valorTotal)}

{transaction.isSettled ? "Pago" : "Pendente"}
{formatCondition(transaction.condition)}

Detalhes

  • Forma de Pagamento {getPaymentMethodIcon(transaction.paymentMethod)} {transaction.paymentMethod}
  • Responsável {transaction.pagadorName}
  • {isBoleto && transaction.dueDate && ( )} {transaction.isDivided && (
  • Divisão Dividido
  • )}

Valores

    {isInstallment && (
  • )} {isInstallment && ( )} {transaction.recurrenceCount && ( )}
{transaction.note ? (

Notas

{transaction.note}
) : null} {attachmentCount !== 0 && (

Anexos

)}
{onEdit && !transaction.readonly && ( )}
); } interface DetailRowProps { label: string; value: string; } function DetailRow({ label, value }: DetailRowProps) { return (
  • {label} {value}
  • ); }