[Spaces] M10.8 Browsing users in a space #4682

- Update after code review
This commit is contained in:
Gil Eluard
2021-09-14 11:45:33 +02:00
parent 9527c2c639
commit aa931a3c1a
10 changed files with 101 additions and 68 deletions
@@ -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 {
@@ -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
@@ -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))
}
}
@@ -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))
}
}
}
@@ -21,6 +21,6 @@ import Foundation
/// SpaceMemberDetailViewController view state
enum SpaceMemberDetailViewState {
case loading
case loaded
case loaded(MXRoomMember, MXRoom?)
case error(Error)
}