diff --git a/Config/AppConfiguration.swift b/Config/AppConfiguration.swift index ce2ad7e77..64d16eafc 100644 --- a/Config/AppConfiguration.swift +++ b/Config/AppConfiguration.swift @@ -81,7 +81,7 @@ private extension AppConfiguration { .eraseOutput() let applicationDidBecomeActive = NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification).eraseOutput() - let needsRulesCheck = Publishers.Merge(sessionIsReady, applicationDidBecomeActive).eraseToAnyPublisher() + let needsRulesCheck = Publishers.CombineLatest(sessionIsReady, applicationDidBecomeActive).eraseOutput() pushRulesUpdater = .init(notificationSettingsService: MXNotificationSettingsService(session: matrixSession), needsCheck: needsRulesCheck) } diff --git a/Riot/Managers/PushRulesUpdater/PushRulesUpdater.swift b/Riot/Managers/PushRulesUpdater/PushRulesUpdater.swift index e7ad1462e..4a6ea5d64 100644 --- a/Riot/Managers/PushRulesUpdater/PushRulesUpdater.swift +++ b/Riot/Managers/PushRulesUpdater/PushRulesUpdater.swift @@ -31,14 +31,14 @@ final class PushRulesUpdater { needsCheck .sink { [weak self] _ in - self?.updateRulesIfNeeded() + self?.syncRulesIfNeeded() } .store(in: &cancellables) } } private extension PushRulesUpdater { - func updateRulesIfNeeded() { + func syncRulesIfNeeded() { print("*** check started: \(rules.count)") for rule in rules { syncRelatedRulesIfNeeded(for: rule) @@ -53,30 +53,34 @@ private extension PushRulesUpdater { let relatedRules = ruleId.syncedRules(in: rules) for relatedRule in relatedRules { - guard rule.hasSameContent(relatedRule) == false else { + guard rule.hasSameContentOf(relatedRule) == false else { print("*** OK -> rule: \(relatedRule.ruleId)") continue } - let notificationOption = NotificationIndex.index(when: rule.enabled) - - guard - let ruleId = NotificationPushRuleId(rawValue: rule.ruleId), - let expectedActions = ruleId.standardActions(for: notificationOption).actions - else { - return - } - print("*** mismatch -> rule: \(relatedRule.ruleId)") - Task { - try? await notificationSettingsService.updatePushRuleActions(for: relatedRule.ruleId, enabled: rule.enabled, actions: expectedActions) - } + sync(relatedRuleId: relatedRule.ruleId, with: rule) + } + } + + func sync(relatedRuleId: String, with rule: NotificationPushRuleType) { + let notificationOption = NotificationIndex.index(when: rule.enabled) + + guard + let ruleId = NotificationPushRuleId(rawValue: rule.ruleId), + let expectedActions = ruleId.standardActions(for: notificationOption).actions + else { + return + } + + Task { + try? await notificationSettingsService.updatePushRuleActions(for: relatedRuleId, enabled: rule.enabled, actions: expectedActions) } } } -extension NotificationPushRuleType { - func hasSameContent(_ otherRule: NotificationPushRuleType) -> Bool { +private extension NotificationPushRuleType { + func hasSameContentOf(_ otherRule: NotificationPushRuleType) -> Bool { guard let ruleId = NotificationPushRuleId(rawValue: ruleId) else { return false } @@ -85,9 +89,3 @@ extension NotificationPushRuleType { return otherRule.matches(standardActions: ruleId.standardActions(for: notificationOption)) } } - -private extension MXPushRule { - var mxActions: [MXPushRuleAction]? { - actions as? [MXPushRuleAction] - } -}