import React from 'react'; import { Box, Center } from '@mantine/core'; import InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile'; import { StirlingFileStub } from '../../types/fileContext'; import DocumentThumbnail from './filePreview/DocumentThumbnail'; import DocumentStack from './filePreview/DocumentStack'; import HoverOverlay from './filePreview/HoverOverlay'; import NavigationArrows from './filePreview/NavigationArrows'; export interface FilePreviewProps { // Core file data file: File | StirlingFileStub | null; thumbnail?: string | null; // Optional features showStacking?: boolean; showHoverOverlay?: boolean; showNavigation?: boolean; // State totalFiles?: number; isAnimating?: boolean; // Event handlers onFileClick?: (file: File | StirlingFileStub | null) => void; onPrevious?: () => void; onNext?: () => void; } const FilePreview: React.FC = ({ file, thumbnail, showStacking = false, showHoverOverlay = false, showNavigation = false, totalFiles = 1, isAnimating = false, onFileClick, onPrevious, onNext }) => { if (!file) { return (
); } const hasMultipleFiles = totalFiles > 1; // Animation styles const animationStyle = isAnimating ? { transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)', transform: 'scale(0.95) translateX(1.25rem)', opacity: 0.7 } : {}; // Build the component composition let content = ( onFileClick?.(file)} /> ); // Wrap with hover overlay if needed if (showHoverOverlay && onFileClick) { content = {content}; } // Wrap with document stack if needed if (showStacking) { content = ( {content} ); } // Wrap with navigation if needed if (showNavigation && hasMultipleFiles && onPrevious && onNext) { content = ( {content} ); } return ( {content} ); }; export default FilePreview;