AbsorptionTimePickerRow.swift 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. //
  2. // AbsorptionTimePickerRow.swift
  3. // LoopKitUI
  4. //
  5. // Created by Noah Brauner on 7/19/23.
  6. // Copyright © 2023 LoopKit Authors. All rights reserved.
  7. //
  8. import SwiftUI
  9. public struct AbsorptionTimePickerRow: View {
  10. @Binding private var absorptionTime: TimeInterval
  11. @Binding private var isFocused: Bool
  12. private let validDurationRange: ClosedRange<TimeInterval>
  13. private let minuteStride: Int
  14. private var showHowAbsorptionTimeWorks: Binding<Bool>?
  15. private let durationFormatter: DateComponentsFormatter = {
  16. let formatter = DateComponentsFormatter()
  17. formatter.allowedUnits = [.hour, .minute]
  18. formatter.unitsStyle = .short
  19. return formatter
  20. }()
  21. public init(absorptionTime: Binding<TimeInterval>, isFocused: Binding<Bool>, validDurationRange: ClosedRange<TimeInterval>, minuteStride: Int = 30, showHowAbsorptionTimeWorks: Binding<Bool>? = nil) {
  22. self._absorptionTime = absorptionTime
  23. self._isFocused = isFocused
  24. self.validDurationRange = validDurationRange
  25. self.minuteStride = minuteStride
  26. self.showHowAbsorptionTimeWorks = showHowAbsorptionTimeWorks
  27. }
  28. public var body: some View {
  29. VStack(alignment: .leading, spacing: 0) {
  30. HStack {
  31. Text("Absorption Time")
  32. .foregroundColor(.primary)
  33. if showHowAbsorptionTimeWorks != nil {
  34. Button(action: {
  35. isFocused = false
  36. showHowAbsorptionTimeWorks?.wrappedValue = true
  37. }) {
  38. Image(systemName: "info.circle")
  39. .font(.body)
  40. .foregroundColor(.accentColor)
  41. }
  42. }
  43. Spacer()
  44. Text(durationString())
  45. .foregroundColor(Color(UIColor.secondaryLabel))
  46. }
  47. if isFocused {
  48. DurationPicker(duration: $absorptionTime, validDurationRange: validDurationRange, minuteInterval: minuteStride)
  49. .frame(maxWidth: .infinity)
  50. }
  51. }
  52. .onTapGesture {
  53. withAnimation {
  54. isFocused.toggle()
  55. }
  56. }
  57. }
  58. private func durationString() -> String {
  59. return durationFormatter.string(from: absorptionTime) ?? ""
  60. }
  61. }