import { ReactElement, useCallback } from 'react' import { FileItem } from '../FileItem/FileItem' import { FileInfo, DriveInfo } from '@solarpunkltd/file-manager-lib' import { DownloadProgress, TrackDownloadProps, ViewType } from '../../../constants/transfers' import { getFileId } from '../../../utils/common' interface FileBrowserContentProps { listToRender: FileInfo[] drives: DriveInfo[] currentDrive: DriveInfo | null view: ViewType isSearchMode: boolean trackDownload: (props: TrackDownloadProps) => (dp: DownloadProgress) => void selectedIds?: Set onToggleSelected?: (fi: FileInfo, checked: boolean) => void bulkSelectedCount?: number onBulk: { download?: () => void restore?: () => void forget?: () => void destroy?: () => void delete?: () => void } setErrorMessage?: (error: string) => void } export function FileBrowserContent({ listToRender, drives, currentDrive, view, isSearchMode, trackDownload, selectedIds, onToggleSelected, bulkSelectedCount, onBulk, setErrorMessage, }: FileBrowserContentProps): ReactElement { const renderEmptyState = useCallback((): ReactElement => { if (drives.length === 0) { return
Create a drive to start using the file manager
} if (!currentDrive) { return
Select a drive to upload or view its files
} if (view === ViewType.Trash) { return (
Files from "{currentDrive?.name}" that are trashed can be viewed here
) } return
Drag & drop files here into "{currentDrive?.name}"
}, [drives, currentDrive, view]) const renderFileList = useCallback( (filesToRender: FileInfo[], showDriveColumn = false): ReactElement[] => { return filesToRender .map(fi => { const drive = drives.find(d => d.id.toString() === fi.driveId.toString()) return drive ? { fi, driveName: drive.name } : null }) .filter((item): item is { fi: FileInfo; driveName: string } => item !== null) .map(({ fi, driveName }) => { const key = `${getFileId(fi)}::${fi.version ?? ''}::${showDriveColumn ? 'search' : 'normal'}` return ( ) }) }, [trackDownload, drives, selectedIds, onToggleSelected, bulkSelectedCount, onBulk, setErrorMessage], ) if (drives.length === 0) { return renderEmptyState() } if (!isSearchMode) { if (!currentDrive) { return
Select a drive to upload or view its files
} if (view === ViewType.Expired) { return (
The stamp for drive "{currentDrive?.name}" is expired, no files can be found
) } if (listToRender.length === 0) { if (view === ViewType.Trash) { return (
Files from "{currentDrive?.name}" that are trashed can be viewed here
) } return
Drag & drop files here into "{currentDrive?.name}"
} return <>{renderFileList(listToRender)} } if (listToRender.length === 0) { return
No results found.
} return <>{renderFileList(listToRender, true)} } export default FileBrowserContent