Event countdown

The countdown uses an event date to calculate how much time is left until a event, in this example you will learn how to create a countdown using Lemonadejs!

A working example

See this example on jsfiddle.net

Source code

<html>
<link rel="stylesheet" href="https://jsuites.net/jsuites.css" type="text/css" />
<link rel="stylesheet" href="https://jsuites.net/jsuites.layout.css" type="text/css" />
<script type="text/javascript" src="https://jsuites.net/jsuites.js"></script>
<script src="https://lemonadejs.com/v1/lemonade.js"></script>
<div id='root'></div>
<script>
var Countdown = (function(container) {
    var self = {};

    self.days = '00';
    self.hours = '00';
    self.minutes = '00';
    self.seconds = '00';
    self.calendar = null;
    self.eventTimeElement = null;
    self.selectedDate = null;

    self.createCalendar = function(o) {
        self.calendar = jSuites.calendar(o);
    }

    self.startCountdown = function() {
        var userInput = self.validateInput();
        if(userInput) {
            self.selectedDate = self.calendar.getValue().slice(0,10) + " " + userInput;
            var timeLeft = self.getTimeLeft(self.selectedDate);
            if (timeLeft) {
                self.start();
            } else {
                alert('Invalid date, please select a later date')
            }
        } else {
            alert('Invalid input');
        }
    }

    self.validateInput = function() {
        var [h, m, s] = self.eventTimeElement.value.split(':');
        if (! isNaN(h) && ! isNaN(m) && ! isNaN(s) && (h >= 0 && h <= 24) && (m >= 0 && m <= 60) && (s >= 0 && s <= 60)) {
            return self.eventTimeElement.value;
        }
        return false;
    }

    self.getTimeLeft = function(eventDate) {
        var timeLeft = new Date(eventDate) - Date.now();
        return timeLeft > 0 ? timeLeft : false;
    }

    self.getFormattedTimeLeft = function(timeLeft) {
        var days = timeLeft / (1000 * 3600 * 24);
        var hours = (days - parseInt(days)) * 24;
        var minutes = (hours - parseInt(hours)) * 60;
        var seconds = (minutes - parseInt(minutes)) * 60;
        return [days, hours, minutes, seconds].map(n => parseInt(n));
    }

    self.start = function() {
        var timeLeft = self.getTimeLeft(self.selectedDate);
        var [d, h, m, s] = self.getFormattedTimeLeft(timeLeft);

        self.days = jSuites.two(d);
        self.hours = jSuites.two(h);
        self.minutes = jSuites.two(m);
        self.seconds = jSuites.two(s);

        if (d || h || m || s) {
            return setTimeout(self.start, 1000);
        } else {
            alert("Event countdown finished!");
        }
    }

    var template = `
    <div class="row" style="justify-content: space-evenly">
    <div class="column" @ready="self.createCalendar(this)"></div>
    <div class="column" style="color: #051e3e; font-weight: 600; background: #e6e6ea; border-radius: 8px; box-shadow: 0px 1px 5px 1px rgba(0,0,0,0.65);">
        <div class="form-group p10">
            <label>Event start time</label>
            <input @ref="self.eventTimeElement" type="text" placeholder="Example: 20:00:00"/>
        </div>
        <div class="row center p10">
            <div class="column f1">
                <span style="font-size: 1.8em;">{{self.days}}</span>
                <span style="display: block;">Days</span>
             </div>
             <div class="column f1">
                <span style="font-size: 1.8em;">{{self.hours}}</span>
                <span style="display: block;">Hours</span>
              </div>
              <div class="column f1">
                 <span style="font-size: 1.8em;">{{self.minutes}}</span>
                 <span style="display: block;">Minutes</span>
              </div>
              <div class="column f1">
                 <span style="font-size: 1.8em;">{{self.seconds}}</span>
                 <span style="display: block;">Seconds</span>
              </div>  
        </div>
        <div class="row p15" style="justify-content: center;">
            <button class="jbutton dark" onclick="self.startCountdown()">Start countdown</button>
        </div>
    </div>
</div>
    `
    return lemonade.element(template, self);
});
lemonade.render(Countdown, document.getElementById('root'));
</script>