diff --git a/web/src/message_list.js b/web/src/message_list.js index 70dc3b5e33..092cf18efb 100644 --- a/web/src/message_list.js +++ b/web/src/message_list.js @@ -1,6 +1,7 @@ import autosize from "autosize"; import $ from "jquery"; +import {all_messages_data} from "./all_messages_data"; import * as blueslip from "./blueslip"; import {MessageListData} from "./message_list_data"; import {MessageListView} from "./message_list_view"; @@ -426,6 +427,20 @@ export class MessageList { } update_muting_and_rerender() { + // For the home message list, we need to re-initialize + // _all_items for stream muting/topic unmuting from + // all_messages_data, since otherwise unmuting a previously + // muted stream won't work. + // + // TODO: The zhome conditional is a bit awkward, but a check + // for whether the filter excludes muted streams wouldn't be + // correct, because other narrows can't pull from + // all_messages. + if (this.table_name === "zhome") { + this.data.clear(); + this.data.add_messages(all_messages_data.all_messages()); + } + this.data.update_items_for_muting(); // We need to rerender whether or not the narrow hides muted // topics, because we need to update recipient bars for topics diff --git a/web/src/stream_muting.js b/web/src/stream_muting.js index 5ec0ebcfdd..e31de7d621 100644 --- a/web/src/stream_muting.js +++ b/web/src/stream_muting.js @@ -1,11 +1,4 @@ -import {all_messages_data} from "./all_messages_data"; import * as message_lists from "./message_lists"; -import * as message_scroll from "./message_scroll"; -import * as message_util from "./message_util"; -import * as message_viewport from "./message_viewport"; -import * as narrow_state from "./narrow_state"; -import * as navigate from "./navigate"; -import * as overlays from "./overlays"; import * as settings_notifications from "./settings_notifications"; import * as stream_edit from "./stream_edit"; import * as stream_list from "./stream_list"; @@ -14,57 +7,14 @@ import * as unread_ui from "./unread_ui"; export function update_is_muted(sub, value) { sub.is_muted = value; - setTimeout(() => { - let msg_offset; - let saved_ypos; - // Save our current scroll position - if (overlays.is_active() || overlays.is_modal_open()) { - saved_ypos = message_viewport.scrollTop(); - } else if ( - narrow_state.is_message_feed_visible() && - message_lists.current === message_lists.home && - message_lists.current.selected_row().offset() !== null - ) { - msg_offset = message_lists.current.selected_row().offset().top; - } + // TODO: In theory, other message lists whose behavior depends on + // stream muting might need to be live-updated as well, but the + // current _all_items design doesn't have a way to support that. + message_lists.home.update_muting_and_rerender(); - message_lists.home.clear({clear_selected_id: false}); - - // Recreate the message_lists.home with the newly filtered all_messages_data - message_util.add_old_messages(all_messages_data.all_messages(), message_lists.home); - - // Ensure we're still at the same scroll position - if (overlays.is_overlay_or_modal_open()) { - message_viewport.scrollTop(saved_ypos); - } else if ( - narrow_state.is_message_feed_visible() && - message_lists.current === message_lists.home - ) { - // We pass use_closest to handle the case where the - // currently selected message is being hidden from the - // home view - message_lists.home.select_id(message_lists.home.selected_id(), { - use_closest: true, - empty_ok: true, - mark_read: false, - }); - if (message_lists.current.selected_id() !== -1) { - message_lists.current.view.set_message_offset(msg_offset); - } - } - - // In case we added messages to what's visible in the home - // view, we need to re-scroll to make sure the pointer is - // still visible. We don't want the auto-scroll handler to - // move our pointer to the old scroll location before we have - // a chance to update it. - navigate.plan_scroll_to_selected(); - message_scroll.suppress_selection_update_on_next_scroll(); - - // Since muted streams aren't counted in visible unread - // counts, we need to update the rendering of them. - unread_ui.update_unread_counts(); - }, 0); + // Since muted streams aren't counted in visible unread + // counts, we need to update the rendering of them. + unread_ui.update_unread_counts(); settings_notifications.update_muted_stream_state(sub); stream_edit.update_muting_rendering(sub);