import "@babel/polyfill";
import "@fortawesome/fontawesome-free/css/all.css";
import "typeface-roboto/index.css";
import Vue from "vue";
import "./plugins/vuetify";
import App from "./App.vue";
import router from "./router";
import store from "./store";
import "./registerServiceWorker";
import errorHandler from "./utils/errorhandler";
import NProgress from "nprogress";
import "nprogress/nprogress.css";
import dayjs from "dayjs";

Vue.config.productionTip = false;

/////////////////////////////////////////////////////////////////
// ERROR HANDLING
//
Vue.config.errorHandler = errorHandler.handleVueError;
window.onerror = errorHandler.handleGeneralError;

/////////////////////////////////////////////////////////////////
// AJAX LOADER INDICATOR
//
// Store a copy of the fetch function
var _oldFetch = fetch;

// Create our new version of the fetch function
window.fetch = function() {
  // Create hooks
  var fetchStart = new Event("fetchStart", {
    view: document,
    bubbles: true,
    cancelable: false
  });
  var fetchEnd = new Event("fetchEnd", {
    view: document,
    bubbles: true,
    cancelable: false
  });

  // Pass the supplied arguments to the real fetch function
  var fetchCall = _oldFetch.apply(this, arguments);

  // Trigger the fetchStart event
  document.dispatchEvent(fetchStart);

  fetchCall
    .then(function() {
      // Trigger the fetchEnd event
      document.dispatchEvent(fetchEnd);
    })
    .catch(function() {
      // Trigger the fetchEnd event
      document.dispatchEvent(fetchEnd);
    });

  return fetchCall;
};

document.addEventListener("fetchStart", function() {
  // eslint-disable-next-line
  //console.log("Show spinner");
  NProgress.start();
});

document.addEventListener("fetchEnd", function() {
  // eslint-disable-next-line
  //console.log("Hide spinner");
  NProgress.done();
});

/////////////////////////////////////////////////////////////////
// FILTERS
//
Vue.filter("capitalize", function(value) {
  if (!value) return "";
  value = value.toString();
  return value.charAt(0).toUpperCase() + value.slice(1);
});

Vue.filter("shortdate", function(value) {
  if (!value) return "";
  var dj = dayjs(value);
  return dj.format("YYYY-MM-DD hh:mm:ss A");
});

Vue.filter("currency", function(value) {
  if (!value) return "";
  return "$" + value;
});

Vue.filter("boolastext", function(value) {
  if (!value) return "";
  return value ? "Yes" : "Nope";
});

/////////////////////////////////////////////////////////////////
// INSTANTIATE
//
new Vue({
  router,
  store,
  render: h => h(App)
}).$mount("#app");
