"use client"; import { RiAttachmentLine, RiFilePdf2Line, RiImageLine, } from "@remixicon/react"; import { useRouter } from "next/navigation"; import type React from "react"; import { useState, useTransition } from "react"; import { AttachmentGridItem } from "@/features/attachments/components/attachment-grid-item"; import { AttachmentPreview } from "@/features/attachments/components/attachment-preview"; import { useAttachmentUrl } from "@/features/attachments/hooks/use-attachment-url"; import type { AttachmentForPeriod } from "@/features/attachments/queries"; import { fetchTransactionByIdAction } from "@/features/transactions/actions/fetch-by-id"; import type { TransactionDialogOptions } from "@/features/transactions/actions/fetch-dialog-options"; import { fetchTransactionDialogOptionsAction } from "@/features/transactions/actions/fetch-dialog-options"; import { TransactionDetailsDialog } from "@/features/transactions/components/dialogs/transaction-details-dialog"; import { TransactionDialog } from "@/features/transactions/components/dialogs/transaction-dialog/transaction-dialog"; import type { TransactionItem } from "@/features/transactions/components/types"; import { EmptyState } from "@/shared/components/empty-state"; import { Card, CardContent } from "@/shared/components/ui/card"; import { cn } from "@/shared/utils/ui"; type FilterType = "all" | "images" | "pdfs"; function AttachmentGridItemWithUrl({ attachment, onClick, onDetails, isLoadingDetails, }: { attachment: AttachmentForPeriod; onClick: () => void; onDetails: () => void; isLoadingDetails: boolean; }) { const { url, containerRef } = useAttachmentUrl(attachment.attachmentId); return (
); } const FILTERS: { value: FilterType; label: string; icon: React.ReactNode; }[] = [ { value: "all", label: "Todos", icon: , }, { value: "images", label: "Imagens", icon: , }, { value: "pdfs", label: "PDFs", icon: , }, ]; interface AttachmentsPageProps { attachments: AttachmentForPeriod[]; } export function AttachmentsPage({ attachments }: AttachmentsPageProps) { const router = useRouter(); const [filter, setFilter] = useState("all"); const [selectedIndex, setSelectedIndex] = useState(-1); const [transactionDetails, setTransactionDetails] = useState(null); const [loadingTransactionId, setLoadingTransactionId] = useState< string | null >(null); const [isPending, startTransition] = useTransition(); // Edit dialog state const [editOpen, setEditOpen] = useState(false); const [transactionToEdit, setTransactionToEdit] = useState(null); const [dialogOptions, setDialogOptions] = useState(null); const filteredAttachments = attachments.filter((a) => { if (filter === "images") return a.mimeType.startsWith("image/"); if (filter === "pdfs") return a.mimeType === "application/pdf"; return true; }); const imageCount = attachments.filter((a) => a.mimeType.startsWith("image/"), ).length; const pdfCount = attachments.filter( (a) => a.mimeType === "application/pdf", ).length; const counts: Record = { all: attachments.length, images: imageCount, pdfs: pdfCount, }; function handleSelect(attachment: AttachmentForPeriod) { const idx = filteredAttachments.findIndex( (a) => a.attachmentId === attachment.attachmentId && a.transactionId === attachment.transactionId, ); setSelectedIndex(idx); } function handleDetails(transactionId: string) { setLoadingTransactionId(transactionId); startTransition(async () => { const transaction = await fetchTransactionByIdAction(transactionId); setLoadingTransactionId(null); if (transaction) setTransactionDetails(transaction); }); } function handleEdit(transaction: TransactionItem) { setTransactionToEdit(transaction); startTransition(async () => { const options = await fetchTransactionDialogOptionsAction(); setDialogOptions(options); setEditOpen(true); }); } return (
{attachments.length === 0 ? (
} title="Nenhum anexo neste mês" description="Adicione comprovantes nos seus lançamentos para vê-los aqui." />
) : (
{/* Header: filtros + contagem */}

{filteredAttachments.length}{" "} {filteredAttachments.length === 1 ? "anexo" : "anexos"} {filter !== "all" && ` · ${FILTERS.find((f) => f.value === filter)?.label.toLowerCase()}`}

{FILTERS.map(({ value, label, icon }) => ( ))}
{filteredAttachments.length === 0 ? (
} title="Nenhum anexo encontrado" description="Não há anexos do tipo selecionado neste mês." />
) : (
{filteredAttachments.map((attachment) => ( handleSelect(attachment)} onDetails={() => handleDetails(attachment.transactionId)} isLoadingDetails={ isPending && loadingTransactionId === attachment.transactionId } /> ))}
)}
)}
setSelectedIndex(-1)} /> { if (!open) setTransactionDetails(null); }} transaction={transactionDetails} onEdit={handleEdit} /> {dialogOptions && transactionToEdit && ( { setEditOpen(open); if (!open) { setTransactionToEdit(null); setDialogOptions(null); router.refresh(); } }} transaction={transactionToEdit} payerOptions={dialogOptions.payerOptions} splitPayerOptions={dialogOptions.splitPayerOptions} defaultPayerId={dialogOptions.defaultPayerId} accountOptions={dialogOptions.accountOptions} cardOptions={dialogOptions.cardOptions} categoryOptions={dialogOptions.categoryOptions} estabelecimentos={dialogOptions.estabelecimentos} /> )}
); }