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"))