Skip to content

Commit ed73d1b

Browse files
committed
refactor(sdk): Use TimelineDetails for sender profile
… as it's not available when members for the room aren't synced.
1 parent ed11269 commit ed73d1b

File tree

6 files changed

+42
-28
lines changed

6 files changed

+42
-28
lines changed

bindings/matrix-sdk-ffi/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,8 @@ mod uniffi_types {
9393
EmoteMessageContent, EncryptedMessage, EventTimelineItem, FileInfo, FileMessageContent,
9494
FormattedBody, ImageInfo, ImageMessageContent, InsertAtData,
9595
LocalEventTimelineItemSendState, MembershipChange, Message, MessageFormat, MessageType,
96-
NoticeMessageContent, OtherState, Profile, Reaction, TextMessageContent, ThumbnailInfo,
97-
TimelineChange, TimelineDiff, TimelineItem, TimelineItemContent,
96+
NoticeMessageContent, OtherState, ProfileTimelineDetails, Reaction, TextMessageContent,
97+
ThumbnailInfo, TimelineChange, TimelineDiff, TimelineItem, TimelineItemContent,
9898
TimelineItemContentKind, UpdateAtData, VideoInfo, VideoMessageContent,
9999
VirtualTimelineItem,
100100
},

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

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use std::sync::Arc;
22

33
use extension_trait::extension_trait;
44
use futures_signals::signal_vec::VecDiff;
5+
use matrix_sdk::room::timeline::{Profile, TimelineDetails};
56
pub use matrix_sdk::ruma::events::room::{message::RoomMessageEventContent, MediaSource};
67

78
#[uniffi::export]
@@ -225,7 +226,7 @@ impl EventTimelineItem {
225226
self.0.sender().to_string()
226227
}
227228

228-
pub fn sender_profile(&self) -> Profile {
229+
pub fn sender_profile(&self) -> ProfileTimelineDetails {
229230
self.0.sender_profile().into()
230231
}
231232

@@ -281,19 +282,23 @@ impl EventTimelineItem {
281282
}
282283
}
283284

