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