Skip to content

Commit cae5e9c

Browse files
deleolajidejcbrand
authored andcommitted
Updates #1999 - Demarcate first unread message
1 parent 6157189 commit cae5e9c

7 files changed

+57
-12
lines changed

CHANGES.md

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ Soon we'll deprecate the latter, so prepare now.
2121
- #1896: Don't send receipts for messages fetched from the archive
2222
- #1937: Editing a message removes the mentions highlight
2323
- #1963: Mentions are visually incorrect when used in message replies
24+
- #1999: Demarcate first unread message
2425
- #2002: fix rendering of `muc_roomid_policy_hint`
2526
- #2006: fix rendering of emojis in case `use_system_emojis == false`
2627
- Allow ignoring of bootstrap modules at build using environment variable. For xample: `export BOOTSTRAP_IGNORE_MODULES="Modal,Dropdown" && make dist`

package-lock.json

+14-7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

spec/chatbox.js

+19-4
Original file line numberDiff line numberDiff line change
@@ -1296,6 +1296,8 @@ describe("Chatboxes", function () {
12961296
await _converse.handleMessageStanza(msg);
12971297
await u.waitUntil(() => view.model.messages.length);
12981298
expect(view.model.get('num_unread')).toBe(1);
1299+
const msgid = view.model.messages.last().get('id');
1300+
expect(view.model.get('first_unread_id')).toBe(msgid);
12991301
done();
13001302
}));
13011303

@@ -1329,9 +1331,12 @@ describe("Chatboxes", function () {
13291331
await mock.openChatBoxFor(_converse, sender_jid);
13301332
const chatbox = _converse.chatboxes.get(sender_jid);
13311333
_converse.windowState = 'hidden';
1332-
_converse.handleMessageStanza(msgFactory());
1334+
const msg = msgFactory();
1335+
_converse.handleMessageStanza(msg);
13331336
await u.waitUntil(() => chatbox.messages.length);
13341337
expect(chatbox.get('num_unread')).toBe(1);
1338+
const msgid = chatbox.messages.last().get('id');
1339+
expect(chatbox.get('first_unread_id')).toBe(msgid);
13351340
done();
13361341
}));
13371342

@@ -1347,9 +1352,12 @@ describe("Chatboxes", function () {
13471352
const chatbox = _converse.chatboxes.get(sender_jid);
13481353
chatbox.save('scrolled', true);
13491354
_converse.windowState = 'hidden';
1350-
_converse.handleMessageStanza(msgFactory());
1355+
const msg = msgFactory();
1356+
_converse.handleMessageStanza(msg);
13511357
await u.waitUntil(() => chatbox.messages.length);
13521358
expect(chatbox.get('num_unread')).toBe(1);
1359+
const msgid = chatbox.messages.last().get('id');
1360+
expect(chatbox.get('first_unread_id')).toBe(msgid);
13531361
done();
13541362
}));
13551363

@@ -1364,9 +1372,12 @@ describe("Chatboxes", function () {
13641372
await mock.openChatBoxFor(_converse, sender_jid);
13651373
const chatbox = _converse.chatboxes.get(sender_jid);
13661374
_converse.windowState = 'hidden';
1367-
_converse.handleMessageStanza(msgFactory());
1375+
const msg = msgFactory();
1376+
_converse.handleMessageStanza(msg);
13681377
await u.waitUntil(() => chatbox.messages.length);
13691378
expect(chatbox.get('num_unread')).toBe(1);
1379+
const msgid = chatbox.messages.last().get('id');
1380+
expect(chatbox.get('first_unread_id')).toBe(msgid);
13701381
_converse.saveWindowState(null, 'focus');
13711382
expect(chatbox.get('num_unread')).toBe(0);
13721383
done();
@@ -1384,11 +1395,15 @@ describe("Chatboxes", function () {
13841395
const chatbox = _converse.chatboxes.get(sender_jid);
13851396
chatbox.save('scrolled', true);
13861397
_converse.windowState = 'hidden';
1387-
_converse.handleMessageStanza(msgFactory());
1398+
const msg = msgFactory();
1399+
_converse.handleMessageStanza(msg);
13881400
await u.waitUntil(() => chatbox.messages.length);
13891401
expect(chatbox.get('num_unread')).toBe(1);
1402+
const msgid = chatbox.messages.last().get('id');
1403+
expect(chatbox.get('first_unread_id')).toBe(msgid);
13901404
_converse.saveWindowState(null, 'focus');
13911405
expect(chatbox.get('num_unread')).toBe(1);
1406+
expect(chatbox.get('first_unread_id')).toBe(msgid);
13921407
done();
13931408
}));
13941409
});

