"use client"; import { RiArrowLeftRightLine, RiArrowRightDownLine, RiArrowRightUpLine, RiAttachment2, RiCalendarEventLine, RiChat1Line, RiGroupLine, RiTimeLine, } from "@remixicon/react"; import Image from "next/image"; import type { ReactNode } from "react"; import { EstablishmentLogo } from "@/shared/components/entity-avatar"; import MoneyValues from "@/shared/components/money-values"; import { Badge } from "@/shared/components/ui/badge"; import { Tooltip, TooltipContent, TooltipTrigger, } from "@/shared/components/ui/tooltip"; import { formatDate, formatDateGroupLabel } from "@/shared/utils/date"; import { getConditionIcon, getPaymentMethodIcon } from "@/shared/utils/icons"; import { cn } from "@/shared/utils/ui"; import type { TransactionItem } from "../types"; import { TransactionActionsMenu } from "./transaction-actions-menu"; import { TransactionSettlementButton } from "./transaction-settlement-button"; type TransactionsMobileListProps = { data: TransactionItem[]; currentUserId: string; onEdit?: (item: TransactionItem) => void; onCopy?: (item: TransactionItem) => void; onImport?: (item: TransactionItem) => void; onConfirmDelete?: (item: TransactionItem) => void; onViewDetails?: (item: TransactionItem) => void; onRefund?: (item: TransactionItem) => void; onToggleSettlement?: (item: TransactionItem) => void; onAnticipate?: (item: TransactionItem) => void; onViewAnticipationHistory?: (item: TransactionItem) => void; onConvertToInstallment?: (item: TransactionItem) => void; onConvertToRecurring?: (item: TransactionItem) => void; isSettlementLoading: (id: string) => boolean; showActions?: boolean; showDateGroups?: boolean; }; export function TransactionsMobileList({ data, currentUserId, onEdit, onCopy, onImport, onConfirmDelete, onViewDetails, onRefund, onToggleSettlement, onAnticipate, onViewAnticipationHistory, onConvertToInstallment, onConvertToRecurring, isSettlementLoading, showActions = true, showDateGroups = true, }: TransactionsMobileListProps) { const groups = data.reduce< Array<{ date: string; label: string; items: TransactionItem[] }> >((acc, item) => { const date = item.purchaseDate?.slice(0, 10) ?? ""; const existingGroup = acc.find((group) => group.date === date); if (existingGroup) { existingGroup.items.push(item); return acc; } acc.push({ date, label: formatDateGroupLabel(item.purchaseDate), items: [item], }); return acc; }, []); if (!showDateGroups) { return (
{data.map((item) => ( ))}
); } return (
{groups.map((group, groupIndex) => (
{group.label}
{group.items.map((item) => ( ))}
))}
); } type TransactionMobileCardProps = Omit & { item: TransactionItem; showDate?: boolean; }; function TransactionMobileCard({ item, currentUserId, onEdit, onCopy, onImport, onConfirmDelete, onViewDetails, onRefund, onToggleSettlement, onAnticipate, onViewAnticipationHistory, onConvertToInstallment, onConvertToRecurring, isSettlementLoading, showActions = true, showDate = false, }: TransactionMobileCardProps) { const installmentBadge = item.currentInstallment && item.installmentCount ? `${item.currentInstallment} de ${item.installmentCount}` : null; const isBoleto = item.paymentMethod === "Boleto" && item.dueDate; const dueDateLabel = isBoleto && item.dueDate ? `Venc. ${formatDate(item.dueDate)}` : null; const hasNote = Boolean(item.note?.trim().length); const isLastInstallment = item.currentInstallment === item.installmentCount && item.installmentCount && item.installmentCount > 1; const isReceita = item.transactionType === "Receita"; const isTransfer = item.transactionType === "Transferência"; const isIncomingTransfer = isTransfer && Number(item.amount) > 0; const payerLabel = item.pagadorName?.trim() || "Sem pessoa"; const payerDisplayName = payerLabel.split(/\s+/)[0] ?? payerLabel; const paymentMethodLabel = item.paymentMethod === "Transferência bancária" ? "Transf. bancária" : item.paymentMethod; const type = item.categoriaName === "Saldo inicial" ? "Saldo inicial" : item.transactionType; return (

{item.name}

{showDate ? ( {formatDate(item.purchaseDate)} ) : null} {dueDateLabel ? ( {dueDateLabel} ) : null} {payerDisplayName}
{getTransactionTypeIcon(type)} {getPaymentMethodIcon(item.paymentMethod)} {getConditionIcon(item.condition)} {installmentBadge ? ( {installmentBadge} ) : null} {item.isDivided ? ( ) : null} {isLastInstallment ? ( Última parcela Última parcela! ) : null} {item.isAnticipated ? ( ) : null} {hasNote ? ( Ver anotação {item.note} ) : null} {item.hasAttachments ? ( ) : null}
{showActions ? (
) : null}
); } function IconBadge({ label, children, compact = false, className, }: { label: string; children: ReactNode; compact?: boolean; className?: string; }) { if (!children) return null; return ( {children} {compact ? {label} : label} {label} ); } function getTransactionTypeIcon(type: string) { if (type === "Receita" || type === "Saldo inicial") { return ; } if (type === "Transferência") { return ; } return ; } function getTransactionTypeIconClassName(type: string) { if (type === "Receita" || type === "Saldo inicial") { return "border-success/30 bg-success/5 text-success"; } if (type === "Transferência") { return "border-info/30 bg-info/5 text-info"; } return "border-destructive/30 bg-destructive/5 text-destructive"; }