GlucoseChartView.swift 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import Charts
  2. import Foundation
  3. import SwiftUI
  4. struct GlucoseChartView: ChartContent {
  5. let glucoseData: [GlucoseStored]
  6. let units: GlucoseUnits
  7. let highGlucose: Decimal
  8. let lowGlucose: Decimal
  9. let isSmoothingEnabled: Bool
  10. var body: some ChartContent {
  11. drawGlucoseChart()
  12. }
  13. private func drawGlucoseChart() -> some ChartContent {
  14. ForEach(glucoseData) { item in
  15. let glucoseToDisplay = units == .mgdL ? Decimal(item.glucose) : Decimal(item.glucose).asMmolL
  16. let pointMarkColor: Color = glucoseToDisplay > highGlucose ? Color.orange :
  17. glucoseToDisplay < lowGlucose ? Color.red :
  18. Color.green
  19. if !isSmoothingEnabled {
  20. PointMark(
  21. x: .value("Time", item.date ?? Date(), unit: .second),
  22. y: .value("Value", glucoseToDisplay)
  23. )
  24. .foregroundStyle(pointMarkColor)
  25. .symbolSize(20)
  26. .symbol {
  27. if item.isManual {
  28. Image(systemName: "drop.fill")
  29. .font(.system(size: 10))
  30. .symbolRenderingMode(.monochrome)
  31. .bold()
  32. .foregroundStyle(.red)
  33. } else {
  34. Image(systemName: "circle.fill")
  35. .font(.system(size: 5))
  36. .bold()
  37. .foregroundStyle(pointMarkColor)
  38. }
  39. }
  40. } else {
  41. PointMark(
  42. x: .value("Time", item.date ?? Date(), unit: .second),
  43. y: .value("Value", glucoseToDisplay)
  44. )
  45. .symbol {
  46. if item.isManual {
  47. Image(systemName: "drop.fill")
  48. .font(.system(size: 10))
  49. .symbolRenderingMode(.monochrome)
  50. .bold()
  51. .foregroundStyle(.red)
  52. } else {
  53. Image(systemName: "record.circle.fill")
  54. .font(.system(size: 8))
  55. .bold()
  56. .foregroundStyle(pointMarkColor)
  57. }
  58. }
  59. }
  60. }
  61. }
  62. }