react-awesome-countdowntimer
Version:
An awesome countdown timer for reactJS, easy to handle use & edit.
128 lines (122 loc) • 4.93 kB
JavaScript
import React, {Component} from 'react';
import PropTypes from 'prop-types';
import moment from 'moment';
class CountdownTimer extends React.Component {
constructor(props) {
super(props);
this.state = {
timeRemaining: {
months: '',
days: '',
h: '',
m: '',
s: '',
interval: function () {
}
},
startDate: new moment(),
min: new Date(),
startTimer: false
}
this.tick = this.tick.bind(this);
}
componentDidMount() {
this.state.interval = setInterval(this.tick, 1000)
}
componentWillUnmount() {
this.state.interval && clearInterval(this.state.interval);
}
tick() {
if (typeof this.props.endDate === typeof new Date()) {
this.afterEachSecond(this.props.endDate);
} else {
}
}
afterEachSecond(endDate){
var temp = {months: '', days: '', h: '', m: '', s: ''};
var now = moment(); // today's date
var end = moment(endDate); // end date
var duration = moment.duration(end.diff(now));
if (duration.asSeconds() >= 0) {
if (Math.floor(duration.asMonths()) > 0) { if (Math.floor(duration.asMonths()) < 10) { temp.months = '0'+ Math.floor(duration.asMonths())} else {temp.months = Math.floor(duration.asMonths())}}
if (Math.floor(duration.asDays()) > 0) { if (Math.floor(duration.days()) < 10) { temp.days = '0'+ Math.floor(duration.days())} else {temp.days = Math.floor(duration.days())}}
if (Math.floor(duration.asHours()) > 0) { if (Math.floor(duration.hours()) < 10) { temp.h = '0'+ Math.floor(duration.hours())} else {temp.h = Math.floor(duration.hours())}}
if (Math.floor(duration.asMinutes()) > 0) { if (Math.floor(duration.minutes()) < 10) { temp.m = '0'+ Math.floor(duration.minutes())} else {temp.m = Math.floor(duration.minutes())}}
if (Math.floor(duration.asSeconds()) > 0) { if (Math.floor(duration.seconds()) < 10) { temp.s = '0'+ Math.floor(duration.seconds())} else {temp.s = Math.floor(duration.seconds())}}
}
this.setState({
timeRemaining: temp
})
}
render() {
const timer = {
display: 'flex',
justifyContent: 'space-around'
};
const time = {
color: 'white',
fontSize: '74px',
}
const label = {
fontSize: '22px',
display: 'flex',
justifyContent: 'center',
backgroundColor: 'white',
minWidth: 'inherit',
color: '#000',
fontWeight: '100',
}
const section = {
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
minWidth: '100px',
minHeight: '100px',
backgroundColor: 'black',
borderRadius: '7px',
}
return (
<div style={timer}>
{
this.state.timeRemaining.months &&
<div style={section}>
<div className="time" style={time}>{this.state.timeRemaining.months}</div>
<div className="label" style={label}>Months</div>
</div>
}
{
this.state.timeRemaining.days &&
<div style={section} className="section">
<div className="time" style={time}>{this.state.timeRemaining.days}</div>
<div className="label" style={label}>Days</div>
</div>
}
{
this.state.timeRemaining.h &&
<div className="section" style={section}>
<div className="time" style={time}>{this.state.timeRemaining.h}</div>
<div className="label" style={label}>Hours</div>
</div>
}
{
this.state.timeRemaining.m &&
<div className="section" style={section}>
<div className="time" style={time}>{this.state.timeRemaining.m}</div>
<div className="label" style={label}>Minutes</div>
</div>
}
{
this.state.timeRemaining.s &&
<div className="section" style={section}>
<div className="time" style={time}>{this.state.timeRemaining.s}</div>
<div className="label" style={label}>Seconds</div>
</div>
}
</div>
)
}
}
CountdownTimer.PropTypes = {
endDate: PropTypes.object.isRequired,
}
export default CountdownTimer;