From fdf6395f48c4e3267767faea81d302ea87154c2a Mon Sep 17 00:00:00 2001 From: Gil Eluard Date: Wed, 15 Dec 2021 20:09:37 +0100 Subject: [PATCH 1/3] [iOS] Create public space #143 - Updated swiftui tests --- RiotSwiftUI/Modules/Common/Mock/MockAppScreens.swift | 8 +++++++- .../Test/UI/SpaceCreationPostProcessUITests.swift | 4 ---- .../Unit/SpaceCreationPostProcessViewModelTests.swift | 8 ++------ .../Test/Unit/SpaceCreationSettingsViewModelTests.swift | 4 ++-- 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/RiotSwiftUI/Modules/Common/Mock/MockAppScreens.swift b/RiotSwiftUI/Modules/Common/Mock/MockAppScreens.swift index bceefcd26..a5e70056a 100644 --- a/RiotSwiftUI/Modules/Common/Mock/MockAppScreens.swift +++ b/RiotSwiftUI/Modules/Common/Mock/MockAppScreens.swift @@ -25,7 +25,13 @@ enum MockAppScreens { MockTemplateRoomChatScreenState.self, MockUserSuggestionScreenState.self, MockPollEditFormScreenState.self, - MockPollTimelineScreenState.self + MockPollTimelineScreenState.self, + MockSpaceCreationEmailInvitesScreenState.self, + MockSpaceCreationMatrixItemChooserScreenState.self, + MockSpaceCreationMenuScreenState.self, + MockSpaceCreationRoomsScreenState.self, + MockSpaceCreationSettingsScreenState.self, + MockSpaceCreationPostProcessScreenState.self, ] } diff --git a/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationPostProcess/Test/UI/SpaceCreationPostProcessUITests.swift b/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationPostProcess/Test/UI/SpaceCreationPostProcessUITests.swift index 6f716efab..2f42eacf2 100644 --- a/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationPostProcess/Test/UI/SpaceCreationPostProcessUITests.swift +++ b/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationPostProcess/Test/UI/SpaceCreationPostProcessUITests.swift @@ -32,10 +32,6 @@ class SpaceCreationPostProcessUITests: MockScreenTest { func verifySpaceCreationPostProcessScreen() throws { guard let screenState = screenState as? MockSpaceCreationPostProcessScreenState else { fatalError("no screen") } - switch screenState { - case .tasks: - verifyTasksList() - } } func verifyTasksList() { diff --git a/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationPostProcess/Test/Unit/SpaceCreationPostProcessViewModelTests.swift b/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationPostProcess/Test/Unit/SpaceCreationPostProcessViewModelTests.swift index 16e9dc6f7..76c1a53f4 100644 --- a/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationPostProcess/Test/Unit/SpaceCreationPostProcessViewModelTests.swift +++ b/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationPostProcess/Test/Unit/SpaceCreationPostProcessViewModelTests.swift @@ -41,19 +41,15 @@ class SpaceCreationPostProcessViewModelTests: XCTestCase { } func testUpateToNextTask() { - let tasksPublisher = context.$viewState.map(\.tasks).removeDuplicates() - let awaitDeferred = xcAwaitDeferred(tasksPublisher) service.simulateUpdate(tasks: MockSpaceCreationPostProcessService.nextStepTasks) - XCTAssertEqual(try awaitDeferred(), MockSpaceCreationPostProcessService.nextStepTasks) + XCTAssertEqual(context.viewState.tasks, MockSpaceCreationPostProcessService.nextStepTasks) XCTAssertEqual(context.viewState.errorCount, 2) XCTAssertEqual(context.viewState.isFinished, false) } func testLastTaskDone() { - let tasksPublisher = context.$viewState.map(\.tasks).removeDuplicates() - let awaitDeferred = xcAwaitDeferred(tasksPublisher) service.simulateUpdate(tasks: MockSpaceCreationPostProcessService.lastTaskDoneWithError) - XCTAssertEqual(try awaitDeferred(), MockSpaceCreationPostProcessService.lastTaskDoneWithError) + XCTAssertEqual(context.viewState.tasks, MockSpaceCreationPostProcessService.lastTaskDoneWithError) XCTAssertEqual(context.viewState.errorCount, 2) XCTAssertEqual(context.viewState.isFinished, true) } diff --git a/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationSettings/Test/Unit/SpaceCreationSettingsViewModelTests.swift b/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationSettings/Test/Unit/SpaceCreationSettingsViewModelTests.swift index e95f0f87d..135ac6fd0 100644 --- a/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationSettings/Test/Unit/SpaceCreationSettingsViewModelTests.swift +++ b/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationSettings/Test/Unit/SpaceCreationSettingsViewModelTests.swift @@ -45,8 +45,8 @@ class SpaceCreationSettingsViewModelTests: XCTestCase { func testInitialState() { XCTAssertEqual(context.viewState.title, creationParameters.isPublic ? VectorL10n.spacesCreationPublicSpaceTitle : VectorL10n.spacesCreationPrivateSpaceTitle) XCTAssertEqual(context.viewState.isAddressValid, true) - XCTAssertEqual(context.viewState.defaultAddress, "#fake:matrix.org") - XCTAssertEqual(context.viewState.addressMessage, VectorL10n.spacesCreationAddressDefaultMessage("#fake:matrix.org")) + XCTAssertEqual(context.viewState.defaultAddress, "fake-uri") + XCTAssertEqual(context.viewState.addressMessage, VectorL10n.spacesCreationAddressDefaultMessage("#fake-uri:fake-domain.org")) XCTAssertEqual(context.viewState.avatarImage, Asset.Images.appSymbol.image) XCTAssertEqual(context.roomName, creationParameters.name) XCTAssertEqual(context.topic, creationParameters.topic) From 46ff9109415077e3183451716033e1c74f2f3b0c Mon Sep 17 00:00:00 2001 From: Gil Eluard Date: Wed, 15 Dec 2021 21:04:37 +0100 Subject: [PATCH 2/3] [iOS] Create public space #143 - Consolidated current flow --- .../ViewModel/SpaceCreationEmailInvitesViewModel.swift | 1 + .../SpaceCreationMatrixItemChooserViewModel.swift | 1 + .../Model/SpaceCreationParameters.swift | 10 ++++++++++ .../MatrixSDK/SpaceCreationPostProcessService.swift | 5 +++-- 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationEmailInvites/ViewModel/SpaceCreationEmailInvitesViewModel.swift b/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationEmailInvites/ViewModel/SpaceCreationEmailInvitesViewModel.swift index fc36546eb..a6ab659bc 100644 --- a/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationEmailInvites/ViewModel/SpaceCreationEmailInvitesViewModel.swift +++ b/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationEmailInvites/ViewModel/SpaceCreationEmailInvitesViewModel.swift @@ -89,6 +89,7 @@ class SpaceCreationEmailInvitesViewModel: SpaceCreationEmailInvitesViewModelType private func done() { self.creationParameters.emailInvites = self.context.emailInvites + self.creationParameters.inviteType = .email let emailAddressesValidity = service.validate(self.context.emailInvites) dispatch(action: .updateEmailValidity(emailAddressesValidity)) diff --git a/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationMatrixItemChooser/ViewModel/SpaceCreationMatrixItemChooserViewModel.swift b/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationMatrixItemChooser/ViewModel/SpaceCreationMatrixItemChooserViewModel.swift index 55b4f762d..549bd8f6e 100644 --- a/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationMatrixItemChooser/ViewModel/SpaceCreationMatrixItemChooserViewModel.swift +++ b/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationMatrixItemChooser/ViewModel/SpaceCreationMatrixItemChooserViewModel.swift @@ -84,6 +84,7 @@ class SpaceCreationMatrixItemChooserViewModel: SpaceCreationMatrixItemChooserVie let selectedItemIds = Array(spaceCreationMatrixItemChooserService.selectedItemIdsSubject.value) switch spaceCreationMatrixItemChooserService.type { case .people: + creationParams.inviteType = .userId creationParams.userIdInvites = selectedItemIds default: creationParams.addedRoomIds = selectedItemIds diff --git a/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationMenu/Model/SpaceCreationParameters.swift b/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationMenu/Model/SpaceCreationParameters.swift index e14f66184..5255923b0 100644 --- a/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationMenu/Model/SpaceCreationParameters.swift +++ b/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationMenu/Model/SpaceCreationParameters.swift @@ -17,6 +17,11 @@ import Foundation import UIKit +enum SpaceCreationInviteType { + case email + case userId +} + class SpaceCreationParameters { var name: String? { didSet { @@ -89,6 +94,11 @@ class SpaceCreationParameters { isModified = true } } + var inviteType: SpaceCreationInviteType = .email { + didSet { + isModified = true + } + } private(set) var isModified: Bool = false } diff --git a/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationPostProcess/Service/MatrixSDK/SpaceCreationPostProcessService.swift b/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationPostProcess/Service/MatrixSDK/SpaceCreationPostProcessService.swift index 944ae61f5..c10113638 100644 --- a/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationPostProcess/Service/MatrixSDK/SpaceCreationPostProcessService.swift +++ b/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationPostProcess/Service/MatrixSDK/SpaceCreationPostProcessService.swift @@ -114,7 +114,7 @@ class SpaceCreationPostProcessService: SpaceCreationPostProcessServiceProtocol { })) } - if creationParams.userIdInvites.isEmpty { + if creationParams.inviteType == .email { let emailInviteCount = creationParams.userDefinedEmailInvites.count if emailInviteCount > 0 { let subTasks = creationParams.userDefinedEmailInvites.map { emailAddress in @@ -170,7 +170,8 @@ class SpaceCreationPostProcessService: SpaceCreationPostProcessServiceProtocol { if let userDefinedAlias = creationParams.userDefinedAddress, !userDefinedAlias.isEmpty { alias = userDefinedAlias } - session.spaceService.createSpace(withName: creationParams.name, topic: creationParams.topic, isPublic: creationParams.isPublic, aliasLocalPart: alias, inviteArray: creationParams.userIdInvites) { [weak self] response in + let userIdInvites = creationParams.inviteType == .userId ? creationParams.userIdInvites : [] + session.spaceService.createSpace(withName: creationParams.name, topic: creationParams.topic, isPublic: creationParams.isPublic, aliasLocalPart: alias, inviteArray: userIdInvites) { [weak self] response in guard let self = self else { return } if response.isFailure { self.updateCurrentTask(with: .failure) From 7194e103502a20239cc1dbc1f375435bbe1989a6 Mon Sep 17 00:00:00 2001 From: Gil Eluard Date: Thu, 16 Dec 2021 09:54:54 +0100 Subject: [PATCH 3/3] [iOS] Create public space #143 - UI tweaks in space settings screen --- .../View/SpaceCreationSettings.swift | 52 ++++++++++++------- 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationSettings/View/SpaceCreationSettings.swift b/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationSettings/View/SpaceCreationSettings.swift index 0d4a44ac9..c58bff7b2 100644 --- a/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationSettings/View/SpaceCreationSettings.swift +++ b/RiotSwiftUI/Modules/Spaces/SpaceCreation/SpaceCreationSettings/View/SpaceCreationSettings.swift @@ -50,26 +50,41 @@ struct SpaceCreationSettings: View { @ViewBuilder private var mainView: some View { - ZStack(alignment: .center) { - GeometryReader { geometryReader in - ScrollView(.vertical, showsIndicators: false) { - VStack(alignment: .center) { - VStack(alignment: .center) { - headerView - Spacer() - avatarView - Spacer() - } - .background(theme.colors.background) - Spacer().frame(height:370) + GeometryReader { geometryReader in + ZStack(alignment: .center) { + VStack(alignment: .center) { + if geometryReader.size.height > 650 { + Spacer().frame(height: 10) } - .frame(minWidth: geometryReader.size.width, minHeight: geometryReader.size.height - 2) + headerView + if !viewModel.viewState.showRoomAddress { + Spacer().frame(height: geometryReader.size.height / 20) + } else { + Spacer().frame(height: geometryReader.size.height / 30) + } + avatarView + Spacer() + } + .background(theme.colors.background) + VStack(alignment: .center) { + if viewModel.viewState.showRoomAddress && geometryReader.size.height > 650 { + Spacer() + } + Spacer() + formView + if !viewModel.viewState.showRoomAddress { + if geometryReader.size.height > 650 { + Spacer().frame(height:geometryReader.size.height / 4) + } else { + Spacer().frame(height:geometryReader.size.height / 4) + } + } else { + if geometryReader.size.height > 650 { + Spacer().frame(height:geometryReader.size.height / 10) + } + } + footerView } - } - VStack(alignment: .center) { - Spacer() - formView - footerView } } .padding(EdgeInsets(top: 0, leading: 16, bottom: 24, trailing: 16)) @@ -98,6 +113,7 @@ struct SpaceCreationSettings: View { } }.padding(10) .gesture(TapGesture().onEnded { _ in + ResponderManager.resignFirstResponder() viewModel.send(viewAction: .pickImage(reader.frame(in: .global))) }) }