blob: b2ad95e34389b42cea4a7391f26ecbcfaad0ad2d [file] [log] [blame]
// Licensed under the Apache License, Version 2.0 (the 'License'); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an 'AS IS' BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
import PropTypes from 'prop-types';
import React from 'react';
import ReactDOM from 'react-dom';
import Range from 'react-range';
let pollIntervalId;
export const clearPollCounter = () => {
if (pollIntervalId) {
window.clearInterval(pollIntervalId);
}
};
export const resetPollCounter = (time, cb) => {
clearPollCounter();
pollIntervalId = window.setInterval(cb, time);
};
const getCountdown = (secsString, units, max, min) => {
const secs = parseInt(secsString, 10);
if (secs === 0 || secs > max || secs < min) {
return 'off';
}
if (secs < 60 && units === 'minute') {
return `${secs} seconds`;
}
let displayValue = secs;
if (units === 'minute') {
displayValue = Math.floor(secs / 60);
}
return `${displayValue} ${displayValue === 1 ? units : `${units}s`}`;
};
export class Polling extends React.Component {
constructor (props) {
super(props);
this.state = {
value: this.props.startValue
};
this.updatePollingFreq = this.updatePollingFreq.bind(this);
}
componentDidMount () {
this.setPollingCounter(this.state.value);
}
componentWillUnmount () {
clearPollCounter();
}
setPollingCounter (value) {
const {min, max, onPoll} = this.props;
this.setState({value: value});
if (value === 0 || value < min || value > max) {
clearPollCounter();
return;
}
resetPollCounter(value * 1000, () => onPoll());
}
updatePollingFreq (e) {
this.setPollingCounter(parseInt(e.target.value, 10));
}
UNSAFE_componentWillReceiveProps(nextProps) {
if (this.props.startValue !== nextProps.startValue) {
this.setPollingCounter(nextProps.startValue);
}
}
render () {
const {
stepSize,
min,
max,
valueUnits
} = this.props;
const {value} = this.state;
const pollValue = getCountdown(value, valueUnits, max, min);
const pollStyle = pollValue === 'off' ? 'faux__polling-info-value--off' : 'faux__polling-info-value--active';
return (
<div className='faux__polling'>
<div className='faux__polling-info'>
<span className='faux__polling-info-text'>Polling Interval</span>
<span className={`faux__polling-info-value faux__polling-info-value ${pollStyle}`}>{pollValue}</span>
</div>
<Range
onChange={this.updatePollingFreq}
className='faux__polling-info-slider'
type='range'
value={value}
min={min}
max={max + stepSize}
step={stepSize}
/>
</div>
);
}
}
Polling.defaultProps = {
startValue: 0,
min: 0,
valueUnits: 'minute'
};
Polling.propTypes = {
startValue: PropTypes.number,
valueUnits: PropTypes.string,
min: PropTypes.number,
max: PropTypes.number.isRequired,
stepSize: PropTypes.number.isRequired,
onPoll: PropTypes.func.isRequired,
};
export const RefreshBtn = ({refresh}) =>
<div className="faux__refresh-btn">
<a
className="faux__refresh-link"
href="#"
data-bypass="true"
onClick={e => {
e.preventDefault();
refresh();
}}
>
<i className="faux__refresh-icon fonticon-arrows-cw"></i>
Refresh
</a>
</div>;
RefreshBtn.propTypes = {
refresh: PropTypes.func.isRequired
};