diff options
| author | ivar <i@oiee.no> | 2026-03-23 16:47:59 +0100 |
|---|---|---|
| committer | ivar <i@oiee.no> | 2026-03-23 16:47:59 +0100 |
| commit | 94bf65b7e6b0cb683ea9c952aed86b034d1c8363 (patch) | |
| tree | 6158072e01f9ffe2dd8754e9b136f8978bb11d6e /Solsnu.Widget/Solsnu_Widget.swift | |
| parent | e45dd001f178a640e1f799616868accb4254c313 (diff) | |
| download | solverv-94bf65b7e6b0cb683ea9c952aed86b034d1c8363.tar.xz solverv-94bf65b7e6b0cb683ea9c952aed86b034d1c8363.zip | |
feat: implement SolvervDef methods and update widget timeline to refresh at midnight
Diffstat (limited to 'Solsnu.Widget/Solsnu_Widget.swift')
| -rw-r--r-- | Solsnu.Widget/Solsnu_Widget.swift | 45 |
1 files changed, 32 insertions, 13 deletions
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<Entry>) -> ()) { 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()) } } |
