From c83026e5a8e1009385438a600c05511af4bb1325 Mon Sep 17 00:00:00 2001 From: JC Brand Date: Wed, 24 May 2017 08:40:09 +0200 Subject: [PATCH] muc: Differentiate between generally unread messages and unread mentions --- spec/roomslist.js | 70 +++++++++++++++++------------- src/converse-muc.js | 31 ++++++++++--- src/converse-roomslist.js | 1 + src/templates/rooms_list_item.html | 2 +- 4 files changed, 66 insertions(+), 38 deletions(-) diff --git a/spec/roomslist.js b/spec/roomslist.js index a30678966..af0e5d360 100644 --- a/spec/roomslist.js +++ b/spec/roomslist.js @@ -51,36 +51,6 @@ describe("An room shown in the rooms list", function () { - it("shows unread messages directed at the user", mock.initConverse( - { whitelisted_plugins: ['converse-roomslist'], - allow_bookmarks: false // Makes testing easier, otherwise we - // have to mock stanza traffic. - }, function (_converse) { - - var room_jid = 'kitchen@conference.shakespeare.lit'; - test_utils.openAndEnterChatRoom( - _converse, 'kitchen', 'conference.shakespeare.lit', 'romeo'); - var view = _converse.chatboxviews.get(room_jid); - view.model.set({'minimized': true}); - - var contact_jid = mock.cur_names[5].replace(/ /g,'.').toLowerCase() + '@localhost'; - var message = 'romeo: Your attention is required'; - var nick = mock.chatroom_names[0], - msg = $msg({ - from: room_jid+'/'+nick, - id: (new Date()).getTime(), - to: 'dummy@localhost', - type: 'groupchat' - }).c('body').t(message).tree(); - view.handleMUCMessage(msg); - - expect(_converse.minimized_chats.toggleview.$('.unread-message-count').is(':visible')).toBeTruthy(); - expect(_converse.minimized_chats.toggleview.$('.unread-message-count').text()).toBe('1'); - - var room_el = _converse.rooms_list_view.el.querySelector(".available-chatroom"); - expect(_.includes(room_el.classList, 'unread-msgs')); - })); - it("can be closed", mock.initConverse( { whitelisted_plugins: ['converse-roomslist'], allow_bookmarks: false // Makes testing easier, otherwise we @@ -106,5 +76,45 @@ expect(room_els.length).toBe(0); expect(_converse.chatboxes.length).toBe(1); })); + + it("shows unread messages directed at the user", mock.initConverse( + { whitelisted_plugins: ['converse-roomslist'], + allow_bookmarks: false // Makes testing easier, otherwise we + // have to mock stanza traffic. + }, function (_converse) { + + var room_jid = 'kitchen@conference.shakespeare.lit'; + test_utils.openAndEnterChatRoom( + _converse, 'kitchen', 'conference.shakespeare.lit', 'romeo'); + var view = _converse.chatboxviews.get(room_jid); + view.model.set({'minimized': true}); + + + var contact_jid = mock.cur_names[5].replace(/ /g,'.').toLowerCase() + '@localhost'; + var nick = mock.chatroom_names[0]; + view.handleMUCMessage( + $msg({ + from: room_jid+'/'+nick, + id: (new Date()).getTime(), + to: 'dummy@localhost', + type: 'groupchat' + }).c('body').t('foo').tree()); + + // If the user isn't mentioned, the counter doesn't get incremented, but the text of the room is bold + var room_el = _converse.rooms_list_view.el.querySelector(".available-chatroom"); + expect(_.includes(room_el.classList, 'unread-msgs')); + + // If the user is mentioned, the counter also gets updated + view.handleMUCMessage( + $msg({ + from: room_jid+'/'+nick, + id: (new Date()).getTime(), + to: 'dummy@localhost', + type: 'groupchat' + }).c('body').t('romeo: Your attention is required').tree() + ); + var indicator_el = _converse.rooms_list_view.el.querySelector(".msgs-indicactor"); + expect(indicator_el.textContent).toBe('1'); + })); }); })); diff --git a/src/converse-muc.js b/src/converse-muc.js index e372fc14c..464b6f786 100755 --- a/src/converse-muc.js +++ b/src/converse-muc.js @@ -362,6 +362,18 @@ _converse.ChatRoom = _converse.ChatBox.extend({ + defaults: _.extend(_converse.ChatBox.prototype.defaults, { + // For group chats, we distinguish between generally unread + // messages and those ones that specifically mention the + // user. + // + // To keep things simple, we reuse `num_unread` from + // _converse.ChatBox to indicate unread messages which + // mention the user and `num_unread_general` to indicate + // generally unread messages (which *includes* mentions!). + 'num_unread_general': 0 + }), + isUserMentioned: function (message) { /* Returns a boolean to indicate whether the current user * was mentioned in a message. @@ -383,14 +395,19 @@ if (_.isNull(body)) { return; // The message has no text } - if (this.isNewMessage(stanza) && - this.newMessageWillBeHidden() && - this.isUserMentioned(body.textContent)) { - - this.save({'num_unread': this.get('num_unread') + 1}); - _converse.incrementMsgCounter(); + if (this.isNewMessage(stanza) && this.newMessageWillBeHidden()) { + this.save({'num_unread_general': this.get('num_unread_general') + 1}); + if (this.isUserMentioned(body.textContent)) { + this.save({'num_unread': this.get('num_unread') + 1}); + _converse.incrementMsgCounter(); + } } }, + + clearUnreadMsgCounter: function() { + this.save({'num_unread': 0}); + this.save({'num_unread_general': 0}); + } }); _converse.ChatRoomView = _converse.ChatBoxView.extend({ @@ -1919,7 +1936,7 @@ } } else if (!this.model.get('features_fetched')) { // The features for this room weren't fetched. - // That must mean it's a new room without locking + // That must mean it's a new room without locking // (in which case Prosody doesn't send a 201 status), // otherwise the features would have been fetched in // the "initialize" method already. diff --git a/src/converse-roomslist.js b/src/converse-roomslist.js index 257133b75..78b9c534d 100644 --- a/src/converse-roomslist.js +++ b/src/converse-roomslist.js @@ -51,6 +51,7 @@ this.model.on('change:bookmarked', this.renderRoomsListElement, this); this.model.on('change:name', this.renderRoomsListElement, this); this.model.on('change:num_unread', this.renderRoomsListElement, this); + this.model.on('change:num_unread_general', this.renderRoomsListElement, this); this.model.on('remove', this.removeRoomsListElement, this); var cachekey = 'converse.roomslist'+_converse.bare_jid; diff --git a/src/templates/rooms_list_item.html b/src/templates/rooms_list_item.html index 949b5d51f..5979e680a 100644 --- a/src/templates/rooms_list_item.html +++ b/src/templates/rooms_list_item.html @@ -1,4 +1,4 @@ -
+
{[ if (num_unread) { ]} {{{ num_unread }}} {[ } ]}