diff --git a/ElementX/Sources/Services/Room/RoomProxy.swift b/ElementX/Sources/Services/Room/RoomProxy.swift index ac72b4661..de4b2dd1a 100644 --- a/ElementX/Sources/Services/Room/RoomProxy.swift +++ b/ElementX/Sources/Services/Room/RoomProxy.swift @@ -186,13 +186,14 @@ class RoomProxy: RoomProxyProtocol { timelineLimit: UInt32(SlidingSyncConstants.timelinePrecachingTimelineLimit)) roomSubscriptionObservationToken = slidingSyncRoom.subscribeToRoom(settings: settings) - let listener = RoomTimelineListener { [weak self] timelineDiff in + let timelineListener = RoomTimelineListener { [weak self] timelineDiff in self?.updatesSubject.send(timelineDiff) } - if let result = try? slidingSyncRoom.addTimelineListener(listener: listener) { + self.timelineListener = timelineListener + + if let result = try? slidingSyncRoom.addTimelineListener(listener: timelineListener) { roomTimelineObservationToken = result.taskHandle - timelineListener = listener Task { await fetchMembers() @@ -200,6 +201,7 @@ class RoomProxy: RoomProxyProtocol { } return .success(result.items) } else { + self.timelineListener = nil return .failure(.failedAddingTimelineListener) } } diff --git a/ElementX/Sources/Services/Timeline/RoomTimelineProvider.swift b/ElementX/Sources/Services/Timeline/RoomTimelineProvider.swift index f3da99937..f4b28a0d4 100644 --- a/ElementX/Sources/Services/Timeline/RoomTimelineProvider.swift +++ b/ElementX/Sources/Services/Timeline/RoomTimelineProvider.swift @@ -39,24 +39,22 @@ class RoomTimelineProvider: RoomTimelineProviderProtocol { self.roomProxy = roomProxy serialDispatchQueue = DispatchQueue(label: "io.element.elementx.roomtimelineprovider", qos: .utility) itemProxies = [] - - Task { @MainActor in - roomProxy - .updatesPublisher - .collect(.byTime(serialDispatchQueue, 0.1)) - .sink { [weak self] in self?.updateItemsWithDiffs($0) } - .store(in: &cancellables) - - switch roomProxy.registerTimelineListenerIfNeeded() { - case let .success(items): - itemProxies = items.map(TimelineItemProxy.init) - MXLog.info("Added timeline listener, current items (\(items.count)) : \(items.map(\.debugIdentifier))") - case .failure(.roomListenerAlreadyRegistered): - MXLog.info("Listener already registered for the room: \(roomProxy.id)") - case .failure: - let roomID = roomProxy.id - MXLog.error("Failed adding timeline listener on room with identifier: \(roomID)") - } + + roomProxy + .updatesPublisher + .collect(.byTime(serialDispatchQueue, 0.1)) + .sink { [weak self] in self?.updateItemsWithDiffs($0) } + .store(in: &cancellables) + + switch roomProxy.registerTimelineListenerIfNeeded() { + case let .success(items): + itemProxies = items.map(TimelineItemProxy.init) + MXLog.info("Added timeline listener, current items (\(items.count)) : \(items.map(\.debugIdentifier))") + case .failure(.roomListenerAlreadyRegistered): + MXLog.info("Listener already registered for the room: \(roomProxy.id)") + case .failure: + let roomID = roomProxy.id + MXLog.error("Failed adding timeline listener on room with identifier: \(roomID)") } } diff --git a/ElementX/Sources/Services/Timeline/RoomTimelineProviderProtocol.swift b/ElementX/Sources/Services/Timeline/RoomTimelineProviderProtocol.swift index de4c22a4d..41ed0bf54 100644 --- a/ElementX/Sources/Services/Timeline/RoomTimelineProviderProtocol.swift +++ b/ElementX/Sources/Services/Timeline/RoomTimelineProviderProtocol.swift @@ -17,6 +17,7 @@ import Combine import Foundation +@MainActor protocol RoomTimelineProviderProtocol { var itemsPublisher: CurrentValuePublisher<[TimelineItemProxy], Never> { get } } diff --git a/ElementX/Sources/UITests/UITestsAppCoordinator.swift b/ElementX/Sources/UITests/UITestsAppCoordinator.swift index c9c822e25..e44d9b522 100644 --- a/ElementX/Sources/UITests/UITestsAppCoordinator.swift +++ b/ElementX/Sources/UITests/UITestsAppCoordinator.swift @@ -491,7 +491,7 @@ class MockScreen: Identifiable { let mockUserSession = MockUserSession(clientProxy: clientProxy, mediaProvider: MockMediaProvider()) let createRoomParameters = CreateRoomFlowParameters() let selectedUsers: [UserProfile] = [.mockAlice, .mockBob, .mockCharlie] - let parameters = CreateRoomCoordinatorParameters(userSession: mockUserSession, userIndicatorController: MockUserIndicatorController(), createRoomParameters: .init(createRoomParameters), selectedUsers: .init(selectedUsers)) + let parameters = CreateRoomCoordinatorParameters(userSession: mockUserSession, userIndicatorController: nil, createRoomParameters: .init(createRoomParameters), selectedUsers: .init(selectedUsers)) let coordinator = CreateRoomCoordinator(parameters: parameters) navigationStackCoordinator.setRootCoordinator(coordinator) return navigationStackCoordinator @@ -500,7 +500,7 @@ class MockScreen: Identifiable { let clientProxy = MockClientProxy(userID: "@mock:client.com") let mockUserSession = MockUserSession(clientProxy: clientProxy, mediaProvider: MockMediaProvider()) let createRoomParameters = CreateRoomFlowParameters() - let parameters = CreateRoomCoordinatorParameters(userSession: mockUserSession, userIndicatorController: MockUserIndicatorController(), createRoomParameters: .init(createRoomParameters), selectedUsers: .init([])) + let parameters = CreateRoomCoordinatorParameters(userSession: mockUserSession, userIndicatorController: nil, createRoomParameters: .init(createRoomParameters), selectedUsers: .init([])) let coordinator = CreateRoomCoordinator(parameters: parameters) navigationStackCoordinator.setRootCoordinator(coordinator) return navigationStackCoordinator