Trois widgets d'ecran verrouille et une complication Routine

Les familles accessory* n'etaient declarees que cote Watch, alors que ce sont
exactement celles de l'ecran verrouille iOS 16+. Les vues existaient donc
deja : il ne manquait que la declaration cote iPhone.

Ajoutes sur l'ecran verrouille : Forme (circulaire/rectangulaire/inline),
Seance (rectangulaire/inline, avec la bascule doneToday du commit precedent)
et Routine du jour. Sur la Watch : complication Routine, et la seance gagne la
famille circulaire (icone du sport, verte quand elle est faite).

Le snapshot gagne RoutineProgress {done, total} au grain EXERCICE — celui de
la page web et de l'app Watch depuis le 03/08. `fraction` borne le ratio et
protege de la division par zero ; un total nul ne doit pas remplir la jauge.
Meme garde du jour que doneToday : la routine repart a zero au reveil, un
report aveugle afficherait 24/24 des le matin.

Vues dupliquees plutot que partagees entre les deux extensions : elles ne
partagent aucun fichier et l'App Group n'est pas commun entre appareils. Trois
petites vues coutent moins qu'un fichier de plus a cabler dans deux cibles —
et pour la meme raison tout est ajoute a CoachWidgets.swift, deja membre de sa
cible : AUCUN fichier nouveau, donc rien a cabler dans le pbxproj.

⚠️ NON COMPILE — a builder au prochain passage sur le Mac, avec le correctif
« JOUR OFF » (12b56a4).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sylvain Bettinelli
2026-08-11 18:08:13 +00:00
parent 12b56a4d39
commit 3202e03a63
5 changed files with 302 additions and 2 deletions

View File

@@ -70,6 +70,11 @@ struct CoachWidgetSnapshot: Codable {
/// Optionnel : un snapshot écrit par une version antérieure reste lisible.
var doneToday: DoneActivity? = nil
/// Avancement de la routine quotidienne (nil = non poussée).
/// Optionnel, comme les autres ajouts : un snapshot d'une version
/// antérieure reste décodable.
var routine: RoutineProgress? = 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
@@ -78,6 +83,22 @@ struct CoachWidgetSnapshot: Codable {
var done: Bool // séance déjà réalisée aujourd'hui
}
/// Exercices de la routine cochés aujourd'hui, sur le total du jour.
/// Le grain est l'EXERCICE, pas le bloc : c'est celui de la page web et
/// de l'app Watch depuis le 2026-08-03, et deux grains concurrents
/// donneraient deux comptes différents du même geste.
struct RoutineProgress: Codable {
var done: Int
var total: Int
/// 01, borné. `total` nul ne doit jamais produire de division par zéro
/// ni une jauge pleine par accident.
var fraction: Double {
guard total > 0 else { return 0 }
return min(1, max(0, Double(done) / Double(total)))
}
}
/// 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