fix: save and back buttons not navigating away from task screen (#21) #22

Merged
maximus merged 2 commits from fix/simpl-liste-21-save-button-navigation into master 2026-03-10 01:26:05 +00:00
Collaborator

Fixes #21

Problem

The Save button on the task edit screen reacts visually (becomes dimmed) but the screen stays open instead of navigating back. The back arrow button has the same issue. Both buttons call router.back() which can silently fail when there is no navigation history to return to.

Additionally, in the task edit screen, if updateTask or setTagsForTask throws an error, the saving state is reset in the catch block but router.back() is never called. However if the operations succeed, there is no finally block to reset saving, so the button stays permanently disabled.

Changes

  • app/task/[id].tsx: Add goBack() helper that checks router.canGoBack() before calling router.back(), with a fallback to router.replace('/'). Replace all router.back() calls (save, back arrow, delete) with goBack(). Change catch to finally in handleSave so the save button always resets its disabled/dimmed state.
  • app/task/new.tsx: Same goBack() helper applied to the save button and X (close) button for consistency.
Fixes #21 ## Problem The Save button on the task edit screen reacts visually (becomes dimmed) but the screen stays open instead of navigating back. The back arrow button has the same issue. Both buttons call `router.back()` which can silently fail when there is no navigation history to return to. Additionally, in the task edit screen, if `updateTask` or `setTagsForTask` throws an error, the `saving` state is reset in the `catch` block but `router.back()` is never called. However if the operations succeed, there is no `finally` block to reset `saving`, so the button stays permanently disabled. ## Changes - **`app/task/[id].tsx`**: Add `goBack()` helper that checks `router.canGoBack()` before calling `router.back()`, with a fallback to `router.replace('/')`. Replace all `router.back()` calls (save, back arrow, delete) with `goBack()`. Change `catch` to `finally` in `handleSave` so the save button always resets its disabled/dimmed state. - **`app/task/new.tsx`**: Same `goBack()` helper applied to the save button and X (close) button for consistency.
medic-bot added 1 commit 2026-03-10 00:47:41 +00:00
Replace all router.back() calls with a goBack() helper that checks
router.canGoBack() first and falls back to router.replace('/') when
there is no screen to return to. In the task edit screen, change
catch to finally so the save button always resets its disabled state
even if updateTask/setTagsForTask throws.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Author
Collaborator

Reviewer automatique — needs-fix

Le remplacement de catch par finally dans [id].tsx supprime la gestion d'erreurs : les erreurs de updateTask/setTagsForTask deviennent des rejections non gérées et provoquent un goBack() même en cas d'échec de la sauvegarde. Le helper goBack() est aussi dupliqué entre les deux fichiers.

Suggestions de simplification

  • app/task/[id].tsx : La fonction goBack() est dupliquée mot pour mot dans [id].tsx et new.tsx. Extraire dans un hook ou un utilitaire partagé (ex: hooks/useGoBack.ts) pour éviter la duplication.

Problèmes détectés

  • app/task/[id].tsx:137 [high] catch a été remplacé par finally. Conséquence 1 : les erreurs de updateTask ou setTagsForTask ne sont plus attrapées et deviennent des unhandled promise rejections. Conséquence 2 : goBack() est appelé dans le try, donc en cas de succès la navigation se fait PUIS finally exécute setSaving(false) sur un composant en cours de démontage. Conséquence 3 : en cas d'erreur, setSaving(false) est appelé mais l'erreur remonte quand même (pas de catch). Il faut restaurer le catch pour la gestion d'erreurs, et déplacer goBack() + setSaving(false) correctement : goBack() dans le try (après le await), setSaving(false) dans le catch.
## Reviewer automatique — needs-fix Le remplacement de `catch` par `finally` dans [id].tsx supprime la gestion d'erreurs : les erreurs de `updateTask`/`setTagsForTask` deviennent des rejections non gérées et provoquent un `goBack()` même en cas d'échec de la sauvegarde. Le helper `goBack()` est aussi dupliqué entre les deux fichiers. ### Suggestions de simplification - **app/task/[id].tsx** : La fonction `goBack()` est dupliquée mot pour mot dans `[id].tsx` et `new.tsx`. Extraire dans un hook ou un utilitaire partagé (ex: `hooks/useGoBack.ts`) pour éviter la duplication. ### Problèmes détectés - **app/task/[id].tsx:137** [high] `catch` a été remplacé par `finally`. Conséquence 1 : les erreurs de `updateTask` ou `setTagsForTask` ne sont plus attrapées et deviennent des unhandled promise rejections. Conséquence 2 : `goBack()` est appelé dans le `try`, donc en cas de succès la navigation se fait PUIS `finally` exécute `setSaving(false)` sur un composant en cours de démontage. Conséquence 3 : en cas d'erreur, `setSaving(false)` est appelé mais l'erreur remonte quand même (pas de `catch`). Il faut restaurer le `catch` pour la gestion d'erreurs, et déplacer `goBack()` + `setSaving(false)` correctement : `goBack()` dans le try (après le await), `setSaving(false)` dans le catch.
maximus added 1 commit 2026-03-10 01:06:11 +00:00
- Replace `finally` with `catch` in [id].tsx handleSave so goBack is
  not called when updateTask/setTagsForTask fails
- Extract shared goBack helper into src/lib/navigation.ts
- Both [id].tsx and new.tsx now import goBack from the shared module

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Author
Collaborator

Reviewer automatique — approved

Les deux problèmes du round 1 sont corrigés : le bloc catch est préservé (pas de régression sur la gestion d'erreurs) et le helper goBack() est extrait dans un module partagé. Le fix est minimal, correct et résout l'issue de navigation.

## Reviewer automatique — approved Les deux problèmes du round 1 sont corrigés : le bloc catch est préservé (pas de régression sur la gestion d'erreurs) et le helper goBack() est extrait dans un module partagé. Le fix est minimal, correct et résout l'issue de navigation.
maximus merged commit b5e722c1f0 into master 2026-03-10 01:26:05 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
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#22
No description provided.