GlucoseValuePicker.swift 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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. var selectableValues: [Double] {
  48. Array(
  49. Swift.stride(
  50. from: bounds.lowerBound.doubleValue(for: unit, withRounding: true),
  51. through: bounds.upperBound.doubleValue(for: unit, withRounding: true),
  52. by: stride.doubleValue(for: unit, withRounding: true)
  53. )
  54. )
  55. }
  56. private var stride: HKQuantity {
  57. switch unit {
  58. case .milligramsPerDeciliter:
  59. return HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 1)
  60. case .millimolesPerLiter:
  61. return HKQuantity(unit: .millimolesPerLiter, doubleValue: 0.1)
  62. default:
  63. fatalError("Unsupported glucose unit \(unit)")
  64. }
  65. }
  66. }
  67. private struct GlucoseValuePickerTester: View {
  68. @State var value = HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 80)
  69. private let guardrail = Guardrail(absoluteBounds: 54...180, recommendedBounds: 71...120, unit: .milligramsPerDeciliter, startingSuggestion: 80)
  70. var unit: HKUnit
  71. var body: some View {
  72. GlucoseValuePicker(value: $value, unit: unit, guardrail: guardrail)
  73. }
  74. }
  75. struct GlucoseValuePicker_Previews: PreviewProvider {
  76. static var previews: some View {
  77. ForEach([HKUnit.milligramsPerDeciliter, .millimolesPerLiter], id: \.self) { unit in
  78. GlucoseValuePickerTester(unit: unit)
  79. }
  80. }
  81. }