fix: force widget refresh after subtask toggle (#32) #33

Merged
maximus merged 3 commits from fix/simpl-liste-32-widget-subtask-toggle into master 2026-04-08 16:44:47 +00:00
Owner

Summary

Fixes #32 — Le toggle des sous-tâches depuis le widget Android ne rafraîchissait pas visuellement car le ListView Android cache ses items.

Changements

  • Import requestWidgetUpdate depuis react-native-android-widget
  • Ajout de forceWidgetRefresh() qui appelle requestWidgetUpdate() sur les 3 tailles de widget (Small, Medium, Large)
  • Appel de forceWidgetRefresh() après chaque action click : TOGGLE_SUBTASK, TOGGLE_COMPLETE, TOGGLE_EXPAND

Pourquoi

Le renderWidget() callback du handler met à jour le widget courant, mais le ListView Android cache ses items. Les changements purement visuels (couleur checkbox, style texte) ne se propagent pas sans notifyAppWidgetViewDataChanged(), que requestWidgetUpdate() déclenche.

Test plan

  • Cocher une sous-tâche depuis le widget → checkbox mise à jour immédiatement
  • Compteur ✓ X/Y sur la tâche parente se met à jour
  • Cocher une tâche principale fonctionne toujours
  • Expand/collapse fonctionne toujours
  • La sous-tâche est marquée complétée en DB (vérifiable en ouvrant l'app)

🤖 Generated with Claude Code

## Summary Fixes #32 — Le toggle des sous-tâches depuis le widget Android ne rafraîchissait pas visuellement car le `ListView` Android cache ses items. ### Changements - Import `requestWidgetUpdate` depuis `react-native-android-widget` - Ajout de `forceWidgetRefresh()` qui appelle `requestWidgetUpdate()` sur les 3 tailles de widget (Small, Medium, Large) - Appel de `forceWidgetRefresh()` après chaque action click : `TOGGLE_SUBTASK`, `TOGGLE_COMPLETE`, `TOGGLE_EXPAND` ### Pourquoi Le `renderWidget()` callback du handler met à jour le widget courant, mais le `ListView` Android cache ses items. Les changements purement visuels (couleur checkbox, style texte) ne se propagent pas sans `notifyAppWidgetViewDataChanged()`, que `requestWidgetUpdate()` déclenche. ## Test plan - [ ] Cocher une sous-tâche depuis le widget → checkbox mise à jour immédiatement - [ ] Compteur `✓ X/Y` sur la tâche parente se met à jour - [ ] Cocher une tâche principale fonctionne toujours - [ ] Expand/collapse fonctionne toujours - [ ] La sous-tâche est marquée complétée en DB (vérifiable en ouvrant l'app) 🤖 Generated with [Claude Code](https://claude.com/claude-code)
maximus added 1 commit 2026-03-31 04:01:31 +00:00
The Android ListView caches its items, so visual-only changes (like
toggling a subtask checkbox) were not reflected without calling
requestWidgetUpdate() to invalidate the cache. Added forceWidgetRefresh()
helper that calls requestWidgetUpdate() for all 3 widget sizes after
TOGGLE_SUBTASK, TOGGLE_COMPLETE, and TOGGLE_EXPAND handlers.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Author
Owner

Reviewer automatique — needs-simplify

Le fix est correct pour TOGGLE_SUBTASK, mais il est appliqué aux trois handlers alors que seul TOGGLE_SUBTASK en a besoin. TOGGLE_COMPLETE et TOGGLE_EXPAND fonctionnaient déjà (changements structurels) — leur ajouter forceWidgetRefresh provoque un double-rendu inutile à chaque interaction.

Suggestions de simplification

  • src/widgets/widgetTaskHandler.ts : Retirer les appels à forceWidgetRefresh() dans les blocs TOGGLE_COMPLETE (ligne ~76) et TOGGLE_EXPAND (ligne ~108). L'issue #32 indique explicitement que ces deux actions fonctionnent déjà car elles provoquent des changements structurels (ajout/suppression d'items). Le double-rendu est du gaspillage sans bénéfice. Garder l'appel uniquement dans le bloc TOGGLE_SUBTASK.
  • src/widgets/widgetTaskHandler.ts : WIDGET_NAMES est hardcodé en doublon — si ces noms existent déjà dans la config ou le code du widget (enregistrement Android), extraire dans une constante partagée pour éviter la désynchronisation.
  • src/widgets/widgetTaskHandler.ts : Le catch vide (ligne ~42) avale silencieusement toutes les erreurs, pas seulement 'widget not placed'. Un log debug (ou au minimum un filtre sur le type d'erreur) éviterait de masquer des bugs réels lors du développement.
## Reviewer automatique — needs-simplify Le fix est correct pour TOGGLE_SUBTASK, mais il est appliqué aux trois handlers alors que seul TOGGLE_SUBTASK en a besoin. TOGGLE_COMPLETE et TOGGLE_EXPAND fonctionnaient déjà (changements structurels) — leur ajouter forceWidgetRefresh provoque un double-rendu inutile à chaque interaction. ### Suggestions de simplification - **src/widgets/widgetTaskHandler.ts** : Retirer les appels à forceWidgetRefresh() dans les blocs TOGGLE_COMPLETE (ligne ~76) et TOGGLE_EXPAND (ligne ~108). L'issue #32 indique explicitement que ces deux actions fonctionnent déjà car elles provoquent des changements structurels (ajout/suppression d'items). Le double-rendu est du gaspillage sans bénéfice. Garder l'appel uniquement dans le bloc TOGGLE_SUBTASK. - **src/widgets/widgetTaskHandler.ts** : WIDGET_NAMES est hardcodé en doublon — si ces noms existent déjà dans la config ou le code du widget (enregistrement Android), extraire dans une constante partagée pour éviter la désynchronisation. - **src/widgets/widgetTaskHandler.ts** : Le catch vide (ligne ~42) avale silencieusement toutes les erreurs, pas seulement 'widget not placed'. Un log debug (ou au minimum un filtre sur le type d'erreur) éviterait de masquer des bugs réels lors du développement.
maximus added 1 commit 2026-03-31 06:00:56 +00:00
Only TOGGLE_SUBTASK needs forceWidgetRefresh() because ListView caches
items. TOGGLE_COMPLETE and TOGGLE_EXPAND already work with renderWithState()
alone since they perform structural changes (remove item / toggle children).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Author
Owner

Reviewer automatique — needs-simplify

Le fix precedent a ete corrige : forceWidgetRefresh est maintenant applique uniquement a TOGGLE_SUBTASK. Le fix est correct et resout le probleme de cache ListView. Cependant, la boucle de refresh et la liste WIDGET_NAMES sont dupliquees depuis widgetSync.ts, et le renderWithState avant forceWidgetRefresh provoque un double-rendu inutile du widget declencheur.

Suggestions de simplification

  • src/widgets/widgetTaskHandler.ts : WIDGET_NAMES et la boucle requestWidgetUpdate (lignes 29-46) sont un copier-coller de widgetSync.ts:217-229. Extraire une fonction partagee (ex: refreshAllWidgets) dans widgetSync.ts et l'importer ici, pour eviter que les deux listes de noms de widgets divergent silencieusement.
  • src/widgets/widgetTaskHandler.ts : Dans le bloc TOGGLE_SUBTASK, renderWithState (ligne 105) re-rend le widget declencheur, puis forceWidgetRefresh re-rend TOUS les widgets y compris celui-la. Puisque forceWidgetRefresh couvre deja tous les widgets, le renderWithState est redondant pour ce handler et peut etre retire (ou forceWidgetRefresh peut exclure widgetInfo.widgetName pour eviter le double-rendu).
## Reviewer automatique — needs-simplify Le fix precedent a ete corrige : forceWidgetRefresh est maintenant applique uniquement a TOGGLE_SUBTASK. Le fix est correct et resout le probleme de cache ListView. Cependant, la boucle de refresh et la liste WIDGET_NAMES sont dupliquees depuis widgetSync.ts, et le renderWithState avant forceWidgetRefresh provoque un double-rendu inutile du widget declencheur. ### Suggestions de simplification - **src/widgets/widgetTaskHandler.ts** : WIDGET_NAMES et la boucle requestWidgetUpdate (lignes 29-46) sont un copier-coller de widgetSync.ts:217-229. Extraire une fonction partagee (ex: refreshAllWidgets) dans widgetSync.ts et l'importer ici, pour eviter que les deux listes de noms de widgets divergent silencieusement. - **src/widgets/widgetTaskHandler.ts** : Dans le bloc TOGGLE_SUBTASK, renderWithState (ligne 105) re-rend le widget declencheur, puis forceWidgetRefresh re-rend TOUS les widgets y compris celui-la. Puisque forceWidgetRefresh couvre deja tous les widgets, le renderWithState est redondant pour ce handler et peut etre retire (ou forceWidgetRefresh peut exclure widgetInfo.widgetName pour eviter le double-rendu).
maximus added 1 commit 2026-03-31 08:01:06 +00:00
- Export WIDGET_NAMES from widgetSync.ts and import in widgetTaskHandler.ts
- Remove renderWithState call before forceWidgetRefresh to avoid double-render
- Use shared WIDGET_NAMES in widgetSync.ts refresh loop

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Author
Owner

Reviewer automatique — approved

Les deux problèmes du round 2 sont corrigés : WIDGET_NAMES est importé depuis widgetSync.ts (plus de duplication), et le renderWithState avant forceWidgetRefresh est supprimé (plus de double-rendu). Le fix est ciblé sur TOGGLE_SUBTASK uniquement, correct et minimal.

## Reviewer automatique — approved Les deux problèmes du round 2 sont corrigés : WIDGET_NAMES est importé depuis widgetSync.ts (plus de duplication), et le renderWithState avant forceWidgetRefresh est supprimé (plus de double-rendu). Le fix est ciblé sur TOGGLE_SUBTASK uniquement, correct et minimal.
maximus merged commit 14c208be46 into master 2026-04-08 16:44:47 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: maximus/simpl-liste#33
No description provided.