Skip to content

Commit c294a37

Browse files
committed
refactor(sdk): Use TimelineDetails for sender profile
1 parent ffa0190 commit c294a37

File tree

6 files changed

+58
-37
lines changed

6 files changed

+58
-37
lines changed

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,10 @@ mod uniffi_types {
9393
EmoteMessageContent, EncryptedMessage, EventSendState, EventTimelineItem, FileInfo,
9494
FileMessageContent, FormattedBody, ImageInfo, ImageMessageContent, InsertAtData,
9595
MembershipChange, Message, MessageFormat, MessageType, NoticeMessageContent,
96-
OtherState, Profile, Reaction, TextMessageContent, ThumbnailInfo, TimelineChange,
97-
TimelineDiff, TimelineItem, TimelineItemContent, TimelineItemContentKind, UpdateAtData,
98-
VideoInfo, VideoMessageContent, VirtualTimelineItem,
96+
OtherState, ProfileTimelineDetails, Reaction, TextMessageContent, ThumbnailInfo,
97+
TimelineChange, TimelineDiff, TimelineItem, TimelineItemContent,
98+
TimelineItemContentKind, UpdateAtData, VideoInfo, VideoMessageContent,
99+
VirtualTimelineItem,
99100
},
100101
};
101102
}

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

Lines changed: 21 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]
@@ -223,7 +224,7 @@ impl EventTimelineItem {
223224
self.0.sender().to_string()
224225
}
225226

226-
pub fn sender_profile(&self) -> Profile {
227+
pub fn sender_profile(&self) -> ProfileTimelineDetails {
227228
self.0.sender_profile().into()
228229
}
229230

@@ -279,19 +280,25 @@ impl EventTimelineItem {
279280
}
280281
}
281282

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

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ use super::{
4747
Sticker,
4848
},
4949
find_read_marker, rfind_event_by_id, rfind_event_item, EventTimelineItem, InReplyToDetails,
50-
Message, ReactionGroup, TimelineInnerMetadata, TimelineItem, TimelineItemContent,
51-
VirtualTimelineItem,
50+
Message, ReactionGroup, TimelineDetails, TimelineInnerMetadata, TimelineItem,
51+
TimelineItemContent, VirtualTimelineItem,
5252
};
5353
use crate::{events::SyncTimelineEventWithoutContent, room::timeline::MembershipChange};
5454

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

