Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | 5x 5x 3x 3x 2x 2x 5x 5x 4x 4x 1x 3x 1x 2x 1x 1x 3x 3x 2x 2x 1x 3x 3x 3x 3x 3x 3x 3x 3x 3x | import { useCartStore } from '../stores/useCartStore'; import type { UserRole } from '../stores/useAuthStore'; import type { NavigateFunction } from 'react-router-dom'; import { useAuthStore } from '../stores/useAuthStore'; import { logoutUser } from '../services/authService'; import { logError } from './logger'; /** * Stocke le token, recharge le panier invité, puis redirige selon le rôle. * * @param token Le JWT renvoyé par l’API. * @param role Le rôle de l’utilisateur ("user" | "admin" | "employee"). * @param remember Si true, on stocke en localStorage, sinon en sessionStorage. * @param setAuthToken Fonction de Zustand pour enregistrer le token en mémoire. * @param clearGuestCart Id du panier invité à effacer (on passe toujours null ici). * @param loadCart Fonction de Zustand qui recharge le contenu du panier. * @param navigate Callback `useNavigate` pour rediriger l’utilisateur. * @param nextPath (optionnel) chemin vers lequel rediriger l’utilisateur après login. */ export async function onLoginSuccess( token: string, role: UserRole, remember: boolean, setAuthToken: (token: string, remember: boolean, role: UserRole) => void, clearGuestCartIdInStore: (id: string | null) => void, loadCart: () => Promise<void>, navigate: (path: string) => void, nextPath?: string ) { // 1) Enregistre le token en mémoire (Zustand) et en localStorage/sessionStorage setAuthToken(token, remember, role); if (remember) { localStorage.setItem('authToken', token); localStorage.setItem('authRole', role); } else { sessionStorage.setItem('authToken', token); sessionStorage.setItem('authRole', role); } // 2) Vide le panier invité en store et en stockage persistant clearGuestCartIdInStore(null); useCartStore.persist.clearStorage(); // 3) Recharge le panier (maintient la continuité de l’ancien panier si l’utilisateur en avait un) await loadCart(); // 4) si on a un next, on y va, sinon dashboard selon role if (nextPath) { navigate(nextPath); } else if (role === 'admin') { navigate('/admin/dashboard'); } else if (role === 'employee') { navigate('/employee/dashboard'); } else { navigate('/user/dashboard'); } } /** * Déconnecte l’utilisateur : révoque le token côté API, efface le token, vide le panier invité, * recharge le panier, et navigue. * * @param clearAuthToken Fonction de Zustand pour vider le token en mémoire. * @param clearGuestCartIdInStore Fonction de Zustand pour vider l’ID du panier invité. * @param loadCart Fonction de Zustand pour recharger le panier (après avoir vidé le panier invité). * @param navigate Fonction `useNavigate()` pour rediriger l’utilisateur. * @param redirectPath (optionnel) chemin vers lequel rediriger l’utilisateur après logout (défaut : '/'). */ export async function logout( clearAuthToken: () => void, clearGuestCartIdInStore: (id: string | null) => void, loadCart: () => Promise<void>, navigate: NavigateFunction, redirectPath: string = '/' ) { // 1) Récupérer le token et le rôle depuis le store const { authToken: token } = useAuthStore.getState(); // 2) Appel à authService.logoutUser pour révoquer le token if (token) { try { await logoutUser(token); } catch (err) { logError('logoutUser', err); } } // 3) Vider token et rôle client clearAuthToken(); localStorage.removeItem('authToken'); sessionStorage.removeItem('authToken'); localStorage.removeItem('authRole'); sessionStorage.removeItem('authRole'); // 4) Vider le panier invité (store + persistant) clearGuestCartIdInStore(null); useCartStore.persist.clearStorage(); // 5) Recharger le panier (potentiellement vide ou guest différent) await loadCart(); // 6) Redirection navigate(redirectPath); } |