Browse Source

Also clear MUC occupants upon reconnection

JC Brand 6 years ago
parent
commit
429c320a79
4 changed files with 39 additions and 26 deletions
  1. 6 12
      spec/roster.js
  2. 7 3
      src/headless/converse-chatboxes.js
  3. 4 2
      src/headless/converse-disco.js
  4. 22 9
      src/headless/converse-muc.js

+ 6 - 12
spec/roster.js

@@ -120,13 +120,13 @@
                     null, ['rosterGroupsFetched'], {},
                     async function (done, _converse) {
 
-                var filter = _converse.rosterview.el.querySelector('.roster-filter');
-                var names = mock.cur_names;
+                const filter = _converse.rosterview.el.querySelector('.roster-filter');
+                const names = mock.cur_names;
                 test_utils.openControlBox();
                 _converse.rosterview.update(); // XXX: Will normally called as event handler
                 expect(_.isNull(filter)).toBe(false);
                 await test_utils.waitUntil(() => !u.isVisible(filter));
-                for (var i=0; i<names.length; i++) {
+                for (let i=0; i<names.length; i++) {
                     _converse.roster.create({
                         ask: null,
                         fullname: names[i],
@@ -136,18 +136,12 @@
                     });
                     _converse.rosterview.update(); // XXX: Will normally called as event handler
                 }
-
                 function hasScrollBar (el) {
                     return el.isConnected && el.parentElement.offsetHeight < el.scrollHeight;
                 }
-
-                await test_utils.waitUntil(function () {
-                    if (hasScrollBar(_converse.rosterview.roster_el)) {
-                        return u.isVisible(filter);
-                    } else {
-                        return !u.isVisible(filter);
-                    }
-                });
+                await test_utils.waitUntil(
+                    () => hasScrollBar(_converse.rosterview.roster_el) ? u.isVisible(filter) : !u.isVisible(filter)
+                );
                 done();
             }));
 

+ 7 - 3
src/headless/converse-chatboxes.js

@@ -352,8 +352,7 @@ converse.plugins.add('converse-chatboxes', {
                 }
             },
 
-            onReconnection () {
-                this.clearMessages();
+            announceReconnection () {
                 /**
                  * Triggered whenever a `_converse.ChatBox` instance has reconnected after an outage
                  * @event _converse#onChatReconnected
@@ -363,6 +362,11 @@ converse.plugins.add('converse-chatboxes', {
                 _converse.api.trigger('chatReconnected', this);
             },
 
+            onReconnection () {
+                this.clearMessages();
+                this.announceReconnection();
+            },
+
             validate (attrs, options) {
                 const { _converse } = this.__super__;
                 if (!attrs.jid) {
@@ -1160,8 +1164,8 @@ converse.plugins.add('converse-chatboxes', {
              */
             _converse.api.trigger('chatBoxesInitialized');
         });
-        _converse.api.listen.on('presencesInitialized', () => _converse.chatboxes.onConnected());
 
+        _converse.api.listen.on('presencesInitialized', () => _converse.chatboxes.onConnected());
         _converse.api.listen.on('reconnected', () => _converse.chatboxes.forEach(m => m.onReconnection()));
         /************************ END Event Handlers ************************/
 

+ 4 - 2
src/headless/converse-disco.js

@@ -138,13 +138,15 @@ converse.plugins.add('converse-disco', {
             },
 
             async queryInfo () {
+                let stanza;
                 try {
-                    const stanza = await _converse.api.disco.info(this.get('jid'), null);
-                    this.onInfo(stanza);
+                    stanza = await _converse.api.disco.info(this.get('jid'), null);
                 } catch (iq) {
                     _converse.log(iq, Strophe.LogLevel.ERROR);
                     this.waitUntilFeaturesDiscovered.resolve(this);
+                    return;
                 }
+                this.onInfo(stanza);
             },
 
             onDiscoItems (stanza) {

+ 22 - 9
src/headless/converse-muc.js

@@ -253,12 +253,26 @@ converse.plugins.add('converse-muc', {
                 }
             },
 
-            onReconnection () {
+            clearOccupants () {
+                try {
+                    this.occupants.reset();
+                } catch (e) {
+                    this.occupants.trigger('reset');
+                    _converse.log(e, Strophe.LogLevel.ERROR);
+                } finally {
+                    this.occupants.browserStorage._clear();
+                }
+            },
+
+            async onReconnection () {
                 this.save('connection_status', converse.ROOMSTATUS.DISCONNECTED);
                 this.clearMessages();
+                this.clearOccupants();
                 this.registerHandlers();
-                this.fetchMessages();
-                this.join();
+                // Make sure we refetch features from the XMPP server
+                await _converse.api.disco.refreshFeatures(this.get('jid'));
+                this.announceReconnection();
+                this.enterRoom();
             },
 
             initFeatures () {
@@ -352,17 +366,16 @@ converse.plugins.add('converse-muc', {
              * @param { String } password - Optional password, if required by the groupchat.
              */
             async join (nick, password) {
-                nick = await this.getAndPersistNickname(nick);
-                if (!nick) {
-                    u.safeSave(this, {'connection_status': converse.ROOMSTATUS.NICKNAME_REQUIRED});
-                    return this;
-                }
                 if (this.get('connection_status') === converse.ROOMSTATUS.ENTERED) {
                     // We have restored a groupchat from session storage,
                     // so we don't send out a presence stanza again.
                     return this;
                 }
-
+                nick = await this.getAndPersistNickname(nick);
+                if (!nick) {
+                    u.safeSave(this, {'connection_status': converse.ROOMSTATUS.NICKNAME_REQUIRED});
+                    return this;
+                }
                 const stanza = $pres({
                     'from': _converse.connection.jid,
                     'to': this.getRoomJIDAndNick(nick)