1
0
mirror of https://github.com/kremalicious/blog.git synced 2025-02-14 21:10:25 +01:00
blog/src/components/atoms/Coinhive.jsx
2018-10-25 15:17:56 +02:00

131 lines
2.8 KiB
JavaScript

import React, { PureComponent } from 'react'
import loadScript from 'load-script'
import posed, { PoseGroup } from 'react-pose'
import { fadeIn } from './Transitions'
import styles from './Coinhive.module.scss'
import { ReactComponent as Play } from '../../images/play.svg'
import { ReactComponent as Pause } from '../../images/pause.svg'
const config = {
threads: 2,
throttle: 0.3,
autoThreads: false,
siteKey: '45EnDz1yUgdjmV9yX31UgamUy9ZjzIyt',
script: '/coinhive.min.js'
}
const Animation = posed.div(fadeIn)
export default class CoinHiveClient extends PureComponent {
state = {
miner: null,
hashrate: 0,
started: false,
intervalId: null
}
intervalId = null
buildMiner = () => {
if (this.state.miner && this.state.miner.isRunning()) {
this.stop()
}
return new Promise(resolve => {
loadScript(config.script, error => {
if (error) {
return
}
resolve(
window.CoinHive.Anonymous(config.siteKey, {
throttle: config.throttle,
threads: config.threads,
autoThreads: config.autoThreads
})
)
})
})
}
async componentDidMount() {
try {
let miner = await this.buildMiner()
this.setState({ miner })
if (this.state.miner && !this.state.miner.isMobile()) {
this.start()
this.report()
}
} catch (error) {
return null
}
}
componentWillUnmount() {
this.destroy()
}
start() {
this.state.miner.start()
this.setState({ started: true })
}
stop() {
this.state.miner.stop()
this.setState({ started: false })
}
destroy() {
if (!this.state.miner) return
this.state.miner.stop()
delete this.state.miner
clearInterval(this.state.intervalId)
}
hashrate() {
return this.state.miner.getHashesPerSecond().toFixed(2)
}
report() {
if (!this.state.miner) return
let intervalId = setInterval(
() => this.setState({ hashrate: this.hashrate() }),
1500
)
this.setState({ intervalId })
}
toggleMiner = () => {
if (this.state.started) {
this.stop()
} else {
this.start()
}
}
render() {
return (
this.state.miner &&
!this.state.miner.isMobile() && (
<PoseGroup animateOnMount={true}>
<Animation
key="coinhive"
className={styles.coinhive}
onClick={this.toggleMiner}
>
<div title="Toggle mining">
{this.state.started ? <Pause /> : <Play />}
Mining {this.state.started ? 'enabled' : 'disabled'}
</div>
<div className={styles.hashrate}>
{this.state.hashrate} Hashes/s
</div>
</Animation>
</PoseGroup>
)
)
}
}