AddTempTargetStateModel.swift 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. import CoreData
  2. import SwiftUI
  3. extension AddTempTarget {
  4. final class StateModel: BaseStateModel<Provider> {
  5. @Injected() private var storage: TempTargetsStorage!
  6. @Injected() var apsManager: APSManager!
  7. let coredataContext = CoreDataStack.shared.newTaskContext()
  8. @Published var low: Decimal = 0
  9. // @Published var target: Decimal = 0
  10. @Published var high: Decimal = 0
  11. @Published var duration: Decimal = 0
  12. @Published var date = Date()
  13. @Published var newPresetName = ""
  14. @Published var presets: [TempTarget] = []
  15. @Published var percentage = 100.0
  16. @Published var maxValue: Decimal = 1.2
  17. @Published var viewPercantage = false
  18. @Published var hbt: Double = 160
  19. @Published var saveSettings: Bool = false
  20. private(set) var units: GlucoseUnits = .mmolL
  21. override func subscribe() {
  22. units = settingsManager.settings.units
  23. presets = storage.presets()
  24. maxValue = settingsManager.preferences.autosensMax
  25. }
  26. func enact() {
  27. guard duration > 0 else {
  28. return
  29. }
  30. var lowTarget = low
  31. if viewPercantage {
  32. lowTarget = Decimal(round(Double(computeTarget())))
  33. coredataContext.performAndWait {
  34. let saveToCoreData = TempTargets(context: self.coredataContext)
  35. saveToCoreData.id = UUID().uuidString
  36. saveToCoreData.active = true
  37. saveToCoreData.hbt = hbt
  38. saveToCoreData.date = Date()
  39. saveToCoreData.duration = duration as NSDecimalNumber
  40. saveToCoreData.startDate = Date()
  41. do {
  42. guard self.coredataContext.hasChanges else { return }
  43. try self.coredataContext.save()
  44. } catch {
  45. print(error.localizedDescription)
  46. }
  47. }
  48. saveSettings = true
  49. } else {
  50. coredataContext.performAndWait {
  51. let saveToCoreData = TempTargets(context: coredataContext)
  52. saveToCoreData.active = false
  53. saveToCoreData.date = Date()
  54. do {
  55. guard self.coredataContext.hasChanges else { return }
  56. try self.coredataContext.save()
  57. } catch {
  58. print(error.localizedDescription)
  59. }
  60. }
  61. }
  62. var highTarget = lowTarget
  63. if units == .mmolL, !viewPercantage {
  64. lowTarget = Decimal(round(Double(lowTarget.asMgdL)))
  65. highTarget = lowTarget
  66. }
  67. let entry = TempTarget(
  68. name: TempTarget.custom,
  69. createdAt: date,
  70. targetTop: highTarget,
  71. targetBottom: lowTarget,
  72. duration: duration,
  73. enteredBy: TempTarget.manual,
  74. reason: TempTarget.custom
  75. )
  76. storage.storeTempTargets([entry])
  77. showModal(for: nil)
  78. }
  79. func cancel() {
  80. storage.storeTempTargets([TempTarget.cancel(at: Date())])
  81. showModal(for: nil)
  82. coredataContext.performAndWait {
  83. let saveToCoreData = TempTargets(context: self.coredataContext)
  84. saveToCoreData.active = false
  85. saveToCoreData.date = Date()
  86. do {
  87. guard self.coredataContext.hasChanges else { return }
  88. try self.coredataContext.save()
  89. } catch {
  90. print(error.localizedDescription)
  91. }
  92. let setHBT = TempTargetsSlider(context: self.coredataContext)
  93. setHBT.enabled = false
  94. setHBT.date = Date()
  95. do {
  96. guard self.coredataContext.hasChanges else { return }
  97. try self.coredataContext.save()
  98. } catch {
  99. print(error.localizedDescription)
  100. }
  101. }
  102. }
  103. func save() {
  104. guard duration > 0 else {
  105. return
  106. }
  107. var lowTarget = low
  108. if viewPercantage {
  109. lowTarget = Decimal(round(Double(computeTarget())))
  110. saveSettings = true
  111. }
  112. var highTarget = lowTarget
  113. if units == .mmolL, !viewPercantage {
  114. lowTarget = Decimal(round(Double(lowTarget.asMgdL)))
  115. highTarget = lowTarget
  116. }
  117. let entry = TempTarget(
  118. name: newPresetName.isEmpty ? TempTarget.custom : newPresetName,
  119. createdAt: Date(),
  120. targetTop: highTarget,
  121. targetBottom: lowTarget,
  122. duration: duration,
  123. enteredBy: TempTarget.manual,
  124. reason: newPresetName.isEmpty ? TempTarget.custom : newPresetName
  125. )
  126. presets.append(entry)
  127. storage.storePresets(presets)
  128. if viewPercantage {
  129. let id = entry.id
  130. coredataContext.performAndWait {
  131. let saveToCoreData = TempTargetsSlider(context: self.coredataContext)
  132. saveToCoreData.id = id
  133. saveToCoreData.isPreset = true
  134. saveToCoreData.enabled = true
  135. saveToCoreData.hbt = hbt
  136. saveToCoreData.date = Date()
  137. saveToCoreData.duration = duration as NSDecimalNumber
  138. do {
  139. guard self.coredataContext.hasChanges else { return }
  140. try self.coredataContext.save()
  141. } catch {
  142. print(error.localizedDescription)
  143. }
  144. }
  145. }
  146. }
  147. func enactPreset(id: String) {
  148. if var preset = presets.first(where: { $0.id == id }) {
  149. preset.createdAt = Date()
  150. storage.storeTempTargets([preset])
  151. showModal(for: nil)
  152. coredataContext.performAndWait {
  153. var tempTargetsArray = [TempTargetsSlider]()
  154. let requestTempTargets = TempTargetsSlider.fetchRequest() as NSFetchRequest<TempTargetsSlider>
  155. let sortTT = NSSortDescriptor(key: "date", ascending: false)
  156. requestTempTargets.sortDescriptors = [sortTT]
  157. try? tempTargetsArray = coredataContext.fetch(requestTempTargets)
  158. let whichID = tempTargetsArray.first(where: { $0.id == id })
  159. if whichID != nil {
  160. let saveToCoreData = TempTargets(context: self.coredataContext)
  161. saveToCoreData.active = true
  162. saveToCoreData.date = Date()
  163. saveToCoreData.hbt = whichID?.hbt ?? 160
  164. // saveToCoreData.id = id
  165. saveToCoreData.startDate = Date()
  166. saveToCoreData.duration = whichID?.duration ?? 0
  167. do {
  168. guard self.coredataContext.hasChanges else { return }
  169. try self.coredataContext.save()
  170. } catch {
  171. print(error.localizedDescription)
  172. }
  173. } else {
  174. let saveToCoreData = TempTargets(context: self.coredataContext)
  175. saveToCoreData.active = false
  176. saveToCoreData.date = Date()
  177. do {
  178. guard self.coredataContext.hasChanges else { return }
  179. try self.coredataContext.save()
  180. } catch {
  181. print(error.localizedDescription)
  182. }
  183. }
  184. }
  185. }
  186. }
  187. func removePreset(id: String) {
  188. presets = presets.filter { $0.id != id }
  189. storage.storePresets(presets)
  190. }
  191. func computeTarget() -> Decimal {
  192. var ratio = Decimal(percentage / 100)
  193. let c = Decimal(hbt - 100)
  194. var target = (c / ratio) - c + 100
  195. if c * (c + target - 100) <= 0 {
  196. ratio = maxValue
  197. target = (c / ratio) - c + 100
  198. }
  199. return Decimal(Double(target))
  200. }
  201. }
  202. }