import React, { Component } from 'react'; import { translate } from '../../base/i18n'; declare var AJS: Object; /** * Implements a React Component for the reload timer. Starts counter from * props.start, adds props.step to the current value on every props.interval * seconds until the current value reaches props.end. Also displays progress * bar. */ class ReloadTimer extends Component { /** * ReloadTimer component's property types. * * @static */ static propTypes = { /** * The end of the timer. When this.state.current reaches this value the * timer will stop and call onFinish function. * * @public * @type {number} */ end: React.PropTypes.number, /** * The interval in sec for adding this.state.step to this.state.current. * * @public * @type {number} */ interval: React.PropTypes.number, /** * The function that will be executed when timer finish (when * this.state.current === this.props.end) */ onFinish: React.PropTypes.func, /** * The start of the timer. The initial value for this.state.current. * * @public * @type {number} */ start: React.PropTypes.number, /** * The value which will be added to this.state.current on every step. * * @public * @type {number} */ step: React.PropTypes.number, /** * The function to translate human-readable text. * * @public * @type {Function} */ t: React.PropTypes.func }; /** * Initializes a new ReloadTimer instance. * * @param {Object} props - The read-only properties with which the new * instance is to be initialized. * @public */ constructor(props) { super(props); this.state = { /** * Current value(time) of the timer. * * @type {number} */ current: this.props.start, /** * The absolute value of the time from the start of the timer until * the end of the timer. * * @type {number} */ time: Math.abs(this.props.end - this.props.start) }; } /** * React Component method that executes once component is mounted. * * @inheritdoc * @returns {void} * @protected */ componentDidMount() { AJS.progressBars.update('#reloadProgressBar', 0); const intervalId = setInterval( () => { if (this.state.current === this.props.end) { clearInterval(intervalId); this.props.onFinish(); } else { this.setState((prevState, props) => { return { current: prevState.current + props.step }; }); } }, Math.abs(this.props.interval) * 1000); } /** * React Component method that executes once component is updated. * * @inheritdoc * @returns {void} * @protected */ componentDidUpdate() { AJS.progressBars.update( '#reloadProgressBar', Math.abs(this.state.current - this.props.start) / this.state.time); } /** * Implements React's {@link Component#render()}. * * @inheritdoc * @returns {ReactElement|null} * @public */ render() { const { t } = this.props; return (