284-
#[derive(uniffi::Record)]
285-
pub struct Profile {
286-
display_name: Option<String>,
287-
display_name_ambiguous: bool,
288-
avatar_url: Option<String>,
289-
}
290-
291-
impl From<&matrix_sdk::room::timeline::Profile> for Profile {
292-
fn from(p: &matrix_sdk::room::timeline::Profile) -> Self {
293-
Self {
294-
display_name: p.display_name.clone(),
295-
display_name_ambiguous: p.display_name_ambiguous,
296-
avatar_url: p.avatar_url.as_ref().map(ToString::to_string),
285+
#[derive(uniffi::Enum)]
286+
pub enum ProfileTimelineDetails {
287+
Unavailable,
288+
Pending,
289+
Ready { display_name: Option<String>, display_name_ambiguous: bool, avatar_url: Option<String> },
290+
}
291+
292+
impl From<&TimelineDetails<Profile>> for ProfileTimelineDetails {
293+
fn from(details: &TimelineDetails<Profile>) -> Self {
294+
match details {
295+
TimelineDetails::Unavailable => Self::Unavailable,
296+
TimelineDetails::Pending => Self::Pending,
297+
TimelineDetails::Ready(profile) => Self::Ready {
298+
display_name: profile.display_name.clone(),
299+
display_name_ambiguous: profile.display_name_ambiguous,
300+
avatar_url: profile.avatar_url.as_ref().map(ToString::to_string),
301+
},
297302
}
298303
}
299304
}

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ use super::{
4747
RemoteEventTimelineItem, RoomMembershipChange, Sticker,
4848
},
4949
find_read_marker, rfind_event_by_id, rfind_event_item, EventTimelineItem, Message,
50-
ReactionGroup, TimelineInnerMetadata, TimelineItem, TimelineItemContent, VirtualTimelineItem,
50+
ReactionGroup, TimelineDetails, TimelineInnerMetadata, TimelineItem, TimelineItemContent,
51+
VirtualTimelineItem,
5152
};
5253
use crate::{events::SyncTimelineEventWithoutContent, room::timeline::MembershipChange};
5354

@@ -67,7 +68,7 @@ pub(super) enum Flow {
6768

6869
pub(super) struct TimelineEventMetadata {
6970
pub(super) sender: OwnedUserId,
70-
pub(super) sender_profile: Profile,
71+
pub(super) sender_profile: Option<Profile>,
7172
pub(super) is_own_event: bool,
7273
pub(super) relations: BundledRelations,
7374
pub(super) encryption_info: Option<EncryptionInfo>,
@@ -525,7 +526,10 @@ impl<'a, 'i> TimelineEventHandler<'a, 'i> {
525526

526527
let NewEventTimelineItem { content } = item;
527528
let sender = self.meta.sender.to_owned();
528-
let sender_profile = self.meta.sender_profile.clone();
529+
let sender_profile = match &self.meta.sender_profile {
530+
Some(profile) => TimelineDetails::Ready(profile.clone()),
531+
None => TimelineDetails::Unavailable,
532+
};
529533
let mut reactions = self.pending_reactions().unwrap_or_default();
530534

531535
let item = match &self.flow {

crates/matrix-sdk/src/room/timeline/event_item.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ impl EventTimelineItem {
137137
}
138138

139139
/// Get the profile of the sender.
140-
pub fn sender_profile(&self) -> &Profile {
140+
pub fn sender_profile(&self) -> &TimelineDetails<Profile> {
141141
match self {
142142
Self::Local(local_event) => &local_event.sender_profile,
143143
Self::Remote(remote_event) => &remote_event.sender_profile,
@@ -231,7 +231,7 @@ pub struct LocalEventTimelineItem {
231231
/// The sender of the event.
232232
pub sender: OwnedUserId,
233233
/// The sender's profile of the event.
234-
pub sender_profile: Profile,
234+
pub sender_profile: TimelineDetails<Profile>,
235235
/// The timestamp of the event.
236236
pub timestamp: MilliSecondsSinceUnixEpoch,
237237
/// The content of the event.
@@ -273,7 +273,7 @@ pub struct RemoteEventTimelineItem {
273273
/// The sender of the event.
274274
pub sender: OwnedUserId,
275275
/// The sender's profile of the event.
276-
pub sender_profile: Profile,
276+
pub sender_profile: TimelineDetails<Profile>,
277277
/// The timestamp of the event.
278278
pub timestamp: MilliSecondsSinceUnixEpoch,
279279
/// The content of the event.

crates/matrix-sdk/src/room/timeline/inner.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,7 @@ impl TimelineInner {
402402
#[async_trait]
403403
pub(super) trait ProfileProvider {
404404
fn own_user_id(&self) -> &UserId;
405-
async fn profile(&self, user_id: &UserId) -> Profile;
405+
async fn profile(&self, user_id: &UserId) -> Option<Profile>;
406406
}
407407

408408
#[async_trait]
@@ -411,8 +411,12 @@ impl ProfileProvider for room::Common {
411411
(**self).own_user_id()
412412
}
413413

414-
async fn profile(&self, user_id: &UserId) -> Profile {
415-
match self.get_member_no_sync(user_id).await {
414+
async fn profile(&self, user_id: &UserId) -> Option<Profile> {
415+
if !self.are_members_synced() {
416+
return None;
417+
}
418+
419+
let profile = match self.get_member_no_sync(user_id).await {
416420
Ok(Some(member)) => Profile {
417421
display_name: member.display_name().map(ToOwned::to_owned),
418422
display_name_ambiguous: member.name_ambiguous(),
@@ -425,7 +429,8 @@ impl ProfileProvider for room::Common {
425429
error!(%user_id, "Failed to getch room member information: {e}");
426430
Profile { display_name: None, display_name_ambiguous: false, avatar_url: None }
427431
}
428-
}
432+
};
433+
Some(profile)
429434
}
430435
}
431436

crates/matrix-sdk/src/room/timeline/tests.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -853,8 +853,8 @@ impl ProfileProvider for TestProfileProvider {
853853
&ALICE
854854
}
855855

856-
async fn profile(&self, _user_id: &UserId) -> Profile {
857-
Profile { display_name: None, display_name_ambiguous: false, avatar_url: None }
856+
async fn profile(&self, _user_id: &UserId) -> Option<Profile> {
857+
None
858858
}
859859
}
860860

0 commit comments

Comments
 (0)