Space Settings: Leave Room (#4700)

* Implementation for all navigations inside the space settings aside the left space action

# Conflicts:
#	ElementX/Sources/FlowCoordinators/SpaceSettingsFlowCoordinator.swift

* refactored the leave space view to use its own view model

# Conflicts:
#	ElementX.xcodeproj/project.pbxproj

* implemented the leave space view model also in the settings screen, and corrected some tests

* reusing the details coordinator for the space settings screen

* leave space from settings implemented

* fix project

* minor pr fixes

* code improvements
This commit is contained in:
Mauro
2025-11-07 12:11:21 +01:00
committed by GitHub
parent 8974a4584a
commit 096e2d1713
22 changed files with 407 additions and 277 deletions
@@ -39,6 +39,7 @@ enum RoomDetailsScreenCoordinatorAction {
final class RoomDetailsScreenCoordinator: CoordinatorProtocol {
private var viewModel: RoomDetailsScreenViewModelProtocol
private let isSpace: Bool
private let actionsSubject: PassthroughSubject<RoomDetailsScreenCoordinatorAction, Never> = .init()
private var cancellables = Set<AnyCancellable>()
@@ -48,6 +49,7 @@ final class RoomDetailsScreenCoordinator: CoordinatorProtocol {
}
init(parameters: RoomDetailsScreenCoordinatorParameters) {
isSpace = parameters.roomProxy.infoPublisher.value.isSpace
viewModel = RoomDetailsScreenViewModel(roomProxy: parameters.roomProxy,
userSession: parameters.userSession,
analyticsService: parameters.analyticsService,
@@ -105,6 +107,10 @@ final class RoomDetailsScreenCoordinator: CoordinatorProtocol {
}
func toPresentable() -> AnyView {
AnyView(RoomDetailsScreen(context: viewModel.context))
if isSpace {
AnyView(SpaceSettingsScreen(context: viewModel.context))
} else {
AnyView(RoomDetailsScreen(context: viewModel.context))
}
}
}
@@ -172,6 +172,9 @@ struct RoomDetailsScreenViewStateBindings {
/// A media item that will be previewed with QuickLook.
var mediaPreviewItem: MediaPreviewItem?
/// The view model used to display the leave space sheet, will only be used if the room is a space.
var leaveSpaceViewModel: LeaveSpaceViewModel?
}
struct LeaveRoomAlertItem: AlertProtocol {
@@ -209,10 +209,29 @@ class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScr
private func processLeaveSpace() async {
switch await userSession.clientProxy.spaceService.leaveSpace(spaceID: roomProxy.id) {
case .success:
// TODO: Handle leave space
break
case .failure(let failure):
case .success(let leaveHandle):
let leaveSpaceViewModel = LeaveSpaceViewModel(spaceName: state.details.name ?? state.details.id,
canEditRolesAndPermissions: state.canEditRolesOrPermissions,
leaveHandle: leaveHandle,
userIndicatorController: userIndicatorController,
mediaProvider: userSession.mediaProvider)
leaveSpaceViewModel.actions.sink { [weak self] action in
guard let self else { return }
switch action {
case .didCancel:
state.bindings.leaveSpaceViewModel = nil
case .presentRolesAndPermissions:
state.bindings.leaveSpaceViewModel = nil
actionsSubject.send(.requestRolesAndPermissionsPresentation)
case .didLeaveSpace:
state.bindings.leaveSpaceViewModel = nil
actionsSubject.send(.leftRoom)
}
}
.store(in: &cancellables)
state.bindings.leaveSpaceViewModel = leaveSpaceViewModel
case .failure:
userIndicatorController.submitIndicator(.init(title: L10n.errorUnknown))
}
}