diff --git a/Riot/Modules/Common/Recents/RecentsViewController.m b/Riot/Modules/Common/Recents/RecentsViewController.m index 61f5e9274..785f1306d 100644 --- a/Riot/Modules/Common/Recents/RecentsViewController.m +++ b/Riot/Modules/Common/Recents/RecentsViewController.m @@ -2173,4 +2173,9 @@ self.roomsDirectoryCoordinatorBridgePresenter = nil; } +- (void)roomsDirectoryCoordinatorBridgePresenterDelegate:(RoomsDirectoryCoordinatorBridgePresenter *)coordinatorBridgePresenter didSelectRoomWithIdOrAlias:(NSString * _Nonnull)roomIdOrAlias +{ + // TODO: Implement +} + @end diff --git a/Riot/Modules/Rooms/RoomsDirectoryCoordinator.swift b/Riot/Modules/Rooms/RoomsDirectoryCoordinator.swift index 5dbedb6e5..b1cc53b6e 100644 --- a/Riot/Modules/Rooms/RoomsDirectoryCoordinator.swift +++ b/Riot/Modules/Rooms/RoomsDirectoryCoordinator.swift @@ -72,6 +72,7 @@ final class RoomsDirectoryCoordinator: RoomsDirectoryCoordinatorType { // MARK: - ShowDirectoryCoordinatorDelegate extension RoomsDirectoryCoordinator: ShowDirectoryCoordinatorDelegate { + func showDirectoryCoordinator(_ coordinator: ShowDirectoryCoordinatorType, didSelectRoom room: MXPublicRoom) { self.delegate?.roomsDirectoryCoordinator(self, didSelectRoom: room) } @@ -87,4 +88,8 @@ extension RoomsDirectoryCoordinator: ShowDirectoryCoordinatorDelegate { func showDirectoryCoordinatorWantsToShow(_ coordinator: ShowDirectoryCoordinatorType, viewController: UIViewController) { toPresentable().present(RiotNavigationController(rootViewController: viewController), animated: true, completion: nil) } + + func showDirectoryCoordinator(_ coordinator: ShowDirectoryCoordinatorType, didSelectRoomWithIdOrAlias roomIdOrAlias: String) { + self.delegate?.roomsDirectoryCoordinator(self, didSelectRoomWithIdOrAlias: roomIdOrAlias) + } } diff --git a/Riot/Modules/Rooms/RoomsDirectoryCoordinatorBridgePresenter.swift b/Riot/Modules/Rooms/RoomsDirectoryCoordinatorBridgePresenter.swift index 27ae84475..2edd0aaa3 100644 --- a/Riot/Modules/Rooms/RoomsDirectoryCoordinatorBridgePresenter.swift +++ b/Riot/Modules/Rooms/RoomsDirectoryCoordinatorBridgePresenter.swift @@ -22,6 +22,7 @@ import Foundation func roomsDirectoryCoordinatorBridgePresenterDelegateDidComplete(_ coordinatorBridgePresenter: RoomsDirectoryCoordinatorBridgePresenter) func roomsDirectoryCoordinatorBridgePresenterDelegate(_ coordinatorBridgePresenter: RoomsDirectoryCoordinatorBridgePresenter, didSelectRoom room: MXPublicRoom) func roomsDirectoryCoordinatorBridgePresenterDelegateDidTapCreateNewRoom(_ coordinatorBridgePresenter: RoomsDirectoryCoordinatorBridgePresenter) + func roomsDirectoryCoordinatorBridgePresenterDelegate(_ coordinatorBridgePresenter: RoomsDirectoryCoordinatorBridgePresenter, didSelectRoomWithIdOrAlias roomIdOrAlias: String) } /// RoomsDirectoryCoordinatorBridgePresenter enables to start RoomsDirectoryCoordinator from a view controller. @@ -96,6 +97,9 @@ extension RoomsDirectoryCoordinatorBridgePresenter: RoomsDirectoryCoordinatorDel self.delegate?.roomsDirectoryCoordinatorBridgePresenterDelegateDidComplete(self) } + func roomsDirectoryCoordinator(_ coordinator: RoomsDirectoryCoordinatorType, didSelectRoomWithIdOrAlias roomIdOrAlias: String) { + self.delegate?.roomsDirectoryCoordinatorBridgePresenterDelegate(self, didSelectRoomWithIdOrAlias: roomIdOrAlias) + } } // MARK: - UIAdaptivePresentationControllerDelegate diff --git a/Riot/Modules/Rooms/RoomsDirectoryCoordinatorType.swift b/Riot/Modules/Rooms/RoomsDirectoryCoordinatorType.swift index 4838e1413..a33788a44 100644 --- a/Riot/Modules/Rooms/RoomsDirectoryCoordinatorType.swift +++ b/Riot/Modules/Rooms/RoomsDirectoryCoordinatorType.swift @@ -22,6 +22,7 @@ protocol RoomsDirectoryCoordinatorDelegate: class { func roomsDirectoryCoordinator(_ coordinator: RoomsDirectoryCoordinatorType, didSelectRoom room: MXPublicRoom) func roomsDirectoryCoordinatorDidTapCreateNewRoom(_ coordinator: RoomsDirectoryCoordinatorType) func roomsDirectoryCoordinatorDidComplete(_ coordinator: RoomsDirectoryCoordinatorType) + func roomsDirectoryCoordinator(_ coordinator: RoomsDirectoryCoordinatorType, didSelectRoomWithIdOrAlias roomIdOrAlias: String) } /// `RoomsDirectoryCoordinatorType` is a protocol describing a Coordinator that handle keybackup setup navigation flow. diff --git a/Riot/Modules/Rooms/ShowDirectory/Cells/Room/DirectoryRoomTableViewCellVM.swift b/Riot/Modules/Rooms/ShowDirectory/Cells/Room/DirectoryRoomTableViewCellVM.swift index f8b43c46e..9acb7bd23 100644 --- a/Riot/Modules/Rooms/ShowDirectory/Cells/Room/DirectoryRoomTableViewCellVM.swift +++ b/Riot/Modules/Rooms/ShowDirectory/Cells/Room/DirectoryRoomTableViewCellVM.swift @@ -17,19 +17,19 @@ import Foundation struct DirectoryRoomTableViewCellVM { - var title: String? - var numberOfUsers: Int - var subtitle: String? - var isJoined: Bool = false - - private var roomId: String! - private var avatarUrl: String? - private var mediaManager: MXMediaManager? - - func setAvatar(in avatarImageView: MXKImageView) { - let avatarImage = AvatarGenerator.generateAvatar(forMatrixItem: roomId, withDisplayName: title) - if let avatarUrl = avatarUrl { + let title: String? + let numberOfUsers: Int + let subtitle: String? + let isJoined: Bool + let roomId: String + let avatarViewData: AvatarViewDataProtocol + + // TODO: Use AvatarView subclass in the cell view + func setAvatar(in avatarImageView: MXKImageView) { + let avatarImage = AvatarGenerator.generateAvatar(forMatrixItem: self.avatarViewData.matrixItemId, withDisplayName: title) + + if let avatarUrl = self.avatarViewData.avatarUrl { avatarImageView.enableInMemoryCache = true avatarImageView.setImageURI(avatarUrl, @@ -38,7 +38,7 @@ struct DirectoryRoomTableViewCellVM { toFitViewSize: avatarImageView.frame.size, with: MXThumbnailingMethodCrop, previewImage: avatarImage, - mediaManager: mediaManager) + mediaManager: self.avatarViewData.mediaManager) } else { avatarImageView.image = avatarImage } @@ -48,16 +48,18 @@ struct DirectoryRoomTableViewCellVM { init(title: String?, numberOfUsers: Int, subtitle: String?, - isJoined: Bool, + isJoined: Bool = false, roomId: String!, avatarUrl: String?, - mediaManager: MXMediaManager?) { + mediaManager: MXMediaManager) { self.title = title self.numberOfUsers = numberOfUsers self.subtitle = subtitle self.isJoined = isJoined self.roomId = roomId - self.avatarUrl = avatarUrl - self.mediaManager = mediaManager + + let avatarViewData = RoomAvatarViewData(roomId: roomId, displayName: title, avatarUrl: avatarUrl, mediaManager: mediaManager) + + self.avatarViewData = avatarViewData } } diff --git a/Riot/Modules/Rooms/ShowDirectory/ShowDirectoryCoordinator.swift b/Riot/Modules/Rooms/ShowDirectory/ShowDirectoryCoordinator.swift index 4536143a1..75a8365a7 100644 --- a/Riot/Modules/Rooms/ShowDirectory/ShowDirectoryCoordinator.swift +++ b/Riot/Modules/Rooms/ShowDirectory/ShowDirectoryCoordinator.swift @@ -80,6 +80,9 @@ final class ShowDirectoryCoordinator: ShowDirectoryCoordinatorType { // MARK: - ShowDirectoryViewModelCoordinatorDelegate extension ShowDirectoryCoordinator: ShowDirectoryViewModelCoordinatorDelegate { + func showDirectoryViewModel(_ viewModel: ShowDirectoryViewModelType, didSelectRoomWithIdOrAlias roomIdOrAlias: String) { + self.delegate?.showDirectoryCoordinator(self, didSelectRoomWithIdOrAlias: roomIdOrAlias) + } func showDirectoryViewModelDidSelect(_ viewModel: ShowDirectoryViewModelType, room: MXPublicRoom) { self.delegate?.showDirectoryCoordinator(self, didSelectRoom: room) diff --git a/Riot/Modules/Rooms/ShowDirectory/ShowDirectoryCoordinatorType.swift b/Riot/Modules/Rooms/ShowDirectory/ShowDirectoryCoordinatorType.swift index 1c081bf3f..2290edf48 100644 --- a/Riot/Modules/Rooms/ShowDirectory/ShowDirectoryCoordinatorType.swift +++ b/Riot/Modules/Rooms/ShowDirectory/ShowDirectoryCoordinatorType.swift @@ -23,6 +23,7 @@ protocol ShowDirectoryCoordinatorDelegate: class { func showDirectoryCoordinatorDidTapCreateNewRoom(_ coordinator: ShowDirectoryCoordinatorType) func showDirectoryCoordinatorDidCancel(_ coordinator: ShowDirectoryCoordinatorType) func showDirectoryCoordinatorWantsToShow(_ coordinator: ShowDirectoryCoordinatorType, viewController: UIViewController) + func showDirectoryCoordinator(_ coordinator: ShowDirectoryCoordinatorType, didSelectRoomWithIdOrAlias roomIdOrAlias: String) } /// `ShowDirectoryCoordinatorType` is a protocol describing a Coordinator that handle key backup setup passphrase navigation flow. diff --git a/Riot/Modules/Rooms/ShowDirectory/ShowDirectoryViewModel.swift b/Riot/Modules/Rooms/ShowDirectory/ShowDirectoryViewModel.swift index fe667f05f..0bf72cc55 100644 --- a/Riot/Modules/Rooms/ShowDirectory/ShowDirectoryViewModel.swift +++ b/Riot/Modules/Rooms/ShowDirectory/ShowDirectoryViewModel.swift @@ -74,10 +74,10 @@ final class ShowDirectoryViewModel: NSObject, ShowDirectoryViewModelType { let directorySection = self.sections[indexPath.section] switch directorySection { - case .searchInput: - break - case.publicRoomsDirectory: - guard let publicRoom = dataSource.room(at: indexPath) else { return } + case .searchInput(let viewData): + self.coordinatorDelegate?.showDirectoryViewModel(self, didSelectRoomWithIdOrAlias: viewData.roomId) + case .publicRoomsDirectory: + guard let publicRoom = self.publicRoom(at: indexPath.row) else { return } self.coordinatorDelegate?.showDirectoryViewModelDidSelect(self, room: publicRoom) } case .joinRoom(let indexPath): @@ -87,9 +87,9 @@ final class ShowDirectoryViewModel: NSObject, ShowDirectoryViewModelType { switch directorySection { case .searchInput(let searchInputViewData): - roomIdOrAlias = searchInputViewData.title + roomIdOrAlias = searchInputViewData.roomId case .publicRoomsDirectory: - let publicRoom = dataSource.room(at: IndexPath(row: indexPath.row, section: 0)) + let publicRoom = self.publicRoom(at: indexPath.row) roomIdOrAlias = publicRoom?.roomId } @@ -152,7 +152,7 @@ final class ShowDirectoryViewModel: NSObject, ShowDirectoryViewModelType { private func resetSections() { self.sections = [self.publicRoomsDirectorySection] - } + } private func switchServer() { self.coordinatorDelegate?.showDirectoryViewModelWantsToShowDirectoryServerPicker(self) @@ -170,6 +170,10 @@ final class ShowDirectoryViewModel: NSObject, ShowDirectoryViewModelType { } } + private func publicRoom(at row: Int) -> MXPublicRoom? { + return dataSource.room(at: IndexPath(row: row, section: 0)) + } + private func search(with pattern: String?) { self.dataSource.searchPattern = pattern @@ -219,14 +223,14 @@ final class ShowDirectoryViewModel: NSObject, ShowDirectoryViewModelType { let topic = MXTools.stripNewlineCharacters(room.summary.topic) let isJoined = room.summary.membership == .join let avatarStringUrl = room.summary.avatar - let mediaManager = self.session.mediaManager + let mediaManager: MXMediaManager = self.session.mediaManager return DirectoryRoomTableViewCellVM(title: displayName, numberOfUsers: joinedMembersCount, subtitle: topic, isJoined: isJoined, roomId: room.roomId, avatarUrl: avatarStringUrl, mediaManager: mediaManager) } private func roomCellViewModel(with roomIdOrAlias: String) -> DirectoryRoomTableViewCellVM { let displayName = roomIdOrAlias - let mediaManager = self.session.mediaManager + let mediaManager: MXMediaManager = self.session.mediaManager return DirectoryRoomTableViewCellVM(title: displayName, numberOfUsers: 0, subtitle: nil, isJoined: false, roomId: roomIdOrAlias, avatarUrl: nil, mediaManager: mediaManager) } diff --git a/Riot/Modules/Rooms/ShowDirectory/ShowDirectoryViewModelType.swift b/Riot/Modules/Rooms/ShowDirectory/ShowDirectoryViewModelType.swift index 8010dbb48..643cf4029 100644 --- a/Riot/Modules/Rooms/ShowDirectory/ShowDirectoryViewModelType.swift +++ b/Riot/Modules/Rooms/ShowDirectory/ShowDirectoryViewModelType.swift @@ -24,6 +24,7 @@ protocol ShowDirectoryViewModelViewDelegate: class { protocol ShowDirectoryViewModelCoordinatorDelegate: class { func showDirectoryViewModelDidSelect(_ viewModel: ShowDirectoryViewModelType, room: MXPublicRoom) + func showDirectoryViewModel(_ viewModel: ShowDirectoryViewModelType, didSelectRoomWithIdOrAlias roomIdOrAlias: String) func showDirectoryViewModelDidTapCreateNewRoom(_ viewModel: ShowDirectoryViewModelType) func showDirectoryViewModelDidCancel(_ viewModel: ShowDirectoryViewModelType) func showDirectoryViewModelWantsToShowDirectoryServerPicker(_ viewModel: ShowDirectoryViewModelType)