Per-event reminders (multiple, local calendars only) in the editor, prefilled from a new "default reminder" setting that applies to all events otherwise. CalEvent gains `reminders`; AppSettings/SettingsSync sync default_reminder_minutes (always group). New NotificationScheduler requests permission and schedules the soonest ≤60 upcoming reminders via UNUserNotificationCenter, rescheduling on load/sync/edit and when the default changes (skipped in group overlay). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
38 lines
1.8 KiB
Swift
38 lines
1.8 KiB
Swift
import Foundation
|
|
|
|
/// Reminder offset options (minutes before an event's start; 0 = at start) and
|
|
/// their localized labels. Shared by the event editor, the settings default
|
|
/// picker, and the notification scheduler so the choices stay consistent.
|
|
enum ReminderOptions {
|
|
/// Selectable offsets in minutes-before-start.
|
|
static let all: [Int] = [0, 5, 10, 15, 30, 60, 120, 1440, 2880]
|
|
|
|
private static func isEnglish(_ appLang: String) -> Bool {
|
|
if appLang == "en" { return true }
|
|
if appLang == "de" { return false }
|
|
return (Locale.current.language.languageCode?.identifier ?? "de").hasPrefix("en")
|
|
}
|
|
|
|
static func label(_ minutes: Int, _ appLang: String) -> String {
|
|
let en = isEnglish(appLang)
|
|
if minutes <= 0 { return en ? "At start time" : "Zur Startzeit" }
|
|
if minutes < 60 { return en ? "\(minutes) min before" : "\(minutes) Min. vorher" }
|
|
if minutes < 1440 {
|
|
let h = minutes / 60
|
|
return en ? "\(h) h before" : "\(h) Std. vorher"
|
|
}
|
|
let d = minutes / 1440
|
|
return en ? "\(d) day\(d == 1 ? "" : "s") before" : "\(d) Tag\(d == 1 ? "" : "e") vorher"
|
|
}
|
|
|
|
static func sectionTitle(_ l: String) -> String { isEnglish(l) ? "Reminders" : "Benachrichtigungen" }
|
|
static func addLabel(_ l: String) -> String { isEnglish(l) ? "Add reminder" : "Benachrichtigung hinzufügen" }
|
|
static func off(_ l: String) -> String { isEnglish(l) ? "Off" : "Aus" }
|
|
static func defaultTitle(_ l: String) -> String { isEnglish(l) ? "Default reminder" : "Standardbenachrichtigung" }
|
|
static func defaultFooter(_ l: String) -> String {
|
|
isEnglish(l)
|
|
? "Applies to all events unless an event has its own reminders."
|
|
: "Gilt für alle Termine, sofern ein Termin keine eigenen Benachrichtigungen hat."
|
|
}
|
|
}
|