datakeen-session-react 1.1.140-dev.24 → 1.1.140-dev.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,138 @@
1
+ # Navigation History — Guide développeur
2
+
3
+ ## Vue d'ensemble
4
+
5
+ Le SDK gère la navigation entre les étapes d'un parcours via un système d'historique interne, implémenté dans `src/hooks/useStepNavigation.ts`. Il ne s'appuie **pas** sur React Router ou l'historique du navigateur.
6
+
7
+ ---
8
+
9
+ ## Architecture
10
+
11
+ ### Représentation de l'état
12
+
13
+ ```typescript
14
+ step: number // étape courante (0 = écran de démarrage, 1+ = nœuds du template)
15
+ history: number[] // pile d'étapes visitées, ex: [0, 1, 3, 4]
16
+ ```
17
+
18
+ L'index des étapes est **1-based** pour les nœuds du template : le nœud à l'index 0 dans `getOrderedJourneySteps()` correspond au step `1`.
19
+
20
+ ### Les 4 primitives exposées via `stepObject`
21
+
22
+ | Primitive | Description |
23
+ |-----------|-------------|
24
+ | `step` | Étape courante |
25
+ | `setStep(n, skipHistory?)` | Navigue vers l'étape `n`. Par défaut ajoute `n` à l'historique sauf si `skipHistory = true` |
26
+ | `goBack()` | Dépile l'historique et navigue vers l'étape précédente |
27
+ | `goToNextStep(nodeId, template, handle?)` | Suit le graphe d'edges depuis `nodeId` pour déterminer la prochaine étape |
28
+ | `canGoBack` | `true` si `history.length > 1` |
29
+
30
+ ---
31
+
32
+ ## Cycle de vie de l'historique
33
+
34
+ ### 1. Initialisation
35
+
36
+ Au montage, l'historique est initialisé à `[0]` (état d'attente de `initialStep`).
37
+
38
+ Quand `initialStep` arrive depuis la base de données (via l'API), le hook initialise **une seule fois** (`hasInitialized.current`). Il distingue deux cas :
39
+
40
+ ```
41
+ histoire déjà > 1 élément → l'utilisateur a navigué avant l'arrivée d'initialStep
42
+ → l'historique existant est conservé
43
+
44
+ histoire = 1 élément → reprise de session (page rouverte à mi-parcours)
45
+ → l'historique est reconstruit via le graphe
46
+ → reconstructHistoryToStep(initialStep, template)
47
+ ```
48
+
49
+ ### 2. Navigation forward
50
+
51
+ `goToNextStep` suit les edges du template (définis dans `template.edges`) pour trouver l'index du nœud suivant. Il appelle ensuite `setStep(nextIndex)`, qui ajoute l'index à l'historique :
52
+
53
+ ```
54
+ [0] → [0, 1] → [0, 1, 3] → [0, 1, 3, 4]
55
+ ```
56
+
57
+ > Note : les indexes ne sont pas nécessairement consécutifs (+1) car le graphe peut avoir des sauts ou des branches.
58
+
59
+ ### 3. Navigation backward — `goBack()`
60
+
61
+ `goBack()` dépile l'historique et saute automatiquement les nœuds **auto-exécutants** :
62
+
63
+ ```typescript
64
+ const AUTO_EXECUTING_TYPES = new Set(["external-verification", "condition"]);
65
+ ```
66
+
67
+ Exemple avec un nœud `condition` au step 3 :
68
+
69
+ ```
70
+ history: [0, 1, 3, 4]
71
+
72
+ 1. pop() → candidate: 3 (condition) → skipped
73
+ 2. pop() → candidate: 1 (information-input) → stop
74
+
75
+ → navigation vers step 1
76
+ ```
77
+
78
+ `setStep` est appelé avec `skipHistory = true` pour ne pas polluer l'historique lors d'un retour.
79
+
80
+ ### 4. Déduplication
81
+
82
+ `setStep` ne pousse jamais deux fois le même index consécutivement :
83
+
84
+ ```typescript
85
+ setHistory((prev) => {
86
+ if (prev[prev.length - 1] === newStep) return prev;
87
+ return [...prev, newStep];
88
+ });
89
+ ```
90
+
91
+ Cela évite le doublon `[..., 4, 4]` qui se produisait quand `initialStep` arrivait de l'API alors que l'utilisateur était déjà sur ce step.
92
+
93
+ ---
94
+
95
+ ## Reconstruction de l'historique (`reconstructHistoryToStep`)
96
+
97
+ Définie dans `src/services/sessionService.ts`, cette fonction est utilisée lors d'une reprise de session.
98
+
99
+ Elle suit les edges par défaut (première edge sortante de chaque nœud) depuis le step 0 jusqu'à `targetStep` :
100
+
101
+ ```typescript
102
+ reconstructHistoryToStep(4, template)
103
+ // → [0, 1, 2, 3, 4] si le chemin linéaire existe dans le graphe
104
+ // → [0, 4] fallback si le graphe ne peut pas atteindre targetStep
105
+ ```
106
+
107
+ > **Limitation** : la reconstruction suit toujours la première edge sortante de chaque nœud. Si le parcours réel a emprunté une branche conditionnelle (ex: `condition → true`), l'historique reconstruit peut différer du parcours original. Le retour sera correct tant que les nœuds intermédiaires sont rendus correctement.
108
+
109
+ ---
110
+
111
+ ## Pièges courants
112
+
113
+ ### Ne pas utiliser `setStep(step - 1)` pour le bouton retour
114
+
115
+ ```typescript
116
+ // INCORRECT — décrémentation arithmétique, ignore le graphe réel
117
+ const goOnPreviousStep = () => setStep(step - 1);
118
+
119
+ // CORRECT — utilise l'historique
120
+ const goOnPreviousStep = () => goBack();
121
+ ```
122
+
123
+ `step - 1` peut pointer vers un step inexistant (si les indexes ne sont pas consécutifs), ou sauter par-dessus des nœuds auto-exécutants qui doivent être ignorés.
124
+
125
+ ### Ne pas appeler `setStep` directement depuis un composant pour naviguer en avant
126
+
127
+ Préférer `goToNextStep(node.id, template)` qui résout automatiquement l'index suivant via le graphe. `setStep` est réservé aux cas où l'index de destination est déjà connu (ex: reprise de session, `goBack`).
128
+
129
+ ---
130
+
131
+ ## Fichiers de référence
132
+
133
+ | Fichier | Rôle |
134
+ |---------|------|
135
+ | `src/hooks/useStepNavigation.ts` | Implémentation complète de l'historique |
136
+ | `src/services/sessionService.ts` | `getOrderedJourneySteps`, `getNextStepIndex`, `reconstructHistoryToStep` |
137
+ | `src/hooks/useUserInputForm.ts` | Exemple d'utilisation de `goBack()` dans un formulaire |
138
+ | `src/components/session/ContactInfoForm.tsx` | Autre exemple de bouton retour correct |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "datakeen-session-react",
3
- "version": "1.1.140-dev.24",
3
+ "version": "1.1.140-dev.25",
4
4
  "description": "React SDK component to manage and render Datakeen session experiences easily.",
5
5
  "publishConfig": {
6
6
  "access": "public",