AlarmSnoozeSection.swift 2.3 KB

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