Authentification alignée sur le back-end (Étapes 7/8) : - src/api : schema auth (AccountRead, TokenResponse…), session.ts (jeton Bearer partagé + callback 401), méthodes auth du client HTTP (POST .../auth/login, .../auth/magic-link, .../auth/verify, GET /auth/me) et du mock (comptes coordination + référents + bénévoles, tokens magiques, sessions). - src/auth : AuthProvider/useAuth (jeton en localStorage, réhydratation via /auth/me, déconnexion sur 401), RequireAuth (garde + contrôle de rôle), HomeRedirect, table ROUTE_ROLES. - Pages : /connexion (lien magique, avec lien de démo affiché en mode mock), /connexion/coordination (email + mot de passe). - Router : toutes les routes métier passées derrière <RequireAuth> ; redirection vers l'accueil du rôle. - AppShell : onglets filtrés par rôle (01/02/03/06 coordination, 04 bénévole, 05 référent), email + rôle + bouton Déconnexion. - Mobile bénévole : cible le bénévole du compte connecté ; dégradation propre quand l'API refuse le détail des créneaux à un bénévole. - Mobile référent : cible le poste dont le compte est référent. - i18n : clés auth / rôles. - Vérifs : build tsc + vite, eslint (0 problème), npm run smoke (flux login / lien magique + rendu des 6 écrans par rôle et des pages publiques). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AwswqSChc3Rwtu61pRXiY2
33 lines
1.1 KiB
TypeScript
33 lines
1.1 KiB
TypeScript
import { ENV } from '@/lib/env';
|
|
|
|
import { createHttpApi } from './http-client';
|
|
import { MOCK_EDITION_ID } from './mock/dataset';
|
|
import { createMockApi, peekMockMagicToken } from './mock/mock-client';
|
|
import type { PlanningApi } from './types';
|
|
|
|
// `VITE_API_MODE` : `mock` (défaut, jeu de démonstration en mémoire) ou `http`
|
|
// (back-end réel). En mode http, `VITE_EDITION_ID` doit désigner une édition.
|
|
export const API_MODE = ENV.apiMode;
|
|
|
|
export const EDITION_ID: string = ENV.editionId ?? MOCK_EDITION_ID;
|
|
|
|
export const api: PlanningApi =
|
|
API_MODE === 'http' ? createHttpApi(ENV.apiBaseUrl) : createMockApi();
|
|
|
|
/**
|
|
* Mode mock uniquement : dernier lien magique émis pour un email (l'envoi
|
|
* d'email est stubé). Renvoie `undefined` en mode HTTP.
|
|
*/
|
|
export function devMagicToken(email: string): string | undefined {
|
|
return API_MODE === 'mock' ? peekMockMagicToken(email) : undefined;
|
|
}
|
|
|
|
export { ApiError } from './types';
|
|
export { setAuthToken, setOnUnauthorized } from './session';
|
|
export {
|
|
DEMO_COORDINATOR_EMAIL,
|
|
DEMO_COORDINATOR_PASSWORD,
|
|
} from './mock/dataset';
|
|
export type { PlanningApi } from './types';
|
|
export * from './schema';
|