implemented the navigation to the manage auth spaces screen

# Conflicts:
#	ElementX/Sources/FlowCoordinators/RoomFlowCoordinator.swift
#	ElementX/Sources/FlowCoordinators/SpaceSettingsFlowCoordinator.swift
#	ElementX/Sources/Screens/SecurityAndPrivacyScreen/SecurityAndPrivacyScreenCoordinator.swift
#	ElementX/Sources/Screens/SecurityAndPrivacyScreen/SecurityAndPrivacyScreenModels.swift
This commit is contained in:
Mauro Romito
2025-11-27 17:36:34 +01:00
committed by Mauro
parent 2556eccc29
commit 0dcf1ffda2
15 changed files with 340 additions and 51 deletions
@@ -472,6 +472,12 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
case (.roomDetails, .presentSecurityAndPrivacyScreen, .securityAndPrivacy):
presentSecurityAndPrivacyScreen()
case (.securityAndPrivacy, .presentManageAuthorizedSpacesScreen, .manageAuthorizedSpacesScreen):
guard let selection = (context.userInfo as? EventUserInfo)?.authorizedSpacesSelection else {
fatalError("Missing required AuthorizedSpacesSelection")
}
presentManageAuthorizedSpacesScreen(selection: selection)
case (.roomDetails, .presentReportRoomScreen, .reportRoom):
presentReportRoom()
@@ -1357,6 +1363,8 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
presentEditAddressScreen()
case .dismiss:
navigationStackCoordinator.pop()
case .displayManageAuthorizedSpacesScreen(let selection):
stateMachine.tryEvent(.presentManageAuthorizedSpacesScreen, userInfo: EventUserInfo(animated: true, authorizedSpacesSelection: selection))
}
}
.store(in: &cancellables)
@@ -1366,6 +1374,25 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
}
}
private func presentManageAuthorizedSpacesScreen(selection: AuthorizedSpacesSelection) {
let navigationStack = NavigationStackCoordinator()
let coordinator = ManageAuthorizedSpacesScreenCoordinator(parameters: .init(authorizedSpacesSelection: selection,
mediaProvider: flowParameters.userSession.mediaProvider))
coordinator.actionsPublisher.sink { [weak self] action in
guard let self else { return }
switch action {
case .dismiss:
navigationStackCoordinator.setSheetCoordinator(nil)
}
}
.store(in: &cancellables)
navigationStack.setRootCoordinator(coordinator)
navigationStackCoordinator.setSheetCoordinator(navigationStack) { [weak self] in
self?.stateMachine.tryEvent(.dismissedManageAuthorizedSpacesScreen)
}
}
private func presentEditAddressScreen() {
let stackCoordinator = NavigationStackCoordinator()
let coordinator = EditRoomAddressScreenCoordinator(parameters: .init(roomProxy: roomProxy,
@@ -80,6 +80,7 @@ extension RoomFlowCoordinator {
case knockRequestsList(previousState: State)
case mediaEventsTimeline(previousState: State)
case securityAndPrivacy(previousState: State)
case manageAuthorizedSpacesScreen(previousState: State)
case reportRoom(previousState: State)
case declineAndBlockScreen
@@ -98,6 +99,7 @@ extension RoomFlowCoordinator {
let animated: Bool
var timelineController: TimelineControllerProtocol?
var spaceRoomListProxy: SpaceRoomListProxyProtocol?
var authorizedSpacesSelection: AuthorizedSpacesSelection?
}
enum Event: EventType {
@@ -174,6 +176,9 @@ extension RoomFlowCoordinator {
case presentSecurityAndPrivacyScreen
case dismissSecurityAndPrivacyScreen
case presentManageAuthorizedSpacesScreen
case dismissedManageAuthorizedSpacesScreen
case presentReportRoomScreen
case dismissReportRoomScreen
@@ -321,6 +326,11 @@ extension RoomFlowCoordinator {
case (.securityAndPrivacy(let previousState), .dismissSecurityAndPrivacyScreen):
return previousState
case (.securityAndPrivacy, .presentManageAuthorizedSpacesScreen):
return .manageAuthorizedSpacesScreen(previousState: fromState)
case (.manageAuthorizedSpacesScreen(let previousState), .dismissedManageAuthorizedSpacesScreen):
return previousState
case (.roomDetails, .presentReportRoomScreen):
return .reportRoom(previousState: fromState)
case (.reportRoom(let previousState), .dismissReportRoomScreen):
@@ -1,4 +1,3 @@
//
// Copyright 2025 New Vector Ltd.
//
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
@@ -33,6 +32,8 @@ final class SpaceSettingsFlowCoordinator: FlowCoordinatorProtocol {
case rolesAndPermissionsFlow
/// The members flow screen
case membersFlow
case manageAuthorizedSpacesScreen
}
enum Event: EventType {
@@ -55,6 +56,9 @@ final class SpaceSettingsFlowCoordinator: FlowCoordinatorProtocol {
case startRolesAndPermissionsFlow
case stopRolesAndPermissionsFlow
case presentManageAuthorizedSpacesScreen
case dismissedManageAuthorizedSpacesScreen
}
private let roomProxy: JoinedRoomProxyProtocol
@@ -126,6 +130,11 @@ final class SpaceSettingsFlowCoordinator: FlowCoordinatorProtocol {
case (.editAddress, .dismissedEditAddress):
return .securityAndPrivacy
case (.securityAndPrivacy, .presentManageAuthorizedSpacesScreen):
return .manageAuthorizedSpacesScreen
case (.manageAuthorizedSpacesScreen, .dismissedManageAuthorizedSpacesScreen):
return .securityAndPrivacy
case (.spaceSettings, .startMembersListFlow):
return .membersFlow
case (.membersFlow, .stopMembersListFlow):
@@ -164,6 +173,14 @@ final class SpaceSettingsFlowCoordinator: FlowCoordinatorProtocol {
case (.editAddress, .dismissedEditAddress, .securityAndPrivacy):
break
case (.securityAndPrivacy, .presentManageAuthorizedSpacesScreen, .manageAuthorizedSpacesScreen):
guard let selection = context.userInfo as? AuthorizedSpacesSelection else {
fatalError("AuthorizedSpacesSelection expected as userInfo")
}
presentManageAuthorizedSpacesScreen(selection: selection)
case (.manageAuthorizedSpacesScreen, .dismissedManageAuthorizedSpacesScreen, .securityAndPrivacy):
break
case (.spaceSettings, .startMembersListFlow, .membersFlow):
startMembersListFlow()
case (.membersFlow, .stopMembersListFlow, .spaceSettings):
@@ -258,6 +275,8 @@ final class SpaceSettingsFlowCoordinator: FlowCoordinatorProtocol {
self.stateMachine.tryEvent(.presentEditAddress)
case .dismiss:
navigationStackCoordinator.pop()
case .displayManageAuthorizedSpacesScreen(let selection):
self.stateMachine.tryEvent(.presentManageAuthorizedSpacesScreen, userInfo: selection)
}
}
.store(in: &cancellables)
@@ -287,6 +306,25 @@ final class SpaceSettingsFlowCoordinator: FlowCoordinatorProtocol {
}
}
private func presentManageAuthorizedSpacesScreen(selection: AuthorizedSpacesSelection) {
let navigationStack = NavigationStackCoordinator()
let coordinator = ManageAuthorizedSpacesScreenCoordinator(parameters: .init(authorizedSpacesSelection: selection,
mediaProvider: flowParameters.userSession.mediaProvider))
coordinator.actionsPublisher.sink { [weak self] action in
guard let self else { return }
switch action {
case .dismiss:
navigationStackCoordinator.setSheetCoordinator(nil)
}
}
.store(in: &cancellables)
navigationStack.setRootCoordinator(coordinator)
navigationStackCoordinator.setSheetCoordinator(navigationStack) { [weak self] in
self?.stateMachine.tryEvent(.dismissedManageAuthorizedSpacesScreen)
}
}
// MARK: - Other flows
private func startRolesAndPermissionsFlow() {