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
@@ -19,6 +19,7 @@ struct SecurityAndPrivacyScreenCoordinatorParameters {
enum SecurityAndPrivacyScreenCoordinatorAction {
case displayEditAddressScreen
case dismiss
case displayManageAuthorizedSpacesScreen(AuthorizedSpacesSelection)
}
final class SecurityAndPrivacyScreenCoordinator: CoordinatorProtocol {
@@ -44,6 +45,8 @@ final class SecurityAndPrivacyScreenCoordinator: CoordinatorProtocol {
guard let self else { return }
switch action {
case .displayManageAuthorizedSpacesScreen(let selection):
actionsSubject.send(.displayManageAuthorizedSpacesScreen(selection))
case .displayEditAddressScreen:
actionsSubject.send(.displayEditAddressScreen)
case .dismiss:
@@ -11,6 +11,7 @@ import Foundation
enum SecurityAndPrivacyScreenViewModelAction {
case displayEditAddressScreen
case dismiss
case displayManageAuthorizedSpacesScreen(AuthorizedSpacesSelection)
}
struct SecurityAndPrivacyScreenViewState: BindableState {
@@ -81,8 +81,7 @@ class SecurityAndPrivacyScreenViewModel: SecurityAndPrivacyScreenViewModelType,
case .selectedSpaceMembersAccess:
handleSelectedSpaceMembersAccess()
case .manageSpaces:
// TODO: Implement multiple space selection
break
displayManageAuthorizedSpacesScreen()
}
}
@@ -236,15 +235,29 @@ class SecurityAndPrivacyScreenViewModel: SecurityAndPrivacyScreenViewModelType,
}
private func handleSelectedSpaceMembersAccess() {
switch context.viewState.spaceSelection {
case .singleJoined(let joinedParent):
context.desiredSettings.accessType = .spaceUsers(spaceIDs: [joinedParent.id])
case .singleUnknown(let id):
context.desiredSettings.accessType = .spaceUsers(spaceIDs: [id])
case .multiple:
// TODO: Implement multiple space selection
break
guard !state.bindings.desiredSettings.accessType.isSpaceUsers else {
return
}
switch state.spaceSelection {
case .singleJoined(let joinedParent):
state.bindings.desiredSettings.accessType = .spaceUsers(spaceIDs: [joinedParent.id])
case .singleUnknown(let id):
state.bindings.desiredSettings.accessType = .spaceUsers(spaceIDs: [id])
case .multiple:
displayManageAuthorizedSpacesScreen()
}
}
private func displayManageAuthorizedSpacesScreen() {
let joinedParentSpaces = state.joinedParentSpaces
let unknownSpaceIDs = state.currentSettings.accessType.spaceIDs.filter { id in
!joinedParentSpaces.contains(where: { $0.id == id })
}
let selectedIDs = Set(state.bindings.desiredSettings.accessType.spaceIDs)
actionsSubject.send(.displayManageAuthorizedSpacesScreen(.init(joinedParentSpaces: joinedParentSpaces,
unknownSpacesIDs: unknownSpaceIDs,
selectedIDs: selectedIDs)))
}
private static let loadingIndicatorIdentifier = "\(EditRoomAddressScreenViewModel.self)-Loading"