Add some new space properties. (#4544)

* Use the via property on SpaceRoom.

* Fall back to the canonical alias as a space room name if needs be.

* Use SpaceRoom.isDirect for computing the name/avatar.

* Pass in the parent space as a workaround for no restricted join rules.
This commit is contained in:
Doug
2025-09-26 10:03:11 +01:00
committed by GitHub
parent 3d5901f90d
commit 12dc6f42ba
30 changed files with 178 additions and 102 deletions
@@ -15938,6 +15938,8 @@ class SpaceRoomProxyMock: SpaceRoomProxyProtocol, @unchecked Sendable {
set(value) { underlyingIsSpace = value }
}
var underlyingIsSpace: Bool!
var isDirect: Bool?
var parent: SpaceRoomProxyProtocol?
var childrenCount: Int {
get { return underlyingChildrenCount }
set(value) { underlyingChildrenCount = value }
@@ -15959,6 +15961,7 @@ class SpaceRoomProxyMock: SpaceRoomProxyProtocol, @unchecked Sendable {
}
var underlyingGuestCanJoin: Bool!
var state: Membership?
var via: [String] = []
}
class SpaceServiceProxyMock: SpaceServiceProxyProtocol, @unchecked Sendable {
@@ -15970,15 +15973,15 @@ class SpaceServiceProxyMock: SpaceServiceProxyProtocol, @unchecked Sendable {
//MARK: - spaceRoomList
var spaceRoomListSpaceIDUnderlyingCallsCount = 0
var spaceRoomListSpaceIDCallsCount: Int {
var spaceRoomListSpaceIDParentUnderlyingCallsCount = 0
var spaceRoomListSpaceIDParentCallsCount: Int {
get {
if Thread.isMainThread {
return spaceRoomListSpaceIDUnderlyingCallsCount
return spaceRoomListSpaceIDParentUnderlyingCallsCount
} else {
var returnValue: Int? = nil
DispatchQueue.main.sync {
returnValue = spaceRoomListSpaceIDUnderlyingCallsCount
returnValue = spaceRoomListSpaceIDParentUnderlyingCallsCount
}
return returnValue!
@@ -15986,29 +15989,29 @@ class SpaceServiceProxyMock: SpaceServiceProxyProtocol, @unchecked Sendable {
}
set {
if Thread.isMainThread {
spaceRoomListSpaceIDUnderlyingCallsCount = newValue
spaceRoomListSpaceIDParentUnderlyingCallsCount = newValue
} else {
DispatchQueue.main.sync {
spaceRoomListSpaceIDUnderlyingCallsCount = newValue
spaceRoomListSpaceIDParentUnderlyingCallsCount = newValue
}
}
}
}
var spaceRoomListSpaceIDCalled: Bool {
return spaceRoomListSpaceIDCallsCount > 0
var spaceRoomListSpaceIDParentCalled: Bool {
return spaceRoomListSpaceIDParentCallsCount > 0
}
var spaceRoomListSpaceIDReceivedSpaceID: String?
var spaceRoomListSpaceIDReceivedInvocations: [String] = []
var spaceRoomListSpaceIDParentReceivedArguments: (spaceID: String, parent: SpaceRoomProxyProtocol?)?
var spaceRoomListSpaceIDParentReceivedInvocations: [(spaceID: String, parent: SpaceRoomProxyProtocol?)] = []
var spaceRoomListSpaceIDUnderlyingReturnValue: Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError>!
var spaceRoomListSpaceIDReturnValue: Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError>! {
var spaceRoomListSpaceIDParentUnderlyingReturnValue: Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError>!
var spaceRoomListSpaceIDParentReturnValue: Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError>! {
get {
if Thread.isMainThread {
return spaceRoomListSpaceIDUnderlyingReturnValue
return spaceRoomListSpaceIDParentUnderlyingReturnValue
} else {
var returnValue: Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError>? = nil
DispatchQueue.main.sync {
returnValue = spaceRoomListSpaceIDUnderlyingReturnValue
returnValue = spaceRoomListSpaceIDParentUnderlyingReturnValue
}
return returnValue!
@@ -16016,26 +16019,26 @@ class SpaceServiceProxyMock: SpaceServiceProxyProtocol, @unchecked Sendable {
}
set {
if Thread.isMainThread {
spaceRoomListSpaceIDUnderlyingReturnValue = newValue
spaceRoomListSpaceIDParentUnderlyingReturnValue = newValue
} else {
DispatchQueue.main.sync {
spaceRoomListSpaceIDUnderlyingReturnValue = newValue
spaceRoomListSpaceIDParentUnderlyingReturnValue = newValue
}
}
}
}
var spaceRoomListSpaceIDClosure: ((String) async -> Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError>)?
var spaceRoomListSpaceIDParentClosure: ((String, SpaceRoomProxyProtocol?) async -> Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError>)?
func spaceRoomList(spaceID: String) async -> Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError> {
spaceRoomListSpaceIDCallsCount += 1
spaceRoomListSpaceIDReceivedSpaceID = spaceID
func spaceRoomList(spaceID: String, parent: SpaceRoomProxyProtocol?) async -> Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError> {
spaceRoomListSpaceIDParentCallsCount += 1
spaceRoomListSpaceIDParentReceivedArguments = (spaceID: spaceID, parent: parent)
DispatchQueue.main.async {
self.spaceRoomListSpaceIDReceivedInvocations.append(spaceID)
self.spaceRoomListSpaceIDParentReceivedInvocations.append((spaceID: spaceID, parent: parent))
}
if let spaceRoomListSpaceIDClosure = spaceRoomListSpaceIDClosure {
return await spaceRoomListSpaceIDClosure(spaceID)
if let spaceRoomListSpaceIDParentClosure = spaceRoomListSpaceIDParentClosure {
return await spaceRoomListSpaceIDParentClosure(spaceID, parent)
} else {
return spaceRoomListSpaceIDReturnValue
return spaceRoomListSpaceIDParentReturnValue
}
}
}
@@ -15,6 +15,8 @@ extension SpaceRoomProxyMock {
var avatarURL: URL?
var isSpace: Bool
var isDirect: Bool?
var parent: SpaceRoomProxyProtocol?
var childrenCount = 0
var joinedMembersCount = 0
@@ -35,6 +37,8 @@ extension SpaceRoomProxyMock {
name = configuration.name
avatarURL = configuration.avatarURL
isSpace = configuration.isSpace
isDirect = configuration.isDirect
parent = configuration.parent
childrenCount = configuration.childrenCount
joinedMembersCount = configuration.joinedMembersCount
heroes = configuration.heroes
@@ -125,8 +129,10 @@ extension [SpaceRoomProxyProtocol] {
SpaceRoomProxyMock(.init(id: "!\(typeName.lowercased())3:matrix.org",
name: "Joined \(typeName)",
isSpace: isSpace,
parent: SpaceRoomProxyMock(.init(name: "Company", isSpace: true)),
joinedMembersCount: 123,
topic: "Discussion on specific topic goes here.",
joinRule: .restricted(rules: []),
state: .joined))
]
}
@@ -19,7 +19,7 @@ extension SpaceServiceProxyMock {
self.init()
joinedSpacesPublisher = .init(configuration.joinedSpaces)
spaceRoomListSpaceIDClosure = { spaceID in
spaceRoomListSpaceIDParentClosure = { spaceID, _ in
if let spaceRoomList = configuration.spaceRoomLists[spaceID] {
.success(spaceRoomList)
} else {