Avoid duplicate acks for messages with mentions

This commit is contained in:
Max Brunsfeld 2023-10-22 18:00:02 +02:00
parent 59adcc1744
commit 763b13e700
2 changed files with 41 additions and 34 deletions

View file

@ -21,6 +21,7 @@ use util::{post_inc, ResultExt as _, TryFutureExt};
pub struct ChannelChat { pub struct ChannelChat {
channel: Arc<Channel>, channel: Arc<Channel>,
messages: SumTree<ChannelMessage>, messages: SumTree<ChannelMessage>,
acknowledged_message_ids: HashSet<u64>,
channel_store: ModelHandle<ChannelStore>, channel_store: ModelHandle<ChannelStore>,
loaded_all_messages: bool, loaded_all_messages: bool,
last_acknowledged_id: Option<u64>, last_acknowledged_id: Option<u64>,
@ -117,6 +118,7 @@ impl ChannelChat {
rpc: client, rpc: client,
outgoing_messages_lock: Default::default(), outgoing_messages_lock: Default::default(),
messages: Default::default(), messages: Default::default(),
acknowledged_message_ids: Default::default(),
loaded_all_messages, loaded_all_messages,
next_pending_message_id: 0, next_pending_message_id: 0,
last_acknowledged_id: None, last_acknowledged_id: None,
@ -370,16 +372,15 @@ impl ChannelChat {
cursor.item().unwrap() cursor.item().unwrap()
} }
pub fn rendered_message(&self, id: ChannelMessageId) { pub fn acknowledge_message(&mut self, id: u64) {
let ChannelMessageId::Saved(id) = id else { if self.acknowledged_message_ids.insert(id) {
return; self.rpc
}; .send(proto::AckChannelMessage {
self.rpc channel_id: self.channel.id,
.send(proto::AckChannelMessage { message_id: id,
channel_id: self.channel.id, })
message_id: id, .ok();
}) }
.ok();
} }
pub fn messages_in_range(&self, range: Range<usize>) -> impl Iterator<Item = &ChannelMessage> { pub fn messages_in_range(&self, range: Range<usize>) -> impl Iterator<Item = &ChannelMessage> {

View file

@ -346,32 +346,38 @@ impl ChatPanel {
} }
fn render_message(&mut self, ix: usize, cx: &mut ViewContext<Self>) -> AnyElement<Self> { fn render_message(&mut self, ix: usize, cx: &mut ViewContext<Self>) -> AnyElement<Self> {
let (message, is_continuation, is_last, is_admin) = { let (message, is_continuation, is_last, is_admin) = self
let active_chat = self.active_chat.as_ref().unwrap().0.read(cx); .active_chat
let is_admin = self .as_ref()
.channel_store .unwrap()
.read(cx) .0
.is_user_admin(active_chat.channel().id); .update(cx, |active_chat, cx| {
let last_message = active_chat.message(ix.saturating_sub(1)); let is_admin = self
let this_message = active_chat.message(ix); .channel_store
let is_continuation = last_message.id != this_message.id .read(cx)
&& this_message.sender.id == last_message.sender.id; .is_user_admin(active_chat.channel().id);
let last_message = active_chat.message(ix.saturating_sub(1));
let this_message = active_chat.message(ix).clone();
let is_continuation = last_message.id != this_message.id
&& this_message.sender.id == last_message.sender.id;
if this_message if let ChannelMessageId::Saved(id) = this_message.id {
.mentions if this_message
.iter() .mentions
.any(|(_, user_id)| Some(*user_id) == self.client.user_id()) .iter()
{ .any(|(_, user_id)| Some(*user_id) == self.client.user_id())
active_chat.rendered_message(this_message.id); {
} active_chat.acknowledge_message(id);
}
}
( (
this_message.clone(), this_message,
is_continuation, is_continuation,
active_chat.message_count() == ix + 1, active_chat.message_count() == ix + 1,
is_admin, is_admin,
) )
}; });
let is_pending = message.is_pending(); let is_pending = message.is_pending();
let theme = theme::current(cx); let theme = theme::current(cx);