diff --git a/ElementX.xcodeproj/project.pbxproj b/ElementX.xcodeproj/project.pbxproj index 522bb3a71..c1b64e365 100644 --- a/ElementX.xcodeproj/project.pbxproj +++ b/ElementX.xcodeproj/project.pbxproj @@ -7308,7 +7308,7 @@ repositoryURL = "https://github.com/element-hq/matrix-rust-components-swift"; requirement = { kind = exactVersion; - version = 1.0.0; + version = 1.0.1; }; }; 701C7BEF8F70F7A83E852DCC /* XCRemoteSwiftPackageReference "GZIP" */ = { diff --git a/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 052b58e1a..29f8d42d3 100644 --- a/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -139,8 +139,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/element-hq/matrix-rust-components-swift", "state" : { - "revision" : "7437bbf102fb5dafb4e61aad6b9aa43dc34db0cc", - "version" : "1.0.0" + "revision" : "dfd7a1e7ad140e3c3e186301a20a53a6628f1bb8", + "version" : "1.0.1" } }, { diff --git a/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift b/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift index c9a2bec1d..d7f4a7646 100644 --- a/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift +++ b/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift @@ -2632,15 +2632,15 @@ class ClientProxyMock: ClientProxyProtocol { } //MARK: - roomPreviewForIdentifier - var roomPreviewForIdentifierUnderlyingCallsCount = 0 - var roomPreviewForIdentifierCallsCount: Int { + var roomPreviewForIdentifierViaUnderlyingCallsCount = 0 + var roomPreviewForIdentifierViaCallsCount: Int { get { if Thread.isMainThread { - return roomPreviewForIdentifierUnderlyingCallsCount + return roomPreviewForIdentifierViaUnderlyingCallsCount } else { var returnValue: Int? = nil DispatchQueue.main.sync { - returnValue = roomPreviewForIdentifierUnderlyingCallsCount + returnValue = roomPreviewForIdentifierViaUnderlyingCallsCount } return returnValue! @@ -2648,29 +2648,29 @@ class ClientProxyMock: ClientProxyProtocol { } set { if Thread.isMainThread { - roomPreviewForIdentifierUnderlyingCallsCount = newValue + roomPreviewForIdentifierViaUnderlyingCallsCount = newValue } else { DispatchQueue.main.sync { - roomPreviewForIdentifierUnderlyingCallsCount = newValue + roomPreviewForIdentifierViaUnderlyingCallsCount = newValue } } } } - var roomPreviewForIdentifierCalled: Bool { - return roomPreviewForIdentifierCallsCount > 0 + var roomPreviewForIdentifierViaCalled: Bool { + return roomPreviewForIdentifierViaCallsCount > 0 } - var roomPreviewForIdentifierReceivedIdentifier: String? - var roomPreviewForIdentifierReceivedInvocations: [String] = [] + var roomPreviewForIdentifierViaReceivedArguments: (identifier: String, via: [String])? + var roomPreviewForIdentifierViaReceivedInvocations: [(identifier: String, via: [String])] = [] - var roomPreviewForIdentifierUnderlyingReturnValue: Result! - var roomPreviewForIdentifierReturnValue: Result! { + var roomPreviewForIdentifierViaUnderlyingReturnValue: Result! + var roomPreviewForIdentifierViaReturnValue: Result! { get { if Thread.isMainThread { - return roomPreviewForIdentifierUnderlyingReturnValue + return roomPreviewForIdentifierViaUnderlyingReturnValue } else { var returnValue: Result? = nil DispatchQueue.main.sync { - returnValue = roomPreviewForIdentifierUnderlyingReturnValue + returnValue = roomPreviewForIdentifierViaUnderlyingReturnValue } return returnValue! @@ -2678,24 +2678,24 @@ class ClientProxyMock: ClientProxyProtocol { } set { if Thread.isMainThread { - roomPreviewForIdentifierUnderlyingReturnValue = newValue + roomPreviewForIdentifierViaUnderlyingReturnValue = newValue } else { DispatchQueue.main.sync { - roomPreviewForIdentifierUnderlyingReturnValue = newValue + roomPreviewForIdentifierViaUnderlyingReturnValue = newValue } } } } - var roomPreviewForIdentifierClosure: ((String) async -> Result)? + var roomPreviewForIdentifierViaClosure: ((String, [String]) async -> Result)? - func roomPreviewForIdentifier(_ identifier: String) async -> Result { - roomPreviewForIdentifierCallsCount += 1 - roomPreviewForIdentifierReceivedIdentifier = identifier - roomPreviewForIdentifierReceivedInvocations.append(identifier) - if let roomPreviewForIdentifierClosure = roomPreviewForIdentifierClosure { - return await roomPreviewForIdentifierClosure(identifier) + func roomPreviewForIdentifier(_ identifier: String, via: [String]) async -> Result { + roomPreviewForIdentifierViaCallsCount += 1 + roomPreviewForIdentifierViaReceivedArguments = (identifier: identifier, via: via) + roomPreviewForIdentifierViaReceivedInvocations.append((identifier: identifier, via: via)) + if let roomPreviewForIdentifierViaClosure = roomPreviewForIdentifierViaClosure { + return await roomPreviewForIdentifierViaClosure(identifier, via) } else { - return roomPreviewForIdentifierReturnValue + return roomPreviewForIdentifierViaReturnValue } } //MARK: - loadUserDisplayName diff --git a/ElementX/Sources/Mocks/Generated/SDKGeneratedMocks.swift b/ElementX/Sources/Mocks/Generated/SDKGeneratedMocks.swift index 62e54f4b3..47ae091ea 100644 --- a/ElementX/Sources/Mocks/Generated/SDKGeneratedMocks.swift +++ b/ElementX/Sources/Mocks/Generated/SDKGeneratedMocks.swift @@ -1093,18 +1093,18 @@ class SDKClientMock: SDKClientProtocol { return getRecentlyVisitedRoomsReturnValue } } - //MARK: - getRoomPreview + //MARK: - getRoomPreviewFromRoomAlias - public var getRoomPreviewRoomIdOrAliasThrowableError: Error? - var getRoomPreviewRoomIdOrAliasUnderlyingCallsCount = 0 - public var getRoomPreviewRoomIdOrAliasCallsCount: Int { + public var getRoomPreviewFromRoomAliasRoomAliasThrowableError: Error? + var getRoomPreviewFromRoomAliasRoomAliasUnderlyingCallsCount = 0 + public var getRoomPreviewFromRoomAliasRoomAliasCallsCount: Int { get { if Thread.isMainThread { - return getRoomPreviewRoomIdOrAliasUnderlyingCallsCount + return getRoomPreviewFromRoomAliasRoomAliasUnderlyingCallsCount } else { var returnValue: Int? = nil DispatchQueue.main.sync { - returnValue = getRoomPreviewRoomIdOrAliasUnderlyingCallsCount + returnValue = getRoomPreviewFromRoomAliasRoomAliasUnderlyingCallsCount } return returnValue! @@ -1112,29 +1112,29 @@ class SDKClientMock: SDKClientProtocol { } set { if Thread.isMainThread { - getRoomPreviewRoomIdOrAliasUnderlyingCallsCount = newValue + getRoomPreviewFromRoomAliasRoomAliasUnderlyingCallsCount = newValue } else { DispatchQueue.main.sync { - getRoomPreviewRoomIdOrAliasUnderlyingCallsCount = newValue + getRoomPreviewFromRoomAliasRoomAliasUnderlyingCallsCount = newValue } } } } - public var getRoomPreviewRoomIdOrAliasCalled: Bool { - return getRoomPreviewRoomIdOrAliasCallsCount > 0 + public var getRoomPreviewFromRoomAliasRoomAliasCalled: Bool { + return getRoomPreviewFromRoomAliasRoomAliasCallsCount > 0 } - public var getRoomPreviewRoomIdOrAliasReceivedRoomIdOrAlias: String? - public var getRoomPreviewRoomIdOrAliasReceivedInvocations: [String] = [] + public var getRoomPreviewFromRoomAliasRoomAliasReceivedRoomAlias: String? + public var getRoomPreviewFromRoomAliasRoomAliasReceivedInvocations: [String] = [] - var getRoomPreviewRoomIdOrAliasUnderlyingReturnValue: RoomPreview! - public var getRoomPreviewRoomIdOrAliasReturnValue: RoomPreview! { + var getRoomPreviewFromRoomAliasRoomAliasUnderlyingReturnValue: RoomPreview! + public var getRoomPreviewFromRoomAliasRoomAliasReturnValue: RoomPreview! { get { if Thread.isMainThread { - return getRoomPreviewRoomIdOrAliasUnderlyingReturnValue + return getRoomPreviewFromRoomAliasRoomAliasUnderlyingReturnValue } else { var returnValue: RoomPreview? = nil DispatchQueue.main.sync { - returnValue = getRoomPreviewRoomIdOrAliasUnderlyingReturnValue + returnValue = getRoomPreviewFromRoomAliasRoomAliasUnderlyingReturnValue } return returnValue! @@ -1142,27 +1142,99 @@ class SDKClientMock: SDKClientProtocol { } set { if Thread.isMainThread { - getRoomPreviewRoomIdOrAliasUnderlyingReturnValue = newValue + getRoomPreviewFromRoomAliasRoomAliasUnderlyingReturnValue = newValue } else { DispatchQueue.main.sync { - getRoomPreviewRoomIdOrAliasUnderlyingReturnValue = newValue + getRoomPreviewFromRoomAliasRoomAliasUnderlyingReturnValue = newValue } } } } - public var getRoomPreviewRoomIdOrAliasClosure: ((String) async throws -> RoomPreview)? + public var getRoomPreviewFromRoomAliasRoomAliasClosure: ((String) async throws -> RoomPreview)? - public func getRoomPreview(roomIdOrAlias: String) async throws -> RoomPreview { - if let error = getRoomPreviewRoomIdOrAliasThrowableError { + public func getRoomPreviewFromRoomAlias(roomAlias: String) async throws -> RoomPreview { + if let error = getRoomPreviewFromRoomAliasRoomAliasThrowableError { throw error } - getRoomPreviewRoomIdOrAliasCallsCount += 1 - getRoomPreviewRoomIdOrAliasReceivedRoomIdOrAlias = roomIdOrAlias - getRoomPreviewRoomIdOrAliasReceivedInvocations.append(roomIdOrAlias) - if let getRoomPreviewRoomIdOrAliasClosure = getRoomPreviewRoomIdOrAliasClosure { - return try await getRoomPreviewRoomIdOrAliasClosure(roomIdOrAlias) + getRoomPreviewFromRoomAliasRoomAliasCallsCount += 1 + getRoomPreviewFromRoomAliasRoomAliasReceivedRoomAlias = roomAlias + getRoomPreviewFromRoomAliasRoomAliasReceivedInvocations.append(roomAlias) + if let getRoomPreviewFromRoomAliasRoomAliasClosure = getRoomPreviewFromRoomAliasRoomAliasClosure { + return try await getRoomPreviewFromRoomAliasRoomAliasClosure(roomAlias) } else { - return getRoomPreviewRoomIdOrAliasReturnValue + return getRoomPreviewFromRoomAliasRoomAliasReturnValue + } + } + //MARK: - getRoomPreviewFromRoomId + + public var getRoomPreviewFromRoomIdRoomIdViaServersThrowableError: Error? + var getRoomPreviewFromRoomIdRoomIdViaServersUnderlyingCallsCount = 0 + public var getRoomPreviewFromRoomIdRoomIdViaServersCallsCount: Int { + get { + if Thread.isMainThread { + return getRoomPreviewFromRoomIdRoomIdViaServersUnderlyingCallsCount + } else { + var returnValue: Int? = nil + DispatchQueue.main.sync { + returnValue = getRoomPreviewFromRoomIdRoomIdViaServersUnderlyingCallsCount + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + getRoomPreviewFromRoomIdRoomIdViaServersUnderlyingCallsCount = newValue + } else { + DispatchQueue.main.sync { + getRoomPreviewFromRoomIdRoomIdViaServersUnderlyingCallsCount = newValue + } + } + } + } + public var getRoomPreviewFromRoomIdRoomIdViaServersCalled: Bool { + return getRoomPreviewFromRoomIdRoomIdViaServersCallsCount > 0 + } + public var getRoomPreviewFromRoomIdRoomIdViaServersReceivedArguments: (roomId: String, viaServers: [String])? + public var getRoomPreviewFromRoomIdRoomIdViaServersReceivedInvocations: [(roomId: String, viaServers: [String])] = [] + + var getRoomPreviewFromRoomIdRoomIdViaServersUnderlyingReturnValue: RoomPreview! + public var getRoomPreviewFromRoomIdRoomIdViaServersReturnValue: RoomPreview! { + get { + if Thread.isMainThread { + return getRoomPreviewFromRoomIdRoomIdViaServersUnderlyingReturnValue + } else { + var returnValue: RoomPreview? = nil + DispatchQueue.main.sync { + returnValue = getRoomPreviewFromRoomIdRoomIdViaServersUnderlyingReturnValue + } + + return returnValue! + } + } + set { + if Thread.isMainThread { + getRoomPreviewFromRoomIdRoomIdViaServersUnderlyingReturnValue = newValue + } else { + DispatchQueue.main.sync { + getRoomPreviewFromRoomIdRoomIdViaServersUnderlyingReturnValue = newValue + } + } + } + } + public var getRoomPreviewFromRoomIdRoomIdViaServersClosure: ((String, [String]) async throws -> RoomPreview)? + + public func getRoomPreviewFromRoomId(roomId: String, viaServers: [String]) async throws -> RoomPreview { + if let error = getRoomPreviewFromRoomIdRoomIdViaServersThrowableError { + throw error + } + getRoomPreviewFromRoomIdRoomIdViaServersCallsCount += 1 + getRoomPreviewFromRoomIdRoomIdViaServersReceivedArguments = (roomId: roomId, viaServers: viaServers) + getRoomPreviewFromRoomIdRoomIdViaServersReceivedInvocations.append((roomId: roomId, viaServers: viaServers)) + if let getRoomPreviewFromRoomIdRoomIdViaServersClosure = getRoomPreviewFromRoomIdRoomIdViaServersClosure { + return try await getRoomPreviewFromRoomIdRoomIdViaServersClosure(roomId, viaServers) + } else { + return getRoomPreviewFromRoomIdRoomIdViaServersReturnValue } } //MARK: - getSessionVerificationController diff --git a/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenViewModel.swift b/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenViewModel.swift index 0f45c066f..6e704f486 100644 --- a/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenViewModel.swift +++ b/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenViewModel.swift @@ -77,8 +77,7 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo hideLoadingIndicator() } - // We need an SDK update to pass the via into this preview. - switch await clientProxy.roomPreviewForIdentifier(roomID) { + switch await clientProxy.roomPreviewForIdentifier(roomID, via: via) { case .success(let roomDetails): state.roomDetails = roomDetails case .failure: diff --git a/ElementX/Sources/Screens/JoinRoomScreen/View/JoinRoomScreen.swift b/ElementX/Sources/Screens/JoinRoomScreen/View/JoinRoomScreen.swift index 52cb70cec..554d772a2 100644 --- a/ElementX/Sources/Screens/JoinRoomScreen/View/JoinRoomScreen.swift +++ b/ElementX/Sources/Screens/JoinRoomScreen/View/JoinRoomScreen.swift @@ -148,20 +148,20 @@ struct JoinRoomScreen_Previews: PreviewProvider, TestablePreview { } if mode == .unknown { - clientProxy.roomPreviewForIdentifierReturnValue = .failure(.sdkError(ClientProxyMockError.generic)) + clientProxy.roomPreviewForIdentifierViaReturnValue = .failure(.sdkError(ClientProxyMockError.generic)) } else { - clientProxy.roomPreviewForIdentifierReturnValue = .success(.init(roomID: "1", - name: "The Three-Body Problem - 三体", - canonicalAlias: "#3🌞problem:matrix.org", - // swiftlint:disable:next line_length - topic: "“Science and technology were the only keys to opening the door to the future, and people approached science with the faith and sincerity of elementary school students.”", - avatarURL: URL.homeDirectory, - memberCount: UInt(100), - isHistoryWorldReadable: false, - isJoined: membership.isJoined, - isInvited: membership.isInvited, - isPublic: membership.isPublic, - canKnock: membership.canKnock)) + clientProxy.roomPreviewForIdentifierViaReturnValue = .success(.init(roomID: "1", + name: "The Three-Body Problem - 三体", + canonicalAlias: "#3🌞problem:matrix.org", + // swiftlint:disable:next line_length + topic: "“Science and technology were the only keys to opening the door to the future, and people approached science with the faith and sincerity of elementary school students.”", + avatarURL: URL.homeDirectory, + memberCount: UInt(100), + isHistoryWorldReadable: false, + isJoined: membership.isJoined, + isInvited: membership.isInvited, + isPublic: membership.isPublic, + canKnock: membership.canKnock)) } return JoinRoomScreenViewModel(roomID: "1", diff --git a/ElementX/Sources/Services/Client/ClientProxy.swift b/ElementX/Sources/Services/Client/ClientProxy.swift index ee8263630..d11e93fa8 100644 --- a/ElementX/Sources/Services/Client/ClientProxy.swift +++ b/ElementX/Sources/Services/Client/ClientProxy.swift @@ -441,9 +441,9 @@ class ClientProxy: ClientProxyProtocol { room: room) } - func roomPreviewForIdentifier(_ identifier: String) async -> Result { + func roomPreviewForIdentifier(_ identifier: String, via: [String]) async -> Result { do { - let roomPreview = try await client.getRoomPreview(roomIdOrAlias: identifier) + let roomPreview = try await client.getRoomPreviewFromRoomId(roomId: identifier, viaServers: via) return .success(.init(roomPreview)) } catch { MXLog.error("Failed retrieving preview for room: \(identifier) with error: \(error)") diff --git a/ElementX/Sources/Services/Client/ClientProxyProtocol.swift b/ElementX/Sources/Services/Client/ClientProxyProtocol.swift index 4d3e546a5..71b7f3115 100644 --- a/ElementX/Sources/Services/Client/ClientProxyProtocol.swift +++ b/ElementX/Sources/Services/Client/ClientProxyProtocol.swift @@ -135,7 +135,7 @@ protocol ClientProxyProtocol: AnyObject, MediaLoaderProtocol { func roomForIdentifier(_ identifier: String) async -> RoomProxyProtocol? - func roomPreviewForIdentifier(_ identifier: String) async -> Result + func roomPreviewForIdentifier(_ identifier: String, via: [String]) async -> Result @discardableResult func loadUserDisplayName() async -> Result diff --git a/ElementX/Sources/Services/Room/RoomSummary/RoomEventStringBuilder.swift b/ElementX/Sources/Services/Room/RoomSummary/RoomEventStringBuilder.swift index 113ef433b..a9ecc032a 100644 --- a/ElementX/Sources/Services/Room/RoomSummary/RoomEventStringBuilder.swift +++ b/ElementX/Sources/Services/Room/RoomSummary/RoomEventStringBuilder.swift @@ -51,7 +51,7 @@ struct RoomEventStringBuilder { return stateEventStringBuilder .buildString(for: state, sender: sender, isOutgoing: isOutgoing) .map(AttributedString.init) - case .roomMembership(let userID, let change): + case .roomMembership(let userID, _, let change): return stateEventStringBuilder .buildString(for: change, member: userID, sender: sender, isOutgoing: isOutgoing) .map(AttributedString.init) diff --git a/ElementX/Sources/Services/Timeline/RoomTimelineProviderProtocol.swift b/ElementX/Sources/Services/Timeline/RoomTimelineProviderProtocol.swift index 6a53721c7..0975f60a9 100644 --- a/ElementX/Sources/Services/Timeline/RoomTimelineProviderProtocol.swift +++ b/ElementX/Sources/Services/Timeline/RoomTimelineProviderProtocol.swift @@ -18,6 +18,12 @@ import Combine import Foundation import MatrixRustSDK +enum PaginationStatus { + case idle + case timelineEndReached + case paginating +} + struct PaginationState: Equatable { static var `default` = PaginationState(backward: .idle, forward: .timelineEndReached) let backward: PaginationStatus diff --git a/ElementX/Sources/Services/Timeline/TimelineItems/RoomTimelineItemFactory.swift b/ElementX/Sources/Services/Timeline/TimelineItems/RoomTimelineItemFactory.swift index 5b6d2fd27..04c2c0019 100644 --- a/ElementX/Sources/Services/Timeline/TimelineItems/RoomTimelineItemFactory.swift +++ b/ElementX/Sources/Services/Timeline/TimelineItems/RoomTimelineItemFactory.swift @@ -59,7 +59,7 @@ struct RoomTimelineItemFactory: RoomTimelineItemFactoryProtocol { return nil } return buildStateTimelineItem(for: eventItemProxy, state: content, isOutgoing: isOutgoing) - case .roomMembership(userId: let userID, change: let change): + case .roomMembership(userId: let userID, _, change: let change): if isDM, change == .joined, userID == self.userID { return nil } diff --git a/ElementX/Sources/Services/Timeline/TimelineProxy.swift b/ElementX/Sources/Services/Timeline/TimelineProxy.swift index 558211b60..78eeab688 100644 --- a/ElementX/Sources/Services/Timeline/TimelineProxy.swift +++ b/ElementX/Sources/Services/Timeline/TimelineProxy.swift @@ -29,7 +29,8 @@ final class TimelineProxy: TimelineProxyProtocol { // periphery:ignore - retaining purpose private var timelineListener: RoomTimelineListener? - private let backPaginationStatusSubject = CurrentValueSubject(.idle) + private let backPaginationSubscriptionSubject = CurrentValueSubject(.idle) + private let backPaginationTimelineEndSubject = CurrentValueSubject(false) private let forwardPaginationStatusSubject = CurrentValueSubject(.timelineEndReached) private let timelineUpdatesSubject = PassthroughSubject<[TimelineDiff], Never>() @@ -70,7 +71,15 @@ final class TimelineProxy: TimelineProxyProtocol { let result = await timeline.addListener(listener: timelineListener) roomTimelineObservationToken = result.itemsStream - let paginationStatePublisher = backPaginationStatusSubject + // Merge the subscription with the paginate method's return value. + let backPaginationPublisher = backPaginationSubscriptionSubject + .combineLatest(backPaginationTimelineEndSubject) + .map { status, timelineEnd in + timelineEnd ? .timelineEndReached : status + } + .eraseToAnyPublisher() + + let paginationStatePublisher = backPaginationPublisher .combineLatest(forwardPaginationStatusSubject) .map { PaginationState(backward: $0.0, forward: $0.1) } .eraseToAnyPublisher() @@ -144,9 +153,11 @@ final class TimelineProxy: TimelineProxyProtocol { MXLog.info("Paginating backwards") do { - _ = try await timeline.paginateBackwards(numEvents: requestSize) + let timelineEndReached = try await timeline.paginateBackwards(numEvents: requestSize) MXLog.info("Finished paginating backwards") + backPaginationTimelineEndSubject.send(timelineEndReached) + return .success(()) } catch { MXLog.error("Failed paginating backwards with error: \(error)") @@ -166,7 +177,7 @@ final class TimelineProxy: TimelineProxyProtocol { forwardPaginationStatusSubject.send(.paginating) do { - let timelineEndReached = try await timeline.focusedPaginateForwards(numEvents: 16) + let timelineEndReached = try await timeline.focusedPaginateForwards(numEvents: requestSize) MXLog.info("Finished paginating forwards") forwardPaginationStatusSubject.send(timelineEndReached ? .timelineEndReached : .idle) @@ -536,7 +547,16 @@ final class TimelineProxy: TimelineProxyProtocol { private func subscribeToPagination() { let backPaginationListener = RoomPaginationStatusListener { [weak self] status in - self?.backPaginationStatusSubject.send(status) + guard let self else { + return + } + + switch status { + case .initial, .idle: + backPaginationSubscriptionSubject.send(.idle) + case .fetchingTargetEvent, .paginating: + backPaginationSubscriptionSubject.send(.paginating) + } } do { backPaginationStatusObservationToken = try timeline.subscribeToBackPaginationStatus(listener: backPaginationListener) @@ -562,13 +582,13 @@ private final class RoomTimelineListener: TimelineListener { } private final class RoomPaginationStatusListener: PaginationStatusListener { - private let onUpdateClosure: (PaginationStatus) -> Void + private let onUpdateClosure: (PaginatorState) -> Void - init(_ onUpdateClosure: @escaping (PaginationStatus) -> Void) { + init(_ onUpdateClosure: @escaping (PaginatorState) -> Void) { self.onUpdateClosure = onUpdateClosure } - func onUpdate(status: PaginationStatus) { + func onUpdate(status: PaginatorState) { onUpdateClosure(status) } } diff --git a/UnitTests/Sources/JoinRoomScreenViewModelTests.swift b/UnitTests/Sources/JoinRoomScreenViewModelTests.swift index 226f1d9e3..3bb191442 100644 --- a/UnitTests/Sources/JoinRoomScreenViewModelTests.swift +++ b/UnitTests/Sources/JoinRoomScreenViewModelTests.swift @@ -57,17 +57,17 @@ class JoinRoomScreenViewModelTests: XCTestCase { clientProxy.joinRoomViaReturnValue = throwing ? .failure(.sdkError(ClientProxyMockError.generic)) : .success(()) - clientProxy.roomPreviewForIdentifierReturnValue = .success(.init(roomID: "", - name: nil, - canonicalAlias: nil, - topic: nil, - avatarURL: nil, - memberCount: 0, - isHistoryWorldReadable: false, - isJoined: false, - isInvited: false, - isPublic: false, - canKnock: false)) + clientProxy.roomPreviewForIdentifierViaReturnValue = .success(.init(roomID: "", + name: nil, + canonicalAlias: nil, + topic: nil, + avatarURL: nil, + memberCount: 0, + isHistoryWorldReadable: false, + isJoined: false, + isInvited: false, + isPublic: false, + canKnock: false)) viewModel = JoinRoomScreenViewModel(roomID: "1", via: [], diff --git a/UnitTests/Sources/RoomFlowCoordinatorTests.swift b/UnitTests/Sources/RoomFlowCoordinatorTests.swift index 3c3d192ff..f77a51e0d 100644 --- a/UnitTests/Sources/RoomFlowCoordinatorTests.swift +++ b/UnitTests/Sources/RoomFlowCoordinatorTests.swift @@ -272,7 +272,7 @@ class RoomFlowCoordinatorTests: XCTestCase { clientProxy = ClientProxyMock(.init(userID: "hi@bob", roomSummaryProvider: RoomSummaryProviderMock(.init(state: .loaded(.mockRooms))))) timelineControllerFactory = RoomTimelineControllerFactoryMock(configuration: .init()) - clientProxy.roomPreviewForIdentifierClosure = { [roomType] roomID in + clientProxy.roomPreviewForIdentifierViaClosure = { [roomType] roomID, _ in switch roomType { case .invited: return .success(.init(roomID: roomID, diff --git a/project.yml b/project.yml index c99da6953..a9aab1a4c 100644 --- a/project.yml +++ b/project.yml @@ -49,7 +49,7 @@ packages: # Element/Matrix dependencies MatrixRustSDK: url: https://github.com/element-hq/matrix-rust-components-swift - exactVersion: 1.0.0 + exactVersion: 1.0.1 # path: ../matrix-rust-sdk Compound: url: https://github.com/element-hq/compound-ios