import React, { useState } from 'react'; import { Paper, Box, Image, Text, Loader, Stack, Center, Group, ActionIcon, Flex } from '@mantine/core'; import ChevronLeftIcon from '@mui/icons-material/ChevronLeft'; import ChevronRightIcon from '@mui/icons-material/ChevronRight'; import VisibilityIcon from '@mui/icons-material/Visibility'; export interface ReviewFile { file: File; thumbnail?: string; } export interface ReviewPanelProps { files: ReviewFile[]; isGeneratingThumbnails?: boolean; onFileClick?: (file: File) => void; title?: string; emptyMessage?: string; loadingMessage?: string; } const ReviewPanel = ({ files, isGeneratingThumbnails = false, onFileClick, title, emptyMessage = "No files to preview", loadingMessage = "Generating previews..." }: ReviewPanelProps) => { const [currentIndex, setCurrentIndex] = useState(0); const formatSize = (size: number) => { if (size > 1024 * 1024) return `${(size / (1024 * 1024)).toFixed(1)} MB`; if (size > 1024) return `${(size / 1024).toFixed(1)} KB`; return `${size} B`; }; const formatDate = (date: Date) => { return new Intl.DateTimeFormat('en-US', { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }).format(date); }; const handlePrevious = () => { setCurrentIndex((prev) => (prev === 0 ? files.length - 1 : prev - 1)); }; const handleNext = () => { setCurrentIndex((prev) => (prev === files.length - 1 ? 0 : prev + 1)); }; if (files.length === 0 && !isGeneratingThumbnails) { return ( {emptyMessage} ); } if (isGeneratingThumbnails) { return (
{loadingMessage}
); } const currentFile = files[currentIndex]; if (!currentFile) return null; return ( {/* File name at the top */} {currentFile.file.name} {/* Preview on the left */} onFileClick?.(currentFile.file)} onMouseEnter={(e) => { if (onFileClick) { const overlay = e.currentTarget.querySelector('.hover-overlay'); if (overlay) overlay.style.opacity = '1'; } }} onMouseLeave={(e) => { const overlay = e.currentTarget.querySelector('.hover-overlay'); if (overlay) overlay.style.opacity = '0'; }} > {currentFile.thumbnail ? ( {`Preview ) : ( No preview )} {/* Hover overlay with eye icon */} {onFileClick && ( )} {/* Metadata on the right */} {formatSize(currentFile.file.size)} {currentFile.file.type || 'Unknown'} {formatDate(new Date(currentFile.file.lastModified))} {/* Navigation controls */} {files.length > 1 && ( {files.map((_, index) => ( setCurrentIndex(index)} data-testid={`review-panel-dot-${index}`} /> ))} {currentIndex + 1} of {files.length} )} ); }; export default ReviewPanel;