datakeen-session-react 1.1.140-dev.24 → 1.1.140-dev.26
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/components/session/UserInputForm/CustomFormFields.js +1 -1
- package/dist/cjs/components/session/UserInputForm/CustomFormFields.js.map +1 -1
- package/dist/cjs/components/session/UserInputForm/IdentityFields.js +1 -1
- package/dist/cjs/components/session/UserInputForm/IdentityFields.js.map +1 -1
- package/dist/cjs/components/signature-electronic/DocusealSignature.js +2 -1
- package/dist/cjs/components/signature-electronic/DocusealSignature.js.map +1 -1
- 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/components/session/UserInputForm/CustomFormFields.js +1 -1
- package/dist/esm/components/session/UserInputForm/CustomFormFields.js.map +1 -1
- package/dist/esm/components/session/UserInputForm/IdentityFields.js +1 -1
- package/dist/esm/components/session/UserInputForm/IdentityFields.js.map +1 -1
- package/dist/esm/components/signature-electronic/DocusealSignature.js +2 -1
- package/dist/esm/components/signature-electronic/DocusealSignature.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
package/README.md
CHANGED
|
@@ -15,11 +15,26 @@
|
|
|
15
15
|
| `staging` | [](https://gitlab.com/datakeenteam/teamfullstack/client-sessions-react-sdk/-/pipelines) | [](https://gitlab.com/datakeenteam/teamfullstack/client-sessions-react-sdk/-/commits/staging) | [](https://www.npmjs.com/package/datakeen-session-react?activeTab=versions) |
|
|
16
16
|
| `dev` | [](https://gitlab.com/datakeenteam/teamfullstack/client-sessions-react-sdk/-/pipelines) | [](https://gitlab.com/datakeenteam/teamfullstack/client-sessions-react-sdk/-/commits/dev) | [](https://www.npmjs.com/package/datakeen-session-react?activeTab=versions) |
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
---
|
|
19
19
|
|
|
20
|
-
##
|
|
20
|
+
## Table des matières
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
1. [Installation](#installation)
|
|
23
|
+
2. [Stratégie de publication](#stratégie-de-publication)
|
|
24
|
+
3. [Démarrage rapide](#démarrage-rapide)
|
|
25
|
+
4. [API publique](#api-publique)
|
|
26
|
+
5. [Configuration de l'URL API](#configuration-de-lurl-api)
|
|
27
|
+
6. [Flux de vérification supportés](#flux-de-vérification-supportés)
|
|
28
|
+
7. [Architecture du SDK](#architecture-du-sdk)
|
|
29
|
+
8. [Système de polling](#système-de-polling)
|
|
30
|
+
9. [Internationalisation (i18n)](#internationalisation-i18n)
|
|
31
|
+
10. [Documentation avancée](#documentation-avancée)
|
|
32
|
+
11. [Développement et tests](#développement-et-tests)
|
|
33
|
+
12. [Support](#support)
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Installation
|
|
23
38
|
|
|
24
39
|
```bash
|
|
25
40
|
# Via npm
|
|
@@ -32,200 +47,537 @@ yarn add datakeen-session-react
|
|
|
32
47
|
pnpm add datakeen-session-react
|
|
33
48
|
```
|
|
34
49
|
|
|
35
|
-
###
|
|
36
|
-
|
|
37
|
-
Le SDK utilise une **pipeline CI/CD automatisée** qui publie automatiquement sur npm avec trois tags distincts selon la branche Git :
|
|
38
|
-
|
|
39
|
-
| Branche Git | Tag NPM | Format de version | Environnement | Commande d'installation |
|
|
40
|
-
| ----------- | --------- | ----------------------------------- | --------------------------- | ---------------------------------------- |
|
|
41
|
-
| `main` | `@latest` | `1.1.135` (Stable) | **Production** | `npm install datakeen-session-react` |
|
|
42
|
-
| `staging` | `@rc` | `1.1.135-rc.0` (Release Candidate) | **Pré-production** (QA/UAT) | `npm install datakeen-session-react@rc` |
|
|
43
|
-
| `dev` | `@dev` | `1.1.135-dev.3` (Integration Build) | **Développement** | `npm install datakeen-session-react@dev` |
|
|
44
|
-
|
|
45
|
-
#### 📦 Installation par environnement
|
|
50
|
+
### Peer dependencies requises
|
|
46
51
|
|
|
47
52
|
```bash
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
npm install datakeen-session-react@latest
|
|
53
|
+
npm install axios react react-dom
|
|
54
|
+
# axios@^1.8.0 react@^18.0.0 react-dom@^18.0.0
|
|
55
|
+
```
|
|
52
56
|
|
|
53
|
-
|
|
54
|
-
npm install datakeen-session-react@rc
|
|
57
|
+
---
|
|
55
58
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
+
## Stratégie de publication
|
|
60
|
+
|
|
61
|
+
Le SDK utilise une **pipeline CI/CD automatisée** qui publie sur npm avec trois tags distincts selon la branche Git :
|
|
59
62
|
|
|
60
|
-
|
|
63
|
+
| Branche Git | Tag NPM | Format de version | Environnement | Commande d'installation |
|
|
64
|
+
|-------------|-----------|---------------------------|--------------------|------------------------------------------|
|
|
65
|
+
| `main` | `@latest` | `1.1.x` (Stable) | **Production** | `npm install datakeen-session-react` |
|
|
66
|
+
| `staging` | `@rc` | `1.1.x-rc.y` (RC) | **Pré-production** | `npm install datakeen-session-react@rc` |
|
|
67
|
+
| `dev` | `@dev` | `1.1.x-dev.y` (Dev Build) | **Développement** | `npm install datakeen-session-react@dev` |
|
|
61
68
|
|
|
62
69
|
Chaque merge sur les branches principales déclenche automatiquement :
|
|
63
70
|
|
|
64
|
-
1.
|
|
65
|
-
2.
|
|
66
|
-
3.
|
|
71
|
+
1. **`dev`** → Incrémente la pré-version → Publie sur `@dev`
|
|
72
|
+
2. **`staging`** → Incrémente la RC → Publie sur `@rc`
|
|
73
|
+
3. **`main`** → Incrémente le patch → Publie sur `@latest`
|
|
67
74
|
|
|
68
|
-
|
|
75
|
+
---
|
|
69
76
|
|
|
70
|
-
##
|
|
77
|
+
## Démarrage rapide
|
|
71
78
|
|
|
72
79
|
### Prérequis
|
|
73
80
|
|
|
74
|
-
-
|
|
81
|
+
- React 18+
|
|
75
82
|
- Un identifiant de session Datakeen valide (obtenu via l'API Datakeen)
|
|
76
83
|
|
|
77
|
-
###
|
|
84
|
+
### Option 1 — Hook `useSession` (recommandé)
|
|
78
85
|
|
|
79
|
-
```
|
|
86
|
+
```tsx
|
|
80
87
|
import useSession from "datakeen-session-react";
|
|
88
|
+
|
|
89
|
+
const VerificationPage = () => {
|
|
90
|
+
const { SessionComponent } = useSession(
|
|
91
|
+
"votre-session-id",
|
|
92
|
+
{ selfie: false, requireMobile: false }, // optionnel
|
|
93
|
+
"https://app-v3.datakeen.co/backend" // optionnel
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
return <div>{SessionComponent}</div>;
|
|
97
|
+
};
|
|
81
98
|
```
|
|
82
99
|
|
|
83
|
-
###
|
|
100
|
+
### Option 2 — Composant `DatakeenSession`
|
|
84
101
|
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
// Initialisation avec l'ID de session
|
|
88
|
-
const { SessionComponent } = useSession("votre-session-id");
|
|
102
|
+
```tsx
|
|
103
|
+
import { DatakeenSession } from "datakeen-session-react";
|
|
89
104
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
105
|
+
const VerificationPage = () => (
|
|
106
|
+
<DatakeenSession
|
|
107
|
+
sessionId="votre-session-id"
|
|
108
|
+
sessionConfig={{ selfie: false, requireMobile: false }}
|
|
109
|
+
apiBaseUrl="https://app-v3.datakeen.co/backend"
|
|
110
|
+
/>
|
|
111
|
+
);
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Option 3 — Configuration globale avec `ConfigProvider`
|
|
115
|
+
|
|
116
|
+
```tsx
|
|
117
|
+
import { DatakeenSession, ConfigProvider } from "datakeen-session-react";
|
|
118
|
+
|
|
119
|
+
const App = () => (
|
|
120
|
+
<ConfigProvider apiBaseUrl="https://app-v3.datakeen.co/backend">
|
|
121
|
+
<DatakeenSession sessionId="votre-session-id" />
|
|
122
|
+
</ConfigProvider>
|
|
123
|
+
);
|
|
97
124
|
```
|
|
98
125
|
|
|
99
|
-
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## API publique
|
|
100
129
|
|
|
101
|
-
###
|
|
130
|
+
### `useSession(sessionId, sessionConfig?, apiBaseUrl?)` — Hook principal
|
|
102
131
|
|
|
103
|
-
```
|
|
104
|
-
import React from "react";
|
|
132
|
+
```typescript
|
|
105
133
|
import useSession from "datakeen-session-react";
|
|
106
134
|
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
return (
|
|
113
|
-
<div className="verification-container">
|
|
114
|
-
<h1>Vérification d'identité</h1>
|
|
115
|
-
<p>Merci de suivre les étapes ci-dessous pour vérifier votre identité</p>
|
|
116
|
-
|
|
117
|
-
{/* Le SDK gère automatiquement toutes les étapes du processus */}
|
|
118
|
-
<div className="session-wrapper">{SessionComponent}</div>
|
|
119
|
-
</div>
|
|
120
|
-
);
|
|
121
|
-
};
|
|
135
|
+
const { SessionComponent } = useSession(
|
|
136
|
+
sessionId: string,
|
|
137
|
+
sessionConfig?: SessionConfig,
|
|
138
|
+
apiBaseUrl?: string
|
|
139
|
+
);
|
|
122
140
|
```
|
|
123
141
|
|
|
124
|
-
|
|
142
|
+
| Paramètre | Type | Requis | Description |
|
|
143
|
+
|-----------|------|--------|-------------|
|
|
144
|
+
| `sessionId` | `string` | ✅ | ID unique de la session Datakeen |
|
|
145
|
+
| `sessionConfig` | `SessionConfig` | ❌ | Options de configuration du flux |
|
|
146
|
+
| `apiBaseUrl` | `string` | ❌ | URL de base de l'API (override la config globale) |
|
|
125
147
|
|
|
126
|
-
|
|
127
|
-
import React, { useState } from "react";
|
|
128
|
-
import useSession from "datakeen-session-react";
|
|
148
|
+
**`SessionConfig`**
|
|
129
149
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
// Fonction pour initialiser la session après l'étape 1
|
|
135
|
-
const initializeSession = async (userData) => {
|
|
136
|
-
// Exemple d'appel API pour obtenir un ID de session
|
|
137
|
-
const response = await fetch("https://api.votreservice.com/init-session", {
|
|
138
|
-
method: "POST",
|
|
139
|
-
body: JSON.stringify(userData),
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
const data = await response.json();
|
|
143
|
-
setSessionId(data.sessionId);
|
|
144
|
-
setStep(2);
|
|
145
|
-
};
|
|
146
|
-
|
|
147
|
-
// Rendu conditionnel basé sur l'étape
|
|
148
|
-
if (step === 1) {
|
|
149
|
-
return (
|
|
150
|
-
<div>
|
|
151
|
-
<h2>Étape 1: Informations de base</h2>
|
|
152
|
-
{/* Votre formulaire de collecte d'informations */}
|
|
153
|
-
<button
|
|
154
|
-
onClick={() =>
|
|
155
|
-
initializeSession({
|
|
156
|
-
/* données utilisateur */
|
|
157
|
-
})
|
|
158
|
-
}
|
|
159
|
-
>
|
|
160
|
-
Continuer
|
|
161
|
-
</button>
|
|
162
|
-
</div>
|
|
163
|
-
);
|
|
164
|
-
}
|
|
150
|
+
| Propriété | Type | Description |
|
|
151
|
+
|-----------|------|-------------|
|
|
152
|
+
| `selfie` | `boolean` | Active la vérification par selfie biométrique |
|
|
153
|
+
| `requireMobile` | `boolean` | Force l'utilisation d'un appareil mobile (redirection QR code) |
|
|
165
154
|
|
|
166
|
-
|
|
167
|
-
const { SessionComponent } = useSession(sessionId);
|
|
155
|
+
**Retour :** `{ SessionComponent: React.ReactElement }`
|
|
168
156
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
### `DatakeenSession` — Composant principal
|
|
160
|
+
|
|
161
|
+
```tsx
|
|
162
|
+
import { DatakeenSession } from "datakeen-session-react";
|
|
163
|
+
|
|
164
|
+
<DatakeenSession
|
|
165
|
+
sessionId="votre-session-id"
|
|
166
|
+
sessionConfig={{ selfie: true }}
|
|
167
|
+
apiBaseUrl="https://app-v3.datakeen.co/backend"
|
|
168
|
+
/>
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Gère automatiquement : loading/erreur/expiration, layouts mobile/desktop, couleurs dynamiques depuis le template, redirection QR code si `requireMobile`.
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
### `ConfigProvider` — Provider de configuration
|
|
176
|
+
|
|
177
|
+
```tsx
|
|
178
|
+
import { ConfigProvider } from "datakeen-session-react";
|
|
179
|
+
|
|
180
|
+
<ConfigProvider apiBaseUrl="https://app-v3.datakeen.co/backend">
|
|
181
|
+
{/* Tous les DatakeenSession enfants utilisent cette URL */}
|
|
182
|
+
<DatakeenSession sessionId="session-1" />
|
|
183
|
+
</ConfigProvider>
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
### `configureApiBaseURL(baseURL)` — Configuration runtime
|
|
189
|
+
|
|
190
|
+
```typescript
|
|
191
|
+
import { configureApiBaseURL } from "datakeen-session-react";
|
|
192
|
+
|
|
193
|
+
// À appeler une fois au démarrage de l'application
|
|
194
|
+
configureApiBaseURL("https://app-v3.datakeen.co/backend");
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
### `useI18n()` — Hook de traduction
|
|
200
|
+
|
|
201
|
+
```typescript
|
|
202
|
+
import { useI18n } from "datakeen-session-react";
|
|
203
|
+
|
|
204
|
+
const { t, translateCodeDescription, translateDocumentType, setLanguage, currentLanguage } = useI18n();
|
|
205
|
+
|
|
206
|
+
// Changer la langue ("fr" | "en")
|
|
207
|
+
await setLanguage("en");
|
|
208
|
+
|
|
209
|
+
// Traduire un code d'analyse (ex: "2.2")
|
|
210
|
+
const desc = translateCodeDescription("2.2");
|
|
211
|
+
|
|
212
|
+
// Traduire un type de document
|
|
213
|
+
const label = translateDocumentType("passport");
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
### `I18nProvider` / `useI18nContext()` — Contexte i18n
|
|
219
|
+
|
|
220
|
+
```tsx
|
|
221
|
+
import { I18nProvider, useI18nContext } from "datakeen-session-react";
|
|
222
|
+
|
|
223
|
+
// Provider
|
|
224
|
+
<I18nProvider defaultLanguage="fr">
|
|
225
|
+
{children}
|
|
226
|
+
</I18nProvider>
|
|
227
|
+
|
|
228
|
+
// Hook contexte
|
|
229
|
+
const { language, setLanguage } = useI18nContext();
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
### Utilitaires d'analyse — `extractRootCauses`, `hasAnalysisFailed`, `getPrimaryRootCause`
|
|
235
|
+
|
|
236
|
+
```typescript
|
|
237
|
+
import { extractRootCauses, hasAnalysisFailed, getPrimaryRootCause } from "datakeen-session-react";
|
|
238
|
+
import type { Prediction, AnalysisResult } from "datakeen-session-react";
|
|
239
|
+
|
|
240
|
+
// Extraire toutes les causes d'échec
|
|
241
|
+
const causes: string[] = extractRootCauses(predictions);
|
|
242
|
+
|
|
243
|
+
// Vérifier si l'analyse a échoué
|
|
244
|
+
const failed: boolean = hasAnalysisFailed(predictions);
|
|
245
|
+
|
|
246
|
+
// Obtenir la cause principale
|
|
247
|
+
const primary: string | null = getPrimaryRootCause(predictions);
|
|
177
248
|
```
|
|
178
249
|
|
|
179
|
-
|
|
250
|
+
**Interface `Prediction`**
|
|
180
251
|
|
|
181
|
-
|
|
252
|
+
```typescript
|
|
253
|
+
interface Prediction {
|
|
254
|
+
code: string; // ex: "1.0", "2.2", "4.0"
|
|
255
|
+
codeName: string; // ex: "conform", "non_conform"
|
|
256
|
+
codeDescription: string;
|
|
257
|
+
type: string;
|
|
258
|
+
userInput?: { birthDate?: string; firstName?: string; lastName?: string };
|
|
259
|
+
}
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
**Codes de résultat principaux :**
|
|
263
|
+
|
|
264
|
+
| Code | Statut | Signification |
|
|
265
|
+
|------|--------|---------------|
|
|
266
|
+
| `1.0` | `ai_approved` | Document vérifié avec succès |
|
|
267
|
+
| `2.x` | `ai_rejected` | Document refusé (ex: `2.1` qualité, `2.2` non-conforme) |
|
|
268
|
+
| `3.0` | `failed` | Erreur d'analyse |
|
|
269
|
+
| `4.0` | `to_verify` | Vérification manuelle requise |
|
|
182
270
|
|
|
183
|
-
|
|
271
|
+
---
|
|
184
272
|
|
|
185
|
-
|
|
273
|
+
### Service qualité image — `professionalImageQuality`
|
|
186
274
|
|
|
187
|
-
|
|
188
|
-
-
|
|
189
|
-
|
|
190
|
-
- Titre de séjour
|
|
275
|
+
```typescript
|
|
276
|
+
import { professionalImageQuality } from "datakeen-session-react";
|
|
277
|
+
import type { QualityAnalysis, QualityEnhancementOptions } from "datakeen-session-react";
|
|
191
278
|
|
|
192
|
-
|
|
279
|
+
// Analyser la qualité
|
|
280
|
+
const analysis: QualityAnalysis = professionalImageQuality.analyzeQuality(width, height);
|
|
281
|
+
|
|
282
|
+
// Amélioration automatique depuis flux vidéo
|
|
283
|
+
const { dataUrl, analysis, enhanced } = professionalImageQuality.autoEnhanceImage(
|
|
284
|
+
videoElement,
|
|
285
|
+
{ x: 0, y: 0, width: 640, height: 480 },
|
|
286
|
+
{ outputFormat: "jpeg", jpegQuality: 0.92 }
|
|
287
|
+
);
|
|
288
|
+
```
|
|
193
289
|
|
|
194
|
-
|
|
290
|
+
---
|
|
195
291
|
|
|
196
|
-
|
|
292
|
+
### Chargement CSS dynamique — `useRouteCSS`
|
|
197
293
|
|
|
198
|
-
|
|
294
|
+
```typescript
|
|
295
|
+
import { useRouteCSS } from "datakeen-session-react";
|
|
199
296
|
|
|
297
|
+
// Charger le CSS d'une route au montage
|
|
298
|
+
const { loadCSS, unloadCSS } = useRouteCSS("selfie", {
|
|
299
|
+
unloadOnUnmount: true
|
|
300
|
+
});
|
|
200
301
|
```
|
|
201
|
-
|
|
302
|
+
|
|
303
|
+
**Routes CSS disponibles :** `start`, `user-input`, `contact-info`, `otp`, `selfie`, `document-check`, `end-flow`, `jdi`, `video-recorder`, `ui-components`
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
## Configuration de l'URL API
|
|
308
|
+
|
|
309
|
+
Le SDK résout l'URL API dans cet ordre de priorité :
|
|
310
|
+
|
|
311
|
+
1. Prop `apiBaseUrl` passée à `useSession` / `DatakeenSession`
|
|
312
|
+
2. `ConfigProvider` parent avec `apiBaseUrl`
|
|
313
|
+
3. `configureApiBaseURL()` appelée au runtime
|
|
314
|
+
4. `window.VITE_API_BASE_URL` (variable globale injectée)
|
|
315
|
+
5. `import.meta.env.VITE_API_BASE_URL` (Vite)
|
|
316
|
+
6. Fallback : `http://localhost:8888`
|
|
317
|
+
|
|
318
|
+
### Configuration par environnement (exemple)
|
|
319
|
+
|
|
320
|
+
```typescript
|
|
321
|
+
// sdk-configuration.ts
|
|
322
|
+
import { configureApiBaseURL } from "datakeen-session-react";
|
|
323
|
+
|
|
324
|
+
const urls = {
|
|
325
|
+
production: "https://app-v3.datakeen.co/backend",
|
|
326
|
+
staging: "https://app.staging.datakeen.co/backend",
|
|
327
|
+
development:"https://app.dev.datakeen.co/backend",
|
|
328
|
+
};
|
|
329
|
+
|
|
330
|
+
configureApiBaseURL(urls[process.env.NODE_ENV] ?? urls.development);
|
|
202
331
|
```
|
|
203
332
|
|
|
204
|
-
|
|
333
|
+
### Via `.env` (Vite)
|
|
334
|
+
|
|
335
|
+
```env
|
|
336
|
+
VITE_API_BASE_URL=https://app-v3.datakeen.co/backend
|
|
337
|
+
```
|
|
205
338
|
|
|
339
|
+
Commande de setup rapide :
|
|
206
340
|
```bash
|
|
207
341
|
npm run setup:env
|
|
208
342
|
```
|
|
209
343
|
|
|
210
|
-
|
|
344
|
+
Voir [docs/configuration.md](./docs/configuration.md) et [docs/dynamic-configuration.md](./docs/dynamic-configuration.md) pour plus de détails.
|
|
211
345
|
|
|
212
|
-
|
|
346
|
+
---
|
|
213
347
|
|
|
214
|
-
##
|
|
348
|
+
## Flux de vérification supportés
|
|
215
349
|
|
|
216
|
-
|
|
350
|
+
### Types de nœuds dans un parcours (template)
|
|
217
351
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
-
|
|
352
|
+
| Type de nœud | Description |
|
|
353
|
+
|---|---|
|
|
354
|
+
| `information-input` | Saisie données utilisateur (identité, contact, adresse, champs custom) |
|
|
355
|
+
| `document-collection` | Collecte et analyse de document (upload ou photo recto/verso) |
|
|
356
|
+
| `controle-jdi` | Justificatif de domicile (JDI) |
|
|
357
|
+
| `selfie-capture` | Capture selfie biométrique (via Unissey) |
|
|
358
|
+
| `biometric-capture` | Capture biométrique |
|
|
359
|
+
| `video-capture` | Capture vidéo du document |
|
|
360
|
+
| `condition` | Branchement conditionnel basé sur les données de session |
|
|
361
|
+
| `end` | Écran de fin et callback |
|
|
362
|
+
| `custom` | Nœud personnalisé avec champs définis dans le template |
|
|
221
363
|
|
|
222
|
-
|
|
364
|
+
### Documents d'identité supportés
|
|
365
|
+
|
|
366
|
+
- 🇫🇷 Carte Nationale d'Identité
|
|
367
|
+
- 🇫🇷 Passeport
|
|
368
|
+
- 🇫🇷 Permis de conduire
|
|
369
|
+
- 🇫🇷 Titre de séjour
|
|
370
|
+
|
|
371
|
+
### Types de champs custom (`CustomField`)
|
|
372
|
+
|
|
373
|
+
```typescript
|
|
374
|
+
type CustomFieldValueType =
|
|
375
|
+
| "text" | "enum" | "number" | "boolean"
|
|
376
|
+
| "date" | "address" | "list";
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
---
|
|
380
|
+
|
|
381
|
+
## Architecture du SDK
|
|
382
|
+
|
|
383
|
+
```
|
|
384
|
+
DatakeenSession
|
|
385
|
+
├── useSessionData → Chargement & normalisation session depuis API
|
|
386
|
+
├── useStepNavigation → Navigation graph-like (edges + conditions)
|
|
387
|
+
└── SessionContent → Dispatcher étapes → composants
|
|
388
|
+
├── StartSession
|
|
389
|
+
├── UserInputForm (identity / contact / address / custom fields)
|
|
390
|
+
├── DocumentCollection (upload + photo recto/verso + retry)
|
|
391
|
+
├── JDI flow (Justificatif de domicile)
|
|
392
|
+
├── Selfie / VideoCapture / BiometricCapture
|
|
393
|
+
├── OTPVerification
|
|
394
|
+
├── ContactInfoForm
|
|
395
|
+
├── PdfGeneration
|
|
396
|
+
└── EndFlow
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
### Gestion d'état
|
|
400
|
+
|
|
401
|
+
- **Store global** : `SessionContext` (session, step, userInput, contactInfo)
|
|
402
|
+
- **Mémoire session** : `sessionMemoryStore` (Map<sessionId, données>) — persiste userInput entre les étapes
|
|
403
|
+
- **Retry counts** : Stockés dans `session.retryCounts: Record<nodeId, number>`
|
|
404
|
+
|
|
405
|
+
### Navigation
|
|
406
|
+
|
|
407
|
+
La navigation suit les **edges du template** (graphe orienté). Les nœuds `condition` et `external-verification` s'auto-exécutent et sont sautés lors du retour arrière.
|
|
408
|
+
|
|
409
|
+
```typescript
|
|
410
|
+
// Primitives exposées par useStepNavigation
|
|
411
|
+
setStep(n, skipHistory?) // navigation directe
|
|
412
|
+
goBack() // retour (skip auto-executing nodes)
|
|
413
|
+
goToNextStep(nodeId, template, handle?) // suit les edges
|
|
414
|
+
canGoBack // boolean
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
Voir [docs/navigation-history.md](./docs/navigation-history.md).
|
|
418
|
+
|
|
419
|
+
### Nœud conditionnel
|
|
420
|
+
|
|
421
|
+
Le nœud `condition` évalue des expressions basées sur :
|
|
422
|
+
- `userInput.*` — données saisies par l'utilisateur
|
|
423
|
+
- `session.result.*` — résultat d'analyse IA
|
|
424
|
+
- `{documentTemplateId}.*` — champs extraits du document
|
|
425
|
+
|
|
426
|
+
Voir [docs/condition-node.md](./docs/condition-node.md).
|
|
427
|
+
|
|
428
|
+
---
|
|
429
|
+
|
|
430
|
+
## Système de polling
|
|
431
|
+
|
|
432
|
+
Le système de polling (v2.0.0) supporte les **analyses multiples par session** et suit l'état via `analysisId`.
|
|
433
|
+
|
|
434
|
+
### Cycle d'états d'une analyse
|
|
435
|
+
|
|
436
|
+
| `status` | `analysisId` | `progress` | `code` | Signification |
|
|
437
|
+
|----------|-------------|-----------|--------|---------------|
|
|
438
|
+
| `processing` | `null` | 50% | `null` | Analyse en cours |
|
|
439
|
+
| `ai_approved` | set | 100% | `1.0` | Document approuvé |
|
|
440
|
+
| `ai_rejected` | set | 100% | `2.x` | Document refusé |
|
|
441
|
+
| `to_verify` | set | 100% | `4.0` | Vérification manuelle |
|
|
442
|
+
| `failed` | set | 100% | `3.0` | Erreur d'analyse |
|
|
443
|
+
|
|
444
|
+
### Options de polling
|
|
445
|
+
|
|
446
|
+
```typescript
|
|
447
|
+
analyzeFiles(sessionId, nodeId, files, docTypeId, {
|
|
448
|
+
enablePolling: true,
|
|
449
|
+
pollingOptions: {
|
|
450
|
+
interval: 2000, // ms entre chaque poll
|
|
451
|
+
maxAttempts: 300, // max 10 min
|
|
452
|
+
timeout: 600000,
|
|
453
|
+
onProgress: (status) => { /* ... */ },
|
|
454
|
+
onComplete: (result) => { /* ... */ },
|
|
455
|
+
onFailed: (error) => { /* ... */ },
|
|
456
|
+
}
|
|
457
|
+
});
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
Voir [docs/POLLING_SYSTEM.md](./docs/POLLING_SYSTEM.md) pour la documentation complète.
|
|
461
|
+
|
|
462
|
+
---
|
|
463
|
+
|
|
464
|
+
## Internationalisation (i18n)
|
|
465
|
+
|
|
466
|
+
Le SDK utilise sa propre instance **i18next** (isolée de l'application hôte).
|
|
467
|
+
|
|
468
|
+
- **Langues supportées** : `fr` (défaut), `en`
|
|
469
|
+
- **Persistance** : `localStorage` clé `datakeen-sdk-language`
|
|
470
|
+
- **Ressources** : traductions principales, types de documents, noms de pays (ISO2/ISO3)
|
|
471
|
+
|
|
472
|
+
```tsx
|
|
473
|
+
// Intégration avec I18nProvider
|
|
474
|
+
<I18nProvider defaultLanguage="fr">
|
|
475
|
+
<DatakeenSession sessionId="..." />
|
|
476
|
+
</I18nProvider>
|
|
477
|
+
|
|
478
|
+
// Changement de langue depuis l'application hôte
|
|
479
|
+
const { setLanguage } = useI18nContext();
|
|
480
|
+
setLanguage("en");
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
---
|
|
484
|
+
|
|
485
|
+
## Documentation avancée
|
|
486
|
+
|
|
487
|
+
| Document | Description |
|
|
488
|
+
|----------|-------------|
|
|
489
|
+
| [docs/JOURNEY_NODE_BUILDER.md](./docs/JOURNEY_NODE_BUILDER.md) | Architecture runtime, ajouter un nouveau type de nœud |
|
|
490
|
+
| [docs/POLLING_SYSTEM.md](./docs/POLLING_SYSTEM.md) | Système de polling v2.0.0 — **point de départ recommandé** |
|
|
491
|
+
| [docs/condition-node.md](./docs/condition-node.md) | Nœud conditionnel — tokens, expressions, exemples |
|
|
492
|
+
| [docs/navigation-history.md](./docs/navigation-history.md) | Système d'historique de navigation |
|
|
493
|
+
| [docs/configuration.md](./docs/configuration.md) | Configuration de base |
|
|
494
|
+
| [docs/dynamic-configuration.md](./docs/dynamic-configuration.md) | Configuration dynamique multienv |
|
|
495
|
+
| [docs/environment.md](./docs/environment.md) | Variables d'environnement |
|
|
496
|
+
| [docs/migration-guide.md](./docs/migration-guide.md) | Guide de migration depuis l'ancienne API |
|
|
497
|
+
| [docs/sdk_integration_guide.md](./docs/sdk_integration_guide.md) | Intégration dans un projet Vite + React |
|
|
498
|
+
|
|
499
|
+
### Exemples de code
|
|
500
|
+
|
|
501
|
+
| Fichier | Description |
|
|
502
|
+
|---------|-------------|
|
|
503
|
+
| [examples/usage-example.tsx](./examples/usage-example.tsx) | Intégration basique |
|
|
504
|
+
| [examples/analysis-progress-example.tsx](./examples/analysis-progress-example.tsx) | Polling avec barre de progression |
|
|
505
|
+
| [examples/sdk-configuration.ts](./examples/sdk-configuration.ts) | Configuration par environnement |
|
|
506
|
+
| [examples/test-updated-urls.ts](./examples/test-updated-urls.ts) | Tests de validation des URLs |
|
|
507
|
+
|
|
508
|
+
---
|
|
509
|
+
|
|
510
|
+
## Développement et tests
|
|
511
|
+
|
|
512
|
+
### Scripts disponibles
|
|
513
|
+
|
|
514
|
+
```bash
|
|
515
|
+
# Build production (CJS + ESM + types)
|
|
516
|
+
pnpm build
|
|
517
|
+
|
|
518
|
+
# Build en mode watch
|
|
519
|
+
pnpm build:watch
|
|
520
|
+
|
|
521
|
+
# Développement avec hot-reload
|
|
522
|
+
pnpm dev
|
|
523
|
+
|
|
524
|
+
# Lancer les tests Jest
|
|
525
|
+
pnpm test
|
|
526
|
+
|
|
527
|
+
# Lancer le SDK + la démo en parallèle
|
|
528
|
+
pnpm dev:full
|
|
529
|
+
|
|
530
|
+
# Lint
|
|
531
|
+
pnpm lint
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
### Stack technique
|
|
535
|
+
|
|
536
|
+
| Outil | Version | Rôle |
|
|
537
|
+
|-------|---------|------|
|
|
538
|
+
| TypeScript | 5.8 | Typage strict |
|
|
539
|
+
| Rollup | 4.x | Bundler (CJS + ESM + types) |
|
|
540
|
+
| Babel | 7.x | Transpilation |
|
|
541
|
+
| Jest | 29.x | Tests unitaires |
|
|
542
|
+
| React Testing Library | — | Tests composants |
|
|
543
|
+
| Cypress | 13.x | Tests composants E2E |
|
|
544
|
+
| Tailwind CSS | 4.x | Styles |
|
|
545
|
+
| ESLint | 9.x | Linting (flat config) |
|
|
546
|
+
|
|
547
|
+
### Formats de build
|
|
548
|
+
|
|
549
|
+
| Format | Chemin | Usage |
|
|
550
|
+
|--------|--------|-------|
|
|
551
|
+
| CommonJS | `dist/cjs/` | Node.js / bundlers CJS |
|
|
552
|
+
| ES Module | `dist/esm/` | Bundlers modernes (Vite, etc.) |
|
|
553
|
+
| TypeScript | `dist/types/` | Déclarations de types |
|
|
554
|
+
|
|
555
|
+
### Ajouter un nouveau nœud
|
|
556
|
+
|
|
557
|
+
1. Étendre `SessionTemplateNode` dans `src/types/session.ts`
|
|
558
|
+
2. Créer le composant dans `src/components/`
|
|
559
|
+
3. Brancher dans `src/components/template/TemplateNodeRenderer.tsx`
|
|
560
|
+
4. Gérer navigation et persistance
|
|
561
|
+
5. Ajouter styles et traductions (`src/i18n/fr.json`, `en.json`)
|
|
562
|
+
6. Écrire les tests
|
|
563
|
+
|
|
564
|
+
Voir [docs/JOURNEY_NODE_BUILDER.md](./docs/JOURNEY_NODE_BUILDER.md) pour la checklist complète.
|
|
565
|
+
|
|
566
|
+
---
|
|
567
|
+
|
|
568
|
+
## Support
|
|
569
|
+
|
|
570
|
+
- **Email** : support@datakeen.co
|
|
571
|
+
- **Documentation API** : [https://api.datakeen.co/docs](https://api.datakeen.co/docs)
|
|
572
|
+
- **Site Web** : [www.datakeen.co](https://www.datakeen.co)
|
|
573
|
+
|
|
574
|
+
---
|
|
223
575
|
|
|
224
576
|
<div style="background-color: #11E5C5; color: white; padding: 15px; border-radius: 5px; margin-top: 30px; display: flex; align-items: center; justify-content: space-between;">
|
|
225
577
|
<div>
|
|
226
578
|
<strong>Datakeen</strong> - Solutions d'identité numérique
|
|
227
579
|
</div>
|
|
228
580
|
<div>
|
|
229
|
-
Dernière mise à jour:
|
|
581
|
+
Dernière mise à jour: Mars 2026
|
|
230
582
|
</div>
|
|
231
583
|
</div>
|