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
+3 -2
View File
@@ -92,7 +92,7 @@ extension ScheduleDocument {
routineID: schedule.routineID, routineName: schedule.routineName,
goal: schedule.goalRaw, recurrence: schedule.recurrenceRaw,
weekdays: schedule.weekdays,
date: schedule.date,
date: schedule.date, reminderMinutes: schedule.reminderMinutes,
order: schedule.order, createdAt: schedule.createdAt, updatedAt: schedule.updatedAt)
}
}
@@ -255,7 +255,7 @@ enum CacheMapper {
} else {
schedule = Schedule(id: doc.id, routineID: doc.routineID, routineName: doc.routineName,
goalRaw: doc.goal, recurrenceRaw: doc.recurrence, weekdays: doc.weekdays,
date: doc.date, order: doc.order,
date: doc.date, reminderMinutes: doc.reminderMinutes, order: doc.order,
createdAt: doc.createdAt, updatedAt: doc.updatedAt,
jsonRelativePath: relativePath)
context.insert(schedule)
@@ -266,6 +266,7 @@ enum CacheMapper {
schedule.recurrenceRaw = doc.recurrence
schedule.weekdays = doc.weekdays
schedule.date = doc.date
schedule.reminderMinutes = doc.reminderMinutes
schedule.order = doc.order
schedule.createdAt = doc.createdAt
schedule.updatedAt = doc.updatedAt