Skip to content

Commit e568da0

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 14837ad commit e568da0

File tree

6 files changed

+38
-27
lines changed

6 files changed

+38
-27
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: 3 additions & 2 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>,

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
@@ -401,7 +401,7 @@ impl TimelineInner {
401401
#[async_trait]
402402
pub(super) trait ProfileProvider {
403403
fn own_user_id(&self) -> &UserId;
404-
async fn profile(&self, user_id: &UserId) -> Profile;
404+
async fn profile(&self, user_id: &UserId) -> Option<Profile>;
405405
}
406406

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

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

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)