GlucoseValuePicker.swift 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. //
  2. // GlucoseValuePicker.swift
  3. // LoopKitUI
  4. //
  5. // Created by Michael Pangburn on 4/14/20.
  6. // Copyright © 2020 LoopKit Authors. All rights reserved.
  7. //
  8. import SwiftUI
  9. import HealthKit
  10. import LoopKit
  11. public struct GlucoseValuePicker: View {
  12. @Environment(\.guidanceColors) var guidanceColors
  13. @Binding var value: HKQuantity
  14. var unit: HKUnit
  15. var guardrail: Guardrail<HKQuantity>
  16. var bounds: ClosedRange<HKQuantity>
  17. var isUnitLabelVisible: Bool
  18. public init(
  19. value: Binding<HKQuantity>,
  20. unit: HKUnit,
  21. guardrail: Guardrail<HKQuantity>,
  22. bounds: ClosedRange<HKQuantity>,
  23. isUnitLabelVisible: Bool = true
  24. ) {
  25. self._value = value
  26. self.unit = unit
  27. self.guardrail = guardrail
  28. self.bounds = bounds
  29. self.isUnitLabelVisible = isUnitLabelVisible
  30. }
  31. public init(
  32. value: Binding<HKQuantity>,
  33. unit: HKUnit,
  34. guardrail: Guardrail<HKQuantity>,
  35. isUnitLabelVisible: Bool = true
  36. ) {
  37. self.init(value: value, unit: unit, guardrail: guardrail, bounds: guardrail.absoluteBounds, isUnitLabelVisible: isUnitLabelVisible)
  38. }
  39. public var body: some View {
  40. QuantityPicker(value: $value,
  41. unit: unit,
  42. guardrail: guardrail,
  43. selectableValues: selectableValues,
  44. isUnitLabelVisible: isUnitLabelVisible,
  45. guidanceColors: guidanceColors)
  46. }
  47. private var selectableValues: [Double] {
  48. Array(Swift.stride(
  49. from: bounds.lowerBound.doubleValue(for: unit),
  50. through: bounds.upperBound.doubleValue(for: unit),
  51. by: stride.doubleValue(for: unit)
  52. ))
  53. }
  54. private var stride: HKQuantity {
  55. switch unit {
  56. case .milligramsPerDeciliter:
  57. return HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 1)
  58. case .millimolesPerLiter:
  59. return HKQuantity(unit: .millimolesPerLiter, doubleValue: 0.1)
  60. default:
  61. fatalError("Unsupported glucose unit \(unit)")
  62. }
  63. }
  64. }
  65. private struct GlucoseValuePickerTester: View {
  66. @State var value = HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 80)
  67. private let guardrail = Guardrail(absoluteBounds: 54...180, recommendedBounds: 71...120, unit: .milligramsPerDeciliter, startingSuggestion: 80)
  68. var unit: HKUnit
  69. var body: some View {
  70. GlucoseValuePicker(value: $value, unit: unit, guardrail: guardrail)
  71. }
  72. }
  73. struct GlucoseValuePicker_Previews: PreviewProvider {
  74. static var previews: some View {
  75. ForEach([HKUnit.milligramsPerDeciliter, .millimolesPerLiter], id: \.self) { unit in
  76. GlucoseValuePickerTester(unit: unit)
  77. }
  78. }
  79. }