MockCGMManagerSettingsViewModel.swift 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. //
  2. // MockCGMManagerSettingsViewModel.swift
  3. // MockKitUI
  4. //
  5. // Created by Nathaniel Hamming on 2023-05-18.
  6. // Copyright © 2023 LoopKit Authors. All rights reserved.
  7. //
  8. import SwiftUI
  9. import Combine
  10. import HealthKit
  11. import LoopKit
  12. import LoopKitUI
  13. import MockKit
  14. class MockCGMManagerSettingsViewModel: ObservableObject {
  15. let cgmManager: MockCGMManager
  16. var displayGlucosePreference: DisplayGlucosePreference
  17. static private let dateTimeFormatter: DateFormatter = {
  18. let timeFormatter = DateFormatter()
  19. timeFormatter.dateStyle = .short
  20. timeFormatter.timeStyle = .short
  21. return timeFormatter
  22. }()
  23. var sensorInsertionDateTimeString: String {
  24. Self.dateTimeFormatter.string(from: Date().addingTimeInterval(sensorInsertionInterval))
  25. }
  26. var sensorExpirationRemaining = TimeInterval(days: 5.0)
  27. var sensorInsertionInterval = TimeInterval(days: -5.0)
  28. var sensorExpirationPercentComplete: Double = 0.25
  29. var sensorExpirationDateTimeString: String {
  30. Self.dateTimeFormatter.string(from: Date().addingTimeInterval(sensorExpirationRemaining))
  31. }
  32. @Published private(set) var lastGlucoseValueWithUnitFormatted: String?
  33. @Published private(set) var lastGlucoseValueFormatted: String = "---"
  34. var glucoseUnitString: String {
  35. displayGlucosePreference.unit.shortLocalizedUnitString()
  36. }
  37. @Published private(set) var lastGlucoseDate: Date? {
  38. didSet {
  39. updateLastReadingTime()
  40. }
  41. }
  42. @Published var lastReadingMinutesFromNow: Int = 0
  43. func updateLastReadingTime() {
  44. guard let lastGlucoseDate = lastGlucoseDate else {
  45. lastReadingMinutesFromNow = 0
  46. return
  47. }
  48. lastReadingMinutesFromNow = Int(Date().timeIntervalSince(lastGlucoseDate).minutes)
  49. }
  50. @Published private(set) var lastGlucoseTrend: GlucoseTrend?
  51. var lastGlucoseDateFormatted: String? {
  52. guard let lastGlucoseDate = lastGlucoseDate else {
  53. return nil
  54. }
  55. return Self.dateTimeFormatter.string(from: lastGlucoseDate)
  56. }
  57. @Published private(set) var lastGlucoseTrendFormatted: String?
  58. init(cgmManager: MockCGMManager, displayGlucosePreference: DisplayGlucosePreference) {
  59. self.cgmManager = cgmManager
  60. self.displayGlucosePreference = displayGlucosePreference
  61. lastGlucoseDate = cgmManager.cgmManagerStatus.lastCommunicationDate
  62. lastGlucoseTrend = cgmManager.mockSensorState.trendType
  63. setLastGlucoseTrend(cgmManager.mockSensorState.trendRate)
  64. setLastGlucoseValue(cgmManager.mockSensorState.currentGlucose)
  65. cgmManager.addStatusObserver(self, queue: .main)
  66. }
  67. func setLastGlucoseTrend(_ trendRate: HKQuantity?) {
  68. guard let trendRate = trendRate else {
  69. lastGlucoseTrendFormatted = nil
  70. return
  71. }
  72. let glucoseUnitPerMinute = displayGlucosePreference.unit.unitDivided(by: .minute())
  73. lastGlucoseTrendFormatted = displayGlucosePreference.formatMinuteRate(trendRate)
  74. }
  75. func setLastGlucoseValue(_ lastGlucose: HKQuantity?) {
  76. guard let lastGlucose = lastGlucose else {
  77. lastGlucoseValueWithUnitFormatted = nil
  78. lastGlucoseValueFormatted = "---"
  79. return
  80. }
  81. lastGlucoseValueWithUnitFormatted = displayGlucosePreference.format(lastGlucose)
  82. lastGlucoseValueFormatted = displayGlucosePreference.format(lastGlucose, includeUnit: false)
  83. }
  84. }
  85. extension MockCGMManagerSettingsViewModel: CGMManagerStatusObserver {
  86. func cgmManager(_ manager: LoopKit.CGMManager, didUpdate status: LoopKit.CGMManagerStatus) {
  87. lastGlucoseDate = status.lastCommunicationDate
  88. lastGlucoseTrend = cgmManager.mockSensorState.trendType
  89. setLastGlucoseTrend(cgmManager.mockSensorState.trendRate)
  90. setLastGlucoseValue(cgmManager.mockSensorState.currentGlucose)
  91. }
  92. }