# Étape 2 – Blocage après "Suivant" ## Reproduction - Plateforme : Web & mobile (Expo) – navigation `Routes.CreateLyricsWithAi`. - Préconditions : Projet sans paroles existantes. - Étapes : 1. Lancer l'atelier d'écriture et sélectionner un objectif (Étape 1). 2. Renseigner un contexte dans l'input (Étape 2). 3. Appuyer sur `Suivant`. - Résultat observé : le bouton devient inactif, l'écran reste figé sur l'étape 2 et il est impossible de poursuivre car le swipe est désactivé. ## Analyse & cause racine - L'étape dépend de `SwiperFlatList` avec `disableGesture={true}` : seule la navigation programmée via `scrollToIndex` permet d'avancer. - L'appel `scrollRef.current.scrollToIndex` levait par intermittence une exception (`Invariant Violation: scrollToIndex out of range`) lorsque la mesure des vues n'était pas prête au moment du clic. - L'erreur était avalée silencieusement (`catch {}`) ce qui laissait l'index interne sur `1` et donc l'utilisateur bloqué sur Étape 2. ## Correctif - Ajout d'une logique de re-tentative autour de `scrollToIndex` avec journalisation pour diagnostiquer les cas anormaux. - Clamp de l'index (`Math.min(idx + 1, MAX_STEP_INDEX)`) pour éviter toute sortie de plage. - Progression recalculée en même temps que la navigation afin d'éviter les états intermédiaires incohérents. ## Validation manuelle 1. Rejouer le scénario de reproduction sur web et mobile (Expo Go). 2. Vérifier la console : absence d'avertissements `[CreateLyricsWithAi] scrollToIndex failed`. 3. Confirmer que l'écran passe correctement à "Étape 3: Quelle émotion veux-tu transmettre ?" et que le bouton `Suivant` se réactive après sélection d'une émotion. 4. Revenir en arrière (`Précédent`) pour s'assurer que l'étape 2 reste éditable et que l'avancement se met à jour (progression dynamique). ## Points de suivi - Ajouter une suite E2E complète une fois l'infrastructure de tests dispo (Detox/Playwright) pour vérifier la navigation multi-étapes sans interaction manuelle.