From 32cb2004087393204e3164db8640fd99e42ebf99 Mon Sep 17 00:00:00 2001 From: Simon Franken Date: Fri, 20 Feb 2026 15:49:35 +0100 Subject: [PATCH] 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 --- .../TimeTracker/TimeTracker.entitlements | 4 +++- .../TimeTrackerWidget.entitlements | 4 +++- .../TimeTrackerWidget/TimeTrackerWidget.swift | 16 +++++++++++++--- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/ios/TimeTracker/TimeTracker/TimeTracker.entitlements b/ios/TimeTracker/TimeTracker/TimeTracker.entitlements index 2eb7e33..3576be9 100644 --- a/ios/TimeTracker/TimeTracker/TimeTracker.entitlements +++ b/ios/TimeTracker/TimeTracker/TimeTracker.entitlements @@ -3,6 +3,8 @@ com.apple.security.application-groups - + + group.com.timetracker.app + diff --git a/ios/TimeTracker/TimeTrackerWidget/TimeTrackerWidget.entitlements b/ios/TimeTracker/TimeTrackerWidget/TimeTrackerWidget.entitlements index 2eb7e33..3576be9 100644 --- a/ios/TimeTracker/TimeTrackerWidget/TimeTrackerWidget.entitlements +++ b/ios/TimeTracker/TimeTrackerWidget/TimeTrackerWidget.entitlements @@ -3,6 +3,8 @@ com.apple.security.application-groups - + + group.com.timetracker.app + diff --git a/ios/TimeTracker/TimeTrackerWidget/TimeTrackerWidget.swift b/ios/TimeTracker/TimeTrackerWidget/TimeTrackerWidget.swift index d8d4cb7..c8d2209 100644 --- a/ios/TimeTracker/TimeTrackerWidget/TimeTrackerWidget.swift +++ b/ios/TimeTracker/TimeTrackerWidget/TimeTrackerWidget.swift @@ -12,6 +12,9 @@ struct WidgetTimer: Codable { let id: String let startTime: String let projectId: String? + let project: WidgetProjectReference? + let createdAt: String + let updatedAt: String var elapsedTime: TimeInterval { 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 { private let appGroupIdentifier = "group.com.timetracker.app" @@ -41,7 +50,8 @@ struct Provider: TimelineProvider { func getTimeline(in context: Context, completion: @escaping (Timeline) -> Void) { 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)) completion(timeline) @@ -63,8 +73,8 @@ struct Provider: TimelineProvider { return TimerEntry( date: Date(), timer: timer, - projectName: timer.projectId, - projectColor: nil + projectName: timer.project?.name ?? timer.projectId, + projectColor: timer.project?.color ) } catch { return TimerEntry(