From bf246b6c099d0797c31f28ecbeb52bd9379c8eb8 Mon Sep 17 00:00:00 2001 From: Benjamin Bouvier Date: Tue, 11 Feb 2025 17:13:42 +0100 Subject: [PATCH] refactor(timeline): use `TimelineEventKind::AddItem` for redacted messages --- .../timeline/controller/state_transaction.rs | 10 ++++-- .../src/timeline/event_handler.rs | 34 +++++++++---------- 2 files changed, 24 insertions(+), 20 deletions(-) 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 baaed00a4..403a7c598 100644 --- a/crates/matrix-sdk-ui/src/timeline/controller/state_transaction.rs +++ b/crates/matrix-sdk-ui/src/timeline/controller/state_transaction.rs @@ -333,7 +333,7 @@ impl<'a> TimelineStateTransaction<'a> { event.sender().to_owned(), event.origin_server_ts(), event.transaction_id().map(ToOwned::to_owned), - TimelineEventKind::failed_to_parse(event, e), + Some(TimelineEventKind::failed_to_parse(event, e)), true, ), @@ -442,7 +442,13 @@ impl<'a> TimelineStateTransaction<'a> { }; // Handle the event to create or update a timeline item. - TimelineEventHandler::new(self, ctx).handle_event(date_divider_adjuster, event_kind).await + if let Some(event_kind) = event_kind { + TimelineEventHandler::new(self, ctx) + .handle_event(date_divider_adjuster, event_kind) + .await + } else { + HandleEventResult::default() + } } /// Remove one timeline item by its `event_index`. diff --git a/crates/matrix-sdk-ui/src/timeline/event_handler.rs b/crates/matrix-sdk-ui/src/timeline/event_handler.rs index 3ef74a5e8..8a4f7d5a0 100644 --- a/crates/matrix-sdk-ui/src/timeline/event_handler.rs +++ b/crates/matrix-sdk-ui/src/timeline/event_handler.rs @@ -147,13 +147,6 @@ pub(super) enum TimelineEventKind { relations: BundledMessageLikeRelations, }, - /// Some remote event that was redacted a priori, i.e. we never had the - /// original content, so we'll just display a dummy redacted timeline - /// item. - RedactedMessage { - event_type: MessageLikeEventType, - }, - /// We're redacting a remote event that we may or may not know about (i.e. /// the redacted event *may* have a corresponding timeline item). Redaction { @@ -192,15 +185,23 @@ impl TimelineEventKind { room_data_provider: &P, unable_to_decrypt_info: Option, meta: &TimelineMetadata, - ) -> Self { + ) -> Option { let room_version = room_data_provider.room_version(); - match event { + let redacted_message_or_none = |event_type: MessageLikeEventType| { + (event_type != MessageLikeEventType::Reaction) + .then_some(TimelineItemContent::MsgLike(MsgLikeContent::redacted())) + }; + + Some(match event { AnySyncTimelineEvent::MessageLike(AnySyncMessageLikeEvent::RoomRedaction(ev)) => { if let Some(redacts) = ev.redacts(&room_version).map(ToOwned::to_owned) { Self::Redaction { redacts } } else { - Self::RedactedMessage { event_type: ev.event_type() } + Self::AddItem { + content: redacted_message_or_none(ev.event_type())?, + edit_json: None, + } } } @@ -247,7 +248,10 @@ impl TimelineEventKind { } } Some(content) => Self::Message { content, relations: ev.relations() }, - None => Self::RedactedMessage { event_type: ev.event_type() }, + None => Self::AddItem { + content: redacted_message_or_none(ev.event_type())?, + edit_json: None, + }, }, AnySyncTimelineEvent::State(ev) => match ev { @@ -271,7 +275,7 @@ impl TimelineEventKind { content: AnyOtherFullStateEventContent::with_event_content(ev.content()), }, }, - } + }) } pub(super) fn failed_to_parse( @@ -500,12 +504,6 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> { } }, - TimelineEventKind::RedactedMessage { event_type } => { - if event_type != MessageLikeEventType::Reaction && should_add { - self.add_item(TimelineItemContent::MsgLike(MsgLikeContent::redacted()), None); - } - } - TimelineEventKind::Redaction { redacts } => { self.handle_redaction(redacts); }