diff --git a/Riot/Categories/MXRoomSummary+Riot.h b/Riot/Categories/MXRoomSummary+Riot.h index c69617bf5..0ae7c7359 100644 --- a/Riot/Categories/MXRoomSummary+Riot.h +++ b/Riot/Categories/MXRoomSummary+Riot.h @@ -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 : diff --git a/Riot/Categories/MXRoomSummary+Riot.m b/Riot/Categories/MXRoomSummary+Riot.m index 688f9d2c8..961a51a6e 100644 --- a/Riot/Categories/MXRoomSummary+Riot.m +++ b/Riot/Categories/MXRoomSummary+Riot.m @@ -77,4 +77,9 @@ return roomEncryptionTrustLevel; } +- (BOOL)isJoined +{ + return self.membership == MXMembershipJoin || self.membershipTransitionState == MXMembershipTransitionStateJoined; +} + @end diff --git a/Riot/Generated/Storyboards.swift b/Riot/Generated/Storyboards.swift index 2b7903b2d..43d3d3429 100644 --- a/Riot/Generated/Storyboards.swift +++ b/Riot/Generated/Storyboards.swift @@ -234,16 +234,6 @@ internal enum StoryboardScene { internal static let searchableDirectoryViewController = SceneType(storyboard: ShowDirectoryViewController.self, identifier: "SearchableDirectoryViewController") } - internal enum ShowSpaceChildRoomDetailViewController: StoryboardType { - internal static let storyboardName = "ShowSpaceChildRoomDetailViewController" - - internal static let initialScene = InitialSceneType(storyboard: ShowSpaceChildRoomDetailViewController.self) - } - internal enum ShowSpaceExploreRoomViewController: StoryboardType { - internal static let storyboardName = "ShowSpaceExploreRoomViewController" - - internal static let initialScene = InitialSceneType(storyboard: ShowSpaceExploreRoomViewController.self) - } internal enum SideMenuViewController: StoryboardType { internal static let storyboardName = "SideMenuViewController" @@ -254,6 +244,16 @@ internal enum StoryboardScene { internal static let initialScene = InitialSceneType(storyboard: SimpleScreenTemplateViewController.self) } + internal enum SpaceChildRoomDetailViewController: StoryboardType { + internal static let storyboardName = "SpaceChildRoomDetailViewController" + + internal static let initialScene = InitialSceneType(storyboard: SpaceChildRoomDetailViewController.self) + } + internal enum SpaceExploreRoomViewController: StoryboardType { + internal static let storyboardName = "SpaceExploreRoomViewController" + + internal static let initialScene = InitialSceneType(storyboard: SpaceExploreRoomViewController.self) + } internal enum SpaceFeatureUnaivableViewController: StoryboardType { internal static let storyboardName = "SpaceFeatureUnaivableViewController" diff --git a/Riot/Modules/SideMenu/SideMenuCoordinator.swift b/Riot/Modules/SideMenu/SideMenuCoordinator.swift index 488e48c9b..b2ac5fc9b 100644 --- a/Riot/Modules/SideMenu/SideMenuCoordinator.swift +++ b/Riot/Modules/SideMenu/SideMenuCoordinator.swift @@ -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 + } } } diff --git a/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/ShowSpaceExploreRoomCoordinator.swift b/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/ShowSpaceExploreRoomCoordinator.swift deleted file mode 100644 index 8009b5f45..000000000 --- a/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/ShowSpaceExploreRoomCoordinator.swift +++ /dev/null @@ -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) - } -} diff --git a/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/ShowSpaceExploreRoomViewModelType.swift b/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/ShowSpaceExploreRoomViewModelType.swift deleted file mode 100644 index 090b45972..000000000 --- a/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/ShowSpaceExploreRoomViewModelType.swift +++ /dev/null @@ -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) -} diff --git a/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/SpaceExploreRoomCoordinator.swift b/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/SpaceExploreRoomCoordinator.swift new file mode 100644 index 000000000..9607d9e86 --- /dev/null +++ b/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/SpaceExploreRoomCoordinator.swift @@ -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) + } +} diff --git a/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/SpaceExploreRoomCoordinatorParameters.swift b/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/SpaceExploreRoomCoordinatorParameters.swift new file mode 100644 index 000000000..cc3c97f76 --- /dev/null +++ b/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/SpaceExploreRoomCoordinatorParameters.swift @@ -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? +} diff --git a/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/SpaceExploreRoomCoordinatorType.swift b/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/SpaceExploreRoomCoordinatorType.swift new file mode 100644 index 000000000..b092b17d6 --- /dev/null +++ b/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/SpaceExploreRoomCoordinatorType.swift @@ -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 } +} diff --git a/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/ShowSpaceExploreRoomViewAction.swift b/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/SpaceExploreRoomViewAction.swift similarity index 88% rename from Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/ShowSpaceExploreRoomViewAction.swift rename to Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/SpaceExploreRoomViewAction.swift index 68a3b74c6..aa1e67dc0 100644 --- a/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/ShowSpaceExploreRoomViewAction.swift +++ b/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/SpaceExploreRoomViewAction.swift @@ -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?) diff --git a/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/ShowSpaceExploreRoomViewController.storyboard b/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/SpaceExploreRoomViewController.storyboard similarity index 96% rename from Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/ShowSpaceExploreRoomViewController.storyboard rename to Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/SpaceExploreRoomViewController.storyboard index 5cae98fef..5ccce16d7 100644 --- a/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/ShowSpaceExploreRoomViewController.storyboard +++ b/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/SpaceExploreRoomViewController.storyboard @@ -9,10 +9,10 @@ - + - + diff --git a/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/ShowSpaceExploreRoomViewController.swift b/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/SpaceExploreRoomViewController.swift similarity index 91% rename from Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/ShowSpaceExploreRoomViewController.swift rename to Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/SpaceExploreRoomViewController.swift index 25a234e62..e87b9c1fd 100644 --- a/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/ShowSpaceExploreRoomViewController.swift +++ b/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/SpaceExploreRoomViewController.swift @@ -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) } } diff --git a/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/ShowSpaceExploreRoomViewModel.swift b/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/SpaceExploreRoomViewModel.swift similarity index 82% rename from Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/ShowSpaceExploreRoomViewModel.swift rename to Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/SpaceExploreRoomViewModel.swift index 9831497eb..2e202bc13 100644 --- a/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/ShowSpaceExploreRoomViewModel.swift +++ b/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/SpaceExploreRoomViewModel.swift @@ -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() { diff --git a/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/SpaceExploreRoomViewModelType.swift b/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/SpaceExploreRoomViewModelType.swift new file mode 100644 index 000000000..a5e463c75 --- /dev/null +++ b/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/SpaceExploreRoomViewModelType.swift @@ -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) +} diff --git a/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/ShowSpaceExploreRoomViewState.swift b/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/SpaceExploreRoomViewState.swift similarity index 91% rename from Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/ShowSpaceExploreRoomViewState.swift rename to Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/SpaceExploreRoomViewState.swift index 08ab87a3b..c7c8ae50e 100644 --- a/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/ShowSpaceExploreRoomViewState.swift +++ b/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/SpaceExploreRoomViewState.swift @@ -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]) diff --git a/Riot/Modules/Spaces/SpaceRoomList/ExploreRoomCoordinator.swift b/Riot/Modules/Spaces/SpaceRoomList/ExploreRoomCoordinator.swift index f01649928..dda85c53a 100644 --- a/Riot/Modules/Spaces/SpaceRoomList/ExploreRoomCoordinator.swift +++ b/Riot/Modules/Spaces/SpaceRoomList/ExploreRoomCoordinator.swift @@ -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 } }) } diff --git a/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/ShowSpaceChildRoomDetailCoordinator.swift b/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/ShowSpaceChildRoomDetailCoordinator.swift deleted file mode 100644 index c86aec88f..000000000 --- a/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/ShowSpaceChildRoomDetailCoordinator.swift +++ /dev/null @@ -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) - } -} diff --git a/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/ShowSpaceChildRoomDetailCoordinatorType.swift b/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/ShowSpaceChildRoomDetailCoordinatorType.swift deleted file mode 100644 index 0d19e8b88..000000000 --- a/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/ShowSpaceChildRoomDetailCoordinatorType.swift +++ /dev/null @@ -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 } -} diff --git a/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/ShowSpaceChildRoomDetailViewModelType.swift b/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/ShowSpaceChildRoomDetailViewModelType.swift deleted file mode 100644 index 6332daf01..000000000 --- a/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/ShowSpaceChildRoomDetailViewModelType.swift +++ /dev/null @@ -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) -} diff --git a/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/SpaceChildRoomDetailCoordinator.swift b/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/SpaceChildRoomDetailCoordinator.swift new file mode 100644 index 000000000..5ca2d1e12 --- /dev/null +++ b/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/SpaceChildRoomDetailCoordinator.swift @@ -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) + } +} diff --git a/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/SpaceChildRoomDetailCoordinatorParameters.swift b/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/SpaceChildRoomDetailCoordinatorParameters.swift new file mode 100644 index 000000000..91f2c94aa --- /dev/null +++ b/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/SpaceChildRoomDetailCoordinatorParameters.swift @@ -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 +} diff --git a/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/ShowSpaceExploreRoomCoordinatorType.swift b/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/SpaceChildRoomDetailCoordinatorType.swift similarity index 54% rename from Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/ShowSpaceExploreRoomCoordinatorType.swift rename to Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/SpaceChildRoomDetailCoordinatorType.swift index bee854ed8..bc312dd65 100644 --- a/Riot/Modules/Spaces/SpaceRoomList/ExploreRoom/ShowSpaceExploreRoomCoordinatorType.swift +++ b/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/SpaceChildRoomDetailCoordinatorType.swift @@ -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 } } diff --git a/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/ShowSpaceChildRoomDetailViewAction.swift b/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/SpaceChildRoomDetailViewAction.swift similarity index 86% rename from Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/ShowSpaceChildRoomDetailViewAction.swift rename to Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/SpaceChildRoomDetailViewAction.swift index 01bf52084..3d63addda 100644 --- a/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/ShowSpaceChildRoomDetailViewAction.swift +++ b/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/SpaceChildRoomDetailViewAction.swift @@ -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 diff --git a/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/ShowSpaceChildRoomDetailViewController.storyboard b/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/SpaceChildRoomDetailViewController.storyboard similarity index 98% rename from Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/ShowSpaceChildRoomDetailViewController.storyboard rename to Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/SpaceChildRoomDetailViewController.storyboard index c5e98752c..68e4a8550 100644 --- a/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/ShowSpaceChildRoomDetailViewController.storyboard +++ b/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/SpaceChildRoomDetailViewController.storyboard @@ -8,10 +8,10 @@ - + - + diff --git a/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/ShowSpaceChildRoomDetailViewController.swift b/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/SpaceChildRoomDetailViewController.swift similarity index 89% rename from Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/ShowSpaceChildRoomDetailViewController.swift rename to Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/SpaceChildRoomDetailViewController.swift index 0be1da2a2..d6edac90f 100644 --- a/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/ShowSpaceChildRoomDetailViewController.swift +++ b/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/SpaceChildRoomDetailViewController.swift @@ -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 diff --git a/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/ShowSpaceChildRoomDetailViewModel.swift b/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/SpaceChildRoomDetailViewModel.swift similarity index 69% rename from Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/ShowSpaceChildRoomDetailViewModel.swift rename to Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/SpaceChildRoomDetailViewModel.swift index 25d2156af..4dc0e834a 100644 --- a/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/ShowSpaceChildRoomDetailViewModel.swift +++ b/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/SpaceChildRoomDetailViewModel.swift @@ -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() { diff --git a/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/SpaceChildRoomDetailViewModelType.swift b/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/SpaceChildRoomDetailViewModelType.swift new file mode 100644 index 000000000..2ab7785e6 --- /dev/null +++ b/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/SpaceChildRoomDetailViewModelType.swift @@ -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) +} diff --git a/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/ShowSpaceChildRoomDetailViewState.swift b/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/SpaceChildRoomDetailViewState.swift similarity index 89% rename from Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/ShowSpaceChildRoomDetailViewState.swift rename to Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/SpaceChildRoomDetailViewState.swift index 90e92ef42..7ef065394 100644 --- a/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/ShowSpaceChildRoomDetailViewState.swift +++ b/Riot/Modules/Spaces/SpaceRoomList/SpaceChildRoomDetail/SpaceChildRoomDetailViewState.swift @@ -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)