Room details: improve members count UX (#1050)

* Inject user id into room’s details

* Refactor member fetch logic in RoomDetailsScreenViewModel

* Refactor DI

* Fetch members in RoomMembersListScreenViewModel

* Fetch members in InviteUsersScreen

* Use joinedMembersCount in room members list

* Cleanup

* Limit members refresh

* Cleanup binding

* Fix UT build errors

* Fix RoomDetailsScreenViewModelTests

* Fix RoomMembersListScreenViewModelTests

* Fix UTs

* Fix RoomDetailsScreenUITests

* Refine RoomDetailsScreenViewModelTests

* Add roomProxy extension

* PR comments

* Refactor room’s counter to Int

* Improve updateMembers() performances

* Fix memory leaks
This commit is contained in:
Alfonso Grillo
2023-06-09 16:21:01 +02:00
committed by GitHub
parent 42e083dcaf
commit 63df68fd29
27 changed files with 368 additions and 292 deletions
+11 -14
View File
@@ -120,16 +120,16 @@ class RoomProxy: RoomProxyProtocol {
return Asset.Images.encryptionTrusted.image
}
var invitedMembersCount: UInt {
UInt(room.invitedMembersCount())
var invitedMembersCount: Int {
Int(room.invitedMembersCount())
}
var joinedMembersCount: UInt {
UInt(room.joinedMembersCount())
var joinedMembersCount: Int {
Int(room.joinedMembersCount())
}
var activeMembersCount: UInt {
UInt(room.activeMembersCount())
var activeMembersCount: Int {
Int(room.activeMembersCount())
}
func loadAvatarURLForUserId(_ userId: String) async -> Result<URL?, RoomProxyError> {
@@ -380,11 +380,13 @@ class RoomProxy: RoomProxyProtocol {
func updateMembers() async {
do {
let roomMembers = try await Task.dispatch(on: .global()) {
try self.room.members()
let roomMembersProxies = try await Task.dispatch(on: .global()) {
try self.room.members().map {
RoomMemberProxy(member: $0, backgroundTaskService: self.backgroundTaskService)
}
}
membersSubject.value = buildRoomMemberProxies(members: roomMembers)
membersSubject.value = roomMembersProxies
} catch {
return
}
@@ -422,11 +424,6 @@ class RoomProxy: RoomProxyProtocol {
}
}
@MainActor
private func buildRoomMemberProxies(members: [RoomMember]) -> [RoomMemberProxy] {
members.map { RoomMemberProxy(member: $0, backgroundTaskService: backgroundTaskService) }
}
func retryDecryption(for sessionID: String) async {
await Task.dispatch(on: .global()) { [weak self] in
self?.room.retryDecryption(sessionIds: [sessionID])
@@ -66,11 +66,11 @@ protocol RoomProxyProtocol {
var membersPublisher: AnyPublisher<[RoomMemberProxyProtocol], Never> { get }
var invitedMembersCount: UInt { get }
var invitedMembersCount: Int { get }
var joinedMembersCount: UInt { get }
var joinedMembersCount: Int { get }
var activeMembersCount: UInt { get }
var activeMembersCount: Int { get }
/// Publishes the room's updates.
/// The publisher starts publishing after the first call to `registerTimelineListenerIfNeeded()`
@@ -157,4 +157,8 @@ extension RoomProxyProtocol {
var roomTitle: String {
displayName ?? name ?? "Unknown room 💥"
}
var isEncryptedOneToOneRoom: Bool {
isDirect && isEncrypted && joinedMembersCount == 2
}
}