CarbsView.swift 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. state.addCarbs(Int(amount))
  50. }
  51. label: {
  52. HStack {
  53. Image("carbs", bundle: nil)
  54. .renderingMode(.template)
  55. .resizable()
  56. .frame(width: 24, height: 24)
  57. .foregroundColor(.loopGreen)
  58. Text("Add Carbs ")
  59. }
  60. }
  61. .disabled(amount <= 0)
  62. }.frame(maxHeight: .infinity)
  63. }
  64. .navigationTitle("Add Carbs ")
  65. .onAppear {
  66. amount = Double(state.carbsRequired ?? 0)
  67. }
  68. }
  69. }
  70. struct CarbsView_Previews: PreviewProvider {
  71. static var previews: some View {
  72. let state = WatchStateModel()
  73. state.carbsRequired = 120
  74. return Group {
  75. CarbsView()
  76. CarbsView().previewDevice("Apple Watch Series 5 - 40mm")
  77. CarbsView().previewDevice("Apple Watch Series 3 - 38mm")
  78. }
  79. .environmentObject(state)
  80. }
  81. }