always present the space selection even for pre selected spaces

This commit is contained in:
Mauro Romito
2026-02-10 13:22:10 +01:00
committed by Mauro
parent 591ce3975b
commit 9ced1cff2e
15 changed files with 50 additions and 47 deletions
@@ -137,20 +137,20 @@ class StartChatFlowCoordinator: FlowCoordinatorProtocol {
self?.presentStartChatScreen()
}
stateMachine.addRoutes(event: .createRoom(isSpace: true), transitions: [.initial => .createRoom]) { [weak self] _ in
self?.presentCreateRoomScreen(isSpace: true, spaceSelectionMode: nil, isRoot: true)
self?.presentCreateRoomScreen(isSpace: true, spaceSelectionMode: .none, isRoot: true)
}
stateMachine.addRoutes(event: .createRoom(isSpace: false), transitions: [.initial => .createRoom]) { [weak self] context in
guard context.fromState == .initial else { return } // Required check because the event is used in another route.
guard let space = context.userInfo as? SpaceServiceRoom else {
fatalError("This transition only supports creating a room in a pre-selected space.")
}
self?.presentCreateRoomScreen(isSpace: false, spaceSelectionMode: .preSelected(space), isRoot: true)
self?.presentCreateRoomScreen(isSpace: false, spaceSelectionMode: .editableSpacesList(preSelectedSpace: space), isRoot: true)
}
stateMachine.addRoutes(event: .createRoom(isSpace: false), transitions: [.startChat => .createRoom]) { [weak self] context in
guard let self, context.fromState == .startChat else { return } // Required check because the event is used in another route.
presentCreateRoomScreen(isSpace: false,
spaceSelectionMode: flowParameters.appSettings.createSpaceEnabled ? .editableSpacesList : nil,
spaceSelectionMode: flowParameters.appSettings.createSpaceEnabled ? .editableSpacesList(preSelectedSpace: nil) : .none,
isRoot: false)
}
stateMachine.addRoutes(event: .dismissedCreateRoom, transitions: [.createRoom => .startChat]) { [weak self] _ in
@@ -208,7 +208,7 @@ class StartChatFlowCoordinator: FlowCoordinatorProtocol {
}
private func presentCreateRoomScreen(isSpace: Bool,
spaceSelectionMode: CreateRoomScreenSpaceSelectionMode?,
spaceSelectionMode: CreateRoomScreenSpaceSelectionMode,
isRoot: Bool) {
let createParameters = CreateRoomScreenCoordinatorParameters(isSpace: isSpace,
spaceSelectionMode: spaceSelectionMode,
@@ -11,7 +11,7 @@ import SwiftUI
struct CreateRoomScreenCoordinatorParameters {
let isSpace: Bool
let spaceSelectionMode: CreateRoomScreenSpaceSelectionMode?
let spaceSelectionMode: CreateRoomScreenSpaceSelectionMode
let shouldShowCancelButton: Bool
let userSession: UserSessionProtocol
let userIndicatorController: UserIndicatorControllerProtocol
@@ -143,6 +143,6 @@ enum CreateRoomScreenAccessType {
}
enum CreateRoomScreenSpaceSelectionMode {
case editableSpacesList
case preSelected(SpaceServiceRoom)
case editableSpacesList(preSelectedSpace: SpaceServiceRoom?)
case none
}
@@ -28,7 +28,7 @@ class CreateRoomScreenViewModel: CreateRoomScreenViewModelType, CreateRoomScreen
}
init(isSpace: Bool,
spaceSelectionMode: CreateRoomScreenSpaceSelectionMode?,
spaceSelectionMode: CreateRoomScreenSpaceSelectionMode,
shouldShowCancelButton: Bool,
userSession: UserSessionProtocol,
analytics: AnalyticsService,
@@ -40,18 +40,19 @@ class CreateRoomScreenViewModel: CreateRoomScreenViewModelType, CreateRoomScreen
self.userIndicatorController = userIndicatorController
var selectedSpace: SpaceServiceRoom?
var canSelectSpace = false
let canSelectSpace: Bool
var selectedAccessType = CreateRoomScreenAccessType.private
switch spaceSelectionMode {
case .editableSpacesList:
case .editableSpacesList(let preSelectedSpace):
canSelectSpace = true
case .preSelected(let value):
selectedSpace = value
if value.joinRule != .public {
selectedAccessType = .spaceMembers
if let preSelectedSpace {
selectedSpace = preSelectedSpace
if preSelectedSpace.joinRule != .public {
selectedAccessType = .spaceMembers
}
}
case .none:
break
canSelectSpace = false
}
let bindings = CreateRoomScreenViewStateBindings(roomTopic: "",
@@ -337,10 +337,10 @@ struct CreateRoom_Previews: PreviewProvider, TestablePreview {
return viewModel
}()
static let spaceViewModel = makeViewModel(isSpace: true, selectionMode: nil)
static let spaceViewModel = makeViewModel(isSpace: true, selectionMode: .none)
static let spaceWithAvatarViewModel = {
let viewModel = makeViewModel(isSpace: true, selectionMode: nil)
let viewModel = makeViewModel(isSpace: true, selectionMode: .none)
viewModel.updateAvatar(fileURL: Bundle.main.url(forResource: "preview_avatar_room", withExtension: "jpg") ?? .picturesDirectory)
return viewModel
}()
@@ -371,9 +371,10 @@ struct CreateRoom_Previews: PreviewProvider, TestablePreview {
return viewModel
}()
static let selectedSpaceViewModel = makeViewModel(selectionMode: .preSelected(SpaceServiceRoom.mock(name: "Awesome Space",
isSpace: true,
joinRule: .invite)))
static let selectedSpaceViewModel = makeViewModel(selectionMode: .editableSpacesList(preSelectedSpace: SpaceServiceRoom.mock(id: "awesome-space-id",
name: "Awesome Space",
isSpace: true,
joinRule: .invite)))
static let selectedSpaceWithListViewModel = {
let viewModel = makeViewModel()
@@ -383,9 +384,10 @@ struct CreateRoom_Previews: PreviewProvider, TestablePreview {
static let selectedSpaceWithAskToJoinViewModel = {
let viewModel = makeViewModel(isKnockingEnabled: true,
selectionMode: .preSelected(SpaceServiceRoom.mock(name: "Awesome Space",
isSpace: true,
joinRule: .invite)))
selectionMode: .editableSpacesList(preSelectedSpace: SpaceServiceRoom.mock(id: "awesome-space-id",
name: "Awesome Space",
isSpace: true,
joinRule: .invite)))
viewModel.context.selectedAccessType = .askToJoinWithSpaceMembers
return viewModel
}()
@@ -453,7 +455,7 @@ struct CreateRoom_Previews: PreviewProvider, TestablePreview {
private static func makeViewModel(isKnockingEnabled: Bool = false,
isSpace: Bool = false,
selectionMode: CreateRoomScreenSpaceSelectionMode? = .editableSpacesList,
selectionMode: CreateRoomScreenSpaceSelectionMode = .editableSpacesList(preSelectedSpace: nil),
isAliasAvailable: Bool = true) -> CreateRoomScreenViewModel {
AppSettings.resetAllSettings()
let appSettings = AppSettings()
@@ -68,7 +68,7 @@ struct CreateRoomSpaceSelectionSheet_Previews: PreviewProvider, TestablePreview
let userSession = UserSessionMock(.init(clientProxy: clientProxy))
return CreateRoomScreenViewModel(isSpace: false,
spaceSelectionMode: .editableSpacesList,
spaceSelectionMode: .editableSpacesList(preSelectedSpace: nil),
shouldShowCancelButton: false,
userSession: userSession,
analytics: ServiceLocator.shared.analytics,
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:83a67df5a49ac8156919889499ec22a33f563b7938e7dfb48c0dc49bb02645fe
size 136305
oid sha256:9e581f275989e39a2aadc059af9c69c2685abb938eecc9855fa1f2182d83bed5
size 146942
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:86a40d4382a544aa180015701cfcfb21a1041f75721560c984e12d33b9c7e02e
size 162193
oid sha256:0daa761c0dfd08eec088ee9e03790e9697f17a4c3ce83bdb7a68917c79e1b34e
size 174278
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e30083baf88ea9ef1e0add6e08fdf32fcfbe20e1aec5bd810fea63aa3317159f
size 87147
oid sha256:15414d3cc95a1dbcae9fd481df8690c98b074141bc3c2c00b8ecd118ce2927d6
size 96260
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:93389d81a8bf41c04f994fdd8c68be0851d1121830d8d818fbf9ab1660c7301b
size 116725
oid sha256:d98136e94aa426de48e76784bb204bd4bfad6852db9874fe61413dfac88f622e
size 126375
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:81a9fc6f2b4f30f472b070566de301e972261c2fc793c1eb3d7fd7ff18447cd3
size 124679
oid sha256:7df313c7cc43fb33c5a43d01a6f160556dc9d5870608563dfaf3e717ffbb79ab
size 135404
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b6b446617b753a1a15f1e0314d75e0564d513c6dae0406b643a28d23307acee4
size 143705
oid sha256:30dec3b7383f8a5f83ec0284a5f026c0eaf4ea413a939d3614f1d9f69f990efd
size 155660
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e822a146afe0c7e297a81bae8f8001f412385f6d6e2a38b900892327fb854147
size 74358
oid sha256:7c60a5df34365749605fb6a18f08c46d8d1363b6b0f58794a011dbdd8becc275
size 83208
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0ba8cbcfc9e73d632b836f99fe78db039e462c19448781a474a745fa939f3f88
size 93507
oid sha256:4dd5907f0b71f3ff6fec6dd399f12a987c6d7461120718664f71c50458851b83
size 103355
@@ -80,7 +80,7 @@ class CreateRoomScreenViewModelTests: XCTestCase {
userSession = UserSessionMock(.init(clientProxy: clientProxy))
ServiceLocator.shared.settings.knockingEnabled = true
let viewModel = CreateRoomScreenViewModel(isSpace: true,
spaceSelectionMode: nil,
spaceSelectionMode: .none,
shouldShowCancelButton: false,
userSession: userSession,
analytics: ServiceLocator.shared.analytics,
@@ -272,14 +272,14 @@ class CreateRoomScreenViewModelTests: XCTestCase {
func testCreateRoomInAnAlreadySelectedSpace() async throws {
let space = SpaceServiceRoom.mock(isSpace: true, joinRule: .invite)
setup(spacesSelectionMode: .preSelected(space))
setup(spacesSelectionMode: .editableSpacesList(preSelectedSpace: space))
context.send(viewAction: .updateRoomName("A"))
context.selectedAccessType = .spaceMembers
XCTAssertTrue(context.viewState.canCreateRoom)
XCTAssertEqual(context.selectedSpace?.id, space.id)
XCTAssertEqual(context.viewState.availableAccessTypes, [.spaceMembers, .askToJoinWithSpaceMembers, .private])
XCTAssertFalse(context.viewState.canSelectSpace)
XCTAssertTrue(context.viewState.canSelectSpace)
// When creating the room.
clientProxy.createRoomNameTopicAccessTypeIsSpaceUserIDsAvatarURLAliasLocalPartReturnValue = .success("1")
@@ -307,7 +307,7 @@ class CreateRoomScreenViewModelTests: XCTestCase {
func testCreateRoomInAnPublicSpaceAvailableTypes() {
let space = SpaceServiceRoom.mock(isSpace: true, joinRule: .public)
setup(spacesSelectionMode: .preSelected(space))
setup(spacesSelectionMode: .editableSpacesList(preSelectedSpace: space))
// Given a form with a blank topic.
context.send(viewAction: .updateRoomName("A"))
@@ -316,10 +316,10 @@ class CreateRoomScreenViewModelTests: XCTestCase {
XCTAssertTrue(context.viewState.canCreateRoom)
XCTAssertEqual(context.selectedSpace?.id, space.id)
XCTAssertEqual(context.viewState.availableAccessTypes, [.public, .askToJoin, .private])
XCTAssertFalse(context.viewState.canSelectSpace)
XCTAssertTrue(context.viewState.canSelectSpace)
}
private func setup(isSpace: Bool = false, spacesSelectionMode: CreateRoomScreenSpaceSelectionMode = .editableSpacesList) {
private func setup(isSpace: Bool = false, spacesSelectionMode: CreateRoomScreenSpaceSelectionMode = .editableSpacesList(preSelectedSpace: nil)) {
spaceService = SpaceServiceProxyMock(.init(editableSpaces: .mockJoinedSpaces2,
spaceRoomLists: ["1": .init()]))
clientProxy = ClientProxyMock(.init(userIDServerName: "matrix.org",