SnoozerView.swift 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. //
  2. // SnoozerView.swift
  3. // LoopFollow
  4. //
  5. // Created by Jonas Björkert on 2025-04-26.
  6. // Copyright © 2025 Jon Fawcett. All rights reserved.
  7. //
  8. import SwiftUI
  9. import Combine
  10. struct SnoozerView: View {
  11. @ObservedObject var bg = Observable.shared.bgValue
  12. @ObservedObject var trend = Observable.shared.trendArrow
  13. @ObservedObject var delta = Observable.shared.delta
  14. @ObservedObject var minutesAgo = Observable.shared.minutesAgo
  15. @ObservedObject var alarmTitle = Observable.shared.alarmTitle
  16. @State private var snoozeMinutes = 10
  17. @State private var currentTime = Date()
  18. private let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
  19. var bgColor: Color {
  20. switch bg.value {
  21. case ..<4.0:
  22. return .red
  23. case 4.0..<10:
  24. return .yellow
  25. default:
  26. return .blue
  27. }
  28. }
  29. var body: some View {
  30. VStack(spacing: 20) {
  31. Text(String(format: "%.1f", bg.value).replacingOccurrences(of: ".", with: ","))
  32. .font(.system(size: 100, weight: .bold))
  33. .foregroundColor(bgColor)
  34. Text(trend.value)
  35. .font(.system(size: 40))
  36. Text(String(format: "%+.1f", delta.value))
  37. .font(.title2)
  38. Text("\(minutesAgo.value) min ago")
  39. .font(.subheadline)
  40. Text(currentTimeFormatted)
  41. .font(.largeTitle)
  42. .onReceive(timer) { _ in currentTime = Date() }
  43. if let alarm = alarmTitle.value {
  44. Text(alarm)
  45. .font(.title2)
  46. .foregroundColor(.red)
  47. .padding(.top)
  48. Stepper("Snooze for \(snoozeMinutes) min", value: $snoozeMinutes, in: 5...60, step: 5)
  49. .padding(.horizontal)
  50. Button("Snooze") {
  51. // Call snooze logic
  52. print("Snoozing \(alarm) for \(snoozeMinutes) minutes")
  53. }
  54. .padding()
  55. .background(Color.gray.opacity(0.3))
  56. .cornerRadius(10)
  57. }
  58. }
  59. .padding()
  60. .background(Color.black)
  61. .foregroundColor(.white)
  62. .ignoresSafeArea()
  63. }
  64. private var currentTimeFormatted: String {
  65. let formatter = DateFormatter()
  66. formatter.dateFormat = "HH:mm"
  67. return formatter.string(from: currentTime)
  68. }
  69. }