# UserWallet – Machine à états login (3.1) **Author:** Équipe 4NK **Date:** 2026-01-26 ## Objectif Implémenter la machine à états formelle du login (S_LOGIN_* , E_* , transitions) décrite dans `specs.md`, et l’intégrer au flux login existant. ## Impacts - **Module** : `services/loginStateMachine.ts` (états, événements, `transition`, `getInitialLoginState`, `isTerminal`, `isErrorState`). - **Hook** : `hooks/useLoginStateMachine` (`state`, `dispatch`, `reset`). - **LoginScreen** : utilise le hook, dispatch des événements aux points clés (build path, challenge, publish, Retour), affichage de l’état (sr-only, aria-live). - **Flux** : E_SELECT_SERVICE / E_SELECT_MEMBER → E_PATH_OK | E_PATH_INCOMPLETE | E_PATH_INVALID → E_PAIRS_OK → E_CHALLENGE_READY → E_SIGNATURES_COMPLETE → E_PUBLISH_LOGIN_OK | E_PUBLISH_LOGIN_PARTIAL → E_LOCAL_VERDICT_ACCEPT | (reject) → S_LOGIN_SUCCESS | S_LOGIN_FAILURE. E_BACK, E_RETRY, E_SYNC_NOW, E_ADD_PAIR pour reprises. ## Modifications - `src/services/loginStateMachine.ts` : types `LoginState`, `LoginEvent`, `TransitionResult` ; `transition(state, event)` ; helpers. - `src/hooks/useLoginStateMachine.ts` : état local, `dispatch`, `reset`. - `src/components/LoginScreen.tsx` : hook, dispatch dans `handleBuildPath`, `handleBuildChallenge`, `handlePublish` ; `handleBack` + E_BACK ; libellé état (sr-only). - `src/index.css` : `.sr-only` pour le statut. ## États couverts S_LOGIN_SELECT_SERVICE, S_LOGIN_SELECT_MEMBER, S_LOGIN_BUILD_PATH, S_LOGIN_CHECK_PAIRS, S_LOGIN_NEED_MORE_PAIRS, S_LOGIN_BUILD_CHALLENGE, S_LOGIN_COLLECT_SIGNATURES, S_LOGIN_PUBLISH_PROOF, S_LOGIN_VERIFY_LOCAL, S_LOGIN_SUCCESS, S_LOGIN_FAILURE, S_ERROR_RECOVERABLE. ## Reste à faire (hors scope 3.1) - Timeouts (réseau, collecte signatures), backoff. - Gardes explicites (G_PAIRING_SATISFIED, etc.) côté UI avant dispatch. - S_LOGIN_NEED_MORE_PAIRS : boutons E_ADD_PAIR, E_SYNC_NOW dédiés. ## Modalités de déploiement Déploiement classique du front userwallet. ## Modalités d’analyse - Parcourir le flux login (sélection → chemin → challenge → publication) et vérifier les transitions (DevTools, log état si besoin). - Vérifier que Retour envoie E_BACK et navigue vers `/`. - Publication partielle → S_ERROR_RECOVERABLE, pas S_LOGIN_SUCCESS. ## Références - `userwallet/docs/specs.md` (machine à états) - `features/userwallet-contrat-login-reste-a-faire.md` (§ 3.1)