watch: el dia de hoy se resuelve al pintar, no al generar el envio

El iPhone marcaba isToday al construir el snapshot y el reloj se creia esa
marca para siempre. Como el snapshot sobrevive en el app group, un sabado
seguia enseñando la cena del miercoles: el dia que era cuando se genero.

Ahora cada dia viaja con su fecha real y el reloj busca hoy cuando dibuja. Si
el snapshot es de otra semana no hay "hoy" que enseñar, asi que en vez de
colar la comida de otro dia lo dice y pide abrir el iPhone. Para snapshots
guardados por versiones anteriores, que no traen fecha, solo se confia en el
indice del dia mientras el propio snapshot sea de esta semana.

Ademas el reloj pide datos al abrirse y el iPhone, en vez de responder con lo
ultimo que cacheo, reconstruye la semana desde el store — que es la otra mitad
del "no se actualiza": el cache podia ser de hace dias.

Y cuando no hay nada planificado se dice, que antes era un guion indistinguible
de una comida marcada como no planificada: "Hoy no hay nada planificado" para
el dia entero y "Sin planificar" por comida, en los 6 idiomas (el bundle del
reloj no tiene cadenas propias, viajan en el envio).

Refs #34, #35

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013su1ttRiMeMYxkZJ1Y3246
This commit is contained in:
alexandrev-tibco
2026-09-12 13:21:21 +02:00
parent d8345a5b20
commit a049e4f74b
16 changed files with 404 additions and 19 deletions
@@ -33,10 +33,10 @@ struct TodayProvider: TimelineProvider {
completion(Timeline(entries: [entry], policy: .after(nextMidnight)))
}
/// nil when the stored snapshot is from another week the complication
/// then shows its empty state instead of last week's dinner.
private var currentDay: WatchWeekPayload.Day? {
guard let payload = WatchWeekPayload.stored() else { return nil }
let todayOffset = (Calendar.current.component(.weekday, from: Date()) + 5) % 7
return payload.days.first { $0.dayOfWeek == todayOffset } ?? payload.days.first(where: \.isToday)
WatchWeekPayload.stored()?.currentDay()
}
private var sampleDay: WatchWeekPayload.Day {
@@ -209,7 +209,7 @@ struct DaysComplicationView: View {
HStack(alignment: .firstTextBaseline, spacing: 4) {
Text(dayAbbrev(day))
.font(.system(size: 11, weight: .heavy, design: .rounded))
.foregroundStyle(day.isToday
.foregroundStyle(day.isCurrentDay()
? Color(red: 1.0, green: 0.45, blue: 0.35)
: .secondary)
.widgetAccentable()