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.
- package/README.md +487 -135
- package/dist/cjs/hooks/useStepNavigation.js +25 -3
- package/dist/cjs/hooks/useStepNavigation.js.map +1 -1
- package/dist/cjs/hooks/useUserInputForm.js +3 -2
- package/dist/cjs/hooks/useUserInputForm.js.map +1 -1
- package/dist/cjs/services/sessionService.js +36 -0
- package/dist/cjs/services/sessionService.js.map +1 -1
- package/dist/esm/hooks/useStepNavigation.js +26 -4
- package/dist/esm/hooks/useStepNavigation.js.map +1 -1
- package/dist/esm/hooks/useUserInputForm.js +3 -2
- package/dist/esm/hooks/useUserInputForm.js.map +1 -1
- package/dist/esm/services/sessionService.js +36 -1
- package/dist/esm/services/sessionService.js.map +1 -1
- package/docs/README.md +6 -0
- package/docs/navigation-history.md +138 -0
- package/package.json +1 -1
|
@@ -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