diff --git a/ElementX/Sources/FlowCoordinators/StartChatFlowCoordinator.swift b/ElementX/Sources/FlowCoordinators/StartChatFlowCoordinator.swift index bde01566b..139aa662d 100644 --- a/ElementX/Sources/FlowCoordinators/StartChatFlowCoordinator.swift +++ b/ElementX/Sources/FlowCoordinators/StartChatFlowCoordinator.swift @@ -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, diff --git a/ElementX/Sources/Screens/CreateRoomScreen/CreateRoomScreenCoordinator.swift b/ElementX/Sources/Screens/CreateRoomScreen/CreateRoomScreenCoordinator.swift index 669be9dd1..8b6bf76e0 100644 --- a/ElementX/Sources/Screens/CreateRoomScreen/CreateRoomScreenCoordinator.swift +++ b/ElementX/Sources/Screens/CreateRoomScreen/CreateRoomScreenCoordinator.swift @@ -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 diff --git a/ElementX/Sources/Screens/CreateRoomScreen/CreateRoomScreenModels.swift b/ElementX/Sources/Screens/CreateRoomScreen/CreateRoomScreenModels.swift index 08539c4be..184c3e575 100644 --- a/ElementX/Sources/Screens/CreateRoomScreen/CreateRoomScreenModels.swift +++ b/ElementX/Sources/Screens/CreateRoomScreen/CreateRoomScreenModels.swift @@ -143,6 +143,6 @@ enum CreateRoomScreenAccessType { } enum CreateRoomScreenSpaceSelectionMode { - case editableSpacesList - case preSelected(SpaceServiceRoom) + case editableSpacesList(preSelectedSpace: SpaceServiceRoom?) + case none } diff --git a/ElementX/Sources/Screens/CreateRoomScreen/CreateRoomScreenViewModel.swift b/ElementX/Sources/Screens/CreateRoomScreen/CreateRoomScreenViewModel.swift index 5758f236f..84bd6fcd0 100644 --- a/ElementX/Sources/Screens/CreateRoomScreen/CreateRoomScreenViewModel.swift +++ b/ElementX/Sources/Screens/CreateRoomScreen/CreateRoomScreenViewModel.swift @@ -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: "", diff --git a/ElementX/Sources/Screens/CreateRoomScreen/View/CreateRoomScreen.swift b/ElementX/Sources/Screens/CreateRoomScreen/View/CreateRoomScreen.swift index 3be479a54..00d4f6c3f 100644 --- a/ElementX/Sources/Screens/CreateRoomScreen/View/CreateRoomScreen.swift +++ b/ElementX/Sources/Screens/CreateRoomScreen/View/CreateRoomScreen.swift @@ -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() diff --git a/ElementX/Sources/Screens/CreateRoomScreen/View/CreateRoomSpaceSelectionSheet.swift b/ElementX/Sources/Screens/CreateRoomScreen/View/CreateRoomSpaceSelectionSheet.swift index 0f27c1d6b..57e15f838 100644 --- a/ElementX/Sources/Screens/CreateRoomScreen/View/CreateRoomSpaceSelectionSheet.swift +++ b/ElementX/Sources/Screens/CreateRoomScreen/View/CreateRoomSpaceSelectionSheet.swift @@ -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, diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Knockable-Room-with-already-selected-Space-iPad-en-GB.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Knockable-Room-with-already-selected-Space-iPad-en-GB.png index 935e8a288..740d94327 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Knockable-Room-with-already-selected-Space-iPad-en-GB.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Knockable-Room-with-already-selected-Space-iPad-en-GB.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:83a67df5a49ac8156919889499ec22a33f563b7938e7dfb48c0dc49bb02645fe -size 136305 +oid sha256:9e581f275989e39a2aadc059af9c69c2685abb938eecc9855fa1f2182d83bed5 +size 146942 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Knockable-Room-with-already-selected-Space-iPad-pseudo.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Knockable-Room-with-already-selected-Space-iPad-pseudo.png index e417b98b2..4d6086a06 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Knockable-Room-with-already-selected-Space-iPad-pseudo.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Knockable-Room-with-already-selected-Space-iPad-pseudo.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:86a40d4382a544aa180015701cfcfb21a1041f75721560c984e12d33b9c7e02e -size 162193 +oid sha256:0daa761c0dfd08eec088ee9e03790e9697f17a4c3ce83bdb7a68917c79e1b34e +size 174278 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Knockable-Room-with-already-selected-Space-iPhone-en-GB.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Knockable-Room-with-already-selected-Space-iPhone-en-GB.png index f5d3a9de7..f2de03472 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Knockable-Room-with-already-selected-Space-iPhone-en-GB.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Knockable-Room-with-already-selected-Space-iPhone-en-GB.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e30083baf88ea9ef1e0add6e08fdf32fcfbe20e1aec5bd810fea63aa3317159f -size 87147 +oid sha256:15414d3cc95a1dbcae9fd481df8690c98b074141bc3c2c00b8ecd118ce2927d6 +size 96260 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Knockable-Room-with-already-selected-Space-iPhone-pseudo.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Knockable-Room-with-already-selected-Space-iPhone-pseudo.png index 293edac8f..5d423f88d 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Knockable-Room-with-already-selected-Space-iPhone-pseudo.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Knockable-Room-with-already-selected-Space-iPhone-pseudo.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:93389d81a8bf41c04f994fdd8c68be0851d1121830d8d818fbf9ab1660c7301b -size 116725 +oid sha256:d98136e94aa426de48e76784bb204bd4bfad6852db9874fe61413dfac88f622e +size 126375 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Room-with-already-selected-Space-iPad-en-GB.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Room-with-already-selected-Space-iPad-en-GB.png index 5e156c641..fe1dfa5f5 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Room-with-already-selected-Space-iPad-en-GB.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Room-with-already-selected-Space-iPad-en-GB.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:81a9fc6f2b4f30f472b070566de301e972261c2fc793c1eb3d7fd7ff18447cd3 -size 124679 +oid sha256:7df313c7cc43fb33c5a43d01a6f160556dc9d5870608563dfaf3e717ffbb79ab +size 135404 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Room-with-already-selected-Space-iPad-pseudo.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Room-with-already-selected-Space-iPad-pseudo.png index 93752e064..0a3e5aa73 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Room-with-already-selected-Space-iPad-pseudo.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Room-with-already-selected-Space-iPad-pseudo.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b6b446617b753a1a15f1e0314d75e0564d513c6dae0406b643a28d23307acee4 -size 143705 +oid sha256:30dec3b7383f8a5f83ec0284a5f026c0eaf4ea413a939d3614f1d9f69f990efd +size 155660 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Room-with-already-selected-Space-iPhone-en-GB.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Room-with-already-selected-Space-iPhone-en-GB.png index 4945b8da5..c73cdb283 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Room-with-already-selected-Space-iPhone-en-GB.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Room-with-already-selected-Space-iPhone-en-GB.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e822a146afe0c7e297a81bae8f8001f412385f6d6e2a38b900892327fb854147 -size 74358 +oid sha256:7c60a5df34365749605fb6a18f08c46d8d1363b6b0f58794a011dbdd8becc275 +size 83208 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Room-with-already-selected-Space-iPhone-pseudo.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Room-with-already-selected-Space-iPhone-pseudo.png index 02f37c070..18a2dc760 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Room-with-already-selected-Space-iPhone-pseudo.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/createRoom.Create-Room-with-already-selected-Space-iPhone-pseudo.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0ba8cbcfc9e73d632b836f99fe78db039e462c19448781a474a745fa939f3f88 -size 93507 +oid sha256:4dd5907f0b71f3ff6fec6dd399f12a987c6d7461120718664f71c50458851b83 +size 103355 diff --git a/UnitTests/Sources/CreateRoomViewModelTests.swift b/UnitTests/Sources/CreateRoomViewModelTests.swift index 032cecad1..b1b8d3f8d 100644 --- a/UnitTests/Sources/CreateRoomViewModelTests.swift +++ b/UnitTests/Sources/CreateRoomViewModelTests.swift @@ -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",