mirror of
https://github.com/vector-im/element-ios.git
synced 2024-09-28 23:32:41 +00:00
Merge branch 'gil/4571_explore_rooms' into gil/4682_browsing_users_in_a_space
# Conflicts: # Riot/Modules/SideMenu/SideMenuCoordinator.swift
This commit is contained in:
commit
20fd906a13
28 changed files with 419 additions and 354 deletions
|
@ -32,6 +32,8 @@ typedef NS_ENUM(NSUInteger, RoomEncryptionTrustLevel) {
|
|||
*/
|
||||
@interface MXRoomSummary (Riot)
|
||||
|
||||
@property(nonatomic, readonly) BOOL isJoined;
|
||||
|
||||
/**
|
||||
Set the room avatar in the dedicated MXKImageView.
|
||||
The riot style implies to use in order :
|
||||
|
|
|
@ -77,4 +77,9 @@
|
|||
return roomEncryptionTrustLevel;
|
||||
}
|
||||
|
||||
- (BOOL)isJoined
|
||||
{
|
||||
return self.membership == MXMembershipJoin || self.membershipTransitionState == MXMembershipTransitionStateJoined;
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
|
@ -234,16 +234,6 @@ internal enum StoryboardScene {
|
|||
|
||||
internal static let searchableDirectoryViewController = SceneType<Riot.ShowDirectoryViewController>(storyboard: ShowDirectoryViewController.self, identifier: "SearchableDirectoryViewController")
|
||||
}
|
||||
internal enum ShowSpaceChildRoomDetailViewController: StoryboardType {
|
||||
internal static let storyboardName = "ShowSpaceChildRoomDetailViewController"
|
||||
|
||||
internal static let initialScene = InitialSceneType<Riot.ShowSpaceChildRoomDetailViewController>(storyboard: ShowSpaceChildRoomDetailViewController.self)
|
||||
}
|
||||
internal enum ShowSpaceExploreRoomViewController: StoryboardType {
|
||||
internal static let storyboardName = "ShowSpaceExploreRoomViewController"
|
||||
|
||||
internal static let initialScene = InitialSceneType<Riot.ShowSpaceExploreRoomViewController>(storyboard: ShowSpaceExploreRoomViewController.self)
|
||||
}
|
||||
internal enum SideMenuViewController: StoryboardType {
|
||||
internal static let storyboardName = "SideMenuViewController"
|
||||
|
||||
|
@ -254,6 +244,16 @@ internal enum StoryboardScene {
|
|||
|
||||
internal static let initialScene = InitialSceneType<Riot.SimpleScreenTemplateViewController>(storyboard: SimpleScreenTemplateViewController.self)
|
||||
}
|
||||
internal enum SpaceChildRoomDetailViewController: StoryboardType {
|
||||
internal static let storyboardName = "SpaceChildRoomDetailViewController"
|
||||
|
||||
internal static let initialScene = InitialSceneType<Riot.SpaceChildRoomDetailViewController>(storyboard: SpaceChildRoomDetailViewController.self)
|
||||
}
|
||||
internal enum SpaceExploreRoomViewController: StoryboardType {
|
||||
internal static let storyboardName = "SpaceExploreRoomViewController"
|
||||
|
||||
internal static let initialScene = InitialSceneType<Riot.SpaceExploreRoomViewController>(storyboard: SpaceExploreRoomViewController.self)
|
||||
}
|
||||
internal enum SpaceFeatureUnaivableViewController: StoryboardType {
|
||||
internal static let storyboardName = "SpaceFeatureUnaivableViewController"
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@ class SideMenuCoordinatorParameters {
|
|||
}
|
||||
}
|
||||
|
||||
final class SideMenuCoordinator: SideMenuCoordinatorType {
|
||||
final class SideMenuCoordinator: NSObject, SideMenuCoordinatorType {
|
||||
|
||||
// MARK: - Constants
|
||||
|
||||
|
@ -61,7 +61,7 @@ final class SideMenuCoordinator: SideMenuCoordinatorType {
|
|||
|
||||
let spaceMenuPresenter = SpaceMenuPresenter()
|
||||
|
||||
private var exploreRoomCoordimator: ExploreRoomCoordinatorBridgePresenter?
|
||||
private var exploreRoomCoordinator: ExploreRoomCoordinator?
|
||||
private var memberListCoordinator: SpaceMemberListCoordinatorBridgePresenter?
|
||||
|
||||
// MARK: Public
|
||||
|
@ -206,6 +206,17 @@ final class SideMenuCoordinator: SideMenuCoordinatorType {
|
|||
self.sideMenuNavigationViewController.present(safariViewController, animated: true, completion: nil)
|
||||
}
|
||||
|
||||
private func showExploreRooms(spaceId: String, session: MXSession) {
|
||||
let exploreRoomCoordinator = ExploreRoomCoordinator(session: session, spaceId: spaceId)
|
||||
exploreRoomCoordinator.delegate = self
|
||||
let presentable = exploreRoomCoordinator.toPresentable()
|
||||
presentable.presentationController?.delegate = self
|
||||
self.sideMenuViewController.present(presentable, animated: true, completion: nil)
|
||||
exploreRoomCoordinator.start()
|
||||
|
||||
self.exploreRoomCoordinator = exploreRoomCoordinator
|
||||
}
|
||||
|
||||
private func showInviteFriends(from sourceView: UIView?) {
|
||||
let myUserId = self.parameters.userSessionsService.mainUserSession?.userId ?? ""
|
||||
|
||||
|
@ -221,6 +232,14 @@ final class SideMenuCoordinator: SideMenuCoordinatorType {
|
|||
self.spaceMenuPresenter.present(forSpaceWithId: spaceId, from: self.sideMenuViewController, sourceView: sourceView, session: session, animated: true)
|
||||
}
|
||||
|
||||
func navigate(to item: SpaceExploreRoomListItemViewData, from sourceView: UIView?) {
|
||||
if item.childInfo.roomType == .space {
|
||||
self.exploreRoomCoordinator?.pushSpace(with: item)
|
||||
} else if item.childInfo.roomType == .room {
|
||||
self.exploreRoomCoordinator?.presentRoom(with: item, from: sourceView)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: UserSessions management
|
||||
|
||||
private func registerUserSessionsServiceNotifications() {
|
||||
|
@ -299,9 +318,7 @@ extension SideMenuCoordinator: SpaceMenuPresenterDelegate {
|
|||
presenter.dismiss(animated: false) {
|
||||
switch action {
|
||||
case .exploreRooms:
|
||||
self.exploreRoomCoordimator = ExploreRoomCoordinatorBridgePresenter(session: session, spaceId: spaceId)
|
||||
self.exploreRoomCoordimator?.delegate = self
|
||||
self.exploreRoomCoordimator?.present(from: self.sideMenuNavigationViewController, animated: true)
|
||||
self.showExploreRooms(spaceId: spaceId, session: session)
|
||||
case .exploreMembers:
|
||||
self.memberListCoordinator = SpaceMemberListCoordinatorBridgePresenter(session: session, spaceId: spaceId)
|
||||
self.memberListCoordinator?.delegate = self
|
||||
|
@ -311,11 +328,26 @@ extension SideMenuCoordinator: SpaceMenuPresenterDelegate {
|
|||
}
|
||||
}
|
||||
|
||||
// MARK: - ExploreRoomCoordinatorBridgePresenterDelegate
|
||||
extension SideMenuCoordinator: ExploreRoomCoordinatorBridgePresenterDelegate {
|
||||
func exploreRoomCoordinatorBridgePresenterDelegateDidComplete(_ coordinatorBridgePresenter: ExploreRoomCoordinatorBridgePresenter) {
|
||||
self.exploreRoomCoordimator = nil
|
||||
coordinatorBridgePresenter.dismiss(animated: true, completion: nil)
|
||||
// MARK: - ExploreRoomCoordinatorDelegate
|
||||
extension SideMenuCoordinator: ExploreRoomCoordinatorDelegate {
|
||||
func exploreRoomCoordinatorDidComplete(_ coordinator: ExploreRoomCoordinatorType, withSelectedIem item: SpaceExploreRoomListItemViewData?, from sourceView: UIView?) {
|
||||
guard let item = item else {
|
||||
self.exploreRoomCoordinator?.toPresentable().dismiss(animated: true) {
|
||||
self.exploreRoomCoordinator = nil
|
||||
}
|
||||
return
|
||||
}
|
||||
self.navigate(to: item, from: sourceView)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - UIAdaptivePresentationControllerDelegate
|
||||
extension SideMenuCoordinator: UIAdaptivePresentationControllerDelegate {
|
||||
|
||||
func exploreRoomCoordinatorDidComplete(_ presentationController: UIPresentationController) {
|
||||
self.exploreRoomCoordinator?.toPresentable().dismiss(animated: true) {
|
||||
self.exploreRoomCoordinator = nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,72 +0,0 @@
|
|||
// File created from ScreenTemplate
|
||||
// $ createScreen.sh Spaces/SpaceRoomList/ExploreRoom ShowSpaceExploreRoom
|
||||
/*
|
||||
Copyright 2021 New Vector Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import Foundation
|
||||
import UIKit
|
||||
|
||||
final class ShowSpaceExploreRoomCoordinator: ShowSpaceExploreRoomCoordinatorType {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
// MARK: Private
|
||||
|
||||
private let session: MXSession
|
||||
private let spaceId: String
|
||||
private var showSpaceExploreRoomViewModel: ShowSpaceExploreRoomViewModelType
|
||||
private let showSpaceExploreRoomViewController: ShowSpaceExploreRoomViewController
|
||||
|
||||
// MARK: Public
|
||||
|
||||
// Must be used only internally
|
||||
var childCoordinators: [Coordinator] = []
|
||||
|
||||
weak var delegate: ShowSpaceExploreRoomCoordinatorDelegate?
|
||||
|
||||
// MARK: - Setup
|
||||
|
||||
init(session: MXSession, spaceId: String, spaceName: String?) {
|
||||
self.session = session
|
||||
self.spaceId = spaceId
|
||||
|
||||
let showSpaceExploreRoomViewModel = ShowSpaceExploreRoomViewModel(session: self.session, spaceId: self.spaceId, spaceName: spaceName)
|
||||
let showSpaceExploreRoomViewController = ShowSpaceExploreRoomViewController.instantiate(with: showSpaceExploreRoomViewModel)
|
||||
self.showSpaceExploreRoomViewModel = showSpaceExploreRoomViewModel
|
||||
self.showSpaceExploreRoomViewController = showSpaceExploreRoomViewController
|
||||
}
|
||||
|
||||
// MARK: - Public methods
|
||||
|
||||
func start() {
|
||||
self.showSpaceExploreRoomViewModel.coordinatorDelegate = self
|
||||
}
|
||||
|
||||
func toPresentable() -> UIViewController {
|
||||
return self.showSpaceExploreRoomViewController
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - ShowSpaceExploreRoomViewModelCoordinatorDelegate
|
||||
extension ShowSpaceExploreRoomCoordinator: ShowSpaceExploreRoomViewModelCoordinatorDelegate {
|
||||
func showSpaceExploreRoomViewModel(_ viewModel: ShowSpaceExploreRoomViewModelType, didSelect item: SpaceExploreRoomListItemViewData, from sourceView: UIView?) {
|
||||
self.delegate?.showSpaceExploreRoomCoordinator(self, didSelect: item, from: sourceView)
|
||||
}
|
||||
|
||||
func showSpaceExploreRoomViewModelDidCancel(_ viewModel: ShowSpaceExploreRoomViewModelType) {
|
||||
self.delegate?.showSpaceExploreRoomCoordinatorDidCancel(self)
|
||||
}
|
||||
}
|
|
@ -1,37 +0,0 @@
|
|||
// File created from ScreenTemplate
|
||||
// $ createScreen.sh Spaces/SpaceRoomList/ExploreRoom ShowSpaceExploreRoom
|
||||
/*
|
||||
Copyright 2021 New Vector Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import Foundation
|
||||
|
||||
protocol ShowSpaceExploreRoomViewModelViewDelegate: AnyObject {
|
||||
func showSpaceExploreRoomViewModel(_ viewModel: ShowSpaceExploreRoomViewModelType, didUpdateViewState viewSate: ShowSpaceExploreRoomViewState)
|
||||
}
|
||||
|
||||
protocol ShowSpaceExploreRoomViewModelCoordinatorDelegate: AnyObject {
|
||||
func showSpaceExploreRoomViewModel(_ viewModel: ShowSpaceExploreRoomViewModelType, didSelect item: SpaceExploreRoomListItemViewData, from sourceView: UIView?)
|
||||
func showSpaceExploreRoomViewModelDidCancel(_ viewModel: ShowSpaceExploreRoomViewModelType)
|
||||
}
|
||||
|
||||
/// Protocol describing the view model used by `ShowSpaceExploreRoomViewController`
|
||||
protocol ShowSpaceExploreRoomViewModelType {
|
||||
|
||||
var viewDelegate: ShowSpaceExploreRoomViewModelViewDelegate? { get set }
|
||||
var coordinatorDelegate: ShowSpaceExploreRoomViewModelCoordinatorDelegate? { get set }
|
||||
|
||||
func process(viewAction: ShowSpaceExploreRoomViewAction)
|
||||
}
|
|
@ -0,0 +1,67 @@
|
|||
// File created from ScreenTemplate
|
||||
// $ createScreen.sh Spaces/SpaceRoomList/ExploreRoom ShowSpaceExploreRoom
|
||||
/*
|
||||
Copyright 2021 New Vector Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import Foundation
|
||||
import UIKit
|
||||
|
||||
final class SpaceExploreRoomCoordinator: SpaceExploreRoomCoordinatorType {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
// MARK: Private
|
||||
|
||||
private var spaceExploreRoomViewModel: SpaceExploreRoomViewModelType
|
||||
private let spaceExploreRoomViewController: SpaceExploreRoomViewController
|
||||
|
||||
// MARK: Public
|
||||
|
||||
// Must be used only internally
|
||||
var childCoordinators: [Coordinator] = []
|
||||
|
||||
weak var delegate: SpaceExploreRoomCoordinatorDelegate?
|
||||
|
||||
// MARK: - Setup
|
||||
|
||||
init(parameters: SpaceExploreRoomCoordinatorParameters) {
|
||||
let spaceExploreRoomViewModel = SpaceExploreRoomViewModel(parameters: parameters)
|
||||
let spaceExploreRoomViewController = SpaceExploreRoomViewController.instantiate(with: spaceExploreRoomViewModel)
|
||||
self.spaceExploreRoomViewModel = spaceExploreRoomViewModel
|
||||
self.spaceExploreRoomViewController = spaceExploreRoomViewController
|
||||
}
|
||||
|
||||
// MARK: - Public methods
|
||||
|
||||
func start() {
|
||||
self.spaceExploreRoomViewModel.coordinatorDelegate = self
|
||||
}
|
||||
|
||||
func toPresentable() -> UIViewController {
|
||||
return self.spaceExploreRoomViewController
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - SpaceExploreRoomViewModelCoordinatorDelegate
|
||||
extension SpaceExploreRoomCoordinator: SpaceExploreRoomViewModelCoordinatorDelegate {
|
||||
func spaceExploreRoomViewModel(_ viewModel: SpaceExploreRoomViewModelType, didSelect item: SpaceExploreRoomListItemViewData, from sourceView: UIView?) {
|
||||
self.delegate?.spaceExploreRoomCoordinator(self, didSelect: item, from: sourceView)
|
||||
}
|
||||
|
||||
func spaceExploreRoomViewModelDidCancel(_ viewModel: SpaceExploreRoomViewModelType) {
|
||||
self.delegate?.spaceExploreRoomCoordinatorDidCancel(self)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
//
|
||||
// Copyright 2021 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
struct SpaceExploreRoomCoordinatorParameters {
|
||||
let session: MXSession
|
||||
let spaceId: String
|
||||
let spaceName: String?
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
// File created from ScreenTemplate
|
||||
// $ createScreen.sh Spaces/SpaceRoomList/ExploreRoom ShowSpaceExploreRoom
|
||||
/*
|
||||
Copyright 2021 New Vector Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import Foundation
|
||||
|
||||
protocol SpaceExploreRoomCoordinatorDelegate: AnyObject {
|
||||
func spaceExploreRoomCoordinator(_ coordinator: SpaceExploreRoomCoordinatorType, didSelect item: SpaceExploreRoomListItemViewData, from sourceView: UIView?)
|
||||
func spaceExploreRoomCoordinatorDidCancel(_ coordinator: SpaceExploreRoomCoordinatorType)
|
||||
}
|
||||
|
||||
/// `SpaceExploreRoomCoordinatorType` is a protocol describing a Coordinator that handle key backup setup passphrase navigation flow.
|
||||
protocol SpaceExploreRoomCoordinatorType: Coordinator, Presentable {
|
||||
var delegate: SpaceExploreRoomCoordinatorDelegate? { get }
|
||||
}
|
|
@ -18,8 +18,8 @@
|
|||
|
||||
import Foundation
|
||||
|
||||
/// ShowSpaceExploreRoomViewController view actions exposed to view model
|
||||
enum ShowSpaceExploreRoomViewAction {
|
||||
/// SpaceExploreRoomViewController view actions exposed to view model
|
||||
enum SpaceExploreRoomViewAction {
|
||||
case loadData
|
||||
case complete(_ selectedItem: SpaceExploreRoomListItemViewData, _ sourceView: UIView?)
|
||||
case searchChanged(_ text: String?)
|
|
@ -9,10 +9,10 @@
|
|||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--Show Space Explore Room View Controller-->
|
||||
<!--Space Explore Room View Controller-->
|
||||
<scene sceneID="mt5-wz-YKA">
|
||||
<objects>
|
||||
<viewController extendedLayoutIncludesOpaqueBars="YES" automaticallyAdjustsScrollViewInsets="NO" id="V8j-Lb-PgC" customClass="ShowSpaceExploreRoomViewController" customModule="Riot" customModuleProvider="target" sceneMemberID="viewController">
|
||||
<viewController extendedLayoutIncludesOpaqueBars="YES" automaticallyAdjustsScrollViewInsets="NO" id="V8j-Lb-PgC" customClass="SpaceExploreRoomViewController" customModule="Riot" customModuleProvider="target" sceneMemberID="viewController">
|
||||
<view key="view" contentMode="scaleToFill" id="EL9-GA-lwo">
|
||||
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
|
@ -18,7 +18,7 @@
|
|||
|
||||
import UIKit
|
||||
|
||||
final class ShowSpaceExploreRoomViewController: UIViewController {
|
||||
final class SpaceExploreRoomViewController: UIViewController {
|
||||
|
||||
// MARK: - Constants
|
||||
|
||||
|
@ -33,7 +33,7 @@ final class ShowSpaceExploreRoomViewController: UIViewController {
|
|||
|
||||
// MARK: Private
|
||||
|
||||
private var viewModel: ShowSpaceExploreRoomViewModelType!
|
||||
private var viewModel: SpaceExploreRoomViewModelType!
|
||||
private var theme: Theme!
|
||||
private var keyboardAvoider: KeyboardAvoider?
|
||||
private var errorPresenter: MXKErrorPresentation!
|
||||
|
@ -63,8 +63,8 @@ final class ShowSpaceExploreRoomViewController: UIViewController {
|
|||
|
||||
// MARK: - Setup
|
||||
|
||||
class func instantiate(with viewModel: ShowSpaceExploreRoomViewModelType) -> ShowSpaceExploreRoomViewController {
|
||||
let viewController = StoryboardScene.ShowSpaceExploreRoomViewController.initialScene.instantiate()
|
||||
class func instantiate(with viewModel: SpaceExploreRoomViewModelType) -> SpaceExploreRoomViewController {
|
||||
let viewController = StoryboardScene.SpaceExploreRoomViewController.initialScene.instantiate()
|
||||
viewController.viewModel = viewModel
|
||||
viewController.theme = ThemeService.shared().theme
|
||||
viewController.emptyView = RootTabEmptyView.instantiate()
|
||||
|
@ -171,7 +171,7 @@ final class ShowSpaceExploreRoomViewController: UIViewController {
|
|||
self.tableView.tableFooterView = UIView()
|
||||
}
|
||||
|
||||
private func render(viewState: ShowSpaceExploreRoomViewState) {
|
||||
private func render(viewState: SpaceExploreRoomViewState) {
|
||||
switch viewState {
|
||||
case .loading:
|
||||
self.renderLoading()
|
||||
|
@ -233,7 +233,7 @@ final class ShowSpaceExploreRoomViewController: UIViewController {
|
|||
}
|
||||
|
||||
// MARK: - UITableViewDataSource
|
||||
extension ShowSpaceExploreRoomViewController: UITableViewDataSource {
|
||||
extension SpaceExploreRoomViewController: UITableViewDataSource {
|
||||
|
||||
func numberOfSections(in tableView: UITableView) -> Int {
|
||||
return 1
|
||||
|
@ -257,17 +257,17 @@ extension ShowSpaceExploreRoomViewController: UITableViewDataSource {
|
|||
}
|
||||
|
||||
// MARK: - UITableViewDelegate
|
||||
extension ShowSpaceExploreRoomViewController: UITableViewDelegate {
|
||||
extension SpaceExploreRoomViewController: UITableViewDelegate {
|
||||
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
||||
tableView.deselectRow(at: indexPath, animated: true)
|
||||
self.viewModel.process(viewAction: .complete(self.itemDataList[indexPath.row], tableView.cellForRow(at: indexPath)))
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - ShowSpaceExploreRoomViewModelViewDelegate
|
||||
extension ShowSpaceExploreRoomViewController: ShowSpaceExploreRoomViewModelViewDelegate {
|
||||
// MARK: - SpaceExploreRoomViewModelViewDelegate
|
||||
extension SpaceExploreRoomViewController: SpaceExploreRoomViewModelViewDelegate {
|
||||
|
||||
func showSpaceExploreRoomViewModel(_ viewModel: ShowSpaceExploreRoomViewModelType, didUpdateViewState viewSate: ShowSpaceExploreRoomViewState) {
|
||||
func spaceExploreRoomViewModel(_ viewModel: SpaceExploreRoomViewModelType, didUpdateViewState viewSate: SpaceExploreRoomViewState) {
|
||||
self.render(viewState: viewSate)
|
||||
}
|
||||
}
|
|
@ -18,7 +18,7 @@
|
|||
|
||||
import Foundation
|
||||
|
||||
final class ShowSpaceExploreRoomViewModel: ShowSpaceExploreRoomViewModelType {
|
||||
final class SpaceExploreRoomViewModel: SpaceExploreRoomViewModelType {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
|
@ -56,15 +56,15 @@ final class ShowSpaceExploreRoomViewModel: ShowSpaceExploreRoomViewModelType {
|
|||
|
||||
// MARK: Public
|
||||
|
||||
weak var viewDelegate: ShowSpaceExploreRoomViewModelViewDelegate?
|
||||
weak var coordinatorDelegate: ShowSpaceExploreRoomViewModelCoordinatorDelegate?
|
||||
weak var viewDelegate: SpaceExploreRoomViewModelViewDelegate?
|
||||
weak var coordinatorDelegate: SpaceExploreRoomViewModelCoordinatorDelegate?
|
||||
|
||||
// MARK: - Setup
|
||||
|
||||
init(session: MXSession, spaceId: String, spaceName: String?) {
|
||||
self.session = session
|
||||
self.spaceId = spaceId
|
||||
self.spaceName = spaceName
|
||||
init(parameters: SpaceExploreRoomCoordinatorParameters) {
|
||||
self.session = parameters.session
|
||||
self.spaceId = parameters.spaceId
|
||||
self.spaceName = parameters.spaceName
|
||||
}
|
||||
|
||||
deinit {
|
||||
|
@ -73,15 +73,15 @@ final class ShowSpaceExploreRoomViewModel: ShowSpaceExploreRoomViewModelType {
|
|||
|
||||
// MARK: - Public
|
||||
|
||||
func process(viewAction: ShowSpaceExploreRoomViewAction) {
|
||||
func process(viewAction: SpaceExploreRoomViewAction) {
|
||||
switch viewAction {
|
||||
case .loadData:
|
||||
self.loadData()
|
||||
case .complete(let selectedItem, let sourceView):
|
||||
self.coordinatorDelegate?.showSpaceExploreRoomViewModel(self, didSelect: selectedItem, from: sourceView)
|
||||
self.coordinatorDelegate?.spaceExploreRoomViewModel(self, didSelect: selectedItem, from: sourceView)
|
||||
case .cancel:
|
||||
self.cancelOperations()
|
||||
self.coordinatorDelegate?.showSpaceExploreRoomViewModelDidCancel(self)
|
||||
self.coordinatorDelegate?.spaceExploreRoomViewModelDidCancel(self)
|
||||
case .searchChanged(let newText):
|
||||
self.searchKeyword = newText
|
||||
}
|
||||
|
@ -117,8 +117,8 @@ final class ShowSpaceExploreRoomViewModel: ShowSpaceExploreRoomViewModelType {
|
|||
})
|
||||
}
|
||||
|
||||
private func update(viewState: ShowSpaceExploreRoomViewState) {
|
||||
self.viewDelegate?.showSpaceExploreRoomViewModel(self, didUpdateViewState: viewState)
|
||||
private func update(viewState: SpaceExploreRoomViewState) {
|
||||
self.viewDelegate?.spaceExploreRoomViewModel(self, didUpdateViewState: viewState)
|
||||
}
|
||||
|
||||
private func cancelOperations() {
|
|
@ -0,0 +1,37 @@
|
|||
// File created from ScreenTemplate
|
||||
// $ createScreen.sh Spaces/SpaceRoomList/ExploreRoom ShowSpaceExploreRoom
|
||||
/*
|
||||
Copyright 2021 New Vector Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import Foundation
|
||||
|
||||
protocol SpaceExploreRoomViewModelViewDelegate: AnyObject {
|
||||
func spaceExploreRoomViewModel(_ viewModel: SpaceExploreRoomViewModelType, didUpdateViewState viewSate: SpaceExploreRoomViewState)
|
||||
}
|
||||
|
||||
protocol SpaceExploreRoomViewModelCoordinatorDelegate: AnyObject {
|
||||
func spaceExploreRoomViewModel(_ viewModel: SpaceExploreRoomViewModelType, didSelect item: SpaceExploreRoomListItemViewData, from sourceView: UIView?)
|
||||
func spaceExploreRoomViewModelDidCancel(_ viewModel: SpaceExploreRoomViewModelType)
|
||||
}
|
||||
|
||||
/// Protocol describing the view model used by `SpaceExploreRoomViewController`
|
||||
protocol SpaceExploreRoomViewModelType {
|
||||
|
||||
var viewDelegate: SpaceExploreRoomViewModelViewDelegate? { get set }
|
||||
var coordinatorDelegate: SpaceExploreRoomViewModelCoordinatorDelegate? { get set }
|
||||
|
||||
func process(viewAction: SpaceExploreRoomViewAction)
|
||||
}
|
|
@ -18,8 +18,8 @@
|
|||
|
||||
import Foundation
|
||||
|
||||
/// ShowSpaceExploreRoomViewController view state
|
||||
enum ShowSpaceExploreRoomViewState {
|
||||
/// SpaceExploreRoomViewController view state
|
||||
enum SpaceExploreRoomViewState {
|
||||
case loading
|
||||
case spaceNameFound(_ spaceName: String)
|
||||
case loaded(_ children: [SpaceExploreRoomListItemViewData])
|
|
@ -28,7 +28,7 @@ final class ExploreRoomCoordinator: ExploreRoomCoordinatorType {
|
|||
private let navigationRouter: NavigationRouterType
|
||||
private let session: MXSession
|
||||
private let spaceId: String
|
||||
private weak var roomDetailCoordinator: ShowSpaceChildRoomDetailCoordinator?
|
||||
private weak var roomDetailCoordinator: SpaceChildRoomDetailCoordinator?
|
||||
|
||||
private lazy var slidingModalPresenter: SlidingModalPresenter = {
|
||||
return SlidingModalPresenter()
|
||||
|
@ -81,10 +81,7 @@ final class ExploreRoomCoordinator: ExploreRoomCoordinatorType {
|
|||
}
|
||||
|
||||
let summary = self.session.roomSummary(withRoomId: item.childInfo.childRoomId)
|
||||
var isJoined = false
|
||||
if let summary = summary {
|
||||
isJoined = summary.membership == .join || summary.membershipTransitionState == .joined
|
||||
}
|
||||
let isJoined = summary?.isJoined ?? false
|
||||
|
||||
if isJoined {
|
||||
self.navigateTo(roomWith: item.childInfo.childRoomId)
|
||||
|
@ -115,14 +112,14 @@ final class ExploreRoomCoordinator: ExploreRoomCoordinatorType {
|
|||
}
|
||||
}
|
||||
|
||||
private func createShowSpaceExploreRoomCoordinator(session: MXSession, spaceId: String, spaceName: String?) -> ShowSpaceExploreRoomCoordinator {
|
||||
let coordinator = ShowSpaceExploreRoomCoordinator(session: session, spaceId: spaceId, spaceName: spaceName)
|
||||
private func createShowSpaceExploreRoomCoordinator(session: MXSession, spaceId: String, spaceName: String?) -> SpaceExploreRoomCoordinator {
|
||||
let coordinator = SpaceExploreRoomCoordinator(parameters: SpaceExploreRoomCoordinatorParameters(session: session, spaceId: spaceId, spaceName: spaceName))
|
||||
coordinator.delegate = self
|
||||
return coordinator
|
||||
}
|
||||
|
||||
private func createShowSpaceRoomDetailCoordinator(session: MXSession, childInfo: MXSpaceChildInfo) -> ShowSpaceChildRoomDetailCoordinator {
|
||||
let coordinator = ShowSpaceChildRoomDetailCoordinator(session: session, childInfo: childInfo)
|
||||
private func createShowSpaceRoomDetailCoordinator(session: MXSession, childInfo: MXSpaceChildInfo) -> SpaceChildRoomDetailCoordinator {
|
||||
let coordinator = SpaceChildRoomDetailCoordinator(parameters: SpaceChildRoomDetailCoordinatorParameters(session: session, childInfo: childInfo))
|
||||
coordinator.delegate = self
|
||||
return coordinator
|
||||
}
|
||||
|
@ -145,19 +142,19 @@ final class ExploreRoomCoordinator: ExploreRoomCoordinatorType {
|
|||
}
|
||||
|
||||
// MARK: - ShowSpaceExploreRoomCoordinatorDelegate
|
||||
extension ExploreRoomCoordinator: ShowSpaceExploreRoomCoordinatorDelegate {
|
||||
func showSpaceExploreRoomCoordinator(_ coordinator: ShowSpaceExploreRoomCoordinatorType, didSelect item: SpaceExploreRoomListItemViewData, from sourceView: UIView?) {
|
||||
extension ExploreRoomCoordinator: SpaceExploreRoomCoordinatorDelegate {
|
||||
func spaceExploreRoomCoordinator(_ coordinator: SpaceExploreRoomCoordinatorType, didSelect item: SpaceExploreRoomListItemViewData, from sourceView: UIView?) {
|
||||
self.delegate?.exploreRoomCoordinatorDidComplete(self, withSelectedIem: item, from: sourceView)
|
||||
}
|
||||
|
||||
func showSpaceExploreRoomCoordinatorDidCancel(_ coordinator: ShowSpaceExploreRoomCoordinatorType) {
|
||||
func spaceExploreRoomCoordinatorDidCancel(_ coordinator: SpaceExploreRoomCoordinatorType) {
|
||||
self.delegate?.exploreRoomCoordinatorDidComplete(self, withSelectedIem: nil, from: nil)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - ShowSpaceChildRoomDetailCoordinator
|
||||
extension ExploreRoomCoordinator: ShowSpaceChildRoomDetailCoordinatorDelegate {
|
||||
func showSpaceChildRoomDetailCoordinatorDidComplete(_ coordinator: ShowSpaceChildRoomDetailCoordinatorType, openRoomWith roomId: String) {
|
||||
extension ExploreRoomCoordinator: SpaceChildRoomDetailCoordinatorDelegate {
|
||||
func spaceChildRoomDetailCoordinator(_ coordinator: SpaceChildRoomDetailCoordinatorType, didOpenRoomWith roomId: String) {
|
||||
self.navigationRouter.toPresentable().dismiss(animated: true) {
|
||||
if let lastCoordinator = self.roomDetailCoordinator {
|
||||
self.remove(childCoordinator: lastCoordinator)
|
||||
|
@ -166,19 +163,17 @@ extension ExploreRoomCoordinator: ShowSpaceChildRoomDetailCoordinatorDelegate {
|
|||
}
|
||||
}
|
||||
|
||||
func showSpaceChildRoomDetailCoordinatorDidCancel(_ coordinator: ShowSpaceChildRoomDetailCoordinatorType) {
|
||||
func spaceChildRoomDetailCoordinatorDidCancel(_ coordinator: SpaceChildRoomDetailCoordinatorType) {
|
||||
if UIDevice.current.isPhone {
|
||||
slidingModalPresenter.dismiss(animated: true) {
|
||||
if let roomDetailCoordinator = self.roomDetailCoordinator {
|
||||
self.remove(childCoordinator: roomDetailCoordinator)
|
||||
self.roomDetailCoordinator = nil
|
||||
}
|
||||
}
|
||||
} else {
|
||||
self.roomDetailCoordinator?.toPresentable().dismiss(animated: true, completion: {
|
||||
if let roomDetailCoordinator = self.roomDetailCoordinator {
|
||||
self.remove(childCoordinator: roomDetailCoordinator)
|
||||
self.roomDetailCoordinator = nil
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
|
@ -1,76 +0,0 @@
|
|||
// File created from ScreenTemplate
|
||||
// $ createScreen.sh Spaces/SpaceRoomList/SpaceChildRoomDetail ShowSpaceChildRoomDetail
|
||||
/*
|
||||
Copyright 2021 New Vector Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import Foundation
|
||||
import UIKit
|
||||
|
||||
final class ShowSpaceChildRoomDetailCoordinator: ShowSpaceChildRoomDetailCoordinatorType {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
// MARK: Private
|
||||
|
||||
private let session: MXSession
|
||||
private let childInfo: MXSpaceChildInfo
|
||||
private var showSpaceChildRoomDetailViewModel: ShowSpaceChildRoomDetailViewModelType
|
||||
private let showSpaceChildRoomDetailViewController: ShowSpaceChildRoomDetailViewController
|
||||
|
||||
// MARK: Public
|
||||
|
||||
// Must be used only internally
|
||||
var childCoordinators: [Coordinator] = []
|
||||
|
||||
weak var delegate: ShowSpaceChildRoomDetailCoordinatorDelegate?
|
||||
|
||||
// MARK: - Setup
|
||||
|
||||
init(session: MXSession, childInfo: MXSpaceChildInfo) {
|
||||
self.session = session
|
||||
self.childInfo = childInfo
|
||||
|
||||
let showSpaceChildRoomDetailViewModel = ShowSpaceChildRoomDetailViewModel(session: self.session, childInfo: childInfo)
|
||||
let showSpaceChildRoomDetailViewController = ShowSpaceChildRoomDetailViewController.instantiate(with: showSpaceChildRoomDetailViewModel)
|
||||
self.showSpaceChildRoomDetailViewModel = showSpaceChildRoomDetailViewModel
|
||||
self.showSpaceChildRoomDetailViewController = showSpaceChildRoomDetailViewController
|
||||
}
|
||||
|
||||
// MARK: - Public methods
|
||||
|
||||
func start() {
|
||||
self.showSpaceChildRoomDetailViewModel.coordinatorDelegate = self
|
||||
}
|
||||
|
||||
func toPresentable() -> UIViewController {
|
||||
return self.showSpaceChildRoomDetailViewController
|
||||
}
|
||||
|
||||
func toSlidingPresentable() -> UIViewController & SlidingModalPresentable {
|
||||
return self.showSpaceChildRoomDetailViewController
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - ShowSpaceChildRoomDetailViewModelCoordinatorDelegate
|
||||
extension ShowSpaceChildRoomDetailCoordinator: ShowSpaceChildRoomDetailViewModelCoordinatorDelegate {
|
||||
func showSpaceChildRoomDetailViewModelDidComplete(_ viewModel: ShowSpaceChildRoomDetailViewModelType, openRoomWith roomId: String) {
|
||||
self.delegate?.showSpaceChildRoomDetailCoordinatorDidComplete(self, openRoomWith: roomId)
|
||||
}
|
||||
|
||||
func showSpaceChildRoomDetailViewModelDidCancel(_ viewModel: ShowSpaceChildRoomDetailViewModelType) {
|
||||
self.delegate?.showSpaceChildRoomDetailCoordinatorDidCancel(self)
|
||||
}
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
// File created from ScreenTemplate
|
||||
// $ createScreen.sh Spaces/SpaceRoomList/SpaceChildRoomDetail ShowSpaceChildRoomDetail
|
||||
/*
|
||||
Copyright 2021 New Vector Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import Foundation
|
||||
|
||||
protocol ShowSpaceChildRoomDetailCoordinatorDelegate: AnyObject {
|
||||
func showSpaceChildRoomDetailCoordinatorDidComplete(_ coordinator: ShowSpaceChildRoomDetailCoordinatorType, openRoomWith roomId: String)
|
||||
func showSpaceChildRoomDetailCoordinatorDidCancel(_ coordinator: ShowSpaceChildRoomDetailCoordinatorType)
|
||||
}
|
||||
|
||||
/// `ShowSpaceChildRoomDetailCoordinatorType` is a protocol describing a Coordinator that handle key backup setup passphrase navigation flow.
|
||||
protocol ShowSpaceChildRoomDetailCoordinatorType: Coordinator, Presentable {
|
||||
var delegate: ShowSpaceChildRoomDetailCoordinatorDelegate? { get }
|
||||
}
|
|
@ -1,37 +0,0 @@
|
|||
// File created from ScreenTemplate
|
||||
// $ createScreen.sh Spaces/SpaceRoomList/SpaceChildRoomDetail ShowSpaceChildRoomDetail
|
||||
/*
|
||||
Copyright 2021 New Vector Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import Foundation
|
||||
|
||||
protocol ShowSpaceChildRoomDetailViewModelViewDelegate: AnyObject {
|
||||
func showSpaceChildRoomDetailViewModel(_ viewModel: ShowSpaceChildRoomDetailViewModelType, didUpdateViewState viewSate: ShowSpaceChildRoomDetailViewState)
|
||||
}
|
||||
|
||||
protocol ShowSpaceChildRoomDetailViewModelCoordinatorDelegate: AnyObject {
|
||||
func showSpaceChildRoomDetailViewModelDidComplete(_ viewModel: ShowSpaceChildRoomDetailViewModelType, openRoomWith roomId: String)
|
||||
func showSpaceChildRoomDetailViewModelDidCancel(_ viewModel: ShowSpaceChildRoomDetailViewModelType)
|
||||
}
|
||||
|
||||
/// Protocol describing the view model used by `ShowSpaceChildRoomDetailViewController`
|
||||
protocol ShowSpaceChildRoomDetailViewModelType {
|
||||
|
||||
var viewDelegate: ShowSpaceChildRoomDetailViewModelViewDelegate? { get set }
|
||||
var coordinatorDelegate: ShowSpaceChildRoomDetailViewModelCoordinatorDelegate? { get set }
|
||||
|
||||
func process(viewAction: ShowSpaceChildRoomDetailViewAction)
|
||||
}
|
|
@ -0,0 +1,71 @@
|
|||
// File created from ScreenTemplate
|
||||
// $ createScreen.sh Spaces/SpaceRoomList/SpaceChildRoomDetail ShowSpaceChildRoomDetail
|
||||
/*
|
||||
Copyright 2021 New Vector Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import Foundation
|
||||
import UIKit
|
||||
|
||||
final class SpaceChildRoomDetailCoordinator: SpaceChildRoomDetailCoordinatorType {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
// MARK: Private
|
||||
|
||||
private var spaceChildRoomDetailViewModel: SpaceChildRoomDetailViewModelType
|
||||
private let spaceChildRoomDetailViewController: SpaceChildRoomDetailViewController
|
||||
|
||||
// MARK: Public
|
||||
|
||||
// Must be used only internally
|
||||
var childCoordinators: [Coordinator] = []
|
||||
|
||||
weak var delegate: SpaceChildRoomDetailCoordinatorDelegate?
|
||||
|
||||
// MARK: - Setup
|
||||
|
||||
init(parameters: SpaceChildRoomDetailCoordinatorParameters) {
|
||||
let spaceChildRoomDetailViewModel = SpaceChildRoomDetailViewModel(parameters: parameters)
|
||||
let spaceChildRoomDetailViewController = SpaceChildRoomDetailViewController.instantiate(with: spaceChildRoomDetailViewModel)
|
||||
self.spaceChildRoomDetailViewModel = spaceChildRoomDetailViewModel
|
||||
self.spaceChildRoomDetailViewController = spaceChildRoomDetailViewController
|
||||
}
|
||||
|
||||
// MARK: - Public methods
|
||||
|
||||
func start() {
|
||||
self.spaceChildRoomDetailViewModel.coordinatorDelegate = self
|
||||
}
|
||||
|
||||
func toPresentable() -> UIViewController {
|
||||
return self.spaceChildRoomDetailViewController
|
||||
}
|
||||
|
||||
func toSlidingPresentable() -> UIViewController & SlidingModalPresentable {
|
||||
return self.spaceChildRoomDetailViewController
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - SpaceChildRoomDetailViewModelCoordinatorDelegate
|
||||
extension SpaceChildRoomDetailCoordinator: SpaceChildRoomDetailViewModelCoordinatorDelegate {
|
||||
func spaceChildRoomDetailViewModel(_ viewModel: SpaceChildRoomDetailViewModelType, didOpenRoomWith roomId: String) {
|
||||
self.delegate?.spaceChildRoomDetailCoordinator(self, didOpenRoomWith: roomId)
|
||||
}
|
||||
|
||||
func spaceChildRoomDetailViewModelDidCancel(_ viewModel: SpaceChildRoomDetailViewModelType) {
|
||||
self.delegate?.spaceChildRoomDetailCoordinatorDidCancel(self)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
//
|
||||
// Copyright 2021 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
struct SpaceChildRoomDetailCoordinatorParameters {
|
||||
let session: MXSession
|
||||
let childInfo: MXSpaceChildInfo
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
// File created from ScreenTemplate
|
||||
// $ createScreen.sh Spaces/SpaceRoomList/ExploreRoom ShowSpaceExploreRoom
|
||||
// $ createScreen.sh Spaces/SpaceRoomList/SpaceChildRoomDetail ShowSpaceChildRoomDetail
|
||||
/*
|
||||
Copyright 2021 New Vector Ltd
|
||||
|
||||
|
@ -18,12 +18,12 @@
|
|||
|
||||
import Foundation
|
||||
|
||||
protocol ShowSpaceExploreRoomCoordinatorDelegate: AnyObject {
|
||||
func showSpaceExploreRoomCoordinator(_ coordinator: ShowSpaceExploreRoomCoordinatorType, didSelect item: SpaceExploreRoomListItemViewData, from sourceView: UIView?)
|
||||
func showSpaceExploreRoomCoordinatorDidCancel(_ coordinator: ShowSpaceExploreRoomCoordinatorType)
|
||||
protocol SpaceChildRoomDetailCoordinatorDelegate: AnyObject {
|
||||
func spaceChildRoomDetailCoordinator(_ coordinator: SpaceChildRoomDetailCoordinatorType, didOpenRoomWith roomId: String)
|
||||
func spaceChildRoomDetailCoordinatorDidCancel(_ coordinator: SpaceChildRoomDetailCoordinatorType)
|
||||
}
|
||||
|
||||
/// `ShowSpaceExploreRoomCoordinatorType` is a protocol describing a Coordinator that handle key backup setup passphrase navigation flow.
|
||||
protocol ShowSpaceExploreRoomCoordinatorType: Coordinator, Presentable {
|
||||
var delegate: ShowSpaceExploreRoomCoordinatorDelegate? { get }
|
||||
/// `SpaceChildRoomDetailCoordinatorType` is a protocol describing a Coordinator that handle key backup setup passphrase navigation flow.
|
||||
protocol SpaceChildRoomDetailCoordinatorType: Coordinator, Presentable {
|
||||
var delegate: SpaceChildRoomDetailCoordinatorDelegate? { get }
|
||||
}
|
|
@ -18,8 +18,8 @@
|
|||
|
||||
import Foundation
|
||||
|
||||
/// ShowSpaceChildRoomDetailViewController view actions exposed to view model
|
||||
enum ShowSpaceChildRoomDetailViewAction {
|
||||
/// SpaceChildRoomDetailViewController view actions exposed to view model
|
||||
enum SpaceChildRoomDetailViewAction {
|
||||
case loadData
|
||||
case complete
|
||||
case cancel
|
|
@ -8,10 +8,10 @@
|
|||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--Show Space Child Room Detail View Controller-->
|
||||
<!--Space Child Room Detail View Controller-->
|
||||
<scene sceneID="mt5-wz-YKA">
|
||||
<objects>
|
||||
<viewController extendedLayoutIncludesOpaqueBars="YES" automaticallyAdjustsScrollViewInsets="NO" id="V8j-Lb-PgC" customClass="ShowSpaceChildRoomDetailViewController" customModule="Riot" customModuleProvider="target" sceneMemberID="viewController">
|
||||
<viewController extendedLayoutIncludesOpaqueBars="YES" automaticallyAdjustsScrollViewInsets="NO" id="V8j-Lb-PgC" customClass="SpaceChildRoomDetailViewController" customModule="Riot" customModuleProvider="target" sceneMemberID="viewController">
|
||||
<view key="view" contentMode="scaleToFill" id="EL9-GA-lwo">
|
||||
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
|
@ -18,7 +18,7 @@
|
|||
|
||||
import UIKit
|
||||
|
||||
final class ShowSpaceChildRoomDetailViewController: UIViewController {
|
||||
final class SpaceChildRoomDetailViewController: UIViewController {
|
||||
|
||||
// MARK: - Constants
|
||||
|
||||
|
@ -42,15 +42,15 @@ final class ShowSpaceChildRoomDetailViewController: UIViewController {
|
|||
|
||||
// MARK: Private
|
||||
|
||||
private var viewModel: ShowSpaceChildRoomDetailViewModelType!
|
||||
private var viewModel: SpaceChildRoomDetailViewModelType!
|
||||
private var theme: Theme!
|
||||
private var errorPresenter: MXKErrorPresentation!
|
||||
private var activityPresenter: ActivityIndicatorPresenter!
|
||||
|
||||
// MARK: - Setup
|
||||
|
||||
class func instantiate(with viewModel: ShowSpaceChildRoomDetailViewModelType) -> ShowSpaceChildRoomDetailViewController {
|
||||
let viewController = StoryboardScene.ShowSpaceChildRoomDetailViewController.initialScene.instantiate()
|
||||
class func instantiate(with viewModel: SpaceChildRoomDetailViewModelType) -> SpaceChildRoomDetailViewController {
|
||||
let viewController = StoryboardScene.SpaceChildRoomDetailViewController.initialScene.instantiate()
|
||||
viewController.viewModel = viewModel
|
||||
viewController.theme = ThemeService.shared().theme
|
||||
return viewController
|
||||
|
@ -131,7 +131,7 @@ final class ShowSpaceChildRoomDetailViewController: UIViewController {
|
|||
self.joinButton.setTitle(VectorL10n.join, for: .normal)
|
||||
}
|
||||
|
||||
private func render(viewState: ShowSpaceChildRoomDetailViewState) {
|
||||
private func render(viewState: SpaceChildRoomDetailViewState) {
|
||||
switch viewState {
|
||||
case .loading:
|
||||
self.renderLoading()
|
||||
|
@ -177,17 +177,17 @@ final class ShowSpaceChildRoomDetailViewController: UIViewController {
|
|||
}
|
||||
|
||||
|
||||
// MARK: - ShowSpaceChildRoomDetailViewModelViewDelegate
|
||||
extension ShowSpaceChildRoomDetailViewController: ShowSpaceChildRoomDetailViewModelViewDelegate {
|
||||
// MARK: - SpaceChildRoomDetailViewModelViewDelegate
|
||||
extension SpaceChildRoomDetailViewController: SpaceChildRoomDetailViewModelViewDelegate {
|
||||
|
||||
func showSpaceChildRoomDetailViewModel(_ viewModel: ShowSpaceChildRoomDetailViewModelType, didUpdateViewState viewSate: ShowSpaceChildRoomDetailViewState) {
|
||||
func spaceChildRoomDetailViewModel(_ viewModel: SpaceChildRoomDetailViewModelType, didUpdateViewState viewSate: SpaceChildRoomDetailViewState) {
|
||||
self.render(viewState: viewSate)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - SlidingModalPresentable
|
||||
|
||||
extension ShowSpaceChildRoomDetailViewController: SlidingModalPresentable {
|
||||
extension SpaceChildRoomDetailViewController: SlidingModalPresentable {
|
||||
|
||||
func allowsDismissOnBackgroundTap() -> Bool {
|
||||
return true
|
|
@ -18,7 +18,7 @@
|
|||
|
||||
import Foundation
|
||||
|
||||
final class ShowSpaceChildRoomDetailViewModel: ShowSpaceChildRoomDetailViewModelType {
|
||||
final class SpaceChildRoomDetailViewModel: SpaceChildRoomDetailViewModelType {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
|
@ -31,23 +31,19 @@ final class ShowSpaceChildRoomDetailViewModel: ShowSpaceChildRoomDetailViewModel
|
|||
private var userDisplayName: String?
|
||||
private var isRoomJoined: Bool {
|
||||
let summary = self.session.roomSummary(withRoomId: self.childInfo.childRoomId)
|
||||
var isJoined = false
|
||||
if let summary = summary {
|
||||
isJoined = summary.membership == .join || summary.membershipTransitionState == .joined
|
||||
}
|
||||
return isJoined
|
||||
return summary?.isJoined ?? false
|
||||
}
|
||||
|
||||
// MARK: Public
|
||||
|
||||
weak var viewDelegate: ShowSpaceChildRoomDetailViewModelViewDelegate?
|
||||
weak var coordinatorDelegate: ShowSpaceChildRoomDetailViewModelCoordinatorDelegate?
|
||||
weak var viewDelegate: SpaceChildRoomDetailViewModelViewDelegate?
|
||||
weak var coordinatorDelegate: SpaceChildRoomDetailViewModelCoordinatorDelegate?
|
||||
|
||||
// MARK: - Setup
|
||||
|
||||
init(session: MXSession, childInfo: MXSpaceChildInfo) {
|
||||
self.session = session
|
||||
self.childInfo = childInfo
|
||||
init(parameters: SpaceChildRoomDetailCoordinatorParameters) {
|
||||
self.session = parameters.session
|
||||
self.childInfo = parameters.childInfo
|
||||
}
|
||||
|
||||
deinit {
|
||||
|
@ -56,19 +52,19 @@ final class ShowSpaceChildRoomDetailViewModel: ShowSpaceChildRoomDetailViewModel
|
|||
|
||||
// MARK: - Public
|
||||
|
||||
func process(viewAction: ShowSpaceChildRoomDetailViewAction) {
|
||||
func process(viewAction: SpaceChildRoomDetailViewAction) {
|
||||
switch viewAction {
|
||||
case .loadData:
|
||||
self.loadData()
|
||||
case .complete:
|
||||
if self.isRoomJoined {
|
||||
self.coordinatorDelegate?.showSpaceChildRoomDetailViewModelDidComplete(self, openRoomWith: self.childInfo.childRoomId)
|
||||
self.coordinatorDelegate?.spaceChildRoomDetailViewModel(self, didOpenRoomWith: self.childInfo.childRoomId)
|
||||
} else {
|
||||
joinRoom()
|
||||
}
|
||||
case .cancel:
|
||||
self.cancelOperations()
|
||||
self.coordinatorDelegate?.showSpaceChildRoomDetailViewModelDidCancel(self)
|
||||
self.coordinatorDelegate?.spaceChildRoomDetailViewModelDidCancel(self)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -79,8 +75,8 @@ final class ShowSpaceChildRoomDetailViewModel: ShowSpaceChildRoomDetailViewModel
|
|||
self.update(viewState: .loaded(self.childInfo, avatarViewData, self.isRoomJoined))
|
||||
}
|
||||
|
||||
private func update(viewState: ShowSpaceChildRoomDetailViewState) {
|
||||
self.viewDelegate?.showSpaceChildRoomDetailViewModel(self, didUpdateViewState: viewState)
|
||||
private func update(viewState: SpaceChildRoomDetailViewState) {
|
||||
self.viewDelegate?.spaceChildRoomDetailViewModel(self, didUpdateViewState: viewState)
|
||||
}
|
||||
|
||||
private func cancelOperations() {
|
|
@ -0,0 +1,37 @@
|
|||
// File created from ScreenTemplate
|
||||
// $ createScreen.sh Spaces/SpaceRoomList/SpaceChildRoomDetail ShowSpaceChildRoomDetail
|
||||
/*
|
||||
Copyright 2021 New Vector Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import Foundation
|
||||
|
||||
protocol SpaceChildRoomDetailViewModelViewDelegate: AnyObject {
|
||||
func spaceChildRoomDetailViewModel(_ viewModel: SpaceChildRoomDetailViewModelType, didUpdateViewState viewSate: SpaceChildRoomDetailViewState)
|
||||
}
|
||||
|
||||
protocol SpaceChildRoomDetailViewModelCoordinatorDelegate: AnyObject {
|
||||
func spaceChildRoomDetailViewModel(_ viewModel: SpaceChildRoomDetailViewModelType, didOpenRoomWith roomId: String)
|
||||
func spaceChildRoomDetailViewModelDidCancel(_ viewModel: SpaceChildRoomDetailViewModelType)
|
||||
}
|
||||
|
||||
/// Protocol describing the view model used by `SpaceChildRoomDetailViewController`
|
||||
protocol SpaceChildRoomDetailViewModelType {
|
||||
|
||||
var viewDelegate: SpaceChildRoomDetailViewModelViewDelegate? { get set }
|
||||
var coordinatorDelegate: SpaceChildRoomDetailViewModelCoordinatorDelegate? { get set }
|
||||
|
||||
func process(viewAction: SpaceChildRoomDetailViewAction)
|
||||
}
|
|
@ -18,8 +18,8 @@
|
|||
|
||||
import Foundation
|
||||
|
||||
/// ShowSpaceChildRoomDetailViewController view state
|
||||
enum ShowSpaceChildRoomDetailViewState {
|
||||
/// SpaceChildRoomDetailViewController view state
|
||||
enum SpaceChildRoomDetailViewState {
|
||||
case loading
|
||||
case loaded(_ roomInfo: MXSpaceChildInfo, _ avatarViewData: AvatarViewData, _ isJoined: Bool)
|
||||
case error(Error)
|
Loading…
Reference in a new issue