diff --git a/crates/matrix-sdk-ui/src/timeline/controller/state_transaction.rs b/crates/matrix-sdk-ui/src/timeline/controller/state_transaction.rs index 14251e44e..f836a4dee 100644 --- a/crates/matrix-sdk-ui/src/timeline/controller/state_transaction.rs +++ b/crates/matrix-sdk-ui/src/timeline/controller/state_transaction.rs @@ -227,22 +227,14 @@ impl<'a, P: RoomDataProvider> TimelineStateTransaction<'a, P> { let encryption_info = event.kind.encryption_info().cloned(); let sender_profile = room_data_provider.profile_from_user_id(&sender).await; - let forwarder = encryption_info - .as_ref() - .and_then(|info| info.forwarder.as_ref()) - .map(|info| info.user_id.clone()); - - let forwarder_profile = if let Some(ref forwarder_id) = forwarder { - Some(room_data_provider.profile_from_user_id(forwarder_id).await) - } else { - None - }; + let (forwarder, forwarder_profile) = + get_forwarder_info(&event, room_data_provider).await; let mut ctx = TimelineEventContext { sender, sender_profile, forwarder, - forwarder_profile: forwarder_profile.flatten(), + forwarder_profile, timestamp, // These are not used when handling an aggregation. read_receipts: Default::default(), @@ -694,9 +686,9 @@ impl<'a, P: RoomDataProvider> TimelineStateTransaction<'a, P> { let is_highlighted = event.push_actions().is_some_and(|actions| actions.iter().any(Action::is_highlight)); - let thread_summary = if let ThreadSummaryStatus::Some(summary) = event.thread_summary { - let latest_reply_item = if let Some(latest_reply) = summary.latest_reply { - self.fetch_latest_thread_reply(&latest_reply, room_data_provider).await + let thread_summary = if let ThreadSummaryStatus::Some(ref summary) = event.thread_summary { + let latest_reply_item = if let Some(ref latest_reply) = summary.latest_reply { + self.fetch_latest_thread_reply(latest_reply, room_data_provider).await } else { None }; @@ -714,17 +706,7 @@ impl<'a, P: RoomDataProvider> TimelineStateTransaction<'a, P> { map.get(&UnsignedEventLocation::RelationsReplace)?.encryption_info().cloned() }); - let forwarder = event - .kind - .encryption_info() - .and_then(|info| info.forwarder.as_ref()) - .map(|info| info.user_id.clone()); - - let forwarder_profile = if let Some(ref forwarder_id) = forwarder { - Some(room_data_provider.profile_from_user_id(forwarder_id).await) - } else { - None - }; + let (forwarder, forwarder_profile) = get_forwarder_info(&event, room_data_provider).await; let (raw, utd_info) = match event.kind { TimelineEventKind::UnableToDecrypt { utd_info, event } => (event, Some(utd_info)), @@ -821,7 +803,7 @@ impl<'a, P: RoomDataProvider> TimelineStateTransaction<'a, P> { sender, sender_profile, forwarder, - forwarder_profile: forwarder_profile.flatten(), + forwarder_profile, timestamp, read_receipts: if settings.track_read_receipts.is_enabled() && should_add @@ -1057,3 +1039,34 @@ impl<'a, P: RoomDataProvider> TimelineStateTransaction<'a, P> { } } } + +/// Retrieves the forwarder information for a given timeline event. +/// +/// # Parameters +/// +/// - `event`: The timeline event to extract forwarder information from. +/// - `room_data_provider`: A reference to the room data provider. +/// +/// # Returns +/// +/// A tuple containing: +/// - `Option`: The user ID of the forwarder, if available. +/// - `Option`: The profile of the forwarder, if available. +async fn get_forwarder_info( + event: &TimelineEvent, + room_data_provider: &P, +) -> (Option, Option) { + let forwarder = event + .kind + .encryption_info() + .and_then(|info| info.forwarder.as_ref()) + .map(|info| info.user_id.clone()); + + let forwarder_profile = if let Some(ref forwarder_id) = forwarder { + Some(room_data_provider.profile_from_user_id(forwarder_id).await) + } else { + None + }; + + (forwarder, forwarder_profile.flatten()) +}