From 0f077ffcd38ea4713d9a47c911176d82dbb024cb Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Thu, 16 Feb 2023 17:29:30 +0100 Subject: [PATCH] fix(sdk): Don't overwrite parallel updates when fetching reply details --- crates/matrix-sdk/src/room/timeline/inner.rs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/crates/matrix-sdk/src/room/timeline/inner.rs b/crates/matrix-sdk/src/room/timeline/inner.rs index e07d297e2..4c5fa18f6 100644 --- a/crates/matrix-sdk/src/room/timeline/inner.rs +++ b/crates/matrix-sdk/src/room/timeline/inner.rs @@ -476,7 +476,7 @@ impl TimelineInner { &self, event_id: &EventId, ) -> Result { - let (index, mut item) = rfind_event_by_id(&self.items(), event_id) + let (index, item) = rfind_event_by_id(&self.items(), event_id) .and_then(|(pos, item)| item.as_remote().map(|item| (pos, item.clone()))) .ok_or(super::Error::RemoteEventNotInTimeline)?; @@ -490,11 +490,21 @@ impl TimelineInner { let details = self.fetch_replied_to_event(index, &item, &message, &in_reply_to.event_id).await; - // We need to be sure to have the latest position of the event as it might have - // changed while waiting for the request. - let (index, _) = rfind_event_by_id(&self.items(), &item.event_id) + // We need to be sure to have the latest position of the event as it + // might have changed while waiting for the request. + let (index, mut item) = rfind_event_by_id(&self.items(), &item.event_id) + .and_then(|(pos, item)| item.as_remote().map(|item| (pos, item.clone()))) .ok_or(super::Error::RemoteEventNotInTimeline)?; + // Check the state of the event again, it might have been redacted while + // the request was in-flight. + let TimelineItemContent::Message(message) = item.content.clone() else { + return Ok(item); + }; + let Some(in_reply_to) = message.in_reply_to() else { + return Ok(item); + }; + item.content = TimelineItemContent::Message(message.with_in_reply_to(InReplyToDetails { event_id: in_reply_to.event_id.clone(), details,