Move presentation and coordination logic from the RoomDetailsScreenCoordinator and into the RoomFlowCoordinator
This commit is contained in:
committed by
Stefan Ceriu
parent
b9db433590
commit
67d30f490c
@@ -38,6 +38,7 @@ enum RoomFlowCoordinatorAction: Equatable {
|
||||
}
|
||||
}
|
||||
|
||||
// swiftlint:disable file_length
|
||||
class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
||||
private let userSession: UserSessionProtocol
|
||||
private let roomTimelineControllerFactory: RoomTimelineControllerFactoryProtocol
|
||||
@@ -139,11 +140,40 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
||||
return .room(roomID: roomID)
|
||||
case (.dismissRoom, .roomDetails):
|
||||
return .initial
|
||||
|
||||
case (.presentRoomDetailsEditScreen, .roomDetails(let roomID, _)):
|
||||
return .roomDetailsEditScreen(roomID: roomID)
|
||||
case (.dismissRoomDetailsEditScreen, .roomDetailsEditScreen(let roomID)):
|
||||
return .roomDetails(roomID: roomID, isRoot: false)
|
||||
|
||||
case (.presentNotificationSettingsScreen, .roomDetails(let roomID, _)):
|
||||
return .notificationSettings(roomID: roomID)
|
||||
case (.dismissNotificationSettingsScreen, .notificationSettings(let roomID)):
|
||||
return .roomDetails(roomID: roomID, isRoot: false)
|
||||
|
||||
case (.presentGlobalNotificationSettingsScreen, .notificationSettings(let roomID)):
|
||||
return .globalNotificationSettings(roomID: roomID)
|
||||
case (.dismissGlobalNotificationSettingsScreen, .globalNotificationSettings(let roomID)):
|
||||
return .notificationSettings(roomID: roomID)
|
||||
|
||||
case (.presentRoomMembersList, .roomDetails(let roomID, _)):
|
||||
return .roomMembersList(roomID: roomID)
|
||||
case (.dismissRoomMembersList, .roomMembersList(let roomID)):
|
||||
return .roomDetails(roomID: roomID, isRoot: false)
|
||||
|
||||
case (.presentRoomMemberDetails(let member), .room(let roomID)):
|
||||
return .roomMemberDetails(roomID: roomID, member: member)
|
||||
case (.dismissRoomMemberDetails, .roomMemberDetails(let roomID, _)):
|
||||
return .room(roomID: roomID)
|
||||
return .roomMemberDetails(roomID: roomID, member: member, fromRoomMembersList: false)
|
||||
case (.presentRoomMemberDetails(let member), .roomMembersList(let roomID)):
|
||||
return .roomMemberDetails(roomID: roomID, member: member, fromRoomMembersList: true)
|
||||
case (.dismissRoomMemberDetails, .roomMemberDetails(let roomID, _, let fromRoomMembersList)):
|
||||
return fromRoomMembersList ? .roomMembersList(roomID: roomID) : .room(roomID: roomID)
|
||||
|
||||
case (.presentInviteUsersScreen, .roomDetails(let roomID, _)):
|
||||
return .inviteUsersScreen(roomID: roomID, fromRoomMembersList: false)
|
||||
case (.presentInviteUsersScreen, .roomMembersList(let roomID)):
|
||||
return .inviteUsersScreen(roomID: roomID, fromRoomMembersList: true)
|
||||
case (.dismissInviteUsersScreen, .inviteUsersScreen(let roomID, let fromRoomMembersList)):
|
||||
return fromRoomMembersList ? .roomMembersList(roomID: roomID) : .roomDetails(roomID: roomID, isRoot: false)
|
||||
|
||||
case (.presentReportContent(let itemID, let senderID), .room(let roomID)):
|
||||
return .reportContent(roomID: roomID, itemID: itemID, senderID: senderID)
|
||||
@@ -176,11 +206,6 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
||||
return .mapNavigator(roomID: roomID)
|
||||
case (.dismissMapNavigator, .mapNavigator(let roomID)):
|
||||
return .room(roomID: roomID)
|
||||
|
||||
case (.presentNotificationSettingsScreen, .roomDetails(let roomID, _)):
|
||||
return .notificationSettingsScreen(roomID: roomID)
|
||||
case (.dismissNotificationSettingsScreen, .notificationSettingsScreen(let roomID)):
|
||||
return .roomDetails(roomID: roomID, isRoot: false)
|
||||
|
||||
case (.presentPollForm, .room(let roomID)):
|
||||
return .pollForm(roomID: roomID)
|
||||
@@ -218,6 +243,46 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
||||
case (.roomDetails, .dismissRoom, .initial):
|
||||
dismissRoom(animated: animated)
|
||||
|
||||
case (.roomDetails, .presentRoomDetailsEditScreen(let accountOwner), .roomDetailsEditScreen):
|
||||
presentRoomDetailsEditScreen(accountOwner: accountOwner.value)
|
||||
case (.roomDetailsEditScreen, .dismissRoomDetailsEditScreen, .roomDetails):
|
||||
break
|
||||
|
||||
case (.roomDetails, .presentNotificationSettingsScreen, .notificationSettings):
|
||||
presentNotificationSettingsScreen()
|
||||
case (.notificationSettings, .dismissNotificationSettingsScreen, .roomDetails):
|
||||
break
|
||||
|
||||
case (.notificationSettings, .presentGlobalNotificationSettingsScreen, .globalNotificationSettings):
|
||||
presentGlobalNotificationSettingsScreen(animated: animated)
|
||||
case (.globalNotificationSettings, .dismissGlobalNotificationSettingsScreen, .notificationSettings):
|
||||
break
|
||||
|
||||
case (.roomDetails, .presentRoomMembersList, .roomMembersList):
|
||||
presentRoomMembersList()
|
||||
case (.roomMembersList, .dismissRoomMembersList, .roomDetails):
|
||||
break
|
||||
|
||||
case (.room, .presentRoomMemberDetails, .roomMemberDetails(_, let member, _)):
|
||||
presentRoomMemberDetails(member: member.value)
|
||||
case (.roomMemberDetails, .dismissRoomMemberDetails, .room):
|
||||
break
|
||||
|
||||
case (.roomMembersList, .presentRoomMemberDetails, .roomMemberDetails(_, let member, _)):
|
||||
presentRoomMemberDetails(member: member.value)
|
||||
case (.roomMemberDetails, .dismissRoomMemberDetails, .roomMembersList):
|
||||
break
|
||||
|
||||
case (.roomDetails, .presentInviteUsersScreen, .inviteUsersScreen):
|
||||
presentInviteUsersScreen()
|
||||
case (.inviteUsersScreen, .dismissInviteUsersScreen, .roomDetails):
|
||||
break
|
||||
|
||||
case (.roomMembersList, .presentInviteUsersScreen, .inviteUsersScreen):
|
||||
presentInviteUsersScreen()
|
||||
case (.inviteUsersScreen, .dismissInviteUsersScreen, .roomMembersList):
|
||||
break
|
||||
|
||||
case (.room, .presentReportContent, .reportContent(_, let itemID, let senderID)):
|
||||
presentReportContent(for: itemID, from: senderID)
|
||||
case (.reportContent, .dismissReportContent, .room):
|
||||
@@ -239,11 +304,6 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
||||
presentEmojiPicker(for: itemID, selectedEmoji: selectedEmoji)
|
||||
case (.emojiPicker, .dismissEmojiPicker, .room):
|
||||
break
|
||||
|
||||
case (.room, .presentRoomMemberDetails, .roomMemberDetails(_, let member)):
|
||||
presentRoomMemberDetails(member: member.value)
|
||||
case (.roomMemberDetails, .dismissRoomMemberDetails, .room):
|
||||
break
|
||||
|
||||
case (.room, .presentMessageForwarding(let itemID), .messageForwarding):
|
||||
presentMessageForwarding(for: itemID)
|
||||
@@ -254,11 +314,6 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
||||
presentMapNavigator(interactionMode: mode)
|
||||
case (.mapNavigator, .dismissMapNavigator, .room):
|
||||
break
|
||||
|
||||
case (.roomDetails, .presentNotificationSettingsScreen, .notificationSettingsScreen):
|
||||
presentNotificationSettingsScreen(animated: animated)
|
||||
case (.notificationSettingsScreen, .dismissNotificationSettingsScreen, .roomDetails):
|
||||
break
|
||||
|
||||
case (.room, .presentPollForm(let mode), .pollForm):
|
||||
presentPollForm(mode: mode)
|
||||
@@ -440,19 +495,25 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
||||
}
|
||||
|
||||
let params = RoomDetailsScreenCoordinatorParameters(accountUserID: userSession.userID,
|
||||
navigationStackCoordinator: navigationStackCoordinator,
|
||||
roomProxy: roomProxy,
|
||||
mediaProvider: userSession.mediaProvider,
|
||||
userDiscoveryService: UserDiscoveryService(clientProxy: userSession.clientProxy),
|
||||
userIndicatorController: userIndicatorController,
|
||||
notificationSettings: userSession.clientProxy.notificationSettings)
|
||||
let coordinator = RoomDetailsScreenCoordinator(parameters: params)
|
||||
coordinator.actions.sink { [weak self] action in
|
||||
guard let self else { return }
|
||||
|
||||
switch action {
|
||||
case .leftRoom:
|
||||
self?.dismissRoom(animated: animated)
|
||||
dismissRoom(animated: animated)
|
||||
case .presentRoomMembersList:
|
||||
stateMachine.tryEvent(.presentRoomMembersList)
|
||||
case .presentRoomDetailsEditScreen(let accountOwner):
|
||||
stateMachine.tryEvent(.presentRoomDetailsEditScreen(accountOwner: .init(value: accountOwner)))
|
||||
case .presentNotificationSettingsScreen:
|
||||
self?.stateMachine.tryEvent(.presentNotificationSettingsScreen)
|
||||
stateMachine.tryEvent(.presentNotificationSettingsScreen)
|
||||
case .presentInviteUsersScreen:
|
||||
stateMachine.tryEvent(.presentInviteUsersScreen)
|
||||
}
|
||||
}
|
||||
.store(in: &cancellables)
|
||||
@@ -480,6 +541,62 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
||||
}
|
||||
}
|
||||
|
||||
private func presentRoomMembersList() {
|
||||
guard let roomProxy else {
|
||||
fatalError()
|
||||
}
|
||||
|
||||
let params = RoomMembersListScreenCoordinatorParameters(mediaProvider: userSession.mediaProvider,
|
||||
roomProxy: roomProxy)
|
||||
let coordinator = RoomMembersListScreenCoordinator(parameters: params)
|
||||
|
||||
coordinator.actions
|
||||
.sink { [weak self] action in
|
||||
guard let self else { return }
|
||||
|
||||
switch action {
|
||||
case .invite:
|
||||
stateMachine.tryEvent(.presentInviteUsersScreen)
|
||||
case .selectedMember(let member):
|
||||
stateMachine.tryEvent(.presentRoomMemberDetails(member: .init(value: member)))
|
||||
}
|
||||
}
|
||||
.store(in: &cancellables)
|
||||
|
||||
navigationStackCoordinator.push(coordinator) { [weak self] in
|
||||
self?.stateMachine.tryEvent(.dismissRoomMembersList)
|
||||
}
|
||||
}
|
||||
|
||||
private func presentRoomDetailsEditScreen(accountOwner: RoomMemberProxyProtocol) {
|
||||
guard let roomProxy else {
|
||||
fatalError()
|
||||
}
|
||||
|
||||
let navigationStackCoordinator = NavigationStackCoordinator()
|
||||
|
||||
let roomDetailsEditParameters = RoomDetailsEditScreenCoordinatorParameters(accountOwner: accountOwner,
|
||||
mediaProvider: userSession.mediaProvider,
|
||||
navigationStackCoordinator: navigationStackCoordinator,
|
||||
roomProxy: roomProxy,
|
||||
userIndicatorController: userIndicatorController)
|
||||
let roomDetailsEditCoordinator = RoomDetailsEditScreenCoordinator(parameters: roomDetailsEditParameters)
|
||||
|
||||
roomDetailsEditCoordinator.actions.sink { [weak self] action in
|
||||
switch action {
|
||||
case .dismiss:
|
||||
self?.navigationStackCoordinator.setSheetCoordinator(nil)
|
||||
}
|
||||
}
|
||||
.store(in: &cancellables)
|
||||
|
||||
navigationStackCoordinator.setRootCoordinator(roomDetailsEditCoordinator)
|
||||
|
||||
self.navigationStackCoordinator.setSheetCoordinator(navigationStackCoordinator) { [weak self] in
|
||||
self?.stateMachine.tryEvent(.dismissRoomDetailsEditScreen)
|
||||
}
|
||||
}
|
||||
|
||||
private func presentReportContent(for itemID: TimelineItemIdentifier, from senderID: String) {
|
||||
guard let roomProxy, let eventID = itemID.eventID else {
|
||||
fatalError()
|
||||
@@ -730,6 +847,7 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
||||
guard let roomProxy else {
|
||||
fatalError()
|
||||
}
|
||||
|
||||
let params = RoomMemberDetailsScreenCoordinatorParameters(roomProxy: roomProxy,
|
||||
roomMemberProxy: member,
|
||||
mediaProvider: userSession.mediaProvider,
|
||||
@@ -802,7 +920,30 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
||||
stateMachine.tryEvent(.presentRoom(roomID: roomID), userInfo: EventUserInfo(animated: true, destinationRoomProxy: targetRoomProxy))
|
||||
}
|
||||
|
||||
private func presentNotificationSettingsScreen(animated: Bool) {
|
||||
private func presentNotificationSettingsScreen() {
|
||||
guard let roomProxy else {
|
||||
fatalError()
|
||||
}
|
||||
|
||||
let parameters = RoomNotificationSettingsScreenCoordinatorParameters(notificationSettingsProxy: userSession.clientProxy.notificationSettings,
|
||||
roomProxy: roomProxy,
|
||||
displayAsUserDefinedRoomSettings: false)
|
||||
|
||||
let coordinator = RoomNotificationSettingsScreenCoordinator(parameters: parameters)
|
||||
coordinator.actions.sink { [weak self] actions in
|
||||
switch actions {
|
||||
case .presentGlobalNotificationSettingsScreen:
|
||||
self?.stateMachine.tryEvent(.presentGlobalNotificationSettingsScreen)
|
||||
}
|
||||
}
|
||||
.store(in: &cancellables)
|
||||
|
||||
navigationStackCoordinator.push(coordinator) { [weak self] in
|
||||
self?.stateMachine.tryEvent(.dismissNotificationSettingsScreen)
|
||||
}
|
||||
}
|
||||
|
||||
private func presentGlobalNotificationSettingsScreen(animated: Bool) {
|
||||
let navigationCoordinator = NavigationStackCoordinator()
|
||||
let parameters = NotificationSettingsScreenCoordinatorParameters(navigationStackCoordinator: navigationCoordinator,
|
||||
userSession: userSession,
|
||||
@@ -820,7 +961,79 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
||||
|
||||
navigationCoordinator.setRootCoordinator(coordinator)
|
||||
navigationStackCoordinator.setSheetCoordinator(navigationCoordinator) { [weak self] in
|
||||
self?.stateMachine.tryEvent(.dismissNotificationSettingsScreen)
|
||||
self?.stateMachine.tryEvent(.dismissGlobalNotificationSettingsScreen)
|
||||
}
|
||||
}
|
||||
|
||||
private func presentInviteUsersScreen() {
|
||||
guard let roomProxy else {
|
||||
fatalError()
|
||||
}
|
||||
|
||||
let selectedUsersSubject: CurrentValueSubject<[UserProfileProxy], Never> = .init([])
|
||||
|
||||
let inviteUsersStackCoordinator = NavigationStackCoordinator()
|
||||
let inviteParameters = InviteUsersScreenCoordinatorParameters(selectedUsers: .init(selectedUsersSubject),
|
||||
roomType: .room(roomProxy: roomProxy),
|
||||
mediaProvider: userSession.mediaProvider,
|
||||
userDiscoveryService: UserDiscoveryService(clientProxy: userSession.clientProxy),
|
||||
userIndicatorController: userIndicatorController)
|
||||
|
||||
let coordinator = InviteUsersScreenCoordinator(parameters: inviteParameters)
|
||||
inviteUsersStackCoordinator.setRootCoordinator(coordinator)
|
||||
|
||||
coordinator.actions.sink { [weak self] action in
|
||||
guard let self else { return }
|
||||
|
||||
switch action {
|
||||
case .cancel:
|
||||
navigationStackCoordinator.setSheetCoordinator(nil)
|
||||
case .proceed:
|
||||
break
|
||||
case .invite(let users):
|
||||
self.inviteUsers(users, in: roomProxy)
|
||||
case .toggleUser(let user):
|
||||
var selectedUsers = selectedUsersSubject.value
|
||||
|
||||
if let index = selectedUsers.firstIndex(where: { $0.userID == user.userID }) {
|
||||
selectedUsers.remove(at: index)
|
||||
} else {
|
||||
selectedUsers.append(user)
|
||||
}
|
||||
|
||||
selectedUsersSubject.send(selectedUsers)
|
||||
}
|
||||
}
|
||||
.store(in: &cancellables)
|
||||
|
||||
navigationStackCoordinator.setSheetCoordinator(inviteUsersStackCoordinator) { [weak self] in
|
||||
self?.stateMachine.tryEvent(.dismissInviteUsersScreen)
|
||||
}
|
||||
}
|
||||
|
||||
private func inviteUsers(_ users: [String], in room: RoomProxyProtocol) {
|
||||
navigationStackCoordinator.setSheetCoordinator(nil)
|
||||
|
||||
Task {
|
||||
let result: Result<Void, RoomProxyError> = await withTaskGroup(of: Result<Void, RoomProxyError>.self) { group in
|
||||
for user in users {
|
||||
group.addTask {
|
||||
await room.invite(userID: user)
|
||||
}
|
||||
}
|
||||
|
||||
return await group.first { inviteResult in
|
||||
inviteResult.isFailure
|
||||
} ?? .success(())
|
||||
}
|
||||
|
||||
guard case .failure = result else {
|
||||
return
|
||||
}
|
||||
|
||||
userIndicatorController.alertInfo = .init(id: .init(),
|
||||
title: L10n.commonUnableToInviteTitle,
|
||||
message: L10n.commonUnableToInviteMessage)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -841,15 +1054,19 @@ private extension RoomFlowCoordinator {
|
||||
enum State: StateType {
|
||||
case initial
|
||||
case room(roomID: String)
|
||||
case reportContent(roomID: String, itemID: TimelineItemIdentifier, senderID: String)
|
||||
case roomDetails(roomID: String, isRoot: Bool)
|
||||
case roomDetailsEditScreen(roomID: String)
|
||||
case notificationSettings(roomID: String)
|
||||
case globalNotificationSettings(roomID: String)
|
||||
case roomMembersList(roomID: String)
|
||||
case roomMemberDetails(roomID: String, member: HashableRoomMemberWrapper, fromRoomMembersList: Bool)
|
||||
case inviteUsersScreen(roomID: String, fromRoomMembersList: Bool)
|
||||
case mediaUploadPicker(roomID: String, source: MediaPickerScreenSource)
|
||||
case mediaUploadPreview(roomID: String, fileURL: URL)
|
||||
case emojiPicker(roomID: String, itemID: TimelineItemIdentifier, selectedEmojis: Set<String>)
|
||||
case mapNavigator(roomID: String)
|
||||
case roomMemberDetails(roomID: String, member: HashableRoomMemberWrapper)
|
||||
case messageForwarding(roomID: String, itemID: TimelineItemIdentifier)
|
||||
case notificationSettingsScreen(roomID: String)
|
||||
case reportContent(roomID: String, itemID: TimelineItemIdentifier, senderID: String)
|
||||
case pollForm(roomID: String)
|
||||
}
|
||||
|
||||
@@ -867,6 +1084,24 @@ private extension RoomFlowCoordinator {
|
||||
|
||||
case presentRoomDetails(roomID: String)
|
||||
case dismissRoomDetails
|
||||
|
||||
case presentRoomDetailsEditScreen(accountOwner: HashableRoomMemberWrapper)
|
||||
case dismissRoomDetailsEditScreen
|
||||
|
||||
case presentNotificationSettingsScreen
|
||||
case dismissNotificationSettingsScreen
|
||||
|
||||
case presentGlobalNotificationSettingsScreen
|
||||
case dismissGlobalNotificationSettingsScreen
|
||||
|
||||
case presentRoomMembersList
|
||||
case dismissRoomMembersList
|
||||
|
||||
case presentRoomMemberDetails(member: HashableRoomMemberWrapper)
|
||||
case dismissRoomMemberDetails
|
||||
|
||||
case presentInviteUsersScreen
|
||||
case dismissInviteUsersScreen
|
||||
|
||||
case presentMediaUploadPicker(source: MediaPickerScreenSource)
|
||||
case dismissMediaUploadPicker
|
||||
@@ -880,14 +1115,8 @@ private extension RoomFlowCoordinator {
|
||||
case presentMapNavigator(interactionMode: StaticLocationInteractionMode)
|
||||
case dismissMapNavigator
|
||||
|
||||
case presentRoomMemberDetails(member: HashableRoomMemberWrapper)
|
||||
case dismissRoomMemberDetails
|
||||
|
||||
case presentMessageForwarding(itemID: TimelineItemIdentifier)
|
||||
case dismissMessageForwarding
|
||||
|
||||
case presentNotificationSettingsScreen
|
||||
case dismissNotificationSettingsScreen
|
||||
|
||||
case presentPollForm(mode: PollFormMode)
|
||||
case dismissPollForm
|
||||
@@ -899,3 +1128,14 @@ private extension GeoURI {
|
||||
"Location was shared at \(string)"
|
||||
}
|
||||
}
|
||||
|
||||
private extension Result {
|
||||
var isFailure: Bool {
|
||||
switch self {
|
||||
case .success:
|
||||
return false
|
||||
case .failure:
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,26 +19,23 @@ import SwiftUI
|
||||
|
||||
struct RoomDetailsScreenCoordinatorParameters {
|
||||
let accountUserID: String
|
||||
weak var navigationStackCoordinator: NavigationStackCoordinator?
|
||||
let roomProxy: RoomProxyProtocol
|
||||
let mediaProvider: MediaProviderProtocol
|
||||
let userDiscoveryService: UserDiscoveryServiceProtocol
|
||||
let userIndicatorController: UserIndicatorControllerProtocol
|
||||
let notificationSettings: NotificationSettingsProxyProtocol
|
||||
}
|
||||
|
||||
enum RoomDetailsScreenCoordinatorAction {
|
||||
case leftRoom
|
||||
case presentRoomMembersList
|
||||
case presentRoomDetailsEditScreen(accountOwner: RoomMemberProxyProtocol)
|
||||
case presentNotificationSettingsScreen
|
||||
case presentInviteUsersScreen
|
||||
}
|
||||
|
||||
final class RoomDetailsScreenCoordinator: CoordinatorProtocol {
|
||||
private let parameters: RoomDetailsScreenCoordinatorParameters
|
||||
private var viewModel: RoomDetailsScreenViewModelProtocol
|
||||
private let selectedUsers: CurrentValueSubject<[UserProfileProxy], Never> = .init([])
|
||||
private var navigationStackCoordinator: NavigationStackCoordinator? {
|
||||
parameters.navigationStackCoordinator
|
||||
}
|
||||
|
||||
private let actionsSubject: PassthroughSubject<RoomDetailsScreenCoordinatorAction, Never> = .init()
|
||||
private var cancellables = Set<AnyCancellable>()
|
||||
@@ -66,15 +63,15 @@ final class RoomDetailsScreenCoordinator: CoordinatorProtocol {
|
||||
|
||||
switch action {
|
||||
case .requestMemberDetailsPresentation:
|
||||
presentRoomMembersList()
|
||||
actionsSubject.send(.presentRoomMembersList)
|
||||
case .requestInvitePeoplePresentation:
|
||||
presentInviteUsersScreen()
|
||||
actionsSubject.send(.presentInviteUsersScreen)
|
||||
case .leftRoom:
|
||||
actionsSubject.send(.leftRoom)
|
||||
case .requestEditDetailsPresentation(let accountOwner):
|
||||
presentRoomDetailsEditScreen(accountOwner: accountOwner)
|
||||
actionsSubject.send(.presentRoomDetailsEditScreen(accountOwner: accountOwner))
|
||||
case .requestNotificationSettingsPresentation:
|
||||
presentNotificationSettings()
|
||||
actionsSubject.send(.presentNotificationSettingsScreen)
|
||||
}
|
||||
}
|
||||
.store(in: &cancellables)
|
||||
@@ -87,144 +84,4 @@ final class RoomDetailsScreenCoordinator: CoordinatorProtocol {
|
||||
func toPresentable() -> AnyView {
|
||||
AnyView(RoomDetailsScreen(context: viewModel.context))
|
||||
}
|
||||
|
||||
// MARK: - Private
|
||||
|
||||
private func presentRoomMembersList() {
|
||||
let params = RoomMembersListScreenCoordinatorParameters(navigationStackCoordinator: navigationStackCoordinator,
|
||||
mediaProvider: parameters.mediaProvider,
|
||||
roomProxy: parameters.roomProxy)
|
||||
let coordinator = RoomMembersListScreenCoordinator(parameters: params)
|
||||
|
||||
coordinator.actions
|
||||
.sink { [weak self] action in
|
||||
guard let self else { return }
|
||||
|
||||
switch action {
|
||||
case .invite:
|
||||
presentInviteUsersScreen()
|
||||
}
|
||||
}
|
||||
.store(in: &cancellables)
|
||||
|
||||
navigationStackCoordinator?.push(coordinator)
|
||||
}
|
||||
|
||||
private func presentInviteUsersScreen() {
|
||||
let inviteUsersStackCoordinator = NavigationStackCoordinator()
|
||||
let inviteParameters = InviteUsersScreenCoordinatorParameters(selectedUsers: .init(selectedUsers),
|
||||
roomType: .room(roomProxy: parameters.roomProxy),
|
||||
mediaProvider: parameters.mediaProvider,
|
||||
userDiscoveryService: parameters.userDiscoveryService,
|
||||
userIndicatorController: parameters.userIndicatorController)
|
||||
|
||||
let coordinator = InviteUsersScreenCoordinator(parameters: inviteParameters)
|
||||
inviteUsersStackCoordinator.setRootCoordinator(coordinator)
|
||||
|
||||
coordinator.actions.sink { [weak self] action in
|
||||
guard let self else { return }
|
||||
|
||||
switch action {
|
||||
case .cancel:
|
||||
navigationStackCoordinator?.setSheetCoordinator(nil)
|
||||
case .proceed:
|
||||
break
|
||||
case .invite(let users):
|
||||
self.inviteUsers(users, in: parameters.roomProxy)
|
||||
case .toggleUser(let user):
|
||||
self.toggleUser(user)
|
||||
}
|
||||
}
|
||||
.store(in: &cancellables)
|
||||
|
||||
navigationStackCoordinator?.setSheetCoordinator(inviteUsersStackCoordinator) { [weak self] in
|
||||
self?.selectedUsers.value = []
|
||||
}
|
||||
}
|
||||
|
||||
private func presentRoomDetailsEditScreen(accountOwner: RoomMemberProxyProtocol) {
|
||||
let navigationStackCoordinator = NavigationStackCoordinator()
|
||||
|
||||
let roomDetailsEditParameters = RoomDetailsEditScreenCoordinatorParameters(accountOwner: accountOwner,
|
||||
mediaProvider: parameters.mediaProvider,
|
||||
navigationStackCoordinator: navigationStackCoordinator,
|
||||
roomProxy: parameters.roomProxy,
|
||||
userIndicatorController: parameters.userIndicatorController)
|
||||
let roomDetailsEditCoordinator = RoomDetailsEditScreenCoordinator(parameters: roomDetailsEditParameters)
|
||||
|
||||
roomDetailsEditCoordinator.actions.sink { [weak self] action in
|
||||
switch action {
|
||||
case .dismiss:
|
||||
self?.navigationStackCoordinator?.setSheetCoordinator(nil)
|
||||
}
|
||||
}
|
||||
.store(in: &cancellables)
|
||||
|
||||
navigationStackCoordinator.setRootCoordinator(roomDetailsEditCoordinator)
|
||||
|
||||
self.navigationStackCoordinator?.setSheetCoordinator(navigationStackCoordinator)
|
||||
}
|
||||
|
||||
private func toggleUser(_ user: UserProfileProxy) {
|
||||
var selectedUsers = selectedUsers.value
|
||||
if let index = selectedUsers.firstIndex(where: { $0.userID == user.userID }) {
|
||||
selectedUsers.remove(at: index)
|
||||
} else {
|
||||
selectedUsers.append(user)
|
||||
}
|
||||
self.selectedUsers.send(selectedUsers)
|
||||
}
|
||||
|
||||
private func inviteUsers(_ users: [String], in room: RoomProxyProtocol) {
|
||||
navigationStackCoordinator?.setSheetCoordinator(nil)
|
||||
|
||||
Task {
|
||||
let result: Result<Void, RoomProxyError> = await withTaskGroup(of: Result<Void, RoomProxyError>.self) { group in
|
||||
for user in users {
|
||||
group.addTask {
|
||||
await room.invite(userID: user)
|
||||
}
|
||||
}
|
||||
|
||||
return await group.first { inviteResult in
|
||||
inviteResult.isFailure
|
||||
} ?? .success(())
|
||||
}
|
||||
|
||||
guard case .failure = result else {
|
||||
return
|
||||
}
|
||||
|
||||
parameters.userIndicatorController.alertInfo = .init(id: .init(),
|
||||
title: L10n.commonUnableToInviteTitle,
|
||||
message: L10n.commonUnableToInviteMessage)
|
||||
}
|
||||
}
|
||||
|
||||
private func presentNotificationSettings() {
|
||||
let roomNotificationSettingsParameters = RoomNotificationSettingsScreenCoordinatorParameters(navigationStackCoordinator: parameters.navigationStackCoordinator,
|
||||
notificationSettingsProxy: parameters.notificationSettings,
|
||||
roomProxy: parameters.roomProxy,
|
||||
displayAsUserDefinedRoomSettings: false)
|
||||
let roomNotificationSettingsCoordinator = RoomNotificationSettingsScreenCoordinator(parameters: roomNotificationSettingsParameters)
|
||||
roomNotificationSettingsCoordinator.actions.sink { [weak self] actions in
|
||||
switch actions {
|
||||
case .presentNotificationSettingsScreen:
|
||||
self?.actionsSubject.send(.presentNotificationSettingsScreen)
|
||||
}
|
||||
}
|
||||
.store(in: &cancellables)
|
||||
navigationStackCoordinator?.push(roomNotificationSettingsCoordinator)
|
||||
}
|
||||
}
|
||||
|
||||
private extension Result {
|
||||
var isFailure: Bool {
|
||||
switch self {
|
||||
case .success:
|
||||
return false
|
||||
case .failure:
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,21 +18,18 @@ import Combine
|
||||
import SwiftUI
|
||||
|
||||
struct RoomMembersListScreenCoordinatorParameters {
|
||||
weak var navigationStackCoordinator: NavigationStackCoordinator?
|
||||
let mediaProvider: MediaProviderProtocol
|
||||
let roomProxy: RoomProxyProtocol
|
||||
}
|
||||
|
||||
enum RoomMembersListScreenCoordinatorAction {
|
||||
case invite
|
||||
case selectedMember(RoomMemberProxyProtocol)
|
||||
}
|
||||
|
||||
final class RoomMembersListScreenCoordinator: CoordinatorProtocol {
|
||||
private let parameters: RoomMembersListScreenCoordinatorParameters
|
||||
private var viewModel: RoomMembersListScreenViewModelProtocol
|
||||
private var navigationStackCoordinator: NavigationStackCoordinator? {
|
||||
parameters.navigationStackCoordinator
|
||||
}
|
||||
|
||||
private let actionsSubject: PassthroughSubject<RoomMembersListScreenCoordinatorAction, Never> = .init()
|
||||
private var cancellables = Set<AnyCancellable>()
|
||||
@@ -56,7 +53,7 @@ final class RoomMembersListScreenCoordinator: CoordinatorProtocol {
|
||||
|
||||
switch action {
|
||||
case let .selectMember(member):
|
||||
selectMember(member)
|
||||
actionsSubject.send(.selectedMember(member))
|
||||
case .invite:
|
||||
actionsSubject.send(.invite)
|
||||
}
|
||||
@@ -67,16 +64,4 @@ final class RoomMembersListScreenCoordinator: CoordinatorProtocol {
|
||||
func toPresentable() -> AnyView {
|
||||
AnyView(RoomMembersListScreen(context: viewModel.context))
|
||||
}
|
||||
|
||||
// MARK: - Private
|
||||
|
||||
private func selectMember(_ member: RoomMemberProxyProtocol) {
|
||||
let parameters = RoomMemberDetailsScreenCoordinatorParameters(roomProxy: parameters.roomProxy,
|
||||
roomMemberProxy: member,
|
||||
mediaProvider: parameters.mediaProvider,
|
||||
userIndicatorController: ServiceLocator.shared.userIndicatorController)
|
||||
let coordinator = RoomMemberDetailsScreenCoordinator(parameters: parameters)
|
||||
|
||||
navigationStackCoordinator?.push(coordinator)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ struct RoomNotificationSettingsScreenCoordinatorParameters {
|
||||
}
|
||||
|
||||
enum RoomNotificationSettingsScreenCoordinatorAction {
|
||||
case presentNotificationSettingsScreen
|
||||
case presentGlobalNotificationSettingsScreen
|
||||
}
|
||||
|
||||
final class RoomNotificationSettingsScreenCoordinator: CoordinatorProtocol {
|
||||
@@ -54,7 +54,7 @@ final class RoomNotificationSettingsScreenCoordinator: CoordinatorProtocol {
|
||||
viewModel.actions.sink { [weak self] action in
|
||||
switch action {
|
||||
case .openGlobalSettings:
|
||||
self?.actionsSubject.send(.presentNotificationSettingsScreen)
|
||||
self?.actionsSubject.send(.presentGlobalNotificationSettingsScreen)
|
||||
case .dismiss:
|
||||
self?.parameters.navigationStackCoordinator?.pop(animated: true)
|
||||
}
|
||||
|
||||
@@ -586,10 +586,8 @@ class MockScreen: Identifiable {
|
||||
memberForID: .mockOwner(allowedStateEvents: [], canInviteUsers: false),
|
||||
activeMembersCount: members.count))
|
||||
let coordinator = RoomDetailsScreenCoordinator(parameters: .init(accountUserID: "@owner:somewhere.com",
|
||||
navigationStackCoordinator: navigationStackCoordinator,
|
||||
roomProxy: roomProxy,
|
||||
mediaProvider: MockMediaProvider(),
|
||||
userDiscoveryService: UserDiscoveryServiceMock(),
|
||||
userIndicatorController: ServiceLocator.shared.userIndicatorController,
|
||||
notificationSettings: NotificationSettingsProxyMock(with: .init())))
|
||||
navigationStackCoordinator.setRootCoordinator(coordinator)
|
||||
@@ -607,10 +605,8 @@ class MockScreen: Identifiable {
|
||||
memberForID: .mockOwner(allowedStateEvents: [], canInviteUsers: false),
|
||||
activeMembersCount: members.count))
|
||||
let coordinator = RoomDetailsScreenCoordinator(parameters: .init(accountUserID: "@owner:somewhere.com",
|
||||
navigationStackCoordinator: navigationStackCoordinator,
|
||||
roomProxy: roomProxy,
|
||||
mediaProvider: MockMediaProvider(),
|
||||
userDiscoveryService: UserDiscoveryServiceMock(),
|
||||
userIndicatorController: ServiceLocator.shared.userIndicatorController,
|
||||
notificationSettings: NotificationSettingsProxyMock(with: .init())))
|
||||
navigationStackCoordinator.setRootCoordinator(coordinator)
|
||||
@@ -630,10 +626,8 @@ class MockScreen: Identifiable {
|
||||
memberForID: owner,
|
||||
activeMembersCount: members.count))
|
||||
let coordinator = RoomDetailsScreenCoordinator(parameters: .init(accountUserID: "@owner:somewhere.com",
|
||||
navigationStackCoordinator: navigationStackCoordinator,
|
||||
roomProxy: roomProxy,
|
||||
mediaProvider: MockMediaProvider(),
|
||||
userDiscoveryService: UserDiscoveryServiceMock(),
|
||||
userIndicatorController: ServiceLocator.shared.userIndicatorController,
|
||||
notificationSettings: NotificationSettingsProxyMock(with: .init())))
|
||||
navigationStackCoordinator.setRootCoordinator(coordinator)
|
||||
@@ -649,10 +643,8 @@ class MockScreen: Identifiable {
|
||||
memberForID: owner,
|
||||
activeMembersCount: members.count))
|
||||
let coordinator = RoomDetailsScreenCoordinator(parameters: .init(accountUserID: "@owner:somewhere.com",
|
||||
navigationStackCoordinator: navigationStackCoordinator,
|
||||
roomProxy: roomProxy,
|
||||
mediaProvider: MockMediaProvider(),
|
||||
userDiscoveryService: UserDiscoveryServiceMock(),
|
||||
userIndicatorController: ServiceLocator.shared.userIndicatorController,
|
||||
notificationSettings: NotificationSettingsProxyMock(with: .init())))
|
||||
navigationStackCoordinator.setRootCoordinator(coordinator)
|
||||
@@ -669,10 +661,8 @@ class MockScreen: Identifiable {
|
||||
memberForID: .mockOwner(allowedStateEvents: [], canInviteUsers: false),
|
||||
activeMembersCount: members.count))
|
||||
let coordinator = RoomDetailsScreenCoordinator(parameters: .init(accountUserID: "@owner:somewhere.com",
|
||||
navigationStackCoordinator: navigationStackCoordinator,
|
||||
roomProxy: roomProxy,
|
||||
mediaProvider: MockMediaProvider(),
|
||||
userDiscoveryService: UserDiscoveryServiceMock(),
|
||||
userIndicatorController: ServiceLocator.shared.userIndicatorController,
|
||||
notificationSettings: NotificationSettingsProxyMock(with: .init())))
|
||||
navigationStackCoordinator.setRootCoordinator(coordinator)
|
||||
@@ -695,16 +685,14 @@ class MockScreen: Identifiable {
|
||||
case .roomMembersListScreen:
|
||||
let navigationStackCoordinator = NavigationStackCoordinator()
|
||||
let members: [RoomMemberProxyMock] = [.mockAlice, .mockBob, .mockCharlie]
|
||||
let coordinator = RoomMembersListScreenCoordinator(parameters: .init(navigationStackCoordinator: navigationStackCoordinator,
|
||||
mediaProvider: MockMediaProvider(),
|
||||
let coordinator = RoomMembersListScreenCoordinator(parameters: .init(mediaProvider: MockMediaProvider(),
|
||||
roomProxy: RoomProxyMock(with: .init(displayName: "test", members: members))))
|
||||
navigationStackCoordinator.setRootCoordinator(coordinator)
|
||||
return navigationStackCoordinator
|
||||
case .roomMembersListScreenPendingInvites:
|
||||
let navigationStackCoordinator = NavigationStackCoordinator()
|
||||
let members: [RoomMemberProxyMock] = [.mockInvitedAlice, .mockBob, .mockCharlie]
|
||||
let coordinator = RoomMembersListScreenCoordinator(parameters: .init(navigationStackCoordinator: navigationStackCoordinator,
|
||||
mediaProvider: MockMediaProvider(),
|
||||
let coordinator = RoomMembersListScreenCoordinator(parameters: .init(mediaProvider: MockMediaProvider(),
|
||||
roomProxy: RoomProxyMock(with: .init(displayName: "test", members: members))))
|
||||
navigationStackCoordinator.setRootCoordinator(coordinator)
|
||||
return navigationStackCoordinator
|
||||
|
||||
Reference in New Issue
Block a user