From 26299fb8c997d78ee1fdd45a75347f2db2131bff Mon Sep 17 00:00:00 2001 From: Bennet Bo Fenner <53836821+bennetbo@users.noreply.github.com> Date: Wed, 10 Apr 2024 12:21:45 +0200 Subject: [PATCH] chat panel: Fix new messages indicator appearing when message was deleted (#10278) Release Notes: Fixed an issue where the "New messages" indicator in the channel chat would be shown even if the message was deleted --- crates/channel/src/channel_chat.rs | 18 ++++++++++++++++-- crates/channel/src/channel_store.rs | 6 ++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/crates/channel/src/channel_chat.rs b/crates/channel/src/channel_chat.rs index e662e2db8e204ed799f750e29c68cbfd103e785a..46074665b8452966d5cda2ab98b5b080a5fe8691 100644 --- a/crates/channel/src/channel_chat.rs +++ b/crates/channel/src/channel_chat.rs @@ -652,13 +652,27 @@ impl ChannelChat { let mut messages = cursor.slice(&ChannelMessageId::Saved(id), Bias::Left, &()); if let Some(item) = cursor.item() { if item.id == ChannelMessageId::Saved(id) { - let ix = messages.summary().count; + let deleted_message_ix = messages.summary().count; cursor.next(&()); messages.append(cursor.suffix(&()), &()); drop(cursor); self.messages = messages; + + // If the message that was deleted was the last acknowledged message, + // replace the acknowledged message with an earlier one. + self.channel_store.update(cx, |store, _| { + let summary = self.messages.summary(); + if summary.count == 0 { + store.set_acknowledged_message_id(self.channel_id, None); + } else if deleted_message_ix == summary.count { + if let ChannelMessageId::Saved(id) = summary.max_id { + store.set_acknowledged_message_id(self.channel_id, Some(id)); + } + } + }); + cx.emit(ChannelChatEvent::MessagesUpdated { - old_range: ix..ix + 1, + old_range: deleted_message_ix..deleted_message_ix + 1, new_count: 0, }); } diff --git a/crates/channel/src/channel_store.rs b/crates/channel/src/channel_store.rs index a6a94865b441b8a990c3942bea10d59d57c09c95..28f9150143e230b0d18ccbab2bb2b46c720bd6fd 100644 --- a/crates/channel/src/channel_store.rs +++ b/crates/channel/src/channel_store.rs @@ -380,6 +380,12 @@ impl ChannelStore { .is_some_and(|state| state.has_new_messages()) } + pub fn set_acknowledged_message_id(&mut self, channel_id: ChannelId, message_id: Option) { + if let Some(state) = self.channel_states.get_mut(&channel_id) { + state.latest_chat_message = message_id; + } + } + pub fn last_acknowledge_message_id(&self, channel_id: ChannelId) -> Option { self.channel_states.get(&channel_id).and_then(|state| { if let Some(last_message_id) = state.latest_chat_message {