mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-03 06:55:59 +00:00
Make the SpaceRoomListProxy publish its SpaceRoomProxy updates. (#4607)
Also removes an unused `parent` parameter that was missed when removing the parent name and includes some regenerated snapshots that were missed in the last PR.
This commit is contained in:
@@ -260,7 +260,7 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
|||||||
switch room {
|
switch room {
|
||||||
case .joined(let roomProxy):
|
case .joined(let roomProxy):
|
||||||
if roomProxy.infoPublisher.value.isSpace {
|
if roomProxy.infoPublisher.value.isSpace {
|
||||||
switch await userSession.clientProxy.spaceService.spaceRoomList(spaceID: roomProxy.id, parent: nil) {
|
switch await userSession.clientProxy.spaceService.spaceRoomList(spaceID: roomProxy.id) {
|
||||||
case .success(let spaceRoomListProxy):
|
case .success(let spaceRoomListProxy):
|
||||||
actionsSubject.send(.continueWithSpaceFlow(spaceRoomListProxy))
|
actionsSubject.send(.continueWithSpaceFlow(spaceRoomListProxy))
|
||||||
case .failure:
|
case .failure:
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ class SpaceExplorerFlowCoordinator: FlowCoordinatorProtocol {
|
|||||||
stateMachine.addRouteMapping { event, fromState, userInfo in
|
stateMachine.addRouteMapping { event, fromState, userInfo in
|
||||||
guard event == .selectSpace, case .spaceList = fromState else { return nil }
|
guard event == .selectSpace, case .spaceList = fromState else { return nil }
|
||||||
guard let spaceRoomListProxy = userInfo as? SpaceRoomListProxyProtocol else { fatalError("A space proxy must be provided.") }
|
guard let spaceRoomListProxy = userInfo as? SpaceRoomListProxyProtocol else { fatalError("A space proxy must be provided.") }
|
||||||
return .spaceList(selectedSpaceID: spaceRoomListProxy.spaceRoomProxy.id)
|
return .spaceList(selectedSpaceID: spaceRoomListProxy.id)
|
||||||
} handler: { [weak self] context in
|
} handler: { [weak self] context in
|
||||||
guard let self, let spaceRoomListProxy = context.userInfo as? SpaceRoomListProxyProtocol else { return }
|
guard let self, let spaceRoomListProxy = context.userInfo as? SpaceRoomListProxyProtocol else { return }
|
||||||
startSpaceFlow(spaceRoomListProxy: spaceRoomListProxy)
|
startSpaceFlow(spaceRoomListProxy: spaceRoomListProxy)
|
||||||
@@ -164,6 +164,6 @@ class SpaceExplorerFlowCoordinator: FlowCoordinatorProtocol {
|
|||||||
}
|
}
|
||||||
|
|
||||||
coordinator.start()
|
coordinator.start()
|
||||||
selectedSpaceSubject.send(spaceRoomListProxy.spaceRoomProxy.id)
|
selectedSpaceSubject.send(spaceRoomListProxy.id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ enum SpaceFlowCoordinatorEntryPoint {
|
|||||||
|
|
||||||
var spaceID: String {
|
var spaceID: String {
|
||||||
switch self {
|
switch self {
|
||||||
case .space(let spaceRoomListProxy): spaceRoomListProxy.spaceRoomProxy.id
|
case .space(let spaceRoomListProxy): spaceRoomListProxy.id
|
||||||
case .joinSpace(let spaceRoomProxy): spaceRoomProxy.id
|
case .joinSpace(let spaceRoomProxy): spaceRoomProxy.id
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15943,11 +15943,16 @@ class SessionVerificationControllerProxyMock: SessionVerificationControllerProxy
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
class SpaceRoomListProxyMock: SpaceRoomListProxyProtocol, @unchecked Sendable {
|
class SpaceRoomListProxyMock: SpaceRoomListProxyProtocol, @unchecked Sendable {
|
||||||
var spaceRoomProxy: SpaceRoomProxyProtocol {
|
var id: String {
|
||||||
get { return underlyingSpaceRoomProxy }
|
get { return underlyingId }
|
||||||
set(value) { underlyingSpaceRoomProxy = value }
|
set(value) { underlyingId = value }
|
||||||
}
|
}
|
||||||
var underlyingSpaceRoomProxy: SpaceRoomProxyProtocol!
|
var underlyingId: String!
|
||||||
|
var spaceRoomProxyPublisher: CurrentValuePublisher<SpaceRoomProxyProtocol, Never> {
|
||||||
|
get { return underlyingSpaceRoomProxyPublisher }
|
||||||
|
set(value) { underlyingSpaceRoomProxyPublisher = value }
|
||||||
|
}
|
||||||
|
var underlyingSpaceRoomProxyPublisher: CurrentValuePublisher<SpaceRoomProxyProtocol, Never>!
|
||||||
var spaceRoomsPublisher: CurrentValuePublisher<[SpaceRoomProxyProtocol], Never> {
|
var spaceRoomsPublisher: CurrentValuePublisher<[SpaceRoomProxyProtocol], Never> {
|
||||||
get { return underlyingSpaceRoomsPublisher }
|
get { return underlyingSpaceRoomsPublisher }
|
||||||
set(value) { underlyingSpaceRoomsPublisher = value }
|
set(value) { underlyingSpaceRoomsPublisher = value }
|
||||||
@@ -16047,15 +16052,15 @@ class SpaceServiceProxyMock: SpaceServiceProxyProtocol, @unchecked Sendable {
|
|||||||
|
|
||||||
//MARK: - spaceRoomList
|
//MARK: - spaceRoomList
|
||||||
|
|
||||||
var spaceRoomListSpaceIDParentUnderlyingCallsCount = 0
|
var spaceRoomListSpaceIDUnderlyingCallsCount = 0
|
||||||
var spaceRoomListSpaceIDParentCallsCount: Int {
|
var spaceRoomListSpaceIDCallsCount: Int {
|
||||||
get {
|
get {
|
||||||
if Thread.isMainThread {
|
if Thread.isMainThread {
|
||||||
return spaceRoomListSpaceIDParentUnderlyingCallsCount
|
return spaceRoomListSpaceIDUnderlyingCallsCount
|
||||||
} else {
|
} else {
|
||||||
var returnValue: Int? = nil
|
var returnValue: Int? = nil
|
||||||
DispatchQueue.main.sync {
|
DispatchQueue.main.sync {
|
||||||
returnValue = spaceRoomListSpaceIDParentUnderlyingCallsCount
|
returnValue = spaceRoomListSpaceIDUnderlyingCallsCount
|
||||||
}
|
}
|
||||||
|
|
||||||
return returnValue!
|
return returnValue!
|
||||||
@@ -16063,29 +16068,29 @@ class SpaceServiceProxyMock: SpaceServiceProxyProtocol, @unchecked Sendable {
|
|||||||
}
|
}
|
||||||
set {
|
set {
|
||||||
if Thread.isMainThread {
|
if Thread.isMainThread {
|
||||||
spaceRoomListSpaceIDParentUnderlyingCallsCount = newValue
|
spaceRoomListSpaceIDUnderlyingCallsCount = newValue
|
||||||
} else {
|
} else {
|
||||||
DispatchQueue.main.sync {
|
DispatchQueue.main.sync {
|
||||||
spaceRoomListSpaceIDParentUnderlyingCallsCount = newValue
|
spaceRoomListSpaceIDUnderlyingCallsCount = newValue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var spaceRoomListSpaceIDParentCalled: Bool {
|
var spaceRoomListSpaceIDCalled: Bool {
|
||||||
return spaceRoomListSpaceIDParentCallsCount > 0
|
return spaceRoomListSpaceIDCallsCount > 0
|
||||||
}
|
}
|
||||||
var spaceRoomListSpaceIDParentReceivedArguments: (spaceID: String, parent: SpaceRoomProxyProtocol?)?
|
var spaceRoomListSpaceIDReceivedSpaceID: String?
|
||||||
var spaceRoomListSpaceIDParentReceivedInvocations: [(spaceID: String, parent: SpaceRoomProxyProtocol?)] = []
|
var spaceRoomListSpaceIDReceivedInvocations: [String] = []
|
||||||
|
|
||||||
var spaceRoomListSpaceIDParentUnderlyingReturnValue: Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError>!
|
var spaceRoomListSpaceIDUnderlyingReturnValue: Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError>!
|
||||||
var spaceRoomListSpaceIDParentReturnValue: Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError>! {
|
var spaceRoomListSpaceIDReturnValue: Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError>! {
|
||||||
get {
|
get {
|
||||||
if Thread.isMainThread {
|
if Thread.isMainThread {
|
||||||
return spaceRoomListSpaceIDParentUnderlyingReturnValue
|
return spaceRoomListSpaceIDUnderlyingReturnValue
|
||||||
} else {
|
} else {
|
||||||
var returnValue: Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError>? = nil
|
var returnValue: Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError>? = nil
|
||||||
DispatchQueue.main.sync {
|
DispatchQueue.main.sync {
|
||||||
returnValue = spaceRoomListSpaceIDParentUnderlyingReturnValue
|
returnValue = spaceRoomListSpaceIDUnderlyingReturnValue
|
||||||
}
|
}
|
||||||
|
|
||||||
return returnValue!
|
return returnValue!
|
||||||
@@ -16093,26 +16098,26 @@ class SpaceServiceProxyMock: SpaceServiceProxyProtocol, @unchecked Sendable {
|
|||||||
}
|
}
|
||||||
set {
|
set {
|
||||||
if Thread.isMainThread {
|
if Thread.isMainThread {
|
||||||
spaceRoomListSpaceIDParentUnderlyingReturnValue = newValue
|
spaceRoomListSpaceIDUnderlyingReturnValue = newValue
|
||||||
} else {
|
} else {
|
||||||
DispatchQueue.main.sync {
|
DispatchQueue.main.sync {
|
||||||
spaceRoomListSpaceIDParentUnderlyingReturnValue = newValue
|
spaceRoomListSpaceIDUnderlyingReturnValue = newValue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var spaceRoomListSpaceIDParentClosure: ((String, SpaceRoomProxyProtocol?) async -> Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError>)?
|
var spaceRoomListSpaceIDClosure: ((String) async -> Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError>)?
|
||||||
|
|
||||||
func spaceRoomList(spaceID: String, parent: SpaceRoomProxyProtocol?) async -> Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError> {
|
func spaceRoomList(spaceID: String) async -> Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError> {
|
||||||
spaceRoomListSpaceIDParentCallsCount += 1
|
spaceRoomListSpaceIDCallsCount += 1
|
||||||
spaceRoomListSpaceIDParentReceivedArguments = (spaceID: spaceID, parent: parent)
|
spaceRoomListSpaceIDReceivedSpaceID = spaceID
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
self.spaceRoomListSpaceIDParentReceivedInvocations.append((spaceID: spaceID, parent: parent))
|
self.spaceRoomListSpaceIDReceivedInvocations.append(spaceID)
|
||||||
}
|
}
|
||||||
if let spaceRoomListSpaceIDParentClosure = spaceRoomListSpaceIDParentClosure {
|
if let spaceRoomListSpaceIDClosure = spaceRoomListSpaceIDClosure {
|
||||||
return await spaceRoomListSpaceIDParentClosure(spaceID, parent)
|
return await spaceRoomListSpaceIDClosure(spaceID)
|
||||||
} else {
|
} else {
|
||||||
return spaceRoomListSpaceIDParentReturnValue
|
return spaceRoomListSpaceIDReturnValue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//MARK: - leaveSpace
|
//MARK: - leaveSpace
|
||||||
|
|||||||
@@ -32,7 +32,8 @@ extension SpaceRoomListProxyMock {
|
|||||||
|
|
||||||
let spaceRoomsSubject: CurrentValueSubject<[SpaceRoomProxyProtocol], Never> = .init(configuration.initialSpaceRooms)
|
let spaceRoomsSubject: CurrentValueSubject<[SpaceRoomProxyProtocol], Never> = .init(configuration.initialSpaceRooms)
|
||||||
|
|
||||||
spaceRoomProxy = configuration.spaceRoomProxy
|
id = configuration.spaceRoomProxy.id
|
||||||
|
spaceRoomProxyPublisher = .init(configuration.spaceRoomProxy)
|
||||||
spaceRoomsPublisher = spaceRoomsSubject.asCurrentValuePublisher()
|
spaceRoomsPublisher = spaceRoomsSubject.asCurrentValuePublisher()
|
||||||
paginationStatePublisher = configuration.paginationStateSubject.asCurrentValuePublisher()
|
paginationStatePublisher = configuration.paginationStateSubject.asCurrentValuePublisher()
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ extension SpaceServiceProxyMock {
|
|||||||
self.init()
|
self.init()
|
||||||
|
|
||||||
joinedSpacesPublisher = .init(configuration.joinedSpaces)
|
joinedSpacesPublisher = .init(configuration.joinedSpaces)
|
||||||
spaceRoomListSpaceIDParentClosure = { spaceID, _ in
|
spaceRoomListSpaceIDClosure = { spaceID in
|
||||||
if let spaceRoomList = configuration.spaceRoomLists[spaceID] {
|
if let spaceRoomList = configuration.spaceRoomLists[spaceID] {
|
||||||
.success(spaceRoomList)
|
.success(spaceRoomList)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -92,6 +92,10 @@ extension SDKListener: SpaceRoomListPaginationStateListener where T == SpaceRoom
|
|||||||
func onUpdate(paginationState: SpaceRoomListPaginationState) { onUpdateClosure(paginationState) }
|
func onUpdate(paginationState: SpaceRoomListPaginationState) { onUpdateClosure(paginationState) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extension SDKListener: SpaceRoomListSpaceListener where T == SpaceRoom? {
|
||||||
|
func onUpdate(space: SpaceRoom?) { onUpdateClosure(space) }
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: Room
|
// MARK: Room
|
||||||
|
|
||||||
extension SDKListener: RoomInfoListener where T == RoomInfo {
|
extension SDKListener: RoomInfoListener where T == RoomInfo {
|
||||||
|
|||||||
@@ -437,7 +437,7 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol
|
|||||||
if roomProxy.info.isSpace {
|
if roomProxy.info.isSpace {
|
||||||
let spaceService = userSession.clientProxy.spaceService
|
let spaceService = userSession.clientProxy.spaceService
|
||||||
|
|
||||||
switch await spaceService.spaceRoomList(spaceID: roomProxy.id, parent: nil) {
|
switch await spaceService.spaceRoomList(spaceID: roomProxy.id) {
|
||||||
case .success(let spaceRoomListProxy):
|
case .success(let spaceRoomListProxy):
|
||||||
actionsSubject.send(.presentSpace(spaceRoomListProxy))
|
actionsSubject.send(.presentSpace(spaceRoomListProxy))
|
||||||
case .failure(let error):
|
case .failure(let error):
|
||||||
|
|||||||
@@ -336,7 +336,7 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
switch await clientProxy.spaceService.spaceRoomList(spaceID: roomID, parent: nil) {
|
switch await clientProxy.spaceService.spaceRoomList(spaceID: roomID) {
|
||||||
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):
|
||||||
|
|||||||
@@ -78,7 +78,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, parent: nil) {
|
switch await spaceServiceProxy.spaceRoomList(spaceID: spaceRoomProxy.id) {
|
||||||
case .success(let spaceRoomListProxy):
|
case .success(let spaceRoomListProxy):
|
||||||
actionsSubject.send(.selectSpace(spaceRoomListProxy))
|
actionsSubject.send(.selectSpace(spaceRoomListProxy))
|
||||||
case .failure(let error):
|
case .failure(let error):
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ enum SpaceScreenViewModelAction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct SpaceScreenViewState: BindableState {
|
struct SpaceScreenViewState: BindableState {
|
||||||
let space: SpaceRoomProxyProtocol
|
var space: SpaceRoomProxyProtocol
|
||||||
|
|
||||||
var permalink: URL?
|
var permalink: URL?
|
||||||
|
|
||||||
|
|||||||
@@ -31,11 +31,16 @@ class SpaceScreenViewModel: SpaceScreenViewModelType, SpaceScreenViewModelProtoc
|
|||||||
clientProxy = userSession.clientProxy
|
clientProxy = userSession.clientProxy
|
||||||
self.userIndicatorController = userIndicatorController
|
self.userIndicatorController = userIndicatorController
|
||||||
|
|
||||||
super.init(initialViewState: SpaceScreenViewState(space: spaceRoomListProxy.spaceRoomProxy,
|
super.init(initialViewState: SpaceScreenViewState(space: spaceRoomListProxy.spaceRoomProxyPublisher.value,
|
||||||
rooms: spaceRoomListProxy.spaceRoomsPublisher.value,
|
rooms: spaceRoomListProxy.spaceRoomsPublisher.value,
|
||||||
selectedSpaceRoomID: selectedSpaceRoomPublisher.value),
|
selectedSpaceRoomID: selectedSpaceRoomPublisher.value),
|
||||||
mediaProvider: userSession.mediaProvider)
|
mediaProvider: userSession.mediaProvider)
|
||||||
|
|
||||||
|
spaceRoomListProxy.spaceRoomProxyPublisher
|
||||||
|
.receive(on: DispatchQueue.main)
|
||||||
|
.weakAssign(to: \.state.space, on: self)
|
||||||
|
.store(in: &cancellables)
|
||||||
|
|
||||||
spaceRoomListProxy.spaceRoomsPublisher
|
spaceRoomListProxy.spaceRoomsPublisher
|
||||||
.receive(on: DispatchQueue.main)
|
.receive(on: DispatchQueue.main)
|
||||||
.weakAssign(to: \.state.rooms, on: self)
|
.weakAssign(to: \.state.rooms, on: self)
|
||||||
@@ -62,7 +67,7 @@ class SpaceScreenViewModel: SpaceScreenViewModelType, SpaceScreenViewModelProtoc
|
|||||||
.store(in: &cancellables)
|
.store(in: &cancellables)
|
||||||
|
|
||||||
Task {
|
Task {
|
||||||
if case let .joined(roomProxy) = await userSession.clientProxy.roomForIdentifier(spaceRoomListProxy.spaceRoomProxy.id),
|
if case let .joined(roomProxy) = await userSession.clientProxy.roomForIdentifier(spaceRoomListProxy.id),
|
||||||
case let .success(permalinkURL) = await roomProxy.matrixToPermalink() {
|
case let .success(permalinkURL) = await roomProxy.matrixToPermalink() {
|
||||||
state.permalink = permalinkURL
|
state.permalink = permalinkURL
|
||||||
}
|
}
|
||||||
@@ -134,7 +139,7 @@ class SpaceScreenViewModel: SpaceScreenViewModelType, SpaceScreenViewModelProtoc
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func selectSpace(_ spaceRoomProxy: SpaceRoomProxyProtocol) async {
|
private func selectSpace(_ spaceRoomProxy: SpaceRoomProxyProtocol) async {
|
||||||
switch await spaceServiceProxy.spaceRoomList(spaceID: spaceRoomProxy.id, parent: spaceRoomListProxy.spaceRoomProxy) {
|
switch await spaceServiceProxy.spaceRoomList(spaceID: spaceRoomProxy.id) {
|
||||||
case .success(let spaceRoomListProxy):
|
case .success(let spaceRoomListProxy):
|
||||||
actionsSubject.send(.selectSpace(spaceRoomListProxy))
|
actionsSubject.send(.selectSpace(spaceRoomListProxy))
|
||||||
case .failure(let error):
|
case .failure(let error):
|
||||||
@@ -144,7 +149,7 @@ class SpaceScreenViewModel: SpaceScreenViewModelType, SpaceScreenViewModelProtoc
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func showLeaveSpaceConfirmation() async {
|
private func showLeaveSpaceConfirmation() async {
|
||||||
guard case let .success(leaveHandle) = await spaceServiceProxy.leaveSpace(spaceID: spaceRoomListProxy.spaceRoomProxy.id) else {
|
guard case let .success(leaveHandle) = await spaceServiceProxy.leaveSpace(spaceID: spaceRoomListProxy.id) else {
|
||||||
showFailureIndicator()
|
showFailureIndicator()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,8 +9,15 @@ import Combine
|
|||||||
import MatrixRustSDK
|
import MatrixRustSDK
|
||||||
|
|
||||||
class SpaceRoomListProxy: SpaceRoomListProxyProtocol {
|
class SpaceRoomListProxy: SpaceRoomListProxyProtocol {
|
||||||
|
var id: String { spaceRoomProxyPublisher.value.id }
|
||||||
|
|
||||||
private let spaceRoomList: SpaceRoomListProtocol
|
private let spaceRoomList: SpaceRoomListProtocol
|
||||||
let spaceRoomProxy: SpaceRoomProxyProtocol
|
|
||||||
|
private var spaceRoomProxyHandle: TaskHandle?
|
||||||
|
private let spaceRoomProxySubject: CurrentValueSubject<SpaceRoomProxyProtocol, Never>
|
||||||
|
var spaceRoomProxyPublisher: CurrentValuePublisher<SpaceRoomProxyProtocol, Never> {
|
||||||
|
spaceRoomProxySubject.asCurrentValuePublisher()
|
||||||
|
}
|
||||||
|
|
||||||
private var spaceRoomsHandle: TaskHandle?
|
private var spaceRoomsHandle: TaskHandle?
|
||||||
private let spaceRoomsSubject = CurrentValueSubject<[SpaceRoomProxyProtocol], Never>([])
|
private let spaceRoomsSubject = CurrentValueSubject<[SpaceRoomProxyProtocol], Never>([])
|
||||||
@@ -25,7 +32,7 @@ class SpaceRoomListProxy: SpaceRoomListProxyProtocol {
|
|||||||
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)
|
spaceRoomProxySubject = .init(SpaceRoomProxy(spaceRoom: spaceRoom))
|
||||||
|
|
||||||
let paginationStateSubject = CurrentValueSubject<SpaceRoomListPaginationState, Never>(spaceRoomList.paginationState())
|
let paginationStateSubject = CurrentValueSubject<SpaceRoomListPaginationState, Never>(spaceRoomList.paginationState())
|
||||||
paginationStatePublisher = paginationStateSubject.asCurrentValuePublisher()
|
paginationStatePublisher = paginationStateSubject.asCurrentValuePublisher()
|
||||||
@@ -37,6 +44,11 @@ class SpaceRoomListProxy: SpaceRoomListProxyProtocol {
|
|||||||
spaceRoomsHandle = spaceRoomList.subscribeToRoomUpdate(listener: SDKListener { [weak self] updates in
|
spaceRoomsHandle = spaceRoomList.subscribeToRoomUpdate(listener: SDKListener { [weak self] updates in
|
||||||
self?.handleUpdates(updates)
|
self?.handleUpdates(updates)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
spaceRoomProxyHandle = spaceRoomList.subscribeToSpaceUpdates(listener: SDKListener { [weak self] spaceRoom in
|
||||||
|
guard let spaceRoom else { return }
|
||||||
|
self?.spaceRoomProxySubject.send(SpaceRoomProxy(spaceRoom: spaceRoom))
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func paginate() async {
|
func paginate() async {
|
||||||
|
|||||||
@@ -14,8 +14,9 @@ enum SpaceRoomListProxyError: Error {
|
|||||||
|
|
||||||
// sourcery: AutoMockable
|
// sourcery: AutoMockable
|
||||||
protocol SpaceRoomListProxyProtocol {
|
protocol SpaceRoomListProxyProtocol {
|
||||||
var spaceRoomProxy: SpaceRoomProxyProtocol { get }
|
var id: String { get }
|
||||||
|
|
||||||
|
var spaceRoomProxyPublisher: CurrentValuePublisher<SpaceRoomProxyProtocol, Never> { get }
|
||||||
var spaceRoomsPublisher: CurrentValuePublisher<[SpaceRoomProxyProtocol], Never> { get }
|
var spaceRoomsPublisher: CurrentValuePublisher<[SpaceRoomProxyProtocol], Never> { get }
|
||||||
var paginationStatePublisher: CurrentValuePublisher<SpaceRoomListPaginationState, Never> { get }
|
var paginationStatePublisher: CurrentValuePublisher<SpaceRoomListPaginationState, Never> { get }
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ class SpaceServiceProxy: SpaceServiceProxyProtocol {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func spaceRoomList(spaceID: String, parent: SpaceRoomProxyProtocol?) async -> Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError> {
|
func spaceRoomList(spaceID: String) async -> Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError> {
|
||||||
do {
|
do {
|
||||||
return try await .success(SpaceRoomListProxy(spaceService.spaceRoomList(spaceId: spaceID)))
|
return try await .success(SpaceRoomListProxy(spaceService.spaceRoomList(spaceId: spaceID)))
|
||||||
} catch {
|
} catch {
|
||||||
|
|||||||
@@ -16,6 +16,6 @@ enum SpaceServiceProxyError: Error {
|
|||||||
protocol SpaceServiceProxyProtocol {
|
protocol SpaceServiceProxyProtocol {
|
||||||
var joinedSpacesPublisher: CurrentValuePublisher<[SpaceRoomProxyProtocol], Never> { get }
|
var joinedSpacesPublisher: CurrentValuePublisher<[SpaceRoomProxyProtocol], Never> { get }
|
||||||
|
|
||||||
func spaceRoomList(spaceID: String, parent: SpaceRoomProxyProtocol?) async -> Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError>
|
func spaceRoomList(spaceID: String) async -> Result<SpaceRoomListProxyProtocol, SpaceServiceProxyError>
|
||||||
func leaveSpace(spaceID: String) async -> Result<LeaveSpaceHandleProxy, SpaceServiceProxyError>
|
func leaveSpace(spaceID: String) async -> Result<LeaveSpaceHandleProxy, SpaceServiceProxyError>
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:88a74173a12b71340404e5e7ddf643e5b423225dd7e7341ff7999395e85ab29b
|
oid sha256:5851e5b7b8556d5a72e4d5d7557957547a1a7f2d9ec80f324522e67599365362
|
||||||
size 96983
|
size 111868
|
||||||
|
|||||||
+2
-2
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:04b87616c651ec510de4518fd8257b63e50668e3e0b3a95e3ca32e64d5aa25b0
|
oid sha256:a2a32f990080fa0445e3cc0e83b8ea109dd3101f4a12fe804b3d5a325df516ad
|
||||||
size 106567
|
size 126584
|
||||||
|
|||||||
+2
-2
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:265b0cd6386b88ca25348afa117b8e3ba62b6d60c27858481706f62d952f06cf
|
oid sha256:3b4c93ea3a20e890eee10c47d100a77cdf0f6ead386055e0e11a59c2287742b1
|
||||||
size 54134
|
size 66152
|
||||||
|
|||||||
+2
-2
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:32e0d83b9289cc3d0f0ae904fd3bcd5c0e7694f5417aa3ceb8ef0722aa7c3dbe
|
oid sha256:8187cd536e01a3a940c683fd1d9e8636ff0cb8f973f8f5a2ce0e0e1d83dd32e6
|
||||||
size 59145
|
size 75159
|
||||||
|
|||||||
@@ -406,7 +406,7 @@ class HomeScreenViewModelTests: XCTestCase {
|
|||||||
clientProxy.roomForIdentifierClosure = { spaceID in .invited(InvitedRoomProxyMock(.init(id: spaceID, isSpace: true))) }
|
clientProxy.roomForIdentifierClosure = { spaceID in .invited(InvitedRoomProxyMock(.init(id: spaceID, isSpace: true))) }
|
||||||
|
|
||||||
let spaceServiceProxy = SpaceServiceProxyMock(.init())
|
let spaceServiceProxy = SpaceServiceProxyMock(.init())
|
||||||
spaceServiceProxy.spaceRoomListSpaceIDParentClosure = { spaceID, _ in
|
spaceServiceProxy.spaceRoomListSpaceIDClosure = { spaceID in
|
||||||
.success(SpaceRoomListProxyMock(.init(spaceRoomProxy: SpaceRoomProxyMock(.init(id: spaceID, isSpace: true)))))
|
.success(SpaceRoomListProxyMock(.init(spaceRoomProxy: SpaceRoomProxyMock(.init(id: spaceID, isSpace: true)))))
|
||||||
}
|
}
|
||||||
clientProxy.underlyingSpaceService = spaceServiceProxy
|
clientProxy.underlyingSpaceService = spaceServiceProxy
|
||||||
@@ -454,7 +454,7 @@ extension HomeScreenViewModelAction: @retroactive Equatable {
|
|||||||
case (.presentDeclineAndBlock(let lhsUserID, let lhsRoomID), .presentDeclineAndBlock(let rhsUserID, let rhsRoomID)):
|
case (.presentDeclineAndBlock(let lhsUserID, let lhsRoomID), .presentDeclineAndBlock(let rhsUserID, let rhsRoomID)):
|
||||||
lhsUserID == rhsUserID && lhsRoomID == rhsRoomID
|
lhsUserID == rhsUserID && lhsRoomID == rhsRoomID
|
||||||
case (.presentSpace(let lhsSpaceRoomListProxy), .presentSpace(let rhsSpaceRoomListProxy)):
|
case (.presentSpace(let lhsSpaceRoomListProxy), .presentSpace(let rhsSpaceRoomListProxy)):
|
||||||
lhsSpaceRoomListProxy.spaceRoomProxy.id == rhsSpaceRoomListProxy.spaceRoomProxy.id
|
lhsSpaceRoomListProxy.id == rhsSpaceRoomListProxy.id
|
||||||
case (.roomLeft(let lhsID), .roomLeft(let rhsID)):
|
case (.roomLeft(let lhsID), .roomLeft(let rhsID)):
|
||||||
lhsID == rhsID
|
lhsID == rhsID
|
||||||
case (.transferOwnership(let lhsID), .transferOwnership(let rhsID)):
|
case (.transferOwnership(let lhsID), .transferOwnership(let rhsID)):
|
||||||
|
|||||||
@@ -208,7 +208,7 @@ extension JoinRoomScreenViewModelAction: @retroactive Equatable {
|
|||||||
case (.joined(.roomID(let lhsRoomID)), .joined(.roomID(let rhsRoomID))):
|
case (.joined(.roomID(let lhsRoomID)), .joined(.roomID(let rhsRoomID))):
|
||||||
lhsRoomID == rhsRoomID
|
lhsRoomID == rhsRoomID
|
||||||
case (.joined(.space(let lhsSpace)), .joined(.space(let rhsSpace))):
|
case (.joined(.space(let lhsSpace)), .joined(.space(let rhsSpace))):
|
||||||
lhsSpace.spaceRoomProxy.id == rhsSpace.spaceRoomProxy.id
|
lhsSpace.id == rhsSpace.id
|
||||||
case (.dismiss, .dismiss):
|
case (.dismiss, .dismiss):
|
||||||
true
|
true
|
||||||
case (.presentDeclineAndBlock(let lhsUserID), .presentDeclineAndBlock(let rhsUserID)):
|
case (.presentDeclineAndBlock(let lhsUserID), .presentDeclineAndBlock(let rhsUserID)):
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ class SpaceListScreenViewModelTests: XCTestCase {
|
|||||||
let action = try await deferred.fulfill()
|
let action = try await deferred.fulfill()
|
||||||
|
|
||||||
switch action {
|
switch action {
|
||||||
case .selectSpace(let spaceRoomListProxy) where spaceRoomListProxy.spaceRoomProxy.id == selectedSpace.id:
|
case .selectSpace(let spaceRoomListProxy) where spaceRoomListProxy.id == selectedSpace.id:
|
||||||
break
|
break
|
||||||
default:
|
default:
|
||||||
XCTFail("The action should select the space.")
|
XCTFail("The action should select the space.")
|
||||||
@@ -102,7 +102,7 @@ class SpaceListScreenViewModelTests: XCTestCase {
|
|||||||
])
|
])
|
||||||
spaceServiceProxy = SpaceServiceProxyMock(.init())
|
spaceServiceProxy = SpaceServiceProxyMock(.init())
|
||||||
spaceServiceProxy.joinedSpacesPublisher = joinedSpacesSubject.asCurrentValuePublisher()
|
spaceServiceProxy.joinedSpacesPublisher = joinedSpacesSubject.asCurrentValuePublisher()
|
||||||
spaceServiceProxy.spaceRoomListSpaceIDParentClosure = { [joinedSpacesSubject] spaceID, _ in
|
spaceServiceProxy.spaceRoomListSpaceIDClosure = { [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)))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ class SpaceScreenViewModelTests: XCTestCase {
|
|||||||
let action = try await deferred.fulfill()
|
let action = try await deferred.fulfill()
|
||||||
|
|
||||||
switch action {
|
switch action {
|
||||||
case .selectSpace(let spaceRoomListProxy) where spaceRoomListProxy.spaceRoomProxy.id == selectedSpace.id:
|
case .selectSpace(let spaceRoomListProxy) where spaceRoomListProxy.id == selectedSpace.id:
|
||||||
break
|
break
|
||||||
default:
|
default:
|
||||||
XCTFail("The action should select the space.")
|
XCTFail("The action should select the space.")
|
||||||
@@ -202,7 +202,7 @@ class SpaceScreenViewModelTests: XCTestCase {
|
|||||||
XCTAssertNil(context.leaveHandle)
|
XCTAssertNil(context.leaveHandle)
|
||||||
XCTAssertTrue(rustLeaveHandle.leaveRoomIdsCalled)
|
XCTAssertTrue(rustLeaveHandle.leaveRoomIdsCalled)
|
||||||
XCTAssertEqual(rustLeaveHandle.leaveRoomIdsReceivedRoomIds,
|
XCTAssertEqual(rustLeaveHandle.leaveRoomIdsReceivedRoomIds,
|
||||||
[firstSelectedRoom.spaceRoomProxy.id, spaceRoomListProxy.spaceRoomProxy.id],
|
[firstSelectedRoom.spaceRoomProxy.id, spaceRoomListProxy.id],
|
||||||
"Confirming the leave should first leave the selected room and then the space.")
|
"Confirming the leave should first leave the selected room and then the space.")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -214,7 +214,7 @@ class SpaceScreenViewModelTests: XCTestCase {
|
|||||||
paginationResponses: paginationResponses))
|
paginationResponses: paginationResponses))
|
||||||
|
|
||||||
let spaceServiceProxy = SpaceServiceProxyMock(.init())
|
let spaceServiceProxy = SpaceServiceProxyMock(.init())
|
||||||
spaceServiceProxy.spaceRoomListSpaceIDParentClosure = { [mockSpaceRooms] spaceID, _ in
|
spaceServiceProxy.spaceRoomListSpaceIDClosure = { [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