@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.
Files changed (58) hide show
  1. package/build/package.json +1 -1
  2. package/build/src/components/KYCElements/CountrySelection.d.ts.map +1 -1
  3. package/build/src/components/KYCElements/CountrySelection.js +33 -108
  4. package/build/src/components/KYCElements/CountrySelection.js.map +1 -1
  5. package/build/src/components/KYCElements/CountrySelectionTemplate.d.ts.map +1 -1
  6. package/build/src/components/KYCElements/CountrySelectionTemplate.js +50 -164
  7. package/build/src/components/KYCElements/CountrySelectionTemplate.js.map +1 -1
  8. package/build/src/components/KYCElements/DocumentTypeSelection.d.ts.map +1 -1
  9. package/build/src/components/KYCElements/DocumentTypeSelection.js +32 -109
  10. package/build/src/components/KYCElements/DocumentTypeSelection.js.map +1 -1
  11. package/build/src/components/KYCElements/IDCardCapture.d.ts.map +1 -1
  12. package/build/src/components/KYCElements/IDCardCapture.js +58 -25
  13. package/build/src/components/KYCElements/IDCardCapture.js.map +1 -1
  14. package/build/src/components/KYCElements/InitializationStep.d.ts.map +1 -1
  15. package/build/src/components/KYCElements/InitializationStep.js +13 -1
  16. package/build/src/components/KYCElements/InitializationStep.js.map +1 -1
  17. package/build/src/components/KYCElements/LocationCaptureTemplate.d.ts.map +1 -1
  18. package/build/src/components/KYCElements/LocationCaptureTemplate.js +46 -157
  19. package/build/src/components/KYCElements/LocationCaptureTemplate.js.map +1 -1
  20. package/build/src/components/KYCElements/SelfieCapture.d.ts.map +1 -1
  21. package/build/src/components/KYCElements/SelfieCapture.js +28 -24
  22. package/build/src/components/KYCElements/SelfieCapture.js.map +1 -1
  23. package/build/src/components/KYCElements/VerificationProgressTemplate.d.ts.map +1 -1
  24. package/build/src/components/KYCElements/VerificationProgressTemplate.js +0 -4
  25. package/build/src/components/KYCElements/VerificationProgressTemplate.js.map +1 -1
  26. package/build/src/components/SelfieCapture.d.ts.map +1 -1
  27. package/build/src/components/SelfieCapture.js +33 -90
  28. package/build/src/components/SelfieCapture.js.map +1 -1
  29. package/build/src/components/TemplateKYCExample.d.ts.map +1 -1
  30. package/build/src/components/TemplateKYCExample.js +69 -120
  31. package/build/src/components/TemplateKYCExample.js.map +1 -1
  32. package/build/src/components/TemplateKYCFlowRefactored.d.ts +0 -2
  33. package/build/src/components/TemplateKYCFlowRefactored.d.ts.map +1 -1
  34. package/build/src/components/TemplateKYCFlowRefactored.js +95 -210
  35. package/build/src/components/TemplateKYCFlowRefactored.js.map +1 -1
  36. package/build/src/hooks/useTemplateKYCFlow.d.ts.map +1 -1
  37. package/build/src/hooks/useTemplateKYCFlow.js.map +1 -1
  38. package/build/src/types/KYC.types.d.ts.map +1 -1
  39. package/build/src/types/KYC.types.js.map +1 -1
  40. package/build/src/utils/logger.d.ts +12 -4
  41. package/build/src/utils/logger.d.ts.map +1 -1
  42. package/build/src/utils/logger.js +156 -28
  43. package/build/src/utils/logger.js.map +1 -1
  44. package/package.json +1 -1
  45. package/src/components/KYCElements/CountrySelection.tsx +36 -109
  46. package/src/components/KYCElements/CountrySelectionTemplate.tsx +67 -266
  47. package/src/components/KYCElements/DocumentTypeSelection.tsx +34 -110
  48. package/src/components/KYCElements/IDCardCapture.tsx +93 -39
  49. package/src/components/KYCElements/InitializationStep.tsx +17 -2
  50. package/src/components/KYCElements/LocationCaptureTemplate.tsx +53 -170
  51. package/src/components/KYCElements/SelfieCapture.tsx +50 -58
  52. package/src/components/KYCElements/VerificationProgressTemplate.tsx +1 -4
  53. package/src/components/SelfieCapture.tsx +44 -100
  54. package/src/components/TemplateKYCExample.tsx +94 -145
  55. package/src/components/TemplateKYCFlowRefactored.tsx +105 -239
  56. package/src/hooks/useTemplateKYCFlow.tsx +1 -0
  57. package/src/types/KYC.types.ts +0 -1
  58. 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
- // Check camera availability on component mount
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
- flex: 1,
112
- backgroundColor: '#f5f5f5',
113
- },
114
- captureContainer: {
115
- flex: 1,
116
- justifyContent: 'center',
117
- alignItems: 'center',
118
- padding: 20,
119
- },
120
- title: {
121
- fontSize: 24,
122
- fontWeight: 'bold',
123
- color: '#333',
124
- marginBottom: 20,
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":"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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';\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;AAuIxE,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,CA8CvC"}
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
- en: "Advanced Verification",
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
- type: "location",
19
- order: 1,
20
- labels: {
21
- en: "Enable your location",
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
- type: "country_selection",
41
- order: 2,
42
- labels: {
43
- en: "Select your country",
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
- type: "id_card",
64
- order: 3,
65
- templateId: 1,
66
- labels: {
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
- type: "selfie",
108
- order: 5,
109
- templateId: 1,
110
- labels: {
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
- onComplete(data);
135
- // Ici vous pouvez envoyer les données à votre API
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} // ou "en" pour l'anglais
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;AAkBpE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAGxE,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,4GAA4G;IAC5G,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,+EAA+E;IAC/E,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,CA4H1D,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"}