diff --git a/Riot/Managers/UserSessions/UserSessionsService.swift b/Riot/Managers/UserSessions/UserSessionsService.swift index 19d9b05fa..f6d91bc0b 100644 --- a/Riot/Managers/UserSessions/UserSessionsService.swift +++ b/Riot/Managers/UserSessions/UserSessionsService.swift @@ -34,6 +34,10 @@ extension UserSessionsService { @objcMembers class UserSessionsService: NSObject { + // MARK: - Singleton + + static public let shared: UserSessionsService = UserSessionsService() + // MARK: - Properties // MARK: Private diff --git a/Riot/Modules/Application/AppCoordinator.swift b/Riot/Modules/Application/AppCoordinator.swift index f7b19ec0f..0f6261778 100755 --- a/Riot/Modules/Application/AppCoordinator.swift +++ b/Riot/Modules/Application/AppCoordinator.swift @@ -67,7 +67,7 @@ final class AppCoordinator: NSObject, AppCoordinatorType { init(router: RootRouterType, window: UIWindow) { self.rootRouter = router self.customSchemeURLParser = CustomSchemeURLParser() - self.userSessionsService = UserSessionsService() + self.userSessionsService = UserSessionsService.shared super.init() diff --git a/Riot/Modules/People/PeopleViewController.m b/Riot/Modules/People/PeopleViewController.m index 53bb377bd..7d4e9260c 100644 --- a/Riot/Modules/People/PeopleViewController.m +++ b/Riot/Modules/People/PeopleViewController.m @@ -123,7 +123,7 @@ { if (self.dataSource.currentSpace != nil) { - self.spaceMembersCoordinatorBridgePresenter = [[SpaceMembersCoordinatorBridgePresenter alloc] initWithSession:self.mainSession spaceId:self.dataSource.currentSpace.spaceId]; + self.spaceMembersCoordinatorBridgePresenter = [[SpaceMembersCoordinatorBridgePresenter alloc] initWithUserSessionsService:[UserSessionsService shared] session:self.mainSession spaceId:self.dataSource.currentSpace.spaceId]; self.spaceMembersCoordinatorBridgePresenter.delegate = self; [self.spaceMembersCoordinatorBridgePresenter presentFrom:self animated:YES]; } diff --git a/Riot/Modules/SideMenu/SideMenuCoordinator.swift b/Riot/Modules/SideMenu/SideMenuCoordinator.swift index 550fcc233..60463b93a 100644 --- a/Riot/Modules/SideMenu/SideMenuCoordinator.swift +++ b/Riot/Modules/SideMenu/SideMenuCoordinator.swift @@ -219,7 +219,8 @@ final class SideMenuCoordinator: NSObject, SideMenuCoordinatorType { } private func showMembers(spaceId: String, session: MXSession) { - let spaceMembersCoordinator = SpaceMembersCoordinator(session: session, spaceId: spaceId) + let parameters = SpaceMembersCoordinatorParameters(userSessionsService: self.parameters.userSessionsService, session: session, spaceId: spaceId) + let spaceMembersCoordinator = SpaceMembersCoordinator(parameters: parameters) spaceMembersCoordinator.delegate = self let presentable = spaceMembersCoordinator.toPresentable() presentable.presentationController?.delegate = self @@ -252,18 +253,6 @@ final class SideMenuCoordinator: NSObject, SideMenuCoordinatorType { self.spaceDetailPresenter.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) - } - } - - func navigate(to member: MXRoomMember, from sourceView: UIView?) { - self.membersCoordinator?.presentMemberDetail(with: member, from: sourceView) - } - // MARK: UserSessions management private func registerUserSessionsServiceNotifications() { @@ -362,14 +351,10 @@ extension SideMenuCoordinator: SpaceDetailPresenterDelegate { // 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 + func exploreRoomCoordinatorDidComplete(_ coordinator: ExploreRoomCoordinatorType) { + self.exploreRoomCoordinator?.toPresentable().dismiss(animated: true) { + self.exploreRoomCoordinator = nil } - self.navigate(to: item, from: sourceView) } } @@ -380,10 +365,6 @@ extension SideMenuCoordinator: SpaceMembersCoordinatorDelegate { self.membersCoordinator = nil } } - - func spaceMembersCoordinator(_ coordinator: SpaceMembersCoordinatorType, didSelect member: MXRoomMember, from sourceView: UIView?) { - self.navigate(to: member, from: sourceView) - } } // MARK: - UIAdaptivePresentationControllerDelegate diff --git a/Riot/Modules/Spaces/SpaceMembers/MemberDetail/SpaceMemberDetailCoordinator.swift b/Riot/Modules/Spaces/SpaceMembers/MemberDetail/SpaceMemberDetailCoordinator.swift index 972b5153b..fa62c75b5 100644 --- a/Riot/Modules/Spaces/SpaceMembers/MemberDetail/SpaceMemberDetailCoordinator.swift +++ b/Riot/Modules/Spaces/SpaceMembers/MemberDetail/SpaceMemberDetailCoordinator.swift @@ -19,15 +19,20 @@ import Foundation import UIKit +struct SpaceMemberDetailCoordinatorParameters { + let userSessionsService: UserSessionsService + let member: MXRoomMember + let session: MXSession + let spaceId: String +} + final class SpaceMemberDetailCoordinator: NSObject, SpaceMemberDetailCoordinatorType { // MARK: - Properties // MARK: Private - private let session: MXSession - private let member: MXRoomMember - private let spaceId: String + private let parameters: SpaceMemberDetailCoordinatorParameters private var spaceMemberDetailViewModel: SpaceMemberDetailViewModelType private let spaceMemberDetailViewController: SpaceMemberDetailViewController @@ -41,12 +46,10 @@ final class SpaceMemberDetailCoordinator: NSObject, SpaceMemberDetailCoordinator // MARK: - Setup - init(session: MXSession, member: MXRoomMember, spaceId: String) { - self.session = session - self.member = member - self.spaceId = spaceId + init(parameters: SpaceMemberDetailCoordinatorParameters) { + self.parameters = parameters - let spaceMemberDetailViewModel = SpaceMemberDetailViewModel(session: self.session, member: self.member) + let spaceMemberDetailViewModel = SpaceMemberDetailViewModel(userSessionsService: parameters.userSessionsService, session: parameters.session, member: parameters.member, spaceId: parameters.spaceId) let spaceMemberDetailViewController = SpaceMemberDetailViewController.instantiate(with: spaceMemberDetailViewModel) spaceMemberDetailViewController.enableMention = true spaceMemberDetailViewController.enableVoipCall = false @@ -60,11 +63,6 @@ final class SpaceMemberDetailCoordinator: NSObject, SpaceMemberDetailCoordinator func start() { self.spaceMemberDetailViewModel.coordinatorDelegate = self - if let space = self.session.spaceService.getSpace(withId: spaceId) { - // Set delegate to handle action on member (start chat, mention) - self.spaceMemberDetailViewController.delegate = self - self.spaceMemberDetailViewController.display(self.member, withMatrixRoom: space.room) - } } func toPresentable() -> UIViewController { diff --git a/Riot/Modules/Spaces/SpaceMembers/MemberDetail/SpaceMemberDetailViewAction.swift b/Riot/Modules/Spaces/SpaceMembers/MemberDetail/SpaceMemberDetailViewAction.swift index 3ea17426e..98c2ecca1 100644 --- a/Riot/Modules/Spaces/SpaceMembers/MemberDetail/SpaceMemberDetailViewAction.swift +++ b/Riot/Modules/Spaces/SpaceMembers/MemberDetail/SpaceMemberDetailViewAction.swift @@ -20,6 +20,7 @@ import Foundation /// SpaceMemberDetailViewController view actions exposed to view model enum SpaceMemberDetailViewAction { + case loadData case openRoom(_ roomId: String) case createRoom(_ memberId: String) case cancel diff --git a/Riot/Modules/Spaces/SpaceMembers/MemberDetail/SpaceMemberDetailViewController.swift b/Riot/Modules/Spaces/SpaceMembers/MemberDetail/SpaceMemberDetailViewController.swift index ee9a65b45..136419f8d 100644 --- a/Riot/Modules/Spaces/SpaceMembers/MemberDetail/SpaceMemberDetailViewController.swift +++ b/Riot/Modules/Spaces/SpaceMembers/MemberDetail/SpaceMemberDetailViewController.swift @@ -26,10 +26,6 @@ final class SpaceMemberDetailViewController: RoomMemberDetailsViewController { return UINib(nibName: "RoomMemberDetailsViewController", bundle: Bundle(for: RoomMemberDetailsViewController.self)) } - private enum Constants { - static let aConstant: Int = 666 - } - // MARK: - Properties // MARK: Outlets @@ -67,6 +63,9 @@ final class SpaceMemberDetailViewController: RoomMemberDetailsViewController { self.update(theme: self.theme) self.viewModel.viewDelegate = self + self.viewModel.process(viewAction: .loadData) + + self.delegate = self } override func viewWillAppear(_ animated: Bool) { @@ -118,8 +117,8 @@ final class SpaceMemberDetailViewController: RoomMemberDetailsViewController { switch viewState { case .loading: self.renderLoading() - case .loaded: - self.renderLoaded() + case .loaded(let member, let space): + self.renderLoaded(member: member, space: space) case .error(let error): self.render(error: error) } @@ -129,7 +128,8 @@ final class SpaceMemberDetailViewController: RoomMemberDetailsViewController { self.activityPresenter.presentActivityIndicator(on: self.view, animated: true) } - private func renderLoaded() { + private func renderLoaded(member: MXRoomMember, space: MXRoom?) { + self.display(member, withMatrixRoom: space) self.activityPresenter.removeCurrentActivityIndicator(animated: true) } @@ -159,3 +159,13 @@ extension SpaceMemberDetailViewController: SpaceMemberDetailViewModelViewDelegat self.render(viewState: viewSate) } } + +// MARK: - MXKRoomMemberDetailsViewControllerDelegate +extension SpaceMemberDetailViewController: MXKRoomMemberDetailsViewControllerDelegate { + + func roomMemberDetailsViewController(_ roomMemberDetailsViewController: MXKRoomMemberDetailsViewController!, startChatWithMemberId memberId: String!, completion: (() -> Void)!) { + completion() + self.viewModel.process(viewAction: .createRoom(memberId)) + } + +} diff --git a/Riot/Modules/Spaces/SpaceMembers/MemberDetail/SpaceMemberDetailViewModel.swift b/Riot/Modules/Spaces/SpaceMembers/MemberDetail/SpaceMemberDetailViewModel.swift index f18ad137e..f462dda89 100644 --- a/Riot/Modules/Spaces/SpaceMembers/MemberDetail/SpaceMemberDetailViewModel.swift +++ b/Riot/Modules/Spaces/SpaceMembers/MemberDetail/SpaceMemberDetailViewModel.swift @@ -18,14 +18,17 @@ import Foundation -final class SpaceMemberDetailViewModel: SpaceMemberDetailViewModelType { +final class SpaceMemberDetailViewModel: NSObject, SpaceMemberDetailViewModelType { // MARK: - Properties // MARK: Private + private let userSessionsService: UserSessionsService private let session: MXSession private let member: MXRoomMember + private let spaceId: String + private var space: MXSpace? private var currentOperation: MXHTTPOperation? @@ -36,9 +39,11 @@ final class SpaceMemberDetailViewModel: SpaceMemberDetailViewModelType { // MARK: - Setup - init(session: MXSession, member: MXRoomMember) { + init(userSessionsService: UserSessionsService, session: MXSession, member: MXRoomMember, spaceId: String) { + self.userSessionsService = userSessionsService self.session = session self.member = member + self.spaceId = spaceId } deinit { @@ -49,6 +54,8 @@ final class SpaceMemberDetailViewModel: SpaceMemberDetailViewModelType { func process(viewAction: SpaceMemberDetailViewAction) { switch viewAction { + case .loadData: + self.loadData() case .openRoom(let roomId): self.coordinatorDelegate?.spaceMemberDetailViewModel(self, showRoomWithId: roomId) case .createRoom(let memberId): @@ -61,47 +68,50 @@ final class SpaceMemberDetailViewModel: SpaceMemberDetailViewModelType { // MARK: - Private + private func loadData() { + self.space = self.session.spaceService.getSpace(withId: self.spaceId) + self.update(viewState: .loaded(self.member, self.space?.room)) + } + private func update(viewState: SpaceMemberDetailViewState) { self.viewDelegate?.spaceMemberDetailViewModel(self, didUpdateViewState: viewState) } private func createDirectRoom(forMemberWithId memberId: String) { self.update(viewState: .loading) - AppDelegate.theDelegate().selectMatrixAccount { account in - guard let account = account, let session = account.mxSession else { - self.update(viewState: .loaded) - return + guard let account = self.userSessionsService.mainUserSession?.account, let session = account.mxSession else { + self.update(viewState: .loaded(self.member, self.space?.room)) + return + } + + let invite: [String]? = (session.myUserId != memberId) ? [memberId] : nil + self.currentOperation = session.vc_canEnableE2EByDefaultInNewRoom(withUsers: invite) { canEnableE2E in + self.currentOperation = nil + let roomCreationParameters = MXRoomCreationParameters() + roomCreationParameters.visibility = kMXRoomDirectoryVisibilityPrivate + roomCreationParameters.inviteArray = invite + roomCreationParameters.isDirect = !(invite?.isEmpty ?? true) + roomCreationParameters.preset = kMXRoomPresetTrustedPrivateChat + + if canEnableE2E { + roomCreationParameters.initialStateEvents = [MXRoomCreationParameters.initialStateEventForEncryption(withAlgorithm: kMXCryptoMegolmAlgorithm)] } - let invite: [String]? = (session.myUserId != memberId) ? [memberId] : nil - self.currentOperation = session.vc_canEnableE2EByDefaultInNewRoom(withUsers: invite) { canEnableE2E in + self.currentOperation = session.createRoom(parameters: roomCreationParameters) { response in self.currentOperation = nil - let roomCreationParameters = MXRoomCreationParameters() - roomCreationParameters.visibility = kMXRoomDirectoryVisibilityPrivate - roomCreationParameters.inviteArray = invite - roomCreationParameters.isDirect = !(invite?.isEmpty ?? true) - roomCreationParameters.preset = kMXRoomPresetTrustedPrivateChat - - if canEnableE2E { - roomCreationParameters.initialStateEvents = [MXRoomCreationParameters.initialStateEventForEncryption(withAlgorithm: kMXCryptoMegolmAlgorithm)] - } - - self.currentOperation = session.createRoom(parameters: roomCreationParameters) { response in - self.currentOperation = nil - self.update(viewState: .loaded) - guard response.isSuccess, let room = response.value else { - if let error = response.error { - self.update(viewState: .error(error)) - } - return + self.update(viewState: .loaded(self.member, self.space?.room)) + guard response.isSuccess, let room = response.value else { + if let error = response.error { + self.update(viewState: .error(error)) } - self.coordinatorDelegate?.spaceMemberDetailViewModel(self, showRoomWithId: room.roomId) - } - } failure: { error in - self.update(viewState: .loaded) - if let error = error { - self.update(viewState: .error(error)) + return } + self.coordinatorDelegate?.spaceMemberDetailViewModel(self, showRoomWithId: room.roomId) + } + } failure: { error in + self.update(viewState: .loaded(self.member, self.space?.room)) + if let error = error { + self.update(viewState: .error(error)) } } } diff --git a/Riot/Modules/Spaces/SpaceMembers/MemberDetail/SpaceMemberDetailViewState.swift b/Riot/Modules/Spaces/SpaceMembers/MemberDetail/SpaceMemberDetailViewState.swift index db35093fa..e02893efd 100644 --- a/Riot/Modules/Spaces/SpaceMembers/MemberDetail/SpaceMemberDetailViewState.swift +++ b/Riot/Modules/Spaces/SpaceMembers/MemberDetail/SpaceMemberDetailViewState.swift @@ -21,6 +21,6 @@ import Foundation /// SpaceMemberDetailViewController view state enum SpaceMemberDetailViewState { case loading - case loaded + case loaded(MXRoomMember, MXRoom?) case error(Error) } diff --git a/Riot/Modules/Spaces/SpaceMembers/MemberList/SeachEmptyView.swift b/Riot/Modules/Spaces/SpaceMembers/MemberList/SeachEmptyView.swift new file mode 100644 index 000000000..06982a645 --- /dev/null +++ b/Riot/Modules/Spaces/SpaceMembers/MemberList/SeachEmptyView.swift @@ -0,0 +1,67 @@ +// +// 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 + +@objcMembers +class SearchEmptyView: UIStackView, Themable { + + // MARK: - Properties + + public private(set) var titleLabel: UILabel! + public private(set) var detailLabel: UILabel! + + // MARK: - Lifecycle + + override init(frame: CGRect) { + super.init(frame: frame) + setupView() + } + + required init(coder: NSCoder) { + super.init(coder: coder) + setupView() + } + + // MARK: - Themable + + func update(theme: Theme) { + self.titleLabel.textColor = theme.colors.primaryContent + self.titleLabel.font = theme.fonts.bodySB + + self.detailLabel.textColor = theme.colors.secondaryContent + self.detailLabel.font = theme.fonts.callout + } + + // MARK: - Private + + private func setupView() { + self.titleLabel = UILabel(frame: .zero) + self.titleLabel.backgroundColor = .clear + self.titleLabel.numberOfLines = 0 + + self.detailLabel = UILabel(frame: .zero) + self.detailLabel.backgroundColor = .clear + self.detailLabel.numberOfLines = 0 + + self.addArrangedSubview(titleLabel) + self.addArrangedSubview(detailLabel) + self.distribution = .equalSpacing + self.axis = .vertical + self.alignment = .leading + self.spacing = 8 + } +} diff --git a/Riot/Modules/Spaces/SpaceMembers/MemberList/SpaceMemberListViewController.swift b/Riot/Modules/Spaces/SpaceMembers/MemberList/SpaceMemberListViewController.swift index baad3654f..461a16450 100644 --- a/Riot/Modules/Spaces/SpaceMembers/MemberList/SpaceMemberListViewController.swift +++ b/Riot/Modules/Spaces/SpaceMembers/MemberList/SpaceMemberListViewController.swift @@ -22,6 +22,10 @@ final class SpaceMemberListViewController: RoomParticipantsViewController { // MARK: - Constants + private enum Constants { + static let emptySearchViewMargin: CGFloat = 8 + } + // MARK: - Properties // MARK: Private @@ -31,7 +35,7 @@ final class SpaceMemberListViewController: RoomParticipantsViewController { private var errorPresenter: MXKErrorPresentation! private var activityPresenter: ActivityIndicatorPresenter! private var titleView: MainTitleView! - private var emptyView: RootTabEmptyView! + private var emptyView: SearchEmptyView! private var emptyViewArtwork: UIImage { return ThemeService.shared().isCurrentThemeDark() ? Asset.Images.peopleEmptyScreenArtworkDark.image : Asset.Images.peopleEmptyScreenArtwork.image @@ -44,7 +48,7 @@ final class SpaceMemberListViewController: RoomParticipantsViewController { viewController.viewModel = viewModel viewController.showParticipantCustomAccessoryView = false viewController.theme = ThemeService.shared().theme - viewController.emptyView = RootTabEmptyView.instantiate() + viewController.emptyView = SearchEmptyView() return viewController } @@ -108,7 +112,7 @@ final class SpaceMemberListViewController: RoomParticipantsViewController { self.titleView.titleLabel.text = VectorL10n.roomDetailsPeople self.navigationItem.titleView = self.titleView - self.emptyView.frame = CGRect(x: 0, y: self.searchBarView.frame.maxY, width: self.view.bounds.width, height: self.view.bounds.height - self.searchBarView.frame.maxY) + self.emptyView.frame = CGRect(x: Constants.emptySearchViewMargin, y: self.searchBarView.frame.maxY + 2 * Constants.emptySearchViewMargin, width: self.view.bounds.width - 2 * Constants.emptySearchViewMargin, height: 0) self.emptyView.autoresizingMask = [.flexibleHeight, .flexibleWidth] self.emptyView.alpha = 0 self.view.insertSubview(self.emptyView, at: 0) @@ -133,7 +137,9 @@ final class SpaceMemberListViewController: RoomParticipantsViewController { self.activityPresenter.removeCurrentActivityIndicator(animated: true) self.mxRoom = space.room self.titleView.subtitleLabel.text = space.summary?.displayname - self.emptyView.fill(with: self.emptyViewArtwork, title: VectorL10n.spacesNoResultFoundTitle, informationText: VectorL10n.spacesNoMemberFoundDetail(space.summary?.displayname ?? "")) + self.emptyView.titleLabel.text = VectorL10n.spacesNoResultFoundTitle + self.emptyView.detailLabel.text = VectorL10n.spacesNoMemberFoundDetail(space.summary?.displayname ?? "") + self.emptyView.layoutIfNeeded() } private func render(error: Error) { diff --git a/Riot/Modules/Spaces/SpaceMembers/SpaceMembersCoordinator.swift b/Riot/Modules/Spaces/SpaceMembers/SpaceMembersCoordinator.swift index 42fee44b7..9a0c44ac9 100644 --- a/Riot/Modules/Spaces/SpaceMembers/SpaceMembersCoordinator.swift +++ b/Riot/Modules/Spaces/SpaceMembers/SpaceMembersCoordinator.swift @@ -18,6 +18,12 @@ import UIKit +struct SpaceMembersCoordinatorParameters { + let userSessionsService: UserSessionsService + let session: MXSession + let spaceId: String +} + @objcMembers final class SpaceMembersCoordinator: SpaceMembersCoordinatorType { @@ -25,9 +31,8 @@ final class SpaceMembersCoordinator: SpaceMembersCoordinatorType { // MARK: Private + private let parameters: SpaceMembersCoordinatorParameters private let navigationRouter: NavigationRouterType - private let session: MXSession - private let spaceId: String private weak var memberDetailCoordinator: SpaceMemberDetailCoordinator? // MARK: Public @@ -39,11 +44,10 @@ final class SpaceMembersCoordinator: SpaceMembersCoordinatorType { // MARK: - Setup - init(session: MXSession, spaceId: String) { + init(parameters: SpaceMembersCoordinatorParameters) { + self.parameters = parameters self.navigationRouter = NavigationRouter(navigationController: RiotNavigationController()) - self.session = session - self.spaceId = spaceId - } + } // MARK: - Public methods @@ -89,19 +93,20 @@ final class SpaceMembersCoordinator: SpaceMembersCoordinatorType { // MARK: - Private methods private func createSpaceMemberListCoordinator() -> SpaceMemberListCoordinator { - let coordinator = SpaceMemberListCoordinator(session: self.session, spaceId: self.spaceId) + let coordinator = SpaceMemberListCoordinator(session: self.parameters.session, spaceId: self.parameters.spaceId) coordinator.delegate = self return coordinator } private func createSpaceMemberDetailCoordinator(with member: MXRoomMember) -> SpaceMemberDetailCoordinator { - let coordinator = SpaceMemberDetailCoordinator(session: self.session, member: member, spaceId: self.spaceId) + let parameters = SpaceMemberDetailCoordinatorParameters(userSessionsService: self.parameters.userSessionsService, member: member, session: self.parameters.session, spaceId: self.parameters.spaceId) + let coordinator = SpaceMemberDetailCoordinator(parameters: parameters) coordinator.delegate = self return coordinator } private func navigateTo(roomWith roomId: String) { - let roomDataSourceManager = MXKRoomDataSourceManager.sharedManager(forMatrixSession: self.session) + let roomDataSourceManager = MXKRoomDataSourceManager.sharedManager(forMatrixSession: self.parameters.session) roomDataSourceManager?.roomDataSource(forRoom: roomId, create: true, onComplete: { [weak self] roomDataSource in let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main) @@ -120,7 +125,7 @@ final class SpaceMembersCoordinator: SpaceMembersCoordinatorType { // MARK: - SpaceMemberListCoordinatorDelegate extension SpaceMembersCoordinator: SpaceMemberListCoordinatorDelegate { func spaceMemberListCoordinator(_ coordinator: SpaceMemberListCoordinatorType, didSelect member: MXRoomMember, from sourceView: UIView?) { - self.delegate?.spaceMembersCoordinator(self, didSelect: member, from: sourceView) + self.presentMemberDetail(with: member, from: sourceView) } func spaceMemberListCoordinatorDidCancel(_ coordinator: SpaceMemberListCoordinatorType) { diff --git a/Riot/Modules/Spaces/SpaceMembers/SpaceMembersCoordinatorBridgePresenter.swift b/Riot/Modules/Spaces/SpaceMembers/SpaceMembersCoordinatorBridgePresenter.swift index b234541bb..7b4ea93c6 100644 --- a/Riot/Modules/Spaces/SpaceMembers/SpaceMembersCoordinatorBridgePresenter.swift +++ b/Riot/Modules/Spaces/SpaceMembers/SpaceMembersCoordinatorBridgePresenter.swift @@ -32,6 +32,7 @@ final class SpaceMembersCoordinatorBridgePresenter: NSObject { // MARK: Private + private let userSessionsService: UserSessionsService private let session: MXSession private let spaceId: String private var coordinator: SpaceMembersCoordinator? @@ -42,7 +43,8 @@ final class SpaceMembersCoordinatorBridgePresenter: NSObject { // MARK: - Setup - init(session: MXSession, spaceId: String) { + init(userSessionsService: UserSessionsService, session: MXSession, spaceId: String) { + self.userSessionsService = userSessionsService self.session = session self.spaceId = spaceId super.init() @@ -51,7 +53,8 @@ final class SpaceMembersCoordinatorBridgePresenter: NSObject { // MARK: - Public func present(from viewController: UIViewController, animated: Bool) { - let spaceMemberListCoordinator = SpaceMembersCoordinator(session: self.session, spaceId: self.spaceId) + let parameters = SpaceMembersCoordinatorParameters(userSessionsService: self.userSessionsService, session: self.session, spaceId: self.spaceId) + let spaceMemberListCoordinator = SpaceMembersCoordinator(parameters: parameters) spaceMemberListCoordinator.delegate = self let presentable = spaceMemberListCoordinator.toPresentable() presentable.presentationController?.delegate = self @@ -73,12 +76,6 @@ final class SpaceMembersCoordinatorBridgePresenter: NSObject { } } } - - // MARK: - Private - - func navigate(to member: MXRoomMember, from sourceView: UIView?) { - self.coordinator?.presentMemberDetail(with: member, from: sourceView) - } } // MARK: - SpaceMembersCoordinatorDelegate @@ -86,10 +83,6 @@ extension SpaceMembersCoordinatorBridgePresenter: SpaceMembersCoordinatorDelegat func spaceMembersCoordinatorDidCancel(_ coordinator: SpaceMembersCoordinatorType) { self.delegate?.spaceMembersCoordinatorBridgePresenterDelegateDidComplete(self) } - - func spaceMembersCoordinator(_ coordinator: SpaceMembersCoordinatorType, didSelect member: MXRoomMember, from sourceView: UIView?) { - self.navigate(to: member, from: sourceView) - } } // MARK: - UIAdaptivePresentationControllerDelegate diff --git a/Riot/Modules/Spaces/SpaceMembers/SpaceMembersCoordinatorType.swift b/Riot/Modules/Spaces/SpaceMembers/SpaceMembersCoordinatorType.swift index 2333fbb37..b2775a3c0 100644 --- a/Riot/Modules/Spaces/SpaceMembers/SpaceMembersCoordinatorType.swift +++ b/Riot/Modules/Spaces/SpaceMembers/SpaceMembersCoordinatorType.swift @@ -20,7 +20,6 @@ import Foundation protocol SpaceMembersCoordinatorDelegate: AnyObject { func spaceMembersCoordinatorDidCancel(_ coordinator: SpaceMembersCoordinatorType) - func spaceMembersCoordinator(_ coordinator: SpaceMembersCoordinatorType, didSelect member: MXRoomMember, from sourceView: UIView?) } /// `SpaceMembersCoordinatorType` is a protocol describing a Coordinator that handle keybackup setup navigation flow. diff --git a/Riot/Modules/Spaces/SpaceRoomList/ExploreRoomCoordinator.swift b/Riot/Modules/Spaces/SpaceRoomList/ExploreRoomCoordinator.swift index dda85c53a..e90ea7160 100644 --- a/Riot/Modules/Spaces/SpaceRoomList/ExploreRoomCoordinator.swift +++ b/Riot/Modules/Spaces/SpaceRoomList/ExploreRoomCoordinator.swift @@ -66,7 +66,9 @@ final class ExploreRoomCoordinator: ExploreRoomCoordinatorType { return self.navigationRouter.toPresentable() } - func pushSpace(with item: SpaceExploreRoomListItemViewData) { + // MARK: - Private methods + + private func pushSpace(with item: SpaceExploreRoomListItemViewData) { let coordinator = self.createShowSpaceExploreRoomCoordinator(session: self.session, spaceId: item.childInfo.childRoomId, spaceName: item.childInfo.name) coordinator.start() self.add(childCoordinator: coordinator) @@ -75,7 +77,7 @@ final class ExploreRoomCoordinator: ExploreRoomCoordinatorType { } } - func presentRoom(with item: SpaceExploreRoomListItemViewData, from sourceView: UIView?) { + private func presentRoom(with item: SpaceExploreRoomListItemViewData, from sourceView: UIView?) { if let currentCoordinator = self.roomDetailCoordinator { self.remove(childCoordinator: currentCoordinator) } @@ -89,9 +91,7 @@ final class ExploreRoomCoordinator: ExploreRoomCoordinatorType { self.showRoomPreview(with: item, from: sourceView) } } - - // MARK: - Private methods - + private func showRoomPreview(with item: SpaceExploreRoomListItemViewData, from sourceView: UIView?) { let coordinator = self.createShowSpaceRoomDetailCoordinator(session: self.session, childInfo: item.childInfo) coordinator.start() @@ -144,11 +144,15 @@ final class ExploreRoomCoordinator: ExploreRoomCoordinatorType { // MARK: - ShowSpaceExploreRoomCoordinatorDelegate extension ExploreRoomCoordinator: SpaceExploreRoomCoordinatorDelegate { func spaceExploreRoomCoordinator(_ coordinator: SpaceExploreRoomCoordinatorType, didSelect item: SpaceExploreRoomListItemViewData, from sourceView: UIView?) { - self.delegate?.exploreRoomCoordinatorDidComplete(self, withSelectedIem: item, from: sourceView) + if item.childInfo.roomType == .space { + self.pushSpace(with: item) + } else if item.childInfo.roomType == .room { + self.presentRoom(with: item, from: sourceView) + } } - + func spaceExploreRoomCoordinatorDidCancel(_ coordinator: SpaceExploreRoomCoordinatorType) { - self.delegate?.exploreRoomCoordinatorDidComplete(self, withSelectedIem: nil, from: nil) + self.delegate?.exploreRoomCoordinatorDidComplete(self) } } diff --git a/Riot/Modules/Spaces/SpaceRoomList/ExploreRoomCoordinatorBridgePresenter.swift b/Riot/Modules/Spaces/SpaceRoomList/ExploreRoomCoordinatorBridgePresenter.swift index 1bcf31aff..824801fb4 100644 --- a/Riot/Modules/Spaces/SpaceRoomList/ExploreRoomCoordinatorBridgePresenter.swift +++ b/Riot/Modules/Spaces/SpaceRoomList/ExploreRoomCoordinatorBridgePresenter.swift @@ -78,26 +78,12 @@ final class ExploreRoomCoordinatorBridgePresenter: NSObject { } } } - - // MARK: - Private - - func navigate(to item: SpaceExploreRoomListItemViewData, from sourceView: UIView?) { - if item.childInfo.roomType == .space { - self.coordinator?.pushSpace(with: item) - } else if item.childInfo.roomType == .room { - self.coordinator?.presentRoom(with: item, from: sourceView) - } - } } // MARK: - ExploreRoomCoordinatorDelegate extension ExploreRoomCoordinatorBridgePresenter: ExploreRoomCoordinatorDelegate { - func exploreRoomCoordinatorDidComplete(_ coordinator: ExploreRoomCoordinatorType, withSelectedIem item: SpaceExploreRoomListItemViewData?, from sourceView: UIView?) { - guard let item = item else { - self.delegate?.exploreRoomCoordinatorBridgePresenterDelegateDidComplete(self) - return - } - self.navigate(to: item, from: sourceView) + func exploreRoomCoordinatorDidComplete(_ coordinator: ExploreRoomCoordinatorType) { + self.delegate?.exploreRoomCoordinatorBridgePresenterDelegateDidComplete(self) } } diff --git a/Riot/Modules/Spaces/SpaceRoomList/ExploreRoomCoordinatorType.swift b/Riot/Modules/Spaces/SpaceRoomList/ExploreRoomCoordinatorType.swift index 5d806d080..20bf8c2f1 100644 --- a/Riot/Modules/Spaces/SpaceRoomList/ExploreRoomCoordinatorType.swift +++ b/Riot/Modules/Spaces/SpaceRoomList/ExploreRoomCoordinatorType.swift @@ -19,7 +19,7 @@ import Foundation protocol ExploreRoomCoordinatorDelegate: AnyObject { - func exploreRoomCoordinatorDidComplete(_ coordinator: ExploreRoomCoordinatorType, withSelectedIem item: SpaceExploreRoomListItemViewData?, from sourceView: UIView?) + func exploreRoomCoordinatorDidComplete(_ coordinator: ExploreRoomCoordinatorType) } /// `ExploreRoomCoordinatorType` is a protocol describing a Coordinator that handle keybackup setup navigation flow.