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:
Mauro Romito
2026-01-23 16:22:07 +01:00
committed by Mauro
parent 8f8ea473f5
commit a3683ea996
8 changed files with 96 additions and 91 deletions
@@ -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
}
}