diff --git a/crates/matrix-sdk-ui/src/timeline/controller/state.rs b/crates/matrix-sdk-ui/src/timeline/controller/state.rs index dbd43482d..c7b58968c 100644 --- a/crates/matrix-sdk-ui/src/timeline/controller/state.rs +++ b/crates/matrix-sdk-ui/src/timeline/controller/state.rs @@ -204,7 +204,7 @@ impl TimelineState { continue; }; - let handle_one_res = txn + let removed_item = txn .handle_remote_event( event, TimelineItemPosition::UpdateAt { timeline_item_index: idx }, @@ -216,7 +216,7 @@ impl TimelineState { // If the UTD was removed rather than updated, offset all // subsequent loop iterations. - if handle_one_res.item_removed { + if removed_item { offset += 1; } } 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 a2b23cca3..063ea41ba 100644 --- a/crates/matrix-sdk-ui/src/timeline/controller/state_transaction.rs +++ b/crates/matrix-sdk-ui/src/timeline/controller/state_transaction.rs @@ -24,10 +24,7 @@ use super::{ super::{ controller::{FullEventMeta, ObservableItemsTransactionEntry}, date_dividers::DateDividerAdjuster, - event_handler::{ - Flow, HandleEventResult, TimelineEventContext, TimelineEventHandler, - TimelineItemPosition, - }, + event_handler::{Flow, TimelineEventContext, TimelineEventHandler, TimelineItemPosition}, event_item::RemoteEventOrigin, traits::RoomDataProvider, }, @@ -36,7 +33,10 @@ use super::{ }; use crate::{ events::SyncTimelineEventWithoutContent, - timeline::{event_handler::TimelineAction, VirtualTimelineItem}, + timeline::{ + event_handler::{RemovedItem, TimelineAction}, + VirtualTimelineItem, + }, }; pub(in crate::timeline) struct TimelineStateTransaction<'a> { @@ -231,7 +231,7 @@ impl<'a> TimelineStateTransaction<'a> { /// Handle a remote event. /// - /// Returns the number of timeline updates that were made. + /// Returns whether an item has been removed from the timeline. pub(super) async fn handle_remote_event( &mut self, event: TimelineEvent, @@ -239,7 +239,7 @@ impl<'a> TimelineStateTransaction<'a> { room_data_provider: &P, settings: &TimelineSettings, date_divider_adjuster: &mut DateDividerAdjuster, - ) -> HandleEventResult { + ) -> RemovedItem { let TimelineEvent { push_actions, kind } = event; let encryption_info = kind.encryption_info().cloned(); @@ -365,7 +365,8 @@ impl<'a> TimelineStateTransaction<'a> { ) .await; - return HandleEventResult::default(); + // No item has been removed. + return false; } // The event can NOT be partially deserialized, it seems really broken. @@ -402,7 +403,8 @@ impl<'a> TimelineStateTransaction<'a> { .await; } - return HandleEventResult::default(); + // No item has been removed. + return false; } }, }; @@ -451,7 +453,8 @@ impl<'a> TimelineStateTransaction<'a> { .handle_event(date_divider_adjuster, timeline_action) .await } else { - HandleEventResult::default() + // No item has been removed from the timeline. + false } } diff --git a/crates/matrix-sdk-ui/src/timeline/event_handler.rs b/crates/matrix-sdk-ui/src/timeline/event_handler.rs index b0afdd706..f46997228 100644 --- a/crates/matrix-sdk-ui/src/timeline/event_handler.rs +++ b/crates/matrix-sdk-ui/src/timeline/event_handler.rs @@ -569,16 +569,8 @@ pub(super) enum TimelineItemPosition { }, } -/// The outcome of handling a single event with -/// [`TimelineEventHandler::handle_event`]. -#[derive(Default)] -pub(super) struct HandleEventResult { - /// Was some timeline item removed? - /// - /// This can happen only if there was a UTD item that has been decrypted - /// into an item that was filtered out with the event filter. - pub(super) item_removed: bool, -} +/// Whether an item was removed or not. +pub(super) type RemovedItem = bool; /// Data necessary to update the timeline, given a single event to handle. /// @@ -590,7 +582,6 @@ pub(super) struct TimelineEventHandler<'a, 'o> { items: &'a mut ObservableItemsTransaction<'o>, meta: &'a mut TimelineMetadata, ctx: TimelineEventContext, - result: HandleEventResult, } impl<'a, 'o> TimelineEventHandler<'a, 'o> { @@ -599,7 +590,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> { ctx: TimelineEventContext, ) -> Self { let TimelineStateTransaction { items, meta, .. } = state; - Self { items, meta, ctx, result: HandleEventResult::default() } + Self { items, meta, ctx } } /// Handle an event. @@ -613,7 +604,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> { mut self, date_divider_adjuster: &mut DateDividerAdjuster, timeline_action: TimelineAction, - ) -> HandleEventResult { + ) -> RemovedItem { let span = tracing::Span::current(); date_divider_adjuster.mark_used(); @@ -666,6 +657,8 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> { }, } + let mut removed_item = false; + if !added_item { trace!("No new item added"); @@ -678,12 +671,11 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> { // wouldn't normally be visible. Remove it. trace!("Removing UTD that was successfully retried"); self.items.remove(timeline_item_index); - - self.result.item_removed = true; + removed_item = true; } } - self.result + removed_item } #[instrument(skip_all, fields(replacement_event_id = ?replacement.event_id))]