fluent/fluentd-ui

View on GitHub
app/javascript/packs/navigation.js

Summary

Maintainability
A
1 hr
Test Coverage
const POLLING_INTERVAL = 3 * 1000;
const POLLING_URL = "/polling/alerts";

window.addEventListener("load", () => {
  new Vue({
    el: "#mainNav",
    data: function() {
      return {
        alerts: []
      };
    },

    computed: {
      alertsCount: {
        get: function() { return this.alerts.length; }
      },
      hasAlerts: {
        get: function() { return this.alertsCount > 0; }
      }
    },

    created: function(){
      let timer;
      let self = this;
      let currentInterval = POLLING_INTERVAL;
      let fetch = function(){
        self.fetchAlertsData().then(function(alerts){
          if(self.alerts.toString() == alerts.toString()) {
            currentInterval *= 1.1;
          } else {
            currentInterval = POLLING_INTERVAL;
          }
          self.alerts = alerts;
          timer = setTimeout(fetch, currentInterval);
        })["catch"](function(xhr){
          if(xhr.status === 401) {
            // signed out
          }
          if(xhr.status === 0) {
            // server unreachable (maybe down)
          }
        });
      };
      window.addEventListener("focus", function(_event){
        currentInterval = POLLING_INTERVAL;
        timer = setTimeout(fetch, currentInterval);
      }, false);
      window.addEventListener("blur", function(_event){
        clearTimeout(timer);
      }, false);
      fetch();
    },

    methods: {
      fetchAlertsData: function() {
        return new Promise(function(resolve, reject) {
          $.getJSON(POLLING_URL, resolve).fail(reject);
        });
      }
    }
  });
});