Fix iOS timer widget not displaying active timers

The widget was failing to decode the cached timer data because WidgetTimer
struct didn't match the OngoingTimer JSON structure saved by the app.

Changes:
- Added missing fields (project, createdAt, updatedAt) to WidgetTimer
- Added WidgetProjectReference struct for nested project data
- Fixed project name to use project.name instead of projectId
- Added project color support
- Increased refresh interval from 15 min to 1 min for live updates
This commit is contained in:
2026-02-20 15:49:35 +01:00
parent e0dd2f1fbc
commit 461405c418

View File

@@ -12,6 +12,9 @@ struct WidgetTimer: Codable {
let id: String let id: String
let startTime: String let startTime: String
let projectId: String? let projectId: String?
let project: WidgetProjectReference?
let createdAt: String
let updatedAt: String
var elapsedTime: TimeInterval { var elapsedTime: TimeInterval {
guard let start = ISO8601DateFormatter().date(from: startTime) else { guard let start = ISO8601DateFormatter().date(from: startTime) else {
@@ -21,6 +24,12 @@ struct WidgetTimer: Codable {
} }
} }
struct WidgetProjectReference: Codable {
let id: String
let name: String
let color: String?
}
struct Provider: TimelineProvider { struct Provider: TimelineProvider {
private let appGroupIdentifier = "group.com.timetracker.app" private let appGroupIdentifier = "group.com.timetracker.app"
@@ -41,7 +50,8 @@ struct Provider: TimelineProvider {
func getTimeline(in context: Context, completion: @escaping (Timeline<TimerEntry>) -> Void) { func getTimeline(in context: Context, completion: @escaping (Timeline<TimerEntry>) -> Void) {
let entry = loadTimerEntry() let entry = loadTimerEntry()
let nextUpdate = Calendar.current.date(byAdding: .minute, value: 15, to: Date())! // Update every minute to show live timer countdown
let nextUpdate = Calendar.current.date(byAdding: .minute, value: 1, to: Date())!
let timeline = Timeline(entries: [entry], policy: .after(nextUpdate)) let timeline = Timeline(entries: [entry], policy: .after(nextUpdate))
completion(timeline) completion(timeline)
@@ -63,8 +73,8 @@ struct Provider: TimelineProvider {
return TimerEntry( return TimerEntry(
date: Date(), date: Date(),
timer: timer, timer: timer,
projectName: timer.projectId, projectName: timer.project?.name ?? timer.projectId,
projectColor: nil projectColor: timer.project?.color
) )
} catch { } catch {
return TimerEntry( return TimerEntry(