mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-05-04 23:17:43 +02:00
Merge branch 'feature/4846_us02_add_federate_toggle_for_room_creation' into 'develop'
Feature/4846 us02 add federate toggle for room creation See merge request bwmessenger/bundesmessenger/bundesmessenger-ios!271
This commit is contained in:
@@ -22,6 +22,7 @@ import UIKit
|
||||
enum EnterNewRoomDetailsViewAction {
|
||||
case loadData
|
||||
case chooseAvatar(sourceView: UIView)
|
||||
case updateServerACLRule // bwi: #4846
|
||||
case removeAvatar
|
||||
case cancel
|
||||
case create
|
||||
|
||||
+48
-1
@@ -35,6 +35,7 @@ final class EnterNewRoomDetailsViewController: UIViewController {
|
||||
static let roomTopicMaximumNumberOfChars = 250
|
||||
static let chooseAvatarTableViewCellHeight: CGFloat = 140
|
||||
static let textViewTableViewCellHeight: CGFloat = 150
|
||||
static let bwiToggleWithLabelAndSubLabelCellReuseIdentifier = "bwiToggleWithLabelAndSubLabelCellReuseIdentifier" // bwi: #4846
|
||||
}
|
||||
|
||||
// MARK: - Properties
|
||||
@@ -74,11 +75,13 @@ final class EnterNewRoomDetailsViewController: UIViewController {
|
||||
case textField(tag: Int, placeholder: String?, delegate: UITextFieldDelegate?)
|
||||
case textView(tag: Int, placeholder: String?, delegate: UITextViewDelegate?)
|
||||
case withSwitch(isOn: Bool, onValueChanged: ((UISwitch) -> Void)?)
|
||||
case withSwitchWithSubText(onValueChanged: ((Bool) -> Void)?) // bwi: #4846
|
||||
}
|
||||
|
||||
private struct Row {
|
||||
var type: RowType
|
||||
var text: String?
|
||||
var subText: String? // bwi: #4846
|
||||
var accessoryType: UITableViewCell.AccessoryType = .none
|
||||
var action: (() -> Void)?
|
||||
}
|
||||
@@ -169,12 +172,24 @@ final class EnterNewRoomDetailsViewController: UIViewController {
|
||||
}
|
||||
}
|
||||
}
|
||||
// bwi: #4846 add serverACLRule on roomcreation
|
||||
let row_4_3 = Row(type: .withSwitchWithSubText(onValueChanged: { [weak self] newToggleValue in
|
||||
guard let self = self else {
|
||||
return
|
||||
}
|
||||
viewModel.process(viewAction: .updateServerACLRule)
|
||||
}), text: BWIL10n.createRoomTypeFederated, subText: BWIL10n.createRoomTypeFederatedSubtext)
|
||||
let rows: [Row]
|
||||
switch viewModel.actionType {
|
||||
case .createAndAddToSpace:
|
||||
rows = [row_4_0, row_4_1, row_4_2]
|
||||
case .createOnly:
|
||||
rows = [row_4_0, row_4_2]
|
||||
// bwi: #4846 add serverACLRule on roomcreation
|
||||
if BWIBuildSettings.shared.isFederationEnabled {
|
||||
rows = [row_4_0, row_4_2, row_4_3]
|
||||
} else {
|
||||
rows = [row_4_0, row_4_2]
|
||||
}
|
||||
}
|
||||
var footer: String
|
||||
switch viewModel.roomCreationParameters.joinRule {
|
||||
@@ -348,6 +363,8 @@ final class EnterNewRoomDetailsViewController: UIViewController {
|
||||
mainTableView.register(cellType: TextFieldTableViewCell.self)
|
||||
mainTableView.register(cellType: TextViewTableViewCell.self)
|
||||
mainTableView.register(headerFooterViewType: TextViewTableViewHeaderFooterView.self)
|
||||
// bwi: #4846 add serverACLRule on roomcreation
|
||||
mainTableView.register(TableViewCellWithLabelSubLabelAndSwitch<TableViewCellWithLabelSubLabelAndSwitchView>.self, forCellReuseIdentifier: Constants.bwiToggleWithLabelAndSubLabelCellReuseIdentifier)
|
||||
mainTableView.sectionHeaderHeight = UITableView.automaticDimension
|
||||
mainTableView.estimatedSectionHeaderHeight = 50
|
||||
mainTableView.sectionFooterHeight = UITableView.automaticDimension
|
||||
@@ -490,6 +507,22 @@ extension EnterNewRoomDetailsViewController: UITableViewDataSource {
|
||||
cell.mxkSwitchTrailingConstraint.constant = 15
|
||||
cell.update(theme: theme)
|
||||
|
||||
return cell
|
||||
|
||||
// bwi: #4846 add toggle with subtext for federation
|
||||
case .withSwitchWithSubText(let onValueChanged):
|
||||
guard let cell = tableView.dequeueReusableCell(withIdentifier: Constants.bwiToggleWithLabelAndSubLabelCellReuseIdentifier, for: indexPath) as? TableViewCellWithLabelSubLabelAndSwitch<TableViewCellWithLabelSubLabelAndSwitchView> else {
|
||||
return UITableViewCell()
|
||||
}
|
||||
cell.selectionStyle = .none
|
||||
if let viewModel = viewModel as? EnterNewRoomDetailsViewModel {
|
||||
cell.setupView(parent: self, rootView: TableViewCellWithLabelSubLabelAndSwitchView(viewModel: viewModel, toggleText: row.text ?? "", subText: row.subText ?? "", onValueChanged: { newToggleValue in
|
||||
onValueChanged?(newToggleValue)
|
||||
}))
|
||||
} else {
|
||||
return UITableViewCell()
|
||||
}
|
||||
|
||||
return cell
|
||||
}
|
||||
}
|
||||
@@ -600,6 +633,20 @@ extension EnterNewRoomDetailsViewController: EnterNewRoomDetailsViewModelViewDel
|
||||
func enterNewRoomDetailsViewModel(_ viewModel: EnterNewRoomDetailsViewModelType, didUpdateViewState viewSate: EnterNewRoomDetailsViewState) {
|
||||
self.render(viewState: viewSate)
|
||||
}
|
||||
|
||||
// bwi: #4846 add serverACLRule on roomcreation
|
||||
func showDeactivateFederationForRoomErrorAlert() {
|
||||
let alert = UIAlertController(title: BWIL10n.createRoomDeactivateFederationForRoomErrorTitle,
|
||||
message: BWIL10n.createRoomDeactivateFederationForRoomErrorText,
|
||||
preferredStyle: .alert)
|
||||
|
||||
let closeAction = UIAlertAction(title: BWIL10n.createRoomDeactivateFederationAlertDismissButton, style: .default, handler: { _ in
|
||||
})
|
||||
|
||||
alert.addAction(closeAction)
|
||||
|
||||
present(alert, animated: true, completion: nil)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - UITextFieldDelegate
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
final class EnterNewRoomDetailsViewModel: EnterNewRoomDetailsViewModelType {
|
||||
final class EnterNewRoomDetailsViewModel: EnterNewRoomDetailsViewModelType, ObservableObject {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
@@ -36,6 +36,9 @@ final class EnterNewRoomDetailsViewModel: EnterNewRoomDetailsViewModelType {
|
||||
weak var coordinatorDelegate: EnterNewRoomDetailsViewModelCoordinatorDelegate?
|
||||
var roomCreationParameters: RoomCreationParameters = RoomCreationParameters()
|
||||
|
||||
// bwi: #4846 add serverACLRule on roomcreation
|
||||
@Published var serverACLToggleValue: Bool = false
|
||||
|
||||
private(set) var viewState: EnterNewRoomDetailsViewState {
|
||||
didSet {
|
||||
self.viewDelegate?.enterNewRoomDetailsViewModel(self, didUpdateViewState: viewState)
|
||||
@@ -54,6 +57,11 @@ final class EnterNewRoomDetailsViewModel: EnterNewRoomDetailsViewModelType {
|
||||
roomCreationParameters.isEncrypted = session.vc_homeserverConfiguration().encryption.isE2EEByDefaultEnabled && RiotSettings.shared.roomCreationScreenRoomIsEncrypted
|
||||
roomCreationParameters.joinRule = RiotSettings.shared.roomCreationScreenRoomIsPublic ? .public : .private
|
||||
viewState = .loaded
|
||||
|
||||
// bwi: #4846 add serverACLRule on roomcreation
|
||||
if BWIBuildSettings.shared.isFederationEnabled {
|
||||
updateServerACLRule()
|
||||
}
|
||||
}
|
||||
|
||||
deinit {
|
||||
@@ -75,6 +83,9 @@ final class EnterNewRoomDetailsViewModel: EnterNewRoomDetailsViewModelType {
|
||||
self.coordinatorDelegate?.enterNewRoomDetailsViewModelDidCancel(self)
|
||||
case .create:
|
||||
self.createRoom()
|
||||
// bwi: #4846 add serverACLRule on roomcreation
|
||||
case .updateServerACLRule:
|
||||
self.updateServerACLRule()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -129,6 +140,7 @@ final class EnterNewRoomDetailsViewModel: EnterNewRoomDetailsViewModelType {
|
||||
parentRoomId: parentSpace?.spaceId,
|
||||
aliasLocalPart: fixRoomAlias(alias: roomCreationParameters.address),
|
||||
isEncrypted: roomCreationParameters.isEncrypted,
|
||||
serverACLRule: roomCreationParameters.serverACLRule,
|
||||
completion: { response in
|
||||
switch response {
|
||||
case .success(let room):
|
||||
@@ -203,6 +215,25 @@ final class EnterNewRoomDetailsViewModel: EnterNewRoomDetailsViewModelType {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// bwi: #4846 add serverACLRule on roomcreation
|
||||
private func updateServerACLRule() {
|
||||
var allowedServers = [String]()
|
||||
if serverACLToggleValue {
|
||||
// Room is federated, allow other user from other servers to join the room
|
||||
allowedServers.append("*")
|
||||
} else {
|
||||
if let host = URLComponents(string: session.homeserverWellknown.homeServer.baseUrl)?.host {
|
||||
// Room is not federated, only user from the same homeserver can join the room
|
||||
allowedServers.append(host)
|
||||
} else {
|
||||
serverACLToggleValue = true
|
||||
self.viewDelegate?.showDeactivateFederationForRoomErrorAlert()
|
||||
}
|
||||
}
|
||||
|
||||
roomCreationParameters.serverACLRule = MXRoomServerACLRule(allow: allowedServers)
|
||||
}
|
||||
|
||||
private func cancelOperations() {
|
||||
self.currentOperation?.cancel()
|
||||
|
||||
@@ -20,6 +20,7 @@ import Foundation
|
||||
|
||||
protocol EnterNewRoomDetailsViewModelViewDelegate: AnyObject {
|
||||
func enterNewRoomDetailsViewModel(_ viewModel: EnterNewRoomDetailsViewModelType, didUpdateViewState viewSate: EnterNewRoomDetailsViewState)
|
||||
func showDeactivateFederationForRoomErrorAlert() // bwi: #4846
|
||||
}
|
||||
|
||||
protocol EnterNewRoomDetailsViewModelCoordinatorDelegate: AnyObject {
|
||||
|
||||
@@ -38,6 +38,7 @@ struct RoomCreationParameters {
|
||||
}
|
||||
}
|
||||
}
|
||||
var serverACLRule: MXRoomServerACLRule? // bwi: #4846
|
||||
var showInDirectory: Bool = false
|
||||
var isRoomSuggested: Bool = false
|
||||
|
||||
|
||||
Reference in New Issue
Block a user