var Login = require ('./login'); var Gui = require ('./gui'); module.exports = new Class ({ Extends: Vn.Object, Properties: { conn: { type: Db.Connection ,get: function () { return this._conn; } } } ,initialize: function () { window.onerror = this._onWindowError.bind (this); window.onunload = this._onWindowUnload.bind (this); Vn.Hash.initialize (); var conn = new Db.Connection (); this.link ({_conn: conn}, {'error': this._onConnError}); this.initAutoLogin (); } ,run: function () { if (this.tryAutoLogin ()) return; var login = this._login = new Login ({conn: this._conn}); login.on ('login', this._onLogin, this); login.show (); } ,_onLogin: function () { this._freeLogin (); var gui = this._gui = new Gui ({conn: this._conn}); gui.on ('logout', this._onLogout, this); gui.show (); } ,_onLogout: function (gui) { this.clearAutoLogin (); this._freeGui (); this.run (); } ,_onWindowUnload: function () { this.unref (); } ,_onWindowError: function (message, file, line, col, err) { var error = new Error (message); error.fileName = file; error.lineNumber = line; this._notifyError (error); } ,_onConnError: function (conn, error) { if (error instanceof Vn.JsonException) switch (error.exception) { case 'BadLogin': Htk.Toast.showError (_('Invalid login')); this._logout (); break; case 'SessionExpired': Htk.Toast.showError (_('You\'ve been too idle')); this._logout (); break; case 'OutdatedVersion': this._newVersion (error); break; default: Htk.Toast.showError (error.message); } else { console.error (error); this._notifyError (error); } } ,_logout: function () { if (this._gui) this._gui.logout (); } ,_newVersion: function (error) { 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: function () { location.reload (); } ,_notifyError: function (error) { Htk.Toast.showError (_('Something went wrong')); var params = { 'file': error.fileName ,'line': error.lineNumber ,'message': error.message ,'stack': error.stack }; this._conn.send ('core/log', params); } ,_freeLogin: function () { if (this._login) { this._login.disconnectByInstance (this); this._login.hide (); this._login.unref (); this._login = null; } } ,_freeGui: function () { if (this._gui) { this._gui.disconnectByInstance (this); this._gui.hide (); this._gui.unref (); this._gui = null; } } ,_destroy: function () { this._freeLogin (); this._freeGui (); this.deinitAutoLogin (); this._conn.unref (); } // Auto login functionality ,_firstLogin: true ,initAutoLogin: function () { var isGuest = new Vn.HashParam ({ type: Boolean, key: 'guest' }); this.link ({_isGuest: isGuest}, {'changed': this._onGuestChange}); var token = new Vn.HashParam ({ type: String, key: 'token' }); this.link ({_token: token}, {'changed': this._onTokenChange}); } ,_onGuestChange: function () { if (this._isGuest.value) setTimeout (this.tryAutoLogin.bind (this)); } ,_onTokenChange: function () { if (this._token.value) setTimeout (this.tryAutoLogin.bind (this)); } ,deinitAutoLogin: function () { this._isGuest.unref (); this._token.unref (); } ,autoLogin: function () { 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: function () { var ok = this.autoLogin (); this._firstLogin = false; this._isGuest.value = undefined; this._token.value = undefined; if (!ok) return false; this._onLogin (); return true; } ,clearAutoLogin: function () { localStorage.removeItem ('hederaGuest'); } });