forked from verdnatura/hedera-web
257 lines
4.7 KiB
JavaScript
257 lines
4.7 KiB
JavaScript
|
|
var Login = require('./login');
|
|
var Gui = require('./gui');
|
|
|
|
module.exports = new Class({
|
|
Extends: Vn.Object,
|
|
Properties: {
|
|
conn: {
|
|
type: Db.Connection
|
|
,get() {
|
|
return this._conn;
|
|
}
|
|
}
|
|
}
|
|
|
|
,initialize() {
|
|
window.onerror = this._onWindowError.bind(this);
|
|
window.onunhandledrejection = e => this._onWindowRejection(e);
|
|
window.onunload = this._onWindowUnload.bind(this);
|
|
|
|
this._hash = new Vn.Hash({window: window});
|
|
|
|
var conn = new Db.Connection();
|
|
this.link({_conn: conn}, {'error': this._onConnError});
|
|
|
|
this.initAutoLogin();
|
|
}
|
|
|
|
,run() {
|
|
if (this.tryAutoLogin())
|
|
return;
|
|
|
|
var login = this._login = new Login({
|
|
conn: this._conn,
|
|
hash: this._hash
|
|
});
|
|
login.on('login', this._onLogin, this);
|
|
login.show();
|
|
}
|
|
|
|
,_onLogin() {
|
|
this._freeLogin();
|
|
|
|
if (this._gui)
|
|
return;
|
|
|
|
var gui = this._gui = new Gui({
|
|
conn: this._conn,
|
|
hash: this._hash
|
|
});
|
|
gui.on('logout', this._onLogout, this);
|
|
gui.show();
|
|
}
|
|
|
|
,_onLogout() {
|
|
this.clearAutoLogin();
|
|
this._freeGui();
|
|
this.run();
|
|
}
|
|
|
|
,_onWindowUnload() {
|
|
this.unref();
|
|
}
|
|
|
|
,_onWindowError(message, file, line) {
|
|
var error = new Error(message);
|
|
error.fileName = file;
|
|
error.lineNumber = line;
|
|
this._notifyError(error);
|
|
}
|
|
|
|
,_onWindowRejection(event) {
|
|
const err = event.reason;
|
|
this._onConnError(null, err);
|
|
event.preventDefault();
|
|
}
|
|
|
|
,_onConnError(conn, error) {
|
|
if (error instanceof Vn.JsonException) {
|
|
if (error.message)
|
|
Htk.Toast.showError(error.message);
|
|
else
|
|
switch (error.exception) {
|
|
case 'BadLogin':
|
|
Htk.Toast.showError(_('Invalid login'));
|
|
this._logout();
|
|
break;
|
|
case 'Forbidden':
|
|
Htk.Toast.showError(_('You don\'t have enough privileges'));
|
|
break;
|
|
case 'UserDisabled':
|
|
Htk.Toast.showError(_('User disabled'));
|
|
this._logout();
|
|
break;
|
|
case 'SessionExpired':
|
|
Htk.Toast.showError(_('Session expired'));
|
|
this._logout();
|
|
break;
|
|
case 'OutdatedVersion':
|
|
this._newVersion(error);
|
|
break;
|
|
default:
|
|
Htk.Toast.showError(error.message);
|
|
}
|
|
} else if (error.statusCode) {
|
|
switch (error.statusCode) {
|
|
case 401:
|
|
Htk.Toast.showError(_('Invalid login'));
|
|
this._logout();
|
|
break;
|
|
default:
|
|
Htk.Toast.showError(error.message);
|
|
}
|
|
} else {
|
|
console.error(error);
|
|
this._notifyError(error);
|
|
}
|
|
}
|
|
|
|
,_logout() {
|
|
if (this._gui)
|
|
this._gui.logout();
|
|
}
|
|
|
|
,_newVersion() {
|
|
if (this.ignoreVersion)
|
|
return;
|
|
|
|
this.ignoreVersion = true;
|
|
|
|
var dialog = new Htk.Dialog({
|
|
message: _('New version available')
|
|
,buttons: Htk.Dialog.Button.ACCEPT
|
|
,icon: 'warning'
|
|
});
|
|
dialog.on('response', this._onNewVersionResponse, this);
|
|
dialog.open();
|
|
}
|
|
|
|
,_onNewVersionResponse() {
|
|
location.reload();
|
|
}
|
|
|
|
,_notifyError(error) {
|
|
Htk.Toast.showError(_('Something went wrong'));
|
|
|
|
var params = {
|
|
file: error.fileName
|
|
,line: error.lineNumber
|
|
,message: error.message
|
|
,stack: error.stack
|
|
,agent: navigator.userAgent
|
|
,location: location.href
|
|
};
|
|
this._conn.send('core/log', params);
|
|
}
|
|
|
|
,_freeLogin() {
|
|
if (this._login) {
|
|
this._login.disconnectByInstance(this);
|
|
this._login.hide();
|
|
this._login.unref();
|
|
this._login = null;
|
|
}
|
|
}
|
|
|
|
,_freeGui() {
|
|
if (this._gui) {
|
|
this._gui.disconnectByInstance(this);
|
|
this._gui.hide();
|
|
this._gui.unref();
|
|
this._gui = null;
|
|
}
|
|
}
|
|
|
|
,_destroy() {
|
|
this._freeLogin();
|
|
this._freeGui();
|
|
this.deinitAutoLogin();
|
|
this._conn.unref();
|
|
this._hash.unref();
|
|
}
|
|
|
|
// Auto login functionality
|
|
|
|
,_firstLogin: true
|
|
|
|
,initAutoLogin() {
|
|
var isGuest = new Vn.Param({
|
|
lot: this._hash,
|
|
type: Boolean,
|
|
name: 'guest'
|
|
});
|
|
this.link({_isGuest: isGuest}, {'changed': this._onGuestChange});
|
|
|
|
var token = new Vn.Param({
|
|
lot: this._hash,
|
|
type: String,
|
|
name: 'token'
|
|
});
|
|
this.link({_token: token}, {'changed': this._onTokenChange});
|
|
}
|
|
|
|
,_onGuestChange() {
|
|
if (this._isGuest.value)
|
|
setTimeout(this.tryAutoLogin.bind(this));
|
|
}
|
|
|
|
,_onTokenChange() {
|
|
if (this._token.value)
|
|
setTimeout(this.tryAutoLogin.bind(this));
|
|
}
|
|
|
|
,deinitAutoLogin() {
|
|
this._isGuest.unref();
|
|
this._token.unref();
|
|
}
|
|
|
|
,autoLogin() {
|
|
var guest = localStorage.getItem('hederaGuest');
|
|
|
|
if (this._isGuest.value || guest) {
|
|
localStorage.setItem('hederaGuest', true);
|
|
return true;
|
|
}
|
|
|
|
if (this._token.value)
|
|
this._conn.token = this._token.value;
|
|
else
|
|
this._conn.fetchToken();
|
|
|
|
if (this._conn.token)
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
,tryAutoLogin() {
|
|
var ok = this.autoLogin();
|
|
|
|
this._firstLogin = false;
|
|
this._isGuest.value = undefined;
|
|
this._token.value = undefined;
|
|
|
|
if (!ok)
|
|
return false;
|
|
|
|
this._onLogin();
|
|
return true;
|
|
}
|
|
|
|
,clearAutoLogin() {
|
|
localStorage.removeItem('hederaGuest');
|
|
}
|
|
});
|
|
|