@transfergratis/react-native-sdk 0.1.4 → 0.1.5

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 (199) hide show
  1. package/build/api/axios.d.ts +30 -0
  2. package/build/api/axios.d.ts.map +1 -0
  3. package/build/api/axios.js +92 -0
  4. package/build/api/axios.js.map +1 -0
  5. package/build/components/EnhancedCameraView.d.ts +1 -41
  6. package/build/components/EnhancedCameraView.d.ts.map +1 -1
  7. package/build/components/EnhancedCameraView.js +75 -34
  8. package/build/components/EnhancedCameraView.js.map +1 -1
  9. package/build/components/EnhancedCameraView.web.d.ts +1 -41
  10. package/build/components/EnhancedCameraView.web.d.ts.map +1 -1
  11. package/build/components/EnhancedCameraView.web.js +28 -4
  12. package/build/components/EnhancedCameraView.web.js.map +1 -1
  13. package/build/components/KYCElements/CountrySelectionTemplate.d.ts +2 -2
  14. package/build/components/KYCElements/CountrySelectionTemplate.d.ts.map +1 -1
  15. package/build/components/KYCElements/CountrySelectionTemplate.js +71 -114
  16. package/build/components/KYCElements/CountrySelectionTemplate.js.map +1 -1
  17. package/build/components/KYCElements/FileUploadTemplate.d.ts.map +1 -1
  18. package/build/components/KYCElements/FileUploadTemplate.js +7 -3
  19. package/build/components/KYCElements/FileUploadTemplate.js.map +1 -1
  20. package/build/components/KYCElements/IDCardCapture.d.ts +7 -2
  21. package/build/components/KYCElements/IDCardCapture.d.ts.map +1 -1
  22. package/build/components/KYCElements/IDCardCapture.js +253 -104
  23. package/build/components/KYCElements/IDCardCapture.js.map +1 -1
  24. package/build/components/KYCElements/InitializationStep.d.ts +5 -0
  25. package/build/components/KYCElements/InitializationStep.d.ts.map +1 -0
  26. package/build/components/KYCElements/InitializationStep.js +41 -0
  27. package/build/components/KYCElements/InitializationStep.js.map +1 -0
  28. package/build/components/KYCElements/LocationCaptureTemplate.d.ts.map +1 -1
  29. package/build/components/KYCElements/LocationCaptureTemplate.js +15 -13
  30. package/build/components/KYCElements/LocationCaptureTemplate.js.map +1 -1
  31. package/build/components/KYCElements/OrientationVideoCapture.d.ts +2 -2
  32. package/build/components/KYCElements/OrientationVideoCapture.d.ts.map +1 -1
  33. package/build/components/KYCElements/OrientationVideoCapture.js.map +1 -1
  34. package/build/components/KYCElements/OrientationVideoCaptureEnhanced.d.ts +2 -2
  35. package/build/components/KYCElements/OrientationVideoCaptureEnhanced.d.ts.map +1 -1
  36. package/build/components/KYCElements/OrientationVideoCaptureEnhanced.js.map +1 -1
  37. package/build/components/KYCElements/OrientationVideoCaptureFinal.d.ts +2 -2
  38. package/build/components/KYCElements/OrientationVideoCaptureFinal.d.ts.map +1 -1
  39. package/build/components/KYCElements/OrientationVideoCaptureFinal.js.map +1 -1
  40. package/build/components/KYCElements/ReviewSubmitTemplate.d.ts +12 -0
  41. package/build/components/KYCElements/ReviewSubmitTemplate.d.ts.map +1 -0
  42. package/build/components/KYCElements/ReviewSubmitTemplate.js +171 -0
  43. package/build/components/KYCElements/ReviewSubmitTemplate.js.map +1 -0
  44. package/build/components/KYCElements/SelfieCaptureTemplate.d.ts +6 -2
  45. package/build/components/KYCElements/SelfieCaptureTemplate.d.ts.map +1 -1
  46. package/build/components/KYCElements/SelfieCaptureTemplate.js +105 -35
  47. package/build/components/KYCElements/SelfieCaptureTemplate.js.map +1 -1
  48. package/build/components/KYCElements/VerificationProgressTemplate.d.ts +12 -0
  49. package/build/components/KYCElements/VerificationProgressTemplate.d.ts.map +1 -0
  50. package/build/components/KYCElements/VerificationProgressTemplate.js +93 -0
  51. package/build/components/KYCElements/VerificationProgressTemplate.js.map +1 -0
  52. package/build/components/OverLay/IdCard.d.ts +1 -1
  53. package/build/components/OverLay/IdCard.d.ts.map +1 -1
  54. package/build/components/OverLay/IdCard.js +10 -6
  55. package/build/components/OverLay/IdCard.js.map +1 -1
  56. package/build/components/OverLay/SelfieOverlay.d.ts +1 -1
  57. package/build/components/OverLay/SelfieOverlay.d.ts.map +1 -1
  58. package/build/components/OverLay/SelfieOverlay.js +5 -4
  59. package/build/components/OverLay/SelfieOverlay.js.map +1 -1
  60. package/build/components/OverLay/type.d.ts +71 -1
  61. package/build/components/OverLay/type.d.ts.map +1 -1
  62. package/build/components/OverLay/type.js.map +1 -1
  63. package/build/components/TemplateKYCExample.d.ts.map +1 -1
  64. package/build/components/TemplateKYCExample.js +72 -197
  65. package/build/components/TemplateKYCExample.js.map +1 -1
  66. package/build/components/TemplateKYCFlowRefactored.d.ts.map +1 -1
  67. package/build/components/TemplateKYCFlowRefactored.js +63 -39
  68. package/build/components/TemplateKYCFlowRefactored.js.map +1 -1
  69. package/build/components/example/OrientationVideoExample.d.ts.map +1 -1
  70. package/build/components/example/OrientationVideoExample.js +1 -5
  71. package/build/components/example/OrientationVideoExample.js.map +1 -1
  72. package/build/config/countriesData.d.ts +3 -0
  73. package/build/config/countriesData.d.ts.map +1 -0
  74. package/build/config/countriesData.js +79 -0
  75. package/build/config/countriesData.js.map +1 -0
  76. package/build/config/region_mapping.d.ts +3 -0
  77. package/build/config/region_mapping.d.ts.map +1 -0
  78. package/build/config/region_mapping.js +687 -0
  79. package/build/config/region_mapping.js.map +1 -0
  80. package/build/hooks/useI18n.d.ts +11 -0
  81. package/build/hooks/useI18n.d.ts.map +1 -0
  82. package/build/hooks/useI18n.js +37 -0
  83. package/build/hooks/useI18n.js.map +1 -0
  84. package/build/hooks/useOrientationVideo.d.ts +1 -2
  85. package/build/hooks/useOrientationVideo.d.ts.map +1 -1
  86. package/build/hooks/useOrientationVideo.js +2 -1
  87. package/build/hooks/useOrientationVideo.js.map +1 -1
  88. package/build/hooks/useRealtimeVerifier.d.ts +28 -0
  89. package/build/hooks/useRealtimeVerifier.d.ts.map +1 -0
  90. package/build/hooks/useRealtimeVerifier.js +91 -0
  91. package/build/hooks/useRealtimeVerifier.js.map +1 -0
  92. package/build/hooks/useTemplateKYCFlow.d.ts +1 -0
  93. package/build/hooks/useTemplateKYCFlow.d.ts.map +1 -1
  94. package/build/hooks/useTemplateKYCFlow.js +337 -38
  95. package/build/hooks/useTemplateKYCFlow.js.map +1 -1
  96. package/build/i18n/en/index.d.ts +168 -0
  97. package/build/i18n/en/index.d.ts.map +1 -0
  98. package/build/i18n/en/index.js +195 -0
  99. package/build/i18n/en/index.js.map +1 -0
  100. package/build/i18n/fr/index.d.ts +168 -0
  101. package/build/i18n/fr/index.d.ts.map +1 -0
  102. package/build/i18n/fr/index.js +194 -0
  103. package/build/i18n/fr/index.js.map +1 -0
  104. package/build/i18n/index.d.ts +10 -0
  105. package/build/i18n/index.d.ts.map +1 -0
  106. package/build/i18n/index.js +56 -0
  107. package/build/i18n/index.js.map +1 -0
  108. package/build/i18n/types.d.ts +153 -0
  109. package/build/i18n/types.d.ts.map +1 -0
  110. package/build/i18n/types.js +3 -0
  111. package/build/i18n/types.js.map +1 -0
  112. package/build/i18n/usage-example.d.ts +4 -0
  113. package/build/i18n/usage-example.d.ts.map +1 -0
  114. package/build/i18n/usage-example.js +189 -0
  115. package/build/i18n/usage-example.js.map +1 -0
  116. package/build/modules/api/CardAuthentification.d.ts +22 -0
  117. package/build/modules/api/CardAuthentification.d.ts.map +1 -0
  118. package/build/modules/api/CardAuthentification.js +107 -0
  119. package/build/modules/api/CardAuthentification.js.map +1 -0
  120. package/build/modules/api/KYCService.d.ts +57 -1
  121. package/build/modules/api/KYCService.d.ts.map +1 -1
  122. package/build/modules/api/KYCService.js +348 -27
  123. package/build/modules/api/KYCService.js.map +1 -1
  124. package/build/modules/api/SelfieVerification.d.ts +3 -0
  125. package/build/modules/api/SelfieVerification.d.ts.map +1 -0
  126. package/build/modules/api/SelfieVerification.js +9 -0
  127. package/build/modules/api/SelfieVerification.js.map +1 -0
  128. package/build/modules/api/backendApi.d.ts +2 -0
  129. package/build/modules/api/backendApi.d.ts.map +1 -0
  130. package/build/modules/api/backendApi.js +6 -0
  131. package/build/modules/api/backendApi.js.map +1 -0
  132. package/build/modules/api/types.d.ts +20 -0
  133. package/build/modules/api/types.d.ts.map +1 -0
  134. package/build/modules/api/types.js +2 -0
  135. package/build/modules/api/types.js.map +1 -0
  136. package/build/types/KYC.types.d.ts +59 -7
  137. package/build/types/KYC.types.d.ts.map +1 -1
  138. package/build/types/KYC.types.js +9 -1
  139. package/build/types/KYC.types.js.map +1 -1
  140. package/build/utils/cropByObb.d.ts +11 -0
  141. package/build/utils/cropByObb.d.ts.map +1 -0
  142. package/build/utils/cropByObb.js +78 -0
  143. package/build/utils/cropByObb.js.map +1 -0
  144. package/build/utils/get-document-type-info.d.ts +13 -0
  145. package/build/utils/get-document-type-info.d.ts.map +1 -0
  146. package/build/utils/get-document-type-info.js +59 -0
  147. package/build/utils/get-document-type-info.js.map +1 -0
  148. package/build/utils/pathToBase64.d.ts +3 -0
  149. package/build/utils/pathToBase64.d.ts.map +1 -0
  150. package/build/utils/pathToBase64.js +47 -0
  151. package/build/utils/pathToBase64.js.map +1 -0
  152. package/build/utils/remove-duplicate.d.ts +2 -0
  153. package/build/utils/remove-duplicate.d.ts.map +1 -0
  154. package/build/utils/remove-duplicate.js +4 -0
  155. package/build/utils/remove-duplicate.js.map +1 -0
  156. package/package.json +3 -1
  157. package/src/api/axios.ts +144 -0
  158. package/src/components/EnhancedCameraView.tsx +96 -78
  159. package/src/components/EnhancedCameraView.web.tsx +41 -40
  160. package/src/components/KYCElements/CountrySelectionTemplate.tsx +104 -136
  161. package/src/components/KYCElements/FileUploadTemplate.tsx +14 -8
  162. package/src/components/KYCElements/IDCardCapture.tsx +311 -115
  163. package/src/components/KYCElements/InitializationStep.tsx +53 -0
  164. package/src/components/KYCElements/LocationCaptureTemplate.tsx +17 -15
  165. package/src/components/KYCElements/OrientationVideoCapture.tsx +2 -2
  166. package/src/components/KYCElements/OrientationVideoCaptureEnhanced.tsx +2 -2
  167. package/src/components/KYCElements/OrientationVideoCaptureFinal.tsx +2 -2
  168. package/src/components/KYCElements/ReviewSubmitTemplate.tsx +201 -0
  169. package/src/components/KYCElements/SelfieCaptureTemplate.tsx +140 -53
  170. package/src/components/KYCElements/VerificationProgressTemplate.tsx +123 -0
  171. package/src/components/OverLay/IdCard.tsx +17 -9
  172. package/src/components/OverLay/SelfieOverlay.tsx +6 -5
  173. package/src/components/OverLay/type.ts +64 -2
  174. package/src/components/TemplateKYCExample.tsx +76 -197
  175. package/src/components/TemplateKYCFlowRefactored.tsx +74 -46
  176. package/src/components/example/OrientationVideoExample.tsx +3 -7
  177. package/src/config/countriesData.ts +84 -0
  178. package/src/config/region_mapping.ts +688 -0
  179. package/src/hooks/useI18n.ts +53 -0
  180. package/src/hooks/useOrientationVideo.ts +2 -2
  181. package/src/hooks/useRealtimeVerifier.ts +128 -0
  182. package/src/hooks/useTemplateKYCFlow.tsx +375 -53
  183. package/src/i18n/README.md +288 -0
  184. package/src/i18n/en/index.ts +206 -0
  185. package/src/i18n/fr/index.ts +205 -0
  186. package/src/i18n/index.ts +65 -0
  187. package/src/i18n/types.ts +172 -0
  188. package/src/i18n/usage-example.tsx +202 -0
  189. package/src/modules/api/CardAuthentification.ts +114 -0
  190. package/src/modules/api/KYCService.ts +403 -30
  191. package/src/modules/api/SelfieVerification.ts +11 -0
  192. package/src/modules/api/backendApi.ts +8 -0
  193. package/src/modules/api/types.ts +24 -0
  194. package/src/types/KYC.types.ts +83 -14
  195. package/src/utils/cropByObb.ts +99 -0
  196. package/src/utils/get-document-type-info.ts +62 -0
  197. package/src/utils/pathToBase64.ts +47 -0
  198. package/src/utils/remove-duplicate.ts +3 -0
  199. package/src/types/nativewind.d.ts +0 -2
