chore(repo): iOS-App als ios/ ins Hauptrepo uebernehmen
Calendarr-IOS wird mit vollstaendiger Historie als Unterverzeichnis ios/ eingebunden. Damit liegen Server, Web, Android und iOS in einem gemeinsamen Repo. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
import WidgetKit
|
||||
import AppIntents
|
||||
import CalendarrCore
|
||||
|
||||
struct CalendarrEntry: TimelineEntry {
|
||||
let date: Date
|
||||
let snapshot: WidgetSnapshot?
|
||||
}
|
||||
|
||||
struct CalendarrTimelineProvider: AppIntentTimelineProvider {
|
||||
typealias Entry = CalendarrEntry
|
||||
typealias Intent = CalendarSelectionIntent
|
||||
|
||||
func placeholder(in context: Context) -> CalendarrEntry {
|
||||
CalendarrEntry(date: .now, snapshot: WidgetStore.read())
|
||||
}
|
||||
|
||||
func snapshot(for configuration: CalendarSelectionIntent, in context: Context) async -> CalendarrEntry {
|
||||
let raw = WidgetStore.read()
|
||||
return CalendarrEntry(date: .now, snapshot: filtered(raw, by: configuration))
|
||||
}
|
||||
|
||||
func timeline(for configuration: CalendarSelectionIntent, in context: Context) async -> Timeline<CalendarrEntry> {
|
||||
let raw = WidgetStore.read()
|
||||
let snap = filtered(raw, by: configuration)
|
||||
let now = Date()
|
||||
|
||||
// One entry per hour for 24 h so the widget re-renders as time advances.
|
||||
var entries: [CalendarrEntry] = []
|
||||
for h in 0..<24 {
|
||||
let date = Calendar.current.date(byAdding: .hour, value: h, to: now) ?? now
|
||||
entries.append(CalendarrEntry(date: date, snapshot: snap))
|
||||
}
|
||||
let refreshAt = Calendar.current.date(byAdding: .minute, value: 30, to: now) ?? now
|
||||
return Timeline(entries: entries, policy: .after(refreshAt))
|
||||
}
|
||||
|
||||
// MARK: – Filtering
|
||||
|
||||
private func filtered(_ snapshot: WidgetSnapshot?, by config: CalendarSelectionIntent) -> WidgetSnapshot? {
|
||||
// The rule lives in CalendarrCore so the watch provider cannot drift
|
||||
// from this one. Nothing selected means "show all calendars".
|
||||
snapshot?.filtered(toCalendarKeys: Set((config.selectedCalendars ?? []).map(\.id)))
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: – Shared helpers used by all widget views
|
||||
|
||||
enum WidgetHelpers {
|
||||
static func events(for day: Date, in snapshot: WidgetSnapshot) -> [WidgetEvent] {
|
||||
let cal = Calendar.current
|
||||
let dayStart = cal.startOfDay(for: day)
|
||||
let dayEnd = cal.date(byAdding: .day, value: 1, to: dayStart) ?? dayStart
|
||||
return snapshot.events
|
||||
.filter { $0.start < dayEnd && $0.end > dayStart }
|
||||
.sorted { $0.start < $1.start }
|
||||
}
|
||||
|
||||
static func upcoming(from now: Date, daysAhead: Int, in snapshot: WidgetSnapshot) -> [WidgetEvent] {
|
||||
let cal = Calendar.current
|
||||
let end = cal.date(byAdding: .day, value: daysAhead, to: cal.startOfDay(for: now)) ?? now
|
||||
return snapshot.events
|
||||
.filter { $0.end > now && $0.start < end }
|
||||
.sorted { $0.start < $1.start }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user