Explorar o código

Avoid showing notification messages twice

For example `This groupchat is not anonymous`
JC Brand %!s(int64=6) %!d(string=hai) anos
pai
achega
d77802da86
Modificáronse 4 ficheiros con 99 adicións e 2 borrados
  1. 1 0
      CHANGES.md
  2. 19 1
      dist/converse.js
  3. 61 0
      spec/chatroom.js
  4. 18 1
      src/converse-muc-views.js

+ 1 - 0
CHANGES.md

@@ -4,6 +4,7 @@
 
 - Bugfix. Handler not triggered when submitting MUC password form 2nd time
 - Bugfix. MUC features weren't being refreshed when saving the config form
+- Don't show duplicate notification messages
 - #537 Render `xmpp:` URI as link
 - #1062 Collapse multiple join/leave messages into one
 - #1063 URLs in the topic / subject are not clickable

+ 19 - 1
dist/converse.js

@@ -69899,6 +69899,24 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
           return;
         },
 
+        getNotificationWithMessage(message) {
+          let el = this.content.lastElementChild;
+
+          while (!_.isNil(el)) {
+            const data = _.get(el, 'dataset', {});
+
+            if (!_.includes(_.get(el, 'classList', []), 'chat-info')) {
+              return;
+            }
+
+            if (el.textContent === message) {
+              return el;
+            }
+
+            el = el.previousElementSibling;
+          }
+        },
+
         parseXUserElement(x, stanza, is_self) {
           /* Parse the passed-in <x xmlns='http://jabber.org/protocol/muc#user'>
            * element and construct a map containing relevant
@@ -69911,7 +69929,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
 
           const notification = {};
 
-          const messages = _.reject(_.map(statuses, mapper), _.isUndefined);
+          const messages = _.reject(_.reject(_.map(statuses, mapper), _.isUndefined), message => this.getNotificationWithMessage(message));
 
           if (messages.length) {
             notification.messages = messages;

+ 61 - 0
spec/chatroom.js

@@ -411,6 +411,67 @@
 
         describe("A Groupchat", function () {
 
+            it("shows a notification if its not anonymous",
+                    mock.initConverseWithPromises(
+                        null, ['rosterGroupsFetched', 'chatBoxesFetched'], {},
+                        function (done, _converse) {
+
+                test_utils.openChatRoom(_converse, "coven", 'chat.shakespeare.lit', 'some1')
+                .then(() => {
+                    const view = _converse.chatboxviews.get('coven@chat.shakespeare.lit');
+                    const chat_content = view.el.querySelector('.chat-content');
+                    /* <presence to="dummy@localhost/_converse.js-29092160"
+                     *           from="coven@chat.shakespeare.lit/some1">
+                     *      <x xmlns="http://jabber.org/protocol/muc#user">
+                     *          <item affiliation="owner" jid="dummy@localhost/_converse.js-29092160" role="moderator"/>
+                     *          <status code="110"/>
+                     *          <status code="100"/>
+                     *      </x>
+                     *  </presence></body>
+                     */
+                    let presence = $pres({
+                            to: 'dummy@localhost/resource',
+                            from: 'coven@chat.shakespeare.lit/some1'
+                        }).c('x', {xmlns: Strophe.NS.MUC_USER})
+                        .c('item', {
+                            'affiliation': 'owner',
+                            'jid': 'dummy@localhost/_converse.js-29092160',
+                            'role': 'moderator'
+                        }).up()
+                        .c('status', {code: '110'}).up()
+                        .c('status', {code: '100'});
+
+                    _converse.connection._dataRecv(test_utils.createRequest(presence));
+                    expect(chat_content.querySelectorAll('.chat-info').length).toBe(2);
+                    expect(sizzle('div.chat-info:first', chat_content).pop().textContent)
+                        .toBe("This groupchat is not anonymous");
+                    expect(sizzle('div.chat-info:last', chat_content).pop().textContent)
+                        .toBe("some1 has entered the groupchat");
+
+                    // Check that we don't show the notification twice
+                    presence = $pres({
+                            to: 'dummy@localhost/resource',
+                            from: 'coven@chat.shakespeare.lit/some1'
+                        }).c('x', {xmlns: Strophe.NS.MUC_USER})
+                        .c('item', {
+                            'affiliation': 'owner',
+                            'jid': 'dummy@localhost/_converse.js-29092160',
+                            'role': 'moderator'
+                        }).up()
+                        .c('status', {code: '110'}).up()
+                        .c('status', {code: '100'});
+                    _converse.connection._dataRecv(test_utils.createRequest(presence));
+                    expect(chat_content.querySelectorAll('.chat-info').length).toBe(2);
+                    expect(sizzle('div.chat-info:first', chat_content).pop().textContent)
+                        .toBe("This groupchat is not anonymous");
+                    expect(sizzle('div.chat-info:last', chat_content).pop().textContent)
+                        .toBe("some1 has entered the groupchat");
+
+                    done();
+                }).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL))
+            }));
+
+
             it("shows join/leave messages when users enter or exit a groupchat",
                     mock.initConverseWithPromises(
                         null, ['rosterGroupsFetched', 'chatBoxesFetched'], {},

+ 18 - 1
src/converse-muc-views.js

@@ -1400,6 +1400,20 @@
                     return;
                 },
 
+                getNotificationWithMessage (message) {
+                    let el = this.content.lastElementChild;
+                    while (!_.isNil(el)) {
+                        const data = _.get(el, 'dataset', {});
+                        if (!_.includes(_.get(el, 'classList', []), 'chat-info')) {
+                            return;
+                        }
+                        if (el.textContent === message) {
+                            return el;
+                        }
+                        el = el.previousElementSibling;
+                    }
+                },
+
                 parseXUserElement (x, stanza, is_self) {
                     /* Parse the passed-in <x xmlns='http://jabber.org/protocol/muc#user'>
                      * element and construct a map containing relevant
@@ -1409,7 +1423,10 @@
                     const statuses = x.querySelectorAll('status');
                     const mapper = _.partial(this.getMessageFromStatus, _, stanza, is_self);
                     const notification = {};
-                    const messages = _.reject(_.map(statuses, mapper), _.isUndefined);
+                    const messages = _.reject(
+                        _.reject(_.map(statuses, mapper), _.isUndefined),
+                        message => this.getNotificationWithMessage(message)
+                    );
                     if (messages.length) {
                         notification.messages = messages;
                     }