GlucoseChartView.swift 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import CareKitUI
  2. import SwiftUI
  3. struct GlucoseChartView: UIViewRepresentable {
  4. @Binding var glucose: [BloodGlucose]
  5. @Binding var suggestion: Suggestion?
  6. func makeUIView(context _: Context) -> OCKCartesianGraphView {
  7. let view = OCKCartesianGraphView(type: .scatter)
  8. makeDataPointsFor(view: view)
  9. return view
  10. }
  11. func updateUIView(_ view: OCKCartesianGraphView, context _: Context) {
  12. makeDataPointsFor(view: view)
  13. }
  14. private func makeDataPointsFor(view: OCKCartesianGraphView) {
  15. let dataPoints = glucose.map {
  16. CGPoint(x: CGFloat($0.dateString.timeIntervalSince1970), y: CGFloat($0.sgv ?? 0))
  17. }
  18. var data = OCKDataSeries(
  19. dataPoints: dataPoints,
  20. title: "BG",
  21. color: .green
  22. )
  23. data.size = 1
  24. var series = [data]
  25. let lastDate = glucose.last?.dateString ?? Date()
  26. if let iob = suggestion?.predictions?.iob {
  27. let dataPoints = iob.enumerated().map {
  28. CGPoint(
  29. x: CGFloat(lastDate.addingTimeInterval(Double($0 * 300)).timeIntervalSince1970),
  30. y: CGFloat($1)
  31. )
  32. }
  33. var data = OCKDataSeries(
  34. dataPoints: dataPoints,
  35. title: "IOB",
  36. color: .blue
  37. )
  38. data.size = 1
  39. series.append(data)
  40. }
  41. if let zt = suggestion?.predictions?.zt {
  42. let dataPoints = zt.enumerated().map {
  43. CGPoint(
  44. x: CGFloat(lastDate.addingTimeInterval(Double($0 * 300)).timeIntervalSince1970),
  45. y: CGFloat($1)
  46. )
  47. }
  48. var data = OCKDataSeries(
  49. dataPoints: dataPoints,
  50. title: "ZT",
  51. color: .cyan
  52. )
  53. data.size = 1
  54. series.append(data)
  55. }
  56. if let cob = suggestion?.predictions?.cob {
  57. let dataPoints = cob.enumerated().map {
  58. CGPoint(
  59. x: CGFloat(lastDate.addingTimeInterval(Double($0 * 300)).timeIntervalSince1970),
  60. y: CGFloat($1)
  61. )
  62. }
  63. var data = OCKDataSeries(
  64. dataPoints: dataPoints,
  65. title: "COB",
  66. color: .orange
  67. )
  68. data.size = 1
  69. series.append(data)
  70. }
  71. if let uam = suggestion?.predictions?.uam {
  72. let dataPoints = uam.enumerated().map {
  73. CGPoint(
  74. x: CGFloat(lastDate.addingTimeInterval(Double($0 * 300)).timeIntervalSince1970),
  75. y: CGFloat($1)
  76. )
  77. }
  78. var data = OCKDataSeries(
  79. dataPoints: dataPoints,
  80. title: "UAM",
  81. color: .yellow
  82. )
  83. data.size = 1
  84. series.append(data)
  85. }
  86. view.dataSeries = series
  87. }
  88. }