SettingsStateModel.swift 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import CoreData
  2. import Foundation
  3. import LoopKit
  4. import LoopKitUI
  5. import SwiftUI
  6. import TidepoolServiceKit
  7. extension Settings {
  8. final class StateModel: BaseStateModel<Provider> {
  9. @Injected() private var broadcaster: Broadcaster!
  10. @Injected() private var fileManager: FileManager!
  11. @Injected() private var nightscoutManager: NightscoutManager!
  12. @Injected() var pluginManager: PluginManager!
  13. @Injected() var fetchCgmManager: FetchGlucoseManager!
  14. @Injected() private var storage: FileStorage!
  15. @Injected() var overrideStorage: OverrideStorage!
  16. @Published var units: GlucoseUnits = .mgdL
  17. @Published var closedLoop = false
  18. @Published var debugOptions = false
  19. @Published var serviceUIType: ServiceUI.Type?
  20. @Published var setupTidepool = false
  21. private(set) var buildNumber = ""
  22. private(set) var versionNumber = ""
  23. private(set) var branch = ""
  24. private(set) var copyrightNotice = ""
  25. override func subscribe() {
  26. units = settingsManager.settings.units
  27. subscribeSetting(\.debugOptions, on: $debugOptions) { debugOptions = $0 }
  28. subscribeSetting(\.closedLoop, on: $closedLoop) { closedLoop = $0 }
  29. broadcaster.register(SettingsObserver.self, observer: self)
  30. buildNumber = Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "Unknown"
  31. versionNumber = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "Unknown"
  32. branch = BuildDetails.shared.branchAndSha
  33. copyrightNotice = Bundle.main.infoDictionary?["NSHumanReadableCopyright"] as? String ?? ""
  34. serviceUIType = TidepoolService.self as? ServiceUI.Type
  35. }
  36. func logItems() -> [URL] {
  37. var items: [URL] = []
  38. if fileManager.fileExists(atPath: SimpleLogReporter.logFile) {
  39. items.append(URL(fileURLWithPath: SimpleLogReporter.logFile))
  40. }
  41. if fileManager.fileExists(atPath: SimpleLogReporter.logFilePrev) {
  42. items.append(URL(fileURLWithPath: SimpleLogReporter.logFilePrev))
  43. }
  44. return items
  45. }
  46. func hideSettingsModal() {
  47. hideModal()
  48. }
  49. // Commenting this out for now, as not needed and possibly dangerous for users to be able to nuke their pump pairing informations via the debug menu
  50. // Leaving it in here, as it may be a handy functionality for further testing or developers.
  51. // See https://github.com/nightscout/Trio/pull/277 for more information
  52. //
  53. // func resetLoopDocuments() {
  54. // guard let localDocuments = try? FileManager.default.url(
  55. // for: .documentDirectory,
  56. // in: .userDomainMask,
  57. // appropriateFor: nil,
  58. // create: true
  59. // ) else {
  60. // preconditionFailure("Could not get a documents directory URL.")
  61. // }
  62. // let storageURL = localDocuments.appendingPathComponent("PumpManagerState" + ".plist")
  63. // try? FileManager.default.removeItem(at: storageURL)
  64. // }
  65. func hasCgmAndPump() -> Bool {
  66. let hasCgm = fetchCgmManager.cgmGlucoseSourceType != .none
  67. let hasPump = provider.deviceManager.pumpManager != nil
  68. return hasCgm && hasPump
  69. }
  70. }
  71. }
  72. extension Settings.StateModel: SettingsObserver {
  73. func settingsDidChange(_ settings: TrioSettings) {
  74. closedLoop = settings.closedLoop
  75. debugOptions = settings.debugOptions
  76. }
  77. }
  78. extension Settings.StateModel: ServiceOnboardingDelegate {
  79. func serviceOnboarding(didCreateService service: Service) {
  80. debug(.nightscout, "Service with identifier \(service.pluginIdentifier) created")
  81. provider.tidepoolManager.addTidepoolService(service: service)
  82. }
  83. func serviceOnboarding(didOnboardService service: Service) {
  84. precondition(service.isOnboarded)
  85. debug(.nightscout, "Service with identifier \(service.pluginIdentifier) onboarded")
  86. }
  87. }
  88. extension Settings.StateModel: CompletionDelegate {
  89. func completionNotifyingDidComplete(_: CompletionNotifying) {
  90. setupTidepool = false
  91. provider.tidepoolManager.forceTidepoolDataUpload()
  92. }
  93. }