mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-04-25 11:02:48 +02:00
[Spaces] M10.8 Browsing users in a space #4682
- Update after code review
This commit is contained in:
@@ -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
|
||||
|
||||
+17
-7
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user