diff --git a/RiotSwiftUI/Modules/Settings/Notifications/ViewModel/NotificationSettingsViewModel.swift b/RiotSwiftUI/Modules/Settings/Notifications/ViewModel/NotificationSettingsViewModel.swift index 0dac38eb8..24f5b4f97 100644 --- a/RiotSwiftUI/Modules/Settings/Notifications/ViewModel/NotificationSettingsViewModel.swift +++ b/RiotSwiftUI/Modules/Settings/Notifications/ViewModel/NotificationSettingsViewModel.swift @@ -210,7 +210,8 @@ private extension NotificationSettingsViewModel { else { continue } - viewState.selectionState[ruleId] = isChecked(rule: rule) + + viewState.selectionState[ruleId] = isChecked(rule: rule, syncedRules: ruleId.syncedRules(in: newRules)) } } @@ -226,7 +227,7 @@ private extension NotificationSettingsViewModel { /// The same logic is used on android. /// - Parameter rule: The push rule type to check. /// - Returns: Wether it should be displayed as checked or not checked. - func isChecked(rule: NotificationPushRuleType) -> Bool { + func defaultIsChecked(rule: NotificationPushRuleType) -> Bool { guard let ruleId = NotificationPushRuleId(rawValue: rule.ruleId) else { return false } @@ -241,4 +242,31 @@ private extension NotificationSettingsViewModel { return index.enabled } + + func isChecked(rule: NotificationPushRuleType, syncedRules: [NotificationPushRuleType]) -> Bool { + guard let ruleId = NotificationPushRuleId(rawValue: rule.ruleId) else { + return false + } + + switch ruleId { + case .oneToOneRoom, .allOtherMessages: + let ruleIsChecked = defaultIsChecked(rule: rule) + let someSyncedRuleIsChecked = syncedRules.contains(where: { defaultIsChecked(rule: $0) }) + + return ruleIsChecked || someSyncedRuleIsChecked + default: + return defaultIsChecked(rule: rule) + } + } +} + +private extension NotificationPushRuleId { + func syncedRules(in rules: [NotificationPushRuleType]) -> [NotificationPushRuleType] { + rules.filter { + guard let ruleId = NotificationPushRuleId(rawValue: $0.ruleId) else { + return false + } + return syncedRules.contains(ruleId) + } + } }