SP2: Adding Rooms to Spaces #523o

- check permission before adding room
- Added join button in explore room screens
This commit is contained in:
Gil Eluard
2022-02-05 08:20:39 +01:00
parent 5025029843
commit cb7b581fc8
13 changed files with 119 additions and 10 deletions
@@ -27,6 +27,7 @@ final class SpaceExploreRoomCoordinator: SpaceExploreRoomCoordinatorType {
private var spaceExploreRoomViewModel: SpaceExploreRoomViewModelType
private let spaceExploreRoomViewController: SpaceExploreRoomViewController
private let parameters: SpaceExploreRoomCoordinatorParameters
// MARK: Public
@@ -42,6 +43,7 @@ final class SpaceExploreRoomCoordinator: SpaceExploreRoomCoordinatorType {
let spaceExploreRoomViewController = SpaceExploreRoomViewController.instantiate(with: spaceExploreRoomViewModel)
self.spaceExploreRoomViewModel = spaceExploreRoomViewModel
self.spaceExploreRoomViewController = spaceExploreRoomViewController
self.parameters = parameters
}
// MARK: - Public methods
@@ -70,6 +72,23 @@ extension SpaceExploreRoomCoordinator: SpaceExploreRoomViewModelCoordinatorDeleg
}
func spaceExploreRoomViewModelDidAddRoom(_ viewModel: SpaceExploreRoomViewModelType) {
self.delegate?.spaceExploreRoomCoordinatorDidAddRoom(self)
guard let space = parameters.session.spaceService.getSpace(withId: parameters.spaceId) else {
showAddRoomMissingPermissionAlert()
return
}
space.canAddRoom { canAddRoom in
if canAddRoom {
self.delegate?.spaceExploreRoomCoordinatorDidAddRoom(self)
} else {
self.showAddRoomMissingPermissionAlert()
}
}
}
private func showAddRoomMissingPermissionAlert() {
let alert = UIAlertController(title: VectorL10n.spacesAddRoom, message: VectorL10n.spacesAddRoomMissingPermissionMessage, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: VectorL10n.ok, style: .default, handler: nil))
self.toPresentable().present(alert, animated: true, completion: nil)
}
}
@@ -20,4 +20,5 @@ struct SpaceExploreRoomCoordinatorParameters {
let session: MXSession
let spaceId: String
let spaceName: String?
let showCancelMenuItem: Bool
}
@@ -24,6 +24,7 @@ enum SpaceExploreRoomViewAction {
case loadData
case complete(_ selectedItem: SpaceExploreRoomListItemViewData, _ sourceView: UIView?)
case searchChanged(_ text: String?)
case join
case cancel
case addRoom
}
@@ -125,12 +125,14 @@ final class SpaceExploreRoomViewController: UIViewController {
}
private func setupViews() {
let cancelBarButtonItem = MXKBarButtonItem(title: VectorL10n.cancel, style: .plain) { [weak self] in
self?.cancelButtonAction()
if viewModel.showCancelMenuItem {
let cancelBarButtonItem = MXKBarButtonItem(title: VectorL10n.cancel, style: .plain) { [weak self] in
self?.cancelButtonAction()
}
self.navigationItem.leftBarButtonItem = cancelBarButtonItem
}
self.navigationItem.rightBarButtonItem = cancelBarButtonItem
self.vc_removeBackTitle()
self.titleView = MainTitleView()
@@ -145,6 +147,18 @@ final class SpaceExploreRoomViewController: UIViewController {
self.setupTableViewHeader()
}
private func setupJoinButton(canJoin: Bool) {
if canJoin {
let joinButtonItem = MXKBarButtonItem(title: VectorL10n.join, style: .done) { [weak self] in
self?.viewModel.process(viewAction: .join)
}
self.navigationItem.rightBarButtonItem = joinButtonItem
} else {
self.navigationItem.rightBarButtonItem = nil
}
}
private func setupTableViewHeader() {
addRoomHeaderView.delegate = self
tableView.tableHeaderView = addRoomHeaderView
@@ -176,6 +190,8 @@ final class SpaceExploreRoomViewController: UIViewController {
self.renderEmptyFilterResult()
case .error(let error):
self.render(error: error)
case .canJoin(let canJoin):
self.setupJoinButton(canJoin: canJoin)
}
}
@@ -17,6 +17,7 @@
*/
import Foundation
import MatrixSDK
final class SpaceExploreRoomViewModel: SpaceExploreRoomViewModelType {
@@ -32,6 +33,11 @@ final class SpaceExploreRoomViewModel: SpaceExploreRoomViewModelType {
private var nextBatch: String?
private var rootSpaceChildInfo: MXSpaceChildInfo?
private var canJoin: Bool = false {
didSet {
self.update(viewState: .canJoin(self.canJoin))
}
}
private var itemDataList: [SpaceExploreRoomListItemViewData] = [] {
didSet {
self.updateFilteredItemList()
@@ -56,21 +62,26 @@ final class SpaceExploreRoomViewModel: SpaceExploreRoomViewModelType {
}
}
private var spaceGraphObserver: Any?
// MARK: Public
weak var viewDelegate: SpaceExploreRoomViewModelViewDelegate?
weak var coordinatorDelegate: SpaceExploreRoomViewModelCoordinatorDelegate?
private(set) var showCancelMenuItem: Bool
// MARK: - Setup
init(parameters: SpaceExploreRoomCoordinatorParameters) {
self.session = parameters.session
self.spaceId = parameters.spaceId
self.spaceName = parameters.spaceName
self.showCancelMenuItem = parameters.showCancelMenuItem
}
deinit {
self.cancelOperations()
}
// MARK: - Public
@@ -91,6 +102,8 @@ final class SpaceExploreRoomViewModel: SpaceExploreRoomViewModelType {
self.searchKeyword = newText
case .addRoom:
self.coordinatorDelegate?.spaceExploreRoomViewModelDidAddRoom(self)
case .join:
self.joinSpace()
}
}
@@ -109,6 +122,8 @@ final class SpaceExploreRoomViewModel: SpaceExploreRoomViewModelType {
self.update(viewState: .loading)
}
self.canJoin = self.session.room(withRoomId: spaceId) == nil
self.currentOperation = self.session.spaceService.getSpaceChildrenForSpace(withId: self.spaceId, suggestedOnly: false, limit: nil, maxDepth: 1, paginationToken: self.nextBatch, completion: { [weak self] response in
guard let self = self else {
return
@@ -158,6 +173,9 @@ final class SpaceExploreRoomViewModel: SpaceExploreRoomViewModelType {
private func cancelOperations() {
self.currentOperation?.cancel()
if let observer = self.spaceGraphObserver {
NotificationCenter.default.removeObserver(observer)
}
}
private func updateFilteredItemList() {
@@ -170,4 +188,26 @@ final class SpaceExploreRoomViewModel: SpaceExploreRoomViewModelType {
return (itemData.childInfo.name?.lowercased().contains(searchKeyword) ?? false) || (itemData.childInfo.topic?.lowercased().contains(searchKeyword) ?? false)
})
}
private func joinSpace() {
self.update(viewState: .loading)
self.currentOperation = session.joinRoom(spaceId) { [weak self] response in
switch response {
case .success:
self?.spaceGraphObserver = NotificationCenter.default.addObserver(forName: MXSpaceService.didBuildSpaceGraph, object: nil, queue: OperationQueue.main, using: { [weak self] notification in
guard let self = self else { return }
self.currentOperation = nil
if let observer = self.spaceGraphObserver {
NotificationCenter.default.removeObserver(observer)
}
self.canJoin = false
self.update(viewState: .loaded(self.filteredItemDataList, self.nextBatch != nil && (self.searchKeyword ?? "").isEmpty))
})
case .failure(let error):
self?.update(viewState: .error(error))
}
}
}
}
@@ -33,6 +33,7 @@ protocol SpaceExploreRoomViewModelType {
var viewDelegate: SpaceExploreRoomViewModelViewDelegate? { get set }
var coordinatorDelegate: SpaceExploreRoomViewModelCoordinatorDelegate? { get set }
var showCancelMenuItem: Bool { get }
func process(viewAction: SpaceExploreRoomViewAction)
}
@@ -23,6 +23,7 @@ enum SpaceExploreRoomViewState {
case loading
case spaceNameFound(_ spaceName: String)
case loaded(_ children: [SpaceExploreRoomListItemViewData], _ hasMore: Bool)
case canJoin(Bool)
case emptySpace
case emptyFilterResult
case error(Error)