mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-04 01:20:12 +00:00
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:
@@ -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()
|
||||
|
||||
|
||||
@@ -58,8 +58,8 @@ class SpaceListScreenViewModel: SpaceListScreenViewModelType, SpaceListScreenVie
|
||||
switch viewAction {
|
||||
case .spaceAction(.select(let spaceRoomProxy)):
|
||||
Task { await selectSpace(spaceRoomProxy) }
|
||||
case .spaceAction(.join(let spaceRoomProxy)):
|
||||
#warning("Implement joining.")
|
||||
case .spaceAction(.join):
|
||||
fatalError("There shouldn't be any unjoined spaces in the joined spaces list.")
|
||||
case .showSettings:
|
||||
actionsSubject.send(.showSettings)
|
||||
}
|
||||
@@ -68,7 +68,7 @@ class SpaceListScreenViewModel: SpaceListScreenViewModelType, SpaceListScreenVie
|
||||
// MARK: - Private
|
||||
|
||||
private func selectSpace(_ spaceRoomProxy: SpaceRoomProxyProtocol) async {
|
||||
switch await spaceServiceProxy.spaceRoomList(for: spaceRoomProxy) {
|
||||
switch await spaceServiceProxy.spaceRoomList(spaceID: spaceRoomProxy.id) {
|
||||
case .success(let spaceRoomListProxy):
|
||||
actionsSubject.send(.selectSpace(spaceRoomListProxy))
|
||||
case .failure(let error):
|
||||
|
||||
@@ -20,6 +20,7 @@ struct SpaceScreenCoordinatorParameters {
|
||||
|
||||
enum SpaceScreenCoordinatorAction {
|
||||
case selectSpace(SpaceRoomListProxyProtocol)
|
||||
case selectUnjoinedSpace(SpaceRoomProxyProtocol)
|
||||
case selectRoom(roomID: String)
|
||||
}
|
||||
|
||||
@@ -52,6 +53,8 @@ final class SpaceScreenCoordinator: CoordinatorProtocol {
|
||||
switch action {
|
||||
case .selectSpace(let spaceRoomListProxy):
|
||||
actionsSubject.send(.selectSpace(spaceRoomListProxy))
|
||||
case .selectUnjoinedSpace(let spaceRoomProxy):
|
||||
actionsSubject.send(.selectUnjoinedSpace(spaceRoomProxy))
|
||||
case .selectRoom(let roomID):
|
||||
actionsSubject.send(.selectRoom(roomID: roomID))
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ import Foundation
|
||||
|
||||
enum SpaceScreenViewModelAction {
|
||||
case selectSpace(SpaceRoomListProxyProtocol)
|
||||
case selectUnjoinedSpace(SpaceRoomProxyProtocol)
|
||||
case selectRoom(roomID: String)
|
||||
}
|
||||
|
||||
|
||||
@@ -68,7 +68,11 @@ class SpaceScreenViewModel: SpaceScreenViewModelType, SpaceScreenViewModelProtoc
|
||||
switch viewAction {
|
||||
case .spaceAction(.select(let spaceRoomProxy)):
|
||||
if spaceRoomProxy.isSpace {
|
||||
Task { await selectSpace(spaceRoomProxy) }
|
||||
if spaceRoomProxy.state != .joined {
|
||||
actionsSubject.send(.selectUnjoinedSpace(spaceRoomProxy))
|
||||
} else {
|
||||
Task { await selectSpace(spaceRoomProxy) }
|
||||
}
|
||||
} else {
|
||||
// No need to check the join state, the room flow will show an appropriately configured join screen if needed.
|
||||
actionsSubject.send(.selectRoom(roomID: spaceRoomProxy.id))
|
||||
@@ -85,16 +89,6 @@ class SpaceScreenViewModel: SpaceScreenViewModelType, SpaceScreenViewModelProtoc
|
||||
|
||||
// MARK: - Private
|
||||
|
||||
private func selectSpace(_ spaceRoomProxy: SpaceRoomProxyProtocol) async {
|
||||
switch await spaceServiceProxy.spaceRoomList(for: spaceRoomProxy) {
|
||||
case .success(let spaceRoomListProxy):
|
||||
actionsSubject.send(.selectSpace(spaceRoomListProxy))
|
||||
case .failure(let error):
|
||||
MXLog.error("Unable to select space: \(error)")
|
||||
showFailureIndicator()
|
||||
}
|
||||
}
|
||||
|
||||
private func join(_ spaceRoomProxy: SpaceRoomProxyProtocol) async {
|
||||
state.joiningRoomIDs.insert(spaceRoomProxy.id)
|
||||
defer { state.joiningRoomIDs.remove(spaceRoomProxy.id) }
|
||||
@@ -114,6 +108,16 @@ class SpaceScreenViewModel: SpaceScreenViewModelType, SpaceScreenViewModelProtoc
|
||||
}
|
||||
}
|
||||
|
||||
private func selectSpace(_ spaceRoomProxy: SpaceRoomProxyProtocol) async {
|
||||
switch await spaceServiceProxy.spaceRoomList(spaceID: spaceRoomProxy.id) {
|
||||
case .success(let spaceRoomListProxy):
|
||||
actionsSubject.send(.selectSpace(spaceRoomListProxy))
|
||||
case .failure(let error):
|
||||
MXLog.error("Unable to select space: \(error)")
|
||||
showFailureIndicator()
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Indicators
|
||||
|
||||
private static var failureIndicatorID: String { "\(Self.self)-Failure" }
|
||||
|
||||
Reference in New Issue
Block a user