diff --git a/Packages/OnyxKit/Sources/CalendarProvider/CalendarWidget.swift b/Packages/OnyxKit/Sources/CalendarProvider/CalendarWidget.swift index 5e6f617..7f67b99 100644 --- a/Packages/OnyxKit/Sources/CalendarProvider/CalendarWidget.swift +++ b/Packages/OnyxKit/Sources/CalendarProvider/CalendarWidget.swift @@ -56,6 +56,8 @@ public final class CalendarModel { private var refreshTask: Task? /// `nil` = nicht auf Calendarr-Änderungen angemeldet. private var calendarrObserver: DarwinObserver? + /// Das Sicherheitsnetz unter der Benachrichtigung. + private var calendarrTimer: Timer? public init(appleSource: CalendarSource = EventKitSource(), calendarrSource: CalendarSource = CalendarrSource(), @@ -108,6 +110,21 @@ public final class CalendarModel { Task { @MainActor in self?.refresh() } } : nil + + // Dazu ein Blick alle zwei Minuten. + // + // Die Benachrichtigung ist der schnelle Weg, aber sie ist flüchtig: + // schreibt Calendarr, während Onyx nicht läuft oder gerade startet, + // kommt sie nie an — und dann steht der Schnappschuss so lange still, + // bis Calendarr das nächste Mal schreibt. Das Nachsehen kostet das + // Einlesen einer Datei von wenigen Kilobyte; das ist billiger als eine + // Terminliste, die aus unerfindlichen Gründen von gestern ist. + calendarrTimer?.invalidate() + calendarrTimer = wanted + ? Timer.scheduledTimer(withTimeInterval: 120, repeats: true) { _ in + MainActor.assumeIsolated { [weak self] in self?.refresh() } + } + : nil } /// Fragt die Berechtigung an und lädt bei Erfolg gleich.