Explorar o código

Merge branch 'dev' into alpha

Ivan Valkou %!s(int64=4) %!d(string=hai) anos
pai
achega
bc0c8306bb

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

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

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

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

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

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

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

@@ -1,3 +1,4 @@
+import Combine
 import SwiftUI
 import Swinject
 
@@ -12,6 +13,7 @@ protocol StateModel: ObservableObject {
 
 class BaseStateModel<Provider>: StateModel, Injectable where Provider: FreeAPS.Provider {
     @Injected() var router: Router!
+    @Injected() var settingsManager: SettingsManager!
     var isInitial: Bool = true
     private(set) var provider: Provider!
 
@@ -40,4 +42,13 @@ class BaseStateModel<Provider>: StateModel, Injectable where Provider: FreeAPS.P
     func view(for screen: Screen) -> AnyView {
         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 apsManager: APSManager!
         @Injected() var broadcaster: Broadcaster!
-        @Injected() var settingsManager: SettingsManager!
         @Injected() var pumpHistotyStorage: PumpHistoryStorage!
         @Published var amount: Decimal = 0
         @Published var inslinRecommended: Decimal = 0

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

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

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

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

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

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

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

@@ -1,3 +1,4 @@
+import Combine
 import LoopKitUI
 import SwiftDate
 import SwiftUI
@@ -5,7 +6,6 @@ import SwiftUI
 extension Home {
     final class StateModel: BaseStateModel<Provider> {
         @Injected() var broadcaster: Broadcaster!
-        @Injected() var settingsManager: SettingsManager!
         @Injected() var apsManager: APSManager!
         @Injected() var nightscoutManager: NightscoutManager!
         private let timer = DispatchTimer(timeInterval: 5)
@@ -141,6 +141,19 @@ extension Home {
                     }
                 }
                 .store(in: &lifetime)
+
+            $setupPump
+                .removeDuplicates()
+                .sink { [weak self] show in
+                    guard let self = self else { return }
+                    if show, let pumpManager = self.provider.apsManager.pumpManager {
+                        let view = PumpConfig.PumpSettingsView(pumpManager: pumpManager, completionDelegate: self).asAny()
+                        self.router.mainSecondaryModalView.value = view
+                    } else {
+                        self.router.mainSecondaryModalView.value = nil
+                    }
+                }
+                .store(in: &lifetime)
         }
 
         func addCarbs() {

+ 0 - 5
FreeAPS/Sources/Modules/Home/View/HomeRootView.swift

@@ -73,11 +73,6 @@ extension Home {
                         state.setupPump = true
                     }
                 }
-                .sheet(isPresented: $state.setupPump) {
-                    if let pumpManager = state.provider.apsManager.pumpManager {
-                        PumpConfig.PumpSettingsView(pumpManager: pumpManager, completionDelegate: state)
-                    }
-                }
                 Spacer()
                 LoopView(
                     suggestion: $state.suggestion,

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

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

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

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

+ 18 - 0
FreeAPS/Sources/Modules/Main/MainStateModel.swift

@@ -5,8 +5,10 @@ extension Main {
     final class StateModel: BaseStateModel<Provider> {
         private(set) var modal: Modal?
         @Published var isModalPresented = false
+        @Published var isSecondaryModalPresented = false
         @Published var isAlertPresented = false
         @Published var alertMessage = ""
+        @Published var secondaryModalView: AnyView? = nil
 
         override func subscribe() {
             router.mainModalScreen
@@ -33,6 +35,22 @@ extension Main {
                     self.alertMessage = message
                 }
                 .store(in: &lifetime)
+
+            router.mainSecondaryModalView
+                .receive(on: DispatchQueue.main)
+                .sink { view in
+                    self.secondaryModalView = view
+                    self.isSecondaryModalPresented = view != nil
+                }
+                .store(in: &lifetime)
+
+            $isSecondaryModalPresented
+                .removeDuplicates()
+                .filter { !$0 }
+                .sink { _ in
+                    self.router.mainSecondaryModalView.send(nil)
+                }
+                .store(in: &lifetime)
         }
     }
 }

+ 7 - 0
FreeAPS/Sources/Modules/Main/View/MainRootView.swift

@@ -12,6 +12,13 @@ extension Main {
                     NavigationView { self.state.modal!.view }
                         .navigationViewStyle(StackNavigationViewStyle())
                 }
+                .sheet(isPresented: $state.isSecondaryModalPresented) {
+                    if let view = state.secondaryModalView {
+                        view
+                    } else {
+                        EmptyView()
+                    }
+                }
                 .alert(isPresented: $state.isAlertPresented) {
                     Alert(
                         title: Text("Important message"),

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

@@ -4,7 +4,6 @@ import SwiftUI
 extension NightscoutConfig {
     final class StateModel: BaseStateModel<Provider> {
         @Injected() var keychain: Keychain!
-        @Injected() var settingsManager: SettingsManager!
 
         @Published var url = ""
         @Published var secret = ""
@@ -22,23 +21,9 @@ extension NightscoutConfig {
             useLocalSource = settingsManager.settings.useLocalGlucoseSource
             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() {

+ 8 - 26
FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift

@@ -2,9 +2,7 @@ import Foundation
 import SwiftUI
 
 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 allowAnnouncements = false
         @Published var insulinReqFraction: Decimal = 0.7
@@ -20,35 +18,19 @@ extension PreferencesEditor {
             insulinReqFraction = settingsManager.settings.insulinReqFraction
             skipBolusScreenAfterCarbs = settingsManager.settings.skipBolusScreenAfterCarbs
 
+            subscribeSetting(\.allowAnnouncements, on: $allowAnnouncements)
+            subscribeSetting(\.insulinReqFraction, on: $insulinReqFraction)
+            subscribeSetting(\.skipBolusScreenAfterCarbs, on: $skipBolusScreenAfterCarbs)
+
             $unitsIndex
                 .removeDuplicates()
-                .sink { [weak self] index in
-                    self?.settingsManager.settings.units = index == 0 ? .mgdL : .mmolL
+                .map { $0 == 0 ? GlucoseUnits.mgdL : .mmolL }
+                .sink { [weak self] units in
+                    self?.settingsManager.settings.units = units
                     self?.provider.migrateUnits()
                 }
                 .store(in: &lifetime)
 
-            $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)
-
             // MARK: - Main fields
 
             let mainFields = [

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

@@ -2,7 +2,6 @@ import SwiftUI
 
 extension Settings {
     final class StateModel: BaseStateModel<Provider> {
-        @Injected() private var settingsManager: SettingsManager!
         @Injected() private var broadcaster: Broadcaster!
         @Injected() private var fileManager: FileManager!
         @Published var closedLoop = false
@@ -15,11 +14,7 @@ extension Settings {
             closedLoop = settingsManager.settings.closedLoop
             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)
 

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

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

+ 2 - 0
FreeAPS/Sources/Router/Router.swift

@@ -4,12 +4,14 @@ import Swinject
 
 protocol Router {
     var mainModalScreen: CurrentValueSubject<Screen?, Never> { get }
+    var mainSecondaryModalView: CurrentValueSubject<AnyView?, Never> { get }
     var alertMessage: PassthroughSubject<String, Never> { get }
     func view(for screen: Screen) -> AnyView
 }
 
 final class BaseRouter: Router {
     let mainModalScreen = CurrentValueSubject<Screen?, Never>(nil)
+    let mainSecondaryModalView = CurrentValueSubject<AnyView?, Never>(nil)
     let alertMessage = PassthroughSubject<String, Never>()
 
     private let resolver: Resolver