seperate components
This commit is contained in:
145
src/components/job.jsx
Normal file
145
src/components/job.jsx
Normal file
@@ -0,0 +1,145 @@
|
||||
import { Component, Fragment } from "react"
|
||||
import { ActiveJob, ActiveTransfer, StopButton } from "../styled"
|
||||
import API from '../utils/API'
|
||||
import bytesToString from "../utils/bytestring"
|
||||
import secondsToTimeString from "../utils/timestring"
|
||||
|
||||
class Job extends Component {
|
||||
constructor() {
|
||||
super()
|
||||
this.state = {
|
||||
jobstatus: {
|
||||
progress: 0,
|
||||
eta: 0
|
||||
},
|
||||
stats: {
|
||||
|
||||
},
|
||||
jobid: 0
|
||||
}
|
||||
|
||||
this.decreaseEtaInterval = undefined
|
||||
this.fetchStatsInterval = undefined
|
||||
this.fetchJobInterval = undefined
|
||||
}
|
||||
|
||||
componentDidMount = () => {
|
||||
// this.setState({ jobid: this.props.fileTransfers[0].group.replace(/\D/g, '') })
|
||||
|
||||
this.fetchJobInfo(this.props.fileTransfers[0].group.replace(/\D/g, ''))
|
||||
this.fetchStats()
|
||||
|
||||
if (this.decreaseEtaInterval === undefined) this.decreaseEtaInterval = setInterval(() => {
|
||||
let { stats } = this.state
|
||||
|
||||
if (stats.eta > 1) stats.eta--
|
||||
stats.elapsedTime++
|
||||
stats.transferring?.forEach(v => {if (v.eta > 1) v.eta--})
|
||||
|
||||
this.setState({ stats })
|
||||
}, 1000)
|
||||
|
||||
if (this.fetchStatsInterval === undefined) this.fetchStatsInterval = setInterval(this.fetchStats, 5 * 1000)
|
||||
if (this.fetchJobInterval === undefined) this.fetchJobInterval = setInterval(this.fetchJobInfo, 30 * 1000)
|
||||
}
|
||||
|
||||
componentWillUnmount = () => {
|
||||
clearInterval(this.decreaseEtaInterval)
|
||||
// clearInterval(this.fetchStatsInterval)
|
||||
clearInterval(this.fetchJobInterval)
|
||||
}
|
||||
|
||||
fetchStats = () => {
|
||||
return API({
|
||||
url: "/core/stats",
|
||||
data: {
|
||||
group: "job/" + this.props.jobid
|
||||
}
|
||||
})
|
||||
.then(response => {
|
||||
if (typeof response.data !== "object") return new Error("invalid response")
|
||||
|
||||
this.setState({ stats: response.data })
|
||||
})
|
||||
.catch(err => console.log(err))
|
||||
}
|
||||
|
||||
fetchJobInfo = id => {
|
||||
if (!id) id = this.state.jobid
|
||||
|
||||
return API({
|
||||
url: "/job/status",
|
||||
data: {
|
||||
jobid: this.props.jobid
|
||||
}
|
||||
})
|
||||
.then(response => {
|
||||
if (typeof response.data !== "object") throw new Error("invalid response")
|
||||
|
||||
this.setState({ jobstatus: response.data })
|
||||
})
|
||||
.catch(err => console.error(err))
|
||||
}
|
||||
|
||||
stopJob = () => {
|
||||
return API({
|
||||
url: "/job/stop",
|
||||
data: {
|
||||
jobid: this.props.jobid
|
||||
}
|
||||
})
|
||||
.then(() => this.props.refreshStats())
|
||||
.catch(err => console.error(err))
|
||||
}
|
||||
|
||||
renderSize = bytes => {
|
||||
return (bytes / (1024 * 1024 * 1024)).toFixed(2) + " GB"
|
||||
}
|
||||
|
||||
renderSpeed = bytes => {
|
||||
return (bytes / (1024 * 1024)).toFixed(2) + " MB/s"
|
||||
}
|
||||
|
||||
renderActiveTransfer = () => {
|
||||
const { transferring } = this.state.stats
|
||||
|
||||
if (typeof transferring !== "object") return;
|
||||
|
||||
return transferring.map(v => (
|
||||
<ActiveTransfer key={v.name}>
|
||||
<p> { v.name } </p>
|
||||
<p> { this.renderSize(v.size) } </p>
|
||||
<p> { secondsToTimeString(v.eta) } </p>
|
||||
<p> { this.renderSpeed(v.speed) } </p>
|
||||
</ActiveTransfer>
|
||||
))
|
||||
}
|
||||
|
||||
render = () => {
|
||||
const { stats } = this.state
|
||||
|
||||
return (
|
||||
<Fragment>
|
||||
|
||||
<ActiveJob>
|
||||
<p> Time elapsed: </p>
|
||||
<p> { secondsToTimeString(stats.elapsedTime) } </p>
|
||||
<p> Progress: </p>
|
||||
<p> { bytesToString(stats.bytes, { format: "GB", fixed: 3 }) } / { bytesToString(stats.totalBytes, { format: "GB", fixed: 3 }) } GB </p>
|
||||
<span/>
|
||||
|
||||
<p> Time left: </p>
|
||||
<p> { secondsToTimeString(stats.eta) } </p>
|
||||
<p> Progress: </p>
|
||||
<p> { ((stats.bytes / stats.totalBytes) * 100).toFixed(2) } % </p>
|
||||
<span/>
|
||||
|
||||
<StopButton onClick={this.stopJob}> Cancel </StopButton>
|
||||
</ActiveJob>
|
||||
{ this.renderActiveTransfer() }
|
||||
</Fragment>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
export default Job
|
84
src/components/settings.jsx
Normal file
84
src/components/settings.jsx
Normal file
@@ -0,0 +1,84 @@
|
||||
import { Component, Fragment } from "react"
|
||||
import { InfosWrapper, PopupContainer, PopupTitle, Cross, Button } from "../styled"
|
||||
import API from '../utils/API'
|
||||
import bytesToString from "../utils/bytestring"
|
||||
import secondsToTimeString from "../utils/timestring"
|
||||
|
||||
class Settings extends Component {
|
||||
constructor() {
|
||||
super()
|
||||
this.state = {
|
||||
settings: {},
|
||||
show: false
|
||||
}
|
||||
}
|
||||
|
||||
componentDidMount = () => this.fetchSettings()
|
||||
|
||||
fetchSettings = () => {
|
||||
return new Promise((resolve, reject) => {
|
||||
return API({
|
||||
url: "/options/get"
|
||||
})
|
||||
.then(response => {
|
||||
if (typeof response.data !== "object") return new Error("invalid response")
|
||||
|
||||
this.setState({ settings: response.data })
|
||||
|
||||
return resolve()
|
||||
})
|
||||
.catch(reject)
|
||||
})
|
||||
}
|
||||
|
||||
showSettings = () => {
|
||||
this.fetchSettings()
|
||||
.then(() => this.setState({ show: true }))
|
||||
.catch(err => console.error(err))
|
||||
}
|
||||
|
||||
renderSettings = () => {
|
||||
return (
|
||||
<PopupContainer>
|
||||
<PopupTitle> Settings </PopupTitle>
|
||||
<Cross onClick={() => this.setState({ show: false })}> Close </Cross>
|
||||
|
||||
<pre>
|
||||
{
|
||||
JSON.stringify(this.state.settings, null, 4)
|
||||
}
|
||||
</pre>
|
||||
</PopupContainer>
|
||||
)
|
||||
}
|
||||
|
||||
render = () => {
|
||||
const { settings, show } = this.state
|
||||
|
||||
return (
|
||||
<Fragment>
|
||||
{
|
||||
show ?
|
||||
this.renderSettings()
|
||||
: ""
|
||||
}
|
||||
|
||||
<InfosWrapper>
|
||||
<h2> Settings </h2>
|
||||
<p> Cache max size </p>
|
||||
<p> { bytesToString(settings?.vfs?.CacheMaxSize, {}) } </p>
|
||||
|
||||
<p> Cache max age </p>
|
||||
<p> { secondsToTimeString(settings?.vfs?.CacheMaxAge / 1000000000, true) } </p>
|
||||
|
||||
<p> File min age </p>
|
||||
<p> { secondsToTimeString(settings?.filter?.MinAge / 1000000000, true) } </p>
|
||||
|
||||
<Button onClick={this.showSettings}> List Settings </Button>
|
||||
</InfosWrapper>
|
||||
</Fragment>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
export default Settings
|
Reference in New Issue
Block a user