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:
Gil Eluard 2021-09-02 07:51:55 +03:00
commit 20fd906a13
28 changed files with 419 additions and 354 deletions

View file

@ -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 :

View file

@ -77,4 +77,9 @@
return roomEncryptionTrustLevel;
}
- (BOOL)isJoined
{
return self.membership == MXMembershipJoin || self.membershipTransitionState == MXMembershipTransitionStateJoined;
}
@end

View file

@ -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"

View file

@ -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
}
}
}

View file

@ -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)
}
}

View file

@ -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)
}

View file

@ -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)
}
}

View file

@ -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?
}

View file

@ -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 }
}

View file

@ -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?)

View file

@ -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"/>

View file

@ -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)
}
}

View file

@ -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() {

View file

@ -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)
}

View file

@ -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])

View file

@ -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
}
})
}

View file

@ -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)
}
}

View file

@ -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 }
}

View file

@ -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)
}

View file

@ -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)
}
}

View file

@ -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
}

View file

@ -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 }
}

View file

@ -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

View file

@ -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"/>

View file

@ -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

View file

@ -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() {

View file

@ -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)
}

View file

@ -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)