nginx-proxy-manager/frontend/js/app/main.js

156 lines
4.8 KiB
JavaScript
Raw Normal View History

2018-06-19 18:48:14 -04:00
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');
2018-07-18 00:28:41 -04:00
const i18n = require('./i18n');
2018-06-19 18:48:14 -04:00
const App = Mn.Application.extend({
Cache: Cache,
Api: Api,
UI: null,
2018-07-18 02:55:09 -04:00
i18n: i18n,
2018-06-19 18:48:14 -04:00
Controller: Controller,
region: {
el: '#app',
replaceElement: true
},
2018-06-19 18:48:14 -04:00
onStart: function (app, options) {
2018-07-18 00:28:41 -04:00
console.log(i18n('main', 'welcome'));
2018-06-19 18:48:14 -04:00
// 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 => {
2018-07-18 00:28:41 -04:00
Cache.version = [result.version.major, result.version.minor, result.version.revision].join('.');
2018-06-19 18:48:14 -04:00
})
.then(Api.Tokens.refresh)
.then(this.bootstrap)
.then(() => {
2018-07-18 00:28:41 -04:00
console.info(i18n('main', 'logged-in', Cache.User.attributes));
2018-06-19 18:48:14 -04:00
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') === 'admin@example.com') {
Controller.showUserForm(Cache.User);
}
2018-06-19 18:48:14 -04:00
});
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 () {
2018-07-04 18:27:25 -04:00
return Api.Users.getById('me', ['permissions'])
2018-06-19 18:48:14 -04:00
.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('.');
2018-07-18 00:28:41 -04:00
if (version !== Cache.version) {
2018-06-19 18:48:14 -04:00
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;