mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-03 06:55:59 +00:00
implemented the logic to transfer ownership from a space
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user