All files / src/stores useAuthStore.ts

100% Statements 21/21
100% Branches 13/13
100% Functions 3/3
100% Lines 20/20

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                              22x         22x         22x         22x   22x           3x   3x   2x 2x 2x 2x     1x 1x 1x 1x         1x 1x 1x 1x 1x        
import { create } from 'zustand';
 
export type UserRole = 'user' | 'admin' | 'employee';
 
interface AuthState {
  authToken: string | null;
  role: UserRole | null;
  remember: boolean;
  setToken: (token: string, remember: boolean, role: UserRole) => void;
  clearToken: () => void;
}
 
// 1) On essaie d'abord de récupérer le token dans sessionStorage (session en cours),
//    puis dans localStorage (si "remember me" avait été coché), sinon null.
const initialToken =
  sessionStorage.getItem('authToken')
  ?? localStorage.getItem('authToken')
  ?? null;
 
const initialRoleStr =
  sessionStorage.getItem('authRole')
  ?? localStorage.getItem('authRole')
  ?? null;
 
// 2) Si on a trouvé un rôle, on l'assigne, sinon null.
const initialRole = (initialRoleStr === 'admin' || initialRoleStr === 'employee' || initialRoleStr === 'user')
  ? (initialRoleStr as UserRole)
  : null;
 
// 2) Si on l'a trouvé dans localStorage, on considère que "remember" a été coché.
const initialRemember = Boolean(localStorage.getItem('authToken'));
 
export const useAuthStore = create<AuthState>((set) => ({
  authToken: initialToken,
  role: initialRole,
  remember: initialRemember,
 
  setToken: (token, remember, role) => {
    set({ authToken: token, remember, role });
 
    if (remember) {
      // on persiste pour plusieurs jours
      localStorage.setItem('authToken', token);
      localStorage.setItem('authRole', role);
      sessionStorage.removeItem('authToken');
      sessionStorage.removeItem('authRole');
    } else {
      // on garde juste pour la session en cours
      sessionStorage.setItem('authToken', token);
      sessionStorage.setItem('authRole', role);
      localStorage.removeItem('authToken');
      localStorage.removeItem('authRole');
    }
  },
 
  clearToken: () => {
    set({ authToken: null, role: null, remember: false });
    sessionStorage.removeItem('authToken');
    sessionStorage.removeItem('authRole');
    localStorage.removeItem('authToken');
    localStorage.removeItem('authRole');
  },
}));