import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { useNavigate } from 'react-router-dom'; import { api, clearToken, getToken, setToken } from '@/api/client'; /** Profil courant. Un 401 (jeton expiré/invalide) purge la session. */ export function useMe() { return useQuery({ queryKey: ['me'], enabled: !!getToken(), retry: false, queryFn: async () => { const { data, response } = await api.GET('/users/me'); if (response.status === 401) { clearToken(); throw new Error('Session expirée'); } if (!data) throw new Error('Profil indisponible'); return data; }, }); } /** ADR-002 : la liste n'existe qu'en DEMO_MODE — un 404 signifie « pas de * mode démo », le web n'affiche alors rien (null). Une ERREUR RÉSEAU, en * revanche, signifie que l'API est injoignable : l'écran de connexion * l'affiche clairement (isError) au lieu de masquer la démo en silence. */ export function useDemoAccounts() { return useQuery({ queryKey: ['demo-accounts'], retry: false, staleTime: 5 * 60_000, queryFn: async () => { const { data, response } = await api.GET('/auth/demo-accounts'); if (response.status === 404) return null; // pas de mode démo : normal if (!data) throw new Error(`API : ${response.status}`); return data.accounts; }, }); } export function useLogin() { const queryClient = useQueryClient(); return useMutation({ mutationFn: async (body: { email: string; password: string }) => { const { data, error } = await api.POST('/auth/login', { body }); if (error || !data) throw new Error('Email ou mot de passe incorrect'); return data; }, onSuccess: (data) => { setToken(data.accessToken); queryClient.clear(); }, }); } /** Connexion 1 clic (et bascule de rôle en cours de session — critère < 3 s). */ export function useDemoLogin() { const queryClient = useQueryClient(); return useMutation({ mutationFn: async (userId: string) => { const { data, error } = await api.POST('/auth/demo-login', { body: { userId }, }); if (error || !data) throw new Error('Connexion démo impossible'); return data; }, onSuccess: (data) => { setToken(data.accessToken); queryClient.clear(); }, }); } export function useLogout() { const queryClient = useQueryClient(); const navigate = useNavigate(); return () => { clearToken(); queryClient.clear(); navigate('/connexion', { replace: true }); }; }