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:
JanNiklas Grabowski
2023-12-08 09:37:45 +00:00
10 changed files with 229 additions and 3 deletions
@@ -22,6 +22,7 @@ import UIKit
enum EnterNewRoomDetailsViewAction {
case loadData
case chooseAvatar(sourceView: UIView)
case updateServerACLRule // bwi: #4846
case removeAvatar
case cancel
case create
@@ -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