From 94bf65b7e6b0cb683ea9c952aed86b034d1c8363 Mon Sep 17 00:00:00 2001 From: ivar Date: Mon, 23 Mar 2026 16:47:59 +0100 Subject: feat: implement SolvervDef methods and update widget timeline to refresh at midnight --- Solsnu.Widget/Solsnu_Widget.swift | 45 ++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 13 deletions(-) (limited to 'Solsnu.Widget/Solsnu_Widget.swift') diff --git a/Solsnu.Widget/Solsnu_Widget.swift b/Solsnu.Widget/Solsnu_Widget.swift index 1021db1..980725e 100644 --- a/Solsnu.Widget/Solsnu_Widget.swift +++ b/Solsnu.Widget/Solsnu_Widget.swift @@ -21,13 +21,21 @@ struct Provider: TimelineProvider { func getTimeline(in context: Context, completion: @escaping (Timeline) -> ()) { var entries: [SolvervEntry] = [] let currentDate = Date() - for hourOffset in 0 ..< 5 { - let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)! - let entry = SolvervEntry(def: SolvervDef(date: currentDate)) - entries.append(entry) - } - let timeline = Timeline(entries: entries, policy: .atEnd) + // Single entry for today + let entry = SolvervEntry(def: SolvervDef(date: currentDate)) + entries.append(entry) + + // Calculate next midnight for refresh + let calendar = Calendar.current + var components = calendar.dateComponents([.year, .month, .day], from: currentDate) + components.hour = 0 + components.minute = 0 + components.second = 0 + let todayMidnight = calendar.date(from: components)! + let nextMidnight = calendar.date(byAdding: .day, value: 1, to: todayMidnight)! + + let timeline = Timeline(entries: entries, policy: .after(nextMidnight)) completion(timeline) } } @@ -133,20 +141,31 @@ struct SolvervDef { } extension SolvervDef { - var season: String { - // Will be fully implemented in Task 7 - return "winter" + var season: Season { + guard let next = nextEvent else { return .winter } + return next.season + } + + var nextEvent: SolsticeEvent? { + SolsticeData.shared.nextEvent() } func daysUntilNext() -> Int { - return 0 + guard let next = nextEvent else { return 0 } + return next.daysUntil() } func progressRatio() -> Double { - return 0.0 + guard let progress = SolsticeData.shared.progressToNextEvent() else { return 0.0 } + let ratio = Double(progress.elapsed) / Double(progress.total) + return max(0, min(1.0, ratio)) + } + + func upcomingEventsPreview(count: Int) -> [SolsticeEvent] { + SolsticeData.shared.upcomingEvents(count: count) } - func upcomingEventsPreview(count: Int) -> [String] { - return [] + static var preview: SolvervDef { + SolvervDef(date: Date()) } } -- cgit v1.3