mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-10-31 16:24:11 +00:00
Rename properties and sort members in advance.
This commit is contained in:
@@ -34,7 +34,7 @@ nonisolated struct RoomMemberListScreenEntry: Equatable {
|
||||
let member: RoomMemberDetails
|
||||
let verificationState: UserIdentityVerificationState
|
||||
/// Whether the member is currently joined to the room's active MatrixRTC call (e.g. Element Call).
|
||||
var isInCall = false
|
||||
var isActiveRoomCallParticipant = false
|
||||
}
|
||||
|
||||
struct RoomMembersListScreenViewState: BindableState {
|
||||
|
||||
@@ -99,7 +99,7 @@ class RoomMembersListScreenViewModel: RoomMembersListScreenViewModelType, RoomMe
|
||||
hideLoadingIndicator(Self.updateStateLoadingIndicatorIdentifier)
|
||||
}
|
||||
|
||||
let members = members.sorted()
|
||||
let members = members.sorted(prioritisingRoomCallParticipants: roomProxy.infoPublisher.value.activeRoomCallParticipants)
|
||||
let roomMembersDetails = await buildMembersDetails(members: members)
|
||||
self.members = members
|
||||
self.currentUserProxy = members.first { $0.userID == roomProxy.ownUserID }
|
||||
@@ -127,7 +127,7 @@ class RoomMembersListScreenViewModel: RoomMembersListScreenViewModelType, RoomMe
|
||||
let isEncrypted = roomProxy.infoPublisher.value.isEncrypted
|
||||
let activeRoomCallParticipants = Set(roomProxy.infoPublisher.value.activeRoomCallParticipants)
|
||||
|
||||
let membersDetails: RoomMembersDetails = await Task.detached { [weak self] in
|
||||
return await Task.detached { [weak self] in
|
||||
// accessing RoomMember's properties is very slow. We need to do it in a background thread.
|
||||
var invitedMembers: [RoomMemberListScreenEntry] = .init()
|
||||
var joinedMembers: [RoomMemberListScreenEntry] = .init()
|
||||
@@ -138,15 +138,15 @@ class RoomMembersListScreenViewModel: RoomMembersListScreenViewModelType, RoomMe
|
||||
if isEncrypted, let fetchedState = await self?.userIdentityVerificationState(for: member.userID) {
|
||||
verificationState = fetchedState
|
||||
}
|
||||
let isInCall = activeRoomCallParticipants.contains(member.userID)
|
||||
let isActiveRoomCallParticipant = activeRoomCallParticipants.contains(member.userID)
|
||||
|
||||
switch member.membership {
|
||||
case .invite:
|
||||
invitedMembers.append(.init(member: .init(withProxy: member), verificationState: verificationState, isInCall: isInCall))
|
||||
invitedMembers.append(.init(member: .init(withProxy: member), verificationState: verificationState, isActiveRoomCallParticipant: isActiveRoomCallParticipant))
|
||||
case .join:
|
||||
joinedMembers.append(.init(member: .init(withProxy: member), verificationState: verificationState, isInCall: isInCall))
|
||||
joinedMembers.append(.init(member: .init(withProxy: member), verificationState: verificationState, isActiveRoomCallParticipant: isActiveRoomCallParticipant))
|
||||
case .ban:
|
||||
bannedMembers.append(.init(member: .init(withProxy: member), verificationState: verificationState, isInCall: isInCall))
|
||||
bannedMembers.append(.init(member: .init(withProxy: member), verificationState: verificationState, isActiveRoomCallParticipant: isActiveRoomCallParticipant))
|
||||
default:
|
||||
continue
|
||||
}
|
||||
@@ -157,10 +157,6 @@ class RoomMembersListScreenViewModel: RoomMembersListScreenViewModelType, RoomMe
|
||||
bannedMembers: bannedMembers.sorted { $0.member.id.localizedStandardCompare($1.member.id) == .orderedAscending }) // Re-sort ignoring display name.
|
||||
}
|
||||
.value
|
||||
|
||||
return .init(invitedMembers: membersDetails.invitedMembers,
|
||||
joinedMembers: membersDetails.joinedMembers.filter(\.isInCall) + membersDetails.joinedMembers.filter { !$0.isInCall },
|
||||
bannedMembers: membersDetails.bannedMembers)
|
||||
}
|
||||
|
||||
/// The client proxy isn't Sendable, fetch identities through this helper so
|
||||
|
||||
@@ -171,7 +171,7 @@ struct RoomMembersListScreen_Previews: PreviewProvider, TestablePreview {
|
||||
static let adminViewModel = makeViewModel(isAdmin: true, initialMode: .members)
|
||||
static let bannedViewModel = makeViewModel(isAdmin: true, initialMode: .banned)
|
||||
static let emptyBannedViewModel = makeViewModel(withBanned: false, isAdmin: false, initialMode: .members)
|
||||
static let adminInCallViewModel = makeViewModel(withInCall: true, isAdmin: true)
|
||||
static let activeRoomCallViewModel = makeViewModel(hasActiveRoomCall: true, isAdmin: true)
|
||||
|
||||
static var previews: some View {
|
||||
ElementNavigationStack {
|
||||
@@ -207,12 +207,12 @@ struct RoomMembersListScreen_Previews: PreviewProvider, TestablePreview {
|
||||
.previewDisplayName("Admin: Banned")
|
||||
|
||||
ElementNavigationStack {
|
||||
RoomMembersListScreen(context: adminInCallViewModel.context)
|
||||
RoomMembersListScreen(context: activeRoomCallViewModel.context)
|
||||
}
|
||||
.snapshotPreferences(expect: adminInCallViewModel.context.$viewState.map { state in
|
||||
.snapshotPreferences(expect: activeRoomCallViewModel.context.$viewState.map { state in
|
||||
state.canBanUsers == true
|
||||
})
|
||||
.previewDisplayName("Admin: In-Call")
|
||||
.previewDisplayName("Active Room Call")
|
||||
|
||||
ElementNavigationStack {
|
||||
RoomMembersListScreen(context: emptyBannedViewModel.context)
|
||||
@@ -224,7 +224,7 @@ struct RoomMembersListScreen_Previews: PreviewProvider, TestablePreview {
|
||||
|
||||
static func makeViewModel(withInvites: Bool = false,
|
||||
withBanned: Bool = true,
|
||||
withInCall: Bool = false,
|
||||
hasActiveRoomCall: Bool = false,
|
||||
isAdmin: Bool = false,
|
||||
initialMode: RoomMembersListScreenMode = .members) -> RoomMembersListScreenViewModel {
|
||||
let mockAdmin = RoomMemberProxyMock.mockAdmin
|
||||
@@ -238,8 +238,7 @@ struct RoomMembersListScreen_Previews: PreviewProvider, TestablePreview {
|
||||
mockAdmin,
|
||||
.mockCreator,
|
||||
.mockOwner,
|
||||
.mockModerator,
|
||||
.mockFrank
|
||||
.mockModerator
|
||||
]
|
||||
|
||||
if withBanned {
|
||||
@@ -250,9 +249,11 @@ struct RoomMembersListScreen_Previews: PreviewProvider, TestablePreview {
|
||||
members.append(.mockInvited)
|
||||
}
|
||||
|
||||
let activeRoomCallParticipants = withInCall ? [RoomMemberProxyMock.mockAlice.userID,
|
||||
RoomMemberProxyMock.mockOwner.userID,
|
||||
mockAdmin.userID] : []
|
||||
let activeRoomCallParticipants: [String] = if hasActiveRoomCall {
|
||||
[RoomMemberProxyMock.mockAlice.userID, RoomMemberProxyMock.mockOwner.userID, mockAdmin.userID]
|
||||
} else {
|
||||
[]
|
||||
}
|
||||
|
||||
let clientProxyMock = ClientProxyMock(.init())
|
||||
clientProxyMock.userIdentityForFallBackToServerClosure = { userID, _ in
|
||||
|
||||
+2
-2
@@ -56,7 +56,7 @@ struct RoomMembersListScreenMemberCell: View {
|
||||
.foregroundStyle(.compound.textSecondary)
|
||||
}
|
||||
|
||||
if listEntry.isInCall {
|
||||
if listEntry.isActiveRoomCallParticipant {
|
||||
CompoundIcon(\.videoCallSolid, size: .small, relativeTo: .compound.bodyLG)
|
||||
.foregroundStyle(.compound.iconAccentPrimary)
|
||||
.accessibilityLabel(L10n.commonOnACall)
|
||||
@@ -125,7 +125,7 @@ struct RoomMembersListMemberCell_Previews: PreviewProvider, TestablePreview {
|
||||
verificationState: .verificationViolation),
|
||||
.init(member: .init(withProxy: RoomMemberProxyMock.mockFrank),
|
||||
verificationState: .notVerified,
|
||||
isInCall: true),
|
||||
isActiveRoomCallParticipant: true),
|
||||
.init(member: .init(withProxy: RoomMemberProxyMock(with: .init(userID: "@nodisplayname:matrix.org",
|
||||
membership: .join))),
|
||||
verificationState: .notVerified),
|
||||
|
||||
Reference in New Issue
Block a user