mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-05-20 14:42:09 +02:00
Merge branch 'gil/143_create_public_space' into gil/5224_space_creation
This commit is contained in:
@@ -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,
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
+1
@@ -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))
|
||||
|
||||
+1
@@ -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
|
||||
|
||||
+10
@@ -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
|
||||
}
|
||||
|
||||
|
||||
+3
-2
@@ -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)
|
||||
|
||||
-4
@@ -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() {
|
||||
|
||||
+2
-6
@@ -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)
|
||||
}
|
||||
|
||||
+2
-2
@@ -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)
|
||||
|
||||
+34
-18
@@ -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)))
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user