@@ -0,0 +1,171 @@
1
+ import React, { useMemo } from 'react';
2
+ import { View, Text, StyleSheet, TouchableOpacity, ScrollView } from 'react-native';
3
+ import { useTemplateKYCFlowContext } from '../../hooks/useTemplateKYCFlow';
4
+ import { useI18n } from '../../hooks/useI18n';
5
+ export const ReviewSubmitTemplate = () => {
6
+ const { t } = useI18n();
7
+ const { state, actions, getLocalizedText } = useTemplateKYCFlowContext();
8
+ const idSection = useMemo(() => {
9
+ const idComp = state.template.components.find(c => c.type === 'id_card');
10
+ return idComp ? state.componentData[idComp.id] : null;
11
+ }, [state.template.components, state.componentData]);
12
+ // Helper to coerce possibly-nested localized configs into the expected shape
13
+ const coerceLocalized = (value, fallback) => {
14
+ if (value && typeof value === 'object') {
15
+ if (typeof value.en === 'string' || typeof value.fr === 'string') {
16
+ return {
17
+ en: typeof value.en === 'string' ? value.en : fallback.en,
18
+ fr: typeof value.fr === 'string' ? value.fr : fallback.fr,
19
+ ...value,
20
+ };
21
+ }
22
+ }
23
+ return fallback;
24
+ };
25
+ // const reviewComp = useMemo(() => {
26
+ // return state.template.components.find(c => c.type === 'review_submit');
27
+ // }, [state.template.components]);
28
+ const dynamicComponents = useMemo(() => {
29
+ return state.template.components.filter(c => c.type !== 'review_submit' && c.type !== 'verification_progress');
30
+ }, [state.template.components]);
31
+ const handleSubmit = async () => {
32
+ await actions.nextComponent();
33
+ };
34
+ return (<View style={styles.container}>
35
+ <Text style={styles.title}>{t('kyc.reviewSubmit.title')}</Text>
36
+ <Text style={styles.subtitle}>{t('kyc.reviewSubmit.subtitle')}</Text>
37
+
38
+ <ScrollView contentContainerStyle={styles.scrollContent}>
39
+ {dynamicComponents.map((comp) => {
40
+ const compData = state.componentData[comp.id] || {};
41
+ const isCompleted = state.completedComponents.includes(comp.id);
42
+ if (comp.type === 'id_card') {
43
+ const hasFront = !!(compData.front || compData.front_base64 || compData.front_mrz);
44
+ const hasBack = !!(compData.back || compData.back_base64 || compData.back_mrz);
45
+ return (<View key={comp.id} style={styles.section}>
46
+ <Text style={styles.sectionTitle}>{t('kyc.reviewSubmit.documentInfo')}</Text>
47
+ <View style={styles.row}>
48
+ <View style={[styles.tile, hasFront ? styles.active : null]}>
49
+ <Text style={styles.tileLabel}>{t('kyc.idCardCapture.frontSide')}</Text>
50
+ {hasFront ? <Text style={styles.check}>✓</Text> : null}
51
+ </View>
52
+ <View style={[styles.tile, hasBack ? styles.active : null]}>
53
+ <Text style={styles.tileLabel}>{t('kyc.idCardCapture.backSide')}</Text>
54
+ {hasBack ? <Text style={styles.check}>✓</Text> : null}
55
+ </View>
56
+ </View>
57
+ {idSection?.documentType ? (<Text style={styles.caption}>{idSection.documentType}</Text>) : null}
58
+ </View>);
59
+ }
60
+ if (comp.type === 'selfie') {
61
+ const orientations = (comp.config?.orientations || ['center', 'right', 'left']);
62
+ return (<View key={comp.id} style={styles.section}>
63
+ <Text style={styles.sectionTitle}>{t('kyc.selfieCapture.title')}</Text>
64
+ <View style={styles.row}>
65
+ {orientations.map((o) => {
66
+ const has = !!compData[o];
67
+ const colorStyle = o === 'center' ? styles.pink : o === 'right' ? styles.blue : styles.purple;
68
+ return (<View key={o} style={[styles.tile, colorStyle, has ? styles.active : null]}>
69
+ <Text style={styles.tileLabel}>{o.charAt(0).toUpperCase() + o.slice(1)}</Text>
70
+ {has ? <Text style={styles.check}>✓</Text> : null}
71
+ </View>);
72
+ })}
73
+ </View>
74
+ <Text style={styles.caption}>{t('kyc.selfieCapture.success')}</Text>
75
+ </View>);
76
+ }
77
+ // Generic fallback for other component types
78
+ return (<View key={comp.id} style={styles.section}>
79
+ <Text style={styles.sectionTitle}>{getLocalizedText(coerceLocalized(comp.labels, { en: comp.type, fr: comp.type }))}</Text>
80
+ <Text style={styles.caption}>{isCompleted ? t('common.success') : t('kyc.verificationProgress.status.pending')}</Text>
81
+ </View>);
82
+ })}
83
+ </ScrollView>
84
+
85
+ <TouchableOpacity style={[styles.button, styles.primary]} onPress={handleSubmit}>
86
+ <Text style={styles.buttonText}>{t('kyc.reviewSubmit.submitButton')}</Text>
87
+ </TouchableOpacity>
88
+ </View>);
89
+ };
90
+ const styles = StyleSheet.create({
91
+ container: {
92
+ flex: 1,
93
+ width: '100%',
94
+ paddingHorizontal: 16,
95
+ paddingVertical: 12,
96
+ },
97
+ title: {
98
+ fontSize: 24,
99
+ fontWeight: 'bold',
100
+ color: '#111827',
101
+ marginBottom: 4,
102
+ },
103
+ subtitle: {
104
+ fontSize: 14,
105
+ color: '#6B7280',
106
+ marginBottom: 16,
107
+ },
108
+ section: {
109
+ backgroundColor: 'white',
110
+ borderRadius: 16,
111
+ padding: 16,
112
+ marginBottom: 16,
113
+ },
114
+ sectionTitle: {
115
+ fontSize: 18,
116
+ fontWeight: '700',
117
+ color: '#111827',
118
+ marginBottom: 12,
119
+ },
120
+ scrollContent: {
121
+ paddingBottom: 24,
122
+ },
123
+ row: {
124
+ flexDirection: 'row',
125
+ gap: 12,
126
+ },
127
+ tile: {
128
+ flex: 1,
129
+ height: 110,
130
+ borderRadius: 16,
131
+ backgroundColor: '#F3F4F6',
132
+ alignItems: 'center',
133
+ justifyContent: 'center',
134
+ },
135
+ tileLabel: {
136
+ fontSize: 14,
137
+ color: '#111827',
138
+ marginBottom: 8,
139
+ },
140
+ check: {
141
+ fontSize: 18,
142
+ color: '#10B981',
143
+ fontWeight: '700',
144
+ },
145
+ active: {
146
+ backgroundColor: '#DDE9FF',
147
+ },
148
+ pink: { backgroundColor: '#FDE2E7' },
149
+ blue: { backgroundColor: '#DDE9FF' },
150
+ purple: { backgroundColor: '#EDE2FF' },
151
+ caption: {
152
+ marginTop: 10,
153
+ fontSize: 12,
154
+ color: '#6B7280',
155
+ },
156
+ button: {
157
+ paddingVertical: 14,
158
+ borderRadius: 10,
159
+ alignItems: 'center',
160
+ marginTop: 12,
161
+ },
162
+ primary: {
163
+ backgroundColor: '#2DBD60',
164
+ },
165
+ buttonText: {
166
+ color: 'white',
167
+ fontSize: 16,
168
+ fontWeight: '600',
169
+ },
170
+ });
171
+ //# sourceMappingURL=ReviewSubmitTemplate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReviewSubmitTemplate.js","sourceRoot":"","sources":["../../../src/components/KYCElements/ReviewSubmitTemplate.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useMemo } from 'react';\nimport { View, Text, StyleSheet, TouchableOpacity, ScrollView } from 'react-native';\nimport { TemplateComponent } from '../../types/KYC.types';\nimport { useTemplateKYCFlowContext } from '../../hooks/useTemplateKYCFlow';\nimport { useI18n } from '../../hooks/useI18n';\n\ninterface ReviewSubmitTemplateProps {\n component: TemplateComponent;\n value: unknown;\n onValueChange: (data: unknown) => void;\n error?: string;\n language?: string;\n}\n\nexport const ReviewSubmitTemplate: React.FC<ReviewSubmitTemplateProps> = () => {\n const { t } = useI18n();\n const { state, actions, getLocalizedText } = useTemplateKYCFlowContext();\n\n const idSection = useMemo(() => {\n const idComp = state.template.components.find(c => c.type === 'id_card');\n return idComp ? state.componentData[idComp.id] : null;\n }, [state.template.components, state.componentData]);\n\n // Helper to coerce possibly-nested localized configs into the expected shape\n const coerceLocalized = (value: any, fallback: { en: string; fr: string }) => {\n if (value && typeof value === 'object') {\n if (typeof value.en === 'string' || typeof value.fr === 'string') {\n return {\n en: typeof value.en === 'string' ? value.en : fallback.en,\n fr: typeof value.fr === 'string' ? value.fr : fallback.fr,\n ...value,\n } as { [key: string]: string; en: string; fr: string };\n }\n }\n return fallback;\n };\n\n // const reviewComp = useMemo(() => {\n // return state.template.components.find(c => c.type === 'review_submit');\n // }, [state.template.components]);\n\n const dynamicComponents = useMemo(() => {\n return state.template.components.filter(c => c.type !== 'review_submit' && c.type !== 'verification_progress');\n }, [state.template.components]);\n\n const handleSubmit = async () => {\n await actions.nextComponent();\n };\n\n return (\n <View style={styles.container}>\n <Text style={styles.title}>{t('kyc.reviewSubmit.title')}</Text>\n <Text style={styles.subtitle}>{t('kyc.reviewSubmit.subtitle')}</Text>\n\n <ScrollView contentContainerStyle={styles.scrollContent}>\n {dynamicComponents.map((comp) => {\n const compData = state.componentData[comp.id] || {};\n const isCompleted = state.completedComponents.includes(comp.id);\n if (comp.type === 'id_card') {\n const hasFront = !!(compData.front || compData.front_base64 || compData.front_mrz);\n const hasBack = !!(compData.back || compData.back_base64 || compData.back_mrz);\n return (\n <View key={comp.id} style={styles.section}>\n <Text style={styles.sectionTitle}>{t('kyc.reviewSubmit.documentInfo')}</Text>\n <View style={styles.row}>\n <View style={[styles.tile, hasFront ? styles.active : null]}>\n <Text style={styles.tileLabel}>{t('kyc.idCardCapture.frontSide')}</Text>\n {hasFront ? <Text style={styles.check}>✓</Text> : null}\n </View>\n <View style={[styles.tile, hasBack ? styles.active : null]}>\n <Text style={styles.tileLabel}>{t('kyc.idCardCapture.backSide')}</Text>\n {hasBack ? <Text style={styles.check}>✓</Text> : null}\n </View>\n </View>\n {idSection?.documentType ? (\n <Text style={styles.caption}>{idSection.documentType}</Text>\n ) : null}\n </View>\n );\n }\n if (comp.type === 'selfie') {\n const orientations = ((comp.config as any)?.orientations || ['center', 'right', 'left']) as string[];\n return (\n <View key={comp.id} style={styles.section}>\n <Text style={styles.sectionTitle}>{t('kyc.selfieCapture.title')}</Text>\n <View style={styles.row}>\n {orientations.map((o) => {\n const has = !!compData[o];\n const colorStyle = o === 'center' ? styles.pink : o === 'right' ? styles.blue : styles.purple;\n return (\n <View key={o} style={[styles.tile, colorStyle, has ? styles.active : null]}>\n <Text style={styles.tileLabel}>{o.charAt(0).toUpperCase() + o.slice(1)}</Text>\n {has ? <Text style={styles.check}>✓</Text> : null}\n </View>\n );\n })}\n </View>\n <Text style={styles.caption}>{t('kyc.selfieCapture.success')}</Text>\n </View>\n );\n }\n // Generic fallback for other component types\n return (\n <View key={comp.id} style={styles.section}>\n <Text style={styles.sectionTitle}>{getLocalizedText(coerceLocalized(comp.labels, { en: comp.type, fr: comp.type }))}</Text>\n <Text style={styles.caption}>{isCompleted ? t('common.success') : t('kyc.verificationProgress.status.pending')}</Text>\n </View>\n );\n })}\n </ScrollView>\n\n <TouchableOpacity style={[styles.button, styles.primary]} onPress={handleSubmit}>\n <Text style={styles.buttonText}>{t('kyc.reviewSubmit.submitButton')}</Text>\n </TouchableOpacity>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n width: '100%',\n paddingHorizontal: 16,\n paddingVertical: 12,\n },\n title: {\n fontSize: 24,\n fontWeight: 'bold',\n color: '#111827',\n marginBottom: 4,\n },\n subtitle: {\n fontSize: 14,\n color: '#6B7280',\n marginBottom: 16,\n },\n section: {\n backgroundColor: 'white',\n borderRadius: 16,\n padding: 16,\n marginBottom: 16,\n },\n sectionTitle: {\n fontSize: 18,\n fontWeight: '700',\n color: '#111827',\n marginBottom: 12,\n },\n scrollContent: {\n paddingBottom: 24,\n },\n row: {\n flexDirection: 'row',\n gap: 12,\n },\n tile: {\n flex: 1,\n height: 110,\n borderRadius: 16,\n backgroundColor: '#F3F4F6',\n alignItems: 'center',\n justifyContent: 'center',\n },\n tileLabel: {\n fontSize: 14,\n color: '#111827',\n marginBottom: 8,\n },\n check: {\n fontSize: 18,\n color: '#10B981',\n fontWeight: '700',\n },\n active: {\n backgroundColor: '#DDE9FF',\n },\n pink: { backgroundColor: '#FDE2E7' },\n blue: { backgroundColor: '#DDE9FF' },\n purple: { backgroundColor: '#EDE2FF' },\n caption: {\n marginTop: 10,\n fontSize: 12,\n color: '#6B7280',\n },\n button: {\n paddingVertical: 14,\n borderRadius: 10,\n alignItems: 'center',\n marginTop: 12,\n },\n primary: {\n backgroundColor: '#2DBD60',\n },\n buttonText: {\n color: 'white',\n fontSize: 16,\n fontWeight: '600',\n },\n});\n\n\n"]}
@@ -1,9 +1,13 @@
1
1
  import React from 'react';
