mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-02 12:07:55 +00:00
updated the SDK and included the fix for leaving a space when the last owner of a non empty space
This commit is contained in:
@@ -23,22 +23,23 @@ extension LeaveSpaceHandleSDKMock {
|
||||
}
|
||||
|
||||
extension [LeaveSpaceRoom] {
|
||||
static func mockRoomsWithSpace(spaceServiceRoom: SpaceServiceRoomProtocol, isLastAdmin: Bool) -> [LeaveSpaceRoom] {
|
||||
mockRooms + mockSingleSpace(spaceServiceRoom: spaceServiceRoom, isLastAdmin: isLastAdmin)
|
||||
static func mockRoomsWithSpace(spaceServiceRoom: SpaceServiceRoomProtocol, isLastOwner: Bool) -> [LeaveSpaceRoom] {
|
||||
mockRooms + mockSingleSpace(spaceServiceRoom: spaceServiceRoom, isLastOwner: isLastOwner)
|
||||
}
|
||||
|
||||
static func mockSingleSpace(spaceServiceRoom: SpaceServiceRoomProtocol, isLastAdmin: Bool) -> [LeaveSpaceRoom] {
|
||||
static func mockSingleSpace(spaceServiceRoom: SpaceServiceRoomProtocol, isLastOwner: Bool) -> [LeaveSpaceRoom] {
|
||||
[LeaveSpaceRoom(spaceRoom: SpaceRoom(id: spaceServiceRoom.id,
|
||||
name: spaceServiceRoom.name,
|
||||
avatarURL: spaceServiceRoom.avatarURL,
|
||||
isSpace: true,
|
||||
memberCount: UInt64(spaceServiceRoom.joinedMembersCount),
|
||||
joinRule: spaceServiceRoom.joinRule),
|
||||
isLastAdmin: isLastAdmin)]
|
||||
isLastOwner: isLastOwner,
|
||||
areCreatorsPrivileged: false)]
|
||||
}
|
||||
|
||||
static var mockAdminRooms: [LeaveSpaceRoom] {
|
||||
mockRooms.filter(\.isLastAdmin)
|
||||
static var mockNeedNewOwnerRooms: [LeaveSpaceRoom] {
|
||||
mockRooms.filter { $0.isLastOwner && $0.spaceRoom.numJoinedMembers > 1 }
|
||||
}
|
||||
|
||||
static var mockRooms: [LeaveSpaceRoom] {
|
||||
@@ -49,70 +50,81 @@ extension [LeaveSpaceRoom] {
|
||||
isSpace: false,
|
||||
memberCount: 10,
|
||||
joinRule: .public),
|
||||
isLastAdmin: false),
|
||||
isLastOwner: false,
|
||||
areCreatorsPrivileged: false),
|
||||
LeaveSpaceRoom(spaceRoom: SpaceRoom(id: "2",
|
||||
name: "Sound",
|
||||
isSpace: false,
|
||||
memberCount: 20,
|
||||
joinRule: .private),
|
||||
isLastAdmin: false),
|
||||
isLastOwner: false,
|
||||
areCreatorsPrivileged: false),
|
||||
LeaveSpaceRoom(spaceRoom: SpaceRoom(id: "3",
|
||||
name: "Set & Costume",
|
||||
isSpace: false,
|
||||
memberCount: 25,
|
||||
joinRule: .restricted(rules: [])),
|
||||
isLastAdmin: false),
|
||||
isLastOwner: false,
|
||||
areCreatorsPrivileged: false),
|
||||
LeaveSpaceRoom(spaceRoom: SpaceRoom(id: "4",
|
||||
name: "The Theatre",
|
||||
isSpace: true,
|
||||
memberCount: 100,
|
||||
joinRule: .private,
|
||||
childrenCount: 20),
|
||||
isLastAdmin: false),
|
||||
isLastOwner: false,
|
||||
areCreatorsPrivileged: false),
|
||||
LeaveSpaceRoom(spaceRoom: SpaceRoom(id: "5",
|
||||
name: "Bookings",
|
||||
isSpace: false,
|
||||
memberCount: 200,
|
||||
joinRule: .private,
|
||||
childrenCount: 0),
|
||||
isLastAdmin: true),
|
||||
isLastOwner: true,
|
||||
areCreatorsPrivileged: false),
|
||||
LeaveSpaceRoom(spaceRoom: SpaceRoom(id: "6",
|
||||
name: "Events",
|
||||
isSpace: false,
|
||||
memberCount: 65,
|
||||
joinRule: .restricted(rules: []),
|
||||
childrenCount: 0),
|
||||
isLastAdmin: true),
|
||||
isLastOwner: true,
|
||||
areCreatorsPrivileged: false),
|
||||
LeaveSpaceRoom(spaceRoom: SpaceRoom(id: "7",
|
||||
name: "Mario Kart",
|
||||
isSpace: false,
|
||||
memberCount: 123,
|
||||
joinRule: .public),
|
||||
isLastAdmin: false),
|
||||
isLastOwner: false,
|
||||
areCreatorsPrivileged: false),
|
||||
LeaveSpaceRoom(spaceRoom: SpaceRoom(id: "8",
|
||||
name: "Tetris",
|
||||
isSpace: false,
|
||||
memberCount: 95,
|
||||
joinRule: .public),
|
||||
isLastAdmin: false),
|
||||
isLastOwner: false,
|
||||
areCreatorsPrivileged: false),
|
||||
LeaveSpaceRoom(spaceRoom: SpaceRoom(id: "9",
|
||||
name: "Minecraft",
|
||||
isSpace: false,
|
||||
memberCount: 39,
|
||||
joinRule: .public),
|
||||
isLastAdmin: false),
|
||||
isLastOwner: false,
|
||||
areCreatorsPrivileged: false),
|
||||
LeaveSpaceRoom(spaceRoom: SpaceRoom(id: "10",
|
||||
name: "Lemmings",
|
||||
isSpace: false,
|
||||
memberCount: 67,
|
||||
joinRule: .public),
|
||||
isLastAdmin: true),
|
||||
isLastOwner: true,
|
||||
areCreatorsPrivileged: false),
|
||||
LeaveSpaceRoom(spaceRoom: SpaceRoom(id: "11",
|
||||
name: "Rayman",
|
||||
isSpace: false,
|
||||
memberCount: 23,
|
||||
joinRule: .public),
|
||||
isLastAdmin: false),
|
||||
isLastOwner: false,
|
||||
areCreatorsPrivileged: false),
|
||||
LeaveSpaceRoom(spaceRoom: SpaceRoom(id: "12",
|
||||
name: "Gaming",
|
||||
avatarURL: .mockMXCAvatar,
|
||||
@@ -120,7 +132,8 @@ extension [LeaveSpaceRoom] {
|
||||
memberCount: 835,
|
||||
joinRule: .public,
|
||||
childrenCount: 15),
|
||||
isLastAdmin: true)
|
||||
isLastOwner: true,
|
||||
areCreatorsPrivileged: false)
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ struct LeaveSpaceViewState: BindableState {
|
||||
|
||||
var title: String {
|
||||
switch leaveHandle.mode {
|
||||
case .lastSpaceAdmin: L10n.screenLeaveSpaceTitleLastAdmin(spaceName)
|
||||
case .spaceNeedsNewOwner: L10n.screenLeaveSpaceTitleLastAdmin(spaceName)
|
||||
default: L10n.screenLeaveSpaceTitle(spaceName)
|
||||
}
|
||||
}
|
||||
@@ -29,9 +29,9 @@ struct LeaveSpaceViewState: BindableState {
|
||||
var subtitle: String? {
|
||||
switch leaveHandle.mode {
|
||||
case .manyRooms: L10n.screenLeaveSpaceSubtitle
|
||||
case .onlyAdminRooms: L10n.screenLeaveSpaceSubtitleOnlyLastAdmin
|
||||
case .roomsNeedNewOwner: L10n.screenLeaveSpaceSubtitleOnlyLastAdmin
|
||||
case .noRooms: nil
|
||||
case .lastSpaceAdmin: L10n.screenLeaveSpaceSubtitleLastAdmin
|
||||
case .spaceNeedsNewOwner: L10n.screenLeaveSpaceSubtitleLastAdmin
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ struct LeaveSpaceRoomDetailsCell: View {
|
||||
private var subtitle: String? {
|
||||
guard !room.spaceServiceRoom.isSpace else { return nil }
|
||||
let memberCount = L10n.commonMemberCount(room.spaceServiceRoom.joinedMembersCount)
|
||||
return room.isLastAdmin ? L10n.screenLeaveSpaceLastAdminInfo(memberCount) : memberCount
|
||||
return !room.canLeave ? L10n.screenLeaveSpaceLastAdminInfo(memberCount) : memberCount
|
||||
}
|
||||
|
||||
var visibilityIcon: KeyPath<CompoundIcons, Image>? {
|
||||
@@ -94,38 +94,44 @@ struct LeaveSpaceRoomDetailsCell_Previews: PreviewProvider, TestablePreview {
|
||||
LeaveSpaceRoomDetailsCell(room: .init(spaceServiceRoom: SpaceServiceRoomMock(.init(id: "1",
|
||||
name: "Space",
|
||||
isSpace: true)),
|
||||
isLastAdmin: false,
|
||||
isLastOwner: false,
|
||||
areCreatorsPrivileged: false,
|
||||
isSelected: true),
|
||||
mediaProvider: MediaProviderMock(configuration: .init())) { }
|
||||
LeaveSpaceRoomDetailsCell(room: .init(spaceServiceRoom: SpaceServiceRoomMock(.init(id: "2",
|
||||
name: "My Space",
|
||||
isSpace: true)),
|
||||
isLastAdmin: true,
|
||||
isLastOwner: true,
|
||||
areCreatorsPrivileged: false,
|
||||
isSelected: false),
|
||||
mediaProvider: MediaProviderMock(configuration: .init())) { }
|
||||
LeaveSpaceRoomDetailsCell(room: .init(spaceServiceRoom: SpaceServiceRoomMock(.init(id: "2",
|
||||
name: "My Space",
|
||||
isSpace: true)),
|
||||
isLastAdmin: true,
|
||||
isLastOwner: true,
|
||||
areCreatorsPrivileged: false,
|
||||
isSelected: false),
|
||||
hideSelection: true,
|
||||
mediaProvider: MediaProviderMock(configuration: .init())) { }
|
||||
LeaveSpaceRoomDetailsCell(room: .init(spaceServiceRoom: SpaceServiceRoomMock(.init(id: "3",
|
||||
name: "Room",
|
||||
isSpace: false)),
|
||||
isLastAdmin: false,
|
||||
isLastOwner: false,
|
||||
areCreatorsPrivileged: false,
|
||||
isSelected: true),
|
||||
mediaProvider: MediaProviderMock(configuration: .init())) { }
|
||||
LeaveSpaceRoomDetailsCell(room: .init(spaceServiceRoom: SpaceServiceRoomMock(.init(id: "4",
|
||||
name: "My Room",
|
||||
isSpace: false)),
|
||||
isLastAdmin: true,
|
||||
isLastOwner: true,
|
||||
areCreatorsPrivileged: false,
|
||||
isSelected: false),
|
||||
mediaProvider: MediaProviderMock(configuration: .init())) { }
|
||||
LeaveSpaceRoomDetailsCell(room: .init(spaceServiceRoom: SpaceServiceRoomMock(.init(id: "4",
|
||||
name: "My Room",
|
||||
isSpace: false)),
|
||||
isLastAdmin: true,
|
||||
isLastOwner: true,
|
||||
areCreatorsPrivileged: false,
|
||||
isSelected: false),
|
||||
hideSelection: true,
|
||||
mediaProvider: MediaProviderMock(configuration: .init())) { }
|
||||
|
||||
@@ -66,11 +66,11 @@ struct LeaveSpaceView: View {
|
||||
Section {
|
||||
ForEach(context.viewState.leaveHandle.rooms, id: \.spaceServiceRoom.id) { room in
|
||||
LeaveSpaceRoomDetailsCell(room: room,
|
||||
hideSelection: context.viewState.leaveHandle.mode == .onlyAdminRooms,
|
||||
hideSelection: context.viewState.leaveHandle.mode == .roomsNeedNewOwner,
|
||||
mediaProvider: context.mediaProvider) {
|
||||
context.send(viewAction: .toggleRoom(roomID: room.spaceServiceRoom.id))
|
||||
}
|
||||
.disabled(room.isLastAdmin)
|
||||
.disabled(!room.canLeave)
|
||||
}
|
||||
} header: {
|
||||
if context.viewState.leaveHandle.mode == .manyRooms {
|
||||
@@ -121,9 +121,9 @@ import MatrixRustSDKMocks
|
||||
|
||||
struct LeaveSpaceView_Previews: PreviewProvider, TestablePreview {
|
||||
static let manyViewModel = makeViewModel(mode: .manyRooms)
|
||||
static let onlyAdminViewModel = makeViewModel(mode: .onlyAdminRooms)
|
||||
static let onlyAdminViewModel = makeViewModel(mode: .roomsNeedNewOwner)
|
||||
static let noRoomsViewModel = makeViewModel(mode: .noRooms)
|
||||
static let lastAdminViewModel = makeViewModel(mode: .lastSpaceAdmin)
|
||||
static let lastAdminViewModel = makeViewModel(mode: .spaceNeedsNewOwner)
|
||||
|
||||
static var previews: some View {
|
||||
LeaveSpaceView(context: manyViewModel.context)
|
||||
@@ -148,9 +148,9 @@ struct LeaveSpaceView_Previews: PreviewProvider, TestablePreview {
|
||||
static func makeViewModel(mode: LeaveSpaceHandleProxy.Mode) -> LeaveSpaceViewModel {
|
||||
let rooms: [LeaveSpaceRoom] = switch mode {
|
||||
case .manyRooms: .mockRooms
|
||||
case .onlyAdminRooms: .mockAdminRooms
|
||||
case .noRooms: .mockSingleSpace(spaceServiceRoom: spaceServiceRoom, isLastAdmin: false)
|
||||
case .lastSpaceAdmin: .mockRoomsWithSpace(spaceServiceRoom: spaceServiceRoom, isLastAdmin: true)
|
||||
case .roomsNeedNewOwner: .mockNeedNewOwnerRooms
|
||||
case .noRooms: .mockSingleSpace(spaceServiceRoom: spaceServiceRoom, isLastOwner: false)
|
||||
case .spaceNeedsNewOwner: .mockRoomsWithSpace(spaceServiceRoom: spaceServiceRoom, isLastOwner: true)
|
||||
}
|
||||
|
||||
let leaveHandle = LeaveSpaceHandleProxy(spaceID: spaceServiceRoom.id,
|
||||
|
||||
@@ -13,12 +13,12 @@ final class LeaveSpaceHandleProxy {
|
||||
let id: String
|
||||
var rooms: [LeaveSpaceRoomDetails]
|
||||
|
||||
enum Mode { case manyRooms, onlyAdminRooms, noRooms, lastSpaceAdmin }
|
||||
enum Mode { case manyRooms, roomsNeedNewOwner, noRooms, spaceNeedsNewOwner }
|
||||
let mode: Mode
|
||||
|
||||
private let leaveHandle: LeaveSpaceHandleProtocol
|
||||
|
||||
var canLeave: Bool { mode != .lastSpaceAdmin }
|
||||
var canLeave: Bool { mode != .spaceNeedsNewOwner }
|
||||
var selectedCount: Int { rooms.count { $0.isSelected } }
|
||||
|
||||
init(spaceID: String, leaveHandle: LeaveSpaceHandleProtocol) {
|
||||
@@ -36,16 +36,17 @@ final class LeaveSpaceHandleProxy {
|
||||
return nil
|
||||
}
|
||||
return .init(spaceServiceRoom: SpaceServiceRoom(spaceRoom: room.spaceRoom),
|
||||
isLastAdmin: room.isLastAdmin,
|
||||
isSelected: !room.isLastAdmin)
|
||||
isLastOwner: room.isLastOwner,
|
||||
areCreatorsPrivileged: room.areCreatorsPrivileged,
|
||||
isSelected: !room.isLastOwner)
|
||||
}
|
||||
|
||||
mode = if space?.isLastAdmin == true {
|
||||
.lastSpaceAdmin
|
||||
mode = if let space, space.isLastOwner, space.spaceRoom.numJoinedMembers > 1 {
|
||||
.spaceNeedsNewOwner
|
||||
} else if self.rooms.isEmpty {
|
||||
.noRooms
|
||||
} else if self.rooms.count(where: { !$0.isLastAdmin }) == 0 {
|
||||
.onlyAdminRooms
|
||||
} else if self.rooms.count(where: { $0.canLeave }) == 0 {
|
||||
.roomsNeedNewOwner
|
||||
} else {
|
||||
.manyRooms
|
||||
}
|
||||
@@ -58,7 +59,7 @@ final class LeaveSpaceHandleProxy {
|
||||
}
|
||||
|
||||
func selectAll() {
|
||||
for room in rooms where !room.isLastAdmin {
|
||||
for room in rooms where room.canLeave {
|
||||
room.isSelected = true
|
||||
}
|
||||
}
|
||||
@@ -87,12 +88,14 @@ final class LeaveSpaceHandleProxy {
|
||||
|
||||
@Observable class LeaveSpaceRoomDetails {
|
||||
let spaceServiceRoom: SpaceServiceRoomProtocol
|
||||
let isLastAdmin: Bool
|
||||
let canLeave: Bool
|
||||
let areCreatorsPrivileged: Bool
|
||||
var isSelected: Bool
|
||||
|
||||
init(spaceServiceRoom: SpaceServiceRoomProtocol, isLastAdmin: Bool, isSelected: Bool) {
|
||||
init(spaceServiceRoom: SpaceServiceRoomProtocol, isLastOwner: Bool, areCreatorsPrivileged: Bool, isSelected: Bool) {
|
||||
self.spaceServiceRoom = spaceServiceRoom
|
||||
self.isLastAdmin = isLastAdmin
|
||||
canLeave = !isLastOwner || spaceServiceRoom.joinedMembersCount == 1
|
||||
self.isSelected = isSelected
|
||||
self.areCreatorsPrivileged = areCreatorsPrivileged
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user