diff --git a/frontend_tests/node_tests/recent_senders.js b/frontend_tests/node_tests/recent_senders.js index a03ce5951d..369f8608e0 100644 --- a/frontend_tests/node_tests/recent_senders.js +++ b/frontend_tests/node_tests/recent_senders.js @@ -199,4 +199,19 @@ run_test('process_message_for_senders', () => { assert.equal( rs.get_topic_recent_senders(stream5, topic4).toString(), '2,3', ); + + set_global('message_store', { + get: () => message1, + }); + + assert.equal( + rs.get_topic_recent_senders(stream1, topic1).toString(), '2,1', + ); + // delete message1 and message5 sent by sender1 + messages.splice(4, 1); + messages.splice(0, 1); + rs.update_topics_of_message_ids([message1.id, message5.id]); + assert.equal( + rs.get_topic_recent_senders(stream1, topic1).toString(), '2', + ); }); diff --git a/frontend_tests/node_tests/recent_topics.js b/frontend_tests/node_tests/recent_topics.js index 8a035130c0..0c533862a5 100644 --- a/frontend_tests/node_tests/recent_topics.js +++ b/frontend_tests/node_tests/recent_topics.js @@ -620,7 +620,58 @@ run_test('test_reify_local_echo_message', () => { }), false); }); + +run_test('test_delete_messages', () => { + const rt = zrequire('recent_topics'); + rt.set_filter('all'); + rt.process_messages(messages); + + set_global('message_list', { + all: { + all_messages: function () { + // messages[0] was removed. + const reduced_msgs = [...messages]; + reduced_msgs.splice(0, 1); + return reduced_msgs; + }, + }, + }); + + let all_topics = rt.get(); + assert.equal(Array.from(all_topics.keys()).toString(), + '4:topic-10,1:topic-7,1:topic-6,1:topic-5,1:topic-4,1:topic-3,1:topic-2,1:topic-1'); + rt.update_topics_of_message_ids([messages[0].id]); + + all_topics = rt.get(); + assert.equal(Array.from(all_topics.keys()).toString(), + '4:topic-10,1:topic-7,1:topic-6,1:topic-5,1:topic-4,1:topic-3,1:topic-2'); + + set_global('message_list', { + all: { + all_messages: function () { + // messages[0], messages[1] and message[2] were removed. + const reduced_msgs = [...messages]; + reduced_msgs.splice(0, 3); + return reduced_msgs; + }, + }, + }); + + rt.update_topics_of_message_ids([messages[1].id, messages[2].id]); + + all_topics = rt.get(); + assert.equal(Array.from(all_topics.keys()).toString(), + '4:topic-10,1:topic-7,1:topic-6,1:topic-5,1:topic-4,1:topic-3'); +}); + run_test('test_topic_edit', () => { + set_global('message_list', { + all: { + all_messages: function () { + return messages; + }, + }, + }); // NOTE: This test should always run in the end as it modified the messages data. const rt = zrequire('recent_topics'); rt.set_filter('all'); diff --git a/static/js/recent_senders.js b/static/js/recent_senders.js index 02419a1e03..3bf0645b69 100644 --- a/static/js/recent_senders.js +++ b/static/js/recent_senders.js @@ -71,6 +71,26 @@ exports.process_topic_edit = function (old_stream_id, old_topic, new_topic, new_ // the messages were moved to another stream or deleted. }; +exports.update_topics_of_message_ids = function (message_ids) { + const topics_to_update = new Map(); + for (const msg_id of message_ids) { + // Note: message_store retians data of msg post deletion. + const message = message_store.get(msg_id); + // Create unique keys for stream_id and topic. + const topic_key = message.stream_id + ":" + message.topic; + topics_to_update.set(topic_key, [message.stream_id, message.topic]); + } + + for (const [stream_id, topic] of topics_to_update.values()) { + const topic_dict = topic_senders.get(stream_id); + topic_dict.delete(topic); + const topic_msgs = message_util.get_messages_in_topic(stream_id, topic); + for (const msg of topic_msgs) { + exports.process_message_for_senders(msg); + } + } +}; + exports.compare_by_recency = function (user_a, user_b, stream_id, topic) { let a_message_id; let b_message_id; diff --git a/static/js/recent_topics.js b/static/js/recent_topics.js index 9f1820467e..007199a3d3 100644 --- a/static/js/recent_topics.js +++ b/static/js/recent_topics.js @@ -236,6 +236,21 @@ exports.topic_in_search_results = function (keyword, stream, topic) { }); }; +exports.update_topics_of_message_ids = function (message_ids) { + const topics_to_rerender = new Map(); + for (const msg_id of message_ids) { + const message = message_store.get(msg_id); + const topic_key = get_topic_key(message.stream_id, message.topic); + topics_to_rerender.set(topic_key, [message.stream_id, message.topic]); + } + + for (const [stream_id, topic] of topics_to_rerender.values()) { + topics.delete(get_topic_key(stream_id, topic)); + const msgs = message_util.get_messages_in_topic(stream_id, topic); + exports.process_messages(msgs); + } +}; + exports.filters_should_hide_topic = function (topic_data) { const msg = message_store.get(topic_data.last_msg_id); diff --git a/static/js/ui.js b/static/js/ui.js index 5ba8101fe4..24319bda41 100644 --- a/static/js/ui.js +++ b/static/js/ui.js @@ -131,6 +131,8 @@ exports.remove_messages = function (message_ids) { } list.remove_and_rerender(msg_ids_to_rerender); } + recent_senders.update_topics_of_message_ids(message_ids); + recent_topics.update_topics_of_message_ids(message_ids); }; exports.show_failed_message_success = function (message_id) {