Add reminder notifications to schedules

- ScheduleDocument/Schedule gain optional reminderMinutes (minutes from
  midnight; decode-compatible, no schema bump)
- New Workout form gets a Reminder section (toggle + time picker, hidden
  for Now; footer warns when notifications are denied)
- ReminderPlanner (pure, tested) derives notification triggers: daily
  repeating, per-weekday repeating for fixed days, one-shot for once
- ReminderScheduler resyncs pending requests from the cache on every
  change, multiplexed onto onCacheChanged after the watch push; asks
  notification permission only once a reminder actually exists
This commit is contained in:
2026-07-11 12:32:08 -04:00
parent df07e0a043
commit 5ec5de9295
10 changed files with 440 additions and 3 deletions
+4 -1
View File
@@ -318,13 +318,15 @@ final class Schedule {
var recurrenceRaw: String = ScheduleRecurrence.daily.rawValue
var weekdays: [Int]?
var date: Date?
/// Reminder time as minutes from midnight (local wall-clock); nil = no reminder.
var reminderMinutes: Int?
var order: Int = 0
var createdAt: Date = Date()
var updatedAt: Date = Date()
var jsonRelativePath: String = ""
init(id: String, routineID: String, routineName: String, goalRaw: String?,
recurrenceRaw: String, weekdays: [Int]?, date: Date? = nil,
recurrenceRaw: String, weekdays: [Int]?, date: Date? = nil, reminderMinutes: Int? = nil,
order: Int, createdAt: Date, updatedAt: Date, jsonRelativePath: String) {
self.id = id
self.routineID = routineID
@@ -333,6 +335,7 @@ final class Schedule {
self.recurrenceRaw = recurrenceRaw
self.weekdays = weekdays
self.date = date
self.reminderMinutes = reminderMinutes
self.order = order
self.createdAt = createdAt
self.updatedAt = updatedAt