mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-04 10:33:45 +00:00
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:
@@ -645,6 +645,7 @@
|
|||||||
"screen_security_and_privacy_title" = "Security & privacy";
|
"screen_security_and_privacy_title" = "Security & privacy";
|
||||||
"screen_space_list_description" = "Spaces you have created or joined.";
|
"screen_space_list_description" = "Spaces you have created or joined.";
|
||||||
"screen_space_list_details" = "%1$@ • %2$@";
|
"screen_space_list_details" = "%1$@ • %2$@";
|
||||||
|
"screen_space_list_parent_space" = "%1$@ space";
|
||||||
"screen_space_list_title" = "Spaces";
|
"screen_space_list_title" = "Spaces";
|
||||||
"screen_start_chat_join_room_by_address_action" = "Join room by address";
|
"screen_start_chat_join_room_by_address_action" = "Join room by address";
|
||||||
"screen_start_chat_join_room_by_address_invalid_address" = "Not a valid address";
|
"screen_start_chat_join_room_by_address_invalid_address" = "Not a valid address";
|
||||||
|
|||||||
@@ -2880,6 +2880,10 @@ internal enum L10n {
|
|||||||
internal static func screenSpaceListDetails(_ p1: Any, _ p2: Any) -> String {
|
internal static func screenSpaceListDetails(_ p1: Any, _ p2: Any) -> String {
|
||||||
return L10n.tr("Localizable", "screen_space_list_details", String(describing: p1), String(describing: p2))
|
return L10n.tr("Localizable", "screen_space_list_details", String(describing: p1), String(describing: p2))
|
||||||
}
|
}
|
||||||
|
/// %1$@ space
|
||||||
|
internal static func screenSpaceListParentSpace(_ p1: Any) -> String {
|
||||||
|
return L10n.tr("Localizable", "screen_space_list_parent_space", String(describing: p1))
|
||||||
|
}
|
||||||
/// Spaces
|
/// Spaces
|
||||||
internal static var screenSpaceListTitle: String { return L10n.tr("Localizable", "screen_space_list_title") }
|
internal static var screenSpaceListTitle: String { return L10n.tr("Localizable", "screen_space_list_title") }
|
||||||
/// An error occurred when trying to start a chat
|
/// An error occurred when trying to start a chat
|
||||||
|
|||||||
@@ -15938,6 +15938,8 @@ class SpaceRoomProxyMock: SpaceRoomProxyProtocol, @unchecked Sendable {
|
|||||||
set(value) { underlyingIsSpace = value }
|
set(value) { underlyingIsSpace = value }
|
||||||
}
|
}
|
||||||
var underlyingIsSpace: Bool!
|
var underlyingIsSpace: Bool!
|
||||||
|
var isDirect: Bool?
|
||||||
|
var parent: SpaceRoomProxyProtocol?
|
||||||
var childrenCount: Int {
|
var childrenCount: Int {
|
||||||
get { return underlyingChildrenCount }
|
get { return underlyingChildrenCount }
|
||||||
set(value) { underlyingChildrenCount = value }
|
set(value) { underlyingChildrenCount = value }
|
||||||
@@ -15959,6 +15961,7 @@ class SpaceRoomProxyMock: SpaceRoomProxyProtocol, @unchecked Sendable {
|
|||||||
}
|
}
|
||||||
var underlyingGuestCanJoin: Bool!
|
var underlyingGuestCanJoin: Bool!
|
||||||
var state: Membership?
|
var state: Membership?
|
||||||
|
var via: [String] = []
|
||||||
|
|
||||||
}
|
}
|
||||||
class SpaceServiceProxyMock: SpaceServiceProxyProtocol, @unchecked Sendable {
|
class SpaceServiceProxyMock: SpaceServiceProxyProtocol, @unchecked Sendable {
|
||||||
@@ -15970,15 +15973,15 @@ class SpaceServiceProxyMock: SpaceServiceProxyProtocol, @unchecked Sendable {
|
|||||||
|
|
||||||
//MARK: - spaceRoomList
|
//MARK: - spaceRoomList
|
||||||
|
|
||||||
var spaceRoomListSpaceIDUnderlyingCallsCount = 0
|
var spaceRoomListSpaceIDParentUnderlyingCallsCount = 0
|
||||||
var spaceRoomListSpaceIDCallsCount: Int {
|
var spaceRoomListSpaceIDParentCallsCount: Int {
|
||||||
get {
|
get {
|
||||||
if Thread.isMainThread {
|
if Thread.isMainThread {
|
||||||
return spaceRoomListSpaceIDUnderlyingCallsCount
|
return spaceRoomListSpaceIDParentUnderlyingCallsCount
|
||||||
} else {
|
} else {
|
||||||
var returnValue: Int? = nil
|
var returnValue: Int? = nil
|
||||||
DispatchQueue.main.sync {
|
DispatchQueue.main.sync {
|
||||||
returnValue = spaceRoomListSpaceIDUnderlyingCallsCount
|
returnValue = spaceRoomListSpaceIDParentUnderlyingCallsCount
|
||||||
}
|
}
|
||||||
|
|
||||||
return returnValue!
|
return returnValue!
|
||||||
@@ -15986,29 +15989,29 @@ class SpaceServiceProxyMock: SpaceServiceProxyProtocol, @unchecked Sendable {
|
|||||||
}
|
}
|
||||||
set {
|
set {
|
||||||
if Thread.isMainThread {
|
if Thread.isMainThread {
|
||||||
spaceRoomListSpaceIDUnderlyingCallsCount = newValue
|
spaceRoomListSpaceIDParentUnderlyingCallsCount = newValue
|
||||||
} else {
|
} else {
|
||||||
DispatchQueue.main.sync {
|
DispatchQueue.main.sync {
|
||||||
spaceRoomListSpaceIDUnderlyingCallsCount = newValue
|
spaceRoomListSpaceIDParentUnderlyingCallsCount = newValue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var spaceRoomListSpaceIDCalled: Bool {
|
var spaceRoomListSpaceIDParentCalled: Bool {
|
||||||
return spaceRoomListSpaceIDCallsCount > 0
|
return spaceRoomListSpaceIDParentCallsCount > 0
|
||||||
}
|
}
|
||||||
var spaceRoomListSpaceIDReceivedSpaceID: String?
|
var spaceRoomListSpaceIDParentReceivedArguments: (spaceID: String, parent: SpaceRoomProxyProtocol?)?
|
||||||
var spaceRoomListSpaceIDReceivedInvocations: [String] = []
|
var spaceRoomListSpaceIDParentReceivedInvocations: [(spaceID: String, parent: SpaceRoomProxyProtocol?)] = []
|
||||||
|
|
||||||
var spaceRoomListSpaceIDUnderlyingReturnValue: Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError>!
|
var spaceRoomListSpaceIDParentUnderlyingReturnValue: Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError>!
|
||||||
var spaceRoomListSpaceIDReturnValue: Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError>! {
|
var spaceRoomListSpaceIDParentReturnValue: Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError>! {
|
||||||
get {
|
get {
|
||||||
if Thread.isMainThread {
|
if Thread.isMainThread {
|
||||||
return spaceRoomListSpaceIDUnderlyingReturnValue
|
return spaceRoomListSpaceIDParentUnderlyingReturnValue
|
||||||
} else {
|
} else {
|
||||||
var returnValue: Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError>? = nil
|
var returnValue: Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError>? = nil
|
||||||
DispatchQueue.main.sync {
|
DispatchQueue.main.sync {
|
||||||
returnValue = spaceRoomListSpaceIDUnderlyingReturnValue
|
returnValue = spaceRoomListSpaceIDParentUnderlyingReturnValue
|
||||||
}
|
}
|
||||||
|
|
||||||
return returnValue!
|
return returnValue!
|
||||||
@@ -16016,26 +16019,26 @@ class SpaceServiceProxyMock: SpaceServiceProxyProtocol, @unchecked Sendable {
|
|||||||
}
|
}
|
||||||
set {
|
set {
|
||||||
if Thread.isMainThread {
|
if Thread.isMainThread {
|
||||||
spaceRoomListSpaceIDUnderlyingReturnValue = newValue
|
spaceRoomListSpaceIDParentUnderlyingReturnValue = newValue
|
||||||
} else {
|
} else {
|
||||||
DispatchQueue.main.sync {
|
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> {
|
func spaceRoomList(spaceID: String, parent: SpaceRoomProxyProtocol?) async -> Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError> {
|
||||||
spaceRoomListSpaceIDCallsCount += 1
|
spaceRoomListSpaceIDParentCallsCount += 1
|
||||||
spaceRoomListSpaceIDReceivedSpaceID = spaceID
|
spaceRoomListSpaceIDParentReceivedArguments = (spaceID: spaceID, parent: parent)
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
self.spaceRoomListSpaceIDReceivedInvocations.append(spaceID)
|
self.spaceRoomListSpaceIDParentReceivedInvocations.append((spaceID: spaceID, parent: parent))
|
||||||
}
|
}
|
||||||
if let spaceRoomListSpaceIDClosure = spaceRoomListSpaceIDClosure {
|
if let spaceRoomListSpaceIDParentClosure = spaceRoomListSpaceIDParentClosure {
|
||||||
return await spaceRoomListSpaceIDClosure(spaceID)
|
return await spaceRoomListSpaceIDParentClosure(spaceID, parent)
|
||||||
} else {
|
} else {
|
||||||
return spaceRoomListSpaceIDReturnValue
|
return spaceRoomListSpaceIDParentReturnValue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ extension SpaceRoomProxyMock {
|
|||||||
var avatarURL: URL?
|
var avatarURL: URL?
|
||||||
|
|
||||||
var isSpace: Bool
|
var isSpace: Bool
|
||||||
|
var isDirect: Bool?
|
||||||
|
var parent: SpaceRoomProxyProtocol?
|
||||||
var childrenCount = 0
|
var childrenCount = 0
|
||||||
|
|
||||||
var joinedMembersCount = 0
|
var joinedMembersCount = 0
|
||||||
@@ -35,6 +37,8 @@ extension SpaceRoomProxyMock {
|
|||||||
name = configuration.name
|
name = configuration.name
|
||||||
avatarURL = configuration.avatarURL
|
avatarURL = configuration.avatarURL
|
||||||
isSpace = configuration.isSpace
|
isSpace = configuration.isSpace
|
||||||
|
isDirect = configuration.isDirect
|
||||||
|
parent = configuration.parent
|
||||||
childrenCount = configuration.childrenCount
|
childrenCount = configuration.childrenCount
|
||||||
joinedMembersCount = configuration.joinedMembersCount
|
joinedMembersCount = configuration.joinedMembersCount
|
||||||
heroes = configuration.heroes
|
heroes = configuration.heroes
|
||||||
@@ -125,8 +129,10 @@ extension [SpaceRoomProxyProtocol] {
|
|||||||
SpaceRoomProxyMock(.init(id: "!\(typeName.lowercased())3:matrix.org",
|
SpaceRoomProxyMock(.init(id: "!\(typeName.lowercased())3:matrix.org",
|
||||||
name: "Joined \(typeName)",
|
name: "Joined \(typeName)",
|
||||||
isSpace: isSpace,
|
isSpace: isSpace,
|
||||||
|
parent: SpaceRoomProxyMock(.init(name: "Company", isSpace: true)),
|
||||||
joinedMembersCount: 123,
|
joinedMembersCount: 123,
|
||||||
topic: "Discussion on specific topic goes here.",
|
topic: "Discussion on specific topic goes here.",
|
||||||
|
joinRule: .restricted(rules: []),
|
||||||
state: .joined))
|
state: .joined))
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ extension SpaceServiceProxyMock {
|
|||||||
self.init()
|
self.init()
|
||||||
|
|
||||||
joinedSpacesPublisher = .init(configuration.joinedSpaces)
|
joinedSpacesPublisher = .init(configuration.joinedSpaces)
|
||||||
spaceRoomListSpaceIDClosure = { spaceID in
|
spaceRoomListSpaceIDParentClosure = { spaceID, _ in
|
||||||
if let spaceRoomList = configuration.spaceRoomLists[spaceID] {
|
if let spaceRoomList = configuration.spaceRoomLists[spaceID] {
|
||||||
.success(spaceRoomList)
|
.success(spaceRoomList)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -286,7 +286,7 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
switch await clientProxy.spaceService.spaceRoomList(spaceID: roomID) {
|
switch await clientProxy.spaceService.spaceRoomList(spaceID: roomID, parent: nil) {
|
||||||
case .success(let spaceRoomListProxy):
|
case .success(let spaceRoomListProxy):
|
||||||
actionsSubject.send(.joined(.space(spaceRoomListProxy)))
|
actionsSubject.send(.joined(.space(spaceRoomListProxy)))
|
||||||
case .failure(let error):
|
case .failure(let error):
|
||||||
|
|||||||
@@ -14,8 +14,6 @@ struct SpaceHeaderView: View {
|
|||||||
|
|
||||||
@State private var isPresentingTopic = false
|
@State private var isPresentingTopic = false
|
||||||
|
|
||||||
var title: String { spaceRoomProxy.name ?? "" }
|
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
VStack(spacing: 16) {
|
VStack(spacing: 16) {
|
||||||
RoomAvatarImage(avatar: spaceRoomProxy.avatar,
|
RoomAvatarImage(avatar: spaceRoomProxy.avatar,
|
||||||
@@ -24,7 +22,7 @@ struct SpaceHeaderView: View {
|
|||||||
.accessibilityHidden(true)
|
.accessibilityHidden(true)
|
||||||
|
|
||||||
VStack(spacing: 8) {
|
VStack(spacing: 8) {
|
||||||
Text(title)
|
Text(spaceRoomProxy.computedName)
|
||||||
.font(.compound.headingLGBold)
|
.font(.compound.headingLGBold)
|
||||||
.foregroundStyle(.compound.textPrimary)
|
.foregroundStyle(.compound.textPrimary)
|
||||||
.multilineTextAlignment(.center)
|
.multilineTextAlignment(.center)
|
||||||
@@ -76,31 +74,24 @@ struct SpaceHeaderView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var spaceDetailsVisibilityTitle: String {
|
var spaceDetailsVisibilityTitle: String {
|
||||||
switch spaceRoomProxy.joinRule {
|
switch spaceRoomProxy.visibility {
|
||||||
case .public:
|
case .public: L10n.commonPublicSpace
|
||||||
L10n.commonPublicSpace
|
case .private: L10n.commonPrivateSpace
|
||||||
case .restricted(let rules), .knockRestricted(let rules):
|
case .restricted(let parentName): L10n.screenSpaceListParentSpace(parentName)
|
||||||
// FIXME: Get this from the rule (falling back to a passed in parent??)
|
case .none: L10n.commonPrivateSpace
|
||||||
"<Parent name> space"
|
|
||||||
case .invite, .knock, .private, .custom, .none:
|
|
||||||
L10n.commonPrivateSpace
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var spaceDetailsVisibilityIcon: KeyPath<CompoundIcons, Image> {
|
var spaceDetailsVisibilityIcon: KeyPath<CompoundIcons, Image> {
|
||||||
switch spaceRoomProxy.joinRule {
|
switch spaceRoomProxy.visibility {
|
||||||
case .public:
|
case .public: \.public
|
||||||
\.public
|
case .private: \.lock
|
||||||
case .restricted, .knockRestricted:
|
case .restricted: \.space
|
||||||
\.space
|
case .none: \.lock
|
||||||
case .invite, .knock, .private, .custom, .none:
|
|
||||||
\.lock
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
import MatrixRustSDK
|
|
||||||
|
|
||||||
struct SpaceHeaderMembersView: View {
|
struct SpaceHeaderMembersView: View {
|
||||||
let heroes: [UserProfileProxy]
|
let heroes: [UserProfileProxy]
|
||||||
let joinedCount: Int
|
let joinedCount: Int
|
||||||
@@ -159,6 +150,8 @@ struct SpaceHeaderMembersView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: - Previews
|
||||||
|
|
||||||
struct SpaceHeaderView_Previews: PreviewProvider, TestablePreview {
|
struct SpaceHeaderView_Previews: PreviewProvider, TestablePreview {
|
||||||
static let mediaProvider = MediaProviderMock(configuration: .init())
|
static let mediaProvider = MediaProviderMock(configuration: .init())
|
||||||
|
|
||||||
@@ -190,6 +183,7 @@ struct SpaceHeaderView_Previews: PreviewProvider, TestablePreview {
|
|||||||
SpaceRoomProxyMock(.init(id: "!space3:matrix.org",
|
SpaceRoomProxyMock(.init(id: "!space3:matrix.org",
|
||||||
name: "Subspace",
|
name: "Subspace",
|
||||||
isSpace: true,
|
isSpace: true,
|
||||||
|
parent: SpaceRoomProxyMock(.init(name: "Foundation", isSpace: true)),
|
||||||
childrenCount: 30,
|
childrenCount: 30,
|
||||||
joinedMembersCount: 123,
|
joinedMembersCount: 123,
|
||||||
heroes: [.mockDan, .mockBob, .mockCharlie, .mockVerbose],
|
heroes: [.mockDan, .mockBob, .mockCharlie, .mockVerbose],
|
||||||
|
|||||||
@@ -25,12 +25,26 @@ struct SpaceRoomCell: View {
|
|||||||
|
|
||||||
private var subtitle: String {
|
private var subtitle: String {
|
||||||
if spaceRoomProxy.isSpace {
|
if spaceRoomProxy.isSpace {
|
||||||
spaceRoomProxy.joinRule == .public ? L10n.commonPublicSpace : L10n.commonPrivateSpace
|
switch spaceRoomProxy.visibility {
|
||||||
|
case .public: L10n.commonPublicSpace
|
||||||
|
case .private: L10n.commonPrivateSpace
|
||||||
|
case .restricted(let parentName): L10n.screenSpaceListParentSpace(parentName)
|
||||||
|
case .none: L10n.commonPrivateSpace
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
L10n.commonMemberCount(spaceRoomProxy.joinedMembersCount)
|
L10n.commonMemberCount(spaceRoomProxy.joinedMembersCount)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var visibilityIcon: KeyPath<CompoundIcons, Image>? {
|
||||||
|
switch spaceRoomProxy.visibility {
|
||||||
|
case .public: \.public
|
||||||
|
case .private: \.lockSolid
|
||||||
|
case .restricted: nil
|
||||||
|
case .none: \.lockSolid
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private var details: String {
|
private var details: String {
|
||||||
if spaceRoomProxy.isSpace {
|
if spaceRoomProxy.isSpace {
|
||||||
L10n.screenSpaceListDetails(L10n.commonRooms(spaceRoomProxy.childrenCount),
|
L10n.screenSpaceListDetails(L10n.commonRooms(spaceRoomProxy.childrenCount),
|
||||||
@@ -77,12 +91,12 @@ struct SpaceRoomCell: View {
|
|||||||
private var content: some View {
|
private var content: some View {
|
||||||
HStack(spacing: 16) {
|
HStack(spacing: 16) {
|
||||||
VStack(alignment: .leading, spacing: 2) {
|
VStack(alignment: .leading, spacing: 2) {
|
||||||
Text(spaceRoomProxy.name ?? spaceRoomProxy.id)
|
Text(spaceRoomProxy.computedName)
|
||||||
.font(.compound.bodyLGSemibold)
|
.font(.compound.bodyLGSemibold)
|
||||||
.foregroundColor(.compound.textPrimary)
|
.foregroundColor(.compound.textPrimary)
|
||||||
.lineLimit(1)
|
.lineLimit(1)
|
||||||
|
|
||||||
visibilityLabel
|
subtitleLabel
|
||||||
|
|
||||||
Text(details)
|
Text(details)
|
||||||
.font(.compound.bodyMD)
|
.font(.compound.bodyMD)
|
||||||
@@ -95,18 +109,20 @@ struct SpaceRoomCell: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private var visibilityLabel: some View {
|
private var subtitleLabel: some View {
|
||||||
Label {
|
Label {
|
||||||
Text(subtitle)
|
Text(subtitle)
|
||||||
.font(.compound.bodyMD)
|
.font(.compound.bodyMD)
|
||||||
.foregroundStyle(.compound.textSecondary)
|
.foregroundStyle(.compound.textSecondary)
|
||||||
.lineLimit(1)
|
.lineLimit(1)
|
||||||
} icon: {
|
} icon: {
|
||||||
CompoundIcon(spaceRoomProxy.joinRule == .public ? \.public : \.lockSolid,
|
if let visibilityIcon {
|
||||||
|
CompoundIcon(visibilityIcon,
|
||||||
size: .xSmall,
|
size: .xSmall,
|
||||||
relativeTo: .compound.bodyMD)
|
relativeTo: .compound.bodyMD)
|
||||||
.foregroundStyle(.compound.iconTertiary)
|
.foregroundStyle(.compound.iconTertiary)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
.labelStyle(.custom(spacing: 4))
|
.labelStyle(.custom(spacing: 4))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ class SpaceListScreenViewModel: SpaceListScreenViewModelType, SpaceListScreenVie
|
|||||||
// MARK: - Private
|
// MARK: - Private
|
||||||
|
|
||||||
private func selectSpace(_ spaceRoomProxy: SpaceRoomProxyProtocol) async {
|
private func selectSpace(_ spaceRoomProxy: SpaceRoomProxyProtocol) async {
|
||||||
switch await spaceServiceProxy.spaceRoomList(spaceID: spaceRoomProxy.id) {
|
switch await spaceServiceProxy.spaceRoomList(spaceID: spaceRoomProxy.id, parent: nil) {
|
||||||
case .success(let spaceRoomListProxy):
|
case .success(let spaceRoomListProxy):
|
||||||
actionsSubject.send(.selectSpace(spaceRoomListProxy))
|
actionsSubject.send(.selectSpace(spaceRoomListProxy))
|
||||||
case .failure(let error):
|
case .failure(let error):
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import SwiftUI
|
|||||||
typealias SpaceScreenViewModelType = StateStoreViewModelV2<SpaceScreenViewState, SpaceScreenViewAction>
|
typealias SpaceScreenViewModelType = StateStoreViewModelV2<SpaceScreenViewState, SpaceScreenViewAction>
|
||||||
|
|
||||||
class SpaceScreenViewModel: SpaceScreenViewModelType, SpaceScreenViewModelProtocol {
|
class SpaceScreenViewModel: SpaceScreenViewModelType, SpaceScreenViewModelProtocol {
|
||||||
|
private let spaceRoomListProxy: SpaceRoomListProxyProtocol
|
||||||
private let spaceServiceProxy: SpaceServiceProxyProtocol
|
private let spaceServiceProxy: SpaceServiceProxyProtocol
|
||||||
private let clientProxy: ClientProxyProtocol
|
private let clientProxy: ClientProxyProtocol
|
||||||
private let userIndicatorController: UserIndicatorControllerProtocol
|
private let userIndicatorController: UserIndicatorControllerProtocol
|
||||||
@@ -25,6 +26,7 @@ class SpaceScreenViewModel: SpaceScreenViewModelType, SpaceScreenViewModelProtoc
|
|||||||
selectedSpaceRoomPublisher: CurrentValuePublisher<String?, Never>,
|
selectedSpaceRoomPublisher: CurrentValuePublisher<String?, Never>,
|
||||||
userSession: UserSessionProtocol,
|
userSession: UserSessionProtocol,
|
||||||
userIndicatorController: UserIndicatorControllerProtocol) {
|
userIndicatorController: UserIndicatorControllerProtocol) {
|
||||||
|
self.spaceRoomListProxy = spaceRoomListProxy
|
||||||
self.spaceServiceProxy = spaceServiceProxy
|
self.spaceServiceProxy = spaceServiceProxy
|
||||||
clientProxy = userSession.clientProxy
|
clientProxy = userSession.clientProxy
|
||||||
self.userIndicatorController = userIndicatorController
|
self.userIndicatorController = userIndicatorController
|
||||||
@@ -93,7 +95,7 @@ class SpaceScreenViewModel: SpaceScreenViewModelType, SpaceScreenViewModelProtoc
|
|||||||
state.joiningRoomIDs.insert(spaceRoomProxy.id)
|
state.joiningRoomIDs.insert(spaceRoomProxy.id)
|
||||||
defer { state.joiningRoomIDs.remove(spaceRoomProxy.id) }
|
defer { state.joiningRoomIDs.remove(spaceRoomProxy.id) }
|
||||||
|
|
||||||
guard case .success = await clientProxy.joinRoom(spaceRoomProxy.id, via: []) else {
|
guard case .success = await clientProxy.joinRoom(spaceRoomProxy.id, via: spaceRoomProxy.via) else {
|
||||||
showFailureIndicator()
|
showFailureIndicator()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -109,7 +111,7 @@ class SpaceScreenViewModel: SpaceScreenViewModelType, SpaceScreenViewModelProtoc
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func selectSpace(_ spaceRoomProxy: SpaceRoomProxyProtocol) async {
|
private func selectSpace(_ spaceRoomProxy: SpaceRoomProxyProtocol) async {
|
||||||
switch await spaceServiceProxy.spaceRoomList(spaceID: spaceRoomProxy.id) {
|
switch await spaceServiceProxy.spaceRoomList(spaceID: spaceRoomProxy.id, parent: spaceRoomListProxy.spaceRoomProxy) {
|
||||||
case .success(let spaceRoomListProxy):
|
case .success(let spaceRoomListProxy):
|
||||||
actionsSubject.send(.selectSpace(spaceRoomListProxy))
|
actionsSubject.send(.selectSpace(spaceRoomListProxy))
|
||||||
case .failure(let error):
|
case .failure(let error):
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ struct SpaceScreen_Previews: PreviewProvider, TestablePreview {
|
|||||||
let spaceRoomProxy = SpaceRoomProxyMock(.init(id: "!eng-space:matrix.org",
|
let spaceRoomProxy = SpaceRoomProxyMock(.init(id: "!eng-space:matrix.org",
|
||||||
name: "Engineering Team",
|
name: "Engineering Team",
|
||||||
isSpace: true,
|
isSpace: true,
|
||||||
|
parent: SpaceRoomProxyMock(.init(name: "MegaGroup", isSpace: true)),
|
||||||
childrenCount: 30,
|
childrenCount: 30,
|
||||||
joinedMembersCount: 76,
|
joinedMembersCount: 76,
|
||||||
heroes: [.mockDan, .mockBob, .mockCharlie, .mockVerbose],
|
heroes: [.mockDan, .mockBob, .mockCharlie, .mockVerbose],
|
||||||
|
|||||||
@@ -21,11 +21,12 @@ class SpaceRoomListProxy: SpaceRoomListProxyProtocol {
|
|||||||
private let paginationStateHandle: TaskHandle
|
private let paginationStateHandle: TaskHandle
|
||||||
let paginationStatePublisher: CurrentValuePublisher<SpaceRoomListPaginationState, Never>
|
let paginationStatePublisher: CurrentValuePublisher<SpaceRoomListPaginationState, Never>
|
||||||
|
|
||||||
init(_ spaceRoomList: SpaceRoomListProtocol) throws {
|
// Parent is temporary until we get the restricted AllowRules from the server.
|
||||||
|
init(_ spaceRoomList: SpaceRoomListProtocol, parent: SpaceRoomProxyProtocol?) throws {
|
||||||
guard let spaceRoom = spaceRoomList.space() else { throw SpaceRoomListProxyError.missingSpace }
|
guard let spaceRoom = spaceRoomList.space() else { throw SpaceRoomListProxyError.missingSpace }
|
||||||
|
|
||||||
self.spaceRoomList = spaceRoomList
|
self.spaceRoomList = spaceRoomList
|
||||||
spaceRoomProxy = SpaceRoomProxy(spaceRoom: spaceRoom)
|
spaceRoomProxy = SpaceRoomProxy(spaceRoom: spaceRoom, parent: parent)
|
||||||
|
|
||||||
let paginationStateSubject = CurrentValueSubject<SpaceRoomListPaginationState, Never>(spaceRoomList.paginationState())
|
let paginationStateSubject = CurrentValueSubject<SpaceRoomListPaginationState, Never>(spaceRoomList.paginationState())
|
||||||
paginationStatePublisher = paginationStateSubject.asCurrentValuePublisher()
|
paginationStatePublisher = paginationStateSubject.asCurrentValuePublisher()
|
||||||
@@ -55,27 +56,27 @@ class SpaceRoomListProxy: SpaceRoomListProxyProtocol {
|
|||||||
for update in updates {
|
for update in updates {
|
||||||
switch update {
|
switch update {
|
||||||
case .append(let spaceRooms):
|
case .append(let spaceRooms):
|
||||||
rooms.append(contentsOf: spaceRooms.map(SpaceRoomProxy.init))
|
rooms.append(contentsOf: spaceRooms.map { SpaceRoomProxy(spaceRoom: $0, parent: spaceRoomProxy) })
|
||||||
case .clear:
|
case .clear:
|
||||||
rooms.removeAll()
|
rooms.removeAll()
|
||||||
case .pushFront(let spaceRoom):
|
case .pushFront(let spaceRoom):
|
||||||
rooms.insert(SpaceRoomProxy(spaceRoom: spaceRoom), at: 0)
|
rooms.insert(SpaceRoomProxy(spaceRoom: spaceRoom, parent: spaceRoomProxy), at: 0)
|
||||||
case .pushBack(let spaceRoom):
|
case .pushBack(let spaceRoom):
|
||||||
rooms.append(SpaceRoomProxy(spaceRoom: spaceRoom))
|
rooms.append(SpaceRoomProxy(spaceRoom: spaceRoom, parent: spaceRoomProxy))
|
||||||
case .popFront:
|
case .popFront:
|
||||||
rooms.removeFirst()
|
rooms.removeFirst()
|
||||||
case .popBack:
|
case .popBack:
|
||||||
rooms.removeLast()
|
rooms.removeLast()
|
||||||
case .insert(let index, let spaceRoom):
|
case .insert(let index, let spaceRoom):
|
||||||
rooms.insert(SpaceRoomProxy(spaceRoom: spaceRoom), at: Int(index))
|
rooms.insert(SpaceRoomProxy(spaceRoom: spaceRoom, parent: spaceRoomProxy), at: Int(index))
|
||||||
case .set(let index, let spaceRoom):
|
case .set(let index, let spaceRoom):
|
||||||
rooms[Int(index)] = SpaceRoomProxy(spaceRoom: spaceRoom)
|
rooms[Int(index)] = SpaceRoomProxy(spaceRoom: spaceRoom, parent: spaceRoomProxy)
|
||||||
case .remove(let index):
|
case .remove(let index):
|
||||||
rooms.remove(at: Int(index))
|
rooms.remove(at: Int(index))
|
||||||
case .truncate(let length):
|
case .truncate(let length):
|
||||||
rooms.removeSubrange(Int(length)..<rooms.count)
|
rooms.removeSubrange(Int(length)..<rooms.count)
|
||||||
case .reset(let spaceRooms):
|
case .reset(let spaceRooms):
|
||||||
rooms = spaceRooms.map(SpaceRoomProxy.init)
|
rooms = spaceRooms.map { SpaceRoomProxy(spaceRoom: $0, parent: spaceRoomProxy) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,9 +10,15 @@ import MatrixRustSDK
|
|||||||
|
|
||||||
class SpaceRoomProxy: SpaceRoomProxyProtocol {
|
class SpaceRoomProxy: SpaceRoomProxyProtocol {
|
||||||
private let spaceRoom: SpaceRoom
|
private let spaceRoom: SpaceRoom
|
||||||
|
let parent: SpaceRoomProxyProtocol?
|
||||||
|
|
||||||
init(spaceRoom: SpaceRoom) {
|
/// Proxies a `SpaceRoom` from the Rust SDK.
|
||||||
|
/// - Parameters:
|
||||||
|
/// - spaceRoom: The `SpaceRoom` to proxy.
|
||||||
|
/// - parent: A temporary parameter until we get the `AllowRule`s from the server.
|
||||||
|
init(spaceRoom: SpaceRoom, parent: SpaceRoomProxyProtocol?) {
|
||||||
self.spaceRoom = spaceRoom
|
self.spaceRoom = spaceRoom
|
||||||
|
self.parent = parent
|
||||||
}
|
}
|
||||||
|
|
||||||
lazy var id = spaceRoom.roomId
|
lazy var id = spaceRoom.roomId
|
||||||
@@ -20,6 +26,7 @@ class SpaceRoomProxy: SpaceRoomProxyProtocol {
|
|||||||
var avatarURL: URL? { spaceRoom.avatarUrl.flatMap(URL.init) }
|
var avatarURL: URL? { spaceRoom.avatarUrl.flatMap(URL.init) }
|
||||||
|
|
||||||
var isSpace: Bool { spaceRoom.roomType == .space }
|
var isSpace: Bool { spaceRoom.roomType == .space }
|
||||||
|
var isDirect: Bool? { spaceRoom.isDirect }
|
||||||
var childrenCount: Int { Int(spaceRoom.childrenCount) }
|
var childrenCount: Int { Int(spaceRoom.childrenCount) }
|
||||||
|
|
||||||
var joinedMembersCount: Int { Int(spaceRoom.numJoinedMembers) }
|
var joinedMembersCount: Int { Int(spaceRoom.numJoinedMembers) }
|
||||||
@@ -31,4 +38,5 @@ class SpaceRoomProxy: SpaceRoomProxyProtocol {
|
|||||||
var worldReadable: Bool? { spaceRoom.worldReadable }
|
var worldReadable: Bool? { spaceRoom.worldReadable }
|
||||||
var guestCanJoin: Bool { spaceRoom.guestCanJoin }
|
var guestCanJoin: Bool { spaceRoom.guestCanJoin }
|
||||||
var state: Membership? { spaceRoom.state }
|
var state: Membership? { spaceRoom.state }
|
||||||
|
var via: [String] { spaceRoom.via }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,13 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
import MatrixRustSDK
|
import MatrixRustSDK
|
||||||
|
|
||||||
|
enum SpaceRoomProxyVisibility: Equatable {
|
||||||
|
case `public`
|
||||||
|
case `private`
|
||||||
|
case restricted(parentName: String)
|
||||||
|
// We can add the external case in here eventually.
|
||||||
|
}
|
||||||
|
|
||||||
// sourcery: AutoMockable
|
// sourcery: AutoMockable
|
||||||
protocol SpaceRoomProxyProtocol {
|
protocol SpaceRoomProxyProtocol {
|
||||||
var id: String { get }
|
var id: String { get }
|
||||||
@@ -15,6 +22,9 @@ protocol SpaceRoomProxyProtocol {
|
|||||||
var avatarURL: URL? { get }
|
var avatarURL: URL? { get }
|
||||||
|
|
||||||
var isSpace: Bool { get }
|
var isSpace: Bool { get }
|
||||||
|
var isDirect: Bool? { get }
|
||||||
|
/// A temporary property until we get the `AllowRule`s from the server.
|
||||||
|
var parent: SpaceRoomProxyProtocol? { get }
|
||||||
var childrenCount: Int { get }
|
var childrenCount: Int { get }
|
||||||
|
|
||||||
var joinedMembersCount: Int { get }
|
var joinedMembersCount: Int { get }
|
||||||
@@ -26,14 +36,43 @@ protocol SpaceRoomProxyProtocol {
|
|||||||
var worldReadable: Bool? { get }
|
var worldReadable: Bool? { get }
|
||||||
var guestCanJoin: Bool { get }
|
var guestCanJoin: Bool { get }
|
||||||
var state: Membership? { get }
|
var state: Membership? { get }
|
||||||
|
var via: [String] { get }
|
||||||
}
|
}
|
||||||
|
|
||||||
extension SpaceRoomProxyProtocol {
|
extension SpaceRoomProxyProtocol {
|
||||||
var avatar: RoomAvatar {
|
var avatar: RoomAvatar {
|
||||||
if isSpace {
|
if isSpace {
|
||||||
.space(id: id, name: name, avatarURL: avatarURL)
|
.space(id: id, name: name, avatarURL: avatarURL)
|
||||||
} else { // We don't need to check for heroes, we only do that for DMs.
|
} else if isDirect == true, avatarURL == nil, heroes.count == 1 {
|
||||||
|
.heroes(heroes)
|
||||||
|
} else {
|
||||||
.room(id: id, name: name, avatarURL: avatarURL)
|
.room(id: id, name: name, avatarURL: avatarURL)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var computedName: String {
|
||||||
|
if !isSpace, isDirect == true, name == nil, heroes.count == 1, let dmRecipient = heroes.first {
|
||||||
|
dmRecipient.displayName ?? dmRecipient.id
|
||||||
|
} else {
|
||||||
|
name ?? canonicalAlias ?? id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var visibility: SpaceRoomProxyVisibility? {
|
||||||
|
switch joinRule {
|
||||||
|
case .public:
|
||||||
|
.public
|
||||||
|
case .restricted, .knockRestricted:
|
||||||
|
// Temporary solution until the server includes the `AllowRule` values (they're always empty right now).
|
||||||
|
if let parent {
|
||||||
|
.restricted(parentName: parent.computedName)
|
||||||
|
} else {
|
||||||
|
.private
|
||||||
|
}
|
||||||
|
case .invite, .knock, .private, .custom:
|
||||||
|
.private
|
||||||
|
case .none:
|
||||||
|
.none
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,9 +30,10 @@ class SpaceServiceProxy: SpaceServiceProxyProtocol {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func spaceRoomList(spaceID: String) async -> Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError> {
|
// The parent here is temporary until we get the restricted AllowRules from the server.
|
||||||
|
func spaceRoomList(spaceID: String, parent: SpaceRoomProxyProtocol?) async -> Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError> {
|
||||||
do {
|
do {
|
||||||
return try await .success(SpaceRoomListProxy(spaceService.spaceRoomList(spaceId: spaceID)))
|
return try await .success(SpaceRoomListProxy(spaceService.spaceRoomList(spaceId: spaceID), parent: parent))
|
||||||
} catch {
|
} catch {
|
||||||
MXLog.error("Failed creating space room list for \(spaceID): \(error)")
|
MXLog.error("Failed creating space room list for \(spaceID): \(error)")
|
||||||
return .failure(.sdkError(error))
|
return .failure(.sdkError(error))
|
||||||
@@ -47,27 +48,27 @@ class SpaceServiceProxy: SpaceServiceProxyProtocol {
|
|||||||
for update in updates {
|
for update in updates {
|
||||||
switch update {
|
switch update {
|
||||||
case .append(let spaceRooms):
|
case .append(let spaceRooms):
|
||||||
spaces.append(contentsOf: spaceRooms.map(SpaceRoomProxy.init))
|
spaces.append(contentsOf: spaceRooms.map { SpaceRoomProxy(spaceRoom: $0, parent: nil) })
|
||||||
case .clear:
|
case .clear:
|
||||||
spaces.removeAll()
|
spaces.removeAll()
|
||||||
case .pushFront(let spaceRoom):
|
case .pushFront(let spaceRoom):
|
||||||
spaces.insert(SpaceRoomProxy(spaceRoom: spaceRoom), at: 0)
|
spaces.insert(SpaceRoomProxy(spaceRoom: spaceRoom, parent: nil), at: 0)
|
||||||
case .pushBack(let spaceRoom):
|
case .pushBack(let spaceRoom):
|
||||||
spaces.append(SpaceRoomProxy(spaceRoom: spaceRoom))
|
spaces.append(SpaceRoomProxy(spaceRoom: spaceRoom, parent: nil))
|
||||||
case .popFront:
|
case .popFront:
|
||||||
spaces.removeFirst()
|
spaces.removeFirst()
|
||||||
case .popBack:
|
case .popBack:
|
||||||
spaces.removeLast()
|
spaces.removeLast()
|
||||||
case .insert(let index, let spaceRoom):
|
case .insert(let index, let spaceRoom):
|
||||||
spaces.insert(SpaceRoomProxy(spaceRoom: spaceRoom), at: Int(index))
|
spaces.insert(SpaceRoomProxy(spaceRoom: spaceRoom, parent: nil), at: Int(index))
|
||||||
case .set(let index, let spaceRoom):
|
case .set(let index, let spaceRoom):
|
||||||
spaces[Int(index)] = SpaceRoomProxy(spaceRoom: spaceRoom)
|
spaces[Int(index)] = SpaceRoomProxy(spaceRoom: spaceRoom, parent: nil)
|
||||||
case .remove(let index):
|
case .remove(let index):
|
||||||
spaces.remove(at: Int(index))
|
spaces.remove(at: Int(index))
|
||||||
case .truncate(let length):
|
case .truncate(let length):
|
||||||
spaces.removeSubrange(Int(length)..<spaces.count)
|
spaces.removeSubrange(Int(length)..<spaces.count)
|
||||||
case .reset(let spaceRooms):
|
case .reset(let spaceRooms):
|
||||||
spaces = spaceRooms.map(SpaceRoomProxy.init)
|
spaces = spaceRooms.map { SpaceRoomProxy(spaceRoom: $0, parent: nil) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,5 +16,5 @@ enum SpaceServiceProxyError: Error {
|
|||||||
protocol SpaceServiceProxyProtocol {
|
protocol SpaceServiceProxyProtocol {
|
||||||
var joinedSpacesPublisher: CurrentValuePublisher<[SpaceRoomProxyProtocol], Never> { get }
|
var joinedSpacesPublisher: CurrentValuePublisher<[SpaceRoomProxyProtocol], Never> { get }
|
||||||
|
|
||||||
func spaceRoomList(spaceID: String) async -> Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError>
|
func spaceRoomList(spaceID: String, parent: SpaceRoomProxyProtocol?) async -> Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:d89f971df09420eeb3e2393d12851c50da0896366fd914df6e50f8525b1963bc
|
oid sha256:807aa8e11948c203afd2deb242544db922d2b9fa5f03bfb5e51a065111da287b
|
||||||
size 207443
|
size 207287
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:80d43f3c8bd54048177b925efe184e6324da54a6c342ed2f5629983a15ec946a
|
oid sha256:95bceb140bbd1058309c452ed10a2793786d3920d56b560b064bd42b168d8db2
|
||||||
size 223500
|
size 224095
|
||||||
|
|||||||
+2
-2
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:11b7484b43434f0d598cc596e7eaaa9d898d25b3aba4dfe9d05bdc78ea9b8187
|
oid sha256:3937567a4f7c207808f34ca90da2235499b12125bdcab7265a4306952148656d
|
||||||
size 138715
|
size 138754
|
||||||
|
|||||||
+2
-2
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:e5ea7da5f53f16d9d7eba70450c61ef7ec6b93f70148d32b0152ffa6ec211c33
|
oid sha256:fcfd2f3de9d2bc68fe60f938a7f547b9db72ebca2b4dce6d70295e3c41c031a4
|
||||||
size 164457
|
size 164599
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:54368559609ff14224342f399d05e2a5dbd2a8955aaf4154d53b6f0ac356dd3a
|
oid sha256:c8fb30078446367dea1b3b82dcb666fd6feefd209538d33497069e6b093f3169
|
||||||
size 237461
|
size 237815
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:074fc2ca164c28f15ab817ebee9f8ec74eb1cb99737996777e03b65873935e5e
|
oid sha256:5027349437978cdc95f908a0101186b8760c1da5b69cf4e5edec867b41168065
|
||||||
size 278733
|
size 279853
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:37ff651fc4d7b3e559df8148424d5f58935aa885fd51795db37e8ac687ceaf20
|
oid sha256:cbfed0d2b08d41fdbd6ff60c281cb5d6ec3e80bbdc6a59329a83d6ea9d4c318e
|
||||||
size 173995
|
size 173900
|
||||||
|
|||||||
+2
-2
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:3e8846578b4730e1fb88c183078eb2be0fe707f528ec3ae9dd56a4720f5caa2a
|
oid sha256:ff137a6fbde88a171d53a6ac84d0b865e045d6e4a20a9391b04752fd50a4aab3
|
||||||
size 197153
|
size 197663
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:aa43fefcbe0406d7c84752152b5f4ad6951175fcc98a9fb48b0f6cad24d0f012
|
oid sha256:dd3dd3c0a55de039b42e2e482961a0bdb10b620fb9ec61bce3aeb5b21ace9673
|
||||||
size 242481
|
size 242555
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:949fa7494236c24c00438329892fb75750eb08b310bf1c4e56e918e8a68feec4
|
oid sha256:9566d9dad78a0543f67888d1b71b62867872199c15e93773f0d77ee1eb9a6d14
|
||||||
size 280034
|
size 282042
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:80f8c4e7b7c90e6f6ef159c7642aaed70f93f4788686d39e6518f20b98e7f5ab
|
oid sha256:d52a23968f190f7e5d09ef0c5ee88753cbafbb62a50df806cc125029f058f716
|
||||||
size 187209
|
size 187280
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:75524c40db1a8c622b3a37cde5ac93c022b44f807e5d18b986b906fe6e47d2e8
|
oid sha256:f9ee877dbaac15c99f1a15b6efb40b5704c149ec1e3ba39e3ebc955943e6866d
|
||||||
size 207423
|
size 208759
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ class SpaceListScreenViewModelTests: XCTestCase {
|
|||||||
])
|
])
|
||||||
spaceServiceProxy = SpaceServiceProxyMock(.init())
|
spaceServiceProxy = SpaceServiceProxyMock(.init())
|
||||||
spaceServiceProxy.joinedSpacesPublisher = joinedSpacesSubject.asCurrentValuePublisher()
|
spaceServiceProxy.joinedSpacesPublisher = joinedSpacesSubject.asCurrentValuePublisher()
|
||||||
spaceServiceProxy.spaceRoomListSpaceIDClosure = { [joinedSpacesSubject] spaceID in
|
spaceServiceProxy.spaceRoomListSpaceIDParentClosure = { [joinedSpacesSubject] spaceID, _ in
|
||||||
guard let spaceRoomProxy = joinedSpacesSubject?.value.first(where: { $0.id == spaceID }) else { return .failure(.missingSpace) }
|
guard let spaceRoomProxy = joinedSpacesSubject?.value.first(where: { $0.id == spaceID }) else { return .failure(.missingSpace) }
|
||||||
return .success(SpaceRoomListProxyMock(.init(spaceRoomProxy: spaceRoomProxy)))
|
return .success(SpaceRoomListProxyMock(.init(spaceRoomProxy: spaceRoomProxy)))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -200,7 +200,7 @@ class SpaceScreenViewModelTests: XCTestCase {
|
|||||||
paginationResponses: paginationResponses))
|
paginationResponses: paginationResponses))
|
||||||
|
|
||||||
let spaceServiceProxy = SpaceServiceProxyMock(.init())
|
let spaceServiceProxy = SpaceServiceProxyMock(.init())
|
||||||
spaceServiceProxy.spaceRoomListSpaceIDClosure = { [mockSpaceRooms] spaceID in
|
spaceServiceProxy.spaceRoomListSpaceIDParentClosure = { [mockSpaceRooms] spaceID, _ in
|
||||||
guard let spaceRoomProxy = mockSpaceRooms.first(where: { $0.id == spaceID }) else { return .failure(.missingSpace) }
|
guard let spaceRoomProxy = mockSpaceRooms.first(where: { $0.id == spaceID }) else { return .failure(.missingSpace) }
|
||||||
return .success(SpaceRoomListProxyMock(.init(spaceRoomProxy: spaceRoomProxy)))
|
return .success(SpaceRoomListProxyMock(.init(spaceRoomProxy: spaceRoomProxy)))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user