implemented the logic to transfer ownership from a space

This commit is contained in:
Mauro Romito
2026-01-27 17:52:28 +01:00
committed by Mauro
parent b903658975
commit 9de49bad9e
11 changed files with 72 additions and 22 deletions
@@ -11,6 +11,7 @@ enum LeaveSpaceViewAction {
case selectAll
case toggleRoom(roomID: String)
case rolesAndPermissions
case transferOwnership
case cancel
}
@@ -44,5 +45,6 @@ struct LeaveSpaceViewState: BindableState {
enum LeaveSpaceViewModelAction {
case didLeaveSpace
case presentRolesAndPermissions
case presentTransferOwnership
case didCancel
}
@@ -41,6 +41,8 @@ class LeaveSpaceViewModel: LeaveSpaceViewModelType {
withTransaction(\.disablesAnimations, true) { // The button is adding an unwanted animation.
state.leaveHandle.toggleRoom(roomID: roomID)
}
case .transferOwnership:
actionsSubject.send(.presentTransferOwnership)
}
}
@@ -66,7 +66,7 @@ struct LeaveSpaceView: View {
Section {
ForEach(context.viewState.leaveHandle.rooms, id: \.spaceServiceRoom.id) { room in
LeaveSpaceRoomDetailsCell(room: room,
hideSelection: context.viewState.leaveHandle.mode == .roomsNeedNewOwner,
hideSelection: !context.viewState.leaveHandle.canLeave,
mediaProvider: context.mediaProvider) {
context.send(viewAction: .toggleRoom(roomID: room.spaceServiceRoom.id))
}
@@ -90,20 +90,32 @@ struct LeaveSpaceView: View {
var buttons: some View {
VStack(spacing: 16) {
if context.viewState.leaveHandle.canLeave {
switch context.viewState.leaveHandle.mode {
case .spaceNeedsNewOwner(let useTransferOwnershipFlow):
if context.viewState.canEditRolesAndPermissions {
if useTransferOwnershipFlow {
Button(role: .destructive) {
context.send(viewAction: .transferOwnership)
} label: {
Label(L10n.actionGoToRolesAndPermissions, icon: \.settings)
}
.buttonStyle(.compound(.primary))
} else {
Button {
context.send(viewAction: .rolesAndPermissions)
} label: {
Label(L10n.actionGoToRolesAndPermissions, icon: \.settings)
}
.buttonStyle(.compound(.primary))
}
}
default:
Button(role: .destructive) {
context.send(viewAction: .confirmLeaveSpace)
} label: {
Label(context.viewState.confirmationTitle, icon: \.leave)
}
.buttonStyle(.compound(.primary))
} else if context.viewState.canEditRolesAndPermissions {
Button {
context.send(viewAction: .rolesAndPermissions)
} label: {
Label(L10n.actionGoToRolesAndPermissions, icon: \.settings)
}
.buttonStyle(.compound(.primary))
}
Button(L10n.actionCancel, action: dismiss.callAsFunction)
@@ -123,7 +135,8 @@ struct LeaveSpaceView_Previews: PreviewProvider, TestablePreview {
static let manyViewModel = makeViewModel(mode: .manyRooms)
static let onlyAdminViewModel = makeViewModel(mode: .roomsNeedNewOwner)
static let noRoomsViewModel = makeViewModel(mode: .noRooms)
static let lastAdminViewModel = makeViewModel(mode: .spaceNeedsNewOwner)
static let lastAdminViewModel = makeViewModel(mode: .spaceNeedsNewOwner(useTransferOwnershipFlow: false))
static let lastOwnerViewModel = makeViewModel(mode: .spaceNeedsNewOwner(useTransferOwnershipFlow: true))
static var previews: some View {
LeaveSpaceView(context: manyViewModel.context)
@@ -134,6 +147,8 @@ struct LeaveSpaceView_Previews: PreviewProvider, TestablePreview {
.previewDisplayName("No Rooms")
LeaveSpaceView(context: lastAdminViewModel.context)
.previewDisplayName("Last Space Admin")
LeaveSpaceView(context: lastOwnerViewModel.context)
.previewDisplayName("Last Space Owner")
}
static let spaceServiceRoom = SpaceServiceRoom.mock(id: "!eng-space:matrix.org",
@@ -149,8 +164,12 @@ struct LeaveSpaceView_Previews: PreviewProvider, TestablePreview {
let rooms: [LeaveSpaceRoom] = switch mode {
case .manyRooms: .mockRooms
case .roomsNeedNewOwner: .mockNeedNewOwnerRooms
case .noRooms: .mockSingleSpace(spaceServiceRoom: spaceServiceRoom, isLastOwner: false)
case .spaceNeedsNewOwner: .mockRoomsWithSpace(spaceServiceRoom: spaceServiceRoom, isLastOwner: true)
case .noRooms: .mockSingleSpace(spaceServiceRoom: spaceServiceRoom,
isLastOwner: false,
areCreatorsPrivileged: false)
case .spaceNeedsNewOwner(let useTransferOwnershipFlow): .mockRoomsWithSpace(spaceServiceRoom: spaceServiceRoom,
isLastOwner: true,
areCreatorsPrivileged: useTransferOwnershipFlow)
}
let leaveHandle = LeaveSpaceHandleProxy(spaceID: spaceServiceRoom.id,