From 0b9bfd04af48af213fc139781e8cb5ca5be1d439 Mon Sep 17 00:00:00 2001 From: ivar Date: Tue, 24 Mar 2026 00:08:56 +0100 Subject: feat: add sunrise/sunset properties to SolvervDef --- Solsnu.Widget/Solsnu_Widget.swift | 86 +++++++++++++-------------------------- 1 file changed, 28 insertions(+), 58 deletions(-) diff --git a/Solsnu.Widget/Solsnu_Widget.swift b/Solsnu.Widget/Solsnu_Widget.swift index 78ad05b..aeadf64 100644 --- a/Solsnu.Widget/Solsnu_Widget.swift +++ b/Solsnu.Widget/Solsnu_Widget.swift @@ -21,12 +21,8 @@ struct Provider: TimelineProvider { func getTimeline(in context: Context, completion: @escaping (Timeline) -> ()) { var entries: [SolvervEntry] = [] let currentDate = Date() - - // 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 @@ -42,27 +38,11 @@ struct Provider: TimelineProvider { struct SolvervEntry: TimelineEntry { let date: Date - let emoji: String let def: SolvervDef init(def: SolvervDef, date: Date? = nil) { self.date = date ?? def.date - self.emoji = def.emoji() - self.def = def; - } -} - -struct Solsnu_WidgetEntryView : View { - var entry: Provider.Entry - - var body: some View { - VStack { - Text("Time:") - Text(entry.date, style: .time) - - Text("Emoji:") - Text(entry.emoji) - } + self.def = def } } @@ -71,73 +51,63 @@ struct Solsnu_Widget: Widget { var body: some WidgetConfiguration { StaticConfiguration(kind: kind, provider: Provider()) { entry in - if #available(iOS 17.0, *) { - SmallWidgetView(entry: entry) - .containerBackground(.fill.tertiary, for: .widget) - } else { SmallWidgetView(entry: entry) - .padding() - .background() - } } + .contentMarginsDisabled() .configurationDisplayName("Solstice Countdown") .description("Days until next solstice or equinox") - .supportedFamilies([.systemSmall]) + .supportedFamilies([.systemSmall,.systemMedium]) } } #Preview(as: .systemSmall) { Solsnu_Widget() } timeline: { - SolvervEntry(def: SolvervDef(utcString: "2025-09-22 18:20:00")) - SolvervEntry(def: SolvervDef(utcString: "2025-12-21 15:03:00")) SolvervEntry(def: SolvervDef(utcString: "2026-03-20 14:46:00")) SolvervEntry(def: SolvervDef(utcString: "2026-06-21 08:25:00")) SolvervEntry(def: SolvervDef(utcString: "2026-09-23 00:06:00")) SolvervEntry(def: SolvervDef(utcString: "2026-12-21 20:50:00")) - SolvervEntry(def: SolvervDef(utcString: "2027-03-20 20:25:00")) - SolvervEntry(def: SolvervDef(utcString: "2027-06-21 14:11:00")) - SolvervEntry(def: SolvervDef(utcString: "2027-09-23 06:02:00")) - SolvervEntry(def: SolvervDef(utcString: "2027-12-22 02:43:00")) - SolvervEntry(def: SolvervDef(utcString: "2028-03-20 02:17:00")) - SolvervEntry(def: SolvervDef(utcString: "2028-06-20 20:02:00")) - SolvervEntry(def: SolvervDef(utcString: "2028-09-22 11:45:00")) - SolvervEntry(def: SolvervDef(utcString: "2028-12-21 08:20:00")) - SolvervEntry(def: SolvervDef(utcString: "2029-03-20 08:01:00")) - SolvervEntry(def: SolvervDef(utcString: "2029-06-21 01:48:00")) - SolvervEntry(def: SolvervDef(utcString: "2029-09-22 17:37:00")) - SolvervEntry(def: SolvervDef(utcString: "2029-12-21 14:14:00")) - SolvervEntry(def: SolvervDef(utcString: "2030-03-20 13:51:00")) - SolvervEntry(def: SolvervDef(utcString: "2030-06-21 07:31:00")) - SolvervEntry(def: SolvervDef(utcString: "2030-09-22 23:27:00")) - SolvervEntry(def: SolvervDef(utcString: "2030-12-21 20:09:00")) } struct SolvervDef { let date: Date; + let bg: String; + let sunriseTime: Date?; + let sunsetTime: Date?; - init(date:Date) { + init(date: Date, sunriseTime: Date? = nil, sunsetTime: Date? = nil) { self.date = date; + self.sunriseTime = sunriseTime; + self.sunsetTime = sunsetTime; + self.bg = "smallbg"; } - init(utcString:String) { + init(utcString: String, sunriseTime: Date? = nil, sunsetTime: Date? = nil) { let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" formatter.timeZone = TimeZone(abbreviation: "UTC") // Should probably guard this, but not now let date = formatter.date(from: utcString)! self.date = date + self.sunriseTime = sunriseTime + self.sunsetTime = sunsetTime + self.bg = "smallbg" } - func emoji() -> String { - let components = Calendar.current.dateComponents([.year,.month,.day,.hour,.minute], from: date) - let hour = components.hour! - let minute = components.minute! - if hour == 2 && minute == 43 { - return "😀" - } else { - return "" - } + var sunriseFormatted: String { + guard let time = sunriseTime else { return "" } + let formatter = DateFormatter() + formatter.dateFormat = "HH:mm" + formatter.timeZone = TimeZone.current + return formatter.string(from: time) + } + + var sunsetFormatted: String { + guard let time = sunsetTime else { return "" } + let formatter = DateFormatter() + formatter.dateFormat = "HH:mm" + formatter.timeZone = TimeZone.current + return formatter.string(from: time) } } -- cgit v1.3