mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-02 21:33:26 +00:00
implemented the presentation of transfer ownership screen from the space flow and update UI and preview tests
This commit is contained in:
@@ -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() {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user