React
by replicateur
HTML
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css">
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.bundle.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-bootstrap/0.33.1/react-bootstrap.min.js"></script>
<div id="app"></div>
CSS
body {
background: #20262E;
padding: 20px;
font-family: Helvetica;
}
#app {
background: #fff;
border-radius: 4px;
padding: 20px;
transition: all 0.2s;
}
li {
margin: 8px 0;
}
h2 {
font-weight: bold;
margin-bottom: 15px;
}
.done {
color: rgba(0, 0, 0, 0.3);
text-decoration: line-through;
}
input {
margin-right: 5px;
}
.btn {
width: 100%;
margin-top: 1rem;
}
.info {
display: block;
width: 100%;
}
.progress {
display: block;
width: 100%;
height: 1rem;
border: 1px solid lightgrey;
}
.progress-color {
display: block;
width: 0%;
height: 1rem;
background: green;
}
React
class PowerPlant extends React.Component {
constructor(props) {
super(props);
this.mainInterval = null;
this.state = {
timeout: 1000,
power: 0,
power_factor: 1,
progress: 0,
}
}
_clock() {
this._updatePower();
this._updateProgress();
setTimeout(() => {this._clock()}, this.state.timeout);
}
_updatePower() {
this.setState({
power: this.state.power + (1 * this.state.power_factor)
});
}
_updateProgress() {
let currentProgress = this.state.power / Math.exp(this.state.power_factor);
this.setState({
progress: currentProgress.toPrecision(2) * 100
});
}
componentDidMount() {
this._clock();
}
componentWillUnmount() {
clearInterval(this.mainInterval);
}
upgrade() {
this.setState({power_factor: this.state.power_factor + 1});
}
render() {
return (
<div>
<h2>Power Plant</h2>
<span class="info">Power factor: {this.state.power_factor}</span>
<span class="info">Power available: {this.state.power} Watts</span>
<ProgressBar now={this.state.currentProgress} />
<div class="progress">
<div class="progress-bar" role="progressbar" aria-valuenow={this.state.currentProgress} aria-valuemin="0" aria-valuemax="100"></div>
</div>
<button class="btn btn-primary" onClick={this.upgrade.bind(this)}>Upgrade Power Plant</button>
</div>
)
}
}
ReactDOM.render(<PowerPlant />, document.querySelector("#app"))