import Foundation import WidgetKit /// Liest WidgetSnapshot aus dem shared App-Group-Container und schneidet /// eine Timeline mit 30-Minuten-Refresh. Haupt-App ruft zusätzlich nach /// jedem Refresh `WidgetCenter.shared.reloadAllTimelines()` auf, dann ist /// das Update sofort sichtbar. struct DueEntry: TimelineEntry, Sendable { let date: Date let totalDueCount: Int let topDecks: [WidgetSnapshot.Entry] let isPlaceholder: Bool static let placeholder = DueEntry( date: .now, totalDueCount: 0, topDecks: [], isPlaceholder: true ) } struct DueProvider: TimelineProvider { func placeholder(in _: Context) -> DueEntry { .placeholder } func getSnapshot(in _: Context, completion: @escaping @Sendable (DueEntry) -> Void) { completion(loadEntry()) } func getTimeline(in _: Context, completion: @escaping @Sendable (Timeline) -> Void) { let entry = loadEntry() let next = Calendar.current.date(byAdding: .minute, value: 30, to: .now) ?? .now completion(Timeline(entries: [entry], policy: .after(next))) } private func loadEntry() -> DueEntry { guard let snapshot = WidgetSnapshotStore.read() else { return .placeholder } return DueEntry( date: snapshot.updatedAt, totalDueCount: snapshot.totalDueCount, topDecks: snapshot.topDecks, isPlaceholder: false ) } }