Await for room sync only for push notification invites (#3307)

This commit is contained in:
Mauro
2024-09-19 15:42:58 +02:00
committed by GitHub
parent 5d678abd26
commit 943f33b496
4 changed files with 27 additions and 4 deletions
@@ -32,7 +32,8 @@ class AppCoordinator: AppCoordinatorProtocol, AuthenticationFlowCoordinatorDeleg
private var userSession: UserSessionProtocol? { private var userSession: UserSessionProtocol? {
didSet { didSet {
userSessionObserver?.cancel() userSessionObserver?.cancel()
if userSession != nil { if let userSession {
userSession.clientProxy.roomsToAwait = storedRoomsToAwait
configureElementCallService() configureElementCallService()
configureNotificationManager() configureNotificationManager()
observeUserSessionChanges() observeUserSessionChanges()
@@ -57,6 +58,7 @@ class AppCoordinator: AppCoordinatorProtocol, AuthenticationFlowCoordinatorDeleg
private let appRouteURLParser: AppRouteURLParser private let appRouteURLParser: AppRouteURLParser
@Consumable private var storedAppRoute: AppRoute? @Consumable private var storedAppRoute: AppRoute?
private var storedRoomsToAwait: Set<String> = []
init(appDelegate: AppDelegate) { init(appDelegate: AppDelegate) {
let appHooks = AppHooks() let appHooks = AppHooks()
@@ -303,6 +305,14 @@ class AppCoordinator: AppCoordinatorProtocol, AuthenticationFlowCoordinatorDeleg
return return
} }
if content.categoryIdentifier == NotificationConstants.Category.invite {
if let userSession {
userSession.clientProxy.roomsToAwait.insert(roomID)
} else {
storedRoomsToAwait.insert(roomID)
}
}
handleAppRoute(.room(roomID: roomID, via: [])) handleAppRoute(.room(roomID: roomID, via: []))
} }
@@ -1970,6 +1970,11 @@ class ClientProxyMock: ClientProxyProtocol {
var underlyingIgnoredUsersPublisher: CurrentValuePublisher<[String]?, Never>! var underlyingIgnoredUsersPublisher: CurrentValuePublisher<[String]?, Never>!
var pusherNotificationClientIdentifier: String? var pusherNotificationClientIdentifier: String?
var roomSummaryProvider: RoomSummaryProviderProtocol? var roomSummaryProvider: RoomSummaryProviderProtocol?
var roomsToAwait: Set<String> {
get { return underlyingRoomsToAwait }
set(value) { underlyingRoomsToAwait = value }
}
var underlyingRoomsToAwait: Set<String>!
var alternateRoomSummaryProvider: RoomSummaryProviderProtocol? var alternateRoomSummaryProvider: RoomSummaryProviderProtocol?
var notificationSettings: NotificationSettingsProxyProtocol { var notificationSettings: NotificationSettingsProxyProtocol {
get { return underlyingNotificationSettings } get { return underlyingNotificationSettings }
@@ -112,6 +112,8 @@ class ClientProxy: ClientProxyProtocol {
verificationStateSubject.asCurrentValuePublisher() verificationStateSubject.asCurrentValuePublisher()
} }
var roomsToAwait: Set<String> = []
private let sendQueueStatusSubject = CurrentValueSubject<Bool, Never>(false) private let sendQueueStatusSubject = CurrentValueSubject<Bool, Never>(false)
init(client: ClientProtocol, init(client: ClientProtocol,
@@ -431,6 +433,8 @@ class ClientProxy: ClientProxyProtocol {
} }
func roomForIdentifier(_ identifier: String) async -> RoomProxyType? { func roomForIdentifier(_ identifier: String) async -> RoomProxyType? {
let shouldAwait = roomsToAwait.remove(identifier) != nil
// Try fetching the room from the cold cache (if available) first // Try fetching the room from the cold cache (if available) first
if let room = await buildRoomForIdentifier(identifier) { if let room = await buildRoomForIdentifier(identifier) {
return room return room
@@ -446,6 +450,10 @@ class ClientProxy: ClientProxyProtocol {
_ = await roomSummaryProvider.statePublisher.values.first(where: { $0.isLoaded }) _ = await roomSummaryProvider.statePublisher.values.first(where: { $0.isLoaded })
} }
if shouldAwait {
await waitForRoomToSync(roomID: identifier)
}
return await buildRoomForIdentifier(identifier) return await buildRoomForIdentifier(identifier)
} }
@@ -836,9 +844,7 @@ class ClientProxy: ClientProxyProtocol {
MXLog.error("Failed retrieving room: \(roomID), room list service not set up") MXLog.error("Failed retrieving room: \(roomID), room list service not set up")
return nil return nil
} }
await waitForRoomToSync(roomID: roomID)
do { do {
let roomListItem = try roomListService.room(roomId: roomID) let roomListItem = try roomListService.room(roomId: roomID)
@@ -114,6 +114,8 @@ protocol ClientProxyProtocol: AnyObject, MediaLoaderProtocol {
var roomSummaryProvider: RoomSummaryProviderProtocol? { get } var roomSummaryProvider: RoomSummaryProviderProtocol? { get }
var roomsToAwait: Set<String> { get set }
/// Used for listing rooms that shouldn't be affected by the main `roomSummaryProvider` filtering /// Used for listing rooms that shouldn't be affected by the main `roomSummaryProvider` filtering
var alternateRoomSummaryProvider: RoomSummaryProviderProtocol? { get } var alternateRoomSummaryProvider: RoomSummaryProviderProtocol? { get }