| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 | const _          = require('underscore');const Backbone   = require('backbone');const Mn         = require('../lib/marionette');const Cache      = require('./cache');const Controller = require('./controller');const Router     = require('./router');const Api        = require('./api');const Tokens     = require('./tokens');const UI         = require('./ui/main');const i18n       = require('./i18n');const App = Mn.Application.extend({    Cache:      Cache,    Api:        Api,    UI:         null,    i18n:       i18n,    Controller: Controller,    region: {        el:             '#app',        replaceElement: true    },    onStart: function (app, options) {        console.log(i18n('main', 'welcome'));        // Check if token is coming through        if (this.getParam('token')) {            Tokens.addToken(this.getParam('token'));        }        // Check if we are still logged in by refreshing the token        Api.status()            .then(result => {                Cache.version = [result.version.major, result.version.minor, result.version.revision].join('.');            })            .then(Api.Tokens.refresh)            .then(this.bootstrap)            .then(() => {                console.info(i18n('main', 'logged-in', Cache.User.attributes));                this.bootstrapTimer();                this.refreshTokenTimer();                this.UI = new UI();                this.UI.on('render', () => {                    new Router(options);                    Backbone.history.start({pushState: true});                    // Ask the admin use to change their details                    if (Cache.User.get('email') === '[email protected]') {                        Controller.showUserForm(Cache.User);                    }                });                this.getRegion().show(this.UI);            })            .catch(err => {                console.warn('Not logged in:', err.message);                Controller.showLogin();            });    },    History: {        replace: function (data) {            window.history.replaceState(_.extend(window.history.state || {}, data), document.title);        },        get: function (attr) {            return window.history.state ? window.history.state[attr] : undefined;        }    },    getParam: function (name) {        name        = name.replace(/[\[\]]/g, '\\$&');        let url     = window.location.href;        let regex   = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)');        let results = regex.exec(url);        if (!results) {            return null;        }        if (!results[2]) {            return '';        }        return decodeURIComponent(results[2].replace(/\+/g, ' '));    },    /**     * Get user and other base info to start prime the cache and the application     *     * @returns {Promise}     */    bootstrap: function () {        return Api.Users.getById('me', ['permissions'])            .then(response => {                Cache.User.set(response);                Tokens.setCurrentName(response.nickname || response.name);            });    },    /**     * Bootstraps the user from time to time     */    bootstrapTimer: function () {        setTimeout(() => {            Api.status()                .then(result => {                    let version = [result.version.major, result.version.minor, result.version.revision].join('.');                    if (version !== Cache.version) {                        document.location.reload();                    }                })                .then(this.bootstrap)                .then(() => {                    this.bootstrapTimer();                })                .catch(err => {                    if (err.message !== 'timeout' && err.code && err.code !== 400) {                        console.log(err);                        console.error(err.message);                        console.info('Not logged in?');                        Controller.showLogin();                    } else {                        this.bootstrapTimer();                    }                });        }, 30 * 1000); // 30 seconds    },    refreshTokenTimer: function () {        setTimeout(() => {            return Api.Tokens.refresh()                .then(this.bootstrap)                .then(() => {                    this.refreshTokenTimer();                })                .catch(err => {                    if (err.message !== 'timeout' && err.code && err.code !== 400) {                        console.log(err);                        console.error(err.message);                        console.info('Not logged in?');                        Controller.showLogin();                    } else {                        this.refreshTokenTimer();                    }                });        }, 10 * 60 * 1000);    }});const app      = new App();module.exports = app;
 |