Files
LogiFlow/client/src/hooks/useAuthUnified.ts
T
Claude 5d3e5357a0 perf(client): pages chargées à la demande et un seul appel /api/user
- Routes en React.lazy (sauf connexion et accueil) avec un Suspense dans
  la zone de contenu ; recharts n'est plus préchargé. JS initial :
  1,72 Mo -> 625 Ko (183 Ko gzip). Rechargement automatique unique si un
  ancien fichier JS a disparu après un déploiement, et ErrorBoundary par
  page pour garder le menu affiché en cas d'erreur.
- Authentification unifiée sur le cache React Query ['/api/user'] : un
  seul GET /api/user pour toute l'application (au lieu de 4 à 5 par
  page), plus de rechargement complet après la connexion.
- Pas de nouvel essai sur les erreurs 4xx ; fournisseurs et magasins en
  cache 5 minutes ; valeur du StoreContext mémoïsée et redimensionnement
  qui ne re-rend que lorsque le palier d'écran change.
- Pages : requêtes inutilisées ou en double supprimées, appels lancés
  seulement une fois l'utilisateur connu, invalidations ciblées au lieu
  de rechargements complets, filtres et tris mémoïsés, anciennes données
  gardées (et estompées) pendant un changement de filtre ou de mois,
  recherche DLC mobile temporisée, vérifications de factures à
  concurrence bornée, navigation interne sans rechargement de la page.
- index.html : script de bannière Replit retiré, lang="fr".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MsDJjQrAggcJwbbBtKhgyb
2026-10-03 04:29:51 +00:00

58 lines
2.0 KiB
TypeScript

import { useCallback } from 'react';
import { useQuery, useQueryClient } from "@tanstack/react-query";
import { AUTH_QUERY_KEY, fetchCurrentUser } from "@/lib/queryClient";
// Conservé dans le retour du hook pour compatibilité (utilisé pour le débogage)
const environment = import.meta.env.DEV ? 'development' : 'production';
// Hook d'authentification unique (développement et production) : l'utilisateur
// connecté est lu une seule fois via GET /api/user puis partagé par toute
// l'application à travers le cache React Query (clé ['/api/user']).
// Un 401 donne user = null (non connecté), sans redirection.
export function useAuthUnified() {
const queryClient = useQueryClient();
const authQuery = useQuery<any>({
queryKey: AUTH_QUERY_KEY,
queryFn: fetchCurrentUser,
staleTime: Infinity,
retry: false,
// Après une erreur serveur, ne pas relancer la requête à chaque montage d'un
// composant (AuthPage) : sinon boucle chargement / page de connexion
retryOnMount: false,
});
// Rafraîchissement en arrière-plan : tous les composants abonnés reçoivent
// le nouvel utilisateur quand la réponse arrive
const refreshAuth = useCallback(() => {
return queryClient.invalidateQueries({ queryKey: AUTH_QUERY_KEY });
}, [queryClient]);
// Rechargement immédiat (après connexion) : attend la réponse du serveur,
// met à jour le cache partagé et renvoie l'utilisateur (ou null)
const forceAuthRefresh = useCallback(async () => {
try {
return await queryClient.fetchQuery({
queryKey: AUTH_QUERY_KEY,
queryFn: fetchCurrentUser,
staleTime: 0,
});
} catch (error) {
console.error("Erreur lors du rafraîchissement de l'authentification:", error);
return null;
}
}, [queryClient]);
const user = authQuery.data ?? null;
return {
user,
isLoading: authQuery.isLoading,
isAuthenticated: !!user,
error: authQuery.error,
refreshAuth,
forceAuthRefresh,
environment
};
}