Skip to content

Commit 96e1f4f

Browse files
committed
ouch: include the event origin in the timeline position/end
and don't assume inserting to the end means it's coming from sync — not true for forward pagination anymore
1 parent acb7f9b commit 96e1f4f

File tree

9 files changed

+76
-43
lines changed

9 files changed

+76
-43
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ use super::{
3030
queue::send_queued_messages,
3131
Error, Timeline, TimelineDropHandle, TimelineFocus,
3232
};
33-
use crate::unable_to_decrypt_hook::UtdHookManager;
33+
use crate::{timeline::event_item::RemoteEventOrigin, unable_to_decrypt_hook::UtdHookManager};
3434

3535
/// Builder that allows creating and configuring various parts of a
3636
/// [`Timeline`].
@@ -158,7 +158,9 @@ impl TimelineBuilder {
158158
inner
159159
.add_events_at(
160160
initial_events,
161-
crate::timeline::inner::TimelineEnd::Back { from_cache: true },
161+
crate::timeline::inner::TimelineEnd::Back {
162+
origin: RemoteEventOrigin::Cache,
163+
},
162164
)
163165
.await;
164166
}

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

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -212,15 +212,16 @@ impl TimelineEventKind {
212212
pub(super) enum TimelineItemPosition {
213213
/// One or more items are prepended to the timeline (i.e. they're the
214214
/// oldest).
215-
///
216-
/// Usually this means items coming from back-pagination.
217-
Start,
215+
Start {
216+
/// What's the origin of this event?
217+
origin: RemoteEventOrigin,
218+
},
218219

219220
/// One or more items are appended to the timeline (i.e. they're the most
220221
/// recent).
221222
End {
222-
/// Whether this event is coming from a local cache.
223-
from_cache: bool,
223+
/// What's the origin of this event?
224+
origin: RemoteEventOrigin,
224225
},
225226

226227
/// A single item is updated.
@@ -825,16 +826,12 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
825826
}
826827
}
827828

