Skip to content

Commit 73df64e

Browse files
committed
refactor(timeline): avoid cloning of relates_to for room messages
This can be done by splitting the handling of the msgtype/mentions from the handling of the `relates_to` field, requiring a few API changes here and there.
1 parent 99d740a commit 73df64e

File tree

6 files changed

+27
-15
lines changed

6 files changed

+27
-15
lines changed

crates/matrix-sdk-ui/src/timeline/controller/decryption_retry_task.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -521,13 +521,16 @@ mod tests {
521521
origin: RemoteEventOrigin::Sync,
522522
});
523523

524+
let content = RoomMessageEventContent::text_plain("hi");
525+
524526
TimelineItem::new(
525527
TimelineItemKind::Event(EventTimelineItem::new(
526528
owned_user_id!("@u:s.to"),
527529
TimelineDetails::Pending,
528530
timestamp(),
529531
TimelineItemContent::message(
530-
RoomMessageEventContent::text_plain("hi"),
532+
content.msgtype,
533+
content.mentions,
531534
ReactionsByKeyBySender::default(),
532535
None,
533536
None,

crates/matrix-sdk-ui/src/timeline/controller/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1017,7 +1017,8 @@ impl<P: RoomDataProvider, D: Decryptor> TimelineController<P, D> {
10171017
// Replace the local-related state (kind) and the content state.
10181018
let new_item = TimelineItem::new(
10191019
prev_item.with_kind(ti_kind).with_content(TimelineItemContent::message(
1020-
content,
1020+
content.msgtype,
1021+
content.mentions,
10211022
prev_item.content().reactions().cloned().unwrap_or_default(),
10221023
prev_item.content().thread_root(),
10231024
prev_item.content().in_reply_to(),

crates/matrix-sdk-ui/src/timeline/event_handler.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -447,14 +447,15 @@ impl TimelineAction {
447447
}
448448

449449
let (in_reply_to, thread_root) = Self::extract_reply_and_thread_root(
450-
msg.relates_to.clone().and_then(|rel| rel.try_into().ok()),
450+
msg.relates_to.and_then(|rel| rel.try_into().ok()),
451451
timeline_items,
452452
);
453453
Self::mark_response(meta, event_id, in_reply_to.as_ref());
454454

455455
Self::AddItem {
456456
content: TimelineItemContent::message(
457-
msg,
457+
msg.msgtype,
458+
msg.mentions,
458459
Default::default(),
459460
thread_root,
460461
in_reply_to,

crates/matrix-sdk-ui/src/timeline/event_item/content/message.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@ use ruma::{
2323
UnstablePollStartEventContent,
2424
},
2525
room::message::{
26-
MessageType, Relation, RoomMessageEventContent, RoomMessageEventContentWithoutRelation,
27-
SyncRoomMessageEvent,
26+
MessageType, Relation, RoomMessageEventContentWithoutRelation, SyncRoomMessageEvent,
2827
},
2928
AnySyncMessageLikeEvent, AnySyncTimelineEvent, BundledMessageLikeRelations, Mentions,
3029
},
@@ -46,14 +45,14 @@ pub struct Message {
4645
impl Message {
4746
/// Construct a `Message` from a `m.room.message` event.
4847
pub(in crate::timeline) fn from_event(
49-
c: RoomMessageEventContent,
48+
mut msgtype: MessageType,
49+
mentions: Option<Mentions>,
5050
edit: Option<RoomMessageEventContentWithoutRelation>,
5151
remove_reply_fallback: RemoveReplyFallback,
5252
) -> Self {
53-
let mut msgtype = c.msgtype;
5453
msgtype.sanitize(DEFAULT_SANITIZER_MODE, remove_reply_fallback);
5554

56-
let mut ret = Self { msgtype, edited: false, mentions: c.mentions };
55+
let mut ret = Self { msgtype, edited: false, mentions };
5756

5857
if let Some(edit) = edit {
5958
ret.apply_edit(edit);

crates/matrix-sdk-ui/src/timeline/event_item/content/mod.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ use ruma::{
3939
history_visibility::RoomHistoryVisibilityEventContent,
4040
join_rules::RoomJoinRulesEventContent,
4141
member::{Change, RoomMemberEventContent, SyncRoomMemberEvent},
42-
message::{Relation, RoomMessageEventContent, SyncRoomMessageEvent},
42+
message::{MessageType, Relation, SyncRoomMessageEvent},
4343
name::RoomNameEventContent,
4444
pinned_events::RoomPinnedEventsEventContent,
4545
power_levels::{RoomPowerLevels, RoomPowerLevelsEventContent},
@@ -50,7 +50,7 @@ use ruma::{
5050
},
5151
space::{child::SpaceChildEventContent, parent::SpaceParentEventContent},
5252
sticker::{StickerEventContent, SyncStickerEvent},
53-
AnyFullStateEventContent, AnySyncTimelineEvent, FullStateEventContent,
53+
AnyFullStateEventContent, AnySyncTimelineEvent, FullStateEventContent, Mentions,
5454
MessageLikeEventType, StateEventType,
5555
},
5656
html::RemoveReplyFallback,
@@ -199,7 +199,8 @@ impl TimelineItemContent {
199199

200200
let msglike = MsgLikeContent {
201201
kind: MsgLikeKind::Message(Message::from_event(
202-
event_content,
202+
event_content.msgtype,
203+
event_content.mentions,
203204
edit,
204205
RemoveReplyFallback::Yes,
205206
)),
@@ -410,7 +411,8 @@ impl TimelineItemContent {
410411
// These constructors could also be `From` implementations, but that would
411412
// allow users to call them directly, which should not be supported
412413
pub(crate) fn message(
413-
c: RoomMessageEventContent,
414+
msgtype: MessageType,
415+
mentions: Option<Mentions>,
414416
reactions: ReactionsByKeyBySender,
415417
thread_root: Option<OwnedEventId>,
416418
in_reply_to: Option<InReplyToDetails>,
@@ -420,7 +422,12 @@ impl TimelineItemContent {
420422
if in_reply_to.is_some() { RemoveReplyFallback::Yes } else { RemoveReplyFallback::No };
421423

422424
Self::MsgLike(MsgLikeContent {
423-
kind: MsgLikeKind::Message(Message::from_event(c, None, remove_reply_fallback)),
425+
kind: MsgLikeKind::Message(Message::from_event(
426+
msgtype,
427+
mentions,
428+
None,
429+
remove_reply_fallback,
430+
)),
424431
reactions,
425432
thread_root,
426433
in_reply_to,

crates/matrix-sdk-ui/src/timeline/event_item/content/reply.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,8 @@ impl RepliedToEvent {
145145

146146
TimelineItemContent::MsgLike(MsgLikeContent {
147147
kind: MsgLikeKind::Message(Message::from_event(
148-
c,
148+
c.msgtype,
149+
c.mentions,
149150
extract_room_msg_edit_content(event.relations()),
150151
RemoveReplyFallback::Yes,
151152
)),

0 commit comments

Comments
 (0)