AlarmBGPicker.swift 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. //
  2. // AlarmBGPicker.swift
  3. // LoopFollow
  4. //
  5. // Created by Jonas Björkert on 2025-05-13.
  6. // Copyright © 2025 Jon Fawcett. All rights reserved.
  7. //
  8. import HealthKit
  9. import SwiftUI
  10. struct AlarmBGPicker: View {
  11. let title: String
  12. let range: ClosedRange<Double>
  13. @Binding var value: Double
  14. private var unit: HKUnit { UserDefaultsRepository.getPreferredUnit() }
  15. private var allValues: [Double] {
  16. if unit == .millimolesPerLiter {
  17. let step = 0.1
  18. let lower = ceil((range.lowerBound / 18) / step) * step
  19. let upper = floor((range.upperBound / 18) / step) * step
  20. return stride(from: lower, through: upper, by: step).map { $0 * 18 }
  21. } else {
  22. return Array(stride(from: range.lowerBound, through: range.upperBound, by: 1))
  23. }
  24. }
  25. private var snappedValue: Binding<Double> {
  26. Binding(
  27. get: {
  28. allValues.min(by: { abs($0 - value) < abs($1 - value) }) ?? value
  29. },
  30. set: { value = $0 }
  31. )
  32. }
  33. var body: some View {
  34. Picker(selection: snappedValue,
  35. label: HStack { Text(title) })
  36. {
  37. ForEach(allValues, id: \.self) { v in
  38. Text("\(Localizer.formatQuantity(v)) \(unit.localizedShortUnitString)")
  39. .tag(v)
  40. }
  41. }
  42. }
  43. }