Bars widget: app-driven "Track Countdown" with zero config (KC-20)
- Task long-press menu gains Track/Stop Tracking Countdown, storing the tracked event id + tracking date in the App Group (CountdownTracker) and reloading widget timelines. - The widget reads the tracked event directly and bypasses its config: Mode A (one-off) = tracking date -> event date; Mode B (recurring) = previous occurrence -> next occurrence via the task's recurrence rule. - WidgetTask decodes isRecurring/recurrenceLabel from the shared JSON. - With nothing tracked, the configured modes remain the fallback. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -10,6 +10,8 @@ struct WidgetTask: Codable, Identifiable {
|
||||
let isComplete: Bool
|
||||
let quadrant: String // raw value of Quadrant enum
|
||||
let category: String
|
||||
var isRecurring: Bool = false
|
||||
var recurrenceLabel: String? = nil
|
||||
|
||||
// Days remaining until due date
|
||||
var daysLeft: Int? {
|
||||
@@ -60,7 +62,8 @@ func loadWidgetTasks() -> [WidgetTask] {
|
||||
else { return [] }
|
||||
return raw.map {
|
||||
WidgetTask(id: $0.id, title: $0.title, dueDate: $0.dueDate,
|
||||
isComplete: $0.isComplete, quadrant: $0.quadrant, category: $0.category)
|
||||
isComplete: $0.isComplete, quadrant: $0.quadrant, category: $0.category,
|
||||
isRecurring: $0.isRecurring ?? false, recurrenceLabel: $0.recurrenceLabel)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,8 +75,10 @@ private struct RawTask: Codable {
|
||||
var isComplete: Bool = false
|
||||
var quadrant: String = "Urgent + Important"
|
||||
var category: String = "reminder"
|
||||
var isRecurring: Bool? = nil
|
||||
var recurrenceLabel: String? = nil
|
||||
enum CodingKeys: String, CodingKey {
|
||||
case id, title, dueDate, isComplete, quadrant, category
|
||||
case id, title, dueDate, isComplete, quadrant, category, isRecurring, recurrenceLabel
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user