mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-03 16:10:20 +00:00
Delay setting up subscriptions until the RoomListService is running in order to avoid cancelling in flight initial sync requests
This commit is contained in:
committed by
Stefan Ceriu
parent
dc85cb10ed
commit
b43797f4bf
@@ -92,6 +92,8 @@ class ClientProxy: ClientProxyProtocol {
|
|||||||
.asCurrentValuePublisher()
|
.asCurrentValuePublisher()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private let roomListServiceStateSubject = CurrentValueSubject<RoomListServiceState, Never>(.initial)
|
||||||
|
|
||||||
private var cancellables = Set<AnyCancellable>()
|
private var cancellables = Set<AnyCancellable>()
|
||||||
|
|
||||||
/// Will be `true` whilst the app cleans up and forces a logout. Prevents the sync service from restarting
|
/// Will be `true` whilst the app cleans up and forces a logout. Prevents the sync service from restarting
|
||||||
@@ -759,6 +761,7 @@ class ClientProxy: ClientProxyProtocol {
|
|||||||
shouldPrefixSenderName: true)
|
shouldPrefixSenderName: true)
|
||||||
|
|
||||||
roomSummaryProvider = RoomSummaryProvider(roomListService: roomListService,
|
roomSummaryProvider = RoomSummaryProvider(roomListService: roomListService,
|
||||||
|
roomListServiceStatePublisher: roomListServiceStateSubject.asCurrentValuePublisher(),
|
||||||
eventStringBuilder: eventStringBuilder,
|
eventStringBuilder: eventStringBuilder,
|
||||||
name: "AllRooms",
|
name: "AllRooms",
|
||||||
shouldUpdateVisibleRange: true,
|
shouldUpdateVisibleRange: true,
|
||||||
@@ -767,6 +770,7 @@ class ClientProxy: ClientProxyProtocol {
|
|||||||
try await roomSummaryProvider?.setRoomList(roomListService.allRooms())
|
try await roomSummaryProvider?.setRoomList(roomListService.allRooms())
|
||||||
|
|
||||||
alternateRoomSummaryProvider = RoomSummaryProvider(roomListService: roomListService,
|
alternateRoomSummaryProvider = RoomSummaryProvider(roomListService: roomListService,
|
||||||
|
roomListServiceStatePublisher: roomListServiceStateSubject.asCurrentValuePublisher(),
|
||||||
eventStringBuilder: eventStringBuilder,
|
eventStringBuilder: eventStringBuilder,
|
||||||
name: "MessageForwarding",
|
name: "MessageForwarding",
|
||||||
notificationSettings: notificationSettings,
|
notificationSettings: notificationSettings,
|
||||||
@@ -802,9 +806,13 @@ class ClientProxy: ClientProxyProtocol {
|
|||||||
|
|
||||||
private func createRoomListServiceObserver(_ roomListService: RoomListService) -> TaskHandle {
|
private func createRoomListServiceObserver(_ roomListService: RoomListService) -> TaskHandle {
|
||||||
roomListService.state(listener: RoomListStateListenerProxy { [weak self] state in
|
roomListService.state(listener: RoomListStateListenerProxy { [weak self] state in
|
||||||
|
guard let self else { return }
|
||||||
|
|
||||||
MXLog.info("Received room list update: \(state)")
|
MXLog.info("Received room list update: \(state)")
|
||||||
guard let self,
|
|
||||||
state != .error,
|
roomListServiceStateSubject.send(state)
|
||||||
|
|
||||||
|
guard state != .error,
|
||||||
state != .terminated else {
|
state != .terminated else {
|
||||||
// The sync service is responsible of handling error and termination
|
// The sync service is responsible of handling error and termination
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import MatrixRustSDK
|
|||||||
|
|
||||||
class RoomSummaryProvider: RoomSummaryProviderProtocol {
|
class RoomSummaryProvider: RoomSummaryProviderProtocol {
|
||||||
private let roomListService: RoomListServiceProtocol
|
private let roomListService: RoomListServiceProtocol
|
||||||
|
private let roomListServiceStatePublisher: CurrentValuePublisher<RoomListServiceState, Never>
|
||||||
private let eventStringBuilder: RoomEventStringBuilder
|
private let eventStringBuilder: RoomEventStringBuilder
|
||||||
private let name: String
|
private let name: String
|
||||||
private let shouldUpdateVisibleRange: Bool
|
private let shouldUpdateVisibleRange: Bool
|
||||||
@@ -36,6 +37,7 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol {
|
|||||||
private var roomList: RoomListProtocol?
|
private var roomList: RoomListProtocol?
|
||||||
|
|
||||||
private var cancellables = Set<AnyCancellable>()
|
private var cancellables = Set<AnyCancellable>()
|
||||||
|
private var roomListServiceStateCancellable: AnyCancellable?
|
||||||
private var listUpdatesSubscriptionResult: RoomListEntriesWithDynamicAdaptersResult?
|
private var listUpdatesSubscriptionResult: RoomListEntriesWithDynamicAdaptersResult?
|
||||||
private var stateUpdatesTaskHandle: TaskHandle?
|
private var stateUpdatesTaskHandle: TaskHandle?
|
||||||
|
|
||||||
@@ -64,12 +66,14 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol {
|
|||||||
/// to the room list service through the `applyInput(input: .viewport(ranges` api. Only useful for
|
/// to the room list service through the `applyInput(input: .viewport(ranges` api. Only useful for
|
||||||
/// lists that need to update the visible range on Sliding Sync
|
/// lists that need to update the visible range on Sliding Sync
|
||||||
init(roomListService: RoomListServiceProtocol,
|
init(roomListService: RoomListServiceProtocol,
|
||||||
|
roomListServiceStatePublisher: CurrentValuePublisher<RoomListServiceState, Never>,
|
||||||
eventStringBuilder: RoomEventStringBuilder,
|
eventStringBuilder: RoomEventStringBuilder,
|
||||||
name: String,
|
name: String,
|
||||||
shouldUpdateVisibleRange: Bool = false,
|
shouldUpdateVisibleRange: Bool = false,
|
||||||
notificationSettings: NotificationSettingsProxyProtocol,
|
notificationSettings: NotificationSettingsProxyProtocol,
|
||||||
appSettings: AppSettings) {
|
appSettings: AppSettings) {
|
||||||
self.roomListService = roomListService
|
self.roomListService = roomListService
|
||||||
|
self.roomListServiceStatePublisher = roomListServiceStatePublisher
|
||||||
serialDispatchQueue = DispatchQueue(label: "io.element.elementx.roomsummaryprovider", qos: .default)
|
serialDispatchQueue = DispatchQueue(label: "io.element.elementx.roomsummaryprovider", qos: .default)
|
||||||
self.eventStringBuilder = eventStringBuilder
|
self.eventStringBuilder = eventStringBuilder
|
||||||
self.name = name
|
self.name = name
|
||||||
@@ -82,7 +86,16 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol {
|
|||||||
.sink { [weak self] in self?.updateRoomsWithDiffs($0) }
|
.sink { [weak self] in self?.updateRoomsWithDiffs($0) }
|
||||||
.store(in: &cancellables)
|
.store(in: &cancellables)
|
||||||
|
|
||||||
setupVisibleRangeObservers()
|
roomListServiceStateCancellable = roomListServiceStatePublisher
|
||||||
|
.receive(on: DispatchQueue.main)
|
||||||
|
.sink { [weak self] state in
|
||||||
|
guard let self else { return }
|
||||||
|
|
||||||
|
if state == .running {
|
||||||
|
setupVisibleRangeObservers()
|
||||||
|
roomListServiceStateCancellable = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
setupNotificationSettingsSubscription()
|
setupNotificationSettingsSubscription()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user