Avoid duplicate acks for messages with mentions
This commit is contained in:
parent
59adcc1744
commit
763b13e700
2 changed files with 41 additions and 34 deletions
|
@ -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,10 +372,8 @@ 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
|
self.rpc
|
||||||
.send(proto::AckChannelMessage {
|
.send(proto::AckChannelMessage {
|
||||||
channel_id: self.channel.id,
|
channel_id: self.channel.id,
|
||||||
|
@ -381,6 +381,7 @@ impl ChannelChat {
|
||||||
})
|
})
|
||||||
.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> {
|
||||||
let mut cursor = self.messages.cursor::<Count>();
|
let mut cursor = self.messages.cursor::<Count>();
|
||||||
|
|
|
@ -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
|
||||||
|
.as_ref()
|
||||||
|
.unwrap()
|
||||||
|
.0
|
||||||
|
.update(cx, |active_chat, cx| {
|
||||||
let is_admin = self
|
let is_admin = self
|
||||||
.channel_store
|
.channel_store
|
||||||
.read(cx)
|
.read(cx)
|
||||||
.is_user_admin(active_chat.channel().id);
|
.is_user_admin(active_chat.channel().id);
|
||||||
let last_message = active_chat.message(ix.saturating_sub(1));
|
let last_message = active_chat.message(ix.saturating_sub(1));
|
||||||
let this_message = active_chat.message(ix);
|
let this_message = active_chat.message(ix).clone();
|
||||||
let is_continuation = last_message.id != this_message.id
|
let is_continuation = last_message.id != this_message.id
|
||||||
&& this_message.sender.id == last_message.sender.id;
|
&& this_message.sender.id == last_message.sender.id;
|
||||||
|
|
||||||
|
if let ChannelMessageId::Saved(id) = this_message.id {
|
||||||
if this_message
|
if this_message
|
||||||
.mentions
|
.mentions
|
||||||
.iter()
|
.iter()
|
||||||
.any(|(_, user_id)| Some(*user_id) == self.client.user_id())
|
.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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue