import DeleteIcon from '@mui/icons-material/Delete' import DownloadIcon from '@mui/icons-material/Download' import DownloadDoneIcon from '@mui/icons-material/DownloadDone' import FileDownloadIcon from '@mui/icons-material/FileDownload' import SmartDisplayIcon from '@mui/icons-material/SmartDisplay' import StopCircleIcon from '@mui/icons-material/StopCircle' import { Box, ButtonGroup, IconButton, LinearProgress, LinearProgressProps, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Typography } from "@mui/material" import { forwardRef } from 'react' import { TableComponents, TableVirtuoso } from 'react-virtuoso' import { activeDownloadsState } from '../atoms/downloads' import { serverURL } from '../atoms/settings' import { useRPC } from '../hooks/useRPC' import { ProcessStatus, RPCResult } from '../types' import { base64URLEncode, formatSize, formatSpeedMiB } from "../utils" import { useAtomValue } from 'jotai' const columns = [ { width: 8, label: 'Status', dataKey: 'status', numeric: false, }, { width: 500, label: 'Title', dataKey: 'title', numeric: false, }, { width: 50, label: 'Speed', dataKey: 'speed', numeric: true, }, { width: 150, label: 'Progress', dataKey: 'progress', numeric: true, }, { width: 80, label: 'Size', dataKey: 'size', numeric: true, }, { width: 100, label: 'Added on', dataKey: 'addedon', numeric: true, }, { width: 80, label: 'Actions', dataKey: 'actions', numeric: true, }, ] as const function LinearProgressWithLabel(props: LinearProgressProps & { value: number }) { return ( {`${Math.round( props.value, )}%`} ) } const VirtuosoTableComponents: TableComponents = { Scroller: forwardRef((props, ref) => ( )), Table: (props) => ( ), TableHead, TableRow: ({ item: _item, ...props }) => , TableBody: forwardRef((props, ref) => ( )), } function fixedHeaderContent() { return ( {columns.map((column) => ( {column.label} ))} ) } const DownloadsTableView: React.FC = () => { const downloads = useAtomValue(activeDownloadsState) const serverAddr = useAtomValue(serverURL) const { client } = useRPC() const viewFile = (path: string) => { const encoded = base64URLEncode(path) window.open(`${serverAddr}/filebrowser/v/${encoded}?token=${localStorage.getItem('token')}`) } const downloadFile = (path: string) => { const encoded = base64URLEncode(path) window.open(`${serverAddr}/filebrowser/d/${encoded}?token=${localStorage.getItem('token')}`) } const stop = (r: RPCResult) => r.progress.process_status === ProcessStatus.COMPLETED ? client.clear(r.id) : client.kill(r.id) function rowContent(_index: number, download: RPCResult) { return ( <> {download.progress.percentage === '-1' ? : } {download.info.title} {formatSpeedMiB(download.progress.speed)} {formatSize(download.info.filesize_approx ?? 0)} {new Date(download.info.created_at).toLocaleString()} stop(download)} > {download.progress.percentage === '-1' ? : } {download.progress.percentage === '-1' && <> viewFile(download.output.savedFilePath)} > downloadFile(download.output.savedFilePath)} > } ) } return ( ) } export default DownloadsTableView