Skip to content

Commit 057bca0

Browse files
committed
timeline: get rid of the synthetic Timeline and JoinedRoomUpdate when updating the timeline
1 parent 7587121 commit 057bca0

File tree

4 files changed

+66
-67
lines changed

4 files changed

+66
-67
lines changed

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

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ use matrix_sdk::{
2121
executor::spawn,
2222
Room,
2323
};
24-
use matrix_sdk_base::sync::JoinedRoomUpdate;
2524
use ruma::{
2625
events::{receipt::ReceiptType, AnySyncTimelineEvent},
2726
RoomVersionId,
@@ -194,24 +193,10 @@ impl TimelineBuilder {
194193
} => {
195194
trace!("Received new events");
196195

197-
// XXX this timeline and the joined room updates are synthetic, until
198-
// we get rid of `handle_joined_room_update` by adding all functionality
199-
// back in the event cache, and replacing it with a simple
196+
// TODO: (bnjbvr) account_data and ephemeral should be handled by the
197+
// event cache, and we should replace this with a simple
200198
// `handle_add_events`.
201-
let timeline = matrix_sdk_base::sync::Timeline {
202-
limited: false,
203-
prev_batch: None,
204-
events,
205-
};
206-
let update = JoinedRoomUpdate {
207-
unread_notifications: Default::default(),
208-
timeline,
209-
state: Default::default(),
210-
account_data,
211-
ephemeral,
212-
ambiguity_changes: Default::default(),
213-
};
214-
inner.handle_joined_room_update(update).await;
199+
inner.handle_joined_room_update(events, account_data, ephemeral).await;
215200

216201
let member_ambiguity_changes = ambiguity_changes
217202
.values()

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

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,7 @@ use imbl::Vector;
2424
use itertools::Itertools;
2525
#[cfg(all(test, feature = "e2e-encryption"))]
2626
use matrix_sdk::crypto::OlmMachine;
27-
use matrix_sdk::{
28-
deserialized_responses::SyncTimelineEvent, sync::JoinedRoomUpdate, Error, Result, Room,
29-
};
27+
use matrix_sdk::{deserialized_responses::SyncTimelineEvent, Error, Result, Room};
3028
#[cfg(test)]
3129
use ruma::events::receipt::ReceiptEventContent;
3230
#[cfg(all(test, feature = "e2e-encryption"))]
@@ -43,9 +41,10 @@ use ruma::{
4341
message::{MessageType, Relation},
4442
redaction::RoomRedactionEventContent,
4543
},
46-
AnyMessageLikeEventContent, AnySyncMessageLikeEvent, AnySyncTimelineEvent,
47-
MessageLikeEventType,
44+
AnyMessageLikeEventContent, AnyRoomAccountDataEvent, AnySyncEphemeralRoomEvent,
45+
AnySyncMessageLikeEvent, AnySyncTimelineEvent, MessageLikeEventType,
4846
},
47+
serde::Raw,
4948
EventId, OwnedEventId, OwnedTransactionId, RoomVersionId, TransactionId, UserId,
5049
};
5150
use tokio::sync::{RwLock, RwLockWriteGuard};
@@ -426,9 +425,22 @@ impl<P: RoomDataProvider> TimelineInner<P> {
426425
self.state.write().await.clear();
427426
}
428427

