Le widget disait « JOUR OFF » les jours de sortie non planifiee

Pendant du commit web 25f53b5. Quand la seance prevue est remplacee par une
autre activite, le plan du jour se vide : le widget iPhone affichait « JOUR
OFF / Pas de seance prevue » et la complication Watch « Jour OFF » — le jour
meme d'une sortie de 20 km. Le snapshot ne portait que le PLAN.

CoachWidgetSnapshot gagne doneToday (sport, titre, sous-titre), optionnel :
un snapshot ecrit par une version anterieure reste decodable. today decrit le
plan, doneToday decrit la journee ; les deux peuvent coexister.

CoachWidgetBridge le conserve quand l'appel l'omet, comme la nutrition — mais
seulement si le snapshot precedent date d'aujourd'hui, sinon la sortie de la
veille resterait affichee indefiniment.

Les deux vues basculent sur l'activite realisee, avec la pastille verte
« Realisee » deja utilisee pour une seance planifiee faite. Le sous-titre
(« 20,3 km · 56 min ») passe devant le titre : le titre d'une seance importee
est souvent vide.

⚠️ NON COMPILE — a builder au prochain passage sur le Mac. Aucun fichier
nouveau, donc rien a cabler dans le pbxproj : les quatre fichiers touches sont
deja membres de leurs cibles.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sylvain Bettinelli
2026-08-11 17:56:53 +00:00
parent 326e73aaae
commit 12b56a4d39
4 changed files with 89 additions and 4 deletions

View File

@@ -60,6 +60,16 @@ struct CoachWidgetSnapshot: Codable {
var kcalGoal: Double? = nil
/// Activité RÉELLEMENT réalisée aujourd'hui, indépendante du plan.
///
/// Sans elle, un jour où la séance prévue est remplacée par une autre
/// activité (bouton « j'ai fait du VTT », qui décale la séquence et vide
/// le jour) s'affiche « JOUR OFF » le jour même d'une sortie de 20 km.
/// `today` décrit le plan, `doneToday` décrit la journée : les deux
/// peuvent coexister, l'un être nil sans l'autre.
/// Optionnel : un snapshot écrit par une version antérieure reste lisible.
var doneToday: DoneActivity? = nil
/// Séance planifiée du jour (nil = jour OFF / pas de séance).
struct TodaySession: Codable {
var sport: String // running, cycling, strength, mobility, hiking, rest
@@ -68,6 +78,13 @@ struct CoachWidgetSnapshot: Codable {
var done: Bool // séance déjà réalisée aujourd'hui
}
/// Ce qui a été fait dans la journée : sport, et de quoi le qualifier.
struct DoneActivity: Codable {
var sport: String // running, cycling, walking, strength
var title: String? // nom de la séance, souvent absent
var subtitle: String? // "20,3 km · 56 min"
}
/// Score de forme / récupération (nil = pas encore de score).
struct FormeScore: Codable {
var score: Int? // 0100