mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-03 06:55:59 +00:00
Rename SpaceRoomProxy to SpaceServiceRoom and stop proxying the struct. (#4952)
* Rename SpaceRoomProxy to SpaceServiceRoom. The underlying type is a struct, we don't need to proxy it. * Actually stop proxying the SpaceRoom.
This commit is contained in:
@@ -35,7 +35,7 @@ final class LeaveSpaceHandleProxy {
|
||||
room.spaceRoom.roomId != spaceID else {
|
||||
return nil
|
||||
}
|
||||
return .init(spaceRoomProxy: SpaceRoomProxy(spaceRoom: room.spaceRoom),
|
||||
return .init(spaceServiceRoom: SpaceServiceRoom(spaceRoom: room.spaceRoom),
|
||||
isLastAdmin: room.isLastAdmin,
|
||||
isSelected: !room.isLastAdmin)
|
||||
}
|
||||
@@ -64,21 +64,21 @@ final class LeaveSpaceHandleProxy {
|
||||
}
|
||||
|
||||
func toggleRoom(roomID: String) {
|
||||
guard let room = rooms.first(where: { $0.spaceRoomProxy.id == roomID }) else {
|
||||
guard let room = rooms.first(where: { $0.spaceServiceRoom.id == roomID }) else {
|
||||
return
|
||||
}
|
||||
room.isSelected.toggle()
|
||||
}
|
||||
|
||||
func leave() async -> Result<Void, SpaceServiceProxyError> {
|
||||
let selectedRoomIDs = rooms.filter(\.isSelected).map(\.spaceRoomProxy.id)
|
||||
let selectedRoomIDs = rooms.filter(\.isSelected).map(\.spaceServiceRoom.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 }
|
||||
leaveHandle.rooms().contains { $0.spaceRoom.roomId == leaveRoom.spaceServiceRoom.id }
|
||||
}
|
||||
return .failure(.sdkError(error))
|
||||
}
|
||||
@@ -86,12 +86,12 @@ final class LeaveSpaceHandleProxy {
|
||||
}
|
||||
|
||||
@Observable class LeaveSpaceRoomDetails {
|
||||
let spaceRoomProxy: SpaceRoomProxyProtocol
|
||||
let spaceServiceRoom: SpaceServiceRoomProtocol
|
||||
let isLastAdmin: Bool
|
||||
var isSelected: Bool
|
||||
|
||||
init(spaceRoomProxy: SpaceRoomProxyProtocol, isLastAdmin: Bool, isSelected: Bool) {
|
||||
self.spaceRoomProxy = spaceRoomProxy
|
||||
init(spaceServiceRoom: SpaceServiceRoomProtocol, isLastAdmin: Bool, isSelected: Bool) {
|
||||
self.spaceServiceRoom = spaceServiceRoom
|
||||
self.isLastAdmin = isLastAdmin
|
||||
self.isSelected = isSelected
|
||||
}
|
||||
|
||||
@@ -10,19 +10,19 @@ import Combine
|
||||
import MatrixRustSDK
|
||||
|
||||
class SpaceRoomListProxy: SpaceRoomListProxyProtocol {
|
||||
var id: String { spaceRoomProxyPublisher.value.id }
|
||||
var id: String { spaceServiceRoomPublisher.value.id }
|
||||
|
||||
private let spaceRoomList: SpaceRoomListProtocol
|
||||
|
||||
private var spaceRoomProxyHandle: TaskHandle?
|
||||
private let spaceRoomProxySubject: CurrentValueSubject<SpaceRoomProxyProtocol, Never>
|
||||
var spaceRoomProxyPublisher: CurrentValuePublisher<SpaceRoomProxyProtocol, Never> {
|
||||
spaceRoomProxySubject.asCurrentValuePublisher()
|
||||
private var spaceServiceRoomHandle: TaskHandle?
|
||||
private let spaceServiceRoomSubject: CurrentValueSubject<SpaceServiceRoomProtocol, Never>
|
||||
var spaceServiceRoomPublisher: CurrentValuePublisher<SpaceServiceRoomProtocol, Never> {
|
||||
spaceServiceRoomSubject.asCurrentValuePublisher()
|
||||
}
|
||||
|
||||
private var spaceRoomsHandle: TaskHandle?
|
||||
private let spaceRoomsSubject = CurrentValueSubject<[SpaceRoomProxyProtocol], Never>([])
|
||||
var spaceRoomsPublisher: CurrentValuePublisher<[SpaceRoomProxyProtocol], Never> {
|
||||
private let spaceRoomsSubject = CurrentValueSubject<[SpaceServiceRoomProtocol], Never>([])
|
||||
var spaceRoomsPublisher: CurrentValuePublisher<[SpaceServiceRoomProtocol], Never> {
|
||||
spaceRoomsSubject.asCurrentValuePublisher()
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ class SpaceRoomListProxy: SpaceRoomListProxyProtocol {
|
||||
guard let spaceRoom = spaceRoomList.space() else { throw SpaceRoomListProxyError.missingSpace }
|
||||
|
||||
self.spaceRoomList = spaceRoomList
|
||||
spaceRoomProxySubject = .init(SpaceRoomProxy(spaceRoom: spaceRoom))
|
||||
spaceServiceRoomSubject = .init(SpaceServiceRoom(spaceRoom: spaceRoom))
|
||||
|
||||
let paginationStateSubject = CurrentValueSubject<SpaceRoomListPaginationState, Never>(spaceRoomList.paginationState())
|
||||
paginationStatePublisher = paginationStateSubject.asCurrentValuePublisher()
|
||||
@@ -46,9 +46,9 @@ class SpaceRoomListProxy: SpaceRoomListProxyProtocol {
|
||||
self?.handleUpdates(updates)
|
||||
})
|
||||
|
||||
spaceRoomProxyHandle = spaceRoomList.subscribeToSpaceUpdates(listener: SDKListener { [weak self] spaceRoom in
|
||||
spaceServiceRoomHandle = spaceRoomList.subscribeToSpaceUpdates(listener: SDKListener { [weak self] spaceRoom in
|
||||
guard let spaceRoom else { return }
|
||||
self?.spaceRoomProxySubject.send(SpaceRoomProxy(spaceRoom: spaceRoom))
|
||||
self?.spaceServiceRoomSubject.send(SpaceServiceRoom(spaceRoom: spaceRoom))
|
||||
})
|
||||
}
|
||||
|
||||
@@ -68,27 +68,27 @@ class SpaceRoomListProxy: SpaceRoomListProxyProtocol {
|
||||
for update in updates {
|
||||
switch update {
|
||||
case .append(let spaceRooms):
|
||||
rooms.append(contentsOf: spaceRooms.map(SpaceRoomProxy.init))
|
||||
rooms.append(contentsOf: spaceRooms.map(SpaceServiceRoom.init))
|
||||
case .clear:
|
||||
rooms.removeAll()
|
||||
case .pushFront(let spaceRoom):
|
||||
rooms.insert(SpaceRoomProxy(spaceRoom: spaceRoom), at: 0)
|
||||
rooms.insert(SpaceServiceRoom(spaceRoom: spaceRoom), at: 0)
|
||||
case .pushBack(let spaceRoom):
|
||||
rooms.append(SpaceRoomProxy(spaceRoom: spaceRoom))
|
||||
rooms.append(SpaceServiceRoom(spaceRoom: spaceRoom))
|
||||
case .popFront:
|
||||
rooms.removeFirst()
|
||||
case .popBack:
|
||||
rooms.removeLast()
|
||||
case .insert(let index, let spaceRoom):
|
||||
rooms.insert(SpaceRoomProxy(spaceRoom: spaceRoom), at: Int(index))
|
||||
rooms.insert(SpaceServiceRoom(spaceRoom: spaceRoom), at: Int(index))
|
||||
case .set(let index, let spaceRoom):
|
||||
rooms[Int(index)] = SpaceRoomProxy(spaceRoom: spaceRoom)
|
||||
rooms[Int(index)] = SpaceServiceRoom(spaceRoom: spaceRoom)
|
||||
case .remove(let index):
|
||||
rooms.remove(at: Int(index))
|
||||
case .truncate(let length):
|
||||
rooms.removeSubrange(Int(length)..<rooms.count)
|
||||
case .reset(let spaceRooms):
|
||||
rooms = spaceRooms.map(SpaceRoomProxy.init)
|
||||
rooms = spaceRooms.map(SpaceServiceRoom.init)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -17,8 +17,8 @@ enum SpaceRoomListProxyError: Error {
|
||||
protocol SpaceRoomListProxyProtocol {
|
||||
var id: String { get }
|
||||
|
||||
var spaceRoomProxyPublisher: CurrentValuePublisher<SpaceRoomProxyProtocol, Never> { get }
|
||||
var spaceRoomsPublisher: CurrentValuePublisher<[SpaceRoomProxyProtocol], Never> { get }
|
||||
var spaceServiceRoomPublisher: CurrentValuePublisher<SpaceServiceRoomProtocol, Never> { get }
|
||||
var spaceRoomsPublisher: CurrentValuePublisher<[SpaceServiceRoomProtocol], Never> { get }
|
||||
var paginationStatePublisher: CurrentValuePublisher<SpaceRoomListPaginationState, Never> { get }
|
||||
|
||||
func paginate() async
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
//
|
||||
// Copyright 2025 Element Creations Ltd.
|
||||
// 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 SpaceRoomProxy: SpaceRoomProxyProtocol {
|
||||
private let spaceRoom: SpaceRoom
|
||||
|
||||
init(spaceRoom: SpaceRoom) {
|
||||
self.spaceRoom = spaceRoom
|
||||
}
|
||||
|
||||
lazy var id = spaceRoom.roomId
|
||||
var name: String { spaceRoom.displayName }
|
||||
var rawName: String? { spaceRoom.rawName }
|
||||
var avatarURL: URL? { spaceRoom.avatarUrl.flatMap(URL.init) }
|
||||
|
||||
var isSpace: Bool { spaceRoom.roomType == .space }
|
||||
var isDirect: Bool? { spaceRoom.isDirect }
|
||||
var childrenCount: Int { Int(spaceRoom.childrenCount) }
|
||||
|
||||
var joinedMembersCount: Int { Int(spaceRoom.numJoinedMembers) }
|
||||
var heroes: [UserProfileProxy] { (spaceRoom.heroes ?? []).map(UserProfileProxy.init) }
|
||||
var topic: String? { spaceRoom.topic }
|
||||
var canonicalAlias: String? { spaceRoom.canonicalAlias }
|
||||
|
||||
var joinRule: JoinRule? { spaceRoom.joinRule }
|
||||
var worldReadable: Bool? { spaceRoom.worldReadable }
|
||||
var guestCanJoin: Bool { spaceRoom.guestCanJoin }
|
||||
var state: Membership? { spaceRoom.state }
|
||||
var via: [String] { spaceRoom.via }
|
||||
}
|
||||
@@ -14,8 +14,8 @@ class SpaceServiceProxy: SpaceServiceProxyProtocol {
|
||||
private let spaceService: SpaceServiceProtocol
|
||||
|
||||
private var topLevelSpacesHandle: TaskHandle?
|
||||
private let spacesSubject = CurrentValueSubject<[SpaceRoomProxyProtocol], Never>([])
|
||||
var topLevelSpacesPublisher: CurrentValuePublisher<[SpaceRoomProxyProtocol], Never> {
|
||||
private let spacesSubject = CurrentValueSubject<[SpaceServiceRoomProtocol], Never>([])
|
||||
var topLevelSpacesPublisher: CurrentValuePublisher<[SpaceServiceRoomProtocol], Never> {
|
||||
spacesSubject.asCurrentValuePublisher()
|
||||
}
|
||||
|
||||
@@ -40,9 +40,9 @@ class SpaceServiceProxy: SpaceServiceProxyProtocol {
|
||||
}
|
||||
}
|
||||
|
||||
func spaceForIdentifier(spaceID: String) async -> Result<SpaceRoomProxyProtocol?, SpaceServiceProxyError> {
|
||||
func spaceForIdentifier(spaceID: String) async -> Result<SpaceServiceRoomProtocol?, SpaceServiceProxyError> {
|
||||
do {
|
||||
return try await .success(spaceService.getSpaceRoom(roomId: spaceID).map(SpaceRoomProxy.init))
|
||||
return try await .success(spaceService.getSpaceRoom(roomId: spaceID).map(SpaceServiceRoom.init))
|
||||
} catch {
|
||||
MXLog.error("Failed getting space room for \(spaceID): \(error)")
|
||||
return .failure(.sdkError(error))
|
||||
@@ -58,9 +58,9 @@ class SpaceServiceProxy: SpaceServiceProxyProtocol {
|
||||
}
|
||||
}
|
||||
|
||||
func joinedParents(childID: String) async -> Result<[SpaceRoomProxyProtocol], SpaceServiceProxyError> {
|
||||
func joinedParents(childID: String) async -> Result<[SpaceServiceRoomProtocol], SpaceServiceProxyError> {
|
||||
do {
|
||||
return try await .success(spaceService.joinedParentsOfChild(childId: childID).map(SpaceRoomProxy.init))
|
||||
return try await .success(spaceService.joinedParentsOfChild(childId: childID).map(SpaceServiceRoom.init))
|
||||
} catch {
|
||||
MXLog.error("Failed to get joined parents for \(childID): \(error)")
|
||||
return .failure(.sdkError(error))
|
||||
@@ -75,27 +75,27 @@ class SpaceServiceProxy: SpaceServiceProxyProtocol {
|
||||
for update in updates {
|
||||
switch update {
|
||||
case .append(let spaceRooms):
|
||||
spaces.append(contentsOf: spaceRooms.map(SpaceRoomProxy.init))
|
||||
spaces.append(contentsOf: spaceRooms.map(SpaceServiceRoom.init))
|
||||
case .clear:
|
||||
spaces.removeAll()
|
||||
case .pushFront(let spaceRoom):
|
||||
spaces.insert(SpaceRoomProxy(spaceRoom: spaceRoom), at: 0)
|
||||
spaces.insert(SpaceServiceRoom(spaceRoom: spaceRoom), at: 0)
|
||||
case .pushBack(let spaceRoom):
|
||||
spaces.append(SpaceRoomProxy(spaceRoom: spaceRoom))
|
||||
spaces.append(SpaceServiceRoom(spaceRoom: spaceRoom))
|
||||
case .popFront:
|
||||
spaces.removeFirst()
|
||||
case .popBack:
|
||||
spaces.removeLast()
|
||||
case .insert(let index, let spaceRoom):
|
||||
spaces.insert(SpaceRoomProxy(spaceRoom: spaceRoom), at: Int(index))
|
||||
spaces.insert(SpaceServiceRoom(spaceRoom: spaceRoom), at: Int(index))
|
||||
case .set(let index, let spaceRoom):
|
||||
spaces[Int(index)] = SpaceRoomProxy(spaceRoom: spaceRoom)
|
||||
spaces[Int(index)] = SpaceServiceRoom(spaceRoom: spaceRoom)
|
||||
case .remove(let index):
|
||||
spaces.remove(at: Int(index))
|
||||
case .truncate(let length):
|
||||
spaces.removeSubrange(Int(length)..<spaces.count)
|
||||
case .reset(let spaceRooms):
|
||||
spaces = spaceRooms.map(SpaceRoomProxy.init)
|
||||
spaces = spaceRooms.map(SpaceServiceRoom.init)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -15,12 +15,12 @@ enum SpaceServiceProxyError: Error {
|
||||
|
||||
// sourcery: AutoMockable
|
||||
protocol SpaceServiceProxyProtocol {
|
||||
var topLevelSpacesPublisher: CurrentValuePublisher<[SpaceRoomProxyProtocol], Never> { get }
|
||||
var topLevelSpacesPublisher: CurrentValuePublisher<[SpaceServiceRoomProtocol], Never> { get }
|
||||
|
||||
func spaceRoomList(spaceID: String) async -> Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError>
|
||||
/// Returns a joined space given its identifier
|
||||
func spaceForIdentifier(spaceID: String) async -> Result<SpaceRoomProxyProtocol?, SpaceServiceProxyError>
|
||||
func spaceForIdentifier(spaceID: String) async -> Result<SpaceServiceRoomProtocol?, SpaceServiceProxyError>
|
||||
func leaveSpace(spaceID: String) async -> Result<LeaveSpaceHandleProxy, SpaceServiceProxyError>
|
||||
/// Returns all the parent spaces of a child that user has joined.
|
||||
func joinedParents(childID: String) async -> Result<[SpaceRoomProxyProtocol], SpaceServiceProxyError>
|
||||
func joinedParents(childID: String) async -> Result<[SpaceServiceRoomProtocol], SpaceServiceProxyError>
|
||||
}
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
//
|
||||
// Copyright 2025 Element Creations Ltd.
|
||||
// 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
|
||||
|
||||
struct SpaceServiceRoom: SpaceServiceRoomProtocol {
|
||||
var id: String
|
||||
var name: String
|
||||
var rawName: String?
|
||||
var avatarURL: URL?
|
||||
|
||||
var isSpace: Bool
|
||||
var isDirect: Bool?
|
||||
var childrenCount: Int
|
||||
|
||||
var joinedMembersCount: Int
|
||||
var heroes: [UserProfileProxy]
|
||||
var topic: String?
|
||||
var canonicalAlias: String?
|
||||
|
||||
var joinRule: JoinRule?
|
||||
var worldReadable: Bool?
|
||||
var guestCanJoin: Bool
|
||||
var state: Membership?
|
||||
var via: [String]
|
||||
|
||||
init(spaceRoom: SpaceRoom) {
|
||||
id = spaceRoom.roomId
|
||||
name = spaceRoom.displayName
|
||||
rawName = spaceRoom.rawName
|
||||
avatarURL = spaceRoom.avatarUrl.flatMap(URL.init)
|
||||
|
||||
isSpace = spaceRoom.roomType == .space
|
||||
isDirect = spaceRoom.isDirect
|
||||
childrenCount = Int(spaceRoom.childrenCount)
|
||||
|
||||
joinedMembersCount = Int(spaceRoom.numJoinedMembers)
|
||||
heroes = (spaceRoom.heroes ?? []).map(UserProfileProxy.init)
|
||||
topic = spaceRoom.topic
|
||||
canonicalAlias = spaceRoom.canonicalAlias
|
||||
|
||||
joinRule = spaceRoom.joinRule
|
||||
worldReadable = spaceRoom.worldReadable
|
||||
guestCanJoin = spaceRoom.guestCanJoin
|
||||
state = spaceRoom.state
|
||||
via = spaceRoom.via
|
||||
}
|
||||
}
|
||||
+4
-4
@@ -9,7 +9,7 @@
|
||||
import Foundation
|
||||
import MatrixRustSDK
|
||||
|
||||
enum SpaceRoomProxyVisibility: Equatable {
|
||||
enum SpaceServiceRoomVisibility: Equatable {
|
||||
case `public`
|
||||
case `private`
|
||||
case restricted
|
||||
@@ -17,7 +17,7 @@ enum SpaceRoomProxyVisibility: Equatable {
|
||||
}
|
||||
|
||||
// sourcery: AutoMockable
|
||||
protocol SpaceRoomProxyProtocol {
|
||||
protocol SpaceServiceRoomProtocol {
|
||||
var id: String { get }
|
||||
var name: String { get }
|
||||
var rawName: String? { get }
|
||||
@@ -39,7 +39,7 @@ protocol SpaceRoomProxyProtocol {
|
||||
var via: [String] { get }
|
||||
}
|
||||
|
||||
extension SpaceRoomProxyProtocol {
|
||||
extension SpaceServiceRoomProtocol {
|
||||
var avatar: RoomAvatar {
|
||||
if isSpace {
|
||||
.space(id: id, name: name, avatarURL: avatarURL)
|
||||
@@ -50,7 +50,7 @@ extension SpaceRoomProxyProtocol {
|
||||
}
|
||||
}
|
||||
|
||||
var visibility: SpaceRoomProxyVisibility? {
|
||||
var visibility: SpaceServiceRoomVisibility? {
|
||||
switch joinRule {
|
||||
case .public:
|
||||
.public
|
||||
Reference in New Issue
Block a user