diff --git a/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift b/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift index 7158bcbfb..a28e259f4 100644 --- a/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift +++ b/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift @@ -793,11 +793,11 @@ class RoomProxyMock: RoomProxyProtocol { var displayName: String? var topic: String? var avatarURL: URL? - var membersPublisher: AnyPublisher<[RoomMemberProxyProtocol], Never> { - get { return underlyingMembersPublisher } - set(value) { underlyingMembersPublisher = value } + var members: CurrentValuePublisher<[RoomMemberProxyProtocol], Never> { + get { return underlyingMembers } + set(value) { underlyingMembers = value } } - var underlyingMembersPublisher: AnyPublisher<[RoomMemberProxyProtocol], Never>! + var underlyingMembers: CurrentValuePublisher<[RoomMemberProxyProtocol], Never>! var invitedMembersCount: Int { get { return underlyingInvitedMembersCount } set(value) { underlyingInvitedMembersCount = value } diff --git a/ElementX/Sources/Mocks/RoomProxyMock.swift b/ElementX/Sources/Mocks/RoomProxyMock.swift index f7f5ba8bf..27c60cb3f 100644 --- a/ElementX/Sources/Mocks/RoomProxyMock.swift +++ b/ElementX/Sources/Mocks/RoomProxyMock.swift @@ -64,10 +64,10 @@ extension RoomProxyMock { activeMembersCount = configuration.activeMembersCount ownUserID = configuration.ownUserID - if let members = configuration.members { - membersPublisher = Just(members).eraseToAnyPublisher() + if let configuredMembers = configuration.members { + members = CurrentValueSubject(configuredMembers).asCurrentValuePublisher() } else { - membersPublisher = Just([]).eraseToAnyPublisher() + members = CurrentValueSubject([]).asCurrentValuePublisher() } if let inviter = configuration.inviter { diff --git a/ElementX/Sources/Screens/InviteUsersScreen/InviteUsersScreenViewModel.swift b/ElementX/Sources/Screens/InviteUsersScreen/InviteUsersScreenViewModel.swift index e30bba27c..97cdbc3a9 100644 --- a/ElementX/Sources/Screens/InviteUsersScreen/InviteUsersScreenViewModel.swift +++ b/ElementX/Sources/Screens/InviteUsersScreen/InviteUsersScreenViewModel.swift @@ -119,9 +119,10 @@ class InviteUsersScreenViewModel: InviteUsersScreenViewModelType, InviteUsersScr hideLoader() } - roomProxy.membersPublisher + roomProxy.members .filter { !$0.isEmpty } .first() + .receive(on: DispatchQueue.main) .sink { [weak self] members in self?.buildMembershipStateIfNeeded(members: members) } diff --git a/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenViewModel.swift b/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenViewModel.swift index 9f0d123d1..fe8d27be4 100644 --- a/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenViewModel.swift @@ -145,7 +145,8 @@ class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScr return } - roomProxy.membersPublisher + roomProxy.members + .receive(on: DispatchQueue.main) .sink { [weak self] members in guard let self else { return } let dmRecipient = members.first(where: { !$0.isAccountOwner }) diff --git a/ElementX/Sources/Screens/RoomMemberListScreen/RoomMembersListScreenViewModel.swift b/ElementX/Sources/Screens/RoomMemberListScreen/RoomMembersListScreenViewModel.swift index cf71a150d..c04b70875 100644 --- a/ElementX/Sources/Screens/RoomMemberListScreen/RoomMembersListScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomMemberListScreen/RoomMembersListScreenViewModel.swift @@ -67,8 +67,9 @@ class RoomMembersListScreenViewModel: RoomMembersListScreenViewModelType, RoomMe hideLoader() } - roomProxy.membersPublisher + roomProxy.members .filter { !$0.isEmpty } + .receive(on: DispatchQueue.main) .sink { [weak self] members in self?.updateState(members: members) } diff --git a/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift b/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift index b831fa845..39616b262 100644 --- a/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift @@ -210,12 +210,13 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol .weakAssign(to: \.state.readReceiptsEnabled, on: self) .store(in: &cancellables) - roomProxy.membersPublisher + roomProxy.members .map { members in members.reduce(into: [String: RoomMemberState]()) { dictionary, member in dictionary[member.userID] = RoomMemberState(displayName: member.displayName, avatarURL: member.avatarURL) } } + .receive(on: DispatchQueue.main) .weakAssign(to: \.state.members, on: self) .store(in: &cancellables) } diff --git a/ElementX/Sources/Services/Room/RoomProxy.swift b/ElementX/Sources/Services/Room/RoomProxy.swift index 27d8626ed..0ae5e9946 100644 --- a/ElementX/Sources/Services/Room/RoomProxy.swift +++ b/ElementX/Sources/Services/Room/RoomProxy.swift @@ -40,10 +40,8 @@ class RoomProxy: RoomProxyProtocol { private let backPaginationStateSubject = PassthroughSubject() private let membersSubject = CurrentValueSubject<[RoomMemberProxyProtocol], Never>([]) - var membersPublisher: AnyPublisher<[RoomMemberProxyProtocol], Never> { - membersSubject - .receive(on: DispatchQueue.main) - .eraseToAnyPublisher() + var members: CurrentValuePublisher<[RoomMemberProxyProtocol], Never> { + membersSubject.asCurrentValuePublisher() } private var timelineListener: RoomTimelineListener? diff --git a/ElementX/Sources/Services/Room/RoomProxyProtocol.swift b/ElementX/Sources/Services/Room/RoomProxyProtocol.swift index 3778d33c2..0e39e4d00 100644 --- a/ElementX/Sources/Services/Room/RoomProxyProtocol.swift +++ b/ElementX/Sources/Services/Room/RoomProxyProtocol.swift @@ -67,7 +67,7 @@ protocol RoomProxyProtocol { var avatarURL: URL? { get } - var membersPublisher: AnyPublisher<[RoomMemberProxyProtocol], Never> { get } + var members: CurrentValuePublisher<[RoomMemberProxyProtocol], Never> { get } var invitedMembersCount: Int { get } @@ -206,6 +206,6 @@ extension RoomProxyProtocol { func members() async -> [RoomMemberProxyProtocol]? { await updateMembers() - return await membersPublisher.values.first() + return members.value } }