AddCarbsStateModel.swift 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import SwiftUI
  2. extension AddCarbs {
  3. final class StateModel: BaseStateModel<Provider> {
  4. @Injected() var carbsStorage: CarbsStorage!
  5. @Injected() var apsManager: APSManager!
  6. @Published var carbs: Decimal = 0
  7. @Published var date = Date()
  8. @Published var protein: Decimal = 0
  9. @Published var fat: Decimal = 0
  10. @Published var carbsRequired: Decimal?
  11. override func subscribe() {
  12. carbsRequired = provider.suggestion?.carbsReq
  13. }
  14. func add() {
  15. guard carbs > 0 || fat > 0 || protein > 0 else {
  16. showModal(for: nil)
  17. return
  18. }
  19. // Convert fat and protein to carb equivalents and store as future carbs
  20. let fpucarb = (0.4 * protein) + (0.9 * fat)
  21. let fpus = ((fat * 9.0) + (protein * 4.0)) / 100.0
  22. var counter: Decimal = (fpus * 2) - 1.0
  23. var roundedCounter: Decimal = 0
  24. NSDecimalRound(&roundedCounter, &counter, 0, .up)
  25. let carbequiv = fpucarb / roundedCounter
  26. while counter > 0 {
  27. let newdate = 1.0 + trunc(Double(truncating: counter as NSNumber))
  28. carbsStorage.storeCarbs([
  29. CarbsEntry(
  30. id: UUID(), createdAt: date + (newdate * 3600), carbs: carbequiv, enteredBy: CarbsEntry.manual
  31. )
  32. ])
  33. counter -= 1
  34. }
  35. // Store the real carbs
  36. if carbs > 0 {
  37. carbsStorage.storeCarbs([CarbsEntry(id: UUID(), createdAt: date, carbs: carbs, enteredBy: CarbsEntry.manual)])
  38. }
  39. if settingsManager.settings.skipBolusScreenAfterCarbs {
  40. apsManager.determineBasalSync()
  41. showModal(for: nil)
  42. } else {
  43. showModal(for: .bolus(waitForSuggestion: true))
  44. }
  45. }
  46. }
  47. }