fix(widget): le pont effaçait l'hydratation à chaque chargement de page

Voilà la vraie cause du total qui retombait à zéro. `setSnapshot` reconstruisait
le snapshot **de zéro** avec `today` et `forme` seulement : tout ce que
`CoachQuickSync` venait de créditer — hydratation, cafés, calories — était
écrasé au premier chargement de page suivant.

Mon correctif précédent créditait donc un snapshot que le pont effaçait dans la
foulée. Il reste utile (il tient l'affichage entre la synchro et le prochain
chargement), mais il ne pouvait pas suffire seul.

Les champs de nutrition sont désormais FACULTATIFS dans l'appel : absents, on
conserve ceux du snapshot existant au lieu de les vider. Un pont qui n'envoie
qu'une partie des données ne doit pas détruire le reste.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Sylvain Bettinelli
2026-08-06 13:54:32 +00:00
parent d8adad466b
commit 9790f0fa8a

View File

@@ -45,7 +45,25 @@ public class CoachWidgetBridgePlugin: CAPPlugin, CAPBridgedPlugin {
label: f["label"] as? String label: f["label"] as? String
) )
} }
let snapshot = CoachWidgetSnapshot(updatedAt: Date(), today: today, forme: forme) /* Les champs de nutrition sont FACULTATIFS dans l'appel : le pont web
peut les omettre (objectifs indisponibles, appel partiel). Dans ce
cas on conserve ceux du snapshot existant plutôt que de les effacer.
C'est le bug qui faisait retomber le total du widget à zéro : le
snapshot était reconstruit de zéro à chaque chargement de page, avec
`today` et `forme` seulement, et l'hydratation créditée quelques
instants plus tôt disparaissait. */
let previous = CoachWidgetStore.load()
func number(_ key: String) -> Double? {
(call.getValue(key) as? NSNumber)?.doubleValue
}
var snapshot = CoachWidgetSnapshot(updatedAt: Date(), today: today, forme: forme)
snapshot.waterMlToday = number("waterMlToday") ?? previous?.waterMlToday
snapshot.coffeeCountToday =
(call.getValue("coffeeCountToday") as? NSNumber)?.intValue ?? previous?.coffeeCountToday
snapshot.kcalToday = number("kcalToday") ?? previous?.kcalToday
snapshot.kcalGoal = number("kcalGoal") ?? previous?.kcalGoal
guard CoachWidgetStore.save(snapshot) else { guard CoachWidgetStore.save(snapshot) else {
call.reject("Échec de sauvegarde du snapshot widget (App Group indisponible ?)") call.reject("Échec de sauvegarde du snapshot widget (App Group indisponible ?)")
return return