summaryrefslogtreecommitdiffstats
path: root/Solsnu.Widget/Solsnu_Widget.swift
diff options
context:
space:
mode:
authorivar <i@oiee.no>2026-03-24 00:08:56 +0100
committerivar <i@oiee.no>2026-03-24 00:08:56 +0100
commit0b9bfd04af48af213fc139781e8cb5ca5be1d439 (patch)
tree3e9938297d7ca1b5197257b3d08303189243a8f7 /Solsnu.Widget/Solsnu_Widget.swift
parent8395dc01bd38e49d98f00d051e60ee9dbcc6a8f1 (diff)
downloadsolverv-0b9bfd04af48af213fc139781e8cb5ca5be1d439.tar.xz
solverv-0b9bfd04af48af213fc139781e8cb5ca5be1d439.zip
feat: add sunrise/sunset properties to SolvervDef
Diffstat (limited to 'Solsnu.Widget/Solsnu_Widget.swift')
-rw-r--r--Solsnu.Widget/Solsnu_Widget.swift86
1 files 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<SolvervEntry>) -> ()) {
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)
}
}