828-
let origin = match position {
829-
TimelineItemPosition::Start => RemoteEventOrigin::Pagination,
830-
831-
// We only paginate backwards for now, so End only happens for syncs
832-
TimelineItemPosition::End { from_cache: true } => RemoteEventOrigin::Cache,
833-
834-
TimelineItemPosition::End { from_cache: false } => RemoteEventOrigin::Sync,
829+
let origin = match *position {
830+
TimelineItemPosition::Start { origin }
831+
| TimelineItemPosition::End { origin, .. } => origin,
835832

836833
#[cfg(feature = "e2e-encryption")]
837-
TimelineItemPosition::Update(idx) => self.items[*idx]
834+
TimelineItemPosition::Update(idx) => self.items[idx]
838835
.as_event()
839836
.and_then(|ev| Some(ev.as_remote()?.origin))
840837
.unwrap_or_else(|| {
@@ -868,7 +865,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
868865
self.items.push_back(item);
869866
}
870867

871-
Flow::Remote { position: TimelineItemPosition::Start, event_id, .. } => {
868+
Flow::Remote { position: TimelineItemPosition::Start { .. }, event_id, .. } => {
872869
if self
873870
.items
874871
.iter()

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

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ use tracing::{field, info_span, Instrument as _};
6464
use super::traits::Decryptor;
6565
use super::{
6666
error::PaginationError,
67-
event_item::EventItemIdentifier,
67+
event_item::{EventItemIdentifier, RemoteEventOrigin},
6868
reactions::ReactionToggleResult,
6969
traits::RoomDataProvider,
7070
util::{rfind_event_by_id, rfind_event_item, RelativePosition},
@@ -338,7 +338,7 @@ impl<P: RoomDataProvider> TimelineInner<P> {
338338

339339
self.clear().await;
340340
let (events, _) = event_cache.subscribe().await.map_err(Error::EventCacheError)?;
341-
self.add_events_at(events, TimelineEnd::Back { from_cache: true }).await;
341+
self.add_events_at(events, TimelineEnd::Back { origin: RemoteEventOrigin::Cache }).await;
342342

343343
Ok(())
344344
}
@@ -358,7 +358,11 @@ impl<P: RoomDataProvider> TimelineInner<P> {
358358
.map_err(PaginationError::Paginator)?;
359359

360360
self.clear().await;
361-
self.add_events_at(response.events, TimelineEnd::Back { from_cache: false }).await;
361+
self.add_events_at(
362+
response.events,
363+
TimelineEnd::Back { origin: RemoteEventOrigin::Pagination },
364+
)
365+
.await;
362366

363367
Ok(())
364368
}
@@ -384,7 +388,11 @@ impl<P: RoomDataProvider> TimelineInner<P> {
384388
}
385389
};
386390

387-
self.add_events_at(outcome.events, TimelineEnd::Front).await;
391+
self.add_events_at(
392+
outcome.events,
393+
TimelineEnd::Front { origin: RemoteEventOrigin::Pagination },
394+
)
395+
.await;
388396

389397
status.set(if outcome.hit_end_of_timeline {
390398
PaginationStatus::TimelineEndReached
@@ -416,7 +424,11 @@ impl<P: RoomDataProvider> TimelineInner<P> {
416424
}
417425
};
418426

419-
self.add_events_at(outcome.events, TimelineEnd::Back { from_cache: false }).await;
427+
self.add_events_at(
428+
outcome.events,
429+
TimelineEnd::Back { origin: RemoteEventOrigin::Pagination },
430+
)
431+
.await;
420432

421433
status.set(if outcome.hit_end_of_timeline {
422434
PaginationStatus::TimelineEndReached
@@ -652,7 +664,7 @@ impl<P: RoomDataProvider> TimelineInner<P> {
652664
state
653665
.add_events_at(
654666
vec![event],
655-
TimelineEnd::Back { from_cache: false },
667+
TimelineEnd::Back { origin: RemoteEventOrigin::Sync },
656668
&self.room_data_provider,
657669
&self.settings,
658670
)

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

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ use crate::{
4141
Flow, HandleEventResult, TimelineEventContext, TimelineEventHandler, TimelineEventKind,
4242
TimelineItemPosition,
4343
},
44-
event_item::EventItemIdentifier,
44+
event_item::{EventItemIdentifier, RemoteEventOrigin},
4545
polls::PollPendingEvents,
4646
reactions::{ReactionToggleResult, Reactions},
4747
read_receipts::ReadReceipts,
@@ -60,11 +60,14 @@ use crate::{
6060
#[derive(Debug)]
6161
pub(crate) enum TimelineEnd {
6262
/// Event should be prepended to the front of the timeline.
63-
Front,
63+
Front {
64+
/// What's the origin of this event?
65+
origin: RemoteEventOrigin,
66+
},
6467
/// Event should appended to the back of the timeline.
6568
Back {
66-
/// Did the event come from the cache?
67-
from_cache: bool,
69+
/// What's the origin of this event?
70+
origin: RemoteEventOrigin,
6871
},
6972
}
7073

@@ -133,7 +136,7 @@ impl TimelineInnerState {
133136

134137
txn.add_events_at(
135138
events,
136-
TimelineEnd::Back { from_cache: false },
139+
TimelineEnd::Back { origin: RemoteEventOrigin::Sync },
137140
room_data_provider,
138141
settings,
139142
)
@@ -452,8 +455,8 @@ impl TimelineInnerStateTransaction<'_> {
452455
let mut total = HandleManyEventsResult::default();
453456

454457
let position = match position {
455-
TimelineEnd::Front => TimelineItemPosition::Start,
456-
TimelineEnd::Back { from_cache } => TimelineItemPosition::End { from_cache },
458+
TimelineEnd::Front { origin } => TimelineItemPosition::Start { origin },
459+
TimelineEnd::Back { origin } => TimelineItemPosition::End { origin },
457460
};
458461

459462
let mut day_divider_adjuster = DayDividerAdjuster::default();
@@ -678,7 +681,9 @@ impl TimelineInnerStateTransaction<'_> {
678681
settings: &TimelineInnerSettings,
679682
) {
680683
match position {
681-
TimelineItemPosition::Start => self.meta.all_events.push_front(event_meta.base_meta()),
684+
TimelineItemPosition::Start { .. } => {
685+
self.meta.all_events.push_front(event_meta.base_meta())
686+
}
682687
TimelineItemPosition::End { .. } => {
683688
// Handle duplicated event.
684689
if let Some(pos) =
@@ -708,7 +713,10 @@ impl TimelineInnerStateTransaction<'_> {
708713
}
709714

710715
if settings.track_read_receipts
711-
&& matches!(position, TimelineItemPosition::Start | TimelineItemPosition::End { .. })
716+
&& matches!(
717+
position,
718+
TimelineItemPosition::Start { .. } | TimelineItemPosition::End { .. }
719+
)
712720
{
713721
self.load_read_receipts_for_event(event_meta.event_id, room_data_provider).await;
714722

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use ruma::OwnedEventId;
2020
use tracing::{instrument, trace, warn};
2121

2222
use super::Error;
23-
use crate::timeline::inner::TimelineEnd;
23+
use crate::timeline::{event_item::RemoteEventOrigin, inner::TimelineEnd};
2424

2525
impl super::Timeline {
2626
/// Assuming the timeline is focused on an event, starts a forwards
@@ -88,8 +88,13 @@ impl super::Timeline {
8888
let num_events = events.len();
8989
trace!("Back-pagination succeeded with {num_events} events");
9090

91-
let handle_many_res =
92-
self.inner.add_events_at(events, TimelineEnd::Front).await;
91+
let handle_many_res = self
92+
.inner
93+
.add_events_at(
94+
events,
95+
TimelineEnd::Front { origin: RemoteEventOrigin::Pagination },
96+
)
97+
.await;
9398

9499
if reached_start {
95100
back_pagination_status

crates/matrix-sdk-ui/src/timeline/tests/basic.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,9 @@ use stream_assert::assert_next_matches;
3434

3535
use super::TestTimeline;
3636
use crate::timeline::{
37-
event_item::AnyOtherFullStateEventContent, inner::TimelineEnd, MembershipChange,
38-
TimelineDetails, TimelineItemContent, TimelineItemKind, VirtualTimelineItem,
37+
event_item::{AnyOtherFullStateEventContent, RemoteEventOrigin},
38+
inner::TimelineEnd,
39+
MembershipChange, TimelineDetails, TimelineItemContent, TimelineItemKind, VirtualTimelineItem,
3940
};
4041

4142
#[async_test]
@@ -58,7 +59,7 @@ async fn test_initial_events() {
5859
.make_sync_message_event(*BOB, RoomMessageEventContent::text_plain("B")),
5960
),
6061
],
61-
TimelineEnd::Back { from_cache: false },
62+
TimelineEnd::Back { origin: RemoteEventOrigin::Sync },
6263
)
6364
.await;
6465

@@ -251,7 +252,7 @@ async fn test_dedup_initial() {
251252
// … and a new event also came in
252253
event_c,
253254
],
254-
TimelineEnd::Back { from_cache: false },
255+
TimelineEnd::Back { origin: RemoteEventOrigin::Sync },
255256
)
256257
.await;
257258

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,12 @@ impl TestTimeline {
247247

248248
async fn handle_back_paginated_custom_event(&self, event: Raw<AnyTimelineEvent>) {
249249
let timeline_event = TimelineEvent::new(event.cast());
250-
self.inner.add_events_at(vec![timeline_event], TimelineEnd::Front).await;
250+
self.inner
251+
.add_events_at(
252+
vec![timeline_event],
253+
TimelineEnd::Front { origin: super::event_item::RemoteEventOrigin::Pagination },
254+
)
255+
.await;
251256
}
252257

253258
async fn handle_read_receipts(

crates/matrix-sdk-ui/src/timeline/tests/reactions.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use ruma::{
2727
use stream_assert::assert_next_matches;
2828

2929
use crate::timeline::{
30-
event_item::EventItemIdentifier,
30+
event_item::{EventItemIdentifier, RemoteEventOrigin},
3131
inner::ReactionAction,
3232
reactions::ReactionToggleResult,
3333
tests::{assert_event_is_updated, assert_no_more_updates, TestTimeline},
@@ -259,7 +259,7 @@ async fn test_initial_reaction_timestamp_is_stored() {
259259
RoomMessageEventContent::text_plain("A"),
260260
)),
261261
],
262-
crate::timeline::inner::TimelineEnd::Back { from_cache: false },
262+
crate::timeline::inner::TimelineEnd::Back { origin: RemoteEventOrigin::Sync },
263263
)
264264
.await;
265265

crates/matrix-sdk-ui/src/timeline/tests/redaction.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,10 @@ use ruma::{
3535
use stream_assert::assert_next_matches;
3636

3737
use super::TestTimeline;
38-
use crate::timeline::{AnyOtherFullStateEventContent, TimelineDetails, TimelineItemContent};
38+
use crate::timeline::{
39+
event_item::RemoteEventOrigin, AnyOtherFullStateEventContent, TimelineDetails,
40+
TimelineItemContent,
41+
};
3942

4043
#[async_test]
4144
async fn test_redact_state_event() {
@@ -152,7 +155,7 @@ async fn test_reaction_redaction_timeline_filter() {
152155
.event_builder
153156
.make_sync_redacted_message_event(*ALICE, RedactedReactionEventContent::new()),
154157
)],
155-
crate::timeline::inner::TimelineEnd::Back { from_cache: false },
158+
crate::timeline::inner::TimelineEnd::Back { origin: RemoteEventOrigin::Sync },
156159
)
157160
.await;
158161
// Timeline items are actually empty.

0 commit comments

Comments
 (0)