Procházet zdrojové kódy

Refactored settings subscriptions

Ivan Valkou před 4 roky
rodič
revize
12e473e655

+ 0 - 1
FreeAPS/Sources/Modules/AddCarbs/AddCarbsStateModel.swift

@@ -3,7 +3,6 @@ import SwiftUI
 extension AddCarbs {
 extension AddCarbs {
     final class StateModel: BaseStateModel<Provider> {
     final class StateModel: BaseStateModel<Provider> {
         @Injected() var carbsStorage: CarbsStorage!
         @Injected() var carbsStorage: CarbsStorage!
-        @Injected() var settingsManager: SettingsManager!
         @Injected() var apsManager: APSManager!
         @Injected() var apsManager: APSManager!
         @Published var carbs: Decimal = 0
         @Published var carbs: Decimal = 0
         @Published var date = Date()
         @Published var date = Date()

+ 0 - 1
FreeAPS/Sources/Modules/AddTempTarget/AddTempTargetStateModel.swift

@@ -3,7 +3,6 @@ import SwiftUI
 extension AddTempTarget {
 extension AddTempTarget {
     final class StateModel: BaseStateModel<Provider> {
     final class StateModel: BaseStateModel<Provider> {
         @Injected() private var storage: TempTargetsStorage!
         @Injected() private var storage: TempTargetsStorage!
-        @Injected() private var settingsManager: SettingsManager!
         @Injected() var apsManager: APSManager!
         @Injected() var apsManager: APSManager!
 
 
         @Published var low: Decimal = 0
         @Published var low: Decimal = 0

+ 0 - 1
FreeAPS/Sources/Modules/AutotuneConfig/AutotuneConfigStateModel.swift

@@ -3,7 +3,6 @@ import SwiftUI
 
 
 extension AutotuneConfig {
 extension AutotuneConfig {
     final class StateModel: BaseStateModel<Provider> {
     final class StateModel: BaseStateModel<Provider> {
-        @Injected() var settingsManager: SettingsManager!
         @Injected() var apsManager: APSManager!
         @Injected() var apsManager: APSManager!
         @Published var useAutotune = false
         @Published var useAutotune = false
         @Published var autotune: Autotune?
         @Published var autotune: Autotune?

+ 11 - 0
FreeAPS/Sources/Modules/Base/BaseStateModel.swift

@@ -1,3 +1,4 @@
+import Combine
 import SwiftUI
 import SwiftUI
 import Swinject
 import Swinject
 
 
@@ -12,6 +13,7 @@ protocol StateModel: ObservableObject {
 
 
 class BaseStateModel<Provider>: StateModel, Injectable where Provider: FreeAPS.Provider {
 class BaseStateModel<Provider>: StateModel, Injectable where Provider: FreeAPS.Provider {
     @Injected() var router: Router!
     @Injected() var router: Router!
+    @Injected() var settingsManager: SettingsManager!
     var isInitial: Bool = true
     var isInitial: Bool = true
     private(set) var provider: Provider!
     private(set) var provider: Provider!
 
 
@@ -40,4 +42,13 @@ class BaseStateModel<Provider>: StateModel, Injectable where Provider: FreeAPS.P
     func view(for screen: Screen) -> AnyView {
     func view(for screen: Screen) -> AnyView {
         router.view(for: screen)
         router.view(for: screen)
     }
     }
+
+    func subscribeSetting<T: Equatable, U: Publisher>(_ keyPath: WritableKeyPath<FreeAPSSettings, T>, on settingPublisher: U)
+        where U.Output == T, U.Failure == Never
+    {
+        settingPublisher
+            .removeDuplicates()
+            .assign(to: (\SettingsManager.settings).appending(path: keyPath), on: settingsManager)
+            .store(in: &lifetime)
+    }
 }
 }

+ 0 - 1
FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift

@@ -6,7 +6,6 @@ extension Bolus {
         @Injected() var unlockmanager: UnlockManager!
         @Injected() var unlockmanager: UnlockManager!
         @Injected() var apsManager: APSManager!
         @Injected() var apsManager: APSManager!
         @Injected() var broadcaster: Broadcaster!
         @Injected() var broadcaster: Broadcaster!
-        @Injected() var settingsManager: SettingsManager!
         @Injected() var pumpHistotyStorage: PumpHistoryStorage!
         @Injected() var pumpHistotyStorage: PumpHistoryStorage!
         @Published var amount: Decimal = 0
         @Published var amount: Decimal = 0
         @Published var inslinRecommended: Decimal = 0
         @Published var inslinRecommended: Decimal = 0

+ 2 - 13
FreeAPS/Sources/Modules/CGM/CGMStateModel.swift

@@ -3,7 +3,6 @@ import SwiftUI
 
 
 extension CGM {
 extension CGM {
     final class StateModel: BaseStateModel<Provider> {
     final class StateModel: BaseStateModel<Provider> {
-        @Injected() var settingsManager: SettingsManager!
         @Injected() var libreSource: LibreTransmitterSource!
         @Injected() var libreSource: LibreTransmitterSource!
         @Injected() var calendarManager: CalendarManager!
         @Injected() var calendarManager: CalendarManager!
 
 
@@ -31,12 +30,7 @@ extension CGM {
                 }
                 }
                 .store(in: &lifetime)
                 .store(in: &lifetime)
 
 
-            $uploadGlucose
-                .removeDuplicates()
-                .sink { [weak self] value in
-                    self?.settingsManager.settings.uploadGlucose = value
-                }
-                .store(in: &lifetime)
+            subscribeSetting(\.uploadGlucose, on: $uploadGlucose)
 
 
             $createCalendarEvents
             $createCalendarEvents
                 .removeDuplicates()
                 .removeDuplicates()
@@ -52,12 +46,7 @@ extension CGM {
                 .weakAssign(to: \.calendarIDs, on: self)
                 .weakAssign(to: \.calendarIDs, on: self)
                 .store(in: &lifetime)
                 .store(in: &lifetime)
 
 
-            $createCalendarEvents
-                .removeDuplicates()
-                .sink { [weak self] use in
-                    self?.settingsManager.settings.useCalendar = use
-                }
-                .store(in: &lifetime)
+            subscribeSetting(\.useCalendar, on: $createCalendarEvents)
 
 
             $currentCalendarID
             $currentCalendarID
                 .removeDuplicates()
                 .removeDuplicates()

+ 0 - 1
FreeAPS/Sources/Modules/Calibrations/CalibrationsStateModel.swift

@@ -5,7 +5,6 @@ extension Calibrations {
     final class StateModel: BaseStateModel<Provider> {
     final class StateModel: BaseStateModel<Provider> {
         @Injected() var glucoseStorage: GlucoseStorage!
         @Injected() var glucoseStorage: GlucoseStorage!
         @Injected() var calibrationService: CalibrationService!
         @Injected() var calibrationService: CalibrationService!
-        @Injected() var settingsManager: SettingsManager!
 
 
         @Published var slope: Double = 1
         @Published var slope: Double = 1
         @Published var intercept: Double = 1
         @Published var intercept: Double = 1

+ 0 - 1
FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift

@@ -3,7 +3,6 @@ import SwiftUI
 extension DataTable {
 extension DataTable {
     final class StateModel: BaseStateModel<Provider> {
     final class StateModel: BaseStateModel<Provider> {
         @Injected() var broadcaster: Broadcaster!
         @Injected() var broadcaster: Broadcaster!
-        @Injected() var settingsManager: SettingsManager!
         @Published var items: [Item] = []
         @Published var items: [Item] = []
 
 
         override func subscribe() {
         override func subscribe() {

+ 0 - 1
FreeAPS/Sources/Modules/Home/HomeStateModel.swift

@@ -6,7 +6,6 @@ import SwiftUI
 extension Home {
 extension Home {
     final class StateModel: BaseStateModel<Provider> {
     final class StateModel: BaseStateModel<Provider> {
         @Injected() var broadcaster: Broadcaster!
         @Injected() var broadcaster: Broadcaster!
-        @Injected() var settingsManager: SettingsManager!
         @Injected() var apsManager: APSManager!
         @Injected() var apsManager: APSManager!
         @Injected() var nightscoutManager: NightscoutManager!
         @Injected() var nightscoutManager: NightscoutManager!
         @Injected() var calendarManager: CalendarManager!
         @Injected() var calendarManager: CalendarManager!

+ 0 - 1
FreeAPS/Sources/Modules/ISFEditor/ISFEditorStateModel.swift

@@ -2,7 +2,6 @@ import SwiftUI
 
 
 extension ISFEditor {
 extension ISFEditor {
     final class StateModel: BaseStateModel<Provider> {
     final class StateModel: BaseStateModel<Provider> {
-        @Injected() var settingsManager: SettingsManager!
         @Published var items: [Item] = []
         @Published var items: [Item] = []
         private(set) var autosensISF: Decimal?
         private(set) var autosensISF: Decimal?
         private(set) var autosensRatio: Decimal = 0
         private(set) var autosensRatio: Decimal = 0

+ 0 - 1
FreeAPS/Sources/Modules/LibreConfig/LibreConfigStateModel.swift

@@ -4,7 +4,6 @@ import SwiftUI
 extension LibreConfig {
 extension LibreConfig {
     final class StateModel: BaseStateModel<Provider> {
     final class StateModel: BaseStateModel<Provider> {
         @Injected() var source: LibreTransmitterSource!
         @Injected() var source: LibreTransmitterSource!
-        @Injected() var settingsManager: SettingsManager!
 
 
         @Published var configured = false
         @Published var configured = false
 
 

+ 3 - 18
FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift

@@ -4,7 +4,6 @@ import SwiftUI
 extension NightscoutConfig {
 extension NightscoutConfig {
     final class StateModel: BaseStateModel<Provider> {
     final class StateModel: BaseStateModel<Provider> {
         @Injected() var keychain: Keychain!
         @Injected() var keychain: Keychain!
-        @Injected() var settingsManager: SettingsManager!
 
 
         @Published var url = ""
         @Published var url = ""
         @Published var secret = ""
         @Published var secret = ""
@@ -22,23 +21,9 @@ extension NightscoutConfig {
             useLocalSource = settingsManager.settings.useLocalGlucoseSource
             useLocalSource = settingsManager.settings.useLocalGlucoseSource
             localPort = Decimal(settingsManager.settings.localGlucosePort)
             localPort = Decimal(settingsManager.settings.localGlucosePort)
 
 
-            $isUploadEnabled
-                .removeDuplicates()
-                .sink { [weak self] enabled in
-                    self?.settingsManager.settings.isUploadEnabled = enabled
-                }.store(in: &lifetime)
-
-            $useLocalSource
-                .removeDuplicates()
-                .sink { [weak self] use in
-                    self?.settingsManager.settings.useLocalGlucoseSource = use
-                }.store(in: &lifetime)
-
-            $localPort
-                .removeDuplicates()
-                .sink { [weak self] port in
-                    self?.settingsManager.settings.localGlucosePort = Int(port)
-                }.store(in: &lifetime)
+            subscribeSetting(\.isUploadEnabled, on: $isUploadEnabled)
+            subscribeSetting(\.useLocalGlucoseSource, on: $useLocalSource)
+            subscribeSetting(\.localGlucosePort, on: $localPort.map(Int.init))
         }
         }
 
 
         func connect() {
         func connect() {

+ 12 - 30
FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift

@@ -2,9 +2,7 @@ import Foundation
 import SwiftUI
 import SwiftUI
 
 
 extension PreferencesEditor {
 extension PreferencesEditor {
-    final class StateModel: BaseStateModel<Provider>, PreferencesSettable {
-        @Injected() var settingsManager: SettingsManager!
-        private(set) var preferences = Preferences()
+    final class StateModel: BaseStateModel<Provider>, PreferencesSettable { private(set) var preferences = Preferences()
         @Published var unitsIndex = 1
         @Published var unitsIndex = 1
         @Published var allowAnnouncements = false
         @Published var allowAnnouncements = false
         @Published var insulinReqFraction: Decimal = 0.7
         @Published var insulinReqFraction: Decimal = 0.7
@@ -20,34 +18,18 @@ extension PreferencesEditor {
             insulinReqFraction = settingsManager.settings.insulinReqFraction
             insulinReqFraction = settingsManager.settings.insulinReqFraction
             skipBolusScreenAfterCarbs = settingsManager.settings.skipBolusScreenAfterCarbs
             skipBolusScreenAfterCarbs = settingsManager.settings.skipBolusScreenAfterCarbs
 
 
-            $unitsIndex
-                .removeDuplicates()
-                .sink { [weak self] index in
-                    self?.settingsManager.settings.units = index == 0 ? .mgdL : .mmolL
-                    self?.provider.migrateUnits()
-                }
-                .store(in: &lifetime)
+            subscribeSetting(
+                \.units,
+                on: $unitsIndex
+                    .map { [weak self] index in
+                        self?.provider.migrateUnits()
+                        return index == 0 ? GlucoseUnits.mgdL : .mmolL
+                    }
+            )
 
 
-            $allowAnnouncements
-                .removeDuplicates()
-                .sink { [weak self] allow in
-                    self?.settingsManager.settings.allowAnnouncements = allow
-                }
-                .store(in: &lifetime)
-
-            $insulinReqFraction
-                .removeDuplicates()
-                .sink { [weak self] fraction in
-                    self?.settingsManager.settings.insulinReqFraction = fraction
-                }
-                .store(in: &lifetime)
-
-            $skipBolusScreenAfterCarbs
-                .removeDuplicates()
-                .sink { [weak self] skip in
-                    self?.settingsManager.settings.skipBolusScreenAfterCarbs = skip
-                }
-                .store(in: &lifetime)
+            subscribeSetting(\.allowAnnouncements, on: $allowAnnouncements)
+            subscribeSetting(\.insulinReqFraction, on: $insulinReqFraction)
+            subscribeSetting(\.skipBolusScreenAfterCarbs, on: $skipBolusScreenAfterCarbs)
 
 
             // MARK: - Main fields
             // MARK: - Main fields
 
 

+ 1 - 6
FreeAPS/Sources/Modules/Settings/SettingsStateModel.swift

@@ -2,7 +2,6 @@ import SwiftUI
 
 
 extension Settings {
 extension Settings {
     final class StateModel: BaseStateModel<Provider> {
     final class StateModel: BaseStateModel<Provider> {
-        @Injected() private var settingsManager: SettingsManager!
         @Injected() private var broadcaster: Broadcaster!
         @Injected() private var broadcaster: Broadcaster!
         @Injected() private var fileManager: FileManager!
         @Injected() private var fileManager: FileManager!
         @Published var closedLoop = false
         @Published var closedLoop = false
@@ -15,11 +14,7 @@ extension Settings {
             closedLoop = settingsManager.settings.closedLoop
             closedLoop = settingsManager.settings.closedLoop
             debugOptions = settingsManager.settings.debugOptions
             debugOptions = settingsManager.settings.debugOptions
 
 
-            $closedLoop
-                .removeDuplicates()
-                .sink { [weak self] value in
-                    self?.settingsManager.settings.closedLoop = value
-                }.store(in: &lifetime)
+            subscribeSetting(\.closedLoop, on: $closedLoop)
 
 
             broadcaster.register(SettingsObserver.self, observer: self)
             broadcaster.register(SettingsObserver.self, observer: self)
 
 

+ 0 - 1
FreeAPS/Sources/Modules/TargetsEditor/TargetsEditorStateModel.swift

@@ -2,7 +2,6 @@ import SwiftUI
 
 
 extension TargetsEditor {
 extension TargetsEditor {
     final class StateModel: BaseStateModel<Provider> {
     final class StateModel: BaseStateModel<Provider> {
-        @Injected() var settingsManager: SettingsManager!
         @Published var items: [Item] = []
         @Published var items: [Item] = []
 
 
         let timeValues = stride(from: 0.0, to: 1.days.timeInterval, by: 30.minutes.timeInterval).map { $0 }
         let timeValues = stride(from: 0.0, to: 1.days.timeInterval, by: 30.minutes.timeInterval).map { $0 }

+ 1 - 1
FreeAPS/Sources/Services/SettingsManager/SettingsManager.swift

@@ -1,7 +1,7 @@
 import Foundation
 import Foundation
 import Swinject
 import Swinject
 
 
-protocol SettingsManager {
+protocol SettingsManager: AnyObject {
     var settings: FreeAPSSettings { get set }
     var settings: FreeAPSSettings { get set }
     var preferences: Preferences { get }
     var preferences: Preferences { get }
 }
 }