6969
pub(super) struct TimelineEventMetadata {
7070
pub(super) sender: OwnedUserId,
71-
pub(super) sender_profile: Profile,
71+
pub(super) sender_profile: Option<Profile>,
7272
pub(super) is_own_event: bool,
7373
pub(super) relations: BundledRelations,
7474
pub(super) encryption_info: Option<EncryptionInfo>,
@@ -526,7 +526,7 @@ impl<'a, 'i> TimelineEventHandler<'a, 'i> {
526526

527527
let NewEventTimelineItem { content } = item;
528528
let sender = self.meta.sender.to_owned();
529-
let sender_profile = self.meta.sender_profile.clone();
529+
let sender_profile = TimelineDetails::from_initial_value(self.meta.sender_profile.clone());
530530
let mut reactions = self.pending_reactions().unwrap_or_default();
531531

532532
let item = match &self.flow {

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

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ impl EventTimelineItem {
140140
}
141141

142142
/// Get the profile of the sender.
143-
pub fn sender_profile(&self) -> &Profile {
143+
pub fn sender_profile(&self) -> &TimelineDetails<Profile> {
144144
match self {
145145
Self::Local(local_event) => &local_event.sender_profile,
146146
Self::Remote(remote_event) => &remote_event.sender_profile,
@@ -238,7 +238,7 @@ pub struct LocalEventTimelineItem {
238238
/// The sender of the event.
239239
pub sender: OwnedUserId,
240240
/// The sender's profile of the event.
241-
pub sender_profile: Profile,
241+
pub sender_profile: TimelineDetails<Profile>,
242242
/// The timestamp of the event.
243243
pub timestamp: MilliSecondsSinceUnixEpoch,
244244
/// The content of the event.
@@ -275,7 +275,7 @@ pub struct RemoteEventTimelineItem {
275275
/// The sender of the event.
276276
pub sender: OwnedUserId,
277277
/// The sender's profile of the event.
278-
pub sender_profile: Profile,
278+
pub sender_profile: TimelineDetails<Profile>,
279279
/// The timestamp of the event.
280280
pub timestamp: MilliSecondsSinceUnixEpoch,
281281
/// The content of the event.
@@ -375,6 +375,15 @@ pub enum TimelineDetails<T> {
375375
Error(Arc<Error>),
376376
}
377377

378+
impl<T> TimelineDetails<T> {
379+
pub(crate) fn from_initial_value(value: Option<T>) -> Self {
380+
match value {
381+
Some(v) => Self::Ready(v),
382+
None => Self::Unavailable,
383+
}
384+
}
385+
}
386+
378387
/// The content of an [`EventTimelineItem`].
379388
#[derive(Clone, Debug)]
380389
pub enum TimelineItemContent {
@@ -518,7 +527,7 @@ impl InReplyToDetails {
518527
pub struct RepliedToEvent {
519528
pub(super) message: Message,
520529
pub(super) sender: OwnedUserId,
521-
pub(super) sender_profile: Profile,
530+
pub(super) sender_profile: TimelineDetails<Profile>,
522531
}
523532

524533
impl RepliedToEvent {
@@ -533,7 +542,7 @@ impl RepliedToEvent {
533542
}
534543

535544
/// Get the profile of the sender.
536-
pub fn sender_profile(&self) -> &Profile {
545+
pub fn sender_profile(&self) -> &TimelineDetails<Profile> {
537546
&self.sender_profile
538547
}
539548

@@ -558,7 +567,8 @@ impl RepliedToEvent {
558567
edited: event.relations().replace.is_some(),
559568
};
560569
let sender = event.sender().to_owned();
561-
let sender_profile = profile_provider.profile(&sender).await;
570+
let sender_profile =
571+
TimelineDetails::from_initial_value(profile_provider.profile(&sender).await);
562572

563573
Ok(Self { message, sender, sender_profile })
564574
}

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

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,7 @@ impl TimelineInner {
463463
#[async_trait]
464464
pub(super) trait ProfileProvider {
465465
fn own_user_id(&self) -> &UserId;
466-
async fn profile(&self, user_id: &UserId) -> Profile;
466+
async fn profile(&self, user_id: &UserId) -> Option<Profile>;
467467
}
468468

469469
#[async_trait]
@@ -472,19 +472,22 @@ impl ProfileProvider for room::Common {
472472
(**self).own_user_id()
473473
}
474474

475-
async fn profile(&self, user_id: &UserId) -> Profile {
475+
async fn profile(&self, user_id: &UserId) -> Option<Profile> {
476476
match self.get_member_no_sync(user_id).await {
477-
Ok(Some(member)) => Profile {
477+
Ok(Some(member)) => Some(Profile {
478478
display_name: member.display_name().map(ToOwned::to_owned),
479479
display_name_ambiguous: member.name_ambiguous(),
480480
avatar_url: member.avatar_url().map(ToOwned::to_owned),
481-
},
482-
Ok(None) => {
483-
Profile { display_name: None, display_name_ambiguous: false, avatar_url: None }
484-
}
481+
}),
482+
Ok(None) if self.are_members_synced() => Some(Profile {
483+
display_name: None,
484+
display_name_ambiguous: false,
485+
avatar_url: None,
486+
}),
487+
Ok(None) => None,
485488
Err(e) => {
486489
error!(%user_id, "Failed to getch room member information: {e}");
487-
Profile { display_name: None, display_name_ambiguous: false, avatar_url: None }
490+
None
488491
}
489492
}
490493
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -867,8 +867,8 @@ impl ProfileProvider for TestProfileProvider {
867867
&ALICE
868868
}
869869

870-
async fn profile(&self, _user_id: &UserId) -> Profile {
871-
Profile { display_name: None, display_name_ambiguous: false, avatar_url: None }
870+
async fn profile(&self, _user_id: &UserId) -> Option<Profile> {
871+
None
872872
}
873873
}
874874

0 commit comments

Comments
 (0)