Ver código fonte

Don't show duplicate topic change notifications

JC Brand 5 anos atrás
pai
commit
bc4d016557
2 arquivos alterados com 35 adições e 10 exclusões
  1. 24 4
      spec/muc.js
  2. 11 6
      src/headless/converse-muc.js

+ 24 - 4
spec/muc.js

@@ -608,19 +608,39 @@
                         </message>`)));
                     await u.waitUntil(() => view.model.handleSubjectChange.calls.count() === 2);
 
-                    const el = sizzle('.chat-info__message', view.el).pop();
+                    let el = sizzle('.chat-info__message', view.el).pop();
                     expect(el.textContent.trim()).toBe('Topic set by ralphm');
                     await u.waitUntil(() => desc.textContent.trim()  === 'This is a new topic');
 
+                    // Doesn't show multiple subsequent topic change notifications
+                    _converse.connection._dataRecv(test_utils.createRequest(u.toStanza(`
+                        <message xmlns="jabber:client" to="${_converse.jid}" type="groupchat" from="jdev@conference.jabber.org/ralphm">
+                            <subject>Yet another topic</subject>
+                        </message>`)));
+                    await u.waitUntil(() => view.model.handleSubjectChange.calls.count() === 3);
+                    await u.waitUntil(() => desc.textContent.trim()  === 'Yet another topic');
+                    expect(sizzle('.chat-info__message', view.el).length).toBe(1);
+
+                    // Sow multiple subsequent topic change notification from someone else
+                    _converse.connection._dataRecv(test_utils.createRequest(u.toStanza(`
+                        <message xmlns="jabber:client" to="${_converse.jid}" type="groupchat" from="jdev@conference.jabber.org/some1">
+                            <subject>Some1's topic</subject>
+                        </message>`)));
+                    await u.waitUntil(() => view.model.handleSubjectChange.calls.count() === 4);
+                    await u.waitUntil(() => desc.textContent.trim()  === "Some1's topic");
+                    expect(sizzle('.chat-info__message', view.el).length).toBe(2);
+                    el = sizzle('.chat-info__message', view.el).pop();
+                    expect(el.textContent.trim()).toBe('Topic set by some1');
+
                     // Removes current topic
                     const stanza = u.toStanza(
-                        `<message xmlns="jabber:client" to="${_converse.jid}" type="groupchat" from="jdev@conference.jabber.org/ralphm">
+                        `<message xmlns="jabber:client" to="${_converse.jid}" type="groupchat" from="jdev@conference.jabber.org/some1">
                             <subject/>
                         </message>`);
                     _converse.connection._dataRecv(test_utils.createRequest(stanza));
-                    await u.waitUntil(() => view.model.handleSubjectChange.calls.count() === 3);
+                    await u.waitUntil(() => view.model.handleSubjectChange.calls.count() === 5);
                     await u.waitUntil(() => view.el.querySelector('.chat-head__desc') === null);
-                    expect(view.el.querySelector('.chat-info:last-child').textContent.trim()).toBe("Topic cleared by ralphm");
+                    expect(view.el.querySelector('.chat-info:last-child').textContent.trim()).toBe("Topic cleared by some1");
                     done();
                 }));
             });

+ 11 - 6
src/headless/converse-muc.js

@@ -1703,12 +1703,17 @@ converse.plugins.add('converse-muc', {
                     });
                     if (!attrs.is_delayed) {
                         const message = subject ? __('Topic set by %1$s', author) : __('Topic cleared by %1$s', author);
-                        const data = {
-                            message,
-                            'nick': attrs.nick,
-                            'type': 'info'
-                        };
-                        this.createMessage(data);
+                        const prev_msg = this.messages.last();
+                        if (prev_msg?.get('nick') !== attrs.nick ||
+                                prev_msg?.get('type') !== 'info' ||
+                                prev_msg?.get('message') !== message) {
+
+                            this.createMessage({
+                                message,
+                                'nick': attrs.nick,
+                                'type': 'info'
+                            });
+                        }
                      }
                     return true;
                 }