AlarmSnoozeSection.swift 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // LoopFollow
  2. // AlarmSnoozeSection.swift
  3. // Created by Jonas Björkert on 2025-05-12.
  4. import SwiftUI
  5. struct AlarmSnoozeSection: View {
  6. @Binding var alarm: Alarm
  7. let range: ClosedRange<Int>
  8. let step: Int
  9. private var unitLabel: String { alarm.type.snoozeTimeUnit.label }
  10. private var defaultSnoozeBinding: Binding<Int> {
  11. Binding(
  12. get: { alarm.snoozeDuration },
  13. set: { alarm.snoozeDuration = $0 }
  14. )
  15. }
  16. private var isSnoozed: Binding<Bool> {
  17. Binding(
  18. get: {
  19. if let until = alarm.snoozedUntil, until > Date() { return true }
  20. return false
  21. },
  22. set: { on in
  23. if on {
  24. if alarm.snoozedUntil == nil || alarm.snoozedUntil! < Date() {
  25. let secs = alarm.type.snoozeTimeUnit.seconds
  26. alarm.snoozedUntil = Date()
  27. .addingTimeInterval(Double(alarm.snoozeDuration) * secs)
  28. }
  29. } else {
  30. alarm.snoozedUntil = nil
  31. }
  32. }
  33. )
  34. }
  35. var body: some View {
  36. Section(
  37. header: Text("SNOOZE"),
  38. footer: Text(
  39. "“Default Snooze” controls how long the alert stays quiet after "
  40. + "you press Snooze. Toggle “Snoozed” to mute this alarm right now "
  41. + "until the time below."
  42. )
  43. ) {
  44. Stepper(
  45. value: defaultSnoozeBinding,
  46. in: range,
  47. step: step
  48. ) {
  49. HStack {
  50. Text("Default Snooze:")
  51. Spacer()
  52. Text("\(alarm.snoozeDuration) \(unitLabel)")
  53. .foregroundColor(.secondary)
  54. }
  55. }
  56. Toggle("Snoozed", isOn: isSnoozed)
  57. if isSnoozed.wrappedValue, let until = alarm.snoozedUntil {
  58. DatePicker(
  59. "Until",
  60. selection: Binding(
  61. get: { until },
  62. set: { alarm.snoozedUntil = $0 }
  63. ),
  64. displayedComponents: [.date, .hourAndMinute]
  65. )
  66. }
  67. }
  68. }
  69. }