PreferencesEditorViewModel.swift 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. import Foundation
  2. import SwiftUI
  3. extension PreferencesEditor {
  4. class ViewModel<Provider>: BaseViewModel<Provider>, ObservableObject,
  5. PreferencesSettable where Provider: PreferencesEditorProvider
  6. {
  7. @Injected() var settingsManager: SettingsManager!
  8. private(set) var preferences = Preferences()
  9. @Published var unitsIndex = 1
  10. @Published var allowAnnouncements = false
  11. @Published var decimalFields: [Field<Decimal>] = []
  12. @Published var boolFields: [Field<Bool>] = []
  13. @Published var insulinCirveField = Field<InsulinCurve>(
  14. displayName: "Insulin curve",
  15. keypath: \.curve,
  16. value: .rapidActing
  17. )
  18. override func subscribe() {
  19. preferences = provider.preferences
  20. unitsIndex = settingsManager.settings.units == .mgdL ? 0 : 1
  21. allowAnnouncements = settingsManager.settings.allowAnnouncements
  22. insulinCirveField.value = preferences.curve
  23. insulinCirveField.settable = self
  24. $unitsIndex
  25. .removeDuplicates()
  26. .sink { [weak self] index in
  27. self?.settingsManager.settings.units = index == 0 ? .mgdL : .mmolL
  28. }
  29. .store(in: &lifetime)
  30. $allowAnnouncements
  31. .removeDuplicates()
  32. .sink { [weak self] allow in
  33. self?.settingsManager.settings.allowAnnouncements = allow
  34. }
  35. .store(in: &lifetime)
  36. boolFields = [
  37. Field(
  38. displayName: "Rewind Resets Autosens",
  39. keypath: \.rewindResetsAutosens,
  40. value: preferences.rewindResetsAutosens,
  41. settable: self
  42. ),
  43. Field(
  44. displayName: "High Temptarget Raises Sensitivity",
  45. keypath: \.highTemptargetRaisesSensitivity,
  46. value: preferences.highTemptargetRaisesSensitivity,
  47. settable: self
  48. ),
  49. Field(
  50. displayName: "Low Temptarget Lowers Sensitivity",
  51. keypath: \.lowTemptargetLowersSensitivity,
  52. value: preferences.lowTemptargetLowersSensitivity,
  53. settable: self
  54. ),
  55. Field(
  56. displayName: "Sensitivity Raises Target",
  57. keypath: \.sensitivityRaisesTarget,
  58. value: preferences.sensitivityRaisesTarget,
  59. settable: self
  60. ),
  61. Field(
  62. displayName: "Resistance Lowers Target",
  63. keypath: \.resistanceLowersTarget,
  64. value: preferences.resistanceLowersTarget,
  65. settable: self
  66. ),
  67. Field(
  68. displayName: "Exercise Mode",
  69. keypath: \.exerciseMode,
  70. value: preferences.exerciseMode,
  71. settable: self
  72. ),
  73. Field(
  74. displayName: "Wide BG Target Range",
  75. keypath: \.wideBGTargetRange,
  76. value: preferences.wideBGTargetRange,
  77. settable: self
  78. ),
  79. Field(
  80. displayName: "Skip Neutral Temps",
  81. keypath: \.skipNeutralTemps,
  82. value: preferences.skipNeutralTemps,
  83. settable: self
  84. ),
  85. Field(
  86. displayName: "Unsuspend If No Temp",
  87. keypath: \.unsuspendIfNoTemp,
  88. value: preferences.unsuspendIfNoTemp,
  89. settable: self
  90. ),
  91. Field(
  92. displayName: "Enable UAM",
  93. keypath: \.enableUAM,
  94. value: preferences.enableUAM,
  95. settable: self
  96. ),
  97. Field(
  98. displayName: "A52 Risk Enable",
  99. keypath: \.a52RiskEnable,
  100. value: preferences.a52RiskEnable,
  101. settable: self
  102. ),
  103. Field(
  104. displayName: "Enable SMB With COB",
  105. keypath: \.enableSMBWithCOB,
  106. value: preferences.enableSMBWithCOB,
  107. settable: self
  108. ),
  109. Field(
  110. displayName: "Enable SMB With Temptarget",
  111. keypath: \.enableSMBWithTemptarget,
  112. value: preferences.enableSMBWithTemptarget,
  113. settable: self
  114. ),
  115. Field(
  116. displayName: "Enable SMB Always",
  117. keypath: \.enableSMBAlways,
  118. value: preferences.enableSMBAlways,
  119. settable: self
  120. ),
  121. Field(
  122. displayName: "Enable SMB After Carbs",
  123. keypath: \.enableSMBAfterCarbs,
  124. value: preferences.enableSMBAfterCarbs,
  125. settable: self
  126. ),
  127. Field(
  128. displayName: "Allow SMB With High Temptarget",
  129. keypath: \.allowSMBWithHighTemptarget,
  130. value: preferences.allowSMBWithHighTemptarget,
  131. settable: self
  132. ),
  133. Field(
  134. displayName: "Use Custom Peak Time",
  135. keypath: \.useCustomPeakTime,
  136. value: preferences.useCustomPeakTime,
  137. settable: self
  138. ),
  139. Field(
  140. displayName: "Suspend Zeros IOB",
  141. keypath: \.suspendZerosIOB,
  142. value: preferences.suspendZerosIOB,
  143. settable: self
  144. )
  145. ]
  146. decimalFields = [
  147. Field(
  148. displayName: "Max IOB",
  149. keypath: \.maxIOB,
  150. value: preferences.maxIOB,
  151. settable: self
  152. ),
  153. Field(
  154. displayName: "Max Daily Safety Multiplier",
  155. keypath: \.maxDailySafetyMultiplier,
  156. value: preferences.maxDailySafetyMultiplier,
  157. settable: self
  158. ),
  159. Field(
  160. displayName: "Current Basal Safety Multiplier",
  161. keypath: \.currentBasalSafetyMultiplier,
  162. value: preferences.currentBasalSafetyMultiplier,
  163. settable: self
  164. ),
  165. Field(
  166. displayName: "Autosens Max",
  167. keypath: \.autosensMax,
  168. value: preferences.autosensMax,
  169. settable: self
  170. ),
  171. Field(
  172. displayName: "Autosens Min",
  173. keypath: \.autosensMin,
  174. value: preferences.autosensMin,
  175. settable: self
  176. ),
  177. Field(
  178. displayName: "Half Basal Exercise Target",
  179. keypath: \.halfBasalExerciseTarget,
  180. value: preferences.halfBasalExerciseTarget,
  181. settable: self
  182. ),
  183. Field(
  184. displayName: "Max COB",
  185. keypath: \.maxCOB,
  186. value: preferences.maxCOB,
  187. settable: self
  188. ),
  189. Field(
  190. displayName: "Bolus Snooze DIA Divisor",
  191. keypath: \.bolusSnoozeDIADivisor,
  192. value: preferences.bolusSnoozeDIADivisor,
  193. settable: self
  194. ),
  195. Field(
  196. displayName: "Min 5m Carbimpact",
  197. keypath: \.min5mCarbimpact,
  198. value: preferences.min5mCarbimpact,
  199. settable: self
  200. ),
  201. Field(
  202. displayName: "Autotune ISF Adjustment Fraction",
  203. keypath: \.autotuneISFAdjustmentFraction,
  204. value: preferences.autotuneISFAdjustmentFraction,
  205. settable: self
  206. ),
  207. Field(
  208. displayName: "Remaining Carbs Fraction",
  209. keypath: \.remainingCarbsFraction,
  210. value: preferences.remainingCarbsFraction,
  211. settable: self
  212. ),
  213. Field(
  214. displayName: "Remaining Carbs Cap",
  215. keypath: \.remainingCarbsCap,
  216. value: preferences.remainingCarbsCap,
  217. settable: self
  218. ),
  219. Field(
  220. displayName: "Max SMB Basal Minutes",
  221. keypath: \.maxSMBBasalMinutes,
  222. value: preferences.maxSMBBasalMinutes,
  223. settable: self
  224. ),
  225. Field(
  226. displayName: "Max UAM SMB Basal Minutes",
  227. keypath: \.maxUAMSMBBasalMinutes,
  228. value: preferences.maxUAMSMBBasalMinutes,
  229. settable: self
  230. ),
  231. Field(
  232. displayName: "SMB Interval",
  233. keypath: \.smbInterval,
  234. value: preferences.smbInterval,
  235. settable: self
  236. ),
  237. Field(
  238. displayName: "Bolus Increment",
  239. keypath: \.bolusIncrement,
  240. value: preferences.bolusIncrement,
  241. settable: self
  242. ),
  243. Field(
  244. displayName: "Insulin Peak Time",
  245. keypath: \.insulinPeakTime,
  246. value: preferences.insulinPeakTime,
  247. settable: self
  248. ),
  249. Field(
  250. displayName: "Carbs Req Threshold",
  251. keypath: \.carbsReqThreshold,
  252. value: preferences.carbsReqThreshold,
  253. settable: self
  254. ),
  255. Field(
  256. displayName: "Noisy CGM Target Multiplier",
  257. keypath: \.noisyCGMTargetMultiplier,
  258. value: preferences.noisyCGMTargetMultiplier,
  259. settable: self
  260. )
  261. ]
  262. }
  263. func onSet<T>(_ keypath: WritableKeyPath<Preferences, T>, value: T) {
  264. preferences[keyPath: keypath] = value
  265. save()
  266. }
  267. func save() {
  268. provider.savePreferences(preferences)
  269. }
  270. }
  271. }