51 lines
1.5 KiB
React
51 lines
1.5 KiB
React
/* Contexte d'authentification global : gestion de l'utilisateur connecté */
|
|
|
|
import { createContext, useContext, useState } from 'react';
|
|
import * as api from '../services/api';
|
|
|
|
const AuthContext = createContext(null);
|
|
|
|
const STORAGE_KEY = 'ds_user';
|
|
|
|
/* Fournisseur du contexte d'authentification */
|
|
export function AuthProvider({ children }) {
|
|
const [user, setUser] = useState(() => {
|
|
/* Restauration de la session depuis le localStorage au montage */
|
|
const stored = localStorage.getItem(STORAGE_KEY);
|
|
return stored ? JSON.parse(stored) : null;
|
|
});
|
|
|
|
/* Connexion : appelle l'API, stocke le token + l'utilisateur retourné */
|
|
async function login(username, password) {
|
|
const connectedUser = await api.login(username, password);
|
|
setUser(connectedUser);
|
|
localStorage.setItem(STORAGE_KEY, JSON.stringify(connectedUser));
|
|
return connectedUser;
|
|
}
|
|
|
|
/* Déconnexion : vide le token, le state et le localStorage */
|
|
function logout() {
|
|
api.clearToken();
|
|
setUser(null);
|
|
localStorage.removeItem(STORAGE_KEY);
|
|
}
|
|
|
|
/* Booléen pratique pour savoir si l'utilisateur est connecté */
|
|
const isAuthenticated = !!user;
|
|
|
|
return (
|
|
<AuthContext.Provider value={{ user, login, logout, isAuthenticated }}>
|
|
{children}
|
|
</AuthContext.Provider>
|
|
);
|
|
}
|
|
|
|
/* Hook personnalisé pour accéder au contexte d'authentification */
|
|
export function useAuth() {
|
|
const context = useContext(AuthContext);
|
|
if (!context) {
|
|
throw new Error('useAuth doit être utilisé dans un AuthProvider');
|
|
}
|
|
return context;
|
|
}
|