diff --git a/Cargo.lock b/Cargo.lock index d49291946..a887c457e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1495,9 +1495,9 @@ dependencies = [ [[package]] name = "eyeball-im" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7b7f93b1590ac27ac76fd8a142ae19221ea9fd7ce35769a9aaea2e4f3c07250" +checksum = "c21fb87d8fd4bdb2e140007b79d350ad93c574989abd2be322a0534054e68a67" dependencies = [ "futures-core", "imbl", diff --git a/Cargo.toml b/Cargo.toml index 26baac853..c4e589133 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,7 +28,7 @@ byteorder = "1.4.3" ctor = "0.2.0" dashmap = "5.2.0" eyeball = "0.8.3" -eyeball-im = "0.2.0" +eyeball-im = "0.2.4" eyeball-im-util = "0.2.1" futures-core = "0.3.28" futures-executor = "0.3.21" diff --git a/crates/matrix-sdk-ui/src/timeline/inner.rs b/crates/matrix-sdk-ui/src/timeline/inner.rs index 508610c15..321304d3d 100644 --- a/crates/matrix-sdk-ui/src/timeline/inner.rs +++ b/crates/matrix-sdk-ui/src/timeline/inner.rs @@ -16,7 +16,7 @@ use std::collections::BTreeSet; use std::{collections::HashMap, fmt, sync::Arc}; -use eyeball_im::{ObservableVector, VectorSubscriber}; +use eyeball_im::{ObservableVector, ObservableVectorEntry, VectorSubscriber}; #[cfg(any(test, feature = "testing"))] use eyeball_im_util::{FilterMapVectorSubscriber, VectorExt}; use imbl::Vector; @@ -893,49 +893,45 @@ impl TimelineInner

{ } async fn set_non_ready_sender_profiles(&self, profile_state: TimelineDetails) { - let mut state = self.state.lock().await; - for idx in 0..state.items.len() { - let item = state.items[idx].clone(); - let Some(event_item) = item.as_event() else { continue }; + self.state.lock().await.items.for_each(|mut entry| { + let Some(event_item) = entry.as_event() else { return }; if !matches!(event_item.sender_profile(), TimelineDetails::Ready(_)) { - let item = item.with_kind(TimelineItemKind::Event( + let new_item = entry.with_kind(TimelineItemKind::Event( event_item.with_sender_profile(profile_state.clone()), )); - state.items.set(idx, item); + ObservableVectorEntry::set(&mut entry, new_item); } - } + }); } pub(super) async fn update_sender_profiles(&self) { trace!("Updating sender profiles"); let mut state = self.state.lock().await; - let num_items = state.items.len(); - - for idx in 0..num_items { - let sender = match state.items[idx].as_event() { + let mut entries = state.items.entries(); + while let Some(mut entry) = entries.next() { + let sender = match entry.as_event() { Some(event_item) => event_item.sender().to_owned(), None => continue, }; let maybe_profile = self.room_data_provider.profile(&sender).await; - assert_eq!(state.items.len(), num_items); - - let item = state.items[idx].clone(); - let event_item = item.as_event().unwrap(); + let event_item = entry.as_event().unwrap(); match maybe_profile { Some(profile) => { if !event_item.sender_profile().contains(&profile) { let updated_item = event_item.with_sender_profile(TimelineDetails::Ready(profile)); - state.items.set(idx, item.with_kind(updated_item)); + let new_item = entry.with_kind(updated_item); + ObservableVectorEntry::set(&mut entry, new_item); } } None => { if !event_item.sender_profile().is_unavailable() { let updated_item = event_item.with_sender_profile(TimelineDetails::Unavailable); - state.items.set(idx, item.with_kind(updated_item)); + let new_item = entry.with_kind(updated_item); + ObservableVectorEntry::set(&mut entry, new_item); } } }