All files / src/utils authHelper.ts

100% Statements 30/30
100% Branches 11/11
100% Functions 2/2
100% Lines 30/30

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);
}