import React, { useEffect } from "react"; import ReactMarkdown from 'react-markdown'; import { MdClose } from "react-icons/md"; import { Document } from "./dashboardChatAreaTypes"; import { useFilePreview } from "../../../../hooks/useWorkflows"; import styles from './FilePreviewPopup.module.css'; interface FilePreviewPopupProps { document: Document; isOpen: boolean; onClose: () => void; } const FilePreviewPopup: React.FC = ({ document, isOpen, onClose }) => { const { previewContent, fileMetadata, isLoading, error, fetchPreview, clearPreview } = useFilePreview(); useEffect(() => { if (isOpen && document) { // Use fileId if available, otherwise try to use id as fallback const fileId = document.fileId || document.id; if (fileId) { console.log('FilePreviewPopup: calling fetchPreview with fileId:', fileId); fetchPreview(String(fileId)); } else { console.error('FilePreviewPopup: No fileId or id available on document:', document); } } else if (!isOpen) { clearPreview(); } }, [isOpen, document.fileId, document.id]); const handleBackdropClick = (e: React.MouseEvent) => { if (e.target === e.currentTarget) { onClose(); } }; const getPreviewComponent = () => { if (isLoading) { return
Loading preview...
; } if (error) { return (
Error: {error}
{fileMetadata && (
Debug: {JSON.stringify(fileMetadata, null, 2)}
)}
); } if (!previewContent) { return (
No preview available
{fileMetadata && (
Available metadata: {Object.keys(fileMetadata).join(', ')}
Preview field: {fileMetadata.preview ? 'has data' : 'empty/null'}
Base64Encoded: {String(fileMetadata.base64Encoded)}
MimeType: {fileMetadata.mimeType}
)}
); } // Use metadata from backend response const mimeType = fileMetadata?.mimeType; const isBase64Encoded = fileMetadata?.base64Encoded; const fileExtension = document.ext?.toLowerCase(); // Check if this is a markdown file by extension/MIME type first const isMarkdownByType = fileExtension === 'md' || fileExtension === 'markdown' || mimeType === 'text/markdown' || mimeType === 'text/x-markdown'; // Content-based markdown detection for .txt files with markdown content // BUT NOT for specific code file types const isCodeFile = fileExtension === 'py' || fileExtension === 'js' || fileExtension === 'ts' || fileExtension === 'jsx' || fileExtension === 'tsx' || fileExtension === 'java' || fileExtension === 'cpp' || fileExtension === 'c' || fileExtension === 'php' || fileExtension === 'html' || fileExtension === 'css'; const hasMarkdownContent = !isCodeFile && previewContent && ( previewContent.includes('# ') || // Headers previewContent.includes('## ') || // Headers previewContent.includes('**') || // Bold previewContent.includes('__') || // Bold previewContent.includes('- ') || // Lists previewContent.includes('* ') || // Lists previewContent.includes('1. ') || // Numbered lists previewContent.includes('```') || // Code blocks previewContent.includes('[') && previewContent.includes('](') // Links ); const isMarkdown = isMarkdownByType || (mimeType === 'text/plain' && hasMarkdownContent); if (mimeType?.startsWith('image/')) { // Image preview const imageSrc = isBase64Encoded ? `data:${mimeType};base64,${previewContent}` : previewContent; return ( {document.name} ); } else if (fileExtension === 'pdf' || mimeType === 'application/pdf') { // PDF preview const pdfSrc = isBase64Encoded ? `data:application/pdf;base64,${previewContent}` : previewContent; return (