CarbsView.swift 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import SwiftUI
  2. struct CarbsView: View {
  3. @EnvironmentObject var state: WatchStateModel
  4. @State var amount = 0.0
  5. var numberFormatter: NumberFormatter {
  6. let formatter = NumberFormatter()
  7. formatter.numberStyle = .decimal
  8. formatter.minimum = 0
  9. formatter.maximum = (state.maxCOB ?? 120) as NSNumber
  10. formatter.maximumFractionDigits = 0
  11. formatter.allowsFloats = false
  12. return formatter
  13. }
  14. var body: some View {
  15. GeometryReader { geo in
  16. VStack(spacing: 16) {
  17. HStack {
  18. Button {
  19. WKInterfaceDevice.current().play(.click)
  20. let newValue = amount - 5
  21. amount = max(newValue, 0)
  22. } label: {
  23. Image(systemName: "minus")
  24. }
  25. .frame(width: geo.size.width / 4)
  26. Spacer()
  27. Text(numberFormatter.string(from: amount as NSNumber)! + " g")
  28. .font(.title2)
  29. .focusable(true)
  30. .digitalCrownRotation(
  31. $amount,
  32. from: 0,
  33. through: Double(state.maxCOB ?? 120),
  34. by: 1,
  35. sensitivity: .medium,
  36. isContinuous: false,
  37. isHapticFeedbackEnabled: true
  38. )
  39. Spacer()
  40. Button {
  41. WKInterfaceDevice.current().play(.click)
  42. let newValue = amount + 5
  43. amount = min(newValue, Double(state.maxCOB ?? 120))
  44. } label: { Image(systemName: "plus") }
  45. .frame(width: geo.size.width / 4)
  46. }
  47. Button {
  48. WKInterfaceDevice.current().play(.click)
  49. // Get amount from displayed string
  50. let amount = Int(numberFormatter.string(from: amount as NSNumber)!) ?? Int(amount.rounded())
  51. state.addCarbs(amount)
  52. }
  53. label: {
  54. HStack {
  55. Image("carbs", bundle: nil)
  56. .renderingMode(.template)
  57. .resizable()
  58. .frame(width: 24, height: 24)
  59. .foregroundColor(.loopGreen)
  60. Text("Add Carbs ")
  61. }
  62. }
  63. .disabled(amount <= 0)
  64. }.frame(maxHeight: .infinity)
  65. }
  66. .navigationTitle("Add Carbs ")
  67. .onAppear {
  68. amount = Double(state.carbsRequired ?? 0)
  69. }
  70. }
  71. }
  72. struct CarbsView_Previews: PreviewProvider {
  73. static var previews: some View {
  74. let state = WatchStateModel()
  75. state.carbsRequired = 120
  76. return Group {
  77. CarbsView()
  78. CarbsView().previewDevice("Apple Watch Series 5 - 40mm")
  79. CarbsView().previewDevice("Apple Watch Series 3 - 38mm")
  80. }
  81. .environmentObject(state)
  82. }
  83. }