vizon-countdown-website/src/App.jsx

74 lines
1.6 KiB
React
Raw Normal View History

2017-08-19 01:25:18 +00:00
import React from 'react';
import PropTypes from 'prop-types';
2017-08-19 02:13:04 +00:00
import moment from 'moment-timezone';
2017-08-19 01:25:18 +00:00
import Countdown from './Countdown';
import Header from './Header';
import ProgressCircle from './ProgressCircle';
import getUpcomingDate from './getUpcomingDate';
import style from './App.sass';
class App extends React.Component {
static propTypes = {
getNow: PropTypes.func,
weekdays: PropTypes.arrayOf(PropTypes.string),
}
static defaultProps = {
getNow: () => moment(),
weekdays: [
'tuesday',
'thursday',
'saturday',
],
}
componentDidMount() {
this.interval = setInterval(this.updateUpcomingDate.bind(this), 1000);
this.updateUpcomingDate();
}
componentWillUnmount() {
clearInterval(this.interval);
}
calculateUpcomingDate() {
const { getNow, weekdays } = this.props;
const now = getNow();
return moment.min(
...weekdays.map(weekday => getUpcomingDate(now, weekday)),
);
}
updateUpcomingDate() {
this.setState({ nextUpcomingDate: this.calculateUpcomingDate() });
}
render() {
if (!this.state) {
return null;
}
const { nextUpcomingDate } = this.state;
return (
<div className={style.app}>
<Header>
VIzon countdown
</Header>
<div className={style.content}>
<div className={style.contentContainer}>
<p>
The next VIzon draw is on {nextUpcomingDate.format('dddd')}, {nextUpcomingDate.format('L LT')}.
</p>
<Countdown date={nextUpcomingDate} />
</div>
</div>
</div>
);
}
}
export default App;