"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";
}