import React, { useState } from 'react'; import { Group, Box, Text, ActionIcon, Checkbox, Divider, Menu, Badge } from '@mantine/core'; import MoreVertIcon from '@mui/icons-material/MoreVert'; import DeleteIcon from '@mui/icons-material/Delete'; import DownloadIcon from '@mui/icons-material/Download'; import HistoryIcon from '@mui/icons-material/History'; import RestoreIcon from '@mui/icons-material/Restore'; import { useTranslation } from 'react-i18next'; import { getFileSize, getFileDate } from '../../utils/fileUtils'; import { FileMetadata } from '../../types/file'; import { useFileManagerContext } from '../../contexts/FileManagerContext'; interface FileListItemProps { file: FileMetadata; isSelected: boolean; isSupported: boolean; onSelect: (shiftKey?: boolean) => void; onRemove: () => void; onDownload?: () => void; onDoubleClick?: () => void; isLast?: boolean; } const FileListItem: React.FC = ({ file, isSelected, isSupported, onSelect, onRemove, onDownload, onDoubleClick }) => { const [isHovered, setIsHovered] = useState(false); const [isMenuOpen, setIsMenuOpen] = useState(false); const { t } = useTranslation(); const { fileGroups, onRestoreVersion } = useFileManagerContext(); // Keep item in hovered state if menu is open const shouldShowHovered = isHovered || isMenuOpen; // Get version information for this file const originalFileId = file.originalFileId || file.id; const fileVersions = fileGroups.get(originalFileId) || []; const hasVersionHistory = fileVersions.length > 1; const currentVersion = file.versionNumber || 0; // Display original files as v0 return ( <> onSelect(e.shiftKey)} onDoubleClick={onDoubleClick} onMouseEnter={() => setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} > {}} // Handled by parent onClick size="sm" pl="sm" pr="xs" styles={{ input: { cursor: 'pointer' } }} /> {file.name} {file.isDraft && ( DRAFT )} {hasVersionHistory && ( v{currentVersion} )} {getFileSize(file)} • {getFileDate(file)} {hasVersionHistory && ( • {fileVersions.length} versions )} {/* Three dots menu - fades in/out on hover */} setIsMenuOpen(true)} onClose={() => setIsMenuOpen(false)} > e.stopPropagation()} style={{ opacity: shouldShowHovered ? 1 : 0, transform: shouldShowHovered ? 'scale(1)' : 'scale(0.8)', transition: 'opacity 0.3s ease, transform 0.3s ease', pointerEvents: shouldShowHovered ? 'auto' : 'none' }} > {onDownload && ( } onClick={(e) => { e.stopPropagation(); onDownload(); }} > {t('fileManager.download', 'Download')} )} {/* Version History Menu */} {hasVersionHistory && ( <> {t('fileManager.versions', 'Version History')} {fileVersions.map((version, index) => ( Current : } onClick={(e) => { e.stopPropagation(); if (version.id !== file.id) { onRestoreVersion(version); } }} disabled={version.id === file.id} > v{version.versionNumber || 0} {new Date(version.lastModified).toLocaleDateString()} ))} )} } onClick={(e) => { e.stopPropagation(); onRemove(); }} > {t('fileManager.delete', 'Delete')} { } ); }; export default FileListItem;