Skip to content

Commit c426138

Browse files
committed
refactor(timeline): rename RepliedToEvent to EmbeddedEvent and reuse it for the thread summary
1 parent ff4b7a8 commit c426138

File tree

9 files changed

+63
-70
lines changed

9 files changed

+63
-70
lines changed

bindings/matrix-sdk-ffi/src/timeline/msg_like.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@ impl ThreadSummary {
254254

255255
#[derive(Clone, uniffi::Enum)]
256256
#[allow(clippy::large_enum_variant)]
257+
// TODO: unify with the FFI replied-to-event-details
257258
pub enum ThreadSummaryLatestEventDetails {
258259
Unavailable,
259260
Pending,

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ use super::{
6969
subscriber::TimelineSubscriber,
7070
threaded_events_loader::ThreadedEventsLoader,
7171
traits::{Decryptor, RoomDataProvider},
72-
DateDividerMode, Error, EventSendState, EventTimelineItem, InReplyToDetails, PaginationError,
73-
Profile, RepliedToEvent, TimelineDetails, TimelineEventItemId, TimelineFocus, TimelineItem,
72+
DateDividerMode, EmbeddedEvent, Error, EventSendState, EventTimelineItem, InReplyToDetails,
73+
PaginationError, Profile, TimelineDetails, TimelineEventItemId, TimelineFocus, TimelineItem,
7474
TimelineItemContent, TimelineItemKind, VirtualTimelineItem,
7575
};
7676
use crate::{
@@ -1338,20 +1338,20 @@ impl<P: RoomDataProvider, D: Decryptor> TimelineController<P, D> {
13381338
txn.commit();
13391339
}
13401340

1341-
/// Create a [`RepliedToEvent`] from an arbitrary event, be it in the
1341+
/// Create a [`EmbeddedEvent`] from an arbitrary event, be it in the
13421342
/// timeline or not.
13431343
///
13441344
/// Can be `None` if the event cannot be represented as a standalone item,
13451345
/// because it's an aggregation.
13461346
pub(super) async fn make_replied_to(
13471347
&self,
13481348
event: TimelineEvent,
1349-
) -> Result<Option<RepliedToEvent>, Error> {
1349+
) -> Result<Option<EmbeddedEvent>, Error> {
13501350
// Reborrow, to avoid that the automatic deref borrows the entire guard (and we
13511351
// can't borrow both items and meta).
13521352
let state = &mut *self.state.write().await;
13531353

1354-
RepliedToEvent::try_from_timeline_event(
1354+
EmbeddedEvent::try_from_timeline_event(
13551355
event,
13561356
&self.room_data_provider,
13571357
&state.items,
@@ -1562,9 +1562,9 @@ async fn fetch_replied_to_event(
15621562
msglike: &MsgLikeContent,
15631563
in_reply_to: &EventId,
15641564
room: &Room,
1565-
) -> Result<TimelineDetails<Box<RepliedToEvent>>, Error> {
1565+
) -> Result<TimelineDetails<Box<EmbeddedEvent>>, Error> {
15661566
if let Some((_, item)) = rfind_event_by_id(&state_guard.items, in_reply_to) {
1567-
let details = TimelineDetails::Ready(Box::new(RepliedToEvent::from_timeline_item(&item)));
1567+
let details = TimelineDetails::Ready(Box::new(EmbeddedEvent::from_timeline_item(&item)));
15681568
trace!("Found replied-to event locally");
15691569
return Ok(details);
15701570
};
@@ -1589,7 +1589,7 @@ async fn fetch_replied_to_event(
15891589
Ok(timeline_event) => {
15901590
let state = &mut *state_lock.write().await;
15911591

1592-
let replied_to_item = RepliedToEvent::try_from_timeline_event(
1592+
let replied_to_item = EmbeddedEvent::try_from_timeline_event(
15931593
timeline_event,
15941594
room,
15951595
&state.items,

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

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ use super::{
3737
};
3838
use crate::timeline::{
3939
event_handler::{FailedToParseEvent, RemovedItem, TimelineAction},
40-
ThreadSummary, ThreadSummaryLatestEvent, TimelineDetails, VirtualTimelineItem,
40+
EmbeddedEvent, ThreadSummary, TimelineDetails, VirtualTimelineItem,
4141
};
4242

4343
pub(in crate::timeline) struct TimelineStateTransaction<'a> {
@@ -558,21 +558,19 @@ impl<'a> TimelineStateTransaction<'a> {
558558
let TimelineEvent { push_actions, kind, thread_summary } = event;
559559

560560
let thread_summary = if let Some(summary) = thread_summary.summary() {
561-
let latest_reply_item =
562-
if let Some(event_id) = summary.latest_reply.as_ref() {
563-
// Attempt to load the timeline event, either from the event cache or the
564-
// storage.
565-
let event = room_data_provider
566-
.load_event(event_id)
567-
.await
568-
.inspect_err(|err| {
569-
warn!("Failed to load thread latest event: {err}");
570-
})
571-
.ok();
572-
573-
if let Some(event) = event {
574-
// lol @ hack
575-
crate::timeline::RepliedToEvent::try_from_timeline_event(
561+
let latest_reply_item = if let Some(event_id) = summary.latest_reply.as_ref() {
562+
// Attempt to load the timeline event, either from the event cache or the
563+
// storage.
564+
let event = room_data_provider
565+
.load_event(event_id)
566+
.await
567+
.inspect_err(|err| {
568+
warn!("Failed to load thread latest event: {err}");
569+
})
570+
.ok();
571+
572+
if let Some(event) = event {
573+
EmbeddedEvent::try_from_timeline_event(
576574
event,
577575
room_data_provider,
578576
&self.items,
@@ -584,17 +582,13 @@ impl<'a> TimelineStateTransaction<'a> {
584582
})
585583
.ok()
586584
.flatten()
587-
.map(|replied_to| Box::new(ThreadSummaryLatestEvent {
588-
content: replied_to.content().clone(),
589-
sender: replied_to.sender().to_owned(),
590-
sender_profile: replied_to.sender_profile().clone(),
591-
}))
592-
} else {
593-
None
594-
}
585+
.map(Box::new)
595586
} else {
596587
None
597-
};
588+
}
589+
} else {
590+
None
591+
};
598592

599593
Some(ThreadSummary {
600594
latest_event: TimelineDetails::from_initial_value(latest_reply_item),

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ use super::{
5656
TimelineEventItemId,
5757
},
5858
traits::RoomDataProvider,
59-
EncryptedMessage, EventTimelineItem, InReplyToDetails, MsgLikeContent, MsgLikeKind, OtherState,
60-
ReactionStatus, RepliedToEvent, Sticker, ThreadSummary, TimelineDetails, TimelineItem,
59+
EmbeddedEvent, EncryptedMessage, EventTimelineItem, InReplyToDetails, MsgLikeContent,
60+
MsgLikeKind, OtherState, ReactionStatus, Sticker, ThreadSummary, TimelineDetails, TimelineItem,
6161
TimelineItemContent,
6262
};
6363
use crate::timeline::controller::aggregations::PendingEdit;
@@ -1205,7 +1205,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
12051205
trace!(reply_event_id = ?event_item.identifier(), "Updating response to updated event");
12061206
let in_reply_to = InReplyToDetails {
12071207
event_id: in_reply_to.event_id.clone(),
1208-
event: TimelineDetails::Ready(Box::new(RepliedToEvent::from_timeline_item(
1208+
event: TimelineDetails::Ready(Box::new(EmbeddedEvent::from_timeline_item(
12091209
new_item,
12101210
))),
12111211
};

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,9 @@ pub(in crate::timeline) use self::message::{
7171
};
7272
pub use self::{
7373
message::Message,
74-
msg_like::{MsgLikeContent, MsgLikeKind, ThreadSummary, ThreadSummaryLatestEvent},
74+
msg_like::{MsgLikeContent, MsgLikeKind, ThreadSummary},
7575
polls::{PollResult, PollState},
76-
reply::{InReplyToDetails, RepliedToEvent},
76+
reply::{EmbeddedEvent, InReplyToDetails},
7777
};
7878
use super::ReactionsByKeyBySender;
7979

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

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313
// limitations under the License.
1414

1515
use as_variant::as_variant;
16-
use ruma::{OwnedEventId, OwnedUserId};
16+
use ruma::OwnedEventId;
1717

18-
use super::{EncryptedMessage, InReplyToDetails, Message, PollState, Sticker, TimelineItemContent};
19-
use crate::timeline::{Profile, ReactionsByKeyBySender, TimelineDetails};
18+
use super::{EmbeddedEvent, EncryptedMessage, InReplyToDetails, Message, PollState, Sticker};
19+
use crate::timeline::{ReactionsByKeyBySender, TimelineDetails};
2020

2121
#[derive(Clone, Debug)]
2222
pub enum MsgLikeKind {
@@ -38,7 +38,7 @@ pub enum MsgLikeKind {
3838

3939
#[derive(Clone, Debug)]
4040
pub struct ThreadSummary {
41-
pub latest_event: TimelineDetails<Box<ThreadSummaryLatestEvent>>,
41+
pub latest_event: TimelineDetails<Box<EmbeddedEvent>>,
4242

4343
/// The number of events in the thread, except for the thread root.
4444
///
@@ -50,13 +50,6 @@ pub struct ThreadSummary {
5050
pub num_replies: usize,
5151
}
5252

53-
#[derive(Clone, Debug)]
54-
pub struct ThreadSummaryLatestEvent {
55-
pub content: TimelineItemContent,
56-
pub sender: OwnedUserId,
57-
pub sender_profile: TimelineDetails<Profile>,
58-
}
59-
6053
/// A special kind of [`super::TimelineItemContent`] that groups together
6154
/// different room message types with their respective reactions and thread
6255
/// information.

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

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ pub struct InReplyToDetails {
4040
/// unavailable.
4141
///
4242
/// [`Timeline::fetch_details_for_event`]: crate::Timeline::fetch_details_for_event
43-
pub event: TimelineDetails<Box<RepliedToEvent>>,
43+
pub event: TimelineDetails<Box<EmbeddedEvent>>,
4444
}
4545

4646
impl InReplyToDetails {
@@ -52,21 +52,26 @@ impl InReplyToDetails {
5252
.iter()
5353
.filter_map(|it| it.as_event())
5454
.find(|it| it.event_id() == Some(&*event_id))
55-
.map(|item| Box::new(RepliedToEvent::from_timeline_item(item)));
55+
.map(|item| Box::new(EmbeddedEvent::from_timeline_item(item)));
5656

5757
InReplyToDetails { event_id, event: TimelineDetails::from_initial_value(event) }
5858
}
5959
}
6060

61-
/// An event that is replied to.
61+
/// An event that is embedded in another event, such as a replied-to event, or a
62+
/// thread latest event.
6263
#[derive(Clone, Debug)]
63-
pub struct RepliedToEvent {
64-
content: TimelineItemContent,
65-
sender: OwnedUserId,
66-
sender_profile: TimelineDetails<Profile>,
64+
pub struct EmbeddedEvent {
65+
/// The content of the embedded item.
66+
pub content: TimelineItemContent,
67+
/// The user ID of the sender of the related embedded event.
68+
pub sender: OwnedUserId,
69+
/// The profile of the sender of the related embedded event.
70+
pub sender_profile: TimelineDetails<Profile>,
6771
}
6872

69-
impl RepliedToEvent {
73+
impl EmbeddedEvent {
74+
// TODO: remove public getters
7075
/// Get the message of this event.
7176
pub fn content(&self) -> &TimelineItemContent {
7277
&self.content
@@ -82,7 +87,7 @@ impl RepliedToEvent {
8287
&self.sender_profile
8388
}
8489

85-
/// Create a [`RepliedToEvent`] from a loaded event timeline item.
90+
/// Create a [`EmbeddedEvent`] from a loaded event timeline item.
8691
pub fn from_timeline_item(timeline_item: &EventTimelineItem) -> Self {
8792
Self {
8893
content: timeline_item.content.clone(),

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,10 @@ pub(super) use self::{
5151
};
5252
pub use self::{
5353
content::{
54-
AnyOtherFullStateEventContent, EncryptedMessage, InReplyToDetails, MemberProfileChange,
55-
MembershipChange, Message, MsgLikeContent, MsgLikeKind, OtherState, PollResult, PollState,
56-
RepliedToEvent, RoomMembershipChange, RoomPinnedEventsChange, Sticker, ThreadSummary,
57-
ThreadSummaryLatestEvent, TimelineItemContent,
54+
AnyOtherFullStateEventContent, EmbeddedEvent, EncryptedMessage, InReplyToDetails,
55+
MemberProfileChange, MembershipChange, Message, MsgLikeContent, MsgLikeKind, OtherState,
56+
PollResult, PollState, RoomMembershipChange, RoomPinnedEventsChange, Sticker,
57+
ThreadSummary, TimelineItemContent,
5858
},
5959
local::EventSendState,
6060
};

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,12 @@ pub use self::{
8585
controller::default_event_filter,
8686
error::*,
8787
event_item::{
88-
AnyOtherFullStateEventContent, EncryptedMessage, EventItemOrigin, EventSendState,
89-
EventTimelineItem, InReplyToDetails, MemberProfileChange, MembershipChange, Message,
90-
MsgLikeContent, MsgLikeKind, OtherState, PollResult, PollState, Profile, ReactionInfo,
91-
ReactionStatus, ReactionsByKeyBySender, RepliedToEvent, RoomMembershipChange,
92-
RoomPinnedEventsChange, Sticker, ThreadSummary, ThreadSummaryLatestEvent, TimelineDetails,
93-
TimelineEventItemId, TimelineItemContent,
88+
AnyOtherFullStateEventContent, EmbeddedEvent, EncryptedMessage, EventItemOrigin,
89+
EventSendState, EventTimelineItem, InReplyToDetails, MemberProfileChange, MembershipChange,
90+
Message, MsgLikeContent, MsgLikeKind, OtherState, PollResult, PollState, Profile,
91+
ReactionInfo, ReactionStatus, ReactionsByKeyBySender, RoomMembershipChange,
92+
RoomPinnedEventsChange, Sticker, ThreadSummary, TimelineDetails, TimelineEventItemId,
93+
TimelineItemContent,
9494
},
9595
event_type_filter::TimelineEventTypeFilter,
9696
item::{TimelineItem, TimelineItemKind, TimelineUniqueId},
@@ -715,15 +715,15 @@ impl Timeline {
715715
}
716716
}
717717

718-
/// Create a [`RepliedToEvent`] from an arbitrary event, be it in the
718+
/// Create a [`EmbeddedEvent`] from an arbitrary event, be it in the
719719
/// timeline or not.
720720
///
721721
/// Can be `None` if the event cannot be represented as a standalone item,
722722
/// because it's an aggregation.
723723
pub async fn make_replied_to(
724724
&self,
725725
event: TimelineEvent,
726-
) -> Result<Option<RepliedToEvent>, Error> {
726+
) -> Result<Option<EmbeddedEvent>, Error> {
727727
self.controller.make_replied_to(event).await
728728
}
729729
}

0 commit comments

Comments
 (0)