@sanctum-key/react-native-sdk 1.0.49 → 1.0.51
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/build/package.json +1 -1
- package/build/src/components/KYCElements/CountrySelection.d.ts.map +1 -1
- package/build/src/components/KYCElements/CountrySelection.js +33 -108
- package/build/src/components/KYCElements/CountrySelection.js.map +1 -1
- package/build/src/components/KYCElements/CountrySelectionTemplate.d.ts.map +1 -1
- package/build/src/components/KYCElements/CountrySelectionTemplate.js +50 -164
- package/build/src/components/KYCElements/CountrySelectionTemplate.js.map +1 -1
- package/build/src/components/KYCElements/DocumentTypeSelection.d.ts.map +1 -1
- package/build/src/components/KYCElements/DocumentTypeSelection.js +32 -109
- package/build/src/components/KYCElements/DocumentTypeSelection.js.map +1 -1
- package/build/src/components/KYCElements/IDCardCapture.d.ts.map +1 -1
- package/build/src/components/KYCElements/IDCardCapture.js +58 -25
- package/build/src/components/KYCElements/IDCardCapture.js.map +1 -1
- package/build/src/components/KYCElements/InitializationStep.d.ts.map +1 -1
- package/build/src/components/KYCElements/InitializationStep.js +13 -1
- package/build/src/components/KYCElements/InitializationStep.js.map +1 -1
- package/build/src/components/KYCElements/LocationCaptureTemplate.d.ts.map +1 -1
- package/build/src/components/KYCElements/LocationCaptureTemplate.js +46 -157
- package/build/src/components/KYCElements/LocationCaptureTemplate.js.map +1 -1
- package/build/src/components/KYCElements/SelfieCapture.d.ts.map +1 -1
- package/build/src/components/KYCElements/SelfieCapture.js +28 -24
- package/build/src/components/KYCElements/SelfieCapture.js.map +1 -1
- package/build/src/components/KYCElements/VerificationProgressTemplate.d.ts.map +1 -1
- package/build/src/components/KYCElements/VerificationProgressTemplate.js +0 -4
- package/build/src/components/KYCElements/VerificationProgressTemplate.js.map +1 -1
- package/build/src/components/SelfieCapture.d.ts.map +1 -1
- package/build/src/components/SelfieCapture.js +33 -90
- package/build/src/components/SelfieCapture.js.map +1 -1
- package/build/src/components/TemplateKYCExample.d.ts.map +1 -1
- package/build/src/components/TemplateKYCExample.js +69 -120
- package/build/src/components/TemplateKYCExample.js.map +1 -1
- package/build/src/components/TemplateKYCFlowRefactored.d.ts +0 -2
- package/build/src/components/TemplateKYCFlowRefactored.d.ts.map +1 -1
- package/build/src/components/TemplateKYCFlowRefactored.js +95 -210
- package/build/src/components/TemplateKYCFlowRefactored.js.map +1 -1
- package/build/src/hooks/useTemplateKYCFlow.d.ts.map +1 -1
- package/build/src/hooks/useTemplateKYCFlow.js.map +1 -1
- package/build/src/types/KYC.types.d.ts.map +1 -1
- package/build/src/types/KYC.types.js.map +1 -1
- package/build/src/utils/logger.d.ts +12 -4
- package/build/src/utils/logger.d.ts.map +1 -1
- package/build/src/utils/logger.js +156 -28
- package/build/src/utils/logger.js.map +1 -1
- package/package.json +1 -1
- package/src/components/KYCElements/CountrySelection.tsx +36 -109
- package/src/components/KYCElements/CountrySelectionTemplate.tsx +67 -266
- package/src/components/KYCElements/DocumentTypeSelection.tsx +34 -110
- package/src/components/KYCElements/IDCardCapture.tsx +93 -39
- package/src/components/KYCElements/InitializationStep.tsx +17 -2
- package/src/components/KYCElements/LocationCaptureTemplate.tsx +53 -170
- package/src/components/KYCElements/SelfieCapture.tsx +50 -58
- package/src/components/KYCElements/VerificationProgressTemplate.tsx +1 -4
- package/src/components/SelfieCapture.tsx +44 -100
- package/src/components/TemplateKYCExample.tsx +94 -145
- package/src/components/TemplateKYCFlowRefactored.tsx +105 -239
- package/src/hooks/useTemplateKYCFlow.tsx +1 -0
- package/src/types/KYC.types.ts +0 -1
- package/src/utils/logger.ts +182 -29
|
@@ -3,6 +3,7 @@ import { View, Text, TouchableOpacity, Image, Alert, StyleSheet } from 'react-na
|
|
|
3
3
|
import { useKYCStore } from '../stores/kycStore';
|
|
4
4
|
import VisionCameraModule from '../modules/camera/VisionCameraModule';
|
|
5
5
|
import { EnhancedCameraView } from './EnhancedCameraView';
|
|
6
|
+
import { sdkLogger } from '../utils/logger';
|
|
6
7
|
export const SelfieCapture = () => {
|
|
7
8
|
const [capturedSelfie, setCapturedSelfie] = useState(null);
|
|
8
9
|
const [isCapturing, setIsCapturing] = useState(false);
|
|
@@ -10,10 +11,11 @@ export const SelfieCapture = () => {
|
|
|
10
11
|
const { setSelfie, setProcessing } = useKYCStore();
|
|
11
12
|
const instructions = "Placez votre visage dans le cadre et souriez naturellement. Assurez-vous que votre visage est bien éclairé et centré.";
|
|
12
13
|
useEffect(() => {
|
|
13
|
-
|
|
14
|
+
sdkLogger.info("User started Selfie Capture step");
|
|
14
15
|
const checkCameraAvailability = async () => {
|
|
15
16
|
const isAvailable = await VisionCameraModule.isCameraAvailable();
|
|
16
17
|
if (!isAvailable) {
|
|
18
|
+
sdkLogger.error("Selfie camera check failed: Camera not available on this platform");
|
|
17
19
|
Alert.alert('Erreur', 'Caméra non disponible sur cette plateforme');
|
|
18
20
|
}
|
|
19
21
|
};
|
|
@@ -21,24 +23,29 @@ export const SelfieCapture = () => {
|
|
|
21
23
|
}, []);
|
|
22
24
|
const handleCapture = async () => {
|
|
23
25
|
try {
|
|
26
|
+
sdkLogger.info("Requesting permissions to start selfie camera");
|
|
24
27
|
setIsCapturing(true);
|
|
25
28
|
setProcessing(true);
|
|
26
29
|
const hasPermissions = await VisionCameraModule.requestAllPermissions();
|
|
27
30
|
if (!hasPermissions) {
|
|
31
|
+
sdkLogger.warn("User denied camera/microphone permissions for selfie");
|
|
28
32
|
Alert.alert('Permission refusée', 'Nous avons besoin de l\'accès à la caméra et au microphone');
|
|
29
33
|
setIsCapturing(false);
|
|
30
34
|
setProcessing(false);
|
|
31
35
|
return;
|
|
32
36
|
}
|
|
37
|
+
sdkLogger.info("Selfie camera permissions granted, mounting camera");
|
|
33
38
|
setShowCamera(true);
|
|
34
39
|
}
|
|
35
40
|
catch (error) {
|
|
41
|
+
sdkLogger.error("Failed to open selfie camera", { error: error?.message });
|
|
36
42
|
Alert.alert('Erreur', 'Impossible d\'ouvrir la caméra');
|
|
37
43
|
setIsCapturing(false);
|
|
38
44
|
setProcessing(false);
|
|
39
45
|
}
|
|
40
46
|
};
|
|
41
47
|
const handleCaptureSuccess = (imagePath) => {
|
|
48
|
+
sdkLogger.info("User successfully captured selfie image");
|
|
42
49
|
setCapturedSelfie(imagePath);
|
|
43
50
|
setSelfie(imagePath);
|
|
44
51
|
setShowCamera(false);
|
|
@@ -46,6 +53,7 @@ export const SelfieCapture = () => {
|
|
|
46
53
|
setProcessing(false);
|
|
47
54
|
};
|
|
48
55
|
const handleRetake = () => {
|
|
56
|
+
sdkLogger.info("User chose to retake selfie");
|
|
49
57
|
setCapturedSelfie(null);
|
|
50
58
|
setShowCamera(false);
|
|
51
59
|
};
|
|
@@ -54,18 +62,21 @@ export const SelfieCapture = () => {
|
|
|
54
62
|
handleCaptureSuccess(result.path);
|
|
55
63
|
}
|
|
56
64
|
else {
|
|
65
|
+
sdkLogger.warn("Selfie capture action failed", { error: result.error }); // 🚨 LOG
|
|
57
66
|
Alert.alert('Erreur', result.error || 'Échec de la capture');
|
|
58
67
|
setIsCapturing(false);
|
|
59
68
|
setProcessing(false);
|
|
60
69
|
}
|
|
61
70
|
};
|
|
62
71
|
const handleCameraError = (event) => {
|
|
72
|
+
sdkLogger.error("Selfie camera hardware/software error", { error: event.message }); // 🚨 LOG
|
|
63
73
|
Alert.alert('Erreur', event.message || 'Une erreur est survenue');
|
|
64
74
|
setShowCamera(false);
|
|
65
75
|
setIsCapturing(false);
|
|
66
76
|
setProcessing(false);
|
|
67
77
|
};
|
|
68
78
|
const handleCloseCamera = () => {
|
|
79
|
+
sdkLogger.info("User manually closed the selfie camera without capturing"); // 🚨 LOG
|
|
69
80
|
setShowCamera(false);
|
|
70
81
|
setIsCapturing(false);
|
|
71
82
|
setProcessing(false);
|
|
@@ -82,13 +93,16 @@ export const SelfieCapture = () => {
|
|
|
82
93
|
<View style={styles.imageContainer}>
|
|
83
94
|
<Image source={{ uri: `file://${capturedSelfie}` }} style={styles.previewImage} resizeMode="cover"/>
|
|
84
95
|
</View>
|
|
85
|
-
|
|
96
|
+
|
|
86
97
|
<View style={styles.buttonContainer}>
|
|
87
98
|
<TouchableOpacity style={[styles.button, styles.retakeButton]} onPress={handleRetake}>
|
|
88
99
|
<Text style={styles.buttonText}>Reprendre</Text>
|
|
89
100
|
</TouchableOpacity>
|
|
90
|
-
|
|
91
|
-
<TouchableOpacity style={[styles.button, styles.validateButton]} onPress={() => {
|
|
101
|
+
|
|
102
|
+
<TouchableOpacity style={[styles.button, styles.validateButton]} onPress={() => {
|
|
103
|
+
sdkLogger.info("User validated selfie capture, proceeding to next step"); // 🚨 LOG
|
|
104
|
+
/* Navigation vers l'étape suivante */
|
|
105
|
+
}}>
|
|
92
106
|
<Text style={styles.buttonText}>Valider</Text>
|
|
93
107
|
</TouchableOpacity>
|
|
94
108
|
</View>
|
|
@@ -107,91 +121,20 @@ export const SelfieCapture = () => {
|
|
|
107
121
|
</View>);
|
|
108
122
|
};
|
|
109
123
|
const styles = StyleSheet.create({
|
|
110
|
-
container: {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
},
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
},
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
textAlign: 'center',
|
|
126
|
-
},
|
|
127
|
-
instructions: {
|
|
128
|
-
fontSize: 16,
|
|
129
|
-
color: '#666',
|
|
130
|
-
textAlign: 'center',
|
|
131
|
-
marginBottom: 40,
|
|
132
|
-
lineHeight: 24,
|
|
133
|
-
},
|
|
134
|
-
previewContainer: {
|
|
135
|
-
flex: 1,
|
|
136
|
-
padding: 20,
|
|
137
|
-
},
|
|
138
|
-
imageContainer: {
|
|
139
|
-
flex: 1,
|
|
140
|
-
justifyContent: 'center',
|
|
141
|
-
alignItems: 'center',
|
|
142
|
-
marginBottom: 20,
|
|
143
|
-
},
|
|
144
|
-
previewImage: {
|
|
145
|
-
width: 250,
|
|
146
|
-
height: 250,
|
|
147
|
-
borderRadius: 125,
|
|
148
|
-
borderWidth: 3,
|
|
149
|
-
borderColor: '#4CAF50',
|
|
150
|
-
},
|
|
151
|
-
buttonContainer: {
|
|
152
|
-
flexDirection: 'row',
|
|
153
|
-
justifyContent: 'space-between',
|
|
154
|
-
gap: 15,
|
|
155
|
-
},
|
|
156
|
-
button: {
|
|
157
|
-
flex: 1,
|
|
158
|
-
paddingVertical: 15,
|
|
159
|
-
paddingHorizontal: 20,
|
|
160
|
-
borderRadius: 10,
|
|
161
|
-
alignItems: 'center',
|
|
162
|
-
justifyContent: 'center',
|
|
163
|
-
},
|
|
164
|
-
captureButton: {
|
|
165
|
-
backgroundColor: '#4CAF50',
|
|
166
|
-
},
|
|
167
|
-
retakeButton: {
|
|
168
|
-
backgroundColor: '#FF9800',
|
|
169
|
-
},
|
|
170
|
-
validateButton: {
|
|
171
|
-
backgroundColor: '#2196F3',
|
|
172
|
-
},
|
|
173
|
-
buttonText: {
|
|
174
|
-
color: 'white',
|
|
175
|
-
fontSize: 16,
|
|
176
|
-
fontWeight: '600',
|
|
177
|
-
},
|
|
178
|
-
selfieOverlay: {
|
|
179
|
-
position: 'absolute',
|
|
180
|
-
top: 0,
|
|
181
|
-
left: 0,
|
|
182
|
-
right: 0,
|
|
183
|
-
bottom: 0,
|
|
184
|
-
justifyContent: 'center',
|
|
185
|
-
alignItems: 'center',
|
|
186
|
-
pointerEvents: 'none',
|
|
187
|
-
},
|
|
188
|
-
faceFrame: {
|
|
189
|
-
width: 250,
|
|
190
|
-
height: 300,
|
|
191
|
-
borderWidth: 3,
|
|
192
|
-
borderColor: '#4CAF50',
|
|
193
|
-
borderRadius: 125,
|
|
194
|
-
backgroundColor: 'transparent',
|
|
195
|
-
},
|
|
124
|
+
container: { flex: 1, backgroundColor: '#f5f5f5', },
|
|
125
|
+
captureContainer: { flex: 1, justifyContent: 'center', alignItems: 'center', padding: 20, },
|
|
126
|
+
title: { fontSize: 24, fontWeight: 'bold', color: '#333', marginBottom: 20, textAlign: 'center', },
|
|
127
|
+
instructions: { fontSize: 16, color: '#666', textAlign: 'center', marginBottom: 40, lineHeight: 24, },
|
|
128
|
+
previewContainer: { flex: 1, padding: 20, },
|
|
129
|
+
imageContainer: { flex: 1, justifyContent: 'center', alignItems: 'center', marginBottom: 20, },
|
|
130
|
+
previewImage: { width: 250, height: 250, borderRadius: 125, borderWidth: 3, borderColor: '#4CAF50', },
|
|
131
|
+
buttonContainer: { flexDirection: 'row', justifyContent: 'space-between', gap: 15, },
|
|
132
|
+
button: { flex: 1, paddingVertical: 15, paddingHorizontal: 20, borderRadius: 10, alignItems: 'center', justifyContent: 'center', },
|
|
133
|
+
captureButton: { backgroundColor: '#4CAF50', },
|
|
134
|
+
retakeButton: { backgroundColor: '#FF9800', },
|
|
135
|
+
validateButton: { backgroundColor: '#2196F3', },
|
|
136
|
+
buttonText: { color: 'white', fontSize: 16, fontWeight: '600', },
|
|
137
|
+
selfieOverlay: { position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, justifyContent: 'center', alignItems: 'center', pointerEvents: 'none', },
|
|
138
|
+
faceFrame: { width: 250, height: 300, borderWidth: 3, borderColor: '#4CAF50', borderRadius: 125, backgroundColor: 'transparent', },
|
|
196
139
|
});
|
|
197
140
|
//# sourceMappingURL=SelfieCapture.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelfieCapture.js","sourceRoot":"","sources":["../../../src/components/SelfieCapture.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,kBAAkB,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,CAAC,MAAM,aAAa,GAAa,GAAG,EAAE;IAC1C,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAC1E,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,WAAW,EAAE,CAAC;IAEnD,MAAM,YAAY,GAAG,uHAAuH,CAAC;IAE7I,SAAS,CAAC,GAAG,EAAE;QACb,+CAA+C;QAC/C,MAAM,uBAAuB,GAAG,KAAK,IAAI,EAAE;YACzC,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,iBAAiB,EAAE,CAAC;YACjE,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,4CAA4C,CAAC,CAAC;YACtE,CAAC;QACH,CAAC,CAAC;QAEF,uBAAuB,EAAE,CAAC;IAC5B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE;QAC/B,IAAI,CAAC;YACH,cAAc,CAAC,IAAI,CAAC,CAAC;YACrB,aAAa,CAAC,IAAI,CAAC,CAAC;YAEpB,MAAM,cAAc,GAAG,MAAM,kBAAkB,CAAC,qBAAqB,EAAE,CAAC;YACxE,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,KAAK,CAAC,KAAK,CAAC,oBAAoB,EAAE,4DAA4D,CAAC,CAAC;gBAChG,cAAc,CAAC,KAAK,CAAC,CAAC;gBACtB,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,aAAa,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,gCAAgC,CAAC,CAAC;YACxD,cAAc,CAAC,KAAK,CAAC,CAAC;YACtB,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,oBAAoB,GAAG,CAAC,SAAiB,EAAE,EAAE;QACjD,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC7B,SAAS,CAAC,SAAS,CAAC,CAAC;QACrB,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,cAAc,CAAC,KAAK,CAAC,CAAC;QACtB,aAAa,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACxB,aAAa,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM,mBAAmB,GAAG,CAAC,MAA2D,EAAE,EAAE;QAC1F,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAClC,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,IAAI,qBAAqB,CAAC,CAAC;YAC7D,cAAc,CAAC,KAAK,CAAC,CAAC;YACtB,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,CAAC,KAA0B,EAAE,EAAE;QACvD,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,IAAI,yBAAyB,CAAC,CAAC;QAClE,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,cAAc,CAAC,KAAK,CAAC,CAAC;QACtB,aAAa,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,GAAG,EAAE;QAC7B,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,cAAc,CAAC,KAAK,CAAC,CAAC;QACtB,aAAa,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC;IAEF,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAC5B;QAAA,CAAC,kBAAkB,CACjB,YAAY,CAAC,CAAC,YAAY,CAAC,CAC3B,UAAU,CAAC,CAAC,IAAI,CAAC,CACjB,UAAU,CAAC,OAAO,CAClB,SAAS,CAAC,CAAC,mBAAmB,CAAC,CAC/B,OAAO,CAAC,CAAC,iBAAiB,CAAC,CAC3B,OAAO,CAAC,CAAC,iBAAiB,CAAC,CAC3B,OAAO,CAAC,MAAM,CACd,iBAAiB,CAAC,CAAC,IAAI,CAAC,CACxB,gBAAgB,CAAC,CAAC,KAAK,CAAC,CACxB,gBAAgB,CAAC,CACf,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAChC;cAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,EAChC;YAAA,EAAE,IAAI,CACR,CAAC,EAEL;MAAA,EAAE,IAAI,CAAC,CACR,CAAC;IACJ,CAAC;IAED,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAC5B;MAAA,CAAC,cAAc,CAAC,CAAC,CAAC,CAChB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CACnC;UAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CACjC;YAAA,CAAC,KAAK,CACJ,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,cAAc,EAAE,EAAE,CAAC,CAC5C,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAC3B,UAAU,CAAC,OAAO,EAEtB;UAAA,EAAE,IAAI,CAEN;;UAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAClC;YAAA,CAAC,gBAAgB,CACf,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAC5C,OAAO,CAAC,CAAC,YAAY,CAAC,CAEtB;cAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,EAAE,IAAI,CACjD;YAAA,EAAE,gBAAgB,CAElB;;YAAA,CAAC,gBAAgB,CACf,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,CAC9C,OAAO,CAAC,CAAC,GAAG,EAAE,GAAwC,CAAC,CAAC,CAExD;cAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,IAAI,CAC/C;YAAA,EAAE,gBAAgB,CACpB;UAAA,EAAE,IAAI,CACR;QAAA,EAAE,IAAI,CAAC,CACR,CAAC,CAAC,CAAC,CACF,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CACnC;UAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,iBAAiB,EAAE,IAAI,CAClD;UAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAC/B;YAAA,CAAC,YAAY,CACf;UAAA,EAAE,IAAI,CAEN;;UAAA,CAAC,gBAAgB,CACf,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAC7C,OAAO,CAAC,CAAC,aAAa,CAAC,CACvB,QAAQ,CAAC,CAAC,WAAW,CAAC,CAEtB;YAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAC7B;cAAA,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,sBAAsB,CACxD;YAAA,EAAE,IAAI,CACR;UAAA,EAAE,gBAAgB,CACpB;QAAA,EAAE,IAAI,CAAC,CACR,CACH;IAAA,EAAE,IAAI,CAAC,CACR,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,SAAS,EAAE;QACT,IAAI,EAAE,CAAC;QACP,eAAe,EAAE,SAAS;KAC3B;IACD,gBAAgB,EAAE;QAChB,IAAI,EAAE,CAAC;QACP,cAAc,EAAE,QAAQ;QACxB,UAAU,EAAE,QAAQ;QACpB,OAAO,EAAE,EAAE;KACZ;IACD,KAAK,EAAE;QACL,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,MAAM;QAClB,KAAK,EAAE,MAAM;QACb,YAAY,EAAE,EAAE;QAChB,SAAS,EAAE,QAAQ;KACpB;IACD,YAAY,EAAE;QACZ,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,QAAQ;QACnB,YAAY,EAAE,EAAE;QAChB,UAAU,EAAE,EAAE;KACf;IACD,gBAAgB,EAAE;QAChB,IAAI,EAAE,CAAC;QACP,OAAO,EAAE,EAAE;KACZ;IACD,cAAc,EAAE;QACd,IAAI,EAAE,CAAC;QACP,cAAc,EAAE,QAAQ;QACxB,UAAU,EAAE,QAAQ;QACpB,YAAY,EAAE,EAAE;KACjB;IACD,YAAY,EAAE;QACZ,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;QACX,YAAY,EAAE,GAAG;QACjB,WAAW,EAAE,CAAC;QACd,WAAW,EAAE,SAAS;KACvB;IACD,eAAe,EAAE;QACf,aAAa,EAAE,KAAK;QACpB,cAAc,EAAE,eAAe;QAC/B,GAAG,EAAE,EAAE;KACR;IACD,MAAM,EAAE;QACN,IAAI,EAAE,CAAC;QACP,eAAe,EAAE,EAAE;QACnB,iBAAiB,EAAE,EAAE;QACrB,YAAY,EAAE,EAAE;QAChB,UAAU,EAAE,QAAQ;QACpB,cAAc,EAAE,QAAQ;KACzB;IACD,aAAa,EAAE;QACb,eAAe,EAAE,SAAS;KAC3B;IACD,YAAY,EAAE;QACZ,eAAe,EAAE,SAAS;KAC3B;IACD,cAAc,EAAE;QACd,eAAe,EAAE,SAAS;KAC3B;IACD,UAAU,EAAE;QACV,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,KAAK;KAClB;IACD,aAAa,EAAE;QACb,QAAQ,EAAE,UAAU;QACpB,GAAG,EAAE,CAAC;QACN,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;QACT,cAAc,EAAE,QAAQ;QACxB,UAAU,EAAE,QAAQ;QACpB,aAAa,EAAE,MAAM;KACtB;IACD,SAAS,EAAE;QACT,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,CAAC;QACd,WAAW,EAAE,SAAS;QACtB,YAAY,EAAE,GAAG;QACjB,eAAe,EAAE,aAAa;KAC/B;CACF,CAAC,CAAC","sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { View, Text, TouchableOpacity, Image, Alert, StyleSheet } from 'react-native';\nimport { useKYCStore } from '../stores/kycStore';\nimport VisionCameraModule from '../modules/camera/VisionCameraModule';\nimport { EnhancedCameraView } from './EnhancedCameraView';\n\nexport const SelfieCapture: React.FC = () => {\n const [capturedSelfie, setCapturedSelfie] = useState<string | null>(null);\n const [isCapturing, setIsCapturing] = useState(false);\n const [showCamera, setShowCamera] = useState(false);\n const { setSelfie, setProcessing } = useKYCStore();\n\n const instructions = \"Placez votre visage dans le cadre et souriez naturellement. Assurez-vous que votre visage est bien éclairé et centré.\";\n\n useEffect(() => {\n // Check camera availability on component mount\n const checkCameraAvailability = async () => {\n const isAvailable = await VisionCameraModule.isCameraAvailable();\n if (!isAvailable) {\n Alert.alert('Erreur', 'Caméra non disponible sur cette plateforme');\n }\n };\n \n checkCameraAvailability();\n }, []);\n\n const handleCapture = async () => {\n try {\n setIsCapturing(true);\n setProcessing(true);\n\n const hasPermissions = await VisionCameraModule.requestAllPermissions();\n if (!hasPermissions) {\n Alert.alert('Permission refusée', 'Nous avons besoin de l\\'accès à la caméra et au microphone');\n setIsCapturing(false);\n setProcessing(false);\n return;\n }\n\n setShowCamera(true);\n } catch (error) {\n Alert.alert('Erreur', 'Impossible d\\'ouvrir la caméra');\n setIsCapturing(false);\n setProcessing(false);\n }\n };\n\n const handleCaptureSuccess = (imagePath: string) => {\n setCapturedSelfie(imagePath);\n setSelfie(imagePath);\n setShowCamera(false);\n setIsCapturing(false);\n setProcessing(false);\n };\n\n const handleRetake = () => {\n setCapturedSelfie(null);\n setShowCamera(false);\n };\n\n const handleCameraCapture = (result: { success: boolean; path?: string; error?: string }) => {\n if (result.success && result.path) {\n handleCaptureSuccess(result.path);\n } else {\n Alert.alert('Erreur', result.error || 'Échec de la capture');\n setIsCapturing(false);\n setProcessing(false);\n }\n };\n\n const handleCameraError = (event: { message: string }) => {\n Alert.alert('Erreur', event.message || 'Une erreur est survenue');\n setShowCamera(false);\n setIsCapturing(false);\n setProcessing(false);\n };\n\n const handleCloseCamera = () => {\n setShowCamera(false);\n setIsCapturing(false);\n setProcessing(false);\n };\n\n if (showCamera) {\n return (\n <View style={styles.container}>\n <EnhancedCameraView\n instructions={instructions}\n showCamera={true}\n cameraType=\"front\"\n onCapture={handleCameraCapture}\n onError={handleCameraError}\n onClose={handleCloseCamera}\n quality=\"high\"\n showCaptureButton={true}\n showSwitchCamera={false}\n overlayComponent={\n <View style={styles.selfieOverlay}>\n <View style={styles.faceFrame} />\n </View>\n }\n />\n </View>\n );\n }\n\n return (\n <View style={styles.container}>\n {capturedSelfie ? (\n <View style={styles.previewContainer}>\n <View style={styles.imageContainer}>\n <Image\n source={{ uri: `file://${capturedSelfie}` }}\n style={styles.previewImage}\n resizeMode=\"cover\"\n />\n </View>\n\n <View style={styles.buttonContainer}>\n <TouchableOpacity\n style={[styles.button, styles.retakeButton]}\n onPress={handleRetake}\n >\n <Text style={styles.buttonText}>Reprendre</Text>\n </TouchableOpacity>\n\n <TouchableOpacity\n style={[styles.button, styles.validateButton]}\n onPress={() => {/* Navigation vers l'étape suivante */}}\n >\n <Text style={styles.buttonText}>Valider</Text>\n </TouchableOpacity>\n </View>\n </View>\n ) : (\n <View style={styles.captureContainer}>\n <Text style={styles.title}>Capture de selfie</Text>\n <Text style={styles.instructions}>\n {instructions}\n </Text>\n \n <TouchableOpacity\n style={[styles.button, styles.captureButton]}\n onPress={handleCapture}\n disabled={isCapturing}\n >\n <Text style={styles.buttonText}>\n {isCapturing ? 'Ouverture...' : '📸 Prendre une photo'}\n </Text>\n </TouchableOpacity>\n </View>\n )}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: '#f5f5f5',\n },\n captureContainer: {\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n padding: 20,\n },\n title: {\n fontSize: 24,\n fontWeight: 'bold',\n color: '#333',\n marginBottom: 20,\n textAlign: 'center',\n },\n instructions: {\n fontSize: 16,\n color: '#666',\n textAlign: 'center',\n marginBottom: 40,\n lineHeight: 24,\n },\n previewContainer: {\n flex: 1,\n padding: 20,\n },\n imageContainer: {\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n marginBottom: 20,\n },\n previewImage: {\n width: 250,\n height: 250,\n borderRadius: 125,\n borderWidth: 3,\n borderColor: '#4CAF50',\n },\n buttonContainer: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n gap: 15,\n },\n button: {\n flex: 1,\n paddingVertical: 15,\n paddingHorizontal: 20,\n borderRadius: 10,\n alignItems: 'center',\n justifyContent: 'center',\n },\n captureButton: {\n backgroundColor: '#4CAF50',\n },\n retakeButton: {\n backgroundColor: '#FF9800',\n },\n validateButton: {\n backgroundColor: '#2196F3',\n },\n buttonText: {\n color: 'white',\n fontSize: 16,\n fontWeight: '600',\n },\n selfieOverlay: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n justifyContent: 'center',\n alignItems: 'center',\n pointerEvents: 'none',\n },\n faceFrame: {\n width: 250,\n height: 300,\n borderWidth: 3,\n borderColor: '#4CAF50',\n borderRadius: 125,\n backgroundColor: 'transparent',\n },\n}); "]}
|
|
1
|
+
{"version":3,"file":"SelfieCapture.js","sourceRoot":"","sources":["../../../src/components/SelfieCapture.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { View, Text, TouchableOpacity, Image, Alert, StyleSheet } from 'react-native';\nimport { useKYCStore } from '../stores/kycStore';\nimport VisionCameraModule from '../modules/camera/VisionCameraModule';\nimport { EnhancedCameraView } from './EnhancedCameraView';\nimport { sdkLogger } from '../utils/logger'; \n\nexport const SelfieCapture: React.FC = () => {\n const [capturedSelfie, setCapturedSelfie] = useState<string | null>(null);\n const [isCapturing, setIsCapturing] = useState(false);\n const [showCamera, setShowCamera] = useState(false);\n const { setSelfie, setProcessing } = useKYCStore();\n\n const instructions = \"Placez votre visage dans le cadre et souriez naturellement. Assurez-vous que votre visage est bien éclairé et centré.\";\n\n useEffect(() => {\n sdkLogger.info(\"User started Selfie Capture step\");\n\n const checkCameraAvailability = async () => {\n const isAvailable = await VisionCameraModule.isCameraAvailable();\n if (!isAvailable) {\n sdkLogger.error(\"Selfie camera check failed: Camera not available on this platform\"); \n Alert.alert('Erreur', 'Caméra non disponible sur cette plateforme');\n }\n };\n \n checkCameraAvailability();\n }, []);\n\n const handleCapture = async () => {\n try {\n sdkLogger.info(\"Requesting permissions to start selfie camera\"); \n setIsCapturing(true);\n setProcessing(true);\n \n const hasPermissions = await VisionCameraModule.requestAllPermissions();\n if (!hasPermissions) {\n sdkLogger.warn(\"User denied camera/microphone permissions for selfie\"); \n Alert.alert('Permission refusée', 'Nous avons besoin de l\\'accès à la caméra et au microphone');\n setIsCapturing(false);\n setProcessing(false);\n return;\n }\n \n sdkLogger.info(\"Selfie camera permissions granted, mounting camera\"); \n setShowCamera(true);\n } catch (error: any) {\n sdkLogger.error(\"Failed to open selfie camera\", { error: error?.message }); \n Alert.alert('Erreur', 'Impossible d\\'ouvrir la caméra');\n setIsCapturing(false);\n setProcessing(false);\n }\n };\n\n const handleCaptureSuccess = (imagePath: string) => {\n sdkLogger.info(\"User successfully captured selfie image\"); \n setCapturedSelfie(imagePath);\n setSelfie(imagePath);\n setShowCamera(false);\n setIsCapturing(false);\n setProcessing(false);\n };\n\n const handleRetake = () => {\n sdkLogger.info(\"User chose to retake selfie\"); \n setCapturedSelfie(null);\n setShowCamera(false);\n };\n\n const handleCameraCapture = (result: { success: boolean; path?: string; error?: string }) => {\n if (result.success && result.path) {\n handleCaptureSuccess(result.path);\n } else {\n sdkLogger.warn(\"Selfie capture action failed\", { error: result.error }); // 🚨 LOG\n Alert.alert('Erreur', result.error || 'Échec de la capture');\n setIsCapturing(false);\n setProcessing(false);\n }\n };\n\n const handleCameraError = (event: { message: string }) => {\n sdkLogger.error(\"Selfie camera hardware/software error\", { error: event.message }); // 🚨 LOG\n Alert.alert('Erreur', event.message || 'Une erreur est survenue');\n setShowCamera(false);\n setIsCapturing(false);\n setProcessing(false);\n };\n\n const handleCloseCamera = () => {\n sdkLogger.info(\"User manually closed the selfie camera without capturing\"); // 🚨 LOG\n setShowCamera(false);\n setIsCapturing(false);\n setProcessing(false);\n };\n\n if (showCamera) {\n return (\n <View style={styles.container}>\n <EnhancedCameraView\n instructions={instructions}\n showCamera={true}\n cameraType=\"front\"\n onCapture={handleCameraCapture}\n onError={handleCameraError}\n onClose={handleCloseCamera}\n quality=\"high\"\n showCaptureButton={true}\n showSwitchCamera={false}\n overlayComponent={\n <View style={styles.selfieOverlay}>\n <View style={styles.faceFrame} />\n </View>\n }\n />\n </View>\n );\n }\n\n return (\n <View style={styles.container}>\n {capturedSelfie ? (\n <View style={styles.previewContainer}>\n <View style={styles.imageContainer}>\n <Image\n source={{ uri: `file://${capturedSelfie}` }}\n style={styles.previewImage}\n resizeMode=\"cover\"\n />\n </View>\n \n <View style={styles.buttonContainer}>\n <TouchableOpacity \n style={[styles.button, styles.retakeButton]} \n onPress={handleRetake}\n >\n <Text style={styles.buttonText}>Reprendre</Text>\n </TouchableOpacity>\n \n <TouchableOpacity \n style={[styles.button, styles.validateButton]} \n onPress={() => {\n sdkLogger.info(\"User validated selfie capture, proceeding to next step\"); // 🚨 LOG\n /* Navigation vers l'étape suivante */\n }}\n >\n <Text style={styles.buttonText}>Valider</Text>\n </TouchableOpacity>\n </View>\n </View>\n ) : (\n <View style={styles.captureContainer}>\n <Text style={styles.title}>Capture de selfie</Text>\n <Text style={styles.instructions}>\n {instructions}\n </Text>\n \n <TouchableOpacity \n style={[styles.button, styles.captureButton]} \n onPress={handleCapture}\n disabled={isCapturing}\n >\n <Text style={styles.buttonText}>\n {isCapturing ? 'Ouverture...' : '📸 Prendre une photo'}\n </Text>\n </TouchableOpacity>\n </View>\n )}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: { flex: 1, backgroundColor: '#f5f5f5', },\n captureContainer: { flex: 1, justifyContent: 'center', alignItems: 'center', padding: 20, },\n title: { fontSize: 24, fontWeight: 'bold', color: '#333', marginBottom: 20, textAlign: 'center', },\n instructions: { fontSize: 16, color: '#666', textAlign: 'center', marginBottom: 40, lineHeight: 24, },\n previewContainer: { flex: 1, padding: 20, },\n imageContainer: { flex: 1, justifyContent: 'center', alignItems: 'center', marginBottom: 20, },\n previewImage: { width: 250, height: 250, borderRadius: 125, borderWidth: 3, borderColor: '#4CAF50', },\n buttonContainer: { flexDirection: 'row', justifyContent: 'space-between', gap: 15, },\n button: { flex: 1, paddingVertical: 15, paddingHorizontal: 20, borderRadius: 10, alignItems: 'center', justifyContent: 'center', },\n captureButton: { backgroundColor: '#4CAF50', },\n retakeButton: { backgroundColor: '#FF9800', },\n validateButton: { backgroundColor: '#2196F3', },\n buttonText: { color: 'white', fontSize: 16, fontWeight: '600', },\n selfieOverlay: { position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, justifyContent: 'center', alignItems: 'center', pointerEvents: 'none', },\n faceFrame: { width: 250, height: 300, borderWidth: 3, borderColor: '#4CAF50', borderRadius: 125, backgroundColor: 'transparent', },\n});"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TemplateKYCExample.d.ts","sourceRoot":"","sources":["../../../src/components/TemplateKYCExample.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAGnC,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"TemplateKYCExample.d.ts","sourceRoot":"","sources":["../../../src/components/TemplateKYCExample.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAGnC,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAwCxE,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC9C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,oBAAoB,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,UAAU,EACV,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,OAAO,EACP,UAAU,EACV,QAAQ,EACR,GAAkB,EAClB,SAAS,EACT,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,WAAW,EACX,aAAa,EACb,cAAc,EACf,EAAE,uBAAuB,GAAG,GAAG,CAAC,OAAO,CA2FvC"}
|
|
@@ -1,138 +1,90 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { View, SafeAreaView } from 'react-native';
|
|
3
3
|
import { TemplateKYCFlow } from './TemplateKYCFlowRefactored';
|
|
4
|
+
import { sdkLogger } from '../utils/logger'; // 🚨 IMPORT SDK LOGGER
|
|
4
5
|
const advancedVerificationTemplate = {
|
|
5
6
|
id: 1,
|
|
6
|
-
name: {
|
|
7
|
-
|
|
8
|
-
fr: "Vérification Avancée"
|
|
9
|
-
},
|
|
10
|
-
description: {
|
|
11
|
-
en: "Extended identity verification flow",
|
|
12
|
-
fr: "Processus de vérification d'identité étendu"
|
|
13
|
-
},
|
|
7
|
+
name: { en: "Advanced Verification", fr: "Vérification Avancée" },
|
|
8
|
+
description: { en: "Extended identity verification flow", fr: "Processus de vérification d'identité étendu" },
|
|
14
9
|
version: "1.1.0",
|
|
15
10
|
components: [
|
|
16
11
|
{
|
|
17
|
-
id: 5,
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
fr: "Activez votre localisation"
|
|
23
|
-
},
|
|
24
|
-
instructions: {
|
|
25
|
-
en: "We need your GPS location for compliance purposes.",
|
|
26
|
-
fr: "Nous avons besoin de votre localisation GPS pour des raisons réglementaires."
|
|
27
|
-
},
|
|
28
|
-
ui: {
|
|
29
|
-
icon: "location-icon.png",
|
|
30
|
-
themeColor: "#2DBD60",
|
|
31
|
-
buttonText: { en: "Enable Location", fr: "Activer la localisation" }
|
|
32
|
-
},
|
|
33
|
-
config: {
|
|
34
|
-
accuracy: "high",
|
|
35
|
-
required: true
|
|
36
|
-
}
|
|
12
|
+
id: 5, type: "location", order: 1,
|
|
13
|
+
labels: { en: "Enable your location", fr: "Activez votre localisation" },
|
|
14
|
+
instructions: { en: "We need your GPS location for compliance purposes.", fr: "Nous avons besoin de votre localisation GPS pour des raisons réglementaires." },
|
|
15
|
+
ui: { icon: "location-icon.png", themeColor: "#2DBD60", buttonText: { en: "Enable Location", fr: "Activer la localisation" } },
|
|
16
|
+
config: { accuracy: "high", required: true }
|
|
37
17
|
},
|
|
38
18
|
{
|
|
39
|
-
id: 6,
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
fr: "Sélectionnez votre pays"
|
|
45
|
-
},
|
|
46
|
-
instructions: {
|
|
47
|
-
en: "Choose your country of residence.",
|
|
48
|
-
fr: "Choisissez votre pays de résidence."
|
|
49
|
-
},
|
|
50
|
-
ui: {
|
|
51
|
-
icon: "country-icon.png",
|
|
52
|
-
themeColor: "#2DBD60",
|
|
53
|
-
buttonText: { en: "Confirm", fr: "Confirmer" }
|
|
54
|
-
},
|
|
55
|
-
config: {
|
|
56
|
-
allowed_countries: ["CM", "NG", "CI", "KE", "GH"],
|
|
57
|
-
default_country: "CM",
|
|
58
|
-
required: true
|
|
59
|
-
}
|
|
19
|
+
id: 6, type: "country_selection", order: 2,
|
|
20
|
+
labels: { en: "Select your country", fr: "Sélectionnez votre pays" },
|
|
21
|
+
instructions: { en: "Choose your country of residence.", fr: "Choisissez votre pays de résidence." },
|
|
22
|
+
ui: { icon: "country-icon.png", themeColor: "#2DBD60", buttonText: { en: "Confirm", fr: "Confirmer" } },
|
|
23
|
+
config: { allowed_countries: ["CM", "NG", "CI", "KE", "GH"], default_country: "CM", required: true }
|
|
60
24
|
},
|
|
61
25
|
{
|
|
62
|
-
id: 1,
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
front: {
|
|
68
|
-
en: "Upload front of ID card",
|
|
69
|
-
fr: "Téléversez le recto de votre carte d'identité"
|
|
70
|
-
},
|
|
71
|
-
back: {
|
|
72
|
-
en: "Upload back of ID card",
|
|
73
|
-
fr: "Téléversez le verso de votre carte d'identité"
|
|
74
|
-
},
|
|
75
|
-
},
|
|
76
|
-
instructions: {
|
|
77
|
-
front: {
|
|
78
|
-
en: "Take a clear photo of the front of your ID.",
|
|
79
|
-
fr: "Prenez une photo nette du recto de votre pièce."
|
|
80
|
-
},
|
|
81
|
-
back: {
|
|
82
|
-
en: "Take a clear photo of the back of your ID.",
|
|
83
|
-
fr: "Prenez une photo nette du verso de votre pièce."
|
|
84
|
-
},
|
|
85
|
-
},
|
|
86
|
-
ui: {
|
|
87
|
-
front: {
|
|
88
|
-
icon: "id-card-icon.png",
|
|
89
|
-
themeColor: "#2DBD60",
|
|
90
|
-
buttonText: { en: "Next", fr: "Suivant" }
|
|
91
|
-
},
|
|
92
|
-
back: {
|
|
93
|
-
icon: "id-card-icon.png",
|
|
94
|
-
themeColor: "#2DBD60",
|
|
95
|
-
buttonText: { en: "Next", fr: "Suivant" }
|
|
96
|
-
},
|
|
97
|
-
},
|
|
98
|
-
config: {
|
|
99
|
-
sides: ["front", "back"],
|
|
100
|
-
allowed_formats: ["jpg", "png"],
|
|
101
|
-
max_size_mb: 5,
|
|
102
|
-
document_types: ["drivers_licence", "passport", "drivers_licence", "national_id"],
|
|
103
|
-
}
|
|
26
|
+
id: 1, type: "id_card", order: 3, templateId: 1,
|
|
27
|
+
labels: { front: { en: "Upload front of ID card", fr: "Téléversez le recto de votre carte d'identité" }, back: { en: "Upload back of ID card", fr: "Téléversez le verso de votre carte d'identité" }, },
|
|
28
|
+
instructions: { front: { en: "Take a clear photo of the front of your ID.", fr: "Prenez une photo nette du recto de votre pièce." }, back: { en: "Take a clear photo of the back of your ID.", fr: "Prenez une photo nette du verso de votre pièce." }, },
|
|
29
|
+
ui: { front: { icon: "id-card-icon.png", themeColor: "#2DBD60", buttonText: { en: "Next", fr: "Suivant" } }, back: { icon: "id-card-icon.png", themeColor: "#2DBD60", buttonText: { en: "Next", fr: "Suivant" } }, },
|
|
30
|
+
config: { sides: ["front", "back"], allowed_formats: ["jpg", "png"], max_size_mb: 5, document_types: ["drivers_licence", "passport", "drivers_licence", "national_id"], }
|
|
104
31
|
},
|
|
105
32
|
{
|
|
106
|
-
id: 3,
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
en: "Take selfies from different angles",
|
|
112
|
-
fr: "Prenez des selfies sous différents angles"
|
|
113
|
-
},
|
|
114
|
-
instructions: {
|
|
115
|
-
en: "Take selfies from front, left, and right angles.",
|
|
116
|
-
fr: "Prenez des selfies de face, profil gauche et profil droit."
|
|
117
|
-
},
|
|
118
|
-
ui: {
|
|
119
|
-
icon: "selfie-icon.png",
|
|
120
|
-
themeColor: "#2DBD60",
|
|
121
|
-
buttonText: { en: "Next", fr: "Suivant" }
|
|
122
|
-
},
|
|
123
|
-
config: {
|
|
124
|
-
liveness_check: true,
|
|
125
|
-
max_attempts: 3,
|
|
126
|
-
orientations: ["center", "left", "right"]
|
|
127
|
-
}
|
|
33
|
+
id: 3, type: "selfie", order: 5, templateId: 1,
|
|
34
|
+
labels: { en: "Take selfies from different angles", fr: "Prenez des selfies sous différents angles" },
|
|
35
|
+
instructions: { en: "Take selfies from front, left, and right angles.", fr: "Prenez des selfies de face, profil gauche et profil droit." },
|
|
36
|
+
ui: { icon: "selfie-icon.png", themeColor: "#2DBD60", buttonText: { en: "Next", fr: "Suivant" } },
|
|
37
|
+
config: { liveness_check: true, max_attempts: 3, orientations: ["center", "left", "right"] }
|
|
128
38
|
},
|
|
129
39
|
]
|
|
130
40
|
};
|
|
131
41
|
export function TemplateKYCExample({ onComplete, onCancel, onError, language, API_KEY, templateId, template, env = 'PRODUCTION', serverEnv, existingSessionId, initialComponentIndex, initialCountryResume, referenceId, onSessionSave, kyc_session_id }) {
|
|
132
42
|
const handleComplete = (data) => {
|
|
133
|
-
console.log('KYC Template completed with data:', data);
|
|
134
|
-
|
|
135
|
-
|
|
43
|
+
console.log('KYC Template completed with raw data:', data);
|
|
44
|
+
let finalPayload = data; // Fallback to raw data if mapping fails
|
|
45
|
+
if ((data.status === 'success' || data.status === 'in_progress') && data.result) {
|
|
46
|
+
// 1. Extract the dynamic root key (e.g., 'national_id', 'passport')
|
|
47
|
+
const docKey = Object.keys(data.result)[0];
|
|
48
|
+
if (docKey && data.result[docKey]) {
|
|
49
|
+
const backendData = data.result[docKey].data;
|
|
50
|
+
const personalInfo = backendData?.user_data?.personal_information || {};
|
|
51
|
+
// Ensure we capture the session ID from whichever prop was provided
|
|
52
|
+
const activeSessionId = kyc_session_id || existingSessionId || "";
|
|
53
|
+
// 2. Strict mapping to your expected format
|
|
54
|
+
finalPayload = {
|
|
55
|
+
data: {
|
|
56
|
+
verification_id: backendData?.verification_id,
|
|
57
|
+
verification_status: backendData?.verification_status,
|
|
58
|
+
session_id: activeSessionId,
|
|
59
|
+
user_data: {
|
|
60
|
+
personal_information: {
|
|
61
|
+
first_name: personalInfo.first_name || undefined,
|
|
62
|
+
given_name: personalInfo.given_name || undefined,
|
|
63
|
+
last_name: personalInfo.last_name || undefined,
|
|
64
|
+
surname: personalInfo.last_name || undefined, // fallback
|
|
65
|
+
address: personalInfo.address || undefined,
|
|
66
|
+
city: personalInfo.city || undefined,
|
|
67
|
+
postal_code: personalInfo.postal_code || undefined,
|
|
68
|
+
expiry_date: personalInfo.expiry_date || undefined,
|
|
69
|
+
issue_date: personalInfo.issue_date || undefined,
|
|
70
|
+
date_of_birth: personalInfo.date_of_birth || undefined,
|
|
71
|
+
birth_date: personalInfo.date_of_birth || undefined, // fallback
|
|
72
|
+
country: personalInfo.country || undefined,
|
|
73
|
+
document_number: personalInfo.document_number || undefined,
|
|
74
|
+
nationality: personalInfo.nationality || undefined,
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
sdkLogger.info("Wrapper formatted completion payload successfully", {
|
|
80
|
+
verification_id: finalPayload.data.verification_id
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
sdkLogger.warn("Wrapper received completion without a success result object", { status: data.status });
|
|
86
|
+
}
|
|
87
|
+
onComplete(finalPayload);
|
|
136
88
|
};
|
|
137
89
|
const handleCancel = () => {
|
|
138
90
|
console.log('KYC Template flow cancelled');
|
|
@@ -142,13 +94,10 @@ export function TemplateKYCExample({ onComplete, onCancel, onError, language, AP
|
|
|
142
94
|
console.error('KYC Template error:', error);
|
|
143
95
|
onError(error);
|
|
144
96
|
};
|
|
145
|
-
// Transform backend template to SDK format
|
|
146
|
-
// Determine which template to use: prefer templateId for dynamic loading, then template prop, then fallback to hardcoded
|
|
147
97
|
const templateToUse = templateId ? undefined : (template || advancedVerificationTemplate);
|
|
148
98
|
return (<SafeAreaView style={{ flex: 1, paddingVertical: 25 }}>
|
|
149
99
|
<View style={{ flex: 1 }}>
|
|
150
|
-
<TemplateKYCFlow template={templateToUse} templateId={templateId} onComplete={handleComplete} onError={handleError} onCancel={handleCancel} language={language}
|
|
151
|
-
API_KEY={API_KEY} env={env} serverEnv={serverEnv} existingSessionId={existingSessionId} initialComponentIndex={initialComponentIndex} initialCountryResume={initialCountryResume} referenceId={referenceId} onSessionSave={onSessionSave} kyc_session_id={kyc_session_id}/>
|
|
100
|
+
<TemplateKYCFlow template={templateToUse} templateId={templateId} onComplete={handleComplete} onError={handleError} onCancel={handleCancel} language={language} API_KEY={API_KEY} env={env} serverEnv={serverEnv} existingSessionId={existingSessionId} initialComponentIndex={initialComponentIndex} initialCountryResume={initialCountryResume} referenceId={referenceId} onSessionSave={onSessionSave} kyc_session_id={kyc_session_id}/>
|
|
152
101
|
</View>
|
|
153
102
|
</SafeAreaView>);
|
|
154
103
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TemplateKYCExample.js","sourceRoot":"","sources":["../../../src/components/TemplateKYCExample.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { JSX } from 'react';\nimport { View, SafeAreaView } from 'react-native';\nimport { TemplateKYCFlow } from './TemplateKYCFlowRefactored';\nimport { KYCTemplate, VerificationState } from '../types/KYC.types';\nimport { KycEnvironment, BackendEnvironment } from '../types/env.types';\n\n\n\n\nconst advancedVerificationTemplate: KYCTemplate = {\n id: 1,\n name: {\n en: \"Advanced Verification\",\n fr: \"Vérification Avancée\"\n },\n description: {\n en: \"Extended identity verification flow\",\n fr: \"Processus de vérification d'identité étendu\"\n },\n version: \"1.1.0\",\n components: [\n {\n id: 5,\n type: \"location\" as const,\n order: 1,\n labels: {\n en: \"Enable your location\",\n fr: \"Activez votre localisation\"\n },\n instructions: {\n en: \"We need your GPS location for compliance purposes.\",\n fr: \"Nous avons besoin de votre localisation GPS pour des raisons réglementaires.\"\n },\n ui: {\n icon: \"location-icon.png\",\n themeColor: \"#2DBD60\",\n buttonText: { en: \"Enable Location\", fr: \"Activer la localisation\" }\n },\n config: {\n accuracy: \"high\",\n required: true\n } as const\n },\n {\n id: 6,\n type: \"country_selection\" as const,\n order: 2,\n labels: {\n en: \"Select your country\",\n fr: \"Sélectionnez votre pays\"\n },\n instructions: {\n en: \"Choose your country of residence.\",\n fr: \"Choisissez votre pays de résidence.\"\n },\n ui: {\n icon: \"country-icon.png\",\n themeColor: \"#2DBD60\",\n buttonText: { en: \"Confirm\", fr: \"Confirmer\" }\n },\n config: {\n allowed_countries: [\"CM\", \"NG\", \"CI\", \"KE\", \"GH\"],\n default_country: \"CM\",\n required: true\n } as const\n },\n {\n id: 1,\n type: \"id_card\" as const,\n order: 3,\n templateId: 1,\n labels: {\n front: {\n en: \"Upload front of ID card\",\n fr: \"Téléversez le recto de votre carte d'identité\"\n },\n back: {\n en: \"Upload back of ID card\",\n fr: \"Téléversez le verso de votre carte d'identité\"\n },\n },\n instructions: {\n front: {\n en: \"Take a clear photo of the front of your ID.\",\n fr: \"Prenez une photo nette du recto de votre pièce.\"\n },\n back: {\n en: \"Take a clear photo of the back of your ID.\",\n fr: \"Prenez une photo nette du verso de votre pièce.\"\n },\n },\n ui: {\n front: {\n icon: \"id-card-icon.png\",\n themeColor: \"#2DBD60\",\n buttonText: { en: \"Next\", fr: \"Suivant\" }\n },\n back: {\n icon: \"id-card-icon.png\",\n themeColor: \"#2DBD60\",\n buttonText: { en: \"Next\", fr: \"Suivant\" }\n },\n },\n config: {\n sides: [\"front\", \"back\"],\n allowed_formats: [\"jpg\", \"png\"],\n max_size_mb: 5,\n document_types: [\"drivers_licence\", \"passport\", \"drivers_licence\", \"national_id\"],\n\n } as const\n },\n {\n id: 3,\n type: \"selfie\" as const,\n order: 5,\n templateId: 1,\n labels: {\n en: \"Take selfies from different angles\",\n fr: \"Prenez des selfies sous différents angles\"\n },\n instructions: {\n en: \"Take selfies from front, left, and right angles.\",\n fr: \"Prenez des selfies de face, profil gauche et profil droit.\"\n },\n ui: {\n icon: \"selfie-icon.png\",\n themeColor: \"#2DBD60\",\n buttonText: { en: \"Next\", fr: \"Suivant\" }\n },\n config: {\n liveness_check: true,\n max_attempts: 3,\n orientations: [\"center\", \"left\", \"right\"]\n } as const\n },\n ]\n};\n\n\nexport interface TemplateKYCExampleProps {\n onComplete: (data: VerificationState) => void;\n onCancel: () => void;\n onError: (error: string) => void;\n language: string;\n API_KEY?: string;\n templateId?: string;\n template?: KYCTemplate;\n env?: KycEnvironment; \n serverEnv?: BackendEnvironment; \n existingSessionId?: string;\n initialComponentIndex?: number;\n initialCountryResume?: { code: string; documentType: string; region?: string };\n referenceId?: string;\n onSessionSave?: (sessionId: string) => void;\n kyc_session_id?: string;\n}\n\nexport function TemplateKYCExample({ \n onComplete, \n onCancel, \n onError, \n language, \n API_KEY, \n templateId, \n template, \n env = 'PRODUCTION', \n serverEnv, \n existingSessionId, \n initialComponentIndex, \n initialCountryResume, \n referenceId, \n onSessionSave,\n kyc_session_id \n}: TemplateKYCExampleProps): JSX.Element { // <--- Explicit Return Type\n\n const handleComplete = (data: VerificationState) => {\n console.log('KYC Template completed with data:', data);\n onComplete(data);\n // Ici vous pouvez envoyer les données à votre API\n };\n\n const handleCancel = () => {\n console.log('KYC Template flow cancelled');\n onCancel();\n };\n\n const handleError = (error: string) => {\n console.error('KYC Template error:', error);\n onError(error);\n };\n\n // Transform backend template to SDK format\n // Determine which template to use: prefer templateId for dynamic loading, then template prop, then fallback to hardcoded\n const templateToUse = templateId ? undefined : (template || advancedVerificationTemplate);\n\n return (\n <SafeAreaView style={{ flex: 1, paddingVertical: 25 }}>\n <View style={{ flex: 1 }}>\n <TemplateKYCFlow\n template={templateToUse}\n templateId={templateId}\n onComplete={handleComplete}\n onError={handleError}\n onCancel={handleCancel}\n language={language} // ou \"en\" pour l'anglais\n API_KEY={API_KEY}\n env={env}\n serverEnv={serverEnv}\n existingSessionId={existingSessionId}\n initialComponentIndex={initialComponentIndex}\n initialCountryResume={initialCountryResume}\n referenceId={referenceId}\n onSessionSave={onSessionSave}\n kyc_session_id={kyc_session_id}\n \n />\n </View>\n </SafeAreaView>\n );\n}\n\n"]}
|
|
1
|
+
{"version":3,"file":"TemplateKYCExample.js","sourceRoot":"","sources":["../../../src/components/TemplateKYCExample.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { JSX } from 'react';\nimport { View, SafeAreaView } from 'react-native';\nimport { TemplateKYCFlow } from './TemplateKYCFlowRefactored';\nimport { KYCTemplate, VerificationState } from '../types/KYC.types';\nimport { KycEnvironment, BackendEnvironment } from '../types/env.types';\nimport { sdkLogger } from '../utils/logger'; // 🚨 IMPORT SDK LOGGER\n\nconst advancedVerificationTemplate: KYCTemplate = {\n id: 1,\n name: { en: \"Advanced Verification\", fr: \"Vérification Avancée\" },\n description: { en: \"Extended identity verification flow\", fr: \"Processus de vérification d'identité étendu\" },\n version: \"1.1.0\",\n components: [\n {\n id: 5, type: \"location\" as const, order: 1,\n labels: { en: \"Enable your location\", fr: \"Activez votre localisation\" },\n instructions: { en: \"We need your GPS location for compliance purposes.\", fr: \"Nous avons besoin de votre localisation GPS pour des raisons réglementaires.\" },\n ui: { icon: \"location-icon.png\", themeColor: \"#2DBD60\", buttonText: { en: \"Enable Location\", fr: \"Activer la localisation\" } },\n config: { accuracy: \"high\", required: true } as const\n },\n {\n id: 6, type: \"country_selection\" as const, order: 2,\n labels: { en: \"Select your country\", fr: \"Sélectionnez votre pays\" },\n instructions: { en: \"Choose your country of residence.\", fr: \"Choisissez votre pays de résidence.\" },\n ui: { icon: \"country-icon.png\", themeColor: \"#2DBD60\", buttonText: { en: \"Confirm\", fr: \"Confirmer\" } },\n config: { allowed_countries: [\"CM\", \"NG\", \"CI\", \"KE\", \"GH\"], default_country: \"CM\", required: true } as const\n },\n {\n id: 1, type: \"id_card\" as const, order: 3, templateId: 1,\n labels: { front: { en: \"Upload front of ID card\", fr: \"Téléversez le recto de votre carte d'identité\" }, back: { en: \"Upload back of ID card\", fr: \"Téléversez le verso de votre carte d'identité\" }, },\n instructions: { front: { en: \"Take a clear photo of the front of your ID.\", fr: \"Prenez une photo nette du recto de votre pièce.\" }, back: { en: \"Take a clear photo of the back of your ID.\", fr: \"Prenez une photo nette du verso de votre pièce.\" }, },\n ui: { front: { icon: \"id-card-icon.png\", themeColor: \"#2DBD60\", buttonText: { en: \"Next\", fr: \"Suivant\" } }, back: { icon: \"id-card-icon.png\", themeColor: \"#2DBD60\", buttonText: { en: \"Next\", fr: \"Suivant\" } }, },\n config: { sides: [\"front\", \"back\"], allowed_formats: [\"jpg\", \"png\"], max_size_mb: 5, document_types: [\"drivers_licence\", \"passport\", \"drivers_licence\", \"national_id\"], } as const\n },\n {\n id: 3, type: \"selfie\" as const, order: 5, templateId: 1,\n labels: { en: \"Take selfies from different angles\", fr: \"Prenez des selfies sous différents angles\" },\n instructions: { en: \"Take selfies from front, left, and right angles.\", fr: \"Prenez des selfies de face, profil gauche et profil droit.\" },\n ui: { icon: \"selfie-icon.png\", themeColor: \"#2DBD60\", buttonText: { en: \"Next\", fr: \"Suivant\" } },\n config: { liveness_check: true, max_attempts: 3, orientations: [\"center\", \"left\", \"right\"] } as const\n },\n ]\n};\n\nexport interface TemplateKYCExampleProps {\n onComplete: (data: VerificationState) => void;\n onCancel: () => void;\n onError: (error: string) => void;\n language: string;\n API_KEY?: string;\n templateId?: string;\n template?: KYCTemplate;\n env?: KycEnvironment;\n serverEnv?: BackendEnvironment;\n existingSessionId?: string;\n initialComponentIndex?: number;\n initialCountryResume?: { code: string; documentType: string; region?: string };\n referenceId?: string;\n onSessionSave?: (sessionId: string) => void;\n kyc_session_id?: string;\n}\n\nexport function TemplateKYCExample({\n onComplete,\n onCancel,\n onError,\n language,\n API_KEY,\n templateId,\n template,\n env = 'PRODUCTION',\n serverEnv,\n existingSessionId,\n initialComponentIndex,\n initialCountryResume,\n referenceId,\n onSessionSave,\n kyc_session_id\n}: TemplateKYCExampleProps): JSX.Element {\n\n const handleComplete = (data: VerificationState) => {\n console.log('KYC Template completed with raw data:', data);\n\n let finalPayload: any = data; // Fallback to raw data if mapping fails\n\n if ((data.status === 'success' || data.status === 'in_progress') && data.result) {\n // 1. Extract the dynamic root key (e.g., 'national_id', 'passport')\n const docKey = Object.keys(data.result)[0];\n \n if (docKey && data.result[docKey]) {\n const backendData = data.result[docKey].data;\n const personalInfo = backendData?.user_data?.personal_information || {};\n \n // Ensure we capture the session ID from whichever prop was provided\n const activeSessionId = kyc_session_id || existingSessionId || \"\";\n\n // 2. Strict mapping to your expected format\n finalPayload = {\n data: {\n verification_id: backendData?.verification_id,\n verification_status: backendData?.verification_status,\n session_id: activeSessionId,\n user_data: {\n personal_information: {\n first_name: personalInfo.first_name || undefined,\n given_name: personalInfo.given_name || undefined,\n last_name: personalInfo.last_name || undefined,\n surname: personalInfo.last_name || undefined, // fallback\n address: personalInfo.address || undefined,\n city: personalInfo.city || undefined,\n postal_code: personalInfo.postal_code || undefined,\n expiry_date: personalInfo.expiry_date || undefined,\n issue_date: personalInfo.issue_date || undefined,\n date_of_birth: personalInfo.date_of_birth || undefined,\n birth_date: personalInfo.date_of_birth || undefined, // fallback\n country: personalInfo.country || undefined,\n document_number: (personalInfo as any).document_number || undefined,\n nationality: (personalInfo as any).nationality || undefined,\n }\n }\n }\n };\n\n sdkLogger.info(\"Wrapper formatted completion payload successfully\", { \n verification_id: finalPayload.data.verification_id \n });\n }\n } else {\n sdkLogger.warn(\"Wrapper received completion without a success result object\", { status: data.status });\n }\n\n onComplete(finalPayload as any); \n };\n\n const handleCancel = () => {\n console.log('KYC Template flow cancelled');\n onCancel();\n };\n\n const handleError = (error: string) => {\n console.error('KYC Template error:', error);\n onError(error);\n };\n\n const templateToUse = templateId ? undefined : (template || advancedVerificationTemplate);\n\n return (\n <SafeAreaView style={{ flex: 1, paddingVertical: 25 }}>\n <View style={{ flex: 1 }}>\n <TemplateKYCFlow\n template={templateToUse}\n templateId={templateId}\n onComplete={handleComplete}\n onError={handleError}\n onCancel={handleCancel}\n language={language}\n API_KEY={API_KEY}\n env={env}\n serverEnv={serverEnv}\n existingSessionId={existingSessionId}\n initialComponentIndex={initialComponentIndex}\n initialCountryResume={initialCountryResume}\n referenceId={referenceId}\n onSessionSave={onSessionSave}\n kyc_session_id={kyc_session_id}\n />\n </View>\n </SafeAreaView>\n );\n}"]}
|
|
@@ -12,9 +12,7 @@ interface TemplateKYCFlowProps {
|
|
|
12
12
|
env?: KycEnvironment;
|
|
13
13
|
serverEnv?: BackendEnvironment;
|
|
14
14
|
existingSessionId?: string;
|
|
15
|
-
/** Index in template.components (0-based) to resume at — e.g. from URL component_index or template table */
|
|
16
15
|
initialComponentIndex?: number;
|
|
17
|
-
/** Pays / type de document depuis l'URL de reprise (reprise multi-appareil) */
|
|
18
16
|
initialCountryResume?: {
|
|
19
17
|
code: string;
|
|
20
18
|
documentType: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TemplateKYCFlowRefactored.d.ts","sourceRoot":"","sources":["../../../src/components/TemplateKYCFlowRefactored.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"TemplateKYCFlowRefactored.d.ts","sourceRoot":"","sources":["../../../src/components/TemplateKYCFlowRefactored.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAmBpE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAIxE,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC/C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,oBAAoB,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAsJ1D,CAAC"}
|