Add the JoinRoomScreen into the SpaceFlowCoordinator. (#4513)

* Add the JoinRoomScreen into the SpaceFlowCoordinator.

The screen needs further work to make the join work.

* Fix the tests completing the join flow with the right action.
This commit is contained in:
Doug
2025-09-17 15:12:45 +01:00
committed by GitHub
parent c4de609ad7
commit 27f4c25194
22 changed files with 260 additions and 92 deletions
@@ -16,8 +16,13 @@ struct JoinRoomScreenCoordinatorParameters {
let appSettings: AppSettings
}
enum JoinRoomScreenJoinDetails {
case roomID(String)
case space(SpaceRoomListProxyProtocol)
}
enum JoinRoomScreenCoordinatorAction {
case joined
case joined(JoinRoomScreenJoinDetails)
case cancelled
case presentDeclineAndBlock(userID: String)
}
@@ -46,8 +51,8 @@ final class JoinRoomScreenCoordinator: CoordinatorProtocol {
guard let self else { return }
switch action {
case .joined:
actionsSubject.send(.joined)
case .joined(let details):
actionsSubject.send(.joined(details))
case .dismiss:
actionsSubject.send(.cancelled)
case .presentDeclineAndBlock(let userID):
@@ -7,8 +7,8 @@
import Foundation
enum JoinRoomScreenViewModelAction: Equatable {
case joined
enum JoinRoomScreenViewModelAction {
case joined(JoinRoomScreenJoinDetails)
case dismiss
case presentDeclineAndBlock(userID: String)
}
@@ -43,6 +43,7 @@ struct JoinRoomScreenRoomDetails {
let memberCount: Int?
let inviter: RoomInviterDetails?
let isDirect: Bool?
let isSpace: Bool?
}
struct JoinRoomScreenViewState: BindableState {
@@ -179,7 +179,8 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo
avatar: avatar,
memberCount: info?.joinedMembersCount,
inviter: inviter,
isDirect: info?.isDirect)
isDirect: info?.isDirect,
isSpace: info?.isSpace)
await updateMode()
}
@@ -243,8 +244,7 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo
if let alias = state.roomDetails?.canonicalAlias {
switch await clientProxy.joinRoomAlias(alias) {
case .success:
appSettings.seenInvites.remove(roomID)
actionsSubject.send(.joined)
await finishJoinAction()
case .failure(let error):
switch error {
case .forbiddenAccess:
@@ -261,8 +261,7 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo
} else {
switch await clientProxy.joinRoom(roomID, via: via) {
case .success:
appSettings.seenInvites.remove(roomID)
actionsSubject.send(.joined)
await finishJoinAction()
case .failure(let error):
switch error {
case .forbiddenAccess:
@@ -279,6 +278,23 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo
}
}
private func finishJoinAction() async {
appSettings.seenInvites.remove(roomID)
guard state.roomDetails?.isSpace == true else {
actionsSubject.send(.joined(.roomID(roomID)))
return
}
switch await clientProxy.spaceService.spaceRoomList(spaceID: roomID) {
case .success(let spaceRoomListProxy):
actionsSubject.send(.joined(.space(spaceRoomListProxy)))
case .failure(let error):
MXLog.error("Failed to get the space room list after joining: \(error)")
userIndicatorController.submitIndicator(.init(title: L10n.errorUnknown))
}
}
private func knockRoom() async {
showLoadingIndicator()