mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-02 12:07:55 +00:00
0f38f303ab
* Hide the space ShareLink on iOS 26 for now. * Don't allow the last admin to leave a space.
79 lines
2.6 KiB
Swift
79 lines
2.6 KiB
Swift
//
|
|
// Copyright 2025 New Vector Ltd.
|
|
//
|
|
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
|
|
// Please see LICENSE files in the repository root for full details.
|
|
//
|
|
|
|
import Foundation
|
|
import MatrixRustSDK
|
|
|
|
class LeaveSpaceHandleProxy: Identifiable {
|
|
let id: String
|
|
var rooms: [LeaveSpaceRoomDetails]
|
|
|
|
enum Mode { case manyRooms, onlyAdminRooms, noRooms, lastSpaceAdmin }
|
|
let mode: Mode
|
|
|
|
private let leaveHandle: LeaveSpaceHandleProtocol
|
|
|
|
var canLeave: Bool { mode != .lastSpaceAdmin }
|
|
var selectedCount: Int { rooms.count { $0.isSelected } }
|
|
|
|
init(spaceID: String, leaveHandle: LeaveSpaceHandleProtocol) {
|
|
id = spaceID
|
|
self.leaveHandle = leaveHandle
|
|
|
|
let rooms = leaveHandle.rooms()
|
|
let space = rooms.first { $0.spaceRoom.roomId == spaceID }
|
|
|
|
self.rooms = rooms
|
|
.compactMap { room in
|
|
guard room.spaceRoom.state == .joined, // The SDK is going to do this but not yet.
|
|
room.spaceRoom.isDirect != true,
|
|
room.spaceRoom.roomId != spaceID else {
|
|
return nil
|
|
}
|
|
return .init(spaceRoomProxy: SpaceRoomProxy(spaceRoom: room.spaceRoom, parent: nil),
|
|
isLastAdmin: room.isLastAdmin,
|
|
isSelected: !room.isLastAdmin)
|
|
}
|
|
|
|
mode = if space?.isLastAdmin == true {
|
|
.lastSpaceAdmin
|
|
} else if rooms.isEmpty {
|
|
.noRooms
|
|
} else if rooms.count(where: { !$0.isLastAdmin }) == 0 {
|
|
.onlyAdminRooms
|
|
} else {
|
|
.manyRooms
|
|
}
|
|
}
|
|
|
|
func leave() async -> Result<Void, SpaceServiceProxyError> {
|
|
let selectedRoomIDs = rooms.filter(\.isSelected).map(\.spaceRoomProxy.id)
|
|
|
|
do {
|
|
return try await .success(leaveHandle.leave(roomIds: selectedRoomIDs + [id]))
|
|
} catch {
|
|
MXLog.error("Failed leaving space \(id): \(error)")
|
|
rooms = rooms.filter { leaveRoom in
|
|
leaveHandle.rooms().contains { $0.spaceRoom.roomId == leaveRoom.spaceRoomProxy.id }
|
|
}
|
|
return .failure(.sdkError(error))
|
|
}
|
|
}
|
|
}
|
|
|
|
@Observable class LeaveSpaceRoomDetails {
|
|
let spaceRoomProxy: SpaceRoomProxyProtocol
|
|
let isLastAdmin: Bool
|
|
var isSelected: Bool
|
|
|
|
init(spaceRoomProxy: SpaceRoomProxyProtocol, isLastAdmin: Bool, isSelected: Bool) {
|
|
self.spaceRoomProxy = spaceRoomProxy
|
|
self.isLastAdmin = isLastAdmin
|
|
self.isSelected = isSelected
|
|
}
|
|
}
|