diff --git a/AltWidget/AltWidget.swift b/AltWidget/AltWidget.swift index 8c75dffb..59768eda 100644 --- a/AltWidget/AltWidget.swift +++ b/AltWidget/AltWidget.swift @@ -85,11 +85,6 @@ struct Provider: IntentTimelineProvider func getTimeline(for configuration: ViewAppIntent, in context: Context, completion: @escaping (Timeline) -> Void) { self.prepare { (result) in autoreleasepool { - let currentDate = Calendar.current.startOfDay(for: Date()) - let nextRefreshDate = Calendar.current.date(byAdding: .day, value: 1, to: currentDate) ?? currentDate.addingTimeInterval(1 * 60 * 60 * 24) - - let timeline: Timeline - do { let context = try result.get() @@ -107,38 +102,46 @@ struct Provider: IntentTimelineProvider installedApp = InstalledApp.fetchAltStore(in: context) } - guard let snapshot = installedApp.map(AppSnapshot.init) else { throw ALTError(.invalidApp) } + let snapshot = installedApp.map(AppSnapshot.init) + + var entries: [AppEntry] = [] // Generate a timeline consisting of one entry per day. - let numberOfDays = snapshot.expirationDate.numberOfCalendarDays(since: currentDate) - if numberOfDays >= 0 + + if let snapshot = snapshot { - let entries = (0 ..< min(numberOfDays, 7)).compactMap { dayOffset -> AppEntry? in - guard let entryDate = Calendar.current.date(byAdding: .day, value: dayOffset, to: currentDate) else { return nil } - - let score = Float(dayOffset + 1) / Float(numberOfDays) - - let entry = AppEntry(date: entryDate, relevance: TimelineEntryRelevance(score: score), app: snapshot) - return entry - } + let currentDate = Calendar.current.startOfDay(for: Date()) + let numberOfDays = snapshot.expirationDate.numberOfCalendarDays(since: currentDate) - timeline = Timeline(entries: entries, policy: .atEnd) - } - else - { - let entry = AppEntry(date: Date(), app: snapshot) - timeline = Timeline(entries: [entry], policy: .after(nextRefreshDate)) + if numberOfDays >= 0 + { + for dayOffset in 0 ..< min(numberOfDays, 7) + { + guard let entryDate = Calendar.current.date(byAdding: .day, value: dayOffset, to: currentDate) else { continue } + + let score = Float(dayOffset + 1) / Float(numberOfDays) + let entry = AppEntry(date: entryDate, relevance: TimelineEntryRelevance(score: score), app: snapshot) + entries.append(entry) + } + } + else + { + let entry = AppEntry(date: Date(), app: snapshot) + entries.append(entry) + } } + + let timeline = Timeline(entries: entries, policy: .atEnd) + completion(timeline) } catch { print("Error preparing widget timeline:", error) let entry = AppEntry(date: Date(), app: nil) - timeline = Timeline(entries: [entry], policy: .after(nextRefreshDate)) + let timeline = Timeline(entries: [entry], policy: .atEnd) + completion(timeline) } - - completion(timeline) } } }