import React, { useMemo } from 'react'; import { MessageDocument, Message } from '../MessagesTypes'; import { formatFileSize } from '../MessageUtils'; import { ViewActionButton, DeleteActionButton, RemoveActionButton } from '../../../FormGenerator/ActionButtons'; import { WorkflowFile } from '../../../../hooks/usePlayground'; import styles from '../Messages.module.css'; export interface DocumentItemProps { document: MessageDocument; message: Message; className?: string; onFileDelete?: (file: WorkflowFile) => Promise; onFileRemove?: (file: WorkflowFile) => Promise; onFileView?: (file: WorkflowFile) => Promise; deletingFiles?: Set; previewingFiles?: Set; removingFiles?: Set; workflowId?: string; } /** * Renders a single document attachment with action buttons */ export const DocumentItem: React.FC = ({ document, message: _message, className, onFileDelete, onFileRemove, onFileView, deletingFiles = new Set(), previewingFiles = new Set(), removingFiles = new Set(), workflowId: _workflowId }) => { // Convert MessageDocument to WorkflowFile format for compatibility with action buttons const workflowFile: WorkflowFile = useMemo(() => ({ id: document.id, fileId: document.fileId, fileName: document.fileName, fileSize: document.fileSize, mimeType: document.mimeType, messageId: document.messageId, source: 'user_uploaded' // Default to user_uploaded, can be enhanced later }), [document]); const isDeleting = deletingFiles.has(document.fileId); const isPreviewing = previewingFiles.has(document.fileId); const isRemoving = removingFiles.has(document.fileId); // Create hookData object for action buttons const hookData = useMemo(() => ({ handleDelete: async (_fileId: string) => { if (onFileDelete) { await onFileDelete(workflowFile); return true; } return false; }, removeOptimistically: () => { // Handled by parent component }, refetch: async () => { // Refetch handled by parent }, deletingItems: deletingFiles, previewingFiles: previewingFiles, removingItems: removingFiles }), [onFileDelete, workflowFile, deletingFiles, previewingFiles, removingFiles]); const handleView = async () => { if (onFileView) { await onFileView(workflowFile); } }; const handleRemove = async () => { if (onFileRemove) { await onFileRemove(workflowFile); } }; return (
📎
{document.fileName}
{formatFileSize(document.fileSize)} • {document.mimeType}
{(onFileView || onFileDelete || onFileRemove) && (
{onFileView && ( )} {onFileRemove && ( )} {onFileDelete && ( )}
)}
); };