"use client"; import { RiArrowGoBackLine, RiCheckLine, RiDeleteBinLine, RiFileList2Line, } from "@remixicon/react"; import { format, formatDistanceToNow } from "date-fns"; import { ptBR } from "date-fns/locale"; import Image from "next/image"; import { memo } from "react"; import MoneyValues from "@/shared/components/money-values"; import { Badge } from "@/shared/components/ui/badge"; import { Button } from "@/shared/components/ui/button"; import { Card, CardContent, CardFooter, CardHeader, CardTitle, } from "@/shared/components/ui/card"; import { Checkbox } from "@/shared/components/ui/checkbox"; import { Tooltip, TooltipContent, TooltipTrigger, } from "@/shared/components/ui/tooltip"; import { resolveLogoSrc } from "@/shared/lib/logo"; import type { InboxItem } from "./types"; const DEFAULT_INBOX_APP_LOGO = "/avatars/default_icon.png"; function findMatchingLogo( sourceAppName: string | null, appLogoMap: Record, ): string | null { if (!sourceAppName) return null; const appName = sourceAppName.toLowerCase(); if (appLogoMap[appName]) return resolveLogoSrc(appLogoMap[appName]); for (const [name, logo] of Object.entries(appLogoMap)) { if (name.includes(appName) || appName.includes(name)) { return resolveLogoSrc(logo); } } return null; } interface InboxCardProps { item: InboxItem; readonly?: boolean; appLogoMap?: Record; onProcess?: (item: InboxItem) => void; onDiscard?: (item: InboxItem) => void; onViewDetails?: (item: InboxItem) => void; onDelete?: (item: InboxItem) => void; onRestoreToPending?: (item: InboxItem) => void | Promise; selected?: boolean; onSelectToggle?: (id: string) => void; } export const InboxCard = memo(function InboxCard({ item, readonly, appLogoMap, onProcess, onDiscard, onViewDetails, onDelete, onRestoreToPending, selected, onSelectToggle, }: InboxCardProps) { const matchedLogo = appLogoMap ? findMatchingLogo(item.sourceAppName, appLogoMap) : null; const displayLogo = matchedLogo ?? DEFAULT_INBOX_APP_LOGO; const amount = item.parsedAmount ? parseFloat(item.parsedAmount) : null; const createdAtDate = new Date(item.createdAt); const timeAgo = formatDistanceToNow(createdAtDate, { addSuffix: true, locale: ptBR, }); const fullDate = format(createdAtDate, "PPpp", { locale: ptBR }); const statusDate = item.status === "processed" ? item.processedAt : item.status === "discarded" ? item.discardedAt : null; const formattedStatusDate = statusDate ? format(new Date(statusDate), "dd/MM/yyyy 'às' HH:mm", { locale: ptBR }) : null; return (
{onSelectToggle && ( onSelectToggle(item.id)} aria-label="Selecionar item" className="shrink-0" /> )}
{item.sourceAppName
{item.sourceAppName || item.sourceApp} {timeAgo} {fullDate}
{amount !== null && ( )}
{item.originalTitle && (

{item.originalTitle}

)}

{item.originalText}

{readonly ? ( {item.status === "processed" ? "Processado" : "Descartado"} {formattedStatusDate && ( {formattedStatusDate} )}
{item.status === "discarded" && onRestoreToPending && ( )} {onDelete && ( )}
) : ( )}
); });