From 000419cdf398ee587d3495eedb9c1781f58dfc5d Mon Sep 17 00:00:00 2001 From: Benjamin Bouvier Date: Mon, 30 Jun 2025 18:44:15 +0200 Subject: [PATCH] refactor(timeline): rename `TimelineFocusData` to `TimelineFocusKind` --- .../src/timeline/controller/metadata.rs | 10 ++-- .../src/timeline/controller/mod.rs | 50 ++++++++++--------- .../src/timeline/controller/state.rs | 16 +++--- .../timeline/controller/state_transaction.rs | 14 +++--- .../matrix-sdk-ui/src/timeline/subscriber.rs | 6 +-- 5 files changed, 50 insertions(+), 46 deletions(-) diff --git a/crates/matrix-sdk-ui/src/timeline/controller/metadata.rs b/crates/matrix-sdk-ui/src/timeline/controller/metadata.rs index 7f78cac5c..8b267da21 100644 --- a/crates/matrix-sdk-ui/src/timeline/controller/metadata.rs +++ b/crates/matrix-sdk-ui/src/timeline/controller/metadata.rs @@ -38,7 +38,7 @@ use super::{ }; use crate::{ timeline::{ - controller::TimelineFocusData, + controller::TimelineFocusKind, event_item::{ extract_bundled_edit_event_json, extract_poll_edit_content, extract_room_msg_edit_content, @@ -318,7 +318,7 @@ impl TimelineMetadata { raw_event: &Raw, bundled_edit_encryption_info: Option>, timeline_items: &Vector>, - timeline_focus: &TimelineFocusData

, + timeline_focus: &TimelineFocusKind

, ) -> (Option, Option) { if let AnySyncTimelineEvent::MessageLike(ev) = event { if let Some(content) = ev.original_content() { @@ -349,7 +349,7 @@ impl TimelineMetadata { content: &AnyMessageLikeEventContent, remote_ctx: Option>, timeline_items: &Vector>, - timeline_focus: &TimelineFocusData

, + timeline_focus: &TimelineFocusKind

, ) -> (Option, Option) { match content { AnyMessageLikeEventContent::Sticker(content) => { @@ -453,7 +453,7 @@ impl TimelineMetadata { fn extract_reply_and_thread_root( relates_to: Option, timeline_items: &Vector>, - timeline_focus: &TimelineFocusData

, + timeline_focus: &TimelineFocusKind

, ) -> (Option, Option) { let mut thread_root = None; @@ -464,7 +464,7 @@ impl TimelineMetadata { RelationWithoutReplacement::Thread(thread) => { thread_root = Some(thread.event_id); - if matches!(timeline_focus, TimelineFocusData::Thread { .. }) + if matches!(timeline_focus, TimelineFocusKind::Thread { .. }) && thread.is_falling_back { // In general, a threaded event is marked as a response to the previous message diff --git a/crates/matrix-sdk-ui/src/timeline/controller/mod.rs b/crates/matrix-sdk-ui/src/timeline/controller/mod.rs index 455a6068f..1718f2b4c 100644 --- a/crates/matrix-sdk-ui/src/timeline/controller/mod.rs +++ b/crates/matrix-sdk-ui/src/timeline/controller/mod.rs @@ -92,8 +92,12 @@ mod state_transaction; pub(super) use aggregations::*; /// Data associated to the current timeline focus. +/// +/// This is the private counterpart of [`TimelineFocus`], and it is an augmented +/// version of it, including extra state that makes it useful over the lifetime +/// of a timeline. #[derive(Debug)] -pub(in crate::timeline) enum TimelineFocusData { +pub(in crate::timeline) enum TimelineFocusKind { /// The timeline receives live events from the sync. Live { /// Whether to hide in-thread events from the timeline. @@ -134,7 +138,7 @@ pub(super) struct TimelineController>>, /// Focus data. - focus: Arc>, + focus: Arc>, /// A [`RoomDataProvider`] implementation, providing data. /// @@ -275,13 +279,13 @@ impl TimelineController { unable_to_decrypt_hook: Option>, is_room_encrypted: bool, ) -> Self { - let focus_data = match focus { + let focus = match focus { TimelineFocus::Live { hide_threaded_events } => { - TimelineFocusData::Live { hide_threaded_events } + TimelineFocusKind::Live { hide_threaded_events } } TimelineFocus::Event { target, num_context_events, hide_threaded_events } => { let paginator = Paginator::new(room_data_provider.clone()); - TimelineFocusData::Event { + TimelineFocusKind::Event { paginator, event_id: target, num_context_events, @@ -289,7 +293,7 @@ impl TimelineController { } } - TimelineFocus::Thread { root_event_id, num_events } => TimelineFocusData::Thread { + TimelineFocus::Thread { root_event_id, num_events } => TimelineFocusKind::Thread { loader: ThreadedEventsLoader::new( room_data_provider.clone(), root_event_id.clone(), @@ -299,7 +303,7 @@ impl TimelineController { }, TimelineFocus::PinnedEvents { max_events_to_load, max_concurrent_requests } => { - TimelineFocusData::PinnedEvents { + TimelineFocusKind::PinnedEvents { loader: PinnedEventsLoader::new( Arc::new(room_data_provider.clone()), max_events_to_load as usize, @@ -309,9 +313,9 @@ impl TimelineController { } }; - let focus_data = Arc::new(focus_data); + let focus = Arc::new(focus); let state = Arc::new(RwLock::new(TimelineState::new( - focus_data.clone(), + focus.clone(), room_data_provider.own_user_id().to_owned(), room_data_provider.room_version(), internal_id_prefix, @@ -324,7 +328,7 @@ impl TimelineController { let decryption_retry_task = DecryptionRetryTask::new(state.clone(), room_data_provider.clone()); - Self { state, focus: focus_data, room_data_provider, settings, decryption_retry_task } + Self { state, focus, room_data_provider, settings, decryption_retry_task } } /// Initializes the configured focus with appropriate data. @@ -338,7 +342,7 @@ impl TimelineController { room_event_cache: &RoomEventCache, ) -> Result { match &*self.focus { - TimelineFocusData::Live { .. } => { + TimelineFocusKind::Live { .. } => { // Retrieve the cached events, and add them to the timeline. let events = room_event_cache.events().await; @@ -364,7 +368,7 @@ impl TimelineController { Ok(has_events) } - TimelineFocusData::Event { event_id, paginator, num_context_events, .. } => { + TimelineFocusKind::Event { event_id, paginator, num_context_events, .. } => { // Start a /context request, and append the results (in order) to the timeline. let start_from_result = paginator .start_from(event_id, (*num_context_events).into()) @@ -382,7 +386,7 @@ impl TimelineController { Ok(has_events) } - TimelineFocusData::Thread { loader, num_events, .. } => { + TimelineFocusKind::Thread { loader, num_events, .. } => { let result = loader .paginate_backwards((*num_events).into()) .await @@ -398,7 +402,7 @@ impl TimelineController { Ok(true) } - TimelineFocusData::PinnedEvents { loader } => { + TimelineFocusKind::PinnedEvents { loader } => { let Some(loaded_events) = loader.load_events().await.map_err(Error::PinnedEventsError)? else { @@ -453,7 +457,7 @@ impl TimelineController { pub(crate) async fn reload_pinned_events( &self, ) -> Result>, PinnedEventsLoaderError> { - if let TimelineFocusData::PinnedEvents { loader } = &*self.focus { + if let TimelineFocusKind::PinnedEvents { loader } = &*self.focus { loader.load_events().await } else { Err(PinnedEventsLoaderError::TimelineFocusNotPinnedEvents) @@ -490,14 +494,14 @@ impl TimelineController { num_events: u16, ) -> Result { let PaginationResult { events, hit_end_of_timeline } = match &*self.focus { - TimelineFocusData::Live { .. } | TimelineFocusData::PinnedEvents { .. } => { + TimelineFocusKind::Live { .. } | TimelineFocusKind::PinnedEvents { .. } => { return Err(PaginationError::NotSupported); } - TimelineFocusData::Event { paginator, .. } => paginator + TimelineFocusKind::Event { paginator, .. } => paginator .paginate_backward(num_events.into()) .await .map_err(PaginationError::Paginator)?, - TimelineFocusData::Thread { loader, num_events, .. } => loader + TimelineFocusKind::Thread { loader, num_events, .. } => loader .paginate_backwards((*num_events).into()) .await .map_err(PaginationError::Paginator)?, @@ -523,11 +527,11 @@ impl TimelineController { num_events: u16, ) -> Result { let PaginationResult { events, hit_end_of_timeline } = match &*self.focus { - TimelineFocusData::Live { .. } - | TimelineFocusData::PinnedEvents { .. } - | TimelineFocusData::Thread { .. } => return Err(PaginationError::NotSupported), + TimelineFocusKind::Live { .. } + | TimelineFocusKind::PinnedEvents { .. } + | TimelineFocusKind::Thread { .. } => return Err(PaginationError::NotSupported), - TimelineFocusData::Event { paginator, .. } => paginator + TimelineFocusKind::Event { paginator, .. } => paginator .paginate_forward(num_events.into()) .await .map_err(PaginationError::Paginator)?, @@ -546,7 +550,7 @@ impl TimelineController { /// Is this timeline receiving events from sync (aka has a live focus)? pub(super) fn is_live(&self) -> bool { - matches!(&*self.focus, TimelineFocusData::Live { .. }) + matches!(&*self.focus, TimelineFocusKind::Live { .. }) } pub(super) fn with_settings(mut self, settings: TimelineSettings) -> Self { diff --git a/crates/matrix-sdk-ui/src/timeline/controller/state.rs b/crates/matrix-sdk-ui/src/timeline/controller/state.rs index cbea8fe3b..c55da5de3 100644 --- a/crates/matrix-sdk-ui/src/timeline/controller/state.rs +++ b/crates/matrix-sdk-ui/src/timeline/controller/state.rs @@ -38,7 +38,7 @@ use super::{ observable_items::ObservableItems, DateDividerMode, TimelineMetadata, TimelineSettings, TimelineStateTransaction, }; -use crate::{timeline::controller::TimelineFocusData, unable_to_decrypt_hook::UtdHookManager}; +use crate::{timeline::controller::TimelineFocusKind, unable_to_decrypt_hook::UtdHookManager}; #[derive(Debug)] pub(in crate::timeline) struct TimelineState { @@ -46,12 +46,12 @@ pub(in crate::timeline) struct TimelineState { pub meta: TimelineMetadata, /// The kind of focus of this timeline. - focus_data: Arc>, + focus: Arc>, } impl TimelineState

{ pub(super) fn new( - focus_data: Arc>, + focus: Arc>, own_user_id: OwnedUserId, room_version: RoomVersionId, internal_id_prefix: Option, @@ -67,7 +67,7 @@ impl TimelineState

{ unable_to_decrypt_hook, is_room_encrypted, ), - focus_data, + focus, } } @@ -164,13 +164,13 @@ impl TimelineState

{ // TODO merge with other should_add, one way or another? let should_add_new_items = match &txn.focus { - TimelineFocusData::Live { hide_threaded_events } => { + TimelineFocusKind::Live { hide_threaded_events } => { thread_root.is_none() || !hide_threaded_events } - TimelineFocusData::Thread { root_event_id, .. } => { + TimelineFocusKind::Thread { root_event_id, .. } => { thread_root.as_ref().is_some_and(|r| r == root_event_id) } - TimelineFocusData::Event { .. } | TimelineFocusData::PinnedEvents { .. } => { + TimelineFocusKind::Event { .. } | TimelineFocusKind::PinnedEvents { .. } => { // Don't add new items to these timelines; aggregations are added independently // of the `should_add_new_items` value. false @@ -299,6 +299,6 @@ impl TimelineState

{ } pub(super) fn transaction(&mut self) -> TimelineStateTransaction<'_, P> { - TimelineStateTransaction::new(&mut self.items, &mut self.meta, &*self.focus_data) + TimelineStateTransaction::new(&mut self.items, &mut self.meta, &*self.focus) } } 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 0f7dd8438..c007f902e 100644 --- a/crates/matrix-sdk-ui/src/timeline/controller/state_transaction.rs +++ b/crates/matrix-sdk-ui/src/timeline/controller/state_transaction.rs @@ -37,7 +37,7 @@ use super::{ ObservableItems, ObservableItemsTransaction, TimelineMetadata, TimelineSettings, }; use crate::timeline::{ - controller::TimelineFocusData, + controller::TimelineFocusKind, event_handler::{FailedToParseEvent, RemovedItem, TimelineAction}, EmbeddedEvent, ThreadSummary, TimelineDetails, VirtualTimelineItem, }; @@ -59,7 +59,7 @@ pub(in crate::timeline) struct TimelineStateTransaction<'a, P: RoomDataProvider> previous_meta: &'a mut TimelineMetadata, /// The kind of focus of this timeline. - pub focus: &'a TimelineFocusData

, + pub focus: &'a TimelineFocusKind

, } impl<'a, P: RoomDataProvider> TimelineStateTransaction<'a, P> { @@ -67,7 +67,7 @@ impl<'a, P: RoomDataProvider> TimelineStateTransaction<'a, P> { pub(super) fn new( items: &'a mut ObservableItems, meta: &'a mut TimelineMetadata, - focus: &'a TimelineFocusData

, + focus: &'a TimelineFocusKind

, ) -> Self { let previous_meta = meta; let meta = previous_meta.clone(); @@ -403,12 +403,12 @@ impl<'a, P: RoomDataProvider> TimelineStateTransaction<'a, P> { } match &self.focus { - TimelineFocusData::PinnedEvents { .. } => { + TimelineFocusKind::PinnedEvents { .. } => { // Only add pinned events for the pinned events timeline. room_data_provider.is_pinned_event(event.event_id()) } - TimelineFocusData::Event { hide_threaded_events, .. } => { + TimelineFocusKind::Event { hide_threaded_events, .. } => { // If the timeline's filtering out in-thread events, don't add items for // threaded events. if thread_root.is_some() && *hide_threaded_events { @@ -435,13 +435,13 @@ impl<'a, P: RoomDataProvider> TimelineStateTransaction<'a, P> { } } - TimelineFocusData::Live { hide_threaded_events } => { + TimelineFocusKind::Live { hide_threaded_events } => { // If the timeline's filtering out in-thread events, don't add items for // threaded events. thread_root.is_none() || !hide_threaded_events } - TimelineFocusData::Thread { root_event_id, .. } => { + TimelineFocusKind::Thread { root_event_id, .. } => { // Add new items only for the thread root and the thread replies. event.event_id() == root_event_id || thread_root.as_ref().is_some_and(|r| r == root_event_id) diff --git a/crates/matrix-sdk-ui/src/timeline/subscriber.rs b/crates/matrix-sdk-ui/src/timeline/subscriber.rs index db1d63450..7580df33f 100644 --- a/crates/matrix-sdk-ui/src/timeline/subscriber.rs +++ b/crates/matrix-sdk-ui/src/timeline/subscriber.rs @@ -109,7 +109,7 @@ impl Stream for TimelineSubscriber { pub mod skip { use eyeball::{SharedObservable, Subscriber}; - use crate::timeline::{controller::TimelineFocusData, traits::RoomDataProvider}; + use crate::timeline::{controller::TimelineFocusKind, traits::RoomDataProvider}; const MAXIMUM_NUMBER_OF_INITIAL_ITEMS: usize = 20; @@ -248,8 +248,8 @@ pub mod skip { /// Update the skip count if and only if the timeline has a live focus /// ([`TimelineFocusKind::Live`]). - pub fn update(&self, count: usize, focus: &TimelineFocusData

) { - if matches!(focus, TimelineFocusData::Live { .. }) { + pub fn update(&self, count: usize, focus: &TimelineFocusKind

) { + if matches!(focus, TimelineFocusKind::Live { .. }) { self.count.set_if_not_eq(count); } }