terriajs
Version:
Geospatial data visualization platform.
141 lines (120 loc) • 3.7 kB
JSX
import React from "react";
import PropTypes from "prop-types";
import { observer } from "mobx-react";
import createReactClass from "create-react-class";
import defined from "terriajs-cesium/Source/Core/defined";
import Timer from "../../Generic/Timer/Timer";
import { withTranslation } from "react-i18next";
import Styles from "./timer-section.scss";
const TimerSection = observer(
createReactClass({
displayName: "TimerSection",
propTypes: {
item: PropTypes.object.isRequired,
t: PropTypes.func.isRequired
},
isEnabled() {
return (
defined(this.props.item) &&
this.props.item.isPolling &&
defined(this.props.item.nextScheduledUpdateTime) &&
this.props.item.refreshInterval < 30 * 60 * 1000 // only show refresh timer for refresh intervals less than 30 minutes
);
},
getInitialState() {
return {
secondsLeft: 0
};
},
getCountdownDuration() {
// How many seconds until our next update?
return Math.round(
(this.props.item.nextScheduledUpdateTime.getTime() -
new Date().getTime()) /
1000
);
},
getTimerStartTime() {
return new Date(
this.props.item.nextScheduledUpdateTime -
this.props.item.refreshInterval * 1000
);
},
// Ticks down the countdown clock
countdown() {
if (this.state.secondsLeft > 0) {
this.setState(() => {
return {
secondsLeft: this.state.secondsLeft - 1
};
});
} else {
// Stop.
clearInterval(this.interval);
}
},
startCountdown() {
this.setState({
secondsLeft: this.getCountdownDuration()
});
this.interval = setInterval(this.countdown, 1000);
},
getCountdownString() {
const date = new Date(null);
date.setSeconds(this.state.secondsLeft);
const addLeadingZeroIfRequired = (numString) =>
numString.length < 2 ? "0" + numString : numString;
const minutes = addLeadingZeroIfRequired(date.getMinutes().toString());
const seconds = addLeadingZeroIfRequired(date.getSeconds().toString());
return `00:${minutes}:${seconds}`;
},
componentDidUpdate() {
if (!this.isEnabled()) {
return;
}
if (this.nextUpdate !== this.props.item.nextScheduledUpdateTime) {
if (defined(this.interval)) {
clearInterval(this.interval);
}
this.startCountdown();
this.nextUpdate = this.props.item.nextScheduledUpdateTime;
}
},
componentDidMount() {
if (!this.isEnabled()) {
return;
}
this.startCountdown();
},
componentWillUnmount() {
clearInterval(this.interval);
},
render() {
const { t } = this.props;
return (
<>
<If condition={this.isEnabled()}>
<div className={Styles.section}>
<div className={Styles.timerContainer}>
<Timer
tooltipText={t("timer.nextScheduledUpdateTime", {
scheduledUpdateTime: this.props.item.nextScheduledUpdateTime
})}
radius={10}
start={this.getTimerStartTime().getTime()}
stop={this.props.item.nextScheduledUpdateTime.getTime()}
/>
</div>
<span>
{t("timer.nextScheduledUpdateCountdown", {
timeCountdown: this.getCountdownString()
})}
</span>
</div>
</If>
</>
);
}
})
);
export default withTranslation()(TimerSection);