2
2
  import { TemplateComponent } from '../../types/KYC.types';
3
+ interface IImagePayload {
4
+ dir: string;
5
+ file: string;
6
+ }
3
7
  interface SelfieCaptureTemplateProps {
4
8
  component: TemplateComponent;
5
- value: Record<string, string> | undefined;
6
- onValueChange: (value: Record<string, string>) => void;
9
+ value: Record<string, IImagePayload> | undefined;
10
+ onValueChange: (value: Record<string, IImagePayload>) => void;
7
11
  error?: string;
8
12
  language: string;
9
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SelfieCaptureTemplate.d.ts","sourceRoot":"","sources":["../../../src/components/KYCElements/SelfieCaptureTemplate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAA+B,MAAM,uBAAuB,CAAC;AAMvF,UAAU,0BAA0B;IAClC,SAAS,EAAE,iBAAiB,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC1C,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,0BAA0B,CAkOtE,CAAC"}
1
+ {"version":3,"file":"SelfieCaptureTemplate.d.ts","sourceRoot":"","sources":["../../../src/components/KYCElements/SelfieCaptureTemplate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAsE,MAAM,uBAAuB,CAAC;AAS9H,UAAU,aAAa;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AACD,UAAU,0BAA0B;IAClC,SAAS,EAAE,iBAAiB,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,SAAS,CAAC;IACjD,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,KAAK,IAAI,CAAC;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,0BAA0B,CAkTtE,CAAC"}
@@ -3,27 +3,40 @@ import { View, Text, StyleSheet, Alert, ScrollView } from 'react-native';
3
3
  import { EnhancedCameraView } from '../EnhancedCameraView';
4
4
  import { Button } from '../ui/Button';
5
5
  import { useTemplateKYCFlowContext } from '../../hooks/useTemplateKYCFlow';
6
+ import { useI18n } from '../../hooks/useI18n';
6
7
  import SelfieOverlay from '../OverLay/SelfieOverlay';
8
+ import selfieVerification from '../../modules/api/SelfieVerification';
9
+ import pathToBase64 from '../../utils/pathToBase64';
7
10
  export const SelfieCaptureTemplate = ({ component, value, onValueChange, error, language, }) => {
11
+ const { t } = useI18n();
8
12
  const config = component.config;
9
- const maxAttempts = config.max_attempts || 3;
10
- const orientations = config.orientations || ['front'];
13
+ const orientations = (config.orientations || ['center']);
11
14
  const { actions, state, } = useTemplateKYCFlowContext();
15
+ const [silentCaptureResult, setSilentCaptureResult] = useState({ success: false, isAnalyzing: false });
12
16
  const [showCamera, setShowCamera] = useState(false);
13
17
  const [currentOrientation, setCurrentOrientation] = useState(orientations[0]);
14
18
  const [capturedImages, setCapturedImages] = useState(value || {});
15
- const [attempts, setAttempts] = useState(0);
16
19
  const getLocalizedText = (text) => {
17
- return text[language] || text.en || '';
20
+ if (!text)
21
+ return '';
22
+ // If text is a nested record (e.g., per theme/device), try to pick a default then localize
23
+ const maybeNested = text;
24
+ if (maybeNested && typeof maybeNested === 'object' && 'en' in maybeNested === false && 'fr' in maybeNested === false) {
25
+ const firstKey = Object.keys(maybeNested)[0];
26
+ const nested = maybeNested[firstKey];
27
+ return nested?.[language] || nested?.en || '';
28
+ }
29
+ const loc = text;
30
+ return loc[language] || loc.en || '';
18
31
  };
19
32
  const getOrientationInstructions = (orientation) => {
20
33
  switch (orientation) {
21
- case 'front':
22
- return 'Prenez un selfie de face, regardez droit devant vous';
34
+ case 'center':
35
+ return state.currentLanguage === "en" ? "Take a selfie of face, look straight ahead you" : "Prenez un selfie de face, regardez droit devant vous";
23
36
  case 'left':
24
- return 'Tournez votre tête vers la gauche, gardez les épaules droites';
37
+ return state.currentLanguage === "en" ? "Turn your head to the left, keep your shoulders straight" : "Tournez votre tête vers la gauche, gardez les épaules droites";
25
38
  case 'right':
26
- return 'Tournez votre tête vers la droite, gardez les épaules droites';
39
+ return state.currentLanguage === "en" ? "Turn your head to the right, keep your shoulders straight" : "Tournez votre tête vers la droite, gardez les épaules droites";
27
40
  default:
28
41
  return getLocalizedText(component.instructions);
29
42
  }
@@ -33,52 +46,102 @@ export const SelfieCaptureTemplate = ({ component, value, onValueChange, error,
33
46
  }, [showCamera]);
34
47
  const getOrientationLabel = (orientation) => {
35
48
  switch (orientation) {
36
- case 'front':
37
- return 'Selfie de face';
49
+ case 'center':
50
+ return state.currentLanguage === "en" ? "Selfie de face" : "Selfie de face";
38
51
  case 'left':
39
- return 'Selfie profil gauche';
52
+ return state.currentLanguage === "en" ? "Selfie profil gauche" : "Selfie profil gauche";
40
53
  case 'right':
41
- return 'Selfie profil droit';
54
+ return state.currentLanguage === "en" ? "Selfie profil droit" : "Selfie profil droit";
42
55
  default:
43
56
  return getLocalizedText(component.labels);
44
57
  }
45
58
  };
59
+ const getOrientationOpposite = (orientation) => {
60
+ switch (orientation) {
61
+ case 'center':
62
+ return 'center';
63
+ case 'left':
64
+ return 'left';
65
+ case 'right':
66
+ return 'right';
67
+ default:
68
+ return orientation;
69
+ }
70
+ };
46
71
  const getInstructions = (orientation) => {
72
+ const lang = state.currentLanguage;
47
73
  switch (orientation) {
48
- case 'front':
49
- return { title: 'Center your face', subtitle: 'Align your face to the center of the selfie area and then take a photo' };
74
+ case 'center':
75
+ return {
76
+ title: lang === "en" ? 'Center your face' : 'Mettez votre face au centre',
77
+ subtitle: lang === "en"
78
+ ? 'Align your face to the center of the selfie area and then take a photo'
79
+ : 'Alignez votre visage au centre de la zone selfie puis prenez une photo'
80
+ };
50
81
  case 'left':
51
- return { title: 'Turn your head left', subtitle: 'Slowly turn your head to the left while keeping your face in the selfie area' };
82
+ return {
83
+ title: lang === 'en'
84
+ ? 'Turn your head left'
85
+ : 'Tournez la tête vers la gauche',
86
+ subtitle: lang === 'en'
87
+ ? 'Slowly turn your head to the left while keeping your face in the selfie area'
88
+ : 'Tournez lentement la tête vers la gauche en gardant votre visage dans la zone selfie'
89
+ };
52
90
  case 'right':
53
- return { title: 'Turn your head right', subtitle: 'Slowly turn your head to the right while keeping your face in the selfie area' };
91
+ return {
92
+ title: lang === 'en'
93
+ ? 'Turn your head right'
94
+ : 'Tournez la tête vers la droite',
95
+ subtitle: lang === 'en'
96
+ ? 'Slowly turn your head to the right while keeping your face in the selfie area'
97
+ : 'Tournez lentement la tête vers la droite en gardant votre visage dans la zone selfie'
98
+ };
54
99
  default:
55
100
  return { title: getLocalizedText(component.labels), subtitle: getLocalizedText(component.instructions) };
56
101
  }
57
102
  };
58
- const handleCapture = (result) => {
103
+ const handleSilentCapture = (result) => {
104
+ if (silentCaptureResult.isAnalyzing) {
105
+ return;
106
+ }
59
107
  if (result.success && result.path) {
60
- const newImages = { ...capturedImages, [currentOrientation]: result.path };
108
+ setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: true, success: false, error: '' }));
109
+ selfieVerification(result.path).then((response) => {
110
+ if (response.length > 0) {
111
+ const res = response[0];
112
+ if (res?.orientation_direction === getOrientationOpposite(currentOrientation) && res?.capture) {
113
+ setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: false, success: true, error: '', path: result.path }));
114
+ }
115
+ else {
116
+ setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: false, success: false, error: 'Le selfie n\'est pas correct' }));
117
+ }
118
+ }
119
+ else {
120
+ setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: false, success: false, error: 'Le selfie n\'est pas correct' }));
121
+ }
122
+ }).catch((e) => {
123
+ setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: false, success: false, error: e?.message || 'Erreur de vérification du selfie' }));
124
+ });
125
+ }
126
+ };
127
+ const handleCapture = async (result) => {
128
+ console.log("handleCapturessss", silentCaptureResult);
129
+ if (silentCaptureResult.success && silentCaptureResult.path) {
130
+ const base64 = await pathToBase64(silentCaptureResult.path);
131
+ // Keep backward-compatible structure for UI validation and add *_base64 fields for backend payload
132
+ const newImages = {
133
+ ...capturedImages,
134
+ [currentOrientation]: { dir: silentCaptureResult.path, file: base64 },
135
+ };
61
136
  setCapturedImages(newImages);
62
137
  onValueChange(newImages);
63
138
  setShowCamera(false);
64
- setAttempts(0);
65
139
  // Passer à l'orientation suivante si disponible
66
140
  const currentIndex = orientations.indexOf(currentOrientation);
67
141
  if (currentIndex < orientations.length - 1) {
68
142
  setCurrentOrientation(orientations[currentIndex + 1]);
69
143
  }
70
144
  }
71
- else {
72
- const newAttempts = attempts + 1;
73
- setAttempts(newAttempts);
74
- if (newAttempts >= maxAttempts) {
75
- Alert.alert('Limite atteinte', `Vous avez atteint le nombre maximum de tentatives (${maxAttempts}).`);
76
- setShowCamera(false);
77
- }
78
- else {
79
- Alert.alert('Erreur', result.error || 'Impossible de prendre le selfie');
80
- }
81
- }
82
145
  };