429-
pub(super) async fn handle_joined_room_update(&self, update: JoinedRoomUpdate) {
428+
pub(super) async fn handle_joined_room_update(
429+
&self,
430+
events: Vec<SyncTimelineEvent>,
431+
account_data: Vec<Raw<AnyRoomAccountDataEvent>>,
432+
ephemeral: Vec<Raw<AnySyncEphemeralRoomEvent>>,
433+
) {
430434
let mut state = self.state.write().await;
431-
state.handle_joined_room_update(update, &self.room_data_provider, &self.settings).await;
435+
state
436+
.handle_joined_room_update(
437+
events,
438+
account_data,
439+
ephemeral,
440+
&self.room_data_provider,
441+
&self.settings,
442+
)
443+
.await;
432444
}
433445

434446
#[cfg(test)]

crates/matrix-sdk-ui/src/timeline/inner/state.rs

Lines changed: 41 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ use std::{
2222

2323
use eyeball_im::{ObservableVector, ObservableVectorTransaction, ObservableVectorTransactionEntry};
2424
use indexmap::IndexMap;
25-
use matrix_sdk::{deserialized_responses::SyncTimelineEvent, sync::Timeline};
26-
use matrix_sdk_base::{deserialized_responses::TimelineEvent, sync::JoinedRoomUpdate};
25+
use matrix_sdk::deserialized_responses::SyncTimelineEvent;
26+
use matrix_sdk_base::deserialized_responses::TimelineEvent;
2727
#[cfg(test)]
2828
use ruma::events::receipt::ReceiptEventContent;
2929
use ruma::{
@@ -32,6 +32,7 @@ use ruma::{
3232
AnyMessageLikeEventContent, AnyRoomAccountDataEvent, AnySyncEphemeralRoomEvent,
3333
},
3434
push::Action,
35+
serde::Raw,
3536
EventId, MilliSecondsSinceUnixEpoch, OwnedEventId, OwnedTransactionId, OwnedUserId,
3637
RoomVersionId, UserId,
3738
};
@@ -105,38 +106,35 @@ impl TimelineInnerState {
105106
return Default::default();
106107
}
107108

108-
let mut total = HandleManyEventsResult::default();
109-
110-
let position = match position {
111-
TimelineEnd::Front => TimelineItemPosition::Start,
112-
TimelineEnd::Back { from_cache } => TimelineItemPosition::End { from_cache },
113-
};
114-
115109
let mut txn = self.transaction();
116-
for event in events {
117-
let handle_one_res =
118-
txn.handle_remote_event(event.into(), position, room_data_provider, settings).await;
119-
120-
total.items_added += handle_one_res.item_added as u64;
121-
total.items_updated += handle_one_res.items_updated as u64;
122-
}
110+
let handle_many_res =
111+
txn.add_events_at(events, position, room_data_provider, settings).await;
123112
txn.commit();
124113

125-
total
114+
handle_many_res
126115
}
127116

128117
#[instrument(skip_all)]
129118
pub(super) async fn handle_joined_room_update<P: RoomDataProvider>(
130119
&mut self,
131-
update: JoinedRoomUpdate,
120+
events: Vec<SyncTimelineEvent>,
121+
account_data: Vec<Raw<AnyRoomAccountDataEvent>>,
122+
ephemeral: Vec<Raw<AnySyncEphemeralRoomEvent>>,
132123
room_data_provider: &P,
133124
settings: &TimelineInnerSettings,
134125
) {
135126
let mut txn = self.transaction();
136-
txn.handle_sync_timeline(update.timeline, room_data_provider, settings).await;
127+
128+
txn.add_events_at(
129+
events,
130+
TimelineEnd::Back { from_cache: false },
131+
room_data_provider,
132+
settings,
133+
)
134+
.await;
137135

138136
trace!("Handling account data");
139-
for raw_event in update.account_data {
137+
for raw_event in account_data {
140138
match raw_event.deserialize() {
141139
Ok(AnyRoomAccountDataEvent::FullyRead(ev)) => {
142140
txn.set_fully_read_event(ev.content.event_id);
@@ -149,10 +147,10 @@ impl TimelineInnerState {
149147
}
150148
}
151149

152-
if !update.ephemeral.is_empty() {
150+
if !ephemeral.is_empty() {
153151
trace!("Handling ephemeral room events");
154152
let own_user_id = room_data_provider.own_user_id();
155-
for raw_event in update.ephemeral {
153+
for raw_event in ephemeral {
156154
match raw_event.deserialize() {
157155
Ok(AnySyncEphemeralRoomEvent::Receipt(ev)) => {
158156
txn.handle_explicit_read_receipts(ev.content, own_user_id);
@@ -439,28 +437,32 @@ pub(in crate::timeline) struct TimelineInnerStateTransaction<'a> {
439437
}
440438

441439
impl TimelineInnerStateTransaction<'_> {
442-
#[instrument(skip_all, fields(limited = timeline.limited))]
443-
async fn handle_sync_timeline<P: RoomDataProvider>(
440+
/// Add the given events at the given end of the timeline.
441+
#[tracing::instrument(skip(self, events, room_data_provider, settings))]
442+
pub(super) async fn add_events_at<P: RoomDataProvider>(
444443
&mut self,
445-
timeline: Timeline,
444+
events: Vec<impl Into<SyncTimelineEvent>>,
445+
position: TimelineEnd,
446446
room_data_provider: &P,
447447
settings: &TimelineInnerSettings,
448-
) {
449-
if timeline.limited {
450-
self.clear();
451-
}
448+
) -> HandleManyEventsResult {
449+
let mut total = HandleManyEventsResult::default();
452450

453-
let num_events = timeline.events.len();
454-
for (i, event) in timeline.events.into_iter().enumerate() {
455-
trace!("Handling event {} out of {num_events}", i + 1);
456-
self.handle_remote_event(
457-
event,
458-
TimelineItemPosition::End { from_cache: false },
459-
room_data_provider,
460-
settings,
461-
)
462-
.await;
451+
let position = match position {
452+
TimelineEnd::Front => TimelineItemPosition::Start,
453+
TimelineEnd::Back { from_cache } => TimelineItemPosition::End { from_cache },
454+
};
455+
456+
for event in events {
457+
let handle_one_res = self
458+
.handle_remote_event(event.into(), position, room_data_provider, settings)
459+
.await;
460+
461+
total.items_added += handle_one_res.item_added as u64;
462+
total.items_updated += handle_one_res.items_updated as u64;
463463
}
464+
465+
total
464466
}
465467

466468
/// Handle a remote event.

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ impl super::Timeline {
5353
let num_events = events.len();
5454
trace!("Back-pagination succeeded with {num_events} events");
5555

56-
let handle_many_events_result =
56+
let handle_many_res =
5757
self.inner.add_events_at(events, TimelineEnd::Front).await;
5858

5959
if reached_start {
@@ -68,8 +68,8 @@ impl super::Timeline {
6868
.total_events_received
6969
.checked_add(outcome.events_received)?;
7070

71-
outcome.items_added = handle_many_events_result.items_added;
72-
outcome.items_updated = handle_many_events_result.items_updated;
71+
outcome.items_added = handle_many_res.items_added;
72+
outcome.items_updated = handle_many_res.items_updated;
7373
outcome.total_items_added += outcome.items_added;
7474
outcome.total_items_updated += outcome.items_updated;
7575

0 commit comments

Comments
 (0)