diff --git a/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenModels.swift b/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenModels.swift index e79f73c3fb..396a3a912b 100644 --- a/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenModels.swift +++ b/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenModels.swift @@ -29,7 +29,7 @@ struct JoinRoomScreenRoomDetails { let topic: String? let canonicalAlias: String? let avatar: RoomAvatar - let memberCount: UInt + let memberCount: Int let inviter: RoomInviterDetails? } diff --git a/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenViewModel.swift b/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenViewModel.swift index 6643e19c6a..a8731ab517 100644 --- a/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenViewModel.swift +++ b/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenViewModel.swift @@ -19,6 +19,7 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo private var roomPreview: RoomPreviewProxyProtocol? private var room: RoomProxyType? + private var membershipStateChangeCancellable: AnyCancellable? private let actionsSubject: PassthroughSubject = .init() var actionsPublisher: AnyPublisher { @@ -101,6 +102,7 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo } private func updateRoomDetails() async { + membershipStateChangeCancellable = nil var roomInfo: BaseRoomInfoProxyProtocol? var inviter: RoomInviterDetails? @@ -112,6 +114,19 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo roomInfo = invitedRoomProxy.info case .knocked(let knockedRoomProxy): roomInfo = knockedRoomProxy.info + if let roomSummaryProvider = clientProxy.roomSummaryProvider { + membershipStateChangeCancellable = roomSummaryProvider.roomListPublisher + .compactMap { summaries -> Void? in + guard let roomSummary = summaries.first(where: { $0.id == roomInfo?.id }), + roomSummary.roomListItem.membership() != .knocked else { + return nil + } + return () + } + .sink { [weak self] in + Task { await self?.loadRoomDetails() } + } + } default: break } @@ -121,7 +136,7 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo topic: info?.topic, canonicalAlias: info?.canonicalAlias, avatar: info?.avatar ?? .room(id: roomID, name: info?.displayName ?? "", avatarURL: nil), - memberCount: UInt(info?.activeMembersCount ?? 0), + memberCount: info?.joinedMembersCount ?? 0, inviter: inviter) await updateMode() diff --git a/ElementX/Sources/Services/Room/RoomInfoProxy.swift b/ElementX/Sources/Services/Room/RoomInfoProxy.swift index 80233db1eb..26808d7f48 100644 --- a/ElementX/Sources/Services/Room/RoomInfoProxy.swift +++ b/ElementX/Sources/Services/Room/RoomInfoProxy.swift @@ -16,6 +16,7 @@ protocol BaseRoomInfoProxyProtocol { var canonicalAlias: String? { get } var avatarURL: URL? { get } var activeMembersCount: Int { get } + var joinedMembersCount: Int { get } var isDirect: Bool { get } var isSpace: Bool { get } } @@ -112,6 +113,7 @@ struct RoomPreviewInfoProxy: BaseRoomInfoProxyProtocol { var isDirect: Bool { roomPreviewInfo.isDirect ?? false } var isSpace: Bool { roomPreviewInfo.roomType == .space } var activeMembersCount: Int { Int(roomPreviewInfo.numActiveMembers ?? roomPreviewInfo.numJoinedMembers) } + var joinedMembersCount: Int { Int(roomPreviewInfo.numJoinedMembers) } var joinRule: JoinRule { roomPreviewInfo.joinRule } var membership: Membership? { roomPreviewInfo.membership }