Forráskód Böngészése

Make sure that `statusInitialized` is always called

regardless of wether it's a connection or reconnection event.

We can then only listen for `statusInitialized` to handle both cases.
JC Brand 7 éve
szülő
commit
1ce46a84ae

+ 2 - 6
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 ************************/
 
 

+ 16 - 27
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);
         }
     });
 }));

+ 19 - 27
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({

+ 0 - 13
src/templates/controlbox_pane.html

@@ -1,13 +0,0 @@
-<form class="pure-form set-xmpp-status" id="set-xmpp-status" action="" method="post">
-    <select id="select-xmpp-status">
-        <option value="online">{{{o.label_online}}}</option>
-        <option value="dnd">{{{o.label_busy}}}</option>
-        <option value="away">{{{o.label_away}}}</option>
-        {[ if (o.include_offline_state)  { ]}
-        <option value="offline">{{{o.label_offline}}}</option>
-        {[ } ]}
-        {[ if (o.allow_logout)  { ]}
-        <option value="logout">{{{o.label_logout}}}</option>
-        {[ } ]}
-    </select>
-</form>