implemented the presentation of transfer ownership screen from the space flow and update UI and preview tests

This commit is contained in:
Mauro Romito
2026-01-27 19:40:30 +01:00
committed by Mauro
parent 9de49bad9e
commit 9999cd24b8
34 changed files with 127 additions and 60 deletions
@@ -349,9 +349,8 @@ class SpaceFlowCoordinator: FlowCoordinatorProtocol {
stateMachine.tryEvent(.addRooms)
case .displayCreateChildRoomFlow(let space):
stateMachine.tryEvent(.startCreateChildRoomFlow, userInfo: space)
case .displayTransferOwnership(roomProxy: let roomProxy):
// TODO: Implement
break
case .displayTransferOwnership(let roomProxy):
presentTransferOwnershipScreen(roomProxy: roomProxy)
}
}
.store(in: &cancellables)
@@ -442,6 +441,27 @@ class SpaceFlowCoordinator: FlowCoordinatorProtocol {
}
}
private func presentTransferOwnershipScreen(roomProxy: JoinedRoomProxyProtocol) {
let parameters = RoomChangeRolesScreenCoordinatorParameters(mode: .owner,
roomProxy: roomProxy,
mediaProvider: flowParameters.userSession.mediaProvider,
userIndicatorController: flowParameters.userIndicatorController,
analytics: flowParameters.analytics)
let stackCoordinator = NavigationStackCoordinator()
let coordinator = RoomChangeRolesScreenCoordinator(parameters: parameters)
coordinator.actionsPublisher.sink { [weak self] action in
guard let self else { return }
switch action {
case .complete:
navigationStackCoordinator.setSheetCoordinator(nil)
}
}
.store(in: &cancellables)
stackCoordinator.setRootCoordinator(coordinator)
navigationStackCoordinator.setSheetCoordinator(stackCoordinator)
}
// MARK: - Other flows
private func startChildFlow(with entryPoint: SpaceFlowCoordinatorEntryPoint) {
@@ -222,10 +222,11 @@ final class SpaceSettingsFlowCoordinator: FlowCoordinatorProtocol {
case .leftRoom:
leftRoom = true
navigationStackCoordinator.pop()
case .presentRecipientDetails, .presentNotificationSettingsScreen, .transferOwnership,
case .transferOwnership:
presentTransferOwnershipScreen()
case .presentRecipientDetails, .presentNotificationSettingsScreen, .presentReportRoomScreen,
.presentInviteUsersScreen, .presentPollsHistory, .presentCall,
.presentPinnedEventsTimeline, .presentMediaEventsTimeline, .presentKnockingRequestsListScreen,
.presentReportRoomScreen:
.presentPinnedEventsTimeline, .presentMediaEventsTimeline, .presentKnockingRequestsListScreen:
fatalError("Not handled in the space context")
}
}
@@ -326,6 +327,27 @@ final class SpaceSettingsFlowCoordinator: FlowCoordinatorProtocol {
}
}
private func presentTransferOwnershipScreen() {
let parameters = RoomChangeRolesScreenCoordinatorParameters(mode: .owner,
roomProxy: roomProxy,
mediaProvider: flowParameters.userSession.mediaProvider,
userIndicatorController: flowParameters.userIndicatorController,
analytics: flowParameters.analytics)
let stackCoordinator = NavigationStackCoordinator()
let coordinator = RoomChangeRolesScreenCoordinator(parameters: parameters)
coordinator.actionsPublisher.sink { [weak self] action in
guard let self else { return }
switch action {
case .complete:
navigationStackCoordinator.setSheetCoordinator(nil)
}
}
.store(in: &cancellables)
stackCoordinator.setRootCoordinator(coordinator)
navigationStackCoordinator.setSheetCoordinator(stackCoordinator, animated: true)
}
// MARK: - Other flows
private func startRolesAndPermissionsFlow() {
+6
View File
@@ -690,6 +690,8 @@ internal enum L10n {
internal static var commonSettings: String { return L10n.tr("Localizable", "common_settings") }
/// Share space
internal static var commonShareSpace: String { return L10n.tr("Localizable", "common_share_space") }
/// New members see history
internal static var commonSharedHistory: String { return L10n.tr("Localizable", "common_shared_history") }
/// Shared location
internal static var commonSharedLocation: String { return L10n.tr("Localizable", "common_shared_location") }
/// Shared space
@@ -1940,6 +1942,10 @@ internal enum L10n {
internal static var screenLeaveSpaceSubtitle: String { return L10n.tr("Localizable", "screen_leave_space_subtitle") }
/// You need to assign another admin for this space before you can leave.
internal static var screenLeaveSpaceSubtitleLastAdmin: String { return L10n.tr("Localizable", "screen_leave_space_subtitle_last_admin") }
/// You are the only owner of %1$@. You need to transfer ownership to someone else before you leave.
internal static func screenLeaveSpaceSubtitleLastOwner(_ p1: Any) -> String {
return L10n.tr("Localizable", "screen_leave_space_subtitle_last_owner", String(describing: p1))
}
/// You will not be removed from the following room(s) because you're the only administrator:
internal static var screenLeaveSpaceSubtitleOnlyLastAdmin: String { return L10n.tr("Localizable", "screen_leave_space_subtitle_only_last_admin") }
/// Leave %1$@?
@@ -185,11 +185,15 @@ class RoomChangeRolesScreenViewModel: RoomChangeRolesScreenViewModelType, RoomCh
}
private func confirmDiscardChanges() {
state.bindings.alertInfo = AlertInfo(id: .discardChanges,
title: L10n.screenRoomChangeRoleUnsavedChangesTitle,
message: L10n.screenRoomChangeRoleUnsavedChangesDescription,
primaryButton: .init(title: L10n.actionSave) { Task { await self.save() } },
secondaryButton: .init(title: L10n.actionDiscard, role: .cancel) { self.actionsSubject.send(.complete) })
if state.hasChanges {
state.bindings.alertInfo = AlertInfo(id: .discardChanges,
title: L10n.screenRoomChangeRoleUnsavedChangesTitle,
message: L10n.screenRoomChangeRoleUnsavedChangesDescription,
primaryButton: .init(title: L10n.actionSave) { Task { await self.save() } },
secondaryButton: .init(title: L10n.actionDiscard, role: .cancel) { self.actionsSubject.send(.complete) })
} else {
actionsSubject.send(.complete)
}
}
// MARK: Loading indicator
@@ -22,7 +22,8 @@ struct LeaveSpaceViewState: BindableState {
var title: String {
switch leaveHandle.mode {
case .spaceNeedsNewOwner: L10n.screenLeaveSpaceTitleLastAdmin(spaceName)
case .spaceNeedsNewOwner(let useTransferOwnershipFlow):
useTransferOwnershipFlow ? L10n.leaveRoomAlertSelectNewOwnerTitle : L10n.screenLeaveSpaceTitleLastAdmin(spaceName)
default: L10n.screenLeaveSpaceTitle(spaceName)
}
}
@@ -32,7 +33,8 @@ struct LeaveSpaceViewState: BindableState {
case .manyRooms: L10n.screenLeaveSpaceSubtitle
case .roomsNeedNewOwner: L10n.screenLeaveSpaceSubtitleOnlyLastAdmin
case .noRooms: nil
case .spaceNeedsNewOwner: L10n.screenLeaveSpaceSubtitleLastAdmin
case .spaceNeedsNewOwner(let useTransferOwnershipFlow):
useTransferOwnershipFlow ? L10n.screenLeaveSpaceSubtitleLastOwner(spaceName) : L10n.screenLeaveSpaceSubtitleLastAdmin
}
}
@@ -20,8 +20,7 @@ struct LeaveSpaceRoomDetailsCell: View {
private var subtitle: String? {
guard !room.spaceServiceRoom.isSpace else { return nil }
let memberCount = L10n.commonMemberCount(room.spaceServiceRoom.joinedMembersCount)
return !room.canLeave ? L10n.screenLeaveSpaceLastAdminInfo(memberCount) : memberCount
return L10n.commonMemberCount(room.spaceServiceRoom.joinedMembersCount)
}
var visibilityIcon: KeyPath<CompoundIcons, Image>? {
@@ -94,10 +94,8 @@ struct LeaveSpaceView: View {
case .spaceNeedsNewOwner(let useTransferOwnershipFlow):
if context.viewState.canEditRolesAndPermissions {
if useTransferOwnershipFlow {
Button(role: .destructive) {
Button(L10n.leaveRoomAlertSelectNewOwnerAction, role: .destructive) {
context.send(viewAction: .transferOwnership)
} label: {
Label(L10n.actionGoToRolesAndPermissions, icon: \.settings)
}
.buttonStyle(.compound(.primary))
} else {