diff --git a/bindings/matrix-sdk-ffi/src/timeline/mod.rs b/bindings/matrix-sdk-ffi/src/timeline/mod.rs index 48859c77c..94c832897 100644 --- a/bindings/matrix-sdk-ffi/src/timeline/mod.rs +++ b/bindings/matrix-sdk-ffi/src/timeline/mod.rs @@ -746,8 +746,8 @@ impl TimelineItem { } } - pub fn unique_id(&self) -> u64 { - self.0.unique_id() + pub fn unique_id(&self) -> String { + self.0.unique_id().to_owned() } pub fn fmt_debug(&self) -> String { diff --git a/crates/matrix-sdk-ui/src/timeline/day_dividers.rs b/crates/matrix-sdk-ui/src/timeline/day_dividers.rs index 98b12ed7a..0c422ae98 100644 --- a/crates/matrix-sdk-ui/src/timeline/day_dividers.rs +++ b/crates/matrix-sdk-ui/src/timeline/day_dividers.rs @@ -291,7 +291,10 @@ impl DayDividerAdjuster { } let unique_id = replaced.unique_id(); - let item = TimelineItem::new(VirtualTimelineItem::DayDivider(ts), unique_id); + let item = TimelineItem::new( + VirtualTimelineItem::DayDivider(ts), + unique_id.to_owned(), + ); items.set(at, item); max_i = i; diff --git a/crates/matrix-sdk-ui/src/timeline/event_handler.rs b/crates/matrix-sdk-ui/src/timeline/event_handler.rs index 5f009f85a..ce23b8509 100644 --- a/crates/matrix-sdk-ui/src/timeline/event_handler.rs +++ b/crates/matrix-sdk-ui/src/timeline/event_handler.rs @@ -934,13 +934,13 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> { // If the old item is the last one and no day divider // changes need to happen, replace and return early. trace!(idx, "Replacing existing event"); - self.items.set(idx, TimelineItem::new(item, old_item_id)); + self.items.set(idx, TimelineItem::new(item, old_item_id.to_owned())); return; } // In more complex cases, remove the item before re-adding the item. trace!("Removing local echo or duplicate timeline item"); - removed_event_item_id = Some(self.items.remove(idx).internal_id); + removed_event_item_id = Some(self.items.remove(idx).internal_id.clone()); // no return here, below code for adding a new event // will run to re-add the removed item @@ -988,7 +988,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> { #[cfg(feature = "e2e-encryption")] Flow::Remote { position: TimelineItemPosition::Update(idx), .. } => { trace!("Updating timeline item at position {idx}"); - let id = self.items[*idx].internal_id; + let id = self.items[*idx].internal_id.clone(); self.items.set(*idx, TimelineItem::new(item, id)); } } @@ -1040,7 +1040,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> { trace!("Found timeline item to update"); if let Some(new_item) = update(self, item.inner) { trace!("Updating item"); - self.items.set(idx, TimelineItem::new(new_item, item.internal_id)); + self.items.set(idx, TimelineItem::new(new_item, item.internal_id.to_owned())); self.result.items_updated += 1; } true diff --git a/crates/matrix-sdk-ui/src/timeline/inner/mod.rs b/crates/matrix-sdk-ui/src/timeline/inner/mod.rs index 9731f7630..d78e38d84 100644 --- a/crates/matrix-sdk-ui/src/timeline/inner/mod.rs +++ b/crates/matrix-sdk-ui/src/timeline/inner/mod.rs @@ -1019,7 +1019,7 @@ impl TimelineInner { }; trace!("Updating in-reply-to details"); - let internal_id = item.internal_id; + let internal_id = item.internal_id.to_owned(); let mut item = item.clone(); item.set_content(TimelineItemContent::Message( message.with_in_reply_to(InReplyToDetails { diff --git a/crates/matrix-sdk-ui/src/timeline/inner/state.rs b/crates/matrix-sdk-ui/src/timeline/inner/state.rs index 1bfbeafb1..5618981a0 100644 --- a/crates/matrix-sdk-ui/src/timeline/inner/state.rs +++ b/crates/matrix-sdk-ui/src/timeline/inner/state.rs @@ -332,7 +332,7 @@ impl TimelineInnerState { } } - let item = TimelineItem::new(new_related, related.internal_id); + let item = TimelineItem::new(new_related, related.internal_id.to_owned()); self.items.set(idx, item); Ok(()) @@ -757,10 +757,10 @@ impl TimelineInnerMetadata { /// Returns the next internal id for a timeline item (and increment our /// internal counter). - pub fn next_internal_id(&mut self) -> u64 { + pub fn next_internal_id(&mut self) -> String { let val = self.next_internal_id; self.next_internal_id += 1; - val + format!("{val}") } /// Returns a new timeline item with a fresh internal id. diff --git a/crates/matrix-sdk-ui/src/timeline/item.rs b/crates/matrix-sdk-ui/src/timeline/item.rs index 71fdba9a7..ba85a99ef 100644 --- a/crates/matrix-sdk-ui/src/timeline/item.rs +++ b/crates/matrix-sdk-ui/src/timeline/item.rs @@ -32,17 +32,18 @@ pub enum TimelineItemKind { #[derive(Clone, Debug)] pub struct TimelineItem { pub(crate) kind: TimelineItemKind, - pub(crate) internal_id: u64, + pub(crate) internal_id: String, } impl TimelineItem { /// Create a new `TimelineItem` with the given kind and internal id. - pub(crate) fn new(kind: impl Into, internal_id: u64) -> Arc { + pub(crate) fn new(kind: impl Into, internal_id: String) -> Arc { Arc::new(TimelineItem { kind: kind.into(), internal_id }) } + /// Create a clone of the current `TimelineItem` with the given kind. pub(crate) fn with_kind(&self, kind: impl Into) -> Arc { - Arc::new(Self { kind: kind.into(), internal_id: self.internal_id }) + Arc::new(Self { kind: kind.into(), internal_id: self.internal_id.clone() }) } /// Get the [`TimelineItemKind`] of this item. @@ -70,14 +71,14 @@ impl TimelineItem { /// dividers, identity isn't easy to define though and you might /// see a new ID getting generated for a day divider that you /// perceive to be "the same" as a previous one. - pub fn unique_id(&self) -> u64 { - self.internal_id + pub fn unique_id(&self) -> &str { + &self.internal_id } pub(crate) fn read_marker() -> Arc { Arc::new(Self { kind: TimelineItemKind::Virtual(VirtualTimelineItem::ReadMarker), - internal_id: u64::MAX, + internal_id: "__read_marker".to_owned(), }) } diff --git a/crates/matrix-sdk-ui/src/timeline/read_receipts.rs b/crates/matrix-sdk-ui/src/timeline/read_receipts.rs index 9b26cbc27..f95013b05 100644 --- a/crates/matrix-sdk-ui/src/timeline/read_receipts.rs +++ b/crates/matrix-sdk-ui/src/timeline/read_receipts.rs @@ -286,7 +286,7 @@ impl ReadReceiptTimelineUpdate { return; }; - let event_item_id = event_item.internal_id; + let event_item_id = event_item.internal_id.to_owned(); let mut event_item = event_item.clone(); if let Some(remote_event_item) = event_item.as_remote_mut() { @@ -321,7 +321,7 @@ impl ReadReceiptTimelineUpdate { return; }; - let event_item_id = event_item.internal_id; + let event_item_id = event_item.internal_id.to_owned(); let mut event_item = event_item.clone(); if let Some(remote_event_item) = event_item.as_remote_mut() { @@ -468,7 +468,7 @@ impl TimelineInnerStateTransaction<'_> { return; }; - let prev_event_item_id = prev_event_item.internal_id; + let prev_event_item_id = prev_event_item.internal_id.to_owned(); let mut prev_event_item = prev_event_item.clone(); let Some(remote_prev_event_item) = prev_event_item.as_remote_mut() else { diff --git a/crates/matrix-sdk-ui/src/timeline/tests/basic.rs b/crates/matrix-sdk-ui/src/timeline/tests/basic.rs index 293b32144..9afeb3ef6 100644 --- a/crates/matrix-sdk-ui/src/timeline/tests/basic.rs +++ b/crates/matrix-sdk-ui/src/timeline/tests/basic.rs @@ -316,10 +316,10 @@ async fn test_dedup_initial() { assert_eq!(event3.as_event().unwrap().sender(), *CAROL); // Make sure we reused IDs when deduplicating events - assert_eq!(event1.unique_id(), 0); - assert_eq!(event2.unique_id(), 1); - assert_eq!(event3.unique_id(), 2); - assert_eq!(timeline_items[0].unique_id(), 3); + assert_eq!(event1.unique_id(), "0"); + assert_eq!(event2.unique_id(), "1"); + assert_eq!(event3.unique_id(), "2"); + assert_eq!(timeline_items[0].unique_id(), "3"); } #[async_test] diff --git a/crates/matrix-sdk-ui/src/timeline/tests/echo.rs b/crates/matrix-sdk-ui/src/timeline/tests/echo.rs index 6622b7c4f..b3f096c3d 100644 --- a/crates/matrix-sdk-ui/src/timeline/tests/echo.rs +++ b/crates/matrix-sdk-ui/src/timeline/tests/echo.rs @@ -46,7 +46,7 @@ async fn test_remote_echo_full_trip() { assert!(event_item.is_local_echo()); assert_matches!(event_item.send_state(), Some(EventSendState::NotSentYet)); assert!(!event_item.can_be_replied_to()); - item.unique_id() + item.unique_id().to_owned() }; { diff --git a/crates/matrix-sdk-ui/src/timeline/util.rs b/crates/matrix-sdk-ui/src/timeline/util.rs index 4776446f8..49da7cd22 100644 --- a/crates/matrix-sdk-ui/src/timeline/util.rs +++ b/crates/matrix-sdk-ui/src/timeline/util.rs @@ -25,14 +25,14 @@ use super::{event_item::EventTimelineItemKind, EventTimelineItem, TimelineItem}; pub(super) struct EventTimelineItemWithId<'a> { pub inner: &'a EventTimelineItem, /// Internal identifier generated by [`TimelineInnerMetadata`]. - pub internal_id: u64, + pub internal_id: &'a str, } impl<'a> EventTimelineItemWithId<'a> { pub fn with_inner_kind(&self, kind: impl Into) -> Arc { Arc::new(TimelineItem { kind: self.inner.with_kind(kind).into(), - internal_id: self.internal_id, + internal_id: self.internal_id.to_owned(), }) } } @@ -59,7 +59,7 @@ pub(super) fn rfind_event_item( .filter_map(|(idx, item)| { Some(( idx, - EventTimelineItemWithId { inner: item.as_event()?, internal_id: item.internal_id }, + EventTimelineItemWithId { inner: item.as_event()?, internal_id: &item.internal_id }, )) }) .rfind(|(_, it)| f(it.inner))