src/converse-message-view.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ converse.plugins.add('converse-message-view', {
145145
return this.renderFileUploadProgresBar();
146146
}
147147
const isValidChange = prop => Object.prototype.hasOwnProperty.call(this.model.changed, prop);
148-
const props = ['moderated', 'retracted', 'correcting', 'message', 'type', 'upload', 'received', 'editable'];
148+
const props = ['moderated', 'retracted', 'correcting', 'message', 'type', 'upload', 'received', 'editable', 'first_unread'];
149149
if (props.filter(isValidChange).length) {
150150
await this.debouncedRender();
151151
}

src/headless/converse-chat.js

+18
Original file line numberDiff line numberDiff line change
@@ -1110,11 +1110,29 @@ converse.plugins.add('converse-chat', {
11101110
return;
11111111
}
11121112
if (utils.isNewMessage(message) && this.isHidden()) {
1113+
this.setFirstUnreadMsgId(message);
11131114
this.save({'num_unread': this.get('num_unread') + 1});
11141115
_converse.incrementMsgCounter();
11151116
}
11161117
},
11171118

1119+
/**
1120+
* Sets the msgid of the first unread realtime message in a ChatBox.
1121+
* @param {_converse.Message} message
1122+
*/
1123+
setFirstUnreadMsgId (message) {
1124+
if (this.get('num_unread') == 0) {
1125+
const first_unread_id = this.get('first_unread_id');
1126+
1127+
if (first_unread_id) {
1128+
const msg = this.messages.get(first_unread_id);
1129+
if (msg) msg.save("first_unread", false);
1130+
}
1131+
message.save("first_unread", true);
1132+
this.save({'first_unread_id': message.get('id')});
1133+
}
1134+
},
1135+
11181136
clearUnreadMsgCounter () {
11191137
u.safeSave(this, {'num_unread': 0});
11201138
},

src/headless/converse-muc.js

+1
Original file line numberDiff line numberDiff line change
@@ -2387,6 +2387,7 @@ converse.plugins.add('converse-muc', {
23872387
const body = message.get('message');
23882388
if (!body) { return; }
23892389
if (u.isNewMessage(message) && this.isHidden()) {
2390+
this.setFirstUnreadMsgId(message);
23902391
const settings = {'num_unread_general': this.get('num_unread_general') + 1};
23912392
if (this.isUserMentioned(message)) {
23922393
settings.num_unread = this.get('num_unread') + 1;

src/templates/message.html

+3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
<canvas class="avatar chat-msg__avatar" height="36" width="36"></canvas>
55
{[ } ]}
66
<div class="chat-msg__content chat-msg__content--{{{o.sender}}} {{{o.is_me_message ? 'chat-msg__content--action' : ''}}}">
7+
{[ if (o.first_unread) { ]}
8+
<div class="message date-separator"><hr class="separator"><span class="separator-text">{{{o.__('unread messages')}}}</span></div>
9+
{[ } ]}
710
<span class="chat-msg__heading">
811
{[ if (o.is_me_message) { ]}<time timestamp="{{{o.isodate}}}" class="chat-msg__time">{{{o.pretty_time}}}</time>{[ } ]}
912
<span class="chat-msg__author">{[ if (o.is_me_message) { ]}**{[ }; ]}{{{o.username}}}</span>

0 commit comments

Comments
 (0)