Skip to content

Commit a653a73

Browse files
sahil839timabbott
authored andcommitted
message_view: Live update on losing access to a stream.
This commit adds code to live update the message view when user loses access to a stream and also remove the data of messages from that stream. (cherry picked from commit 52b2035)
1 parent 7074abd commit a653a73

File tree

6 files changed

+114
-33
lines changed

6 files changed

+114
-33
lines changed

web/src/message_store.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,3 +348,9 @@ export function remove(message_ids: number[]): void {
348348
stored_messages.delete(message_id);
349349
}
350350
}
351+
352+
export function get_message_ids_in_stream(stream_id: number): number[] {
353+
return [...stored_messages.values()]
354+
.filter((message) => message.type === "stream" && message.stream_id === stream_id)
355+
.map((message) => message.id);
356+
}

web/src/server_events_dispatch.js

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import $ from "jquery";
2-
import assert from "minimalistic-assert";
32

43
import * as activity_ui from "./activity_ui.ts";
54
import * as alert_words from "./alert_words.ts";
@@ -29,9 +28,9 @@ import * as message_edit from "./message_edit.ts";
2928
import * as message_events from "./message_events.ts";
3029
import * as message_lists from "./message_lists.ts";
3130
import * as message_live_update from "./message_live_update.ts";
31+
import * as message_store from "./message_store.ts";
3232
import * as message_view from "./message_view.ts";
3333
import * as muted_users_ui from "./muted_users_ui.ts";
34-
import * as narrow_state from "./narrow_state.ts";
3534
import * as narrow_title from "./narrow_title.ts";
3635
import * as navbar_alerts from "./navbar_alerts.ts";
3736
import * as onboarding_steps from "./onboarding_steps.ts";
@@ -647,7 +646,6 @@ export function dispatch_normal_event(event) {
647646
case "delete":
648647
for (const stream_id of event.stream_ids) {
649648
const was_subscribed = sub_store.get(stream_id).subscribed;
650-
const is_narrowed_to_stream = narrow_state.narrowed_to_stream_id(stream_id);
651649
stream_data.delete_sub(stream_id);
652650
stream_settings_ui.remove_stream(stream_id);
653651
if (was_subscribed) {
@@ -670,10 +668,10 @@ export function dispatch_normal_event(event) {
670668
"zulip_update_announcements_stream_id",
671669
);
672670
}
673-
if (is_narrowed_to_stream) {
674-
assert(message_lists.current !== undefined);
675-
message_lists.current.update_trailing_bookend(true);
676-
}
671+
const message_ids = message_store.get_message_ids_in_stream(stream_id);
672+
unread_ops.process_read_messages_event(message_ids);
673+
message_events.remove_messages(message_ids);
674+
stream_topic_history.remove_history_for_stream(stream_id);
677675
}
678676
stream_list.update_subscribe_to_more_streams_link();
679677
break;

web/src/stream_topic_history.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,3 +398,14 @@ export function add_request_pending_for(stream_id: number): void {
398398
export function remove_request_pending_for(stream_id: number): void {
399399
request_pending_stream_ids.delete(stream_id);
400400
}
401+
402+
export function remove_history_for_stream(stream_id: number): void {
403+
// Currently only used when user loses access to a stream.
404+
if (stream_dict.has(stream_id)) {
405+
stream_dict.delete(stream_id);
406+
}
407+
408+
if (fetched_stream_ids.has(stream_id)) {
409+
fetched_stream_ids.delete(stream_id);
410+
}
411+
}

web/tests/dispatch_subs.test.cjs

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,14 @@ const event_fixtures = events.fixtures;
1212
const test_user = events.test_user;
1313

1414
const compose_recipient = mock_esm("../src/compose_recipient");
15-
const message_lists = mock_esm("../src/message_lists");
16-
const narrow_state = mock_esm("../src/narrow_state");
15+
const message_events = mock_esm("../src/message_events");
1716
const overlays = mock_esm("../src/overlays");
1817
const settings_org = mock_esm("../src/settings_org");
1918
const settings_streams = mock_esm("../src/settings_streams");
2019
const stream_events = mock_esm("../src/stream_events");
2120
const stream_list = mock_esm("../src/stream_list");
2221
const stream_settings_ui = mock_esm("../src/stream_settings_ui");
23-
message_lists.current = {};
22+
const unread_ops = mock_esm("../src/unread_ops");
2423

2524
const compose_state = zrequire("compose_state");
2625
const peer_data = zrequire("peer_data");
@@ -216,13 +215,6 @@ test("stream delete (normal)", ({override}) => {
216215

217216
override(settings_streams, "update_default_streams_table", noop);
218217

219-
narrow_state.narrowed_to_stream_id = () => true;
220-
221-
let bookend_updates = 0;
222-
override(message_lists.current, "update_trailing_bookend", () => {
223-
bookend_updates += 1;
224-
});
225-
226218
const removed_stream_ids = [];
227219

228220
override(stream_settings_ui, "remove_stream", (stream_id) => {
@@ -235,14 +227,12 @@ test("stream delete (normal)", ({override}) => {
235227
});
236228
override(stream_list, "update_subscribe_to_more_streams_link", noop);
237229

230+
override(unread_ops, "process_read_messages_event", noop);
231+
override(message_events, "remove_messages", noop);
238232
dispatch(event);
239233

240234
assert.deepEqual(removed_stream_ids, [event.stream_ids[0], event.stream_ids[1]]);
241235

242-
// We should possibly be able to make a single call to
243-
// update_trailing_bookend, but we currently do it for each stream.
244-
assert.equal(bookend_updates, 2);
245-
246236
assert.equal(removed_sidebar_rows, 1);
247237
});
248238

@@ -280,10 +270,12 @@ test("stream delete (special streams)", ({override}) => {
280270

281271
override(settings_org, "sync_realm_settings", noop);
282272
override(settings_streams, "update_default_streams_table", noop);
283-
override(message_lists.current, "update_trailing_bookend", noop);
284273
override(stream_list, "remove_sidebar_row", noop);
285274
override(stream_list, "update_subscribe_to_more_streams_link", noop);
286275

276+
override(unread_ops, "process_read_messages_event", noop);
277+
override(message_events, "remove_messages", noop);
278+
287279
dispatch(event);
288280

289281
assert.deepEqual(removed_stream_ids, [event.stream_ids[0], event.stream_ids[1]]);
@@ -324,28 +316,20 @@ test("stream delete (stream is selected in compose)", ({override}) => {
324316

325317
override(settings_streams, "update_default_streams_table", noop);
326318

327-
narrow_state.narrowed_to_stream_id = () => true;
328-
329-
let bookend_updates = 0;
330-
override(message_lists.current, "update_trailing_bookend", () => {
331-
bookend_updates += 1;
332-
});
333-
334319
let removed_sidebar_rows = 0;
335320
override(stream_list, "remove_sidebar_row", () => {
336321
removed_sidebar_rows += 1;
337322
});
338323
override(stream_list, "update_subscribe_to_more_streams_link", noop);
339324

325+
override(unread_ops, "process_read_messages_event", noop);
326+
override(message_events, "remove_messages", noop);
327+
340328
dispatch(event);
341329

342330
assert.deepEqual(removed_stream_ids, [event.stream_ids[0], event.stream_ids[1]]);
343331

344332
assert.equal(compose_state.stream_name(), "");
345333

346-
// We should possibly be able to make a single call to
347-
// update_trailing_bookend, but we currently do it for each stream.
348-
assert.equal(bookend_updates, 2);
349-
350334
assert.equal(removed_sidebar_rows, 1);
351335
});

web/tests/message_store.test.cjs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,3 +401,52 @@ test("remove", () => {
401401
assert.equal(message_store.get(message2.id).id, message2.id);
402402
assert.equal(message_store.get(message3.id), undefined);
403403
});
404+
405+
test("get_message_ids_in_stream", () => {
406+
const message1 = {
407+
type: "stream",
408+
sender_full_name: alice.full_name,
409+
sender_id: alice.user_id,
410+
stream_id: devel.stream_id,
411+
stream: devel.name,
412+
display_recipient: devel.name,
413+
topic: "test",
414+
id: 100,
415+
};
416+
const message2 = {
417+
sender_email: "me@example.com",
418+
sender_id: me.user_id,
419+
type: "private",
420+
display_recipient: convert_recipients([me, bob, cindy]),
421+
flags: ["has_alert_word"],
422+
is_me_message: false,
423+
id: 101,
424+
};
425+
const message3 = {
426+
type: "stream",
427+
sender_full_name: cindy.full_name,
428+
sender_id: cindy.user_id,
429+
stream_id: denmark.stream_id,
430+
stream: denmark.name,
431+
display_recipient: denmark.name,
432+
topic: "test",
433+
id: 102,
434+
};
435+
const message4 = {
436+
type: "stream",
437+
sender_full_name: me.full_name,
438+
sender_id: me.user_id,
439+
stream_id: devel.stream_id,
440+
stream: devel.name,
441+
display_recipient: devel.name,
442+
topic: "test",
443+
id: 103,
444+
};
445+
446+
for (const message of [message1, message2, message3, message4]) {
447+
message_helper.process_new_message(message);
448+
}
449+
450+
assert.deepEqual(message_store.get_message_ids_in_stream(devel.stream_id), [100, 103]);
451+
assert.deepEqual(message_store.get_message_ids_in_stream(denmark.stream_id), [102]);
452+
});

web/tests/stream_topic_history.test.cjs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,3 +536,36 @@ test("test_max_message_ids_in_channel_and_topics", () => {
536536
"topic 1",
537537
]);
538538
});
539+
540+
test("remove_history_for_stream", () => {
541+
const stream_id = 55;
542+
stream_topic_history.add_message({
543+
stream_id,
544+
message_id: 101,
545+
topic_name: "toPic1",
546+
});
547+
548+
stream_topic_history.add_message({
549+
stream_id: 56,
550+
message_id: 102,
551+
topic_name: "topic2",
552+
});
553+
assert.equal(stream_topic_history.stream_has_topics(stream_id), true);
554+
assert.equal(stream_topic_history.stream_has_topics(56), true);
555+
556+
stream_topic_history.remove_history_for_stream(stream_id);
557+
assert.equal(stream_topic_history.stream_has_topics(stream_id), false);
558+
assert.equal(stream_topic_history.stream_has_topics(56), true);
559+
560+
stream_topic_history.add_history(stream_id, [
561+
{name: "local", max_id: 501},
562+
{name: "hist2", max_id: 31},
563+
{name: "hist1", max_id: 30},
564+
]);
565+
assert.equal(stream_topic_history.has_history_for(stream_id), true);
566+
assert.equal(stream_topic_history.stream_has_topics(stream_id), true);
567+
568+
stream_topic_history.remove_history_for_stream(stream_id);
569+
assert.equal(stream_topic_history.stream_has_topics(stream_id), false);
570+
assert.equal(stream_topic_history.has_history_for(stream_id), false);
571+
});

0 commit comments

Comments
 (0)