"use client"; import { useState } from "react"; import { ExternalLink, Eye, FileText, Loader2, Trash2 } from "lucide-react"; import { api } from "~/trpc/react"; import { toast } from "sonner"; import { Button } from "~/components/ui/button"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "~/components/ui/alert-dialog"; import { formatReceiptSize, isImageReceipt, receiptUrl, } from "~/components/expenses/receipt-utils"; import type { ReceiptViewerTarget } from "~/components/expenses/receipt-viewer-dialog"; export interface ExpenseReceiptRecord { id: string; originalFilename: string; mimeType: string; sizeBytes: number; } interface ExpenseReceiptItemProps { receipt: ExpenseReceiptRecord; expenseId: string; onView: (receipt: ReceiptViewerTarget) => void; compact?: boolean; readOnly?: boolean; } export function ExpenseReceiptItem({ receipt, expenseId, onView, compact = false, readOnly = false, }: ExpenseReceiptItemProps) { const [confirmDelete, setConfirmDelete] = useState(false); const utils = api.useUtils(); const deleteReceipt = api.expenses.deleteReceipt.useMutation({ onSuccess: () => { toast.success("Receipt removed"); void utils.expenses.listReceipts.invalidate({ expenseId }); void utils.expenses.getAll.invalidate(); setConfirmDelete(false); }, onError: (e) => toast.error(e.message), }); const url = receiptUrl(receipt.id); const isImage = isImageReceipt(receipt.mimeType); return ( <>

{receipt.originalFilename}

{formatReceiptSize(receipt.sizeBytes)}

{!readOnly && ( )}
Delete receipt? “{receipt.originalFilename}” will be permanently removed. This cannot be undone. Cancel { e.preventDefault(); deleteReceipt.mutate({ id: receipt.id }); }} > {deleteReceipt.isPending ? "Deleting…" : "Delete"} ); }