diff --git a/apps/web/src/components/layout/Header.tsx b/apps/web/src/components/layout/Header.tsx index 58caf840b..b5fa669d4 100644 --- a/apps/web/src/components/layout/Header.tsx +++ b/apps/web/src/components/layout/Header.tsx @@ -37,6 +37,7 @@ export function Header(_props: HeaderProps) { const navigate = useNavigate(); const handleLogout = async () => { + setIsUserMenuOpen(false); await logout(); navigate('/login'); }; diff --git a/apps/web/src/features/auth/pages/LoginPage.tsx b/apps/web/src/features/auth/pages/LoginPage.tsx index 8ac6ec313..f650648d0 100644 --- a/apps/web/src/features/auth/pages/LoginPage.tsx +++ b/apps/web/src/features/auth/pages/LoginPage.tsx @@ -60,19 +60,9 @@ export function LoginPage() { } }, []); - // Rediriger si déjà connecté (mais attendre que le chargement soit terminé) + // Rediriger si déjà connecté (user data géré par React Query, pas dans persist) if (isAuthenticated && !isLoading && !loading) { - const stored = localStorage.getItem('auth-storage'); - if (stored) { - try { - const parsed = JSON.parse(stored); - if (parsed.state?.user && parsed.state?.isAuthenticated) { - return ; - } - } catch { - // Continue, pas encore persisté - } - } + return ; } const validateField = ( diff --git a/apps/web/src/features/auth/store/authStore.ts b/apps/web/src/features/auth/store/authStore.ts index 577a6d4f3..e09b174fe 100644 --- a/apps/web/src/features/auth/store/authStore.ts +++ b/apps/web/src/features/auth/store/authStore.ts @@ -12,6 +12,7 @@ import { } from '@/services/api/auth'; import { TokenStorage } from '@/services/tokenStorage'; import { csrfService } from '@/services/csrf'; +import { getQueryClient } from '@/utils/queryClientSingleton'; import { broadcastSync } from '@/utils/broadcastSync'; import { logger } from '@/utils/logger'; import type { ApiError } from '@/schemas/apiSchemas'; @@ -206,6 +207,12 @@ export const useAuthStore = create()( // Supprimer le token CSRF csrfService.clearToken(); + // Clear React Query user cache + const qc = getQueryClient(); + if (qc) { + qc.removeQueries({ queryKey: ['user', 'me'] }); + } + // Nettoyer l'état set({ isAuthenticated: false, diff --git a/apps/web/src/services/api/auth.ts b/apps/web/src/services/api/auth.ts index c1e9b23f2..cc1df0357 100644 --- a/apps/web/src/services/api/auth.ts +++ b/apps/web/src/services/api/auth.ts @@ -7,6 +7,7 @@ import { initializeProactiveRefresh, cleanupProactiveRefresh, } from '../tokenRefresh'; +import { getQueryClient } from '@/utils/queryClientSingleton'; import { logger } from '@/utils/logger'; import type { User } from '@/types'; @@ -344,6 +345,11 @@ export async function logout(): Promise { cleanupProactiveRefresh(); // Supprimer tokens du storage TokenStorage.clearTokens(); + // Clear React Query user cache to avoid stale user data after logout + const qc = getQueryClient(); + if (qc) { + qc.removeQueries({ queryKey: ['user', 'me'] }); + } } }