refactor(timeline): use TimelineEventKind::AddItem for redacted messages

This commit is contained in:
Benjamin Bouvier
2025-02-11 17:13:42 +01:00
parent 5da2235973
commit bf246b6c09
2 changed files with 24 additions and 20 deletions

View File

@@ -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`.

View File

@@ -147,13 +147,6 @@ pub(super) enum TimelineEventKind {
relations: BundledMessageLikeRelations<AnySyncMessageLikeEvent>,
},
/// 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<UnableToDecryptInfo>,
meta: &TimelineMetadata,
) -> Self {
) -> Option<Self> {
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);
}