AlarmEditorFields.swift 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. //
  2. // AlarmEditorFields.swift
  3. // LoopFollow
  4. //
  5. // Created by Jonas Björkert on 2025-04-21.
  6. // Copyright © 2025 Jon Fawcett. All rights reserved.
  7. //
  8. import SwiftUI
  9. struct AlarmGeneralSection: View {
  10. @Binding var alarm: Alarm
  11. var body: some View {
  12. Section(header: Text("General")) {
  13. HStack {
  14. Text("Name")
  15. TextField("Alarm Name", text: $alarm.name)
  16. .multilineTextAlignment(.trailing)
  17. .textFieldStyle(.plain)
  18. }
  19. Toggle("Enabled", isOn: $alarm.isEnabled)
  20. }
  21. }
  22. }
  23. struct AlarmSnoozeSection: View {
  24. let title: String
  25. let range: ClosedRange<Double>
  26. let step: Double
  27. let unitLabel: String
  28. @Binding var value: Double
  29. var body: some View {
  30. Section(
  31. header: Text(title),
  32. footer: Text("How long to snooze after firing \(Int(range.lowerBound))–\(Int(range.upperBound)) \(unitLabel)")
  33. ) {
  34. Stepper(
  35. "\(title): \(Int(value)) \(unitLabel)",
  36. value: $value,
  37. in: range,
  38. step: step
  39. )
  40. }
  41. }
  42. }
  43. struct AlarmSnoozedUntilSection: View {
  44. @Binding var alarm: Alarm
  45. private var isSnoozed: Binding<Bool> {
  46. Binding(
  47. get: {
  48. if let until = alarm.snoozedUntil, until > Date() {
  49. return true
  50. }
  51. return false
  52. },
  53. set: { on in
  54. if on {
  55. // keep existing future snooze or set default ahead
  56. if let until = alarm.snoozedUntil, until > Date() {
  57. alarm.snoozedUntil = until
  58. } else {
  59. let secs = alarm.type.timeUnit.seconds
  60. alarm.snoozedUntil = Date().addingTimeInterval(Double(alarm.snoozeDuration) * secs)
  61. }
  62. } else {
  63. alarm.snoozedUntil = nil
  64. }
  65. }
  66. )
  67. }
  68. var body: some View {
  69. Section(header: Text("Snoozed Until")) {
  70. Toggle("Snoozed", isOn: isSnoozed)
  71. if isSnoozed.wrappedValue, let until = alarm.snoozedUntil {
  72. DatePicker("Until", selection: Binding(
  73. get: { until },
  74. set: { alarm.snoozedUntil = $0 }
  75. ), displayedComponents: [.date, .hourAndMinute])
  76. }
  77. }
  78. }
  79. }