DeliveryLimitsStepView.swift 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import SwiftUI
  2. struct DeliveryLimitsStepView: View {
  3. @Bindable var state: Onboarding.StateModel
  4. let substep: DeliveryLimitSubstep
  5. @State private var shouldDisplayPicker: Bool = false
  6. private let settingsProvider = PickerSettingsProvider.shared
  7. var body: some View {
  8. VStack(alignment: .leading, spacing: 16) {
  9. Text(substep.hint)
  10. .padding(.horizontal)
  11. .font(.headline)
  12. switch substep {
  13. case .maxIOB:
  14. deliveryLimitInputSection(
  15. label: substep.title,
  16. displayPicker: $shouldDisplayPicker,
  17. setting: settingsProvider.settings.maxIOB,
  18. decimalValue: $state.maxIOB
  19. )
  20. case .maxBolus:
  21. deliveryLimitInputSection(
  22. label: substep.title,
  23. displayPicker: $shouldDisplayPicker,
  24. setting: settingsProvider.settings.maxBolus,
  25. decimalValue: $state.maxBolus
  26. )
  27. case .maxBasal:
  28. deliveryLimitInputSection(
  29. label: substep.title,
  30. displayPicker: $shouldDisplayPicker,
  31. setting: settingsProvider.settings.maxBasal,
  32. decimalValue: $state.maxBasal
  33. )
  34. case .maxCOB:
  35. deliveryLimitInputSection(
  36. label: substep.title,
  37. displayPicker: $shouldDisplayPicker,
  38. setting: settingsProvider.settings.maxCOB,
  39. decimalValue: $state.maxCOB
  40. )
  41. case .minimumSafetyThreshold:
  42. deliveryLimitInputSection(
  43. label: substep.title,
  44. displayPicker: $shouldDisplayPicker,
  45. setting: settingsProvider.settings.threshold_setting,
  46. decimalValue: $state.minimumSafetyThreshold
  47. )
  48. }
  49. AnyView(substep.description(units: state.units))
  50. .font(.footnote)
  51. .foregroundStyle(.secondary)
  52. .padding(.horizontal)
  53. }
  54. }
  55. @ViewBuilder private func deliveryLimitInputSection(
  56. label: String,
  57. displayPicker: Binding<Bool>,
  58. setting: PickerSetting,
  59. decimalValue: Binding<Decimal>
  60. ) -> some View {
  61. VStack {
  62. HStack {
  63. Text(label)
  64. Spacer()
  65. displayText(for: substep, decimalValue: decimalValue.wrappedValue)
  66. .foregroundColor(!displayPicker.wrappedValue ? .primary : .accentColor)
  67. .onTapGesture {
  68. displayPicker.wrappedValue.toggle()
  69. }
  70. }
  71. if displayPicker.wrappedValue {
  72. Picker(selection: decimalValue, label: Text(label)) {
  73. ForEach(settingsProvider.generatePickerValues(from: setting, units: state.units), id: \.self) { value in
  74. displayText(for: substep, decimalValue: value).tag(value)
  75. }
  76. }
  77. .pickerStyle(WheelPickerStyle())
  78. .frame(maxWidth: .infinity)
  79. }
  80. }
  81. .padding()
  82. .background(Color.chart.opacity(0.65))
  83. .cornerRadius(10)
  84. }
  85. private func displayText(for substep: DeliveryLimitSubstep, decimalValue: Decimal) -> Text {
  86. switch substep {
  87. case .maxBasal,
  88. .maxBolus,
  89. .maxIOB:
  90. return Text("\(decimalValue) \(String(localized: "U", comment: "Insulin unit abbreviation"))")
  91. case .maxCOB:
  92. return Text("\(decimalValue) \(String(localized: "g", comment: "Gram abbreviation"))")
  93. case .minimumSafetyThreshold:
  94. let value = state.units == .mgdL ? decimalValue : decimalValue.asMmolL
  95. return Text("\(decimalValue) \(state.units.rawValue)")
  96. }
  97. }
  98. }