Files
CollectFlow/src/lib/stale-action.ts
T
Claude b2149ad0a6 fix(ui): message clair quand l'onglet est périmé après un déploiement
« Server Action "…" was not found on the server » n'est pas une panne du
snapshot : Next.js identifie chaque Server Action par un hash calculé à la
compilation, et un onglet ouvert avant un nouveau build continue d'envoyer les
anciens identifiants. La seule issue est de recharger la page.

- src/lib/stale-action.ts : détection de cette erreur + message utilisateur.
- Grille et Snapshots : au lieu d'afficher l'erreur technique brute, on propose
  « Recharger la page ». Les brouillons de la Grille sont persistés
  (localStorage), recharger ne perd rien.
- SuccessModal accepte `variant="error"` : icône d'alerte rouge au lieu de la
  coche verte, et surtout plus de fermeture automatique au bout de 3 s — un
  message d'échec doit rester lisible. Les erreurs s'affichaient jusqu'ici sous
  une coche de succès.
- SuccessModal accepte une action secondaire optionnelle, et joue son animation
  d'entrée en CSS au lieu d'un setState synchrone dans un effet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DfqUihgixw4K1AmJhizWiu
2026-07-29 12:40:16 +00:00

27 lines
1.3 KiB
TypeScript

/**
* CollectFlow — Détection des Server Actions périmées après un déploiement.
*
* Next.js identifie chaque Server Action par un hash calculé **à la compilation**.
* Après un nouveau build (déploiement, redémarrage du conteneur), les hashs
* changent : un onglet resté ouvert continue d'envoyer les anciens identifiants,
* et le serveur répond
*
* Server Action "4010b9…" was not found on the server.
*
* Ce n'est pas une panne applicative : c'est le client qui est périmé. La seule
* issue est de recharger la page pour récupérer le bundle courant.
*
* Les brouillons de la Grille sont persistés dans le store zustand
* (localStorage) : recharger ne perd pas le travail en cours.
*/
/** Message affiché à l'utilisateur quand son onglet est périmé. */
export const STALE_ACTION_MESSAGE =
"L'application a été mise à jour depuis l'ouverture de cet onglet. Rechargez la page pour continuer — vos modifications en cours sont conservées.";
/** true si l'erreur vient d'une Server Action absente du serveur (bundle périmé). */
export function isStaleServerActionError(err: unknown): boolean {
const message = err instanceof Error ? err.message : String(err ?? "");
return /server action/i.test(message) && /not\s+be?\s*found|was not found|failed-to-find-server-action/i.test(message);
}