diff --git a/src/converse-chatboxes.js b/src/converse-chatboxes.js index fb00972a9..fab2f975a 100644 --- a/src/converse-chatboxes.js +++ b/src/converse-chatboxes.js @@ -41,12 +41,6 @@ const { _converse } = this.__super__; _converse.chatboxviews.closeAllChatBoxes(); return this.__super__.initStatus.apply(this, arguments); - }, - - onStatusInitialized: function () { - const { _converse } = this.__super__; - _converse.chatboxes.onConnected(); - return this.__super__.onStatusInitialized.apply(this, arguments); } }, @@ -482,6 +476,8 @@ _converse.chatboxes.remove(); // Don't call off(), events won't get re-registered upon reconnect. delete _converse.chatboxes.browserStorage; }); + + _converse.api.listen.on('statusInitialized', () => _converse.chatboxes.onConnected()); /************************ END Event Handlers ************************/ diff --git a/src/converse-controlbox.js b/src/converse-controlbox.js index 540b6f5e7..8bfca70c5 100644 --- a/src/converse-controlbox.js +++ b/src/converse-controlbox.js @@ -221,14 +221,13 @@ const LABEL_CONTACTS = __('Contacts'); - _converse.addControlBox = () => { + _converse.addControlBox = () => _converse.chatboxes.add({ id: 'controlbox', box_id: 'controlbox', type: 'controlbox', closed: !_converse.show_controlbox_by_default }) - }; _converse.ControlBoxView = _converse.ChatBoxView.extend({ tagName: 'div', @@ -291,7 +290,6 @@ _converse.api.waitUntil('rosterViewInitialized') .then(this.insertRoster.bind(this)) .catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL)); - this.model.save(); } }, @@ -350,11 +348,13 @@ this.el.classList.add("col-xl-2"); this.el.classList.add("col-md-3"); - this.controlbox_pane = new _converse.ControlBoxPane(); - this.el.querySelector('.controlbox-panes').insertAdjacentElement( - 'afterBegin', - this.controlbox_pane.el - ) + if (!this.controlbox_pane) { + this.controlbox_pane = new _converse.ControlBoxPane(); + this.el.querySelector('.controlbox-panes').insertAdjacentElement( + 'afterBegin', + this.controlbox_pane.el + ) + } }, close (ev) { @@ -706,34 +706,23 @@ Promise.all([ _converse.api.waitUntil('connectionInitialized'), _converse.api.waitUntil('chatBoxesInitialized') - ]).then(() => { - _converse.addControlBox(); - _converse.chatboxes.get('controlbox').save({connected:true}); - }).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL)); + ]).then(_converse.addControlBox).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL)); + + _converse.on('chatBoxesFetched', () => { + const controlbox = _converse.chatboxes.get('controlbox') || _converse.addControlBox(); + controlbox.save({connected:true}); + }); const disconnect = function () { /* Upon disconnection, set connected to `false`, so that if - * we reconnect, - * "onConnected" will be called, to fetch the roster again and - * to send out a presence stanza. + * we reconnect, "onConnected" will be called, + * to fetch the roster again and to send out a presence stanza. */ const view = _converse.chatboxviews.get('controlbox'); view.model.set({connected:false}); view.renderLoginPanel(); }; _converse.on('disconnected', disconnect); - - const afterReconnected = function () { - /* After reconnection makes sure the controlbox is aware. - */ - const view = _converse.chatboxviews.get('controlbox'); - if (view.model.get('connected')) { - _converse.chatboxviews.get("controlbox").onConnected(); - } else { - view.model.set({connected:true}); - } - }; - _converse.on('reconnected', afterReconnected); } }); })); diff --git a/src/converse-core.js b/src/converse-core.js index 186fd4181..cf39ceae1 100644 --- a/src/converse-core.js +++ b/src/converse-core.js @@ -614,19 +614,24 @@ } }; - this.initStatus = () => - new Promise((resolve, reject) => { - const promise = new u.getResolveablePromise(); + this.initStatus = (reconnecting) => { + + // If there's no xmppstatus obj, then we were never connected to + // begin with, so we set reconnecting to false. + reconnecting = _.isUndefined(_converse.xmppstatus) ? false : reconnecting; + if (reconnecting) { + _converse.onStatusInitialized(reconnecting); + } else { this.xmppstatus = new this.XMPPStatus(); const id = b64_sha1(`converse.xmppstatus-${_converse.bare_jid}`); this.xmppstatus.id = id; // Appears to be necessary for backbone.browserStorage this.xmppstatus.browserStorage = new Backbone.BrowserStorage[_converse.storage](id); this.xmppstatus.fetch({ - success: resolve, - error: resolve + success: _.partial(_converse.onStatusInitialized, reconnecting), + error: _.partial(_converse.onStatusInitialized, reconnecting) }); - _converse.emit('statusInitialized'); - }); + } + } this.initSession = function () { _converse.session = new Backbone.Model(); @@ -808,6 +813,7 @@ * populating the roster etc.) necessary once the connection has * been established. */ + _converse.emit('statusInitialized'); if (reconnecting) { // No need to recreate the roster, otherwise we lose our // cached data. However we still emit an event, to give @@ -821,9 +827,12 @@ _converse.roster.onConnected(); _converse.populateRoster(reconnecting); _converse.registerPresenceHandler(); - if (!reconnecting) { + if (reconnecting) { + _converse.emit('reconnected'); + } else { init_promise.resolve(); _converse.emit('initialized'); + _converse.emit('connected'); } }; @@ -838,28 +847,11 @@ /* Called as soon as a new connection has been established, either * by logging in or by attaching to an existing BOSH session. */ - // Solves problem of returned PubSub BOSH response not received - // by browser. - _converse.connection.flush(); - + _converse.connection.flush(); // Solves problem of returned PubSub BOSH response not received by browser _converse.setUserJid(); _converse.initSession(); _converse.enableCarbons(); - - // If there's no xmppstatus obj, then we were never connected to - // begin with, so we set reconnecting to false. - reconnecting = _.isUndefined(_converse.xmppstatus) ? false : reconnecting; - if (reconnecting) { - _converse.onStatusInitialized(true); - _converse.emit('reconnected'); - } else { - _converse.initStatus() - .then( - _.partial(_converse.onStatusInitialized, false), - _.partial(_converse.onStatusInitialized, false)) - .catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL)); - _converse.emit('connected'); - } + _converse.initStatus(reconnecting) }; this.RosterContact = Backbone.Model.extend({ diff --git a/src/templates/controlbox_pane.html b/src/templates/controlbox_pane.html deleted file mode 100644 index b56efe67a..000000000 --- a/src/templates/controlbox_pane.html +++ /dev/null @@ -1,13 +0,0 @@ -
- -