Skip to content

Commit

Permalink
Display 'External' badge on RoomDetailScreen if necessary
Browse files Browse the repository at this point in the history
  • Loading branch information
NicolasBuquet committed Jan 27, 2025
1 parent b27525b commit aeea217
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 10 deletions.
22 changes: 20 additions & 2 deletions ElementX/Sources/Other/SwiftUI/Views/AvatarHeaderView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,11 @@ struct AvatarHeaderView<Footer: View>: View {
private var onAvatarTap: ((URL) -> Void)?
@ViewBuilder private var footer: () -> Footer

// Tchap: add `externalCount` property
var externalCount: Binding<Int>

init(room: RoomDetails,
externalCount: Binding<Int>, // Tchap: add `externalCount` parameter
avatarSize: Avatars.Size,
mediaProvider: MediaProviderProtocol? = nil,
onAvatarTap: ((URL) -> Void)? = nil,
Expand All @@ -43,18 +47,20 @@ struct AvatarHeaderView<Footer: View>: View {
self.mediaProvider = mediaProvider
self.onAvatarTap = onAvatarTap
self.footer = footer
// Tchap: store `externalCount` parameter
self.externalCount = externalCount

var badges = [Badge]()
badges.append(.encrypted(room.isEncrypted))
if room.isPublic {
badges.append(.public)
}
// Tchap: TOTO add 'room accessible to user' configuration badge
self.badges = badges
}

init(accountOwner: RoomMemberDetails,
dmRecipient: RoomMemberDetails,
externalCount: Binding<Int>, // Tchap: add `externalCount` parameter
mediaProvider: MediaProviderProtocol? = nil,
onAvatarTap: ((URL) -> Void)? = nil,
@ViewBuilder footer: @escaping () -> Footer) {
Expand All @@ -67,6 +73,9 @@ struct AvatarHeaderView<Footer: View>: View {
self.mediaProvider = mediaProvider
self.onAvatarTap = onAvatarTap
self.footer = footer
// Tchap: store `externalCount` parameter
self.externalCount = externalCount

// In EL-X a DM is by definition always encrypted
badges = [.encrypted(true)]
}
Expand Down Expand Up @@ -101,6 +110,9 @@ struct AvatarHeaderView<Footer: View>: View {
self.mediaProvider = mediaProvider
self.onAvatarTap = onAvatarTap
self.footer = footer
// Tchap: evaluate externalCount to 1 if displayed user is external.
externalCount = .constant(MatrixIdFromString(user.userID).isExternalTchapUser ? 1 : 0)

badges = isVerified ? [.verified] : []
}

Expand Down Expand Up @@ -132,6 +144,11 @@ struct AvatarHeaderView<Footer: View>: View {
isHighlighted: true)
}
}

// Tchap: add `External` badge if necessary.
if externalCount.wrappedValue > 0 {
BadgeLabel(title: TchapL10n.roomHeaderBadgeAuthorizedToExternal, icon: \.public, isHighlighted: false, tchapUsage: .userIsExternal)
}
}
}

Expand Down Expand Up @@ -204,6 +221,7 @@ struct AvatarHeaderView_Previews: PreviewProvider, TestablePreview {
canonicalAlias: "#test:matrix.org",
isEncrypted: true,
isPublic: true),
externalCount: .constant(1),
avatarSize: .room(on: .details),
mediaProvider: MediaProviderMock(configuration: .init())) {
HStack(spacing: 32) {
Expand All @@ -218,7 +236,7 @@ struct AvatarHeaderView_Previews: PreviewProvider, TestablePreview {
.previewDisplayName("Room")

Form {
AvatarHeaderView(accountOwner: RoomMemberDetails(withProxy: RoomMemberProxyMock.mockMe), dmRecipient: RoomMemberDetails(withProxy: RoomMemberProxyMock.mockAlice),
AvatarHeaderView(accountOwner: RoomMemberDetails(withProxy: RoomMemberProxyMock.mockMe), dmRecipient: RoomMemberDetails(withProxy: RoomMemberProxyMock.mockAlice), externalCount: .constant(1),
mediaProvider: MediaProviderMock(configuration: .init())) {
HStack(spacing: 32) {
ShareLink(item: "test") {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,9 @@ struct RoomDetailsScreenViewStateBindings {

/// A media item that will be previewed with QuickLook.
var mediaPreviewItem: MediaPreviewItem?

// Tchap: get number of external users to display or hide `External` badge.
var externalCount = 0
}

struct LeaveRoomAlertItem: AlertProtocol {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -215,19 +215,28 @@ class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScr

private func fetchMembersIfNeeded() async {
// We need to fetch members just in 1-to-1 chat to get the member object for the other person
guard roomProxy.isDirectOneToOneRoom else {
return
}
// Tchap: always fetch members because we need it to display `external` badge on RoomDetailScreen.
// guard roomProxy.isDirectOneToOneRoom else {
// return
// }

roomProxy.membersPublisher
.receive(on: DispatchQueue.main)
.sink { [weak self, ownUserID = roomProxy.ownUserID] members in
guard let self else { return }
let accountOwner = members.first { $0.userID == ownUserID }
let dmRecipient = members.first { $0.userID != ownUserID }
self.dmRecipient = dmRecipient
self.state.dmRecipient = dmRecipient.map(RoomMemberDetails.init(withProxy:))
self.state.accountOwner = accountOwner.map(RoomMemberDetails.init(withProxy:))

// Tchap: add this condition since we don't bypass anymore the members fetching
// and the following properties must not be filled if we are not in a Direct 1-to-1 Room.
if roomProxy.isDirectOneToOneRoom {
let accountOwner = members.first { $0.userID == ownUserID }
let dmRecipient = members.first { $0.userID != ownUserID }
self.dmRecipient = dmRecipient
self.state.dmRecipient = dmRecipient.map(RoomMemberDetails.init(withProxy:))
self.state.accountOwner = accountOwner.map(RoomMemberDetails.init(withProxy:))
}

// Tchap: update `externalCount` to display `external` badge on RoomDetailsScreen if necessary.
self.state.bindings.externalCount = members.filter { MatrixIdFromString($0.userID).isExternalTchapUser }.count
}
.store(in: &cancellables)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ struct RoomDetailsScreen: View {

private var normalRoomHeaderSection: some View {
AvatarHeaderView(room: context.viewState.details,
externalCount: $context.externalCount, // Tchap: pass `externalCount` binding parameter
avatarSize: .room(on: .details),
mediaProvider: context.mediaProvider) { url in
context.send(viewAction: .displayAvatar(url))
Expand All @@ -82,6 +83,7 @@ struct RoomDetailsScreen: View {
private func dmHeaderSection(accountOwner: RoomMemberDetails, recipient: RoomMemberDetails) -> some View {
AvatarHeaderView(accountOwner: accountOwner,
dmRecipient: recipient,
externalCount: $context.externalCount, // Tchap: pass `externalCount` binding parameter
mediaProvider: context.mediaProvider) { url in
context.send(viewAction: .displayAvatar(url))
} footer: {
Expand Down

0 comments on commit aeea217

Please sign in to comment.