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 21:42:09 +00:00
|
|
|
import 'react-fontawesome';
|
|
|
|
import WebFont from 'webfontloader';
|
2017-08-19 01:25:18 +00:00
|
|
|
import Countdown from './Countdown';
|
|
|
|
import Header from './Header';
|
|
|
|
import getUpcomingDate from './getUpcomingDate';
|
|
|
|
|
|
|
|
import style from './App.sass';
|
|
|
|
|
2017-08-19 21:18:04 +00:00
|
|
|
WebFont.load({
|
|
|
|
google: {
|
2017-08-20 00:35:12 +00:00
|
|
|
families: [
|
|
|
|
'Titillium Web:300,400,700',
|
|
|
|
],
|
2017-08-19 21:42:09 +00:00
|
|
|
},
|
2017-08-19 21:18:04 +00:00
|
|
|
});
|
|
|
|
|
2017-08-19 01:25:18 +00:00
|
|
|
class App extends React.Component {
|
|
|
|
static propTypes = {
|
|
|
|
getNow: PropTypes.func,
|
2017-08-20 01:21:14 +00:00
|
|
|
weekdays: PropTypes.arrayOf(
|
|
|
|
PropTypes.oneOfType([
|
|
|
|
PropTypes.string,
|
|
|
|
PropTypes.number,
|
|
|
|
])),
|
2017-08-19 01:25:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static defaultProps = {
|
|
|
|
getNow: () => moment(),
|
|
|
|
weekdays: [
|
2017-08-20 01:21:14 +00:00
|
|
|
2,
|
|
|
|
4,
|
|
|
|
6,
|
2017-08-19 01:25:18 +00:00
|
|
|
],
|
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
2017-08-19 14:49:02 +00:00
|
|
|
if (!nextUpcomingDate) {
|
|
|
|
return null;
|
|
|
|
}
|
2017-08-19 01:25:18 +00:00
|
|
|
|
|
|
|
return (
|
|
|
|
<div className={style.app}>
|
|
|
|
<Header>
|
2017-08-20 00:35:12 +00:00
|
|
|
<b>rizon</b> VIzon countdown
|
2017-08-19 01:25:18 +00:00
|
|
|
</Header>
|
|
|
|
|
|
|
|
<div className={style.content}>
|
2017-08-19 15:38:20 +00:00
|
|
|
<p>
|
2017-08-20 02:25:59 +00:00
|
|
|
The next VIzon draw is on {nextUpcomingDate.format('dddd')}, {nextUpcomingDate.format('L LT z')}.
|
2017-08-19 15:38:20 +00:00
|
|
|
</p>
|
|
|
|
<Countdown date={nextUpcomingDate} />
|
2017-08-19 21:42:09 +00:00
|
|
|
</div>
|
|
|
|
<div className={style.footer}>
|
2017-08-20 02:25:59 +00:00
|
|
|
Made by Icedream & MAGIC
|
2017-08-19 01:25:18 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export default App;
|