mirror of
https://github.com/zulip/zulip.git
synced 2025-11-03 13:33:24 +00:00
unread: Handle message edits that affect mentions.
We had a bug where if your peer mentioned you in message, but then edited the message not to mention you, the latter wouldn't reset your unread counts for "Mentions". And the same problem would happen vice versa. The fix basically extracts `update_message_for_mention` and makes sure it handles all combinations of unread/mentioned flags, instead of assuming any invariants about which directions of change are possible. And then we call that new function from `message_events.js` whenever we get message edit events. Fixes #14544
This commit is contained in:
@@ -61,7 +61,7 @@ run_test('update_messages', () => {
|
||||
const original_message = {
|
||||
id: 111,
|
||||
display_recipient: denmark.name,
|
||||
flags: [],
|
||||
flags: ['mentioned'],
|
||||
sender_id: alice.user_id,
|
||||
stream_id: denmark.stream_id,
|
||||
topic: 'lunch',
|
||||
@@ -71,6 +71,7 @@ run_test('update_messages', () => {
|
||||
message_store.add_message_metadata(original_message);
|
||||
message_store.set_message_booleans(original_message);
|
||||
|
||||
assert.equal(original_message.mentioned, true);
|
||||
assert.equal(original_message.unread, true);
|
||||
|
||||
assert.deepEqual(
|
||||
@@ -78,6 +79,9 @@ run_test('update_messages', () => {
|
||||
['lunch']
|
||||
);
|
||||
|
||||
unread.update_message_for_mention(original_message);
|
||||
assert(unread.unread_mentions_counter.has(original_message.id));
|
||||
|
||||
const events = [
|
||||
{
|
||||
message_id: original_message.id,
|
||||
@@ -118,6 +122,8 @@ run_test('update_messages', () => {
|
||||
// TEST THIS:
|
||||
message_events.update_messages(events);
|
||||
|
||||
assert(!unread.unread_mentions_counter.has(original_message.id));
|
||||
|
||||
helper.verify();
|
||||
|
||||
assert.deepEqual(rendered_mgs, [
|
||||
|
||||
@@ -553,6 +553,40 @@ run_test('mentions', () => {
|
||||
test_notifiable_count(counts.home_unread_messages, 0);
|
||||
});
|
||||
|
||||
run_test('mention updates', () => {
|
||||
const message = {
|
||||
id: 17,
|
||||
unread: false,
|
||||
type: 'stream',
|
||||
};
|
||||
|
||||
function test_counted(counted) {
|
||||
unread.update_message_for_mention(message);
|
||||
assert.equal(
|
||||
unread.unread_mentions_counter.has(message.id),
|
||||
counted
|
||||
);
|
||||
}
|
||||
|
||||
test_counted(false);
|
||||
|
||||
message.unread = true;
|
||||
message.mentioned = true;
|
||||
test_counted(true);
|
||||
|
||||
message.mentioned = false;
|
||||
test_counted(false);
|
||||
|
||||
message.mentioned = true;
|
||||
test_counted(true);
|
||||
|
||||
message.unread = false;
|
||||
test_counted(false);
|
||||
|
||||
message.unread = true;
|
||||
test_counted(true);
|
||||
});
|
||||
|
||||
run_test('starring', () => {
|
||||
// We don't need any setup here, because we just hard code
|
||||
// this to [] in the code.
|
||||
|
||||
@@ -121,6 +121,8 @@ exports.update_messages = function update_messages(events) {
|
||||
|
||||
message_store.update_booleans(msg, event.flags);
|
||||
|
||||
unread.update_message_for_mention(msg);
|
||||
|
||||
condense.un_cache_message_content_height(msg.id);
|
||||
|
||||
if (event.rendered_content !== undefined) {
|
||||
|
||||
@@ -434,12 +434,25 @@ exports.process_loaded_messages = function (messages) {
|
||||
);
|
||||
}
|
||||
|
||||
const is_unmuted_mention = message.type === 'stream' && message.mentioned &&
|
||||
!muting.is_topic_muted(message.stream_id,
|
||||
message.topic);
|
||||
if (message.mentioned_me_directly || is_unmuted_mention) {
|
||||
exports.unread_mentions_counter.add(message.id);
|
||||
}
|
||||
exports.update_message_for_mention(message);
|
||||
}
|
||||
};
|
||||
|
||||
exports.update_message_for_mention = function (message) {
|
||||
if (!message.unread) {
|
||||
exports.unread_mentions_counter.delete(message.id);
|
||||
return;
|
||||
}
|
||||
|
||||
const is_unmuted_mention =
|
||||
message.type === 'stream' &&
|
||||
message.mentioned &&
|
||||
!muting.is_topic_muted(message.stream_id, message.topic);
|
||||
|
||||
if (is_unmuted_mention || message.mentioned_me_directly) {
|
||||
exports.unread_mentions_counter.add(message.id);
|
||||
} else {
|
||||
exports.unread_mentions_counter.delete(message.id);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user