83
146
  const handleError = (event) => {
84
147
  Alert.alert('Erreur', event.message);
@@ -90,9 +153,10 @@ export const SelfieCaptureTemplate = ({ component, value, onValueChange, error,
90
153
  const isAllOrientationsCompleted = () => {
91
154
  return orientations.every(orientation => isOrientationCompleted(orientation));
92
155
  };
156
+ console.log("Current Orientation", currentOrientation);
93
157
  if (showCamera) {
94
158
  return (<View style={styles.containerCamera}>
95
- <EnhancedCameraView instructions={getOrientationInstructions(currentOrientation)} showCamera={true} cameraType="front" style={styles.camera} onCapture={handleCapture} onError={handleError} onClose={() => setShowCamera(false)} quality="high" showCaptureButton={true} showSwitchCamera={false} enableFlash={false} overlayComponent={<SelfieOverlay xMin={20} yMin={140} xMax={370} yMax={340} cornerOpacity={1} instructions={""} orientation={currentOrientation} instructionsTile={getInstructions(currentOrientation).title} instructionsSubtitle={getInstructions(currentOrientation).subtitle} stepperProps={{
159
+ <EnhancedCameraView instructions={getOrientationInstructions(currentOrientation)} showCamera={true} cameraType="front" style={styles.camera} onCapture={handleCapture} onError={handleError} onClose={() => setShowCamera(false)} quality="high" showCaptureButton={true} showSwitchCamera={false} enableFlash={false} silentCaptureResult={silentCaptureResult} onSilentCapture={handleSilentCapture} overlayComponent={<SelfieOverlay xMin={20} yMin={140} xMax={370} yMax={340} cornerOpacity={1} instructions={""} language={state.currentLanguage} orientation={currentOrientation} instructionsTile={getInstructions(currentOrientation).title} instructionsSubtitle={getInstructions(currentOrientation).subtitle} stepperProps={{
96
160
  back: () => {
97
161
  setShowCamera(false);
98
162
  },
@@ -146,25 +210,31 @@ export const SelfieCaptureTemplate = ({ component, value, onValueChange, error,
146
210
  </View>))}
147
211
  <View style={{ backgroundColor: "#F6CB0D1A", width: "100%", padding: 10, borderRadius: 10 }}>
148
212
  <Text style={{ color: '#997E06', fontSize: 16, fontWeight: 'bold' }}>
149
- Tips for a good selfie:
213
+ {state.currentLanguage === "en"
214
+ ? "Tips for a good selfie:"
215
+ : "Conseils pour une bonne photo selfie :"}
150
216
  </Text>
151
217
  <View style={{ paddingLeft: 10, paddingTop: 4 }}>
152
218
  <Text style={{ color: '#997E06', fontSize: 14, fontWeight: 'bold' }}>
153
- {`• Remove glasses and hat \n• Look directly at the camera \n• Ensure good lighting \n`}
219
+ {state.currentLanguage === "en"
220
+ ? `• Remove glasses and hat \n• Look directly at the camera \n• Ensure good lighting \n`
221
+ : `• Retirez vos lunettes et votre chapeau \n• Regardez directement la caméra \n• Assurez-vous d'une bonne luminosité \n`}
154
222
  </Text>
155
223
  </View>
156
224
  </View>
157
225
  <View style={{ height: 10 }}/>
158
226
  {isAllOrientationsCompleted() ? <>
159
- <Button title="Continuer" fullWidth style={{ paddingVertical: 20, paddingTop: 12 }} onPress={() => {
227
+ <Button title={t('common.continue')} fullWidth style={{ paddingVertical: 20, paddingTop: 12 }} onPress={async () => {
160
228
  onValueChange(capturedImages);
161
229
  actions.nextComponent();
162
230
  }}/>
163
- </> : (<Button title="Start Selfie" fullWidth style={{ paddingVertical: 20, paddingTop: 12 }} onPress={() => {
231
+ </> : (<Button title={t('kyc.selfieCapture.captureButton')} fullWidth style={{ paddingVertical: 20, paddingTop: 12 }} onPress={() => {
164
232
  if (isAllOrientationsCompleted()) {
165
233
  onValueChange(capturedImages);
234
+ actions.nextComponent();
166
235
  }
167
236
  else {
237
+ setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: false, success: false, error: '' }));
168
238
  setShowCamera(true);
169
239
  }
170
240
  }}/>)}
@@ -1 +1 @@
1
- {"version":3,"file":"SelfieCaptureTemplate.js","sourceRoot":"","sources":["../../../src/components/KYCElements/SelfieCaptureTemplate.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useState } from 'react';\nimport { View, Text, StyleSheet, Alert, ScrollView } from 'react-native';\nimport { TemplateComponent, SelfieConfig, LocalizedText } from '../../types/KYC.types';\nimport { EnhancedCameraView } from '../EnhancedCameraView';\nimport { Button } from '../ui/Button';\nimport { useTemplateKYCFlowContext } from '../../hooks/useTemplateKYCFlow';\nimport SelfieOverlay from '../OverLay/SelfieOverlay';\n\ninterface SelfieCaptureTemplateProps {\n component: TemplateComponent;\n value: Record<string, string> | undefined;\n onValueChange: (value: Record<string, string>) => void;\n error?: string;\n language: string;\n}\n\nexport const SelfieCaptureTemplate: React.FC<SelfieCaptureTemplateProps> = ({\n component,\n value,\n onValueChange,\n error,\n language,\n}) => {\n const config = component.config as SelfieConfig;\n const maxAttempts = config.max_attempts || 3;\n const orientations = config.orientations || ['front'];\n const { actions, state, } = useTemplateKYCFlowContext();\n\n const [showCamera, setShowCamera] = useState(false);\n const [currentOrientation, setCurrentOrientation] = useState<string>(orientations[0]);\n const [capturedImages, setCapturedImages] = useState<Record<string, string>>(value || {});\n const [attempts, setAttempts] = useState(0);\n\n const getLocalizedText = (text: LocalizedText): string => {\n return text[language] || text.en || '';\n };\n\n const getOrientationInstructions = (orientation: string): string => {\n switch (orientation) {\n case 'front':\n return 'Prenez un selfie de face, regardez droit devant vous';\n case 'left':\n return 'Tournez votre tête vers la gauche, gardez les épaules droites';\n case 'right':\n return 'Tournez votre tête vers la droite, gardez les épaules droites';\n default:\n return getLocalizedText(component.instructions);\n }\n };\n\n useEffect(() => {\n actions.showCustomStepper(!showCamera);\n }, [showCamera]);\n\n const getOrientationLabel = (orientation: string): string => {\n switch (orientation) {\n case 'front':\n return 'Selfie de face';\n case 'left':\n return 'Selfie profil gauche';\n case 'right':\n return 'Selfie profil droit';\n default:\n return getLocalizedText(component.labels);\n }\n };\n\n const getInstructions = (orientation: string): { title: string, subtitle: string } => {\n switch (orientation) {\n case 'front':\n return { title: 'Center your face', subtitle: 'Align your face to the center of the selfie area and then take a photo' };\n case 'left':\n return { title: 'Turn your head left', subtitle: 'Slowly turn your head to the left while keeping your face in the selfie area' };\n case 'right':\n return { title: 'Turn your head right', subtitle: 'Slowly turn your head to the right while keeping your face in the selfie area' };\n default:\n return { title: getLocalizedText(component.labels), subtitle: getLocalizedText(component.instructions) };\n }\n };\n\n const handleCapture = (result: { success: boolean; path?: string; error?: string }) => {\n if (result.success && result.path) {\n const newImages = { ...capturedImages, [currentOrientation]: result.path };\n setCapturedImages(newImages);\n onValueChange(newImages);\n setShowCamera(false);\n setAttempts(0);\n\n // Passer à l'orientation suivante si disponible\n const currentIndex = orientations.indexOf(currentOrientation as any);\n if (currentIndex < orientations.length - 1) {\n setCurrentOrientation(orientations[currentIndex + 1]);\n }\n } else {\n const newAttempts = attempts + 1;\n setAttempts(newAttempts);\n\n if (newAttempts >= maxAttempts) {\n Alert.alert(\n 'Limite atteinte',\n `Vous avez atteint le nombre maximum de tentatives (${maxAttempts}).`\n );\n setShowCamera(false);\n } else {\n Alert.alert('Erreur', result.error || 'Impossible de prendre le selfie');\n }\n }\n };\n\n const handleError = (event: { message: string }) => {\n Alert.alert('Erreur', event.message);\n setShowCamera(false);\n };\n\n\n const isOrientationCompleted = (orientation: string): boolean => {\n return !!capturedImages[orientation];\n };\n\n const isAllOrientationsCompleted = (): boolean => {\n return orientations.every(orientation => isOrientationCompleted(orientation));\n };\n\n if (showCamera) {\n return (\n <View style={styles.containerCamera}>\n <EnhancedCameraView\n instructions={getOrientationInstructions(currentOrientation)}\n showCamera={true}\n cameraType=\"front\"\n style={styles.camera}\n onCapture={handleCapture}\n onError={handleError}\n onClose={() => setShowCamera(false)}\n quality=\"high\"\n showCaptureButton={true}\n showSwitchCamera={false}\n enableFlash={false}\n overlayComponent={<SelfieOverlay\n xMin={20}\n yMin={140}\n xMax={370}\n yMax={340}\n cornerOpacity={1}\n instructions={\"\"}\n orientation={currentOrientation as 'front' | 'left' | 'right'}\n instructionsTile={getInstructions(currentOrientation).title}\n instructionsSubtitle={getInstructions(currentOrientation).subtitle}\n stepperProps={{\n back: () => {\n setShowCamera(false);\n },\n selectedDocumentType: \"Selfie\",\n step: state.currentComponentIndex + 1,\n totalSteps: state.template.components.length,\n }} />}\n />\n </View>\n );\n }\n\n\n return (\n <View style={[{\n maxWidth: 760,\n width: '100%',\n height: '100%',\n }]}>\n <View style={styles.container}>\n <Text style={styles.title}>{getLocalizedText(component.labels)}</Text>\n <Text style={styles.description}>{getLocalizedText(component.instructions)}</Text>\n\n <ScrollView style={styles.orientationsContainer} showsVerticalScrollIndicator={false}>\n <View style={{ flexDirection: 'column', alignItems: 'center', gap: 10 }}>\n\n {orientations.map((orientation, key) => (\n <View key={orientation} style={{\n backgroundColor: '#F3F4F6',\n borderRadius: 12,\n flexDirection: 'row',\n alignItems: 'center',\n gap: 10,\n width: '100%',\n paddingVertical: 10,\n paddingHorizontal: 10,\n }}>\n <View style={{\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: isOrientationCompleted(orientation) ? '#2DBE60' : '#D1D5DB',\n borderRadius: 100,\n width: 30,\n height: 30,\n }}>\n <Text style={{ color: 'white', fontSize: 16, fontWeight: 'bold' }}>{key + 1}</Text>\n </View>\n\n\n <Text style={styles.orientationTitle}>\n {getOrientationLabel(orientation)}\n </Text>\n\n\n\n </View>\n ))}\n <View style={{ backgroundColor: \"#F6CB0D1A\", width: \"100%\", padding: 10, borderRadius: 10 }} >\n <Text style={{ color: '#997E06', fontSize: 16, fontWeight: 'bold' }}>\n Tips for a good selfie:\n </Text>\n <View style={{ paddingLeft: 10, paddingTop: 4 }}>\n <Text style={{ color: '#997E06', fontSize: 14, fontWeight: 'bold' }}>\n {`• Remove glasses and hat \\n• Look directly at the camera \\n• Ensure good lighting \\n`}\n </Text>\n </View>\n </View>\n <View style={{ height: 10 }} />\n {isAllOrientationsCompleted() ? <>\n <Button title=\"Continuer\" fullWidth style={{ paddingVertical: 20, paddingTop: 12 }} onPress={() => {\n onValueChange(capturedImages);\n actions.nextComponent();\n }} />\n </> : (\n <Button title=\"Start Selfie\" fullWidth style={{ paddingVertical: 20, paddingTop: 12 }} onPress={() => {\n if (isAllOrientationsCompleted()) {\n onValueChange(capturedImages);\n } else {\n setShowCamera(true);\n }\n }} />\n )}\n\n </View>\n </ScrollView>\n\n {error && (\n <Text style={styles.errorText}>{error}</Text>\n )}\n </View>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n root: {\n flex: 1,\n paddingVertical: 10,\n },\n container: {\n backgroundColor: 'white',\n margin: 15,\n borderRadius: 20,\n paddingVertical: 20,\n paddingHorizontal: 16,\n // shadow\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.35,\n shadowRadius: 4.84,\n elevation: 10,\n\n\n // padding: 16,\n },\n containerCamera: {\n flex: 1,\n // maxWidth: 760,\n width: '100%',\n height: '100%',\n // borderRadius: 12,\n backgroundColor: '#f5f5f5',\n },\n title: {\n fontSize: 24,\n fontWeight: 'bold',\n color: '#333',\n marginBottom: 8,\n textAlign: 'center',\n },\n description: {\n fontSize: 16,\n color: '#666',\n marginBottom: 20,\n lineHeight: 22,\n textAlign: 'center',\n },\n camera: {\n flex: 1,\n // borderRadius: 12,\n overflow: 'hidden',\n },\n attemptsText: {\n fontSize: 14,\n color: '#666',\n textAlign: 'center',\n marginBottom: 10,\n },\n orientationsContainer: {\n // flex: 1,\n },\n orientationContainer: {\n backgroundColor: 'white',\n borderRadius: 12,\n padding: 16,\n marginBottom: 16,\n shadowColor: '#000',\n shadowOffset: {\n width: 0,\n height: 2,\n },\n shadowOpacity: 0.1,\n shadowRadius: 3.84,\n elevation: 5,\n },\n orientationTitle: {\n fontSize: 18,\n fontWeight: '600',\n color: '#333',\n // marginBottom: 12,\n },\n capturedImageContainer: {\n alignItems: 'center',\n },\n capturedImage: {\n width: 200,\n height: 200,\n borderRadius: 12,\n marginBottom: 12,\n },\n captureButton: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#2DBD60',\n paddingVertical: 16,\n paddingHorizontal: 24,\n borderRadius: 12,\n marginTop: 8,\n },\n captureIcon: {\n fontSize: 24,\n marginRight: 8,\n },\n captureText: {\n fontSize: 16,\n fontWeight: '600',\n color: 'white',\n },\n retakeButton: {\n backgroundColor: '#FF6B6B',\n paddingVertical: 12,\n paddingHorizontal: 20,\n borderRadius: 8,\n },\n retakeButtonText: {\n fontSize: 14,\n fontWeight: '600',\n color: 'white',\n },\n completionContainer: {\n alignItems: 'center',\n padding: 20,\n },\n completionText: {\n fontSize: 18,\n fontWeight: '600',\n color: '#2DBD60',\n marginBottom: 16,\n },\n retakeAllButton: {\n backgroundColor: '#FF6B6B',\n paddingVertical: 12,\n paddingHorizontal: 20,\n borderRadius: 8,\n },\n retakeAllButtonText: {\n fontSize: 14,\n fontWeight: '600',\n color: 'white',\n },\n errorText: {\n color: '#dc2626',\n fontSize: 14,\n textAlign: 'center',\n marginTop: 10,\n },\n}); "]}
1
+ {"version":3,"file":"SelfieCaptureTemplate.js","sourceRoot":"","sources":["../../../src/components/KYCElements/SelfieCaptureTemplate.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useState } from 'react';\nimport { View, Text, StyleSheet, Alert, ScrollView } from 'react-native';\nimport { TemplateComponent, SelfieConfig, LocalizedText, ISilentCaptureResult, OrientationType } from '../../types/KYC.types';\nimport { EnhancedCameraView } from '../EnhancedCameraView';\nimport { Button } from '../ui/Button';\nimport { useTemplateKYCFlowContext } from '../../hooks/useTemplateKYCFlow';\nimport { useI18n } from '../../hooks/useI18n';\nimport SelfieOverlay from '../OverLay/SelfieOverlay';\nimport selfieVerification from '../../modules/api/SelfieVerification';\nimport pathToBase64 from '../../utils/pathToBase64';\n\ninterface IImagePayload {\n dir: string;\n file: string;\n}\ninterface SelfieCaptureTemplateProps {\n component: TemplateComponent;\n value: Record<string, IImagePayload> | undefined;\n onValueChange: (value: Record<string, IImagePayload>) => void;\n error?: string;\n language: string;\n}\n\nexport const SelfieCaptureTemplate: React.FC<SelfieCaptureTemplateProps> = ({\n component,\n value,\n onValueChange,\n error,\n language,\n}) => {\n const { t } = useI18n();\n const config = component.config as SelfieConfig;\n const orientations: OrientationType[] = (config.orientations || ['center']) as OrientationType[];\n const { actions, state, } = useTemplateKYCFlowContext();\n\n const [silentCaptureResult, setSilentCaptureResult] = useState<ISilentCaptureResult>({ success: false, isAnalyzing: false });\n\n\n const [showCamera, setShowCamera] = useState(false);\n const [currentOrientation, setCurrentOrientation] = useState<OrientationType>(orientations[0]);\n const [capturedImages, setCapturedImages] = useState<Record<string, IImagePayload>>(value || {});\n\n const getLocalizedText = (text: LocalizedText | Record<string, LocalizedText>): string => {\n if (!text) return '';\n // If text is a nested record (e.g., per theme/device), try to pick a default then localize\n const maybeNested = text as Record<string, LocalizedText>;\n if (maybeNested && typeof maybeNested === 'object' && 'en' in maybeNested === false && 'fr' in maybeNested === false) {\n const firstKey = Object.keys(maybeNested)[0];\n const nested = maybeNested[firstKey] as LocalizedText;\n return nested?.[language] || nested?.en || '';\n }\n const loc = text as LocalizedText;\n return loc[language] || loc.en || '';\n };\n\n const getOrientationInstructions = (orientation: OrientationType): string => {\n switch (orientation) {\n case 'center':\n return state.currentLanguage === \"en\" ? \"Take a selfie of face, look straight ahead you\" : \"Prenez un selfie de face, regardez droit devant vous\";\n case 'left':\n return state.currentLanguage === \"en\" ? \"Turn your head to the left, keep your shoulders straight\" : \"Tournez votre tête vers la gauche, gardez les épaules droites\";\n case 'right':\n return state.currentLanguage === \"en\" ? \"Turn your head to the right, keep your shoulders straight\" : \"Tournez votre tête vers la droite, gardez les épaules droites\";\n default:\n return getLocalizedText(component.instructions as LocalizedText);\n }\n };\n\n useEffect(() => {\n actions.showCustomStepper(!showCamera);\n }, [showCamera]);\n\n const getOrientationLabel = (orientation: OrientationType): string => {\n switch (orientation) {\n case 'center':\n return state.currentLanguage === \"en\" ? \"Selfie de face\" : \"Selfie de face\";\n case 'left':\n return state.currentLanguage === \"en\" ? \"Selfie profil gauche\" : \"Selfie profil gauche\";\n case 'right':\n return state.currentLanguage === \"en\" ? \"Selfie profil droit\" : \"Selfie profil droit\";\n default:\n return getLocalizedText(component.labels as LocalizedText);\n }\n };\n const getOrientationOpposite = (orientation: OrientationType): OrientationType => {\n switch (orientation) {\n case 'center':\n\n return 'center';\n case 'left':\n return 'left';\n case 'right':\n return 'right';\n default:\n return orientation;\n }\n }\n\n const getInstructions = (orientation: OrientationType): { title: string, subtitle: string } => {\n const lang = state.currentLanguage;\n switch (orientation) {\n case 'center':\n return {\n title:\n\n lang === \"en\" ? 'Center your face' : 'Mettez votre face au centre',\n subtitle: lang === \"en\"\n ? 'Align your face to the center of the selfie area and then take a photo'\n : 'Alignez votre visage au centre de la zone selfie puis prenez une photo'\n };\n case 'left':\n return {\n title:\n lang === 'en'\n ? 'Turn your head left'\n : 'Tournez la tête vers la gauche',\n subtitle:\n lang === 'en'\n ? 'Slowly turn your head to the left while keeping your face in the selfie area'\n : 'Tournez lentement la tête vers la gauche en gardant votre visage dans la zone selfie'\n };\n case 'right':\n return {\n title:\n lang === 'en'\n ? 'Turn your head right'\n : 'Tournez la tête vers la droite',\n subtitle:\n lang === 'en'\n ? 'Slowly turn your head to the right while keeping your face in the selfie area'\n : 'Tournez lentement la tête vers la droite en gardant votre visage dans la zone selfie'\n };\n default:\n return { title: getLocalizedText(component.labels as LocalizedText), subtitle: getLocalizedText(component.instructions as LocalizedText) };\n }\n };\n\n const handleSilentCapture = (result: { success: boolean; path?: string; error?: string }) => {\n if (silentCaptureResult.isAnalyzing) {\n return;\n }\n if (result.success && result.path) {\n setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: true, success: false, error: '' }));\n selfieVerification(result.path).then((response) => {\n if (response.length > 0) {\n const res = response[0];\n if (res?.orientation_direction === getOrientationOpposite(currentOrientation) && res?.capture) {\n setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: false, success: true, error: '', path: result.path }));\n } else {\n setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: false, success: false, error: 'Le selfie n\\'est pas correct' }));\n }\n } else {\n setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: false, success: false, error: 'Le selfie n\\'est pas correct' }));\n }\n }).catch((e: any) => {\n\n setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: false, success: false, error: e?.message || 'Erreur de vérification du selfie' }));\n });\n }\n }\n\n const handleCapture = async (result: { success: boolean; path?: string; error?: string }) => {\n console.log(\"handleCapturessss\", silentCaptureResult);\n\n if (silentCaptureResult.success && silentCaptureResult.path) {\n const base64 = await pathToBase64(silentCaptureResult.path);\n // Keep backward-compatible structure for UI validation and add *_base64 fields for backend payload\n const newImages: Record<string, any> = {\n ...capturedImages,\n [currentOrientation]: { dir: silentCaptureResult.path, file: base64 } as IImagePayload,\n };\n setCapturedImages(newImages);\n onValueChange(newImages);\n setShowCamera(false);\n\n\n // Passer à l'orientation suivante si disponible\n const currentIndex = orientations.indexOf(currentOrientation as OrientationType);\n if (currentIndex < orientations.length - 1) {\n setCurrentOrientation(orientations[currentIndex + 1]);\n }\n }\n };\n\n const handleError = (event: { message: string }) => {\n Alert.alert('Erreur', event.message);\n setShowCamera(false);\n };\n\n\n const isOrientationCompleted = (orientation: OrientationType): boolean => {\n return !!capturedImages[orientation];\n };\n\n const isAllOrientationsCompleted = (): boolean => {\n return orientations.every(orientation => isOrientationCompleted(orientation));\n };\n console.log(\"Current Orientation\", currentOrientation);\n\n\n if (showCamera) {\n return (\n <View style={styles.containerCamera}>\n <EnhancedCameraView\n instructions={getOrientationInstructions(currentOrientation)}\n showCamera={true}\n cameraType=\"front\"\n style={styles.camera}\n onCapture={handleCapture}\n onError={handleError}\n onClose={() => setShowCamera(false)}\n quality=\"high\"\n showCaptureButton={true}\n showSwitchCamera={false}\n enableFlash={false}\n silentCaptureResult={silentCaptureResult}\n onSilentCapture={handleSilentCapture}\n overlayComponent={<SelfieOverlay\n xMin={20}\n yMin={140}\n xMax={370}\n yMax={340}\n cornerOpacity={1}\n instructions={\"\"}\n language={state.currentLanguage}\n orientation={currentOrientation as 'center' | 'left' | 'right'}\n instructionsTile={getInstructions(currentOrientation).title}\n instructionsSubtitle={getInstructions(currentOrientation).subtitle}\n stepperProps={{\n back: () => {\n setShowCamera(false);\n },\n selectedDocumentType: \"Selfie\",\n step: state.currentComponentIndex + 1,\n totalSteps: state.template.components.length,\n }} />}\n />\n </View>\n );\n }\n\n\n return (\n <View style={[{\n maxWidth: 760,\n width: '100%',\n height: '100%',\n }]}>\n <View style={styles.container}>\n <Text style={styles.title}>{getLocalizedText(component.labels as LocalizedText)}</Text>\n <Text style={styles.description}>{getLocalizedText(component.instructions as LocalizedText)}</Text>\n\n <ScrollView style={styles.orientationsContainer} showsVerticalScrollIndicator={false}>\n <View style={{ flexDirection: 'column', alignItems: 'center', gap: 10 }}>\n\n {orientations.map((orientation, key) => (\n <View key={orientation} style={{\n backgroundColor: '#F3F4F6',\n borderRadius: 12,\n flexDirection: 'row',\n alignItems: 'center',\n gap: 10,\n width: '100%',\n paddingVertical: 10,\n paddingHorizontal: 10,\n }}>\n <View style={{\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: isOrientationCompleted(orientation) ? '#2DBE60' : '#D1D5DB',\n borderRadius: 100,\n width: 30,\n height: 30,\n }}>\n <Text style={{ color: 'white', fontSize: 16, fontWeight: 'bold' }}>{key + 1}</Text>\n </View>\n\n\n <Text style={styles.orientationTitle}>\n {getOrientationLabel(orientation)}\n </Text>\n\n\n\n </View>\n ))}\n <View style={{ backgroundColor: \"#F6CB0D1A\", width: \"100%\", padding: 10, borderRadius: 10 }} >\n <Text style={{ color: '#997E06', fontSize: 16, fontWeight: 'bold' }}>\n {state.currentLanguage === \"en\"\n ? \"Tips for a good selfie:\" \n : \"Conseils pour une bonne photo selfie :\"}\n </Text>\n <View style={{ paddingLeft: 10, paddingTop: 4 }}>\n <Text style={{ color: '#997E06', fontSize: 14, fontWeight: 'bold' }}>\n {state.currentLanguage === \"en\"\n ? `• Remove glasses and hat \\n• Look directly at the camera \\n• Ensure good lighting \\n`\n : `• Retirez vos lunettes et votre chapeau \\n• Regardez directement la caméra \\n• Assurez-vous d'une bonne luminosité \\n`\n }\n </Text>\n </View>\n </View>\n <View style={{ height: 10 }} />\n {isAllOrientationsCompleted() ? <>\n <Button title={t('common.continue')} fullWidth style={{ paddingVertical: 20, paddingTop: 12 }} onPress={async () => {\n onValueChange(capturedImages);\n actions.nextComponent();\n }} />\n </> : (\n <Button title={t('kyc.selfieCapture.captureButton')} fullWidth style={{ paddingVertical: 20, paddingTop: 12 }} onPress={() => {\n if (isAllOrientationsCompleted()) {\n onValueChange(capturedImages);\n actions.nextComponent();\n } else {\n setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: false, success: false, error: '' }));\n setShowCamera(true);\n }\n }} />\n )}\n\n </View>\n </ScrollView>\n\n {error && (\n <Text style={styles.errorText}>{error}</Text>\n )}\n </View>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n root: {\n flex: 1,\n paddingVertical: 10,\n },\n container: {\n backgroundColor: 'white',\n margin: 15,\n borderRadius: 20,\n paddingVertical: 20,\n paddingHorizontal: 16,\n // shadow\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.35,\n shadowRadius: 4.84,\n elevation: 10,\n\n\n // padding: 16,\n },\n containerCamera: {\n flex: 1,\n // maxWidth: 760,\n width: '100%',\n height: '100%',\n // borderRadius: 12,\n backgroundColor: '#f5f5f5',\n },\n title: {\n fontSize: 24,\n fontWeight: 'bold',\n color: '#333',\n marginBottom: 8,\n textAlign: 'center',\n },\n description: {\n fontSize: 16,\n color: '#666',\n marginBottom: 20,\n lineHeight: 22,\n textAlign: 'center',\n },\n camera: {\n flex: 1,\n // borderRadius: 12,\n overflow: 'hidden',\n },\n attemptsText: {\n fontSize: 14,\n color: '#666',\n textAlign: 'center',\n marginBottom: 10,\n },\n orientationsContainer: {\n // flex: 1,\n },\n orientationContainer: {\n backgroundColor: 'white',\n borderRadius: 12,\n padding: 16,\n marginBottom: 16,\n shadowColor: '#000',\n shadowOffset: {\n width: 0,\n height: 2,\n },\n shadowOpacity: 0.1,\n shadowRadius: 3.84,\n elevation: 5,\n },\n orientationTitle: {\n fontSize: 18,\n fontWeight: '600',\n color: '#333',\n // marginBottom: 12,\n },\n capturedImageContainer: {\n alignItems: 'center',\n },\n capturedImage: {\n width: 200,\n height: 200,\n borderRadius: 12,\n marginBottom: 12,\n },\n captureButton: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#2DBD60',\n paddingVertical: 16,\n paddingHorizontal: 24,\n borderRadius: 12,\n marginTop: 8,\n },\n captureIcon: {\n fontSize: 24,\n marginRight: 8,\n },\n captureText: {\n fontSize: 16,\n fontWeight: '600',\n color: 'white',\n },\n retakeButton: {\n backgroundColor: '#FF6B6B',\n paddingVertical: 12,\n paddingHorizontal: 20,\n borderRadius: 8,\n },\n retakeButtonText: {\n fontSize: 14,\n fontWeight: '600',\n color: 'white',\n },\n completionContainer: {\n alignItems: 'center',\n padding: 20,\n },\n completionText: {\n fontSize: 18,\n fontWeight: '600',\n color: '#2DBD60',\n marginBottom: 16,\n },\n retakeAllButton: {\n backgroundColor: '#FF6B6B',\n paddingVertical: 12,\n paddingHorizontal: 20,\n borderRadius: 8,\n },\n retakeAllButtonText: {\n fontSize: 14,\n fontWeight: '600',\n color: 'white',\n },\n errorText: {\n color: '#dc2626',\n fontSize: 14,\n textAlign: 'center',\n marginTop: 10,\n },\n}); "]}
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import { TemplateComponent } from '../../types/KYC.types';
3
+ interface VerificationProgressTemplateProps {
4
+ component: TemplateComponent;
5
+ value: unknown;
6
+ onValueChange: (data: unknown) => void;
7
+ error?: string;
8
+ language?: string;
9
+ }
10
+ export declare const VerificationProgressTemplate: React.FC<VerificationProgressTemplateProps>;
11
+ export {};
12
+ //# sourceMappingURL=VerificationProgressTemplate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VerificationProgressTemplate.d.ts","sourceRoot":"","sources":["../../../src/components/KYCElements/VerificationProgressTemplate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAI1D,UAAU,iCAAiC;IACzC,SAAS,EAAE,iBAAiB,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,aAAa,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,4BAA4B,EAAE,KAAK,CAAC,EAAE,CAAC,iCAAiC,CA6EpF,CAAC"}