OverrideView.swift 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import Charts
  2. import CoreData
  3. import Foundation
  4. import SwiftUI
  5. struct OverrideView: ChartContent {
  6. var state: Home.StateModel
  7. let overrides: [OverrideStored]
  8. let overrideRunStored: [OverrideRunStored]
  9. let units: GlucoseUnits
  10. let viewContext: NSManagedObjectContext
  11. var body: some ChartContent {
  12. drawActiveOverrides()
  13. drawOverrideRunStored()
  14. }
  15. private func drawActiveOverrides() -> some ChartContent {
  16. ForEach(overrides) { override in
  17. let start: Date = override.date ?? .distantPast
  18. let duration = MainChartHelper.calculateDuration(
  19. objectID: override.objectID,
  20. attribute: "duration",
  21. context: viewContext
  22. ) ?? 0
  23. let end: Date = {
  24. if override.indefinite {
  25. return start.addingTimeInterval(60 * 60 * 24 * 30)
  26. } else if duration != 0 {
  27. return start.addingTimeInterval(duration)
  28. } else {
  29. return start.addingTimeInterval(60 * 60 * 24 * 30)
  30. }
  31. }()
  32. let target = getOverrideTarget(override: override)
  33. RuleMark(
  34. xStart: .value("Start", start, unit: .second),
  35. xEnd: .value("End", end, unit: .second),
  36. y: .value("Value", units == .mgdL ? target : target.asMmolL)
  37. )
  38. .foregroundStyle(Color.purple.opacity(0.4))
  39. .lineStyle(.init(lineWidth: 8))
  40. }
  41. }
  42. private func drawOverrideRunStored() -> some ChartContent {
  43. ForEach(overrideRunStored) { overrideRunStored in
  44. let start: Date = overrideRunStored.startDate ?? .distantPast
  45. let end: Date = overrideRunStored.endDate ?? Date()
  46. let target = (overrideRunStored.target?.decimalValue ?? 100) == 0 ? 100 : overrideRunStored.target!.decimalValue
  47. RuleMark(
  48. xStart: .value("Start", start, unit: .second),
  49. xEnd: .value("End", end, unit: .second),
  50. y: .value("Value", units == .mgdL ? target : target.asMmolL)
  51. )
  52. .foregroundStyle(Color.purple.opacity(0.25))
  53. .lineStyle(.init(lineWidth: 8))
  54. }
  55. }
  56. // Handle Overrides where no Target is provided
  57. private func getOverrideTarget(override: OverrideStored) -> Decimal {
  58. if let target = MainChartHelper
  59. .calculateTarget(objectID: override.objectID, attribute: "target", context: viewContext)
  60. {
  61. return target
  62. } else if override.target == 0 {
  63. return state.currentGlucoseTarget // Default target
  64. } else {
  65. return override.target?.decimalValue ?? state.currentGlucoseTarget
  66. }
  67. }
  68. }