| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- // LoopFollow
- // AlarmSnoozeSection.swift
- // Created by Jonas Björkert on 2025-05-12.
- import SwiftUI
- struct AlarmSnoozeSection: View {
- @Binding var alarm: Alarm
- let range: ClosedRange<Int>
- let step: Int
- private var unitLabel: String { alarm.type.snoozeTimeUnit.label }
- private var defaultSnoozeBinding: Binding<Int> {
- Binding(
- get: { alarm.snoozeDuration },
- set: { alarm.snoozeDuration = $0 }
- )
- }
- private var isSnoozed: Binding<Bool> {
- Binding(
- get: {
- if let until = alarm.snoozedUntil, until > Date() { return true }
- return false
- },
- set: { on in
- if on {
- if alarm.snoozedUntil == nil || alarm.snoozedUntil! < Date() {
- let secs = alarm.type.snoozeTimeUnit.seconds
- alarm.snoozedUntil = Date()
- .addingTimeInterval(Double(alarm.snoozeDuration) * secs)
- }
- } else {
- alarm.snoozedUntil = nil
- }
- }
- )
- }
- var body: some View {
- Section(
- header: Text("SNOOZE"),
- footer: Text(
- "“Default Snooze” controls how long the alert stays quiet after "
- + "you press Snooze. Toggle “Snoozed” to mute this alarm right now "
- + "until the time below."
- )
- ) {
- Stepper(
- value: defaultSnoozeBinding,
- in: range,
- step: step
- ) {
- HStack {
- Text("Default Snooze:")
- Spacer()
- Text("\(alarm.snoozeDuration) \(unitLabel)")
- .foregroundColor(.secondary)
- }
- }
- Toggle("Snoozed", isOn: isSnoozed)
- if isSnoozed.wrappedValue, let until = alarm.snoozedUntil {
- DatePicker(
- "Until",
- selection: Binding(
- get: { until },
- set: { alarm.snoozedUntil = $0 }
- ),
- displayedComponents: [.date, .hourAndMinute]
- )
- }
- }
- }
- }
|