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
@@ -304,6 +304,7 @@
"common_server_url" = "Server URL";
"common_settings" = "Settings";
"common_share_space" = "Share space";
"common_shared_history" = "New members see history";
"common_shared_location" = "Shared location";
"common_shared_space" = "Shared space";
"common_signing_out" = "Signing out";
@@ -611,6 +612,7 @@
"screen_leave_space_last_admin_info" = "%1$@ (Admin)";
"screen_leave_space_subtitle" = "Select the rooms you’d like to leave which you're not the only administrator for:";
"screen_leave_space_subtitle_last_admin" = "You need to assign another admin for this space before you can leave.";
"screen_leave_space_subtitle_last_owner" = "You are the only owner of %1$@. You need to transfer ownership to someone else before you leave.";
"screen_leave_space_subtitle_only_last_admin" = "You will not be removed from the following room(s) because you're the only administrator:";
"screen_leave_space_title" = "Leave %1$@?";
"screen_leave_space_title_last_admin" = "You are the only admin for %1$@";
@@ -304,6 +304,7 @@
"common_server_url" = "Server URL";
"common_settings" = "Settings";
"common_share_space" = "Share space";
"common_shared_history" = "New members see history";
"common_shared_location" = "Shared location";
"common_shared_space" = "Shared space";
"common_signing_out" = "Signing out";
@@ -611,6 +612,7 @@
"screen_leave_space_last_admin_info" = "%1$@ (Admin)";
"screen_leave_space_subtitle" = "Select the rooms you’d like to leave which you're not the only administrator for:";
"screen_leave_space_subtitle_last_admin" = "You need to assign another admin for this space before you can leave.";
"screen_leave_space_subtitle_last_owner" = "You are the only owner of %1$@. You need to transfer ownership to someone else before you leave.";
"screen_leave_space_subtitle_only_last_admin" = "You will not be removed from the following room(s) because you're the only administrator:";
"screen_leave_space_title" = "Leave %1$@?";
"screen_leave_space_title_last_admin" = "You are the only admin for %1$@";
@@ -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 {
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5851e5b7b8556d5a72e4d5d7557957547a1a7f2d9ec80f324522e67599365362
size 111868
oid sha256:4dddd4326b36afa32d0953d39ae7013bfaed915f9913d74187da07033e308149
size 108296
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a2a32f990080fa0445e3cc0e83b8ea109dd3101f4a12fe804b3d5a325df516ad
size 126584
oid sha256:26e7031ba08576dacddff52a0d0290348c8fe90dbf8008d63df1c9f66046830e
size 120214
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3b4c93ea3a20e890eee10c47d100a77cdf0f6ead386055e0e11a59c2287742b1
size 66152
oid sha256:2cca1960c43b392f50d3cfc2d63ce13fddf6f46e9ff0d3c3846eaaf0e76b9e93
size 63396
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8187cd536e01a3a940c683fd1d9e8636ff0cb8f973f8f5a2ce0e0e1d83dd32e6
size 75159
oid sha256:97cbd734fb0a160fe233f7e84e978e939b30131087af4a66d809a61130dd3850
size 72133
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:312afadcc532592b73ea185c60665489d5bc0ad22b49f7d445c31c900feaee78
size 99431
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:09e0e50995de534261096ec3b9d1370f65c5dd1b48fa30e6fe4093fa5aedc211
size 113438
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7dc02dfee863f883145cd843cd6a0d5d7168b8d00fddcbea6c1aa22456500e7e
size 59405
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:fc8531cd3bfd4550fe8cc5b7b9ec61a7cec5ff909efcaec484de870f1044e0b2
size 79601
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:4ff955a433b413f91ce08fdc54b9097f59bdd28fdbd3af9dd0374564eb1beb24
size 144012
oid sha256:c9ad306e0be48b82c3d289c1900afdf79b2efcf0403f3e86cbb09013e7705a16
size 143185
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:910ba40be143efd2bcf7043918063ee13c31fb5d9d04db2691f13bc9d4cced90
size 171504
oid sha256:153e608bd51747e151a6901bfc4214ef355d4f2b422e28c16e888948306c6c70
size 166095
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6ee340c15db21c874e45553294f98fea342502bf08b28b286c337ddc2d243a6b
size 94684
oid sha256:7c1946343246044027e21fc27989935ee7fa80768f76542fc8a56c9eca4db792
size 93713
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5244fdcad023960dd896206cb51196f310b34251321e1cf6e17d9348c6fdf622
size 123733
oid sha256:6ed5e1592778ff49f919299c9f7fc2e530827890310f9af77133acdc12633a9f
size 121020
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:db8bbcaf5378c1cd76aca715b87abf154aaac80c36d9a0826c220c1b8e277169
size 220752
oid sha256:8154a4c0048bf73ec546fb3e0f00c34b9326e0ef59bf302779f34a24fd7edaff
size 218929
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9215dc41e16b7e90b2dacc3ad6a3c02becfae8165f563718891d9dc549bb8f8d
size 234793
oid sha256:2a3e28f05bebb9af7c80b3478936f78fbdbde18e27ba75768de69077440b9aaa
size 232076
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8ddedca04fbf6e9030451a3c6ba0025b1c6ff9577c6f9578d3d9d307f39bcfc6
size 158365
oid sha256:345d4c135154fa0f883d6ee02341d71ea91c2531c8b2cdbaf9debc2026ccc148
size 158494
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:71cd85f5ac299594f430982b5fba3ef988c161307a4a41472f23f33f2fedc464
size 168321
oid sha256:34ff2823b4059bac4c869ec7b7bd004622c8fae025a82bb7582902592b59a436
size 169124
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f426d30ad4465b4e783d96203baa6bb6fc971fc97eb143fb2ef3d57b47d80394
size 217524
oid sha256:25ebe66044af44ea220c48a42670f40305b2bdd6385886fd2c9b3f50d78456bf
size 215589
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:16693391ca8ca7cd3836f23c94f71aa77651083bb18291690b10415e0987334f
size 229537
oid sha256:2057e5c4703ab3dca54aa460c59870534763e0d981e57777bc5de7bad29189a6
size 227402
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:074bc6caf8e32b4f14577bd628d97db3669cc7c01af6a738364d1921a5092e65
size 165177
oid sha256:4a18a8dc74c266f9889c0c2229528296a0eab4e01e6f75997391156389f7d5a7
size 165317
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c767bfe53bdd85af6eeb922b80bc917cbda754b39293dac23e1358767039f1b8
size 229301
oid sha256:7d3ccf933292d7b65b4503e26dca4cd2bd15dc6acb291eeccff7331bb8e47cf5
size 227686
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2f905d871856bd90614acc05401cfe88a962d2d26055ffa6fc6b15a6cac450fe
size 246657
oid sha256:b00c5a311df4499b66745667e37a558b8ff43a007688af0eef4dcea385c6774c
size 244268
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f4ddcfc17e81a78304aebd44eb929853de8f8ce17e7c96a245eb0b4d3303494a
size 177153
oid sha256:4456db32942bb0b3b51b057f8a944eb766436df93b5725ff0c9d676726d5e794
size 177395
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:802721c039422e2cca42c4808131f068e0aa5688879b403690024c86b641915e
size 209405
oid sha256:8884d96a7f9fc5a4a4537dd823530e9c0c573176a475eea6bc92b633732917b7
size 207781
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c899b3472c5fdb9377da2e7b1dad616f327964642e88de0834dbdd6114501439
size 217934
oid sha256:100878418a7e4797203eddd69b20b0fc305e0bb83103e141683fc2fad1a5ef6c
size 216298
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c9986f6d03a60a550cfa7d59e10ff44f9478562f9bb2f229a5f715a39550b0ac
size 159565
oid sha256:f86a0c3a9b17ed5fee2540a9f66d69d4718067612a1c5fcf378cd676415aeced
size 159817