Les widgets reçoivent la bande et les préréglages au lieu de les inventer
La couleur du score de forme était décidée ici, avec un barème périmé (vert >= 75, jaune >= 50). Le serveur avait recalé le sien sur la distribution réelle (65/55/40) parce que le score est borné à [25, 75] : une bande haute à 75 est inatteignable. Mesuré sur 115 jours de production, le vert n'est jamais sorti et le rouge couvrait 68 jours. La correction n'avait pas atteint le binaire. `FormeScore` porte désormais la bande servie par le serveur, et `resolvedBand` ne sert que de repli — aligné sur les seuils serveur, pas sur les anciens. Le widget de saisie rapide enregistrait un café à 100 ml, volume qui ne correspond à aucun préréglage : le serveur avait séparé l'expresso (60) du mug (250) parce qu'un volume unique faussait le journal, et ces préréglages sont personnalisables. Les boutons viennent maintenant du snapshot ; `fallbackQuickDrinks` reprend les préréglages par défaut du serveur. 15 tests ajoutés au banc d'essai Linux, qui compile réellement ces deux fichiers : 25 tests verts. Le reste (SwiftUI, WidgetKit) n'est pas compilable ici et n'a été que relu. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -90,12 +90,22 @@ struct CoachWatchFormeView: View {
|
||||
var entry: WatchEntry
|
||||
|
||||
private var score: Int? { entry.snapshot?.forme?.score }
|
||||
private var band: CoachWidgetSnapshot.FormeBand? { entry.snapshot?.forme?.resolvedBand }
|
||||
|
||||
private func tint(_ s: Int) -> Color {
|
||||
switch s {
|
||||
case 75...: return .green
|
||||
case 50..<75: return .yellow
|
||||
default: return .red
|
||||
/// Couleur de la bande servie par le serveur.
|
||||
///
|
||||
/// ⚠️ Les seuils vivaient ici (75 / 50) et ne correspondaient plus à ceux du
|
||||
/// serveur (65 / 55 / 40). Le score étant borné à [25, 75], le vert était
|
||||
/// inatteignable : sur 115 jours de production, il n'est jamais sorti, et le
|
||||
/// rouge couvrait 68 jours. La bande arrive maintenant avec le snapshot ;
|
||||
/// le repli vit dans `FormeScore.resolvedBand`, aligné sur le serveur.
|
||||
private func tint(_ band: CoachWidgetSnapshot.FormeBand?) -> Color {
|
||||
switch band {
|
||||
case .great: return .green
|
||||
case .good: return .mint
|
||||
case .medium: return .yellow
|
||||
case .low: return .red
|
||||
case nil: return .gray
|
||||
}
|
||||
}
|
||||
|
||||
@@ -114,7 +124,7 @@ struct CoachWatchFormeView: View {
|
||||
Text("\(s)")
|
||||
}
|
||||
.gaugeStyle(.accessoryCircular)
|
||||
.tint(tint(s))
|
||||
.tint(tint(band))
|
||||
}
|
||||
} else {
|
||||
Image(systemName: "bolt.heart")
|
||||
|
||||
Reference in New Issue
Block a user