show cumulative download speed

code refactoring
This commit is contained in:
2024-03-26 10:58:03 +01:00
parent c6e48f4baa
commit 1b8d2e0da6
6 changed files with 40 additions and 18 deletions

View File

@@ -1,7 +1,7 @@
import { ThemeProvider } from '@emotion/react' import { ThemeProvider } from '@emotion/react'
import ArchiveIcon from '@mui/icons-material/Archive'
import ChevronLeft from '@mui/icons-material/ChevronLeft' import ChevronLeft from '@mui/icons-material/ChevronLeft'
import Dashboard from '@mui/icons-material/Dashboard' import Dashboard from '@mui/icons-material/Dashboard'
import DownloadIcon from '@mui/icons-material/Download'
import Menu from '@mui/icons-material/Menu' import Menu from '@mui/icons-material/Menu'
import SettingsIcon from '@mui/icons-material/Settings' import SettingsIcon from '@mui/icons-material/Settings'
import TerminalIcon from '@mui/icons-material/Terminal' import TerminalIcon from '@mui/icons-material/Terminal'
@@ -116,7 +116,7 @@ export default function Layout() {
}> }>
<ListItemButton> <ListItemButton>
<ListItemIcon> <ListItemIcon>
<DownloadIcon /> <ArchiveIcon />
</ListItemIcon> </ListItemIcon>
<ListItemText primary={i18n.t('archiveButtonLabel')} /> <ListItemText primary={i18n.t('archiveButtonLabel')} />
</ListItemButton> </ListItemButton>

View File

@@ -10,3 +10,8 @@ export const optimisticDownloadsState = atom<RPCResult[]>({
key: 'optimisticDownloadsState', key: 'optimisticDownloadsState',
default: [] default: []
}) })
export const totalDownloadSpeedState = atom<number>({
key: 'totalDownloadSpeedState',
default: 0
})

View File

@@ -61,14 +61,22 @@ const DownloadCard: React.FC<Props> = ({ download, onStop, onCopy }) => {
/> : /> :
<Skeleton variant="rectangular" height={180} /> <Skeleton variant="rectangular" height={180} />
} }
{download.progress.percentage ?
<LinearProgress
variant="determinate"
value={percentageToNumber()}
color={isCompleted() ? "success" : "primary"}
/> :
null
}
<CardContent> <CardContent>
{download.info.title !== '' ? {download.info.title !== '' ?
<Typography gutterBottom variant="h6" component="div"> <Typography gutterBottom variant="h6" component="div">
{ellipsis(download.info.title, 54)} {ellipsis(download.info.title, 100)}
</Typography> : </Typography> :
<Skeleton /> <Skeleton />
} }
<Stack direction="row" spacing={1} py={2}> <Stack direction="row" spacing={0.5} py={1}>
<Chip <Chip
label={ label={
isCompleted() isCompleted()
@@ -90,14 +98,6 @@ const DownloadCard: React.FC<Props> = ({ download, onStop, onCopy }) => {
</Typography> </Typography>
<Resolution resolution={download.info.resolution} /> <Resolution resolution={download.info.resolution} />
</Stack> </Stack>
{download.progress.percentage ?
<LinearProgress
variant="determinate"
value={percentageToNumber()}
color={isCompleted() ? "secondary" : "primary"}
/> :
null
}
</CardContent> </CardContent>
</CardActionArea> </CardActionArea>
<CardActions> <CardActions>

View File

@@ -1,8 +1,8 @@
import { useEffect } from 'react' import { useEffect } from 'react'
import { useRecoilState, useRecoilValue } from 'recoil' import { useRecoilState, useRecoilValue } from 'recoil'
import { loadingDownloadsState } from '../atoms/downloads' import { activeDownloadsState, loadingDownloadsState } from '../atoms/downloads'
import { listViewState } from '../atoms/settings' import { listViewState } from '../atoms/settings'
import { loadingAtom } from '../atoms/ui' import { loadingAtom, totalDownloadSpeedState } from '../atoms/ui'
import DownloadsCardView from './DownloadsCardView' import DownloadsCardView from './DownloadsCardView'
import DownloadsTableView from './DownloadsTableView' import DownloadsTableView from './DownloadsTableView'
@@ -12,10 +12,18 @@ const Downloads: React.FC = () => {
const [isLoading, setIsLoading] = useRecoilState(loadingAtom) const [isLoading, setIsLoading] = useRecoilState(loadingAtom)
const downloads = useRecoilValue(activeDownloadsState)
const [, setTotalDownloadSpeed] = useRecoilState(totalDownloadSpeedState)
useEffect(() => {
setTotalDownloadSpeed(
downloads.map(d => d.progress.speed).reduce((curr, next) => curr + next)
)
}, [downloads])
useEffect(() => { useEffect(() => {
if (loadingDownloads) { if (loadingDownloads) {
setIsLoading(true) return setIsLoading(true)
return
} }
setIsLoading(false) setIsLoading(false)
}, [loadingDownloads, isLoading]) }, [loadingDownloads, isLoading])

View File

@@ -7,10 +7,14 @@ import { connectedState } from '../atoms/status'
import { useI18n } from '../hooks/useI18n' import { useI18n } from '../hooks/useI18n'
import FreeSpaceIndicator from './FreeSpaceIndicator' import FreeSpaceIndicator from './FreeSpaceIndicator'
import VersionIndicator from './VersionIndicator' import VersionIndicator from './VersionIndicator'
import DownloadIcon from '@mui/icons-material/Download'
import { totalDownloadSpeedState } from '../atoms/ui'
import { formatSpeedMiB } from '../utils'
const Footer: React.FC = () => { const Footer: React.FC = () => {
const settings = useRecoilValue(settingsState) const settings = useRecoilValue(settingsState)
const isConnected = useRecoilValue(connectedState) const isConnected = useRecoilValue(connectedState)
const totalDownloadSpeed = useRecoilValue(totalDownloadSpeedState)
const mode = settings.theme const mode = settings.theme
const { i18n } = useI18n() const { i18n } = useI18n()
@@ -42,6 +46,11 @@ const Footer: React.FC = () => {
marginRight: 'px', marginRight: 'px',
gap: 3, gap: 3,
}}> }}>
<DownloadIcon />
<span>
{formatSpeedMiB(totalDownloadSpeed)}
</span>
<Divider orientation="vertical" flexItem />
<SettingsEthernet /> <SettingsEthernet />
<span> <span>
{isConnected ? settings.serverAddr : i18n.t('notConnectedText')} {isConnected ? settings.serverAddr : i18n.t('notConnectedText')}

View File

@@ -130,7 +130,7 @@ export default function Settings() {
* Updates yt-dlp binary via RPC * Updates yt-dlp binary via RPC
*/ */
const updateBinary = () => { const updateBinary = () => {
client.updateExecutable().then(() => pushMessage(i18n.t('toastUpdated'))) client.updateExecutable().then(() => pushMessage(i18n.t('toastUpdated'), 'success'))
} }
return ( return (
@@ -204,7 +204,7 @@ export default function Settings() {
label={i18n.t('languageSelect')} label={i18n.t('languageSelect')}
onChange={handleLanguageChange} onChange={handleLanguageChange}
> >
{languages.map(l => ( {languages.toSorted((a, b) => a.localeCompare(b)).map(l => (
<MenuItem value={l} key={l}> <MenuItem value={l} key={l}>
{capitalize(l)} {capitalize(l)}
</MenuItem> </MenuItem>