Files
Cultivation/src/ui/components/common/MainProgressBar.tsx
2022-07-26 20:49:20 -07:00

85 lines
2.1 KiB
TypeScript

import React from 'react'
import DownloadHandler from '../../../utils/download'
import Tr from '../../../utils/language'
import './ProgressBar.css'
interface IProps {
downloadManager: DownloadHandler
withStats?: boolean
}
interface IState {
average: number
files: number
extracting: number
total: number
speed: string
}
/**
* This component differes because it averages all downloads together
*/
export default class ProgressBar extends React.Component<IProps, IState> {
constructor(props: IProps) {
super(props)
const { average, files, extracting, totalSize } = this.props.downloadManager.getTotalAverage()
this.state = {
average,
files,
extracting,
total: totalSize,
speed: '0 B/s',
}
}
componentDidMount() {
// Periodically check the progress of passed file path
setInterval(() => {
const prog = this.props.downloadManager.getTotalAverage()
this.setState({
average: prog?.average || 0,
files: prog?.files,
extracting: prog?.extracting,
total: prog?.totalSize || 0,
speed: prog?.speed || '0 B/s',
})
}, 200)
}
render() {
return (
<div className="MainProgressBarWrapper">
<div className="ProgressBar">
<div
className="InnerProgress"
style={{
width: `${(() => {
// Handles no files downloading
if (this.state.files === 0 || this.state.average >= 100) {
return '100'
}
if (this.state.total <= 0) {
return '0'
}
return this.state.average
})()}%`,
}}
></div>
</div>
{(this.props.withStats === undefined || this.props.withStats) && (
<div className="MainProgressText">
<Tr text="main.files_downloading" /> {this.state.files} ({this.state.speed})
<br />
<Tr text="main.files_extracting" /> {this.state.extracting}
</div>
)}
</div>
)
}
}