@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.
- package/build/api/axios.d.ts +30 -0
- package/build/api/axios.d.ts.map +1 -0
- package/build/api/axios.js +92 -0
- package/build/api/axios.js.map +1 -0
- package/build/components/EnhancedCameraView.d.ts +1 -41
- package/build/components/EnhancedCameraView.d.ts.map +1 -1
- package/build/components/EnhancedCameraView.js +75 -34
- package/build/components/EnhancedCameraView.js.map +1 -1
- package/build/components/EnhancedCameraView.web.d.ts +1 -41
- package/build/components/EnhancedCameraView.web.d.ts.map +1 -1
- package/build/components/EnhancedCameraView.web.js +28 -4
- package/build/components/EnhancedCameraView.web.js.map +1 -1
- package/build/components/KYCElements/CountrySelectionTemplate.d.ts +2 -2
- package/build/components/KYCElements/CountrySelectionTemplate.d.ts.map +1 -1
- package/build/components/KYCElements/CountrySelectionTemplate.js +71 -114
- package/build/components/KYCElements/CountrySelectionTemplate.js.map +1 -1
- package/build/components/KYCElements/FileUploadTemplate.d.ts.map +1 -1
- package/build/components/KYCElements/FileUploadTemplate.js +7 -3
- package/build/components/KYCElements/FileUploadTemplate.js.map +1 -1
- package/build/components/KYCElements/IDCardCapture.d.ts +7 -2
- package/build/components/KYCElements/IDCardCapture.d.ts.map +1 -1
- package/build/components/KYCElements/IDCardCapture.js +253 -104
- package/build/components/KYCElements/IDCardCapture.js.map +1 -1
- package/build/components/KYCElements/InitializationStep.d.ts +5 -0
- package/build/components/KYCElements/InitializationStep.d.ts.map +1 -0
- package/build/components/KYCElements/InitializationStep.js +41 -0
- package/build/components/KYCElements/InitializationStep.js.map +1 -0
- package/build/components/KYCElements/LocationCaptureTemplate.d.ts.map +1 -1
- package/build/components/KYCElements/LocationCaptureTemplate.js +15 -13
- package/build/components/KYCElements/LocationCaptureTemplate.js.map +1 -1
- package/build/components/KYCElements/OrientationVideoCapture.d.ts +2 -2
- package/build/components/KYCElements/OrientationVideoCapture.d.ts.map +1 -1
- package/build/components/KYCElements/OrientationVideoCapture.js.map +1 -1
- package/build/components/KYCElements/OrientationVideoCaptureEnhanced.d.ts +2 -2
- package/build/components/KYCElements/OrientationVideoCaptureEnhanced.d.ts.map +1 -1
- package/build/components/KYCElements/OrientationVideoCaptureEnhanced.js.map +1 -1
- package/build/components/KYCElements/OrientationVideoCaptureFinal.d.ts +2 -2
- package/build/components/KYCElements/OrientationVideoCaptureFinal.d.ts.map +1 -1
- package/build/components/KYCElements/OrientationVideoCaptureFinal.js.map +1 -1
- package/build/components/KYCElements/ReviewSubmitTemplate.d.ts +12 -0
- package/build/components/KYCElements/ReviewSubmitTemplate.d.ts.map +1 -0
- package/build/components/KYCElements/ReviewSubmitTemplate.js +171 -0
- package/build/components/KYCElements/ReviewSubmitTemplate.js.map +1 -0
- package/build/components/KYCElements/SelfieCaptureTemplate.d.ts +6 -2
- package/build/components/KYCElements/SelfieCaptureTemplate.d.ts.map +1 -1
- package/build/components/KYCElements/SelfieCaptureTemplate.js +105 -35
- package/build/components/KYCElements/SelfieCaptureTemplate.js.map +1 -1
- package/build/components/KYCElements/VerificationProgressTemplate.d.ts +12 -0
- package/build/components/KYCElements/VerificationProgressTemplate.d.ts.map +1 -0
- package/build/components/KYCElements/VerificationProgressTemplate.js +93 -0
- package/build/components/KYCElements/VerificationProgressTemplate.js.map +1 -0
- package/build/components/OverLay/IdCard.d.ts +1 -1
- package/build/components/OverLay/IdCard.d.ts.map +1 -1
- package/build/components/OverLay/IdCard.js +10 -6
- package/build/components/OverLay/IdCard.js.map +1 -1
- package/build/components/OverLay/SelfieOverlay.d.ts +1 -1
- package/build/components/OverLay/SelfieOverlay.d.ts.map +1 -1
- package/build/components/OverLay/SelfieOverlay.js +5 -4
- package/build/components/OverLay/SelfieOverlay.js.map +1 -1
- package/build/components/OverLay/type.d.ts +71 -1
- package/build/components/OverLay/type.d.ts.map +1 -1
- package/build/components/OverLay/type.js.map +1 -1
- package/build/components/TemplateKYCExample.d.ts.map +1 -1
- package/build/components/TemplateKYCExample.js +72 -197
- package/build/components/TemplateKYCExample.js.map +1 -1
- package/build/components/TemplateKYCFlowRefactored.d.ts.map +1 -1
- package/build/components/TemplateKYCFlowRefactored.js +63 -39
- package/build/components/TemplateKYCFlowRefactored.js.map +1 -1
- package/build/components/example/OrientationVideoExample.d.ts.map +1 -1
- package/build/components/example/OrientationVideoExample.js +1 -5
- package/build/components/example/OrientationVideoExample.js.map +1 -1
- package/build/config/countriesData.d.ts +3 -0
- package/build/config/countriesData.d.ts.map +1 -0
- package/build/config/countriesData.js +79 -0
- package/build/config/countriesData.js.map +1 -0
- package/build/config/region_mapping.d.ts +3 -0
- package/build/config/region_mapping.d.ts.map +1 -0
- package/build/config/region_mapping.js +687 -0
- package/build/config/region_mapping.js.map +1 -0
- package/build/hooks/useI18n.d.ts +11 -0
- package/build/hooks/useI18n.d.ts.map +1 -0
- package/build/hooks/useI18n.js +37 -0
- package/build/hooks/useI18n.js.map +1 -0
- package/build/hooks/useOrientationVideo.d.ts +1 -2
- package/build/hooks/useOrientationVideo.d.ts.map +1 -1
- package/build/hooks/useOrientationVideo.js +2 -1
- package/build/hooks/useOrientationVideo.js.map +1 -1
- package/build/hooks/useRealtimeVerifier.d.ts +28 -0
- package/build/hooks/useRealtimeVerifier.d.ts.map +1 -0
- package/build/hooks/useRealtimeVerifier.js +91 -0
- package/build/hooks/useRealtimeVerifier.js.map +1 -0
- package/build/hooks/useTemplateKYCFlow.d.ts +1 -0
- package/build/hooks/useTemplateKYCFlow.d.ts.map +1 -1
- package/build/hooks/useTemplateKYCFlow.js +337 -38
- package/build/hooks/useTemplateKYCFlow.js.map +1 -1
- package/build/i18n/en/index.d.ts +168 -0
- package/build/i18n/en/index.d.ts.map +1 -0
- package/build/i18n/en/index.js +195 -0
- package/build/i18n/en/index.js.map +1 -0
- package/build/i18n/fr/index.d.ts +168 -0
- package/build/i18n/fr/index.d.ts.map +1 -0
- package/build/i18n/fr/index.js +194 -0
- package/build/i18n/fr/index.js.map +1 -0
- package/build/i18n/index.d.ts +10 -0
- package/build/i18n/index.d.ts.map +1 -0
- package/build/i18n/index.js +56 -0
- package/build/i18n/index.js.map +1 -0
- package/build/i18n/types.d.ts +153 -0
- package/build/i18n/types.d.ts.map +1 -0
- package/build/i18n/types.js +3 -0
- package/build/i18n/types.js.map +1 -0
- package/build/i18n/usage-example.d.ts +4 -0
- package/build/i18n/usage-example.d.ts.map +1 -0
- package/build/i18n/usage-example.js +189 -0
- package/build/i18n/usage-example.js.map +1 -0
- package/build/modules/api/CardAuthentification.d.ts +22 -0
- package/build/modules/api/CardAuthentification.d.ts.map +1 -0
- package/build/modules/api/CardAuthentification.js +107 -0
- package/build/modules/api/CardAuthentification.js.map +1 -0
- package/build/modules/api/KYCService.d.ts +57 -1
- package/build/modules/api/KYCService.d.ts.map +1 -1
- package/build/modules/api/KYCService.js +348 -27
- package/build/modules/api/KYCService.js.map +1 -1
- package/build/modules/api/SelfieVerification.d.ts +3 -0
- package/build/modules/api/SelfieVerification.d.ts.map +1 -0
- package/build/modules/api/SelfieVerification.js +9 -0
- package/build/modules/api/SelfieVerification.js.map +1 -0
- package/build/modules/api/backendApi.d.ts +2 -0
- package/build/modules/api/backendApi.d.ts.map +1 -0
- package/build/modules/api/backendApi.js +6 -0
- package/build/modules/api/backendApi.js.map +1 -0
- package/build/modules/api/types.d.ts +20 -0
- package/build/modules/api/types.d.ts.map +1 -0
- package/build/modules/api/types.js +2 -0
- package/build/modules/api/types.js.map +1 -0
- package/build/types/KYC.types.d.ts +59 -7
- package/build/types/KYC.types.d.ts.map +1 -1
- package/build/types/KYC.types.js +9 -1
- package/build/types/KYC.types.js.map +1 -1
- package/build/utils/cropByObb.d.ts +11 -0
- package/build/utils/cropByObb.d.ts.map +1 -0
- package/build/utils/cropByObb.js +78 -0
- package/build/utils/cropByObb.js.map +1 -0
- package/build/utils/get-document-type-info.d.ts +13 -0
- package/build/utils/get-document-type-info.d.ts.map +1 -0
- package/build/utils/get-document-type-info.js +59 -0
- package/build/utils/get-document-type-info.js.map +1 -0
- package/build/utils/pathToBase64.d.ts +3 -0
- package/build/utils/pathToBase64.d.ts.map +1 -0
- package/build/utils/pathToBase64.js +47 -0
- package/build/utils/pathToBase64.js.map +1 -0
- package/build/utils/remove-duplicate.d.ts +2 -0
- package/build/utils/remove-duplicate.d.ts.map +1 -0
- package/build/utils/remove-duplicate.js +4 -0
- package/build/utils/remove-duplicate.js.map +1 -0
- package/package.json +3 -1
- package/src/api/axios.ts +144 -0
- package/src/components/EnhancedCameraView.tsx +96 -78
- package/src/components/EnhancedCameraView.web.tsx +41 -40
- package/src/components/KYCElements/CountrySelectionTemplate.tsx +104 -136
- package/src/components/KYCElements/FileUploadTemplate.tsx +14 -8
- package/src/components/KYCElements/IDCardCapture.tsx +311 -115
- package/src/components/KYCElements/InitializationStep.tsx +53 -0
- package/src/components/KYCElements/LocationCaptureTemplate.tsx +17 -15
- package/src/components/KYCElements/OrientationVideoCapture.tsx +2 -2
- package/src/components/KYCElements/OrientationVideoCaptureEnhanced.tsx +2 -2
- package/src/components/KYCElements/OrientationVideoCaptureFinal.tsx +2 -2
- package/src/components/KYCElements/ReviewSubmitTemplate.tsx +201 -0
- package/src/components/KYCElements/SelfieCaptureTemplate.tsx +140 -53
- package/src/components/KYCElements/VerificationProgressTemplate.tsx +123 -0
- package/src/components/OverLay/IdCard.tsx +17 -9
- package/src/components/OverLay/SelfieOverlay.tsx +6 -5
- package/src/components/OverLay/type.ts +64 -2
- package/src/components/TemplateKYCExample.tsx +76 -197
- package/src/components/TemplateKYCFlowRefactored.tsx +74 -46
- package/src/components/example/OrientationVideoExample.tsx +3 -7
- package/src/config/countriesData.ts +84 -0
- package/src/config/region_mapping.ts +688 -0
- package/src/hooks/useI18n.ts +53 -0
- package/src/hooks/useOrientationVideo.ts +2 -2
- package/src/hooks/useRealtimeVerifier.ts +128 -0
- package/src/hooks/useTemplateKYCFlow.tsx +375 -53
- package/src/i18n/README.md +288 -0
- package/src/i18n/en/index.ts +206 -0
- package/src/i18n/fr/index.ts +205 -0
- package/src/i18n/index.ts +65 -0
- package/src/i18n/types.ts +172 -0
- package/src/i18n/usage-example.tsx +202 -0
- package/src/modules/api/CardAuthentification.ts +114 -0
- package/src/modules/api/KYCService.ts +403 -30
- package/src/modules/api/SelfieVerification.ts +11 -0
- package/src/modules/api/backendApi.ts +8 -0
- package/src/modules/api/types.ts +24 -0
- package/src/types/KYC.types.ts +83 -14
- package/src/utils/cropByObb.ts +99 -0
- package/src/utils/get-document-type-info.ts +62 -0
- package/src/utils/pathToBase64.ts +47 -0
- package/src/utils/remove-duplicate.ts +3 -0
- package/src/types/nativewind.d.ts +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileUploadTemplate.js","sourceRoot":"","sources":["../../../src/components/KYCElements/FileUploadTemplate.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState } from 'react';\nimport { View, Text, TouchableOpacity, StyleSheet, ScrollView, Image, Alert } from 'react-native';\nimport { useKYCStore } from '../../stores/kycStore';\nimport NativeCameraModule from '../../modules/camera/NativeCameraModule';\nimport { TemplateComponent, FileUploadConfig, LocalizedText } from '../../types/KYC.types';\n\ninterface FileUploadTemplateProps {\n component: TemplateComponent;\n value?: string[];\n onValueChange: (value: string[]) => void;\n error?: string;\n language?: string;\n}\n\ninterface UploadedFile {\n uri: string;\n path: string;\n name: string;\n size: number;\n}\n\nexport const FileUploadTemplate: React.FC<FileUploadTemplateProps> = ({\n component,\n value = [],\n onValueChange,\n error,\n language = 'en',\n}) => {\n const [uploadedFiles, setUploadedFiles] = useState<UploadedFile[]>([]);\n const [isUploading, setIsUploading] = useState(false);\n const { setProcessing } = useKYCStore();\n\n const config = component.config as FileUploadConfig;\n const maxSizeBytes = (config.max_size_mb || 10) * 1024 * 1024;\n\n const getLocalizedText = (text: LocalizedText): string => {\n return text[language] || text.en || '';\n };\n\n const pickDocument = async () => {\n try {\n setIsUploading(true);\n setProcessing(true);\n\n const allowedTypes = config.allowed_formats.map(format => {\n switch (format.toLowerCase()) {\n case 'pdf':\n return 'application/pdf';\n case 'jpg':\n case 'jpeg':\n return 'image/jpeg';\n case 'png':\n return 'image/png';\n default:\n return '*/*';\n }\n });\n\n const result = await NativeCameraModule.openFilePicker(allowedTypes);\n \n if (result.success && result.uri && result.path) {\n const fileName = result.path.split('/').pop() || 'Document';\n \n // Vérifier la taille du fichier (si disponible)\n // Note: La propriété size peut ne pas être disponible selon la plateforme\n const fileSize = (result as any).size || 0;\n if (fileSize > maxSizeBytes) {\n Alert.alert(\n 'Fichier trop volumineux', \n `La taille maximale autorisée est ${config.max_size_mb} MB.`\n );\n return;\n }\n\n const newFile = {\n uri: result.uri,\n path: result.path,\n name: fileName,\n size: fileSize\n };\n\n const updatedFiles = [...uploadedFiles, newFile];\n setUploadedFiles(updatedFiles);\n onValueChange(updatedFiles.map(file => file.uri));\n } else if (result.error) {\n Alert.alert('Erreur', result.error);\n }\n } catch (error) {\n console.error('Erreur lors de la sélection de fichiers:', error);\n Alert.alert('Erreur', 'Impossible de sélectionner le fichier');\n } finally {\n setIsUploading(false);\n setProcessing(false);\n }\n };\n\n const removeFile = (index: number) => {\n const updatedFiles = uploadedFiles.filter((_, i) => i !== index);\n setUploadedFiles(updatedFiles);\n onValueChange(updatedFiles.map(file => file.uri));\n };\n\n const getFileIcon = (fileName: string) => {\n const extension = fileName.split('.').pop()?.toLowerCase();\n switch (extension) {\n case 'pdf':\n return '📄';\n case 'jpg':\n case 'jpeg':\n case 'png':\n case 'gif':\n return '🖼️';\n case 'doc':\n case 'docx':\n return '📝';\n default:\n return '📎';\n }\n };\n\n const isImageFile = (fileName: string): boolean => {\n const extension = fileName.split('.').pop()?.toLowerCase();\n return ['jpg', 'jpeg', 'png', 'gif', 'webp'].includes(extension || '');\n };\n\n const formatFileSize = (bytes: number): string => {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n };\n\n const isRequired = config.required || false;\n const hasFiles = uploadedFiles.length > 0;\n\n return (\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 <View style={styles.uploadArea}>\n <TouchableOpacity \n style={[\n styles.uploadButton,\n isUploading && styles.uploadButtonDisabled,\n { borderColor: component.ui.themeColor || '#2DBD60' }\n ]}\n onPress={pickDocument}\n disabled={isUploading}\n >\n <Text style={styles.uploadIcon}>📁</Text>\n <Text style={[\n styles.uploadText,\n { color: component.ui.themeColor || '#2DBD60' }\n ]}>\n {isUploading ? 'Sélection en cours...' : 'Sélectionner des fichiers'}\n </Text>\n <Text style={styles.uploadSubtext}>\n Types acceptés: {config.allowed_formats.join(', ').toUpperCase()}\n </Text>\n <Text style={styles.uploadSubtext}>\n Taille max: {config.max_size_mb} MB\n </Text>\n </TouchableOpacity>\n </View>\n\n {hasFiles && (\n <View style={styles.filesContainer}>\n <Text style={styles.filesTitle}>\n Fichiers sélectionnés ({uploadedFiles.length})\n </Text>\n <ScrollView style={styles.filesList} showsVerticalScrollIndicator={false}>\n {uploadedFiles.map((file, index) => (\n <View key={index} style={styles.fileItem}>\n {isImageFile(file.name) ? (\n <Image source={{ uri: file.uri }} style={styles.fileThumbnail} />\n ) : (\n <View style={styles.fileIcon}>\n <Text style={styles.fileIconText}>{getFileIcon(file.name)}</Text>\n </View>\n )}\n <View style={styles.fileInfo}>\n <Text style={styles.fileName} numberOfLines={1}>{file.name}</Text>\n <Text style={styles.fileSize}>{formatFileSize(file.size)}</Text>\n </View>\n <TouchableOpacity \n style={styles.removeButton}\n onPress={() => removeFile(index)}\n >\n <Text style={styles.removeButtonText}>✕</Text>\n </TouchableOpacity>\n </View>\n ))}\n </ScrollView>\n </View>\n )}\n\n {!hasFiles && (\n <View style={styles.emptyState}>\n <Text style={styles.emptyStateText}>Aucun fichier sélectionné</Text>\n <Text style={styles.emptyStateSubtext}>\n {isRequired ? 'Ce document est obligatoire' : 'Ce document est optionnel'}\n </Text>\n </View>\n )}\n\n {hasFiles && (\n <View style={styles.buttonContainer}>\n <TouchableOpacity \n style={[\n styles.primaryButton,\n { backgroundColor: component.ui.themeColor || '#2DBD60' }\n ]}\n >\n <Text style={styles.primaryButtonText}>\n {getLocalizedText(component.ui.buttonText)}\n </Text>\n </TouchableOpacity>\n </View>\n )}\n\n {error && (\n <Text style={styles.errorText}>{error}</Text>\n )}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n padding: 16,\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 textAlign: 'center',\n marginBottom: 24,\n lineHeight: 22,\n },\n uploadArea: {\n marginBottom: 24,\n },\n uploadButton: {\n borderWidth: 2,\n borderStyle: 'dashed',\n borderRadius: 12,\n padding: 32,\n alignItems: 'center',\n backgroundColor: '#f0f9f0',\n },\n uploadButtonDisabled: {\n opacity: 0.6,\n },\n uploadIcon: {\n fontSize: 48,\n marginBottom: 16,\n },\n uploadText: {\n fontSize: 18,\n fontWeight: '600',\n marginBottom: 8,\n },\n uploadSubtext: {\n fontSize: 14,\n color: '#666',\n textAlign: 'center',\n },\n filesContainer: {\n flex: 1,\n },\n filesTitle: {\n fontSize: 18,\n fontWeight: '600',\n color: '#333',\n marginBottom: 16,\n },\n filesList: {\n flex: 1,\n },\n fileItem: {\n flexDirection: 'row',\n alignItems: 'center',\n padding: 12,\n backgroundColor: 'white',\n borderRadius: 8,\n marginBottom: 8,\n borderWidth: 1,\n borderColor: '#e5e5e5',\n shadowColor: '#000',\n shadowOffset: {\n width: 0,\n height: 1,\n },\n shadowOpacity: 0.1,\n shadowRadius: 2,\n elevation: 2,\n },\n fileThumbnail: {\n width: 40,\n height: 40,\n borderRadius: 4,\n marginRight: 12,\n },\n fileIcon: {\n width: 40,\n height: 40,\n borderRadius: 4,\n backgroundColor: '#f0f0f0',\n justifyContent: 'center',\n alignItems: 'center',\n marginRight: 12,\n },\n fileIconText: {\n fontSize: 20,\n },\n fileInfo: {\n flex: 1,\n },\n fileName: {\n fontSize: 16,\n fontWeight: '500',\n color: '#333',\n },\n fileSize: {\n fontSize: 12,\n color: '#666',\n marginTop: 2,\n },\n removeButton: {\n width: 32,\n height: 32,\n borderRadius: 16,\n backgroundColor: '#ff4444',\n justifyContent: 'center',\n alignItems: 'center',\n },\n removeButtonText: {\n color: 'white',\n fontSize: 16,\n fontWeight: 'bold',\n },\n emptyState: {\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n },\n emptyStateText: {\n fontSize: 18,\n color: '#666',\n marginBottom: 10,\n },\n emptyStateSubtext: {\n fontSize: 14,\n color: '#999',\n textAlign: 'center',\n },\n buttonContainer: {\n marginTop: 24,\n alignItems: 'center',\n },\n primaryButton: {\n paddingHorizontal: 32,\n paddingVertical: 16,\n borderRadius: 8,\n minWidth: 120,\n alignItems: 'center',\n },\n primaryButtonText: {\n color: 'white',\n fontWeight: '600',\n fontSize: 16,\n },\n errorText: {\n color: '#dc2626',\n fontSize: 14,\n marginTop: 8,\n textAlign: 'center',\n },\n}); "]}
|
|
1
|
+
{"version":3,"file":"FileUploadTemplate.js","sourceRoot":"","sources":["../../../src/components/KYCElements/FileUploadTemplate.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState } from 'react';\nimport { View, Text, TouchableOpacity, StyleSheet, ScrollView, Image, Alert } from 'react-native';\nimport { useKYCStore } from '../../stores/kycStore';\nimport NativeCameraModule from '../../modules/camera/NativeCameraModule';\nimport { useI18n } from '../../hooks/useI18n';\nimport { TemplateComponent, FileUploadConfig, LocalizedText } from '../../types/KYC.types';\n\ninterface FileUploadTemplateProps {\n component: TemplateComponent;\n value?: string[];\n onValueChange: (value: string[]) => void;\n error?: string;\n language?: string;\n}\n\ninterface UploadedFile {\n uri: string;\n path: string;\n name: string;\n size: number;\n}\n\nexport const FileUploadTemplate: React.FC<FileUploadTemplateProps> = ({\n component,\n value = [],\n onValueChange,\n error,\n language = 'en',\n}) => {\n const { t } = useI18n();\n const [uploadedFiles, setUploadedFiles] = useState<UploadedFile[]>([]);\n const [isUploading, setIsUploading] = useState(false);\n const { setProcessing } = useKYCStore();\n\n const config = component.config as FileUploadConfig;\n const maxSizeBytes = (config.max_size_mb || 10) * 1024 * 1024;\n\n const getLocalizedText = (text: LocalizedText): string => {\n return text[language] || text.en || '';\n };\n\n const pickDocument = async () => {\n try {\n setIsUploading(true);\n setProcessing(true);\n\n const allowedTypes = config.allowed_formats.map(format => {\n switch (format.toLowerCase()) {\n case 'pdf':\n return 'application/pdf';\n case 'jpg':\n case 'jpeg':\n return 'image/jpeg';\n case 'png':\n return 'image/png';\n default:\n return '*/*';\n }\n });\n\n const result = await NativeCameraModule.openFilePicker(allowedTypes);\n \n if (result.success && result.uri && result.path) {\n const fileName = result.path.split('/').pop() || 'Document';\n \n // Vérifier la taille du fichier (si disponible)\n // Note: La propriété size peut ne pas être disponible selon la plateforme\n const fileSize = (result as any).size || 0;\n if (fileSize > maxSizeBytes) {\n Alert.alert(\n 'Fichier trop volumineux', \n `La taille maximale autorisée est ${config.max_size_mb} MB.`\n );\n return;\n }\n\n const newFile = {\n uri: result.uri,\n path: result.path,\n name: fileName,\n size: fileSize\n };\n\n const updatedFiles = [...uploadedFiles, newFile];\n setUploadedFiles(updatedFiles);\n onValueChange(updatedFiles.map(file => file.uri));\n } else if (result.error) {\n Alert.alert('Erreur', result.error);\n }\n } catch (error) {\n console.error('Erreur lors de la sélection de fichiers:', error);\n Alert.alert('Erreur', 'Impossible de sélectionner le fichier');\n } finally {\n setIsUploading(false);\n setProcessing(false);\n }\n };\n\n const removeFile = (index: number) => {\n const updatedFiles = uploadedFiles.filter((_, i) => i !== index);\n setUploadedFiles(updatedFiles);\n onValueChange(updatedFiles.map(file => file.uri));\n };\n\n\n const getFileIcon = (fileName: string) => {\n const extension = fileName.split('.').pop()?.toLowerCase();\n switch (extension) {\n case 'pdf':\n return '📄';\n case 'jpg':\n case 'jpeg':\n case 'png':\n case 'gif':\n return '🖼️';\n case 'doc':\n case 'docx':\n return '📝';\n default:\n return '📎';\n }\n };\n\n const isImageFile = (fileName: string): boolean => {\n const extension = fileName.split('.').pop()?.toLowerCase();\n return ['jpg', 'jpeg', 'png', 'gif', 'webp'].includes(extension || '');\n };\n\n const formatFileSize = (bytes: number): string => {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n };\n\n const isRequired = config.required || false;\n const hasFiles = uploadedFiles.length > 0;\n\n return (\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 <View style={styles.uploadArea}>\n <TouchableOpacity \n style={[\n styles.uploadButton,\n isUploading && styles.uploadButtonDisabled,\n { borderColor: component.ui.themeColor as string || '#2DBD60' }\n ]}\n onPress={pickDocument}\n disabled={isUploading}\n >\n <Text style={styles.uploadIcon}>📁</Text>\n <Text style={[\n styles.uploadText,\n { color: component.ui.themeColor as string || '#2DBD60' }\n ]}>\n {isUploading ? 'Sélection en cours...' : 'Sélectionner des fichiers'}\n </Text>\n <Text style={styles.uploadSubtext}>\n Types acceptés: {config.allowed_formats.join(', ').toUpperCase()}\n </Text>\n <Text style={styles.uploadSubtext}>\n Taille max: {config.max_size_mb} MB\n </Text>\n </TouchableOpacity>\n </View>\n\n {hasFiles && (\n <View style={styles.filesContainer}>\n <Text style={styles.filesTitle}>\n Fichiers sélectionnés ({uploadedFiles.length})\n </Text>\n <ScrollView style={styles.filesList} showsVerticalScrollIndicator={false}>\n {uploadedFiles.map((file, index) => (\n <View key={index} style={styles.fileItem}>\n {isImageFile(file.name) ? (\n <Image source={{ uri: file.uri }} style={styles.fileThumbnail} />\n ) : (\n <View style={styles.fileIcon}>\n <Text style={styles.fileIconText}>{getFileIcon(file.name)}</Text>\n </View>\n )}\n <View style={styles.fileInfo}>\n <Text style={styles.fileName} numberOfLines={1}>{file.name}</Text>\n <Text style={styles.fileSize}>{formatFileSize(file.size)}</Text>\n </View>\n <TouchableOpacity \n style={styles.removeButton}\n onPress={() => removeFile(index)}\n >\n <Text style={styles.removeButtonText}>✕</Text>\n </TouchableOpacity>\n </View>\n ))}\n </ScrollView>\n </View>\n )}\n\n {!hasFiles && (\n <View style={styles.emptyState}>\n <Text style={styles.emptyStateText}>{t('kyc.fileUpload.selectFile')}</Text>\n <Text style={styles.emptyStateSubtext}>\n {isRequired ? t('validation.required') : t('common.info')}\n </Text>\n </View>\n )}\n\n {hasFiles && (\n <View style={styles.buttonContainer}>\n <TouchableOpacity \n style={[\n styles.primaryButton,\n { backgroundColor: component.ui.themeColor as string || '#2DBD60' }\n ]}\n onPress={() => {\n onValueChange(uploadedFiles.map(file => file.uri));\n }}\n >\n <Text style={styles.primaryButtonText}>\n {getLocalizedText(component.ui.buttonText as LocalizedText)}\n </Text>\n </TouchableOpacity>\n </View>\n )}\n\n {error && (\n <Text style={styles.errorText}>{error}</Text>\n )}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n padding: 16,\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 textAlign: 'center',\n marginBottom: 24,\n lineHeight: 22,\n },\n uploadArea: {\n marginBottom: 24,\n },\n uploadButton: {\n borderWidth: 2,\n borderStyle: 'dashed',\n borderRadius: 12,\n padding: 32,\n alignItems: 'center',\n backgroundColor: '#f0f9f0',\n },\n uploadButtonDisabled: {\n opacity: 0.6,\n },\n uploadIcon: {\n fontSize: 48,\n marginBottom: 16,\n },\n uploadText: {\n fontSize: 18,\n fontWeight: '600',\n marginBottom: 8,\n },\n uploadSubtext: {\n fontSize: 14,\n color: '#666',\n textAlign: 'center',\n },\n filesContainer: {\n flex: 1,\n },\n filesTitle: {\n fontSize: 18,\n fontWeight: '600',\n color: '#333',\n marginBottom: 16,\n },\n filesList: {\n flex: 1,\n },\n fileItem: {\n flexDirection: 'row',\n alignItems: 'center',\n padding: 12,\n backgroundColor: 'white',\n borderRadius: 8,\n marginBottom: 8,\n borderWidth: 1,\n borderColor: '#e5e5e5',\n shadowColor: '#000',\n shadowOffset: {\n width: 0,\n height: 1,\n },\n shadowOpacity: 0.1,\n shadowRadius: 2,\n elevation: 2,\n },\n fileThumbnail: {\n width: 40,\n height: 40,\n borderRadius: 4,\n marginRight: 12,\n },\n fileIcon: {\n width: 40,\n height: 40,\n borderRadius: 4,\n backgroundColor: '#f0f0f0',\n justifyContent: 'center',\n alignItems: 'center',\n marginRight: 12,\n },\n fileIconText: {\n fontSize: 20,\n },\n fileInfo: {\n flex: 1,\n },\n fileName: {\n fontSize: 16,\n fontWeight: '500',\n color: '#333',\n },\n fileSize: {\n fontSize: 12,\n color: '#666',\n marginTop: 2,\n },\n removeButton: {\n width: 32,\n height: 32,\n borderRadius: 16,\n backgroundColor: '#ff4444',\n justifyContent: 'center',\n alignItems: 'center',\n },\n removeButtonText: {\n color: 'white',\n fontSize: 16,\n fontWeight: 'bold',\n },\n emptyState: {\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n },\n emptyStateText: {\n fontSize: 18,\n color: '#666',\n marginBottom: 10,\n },\n emptyStateSubtext: {\n fontSize: 14,\n color: '#999',\n textAlign: 'center',\n },\n buttonContainer: {\n marginTop: 24,\n alignItems: 'center',\n },\n primaryButton: {\n paddingHorizontal: 32,\n paddingVertical: 16,\n borderRadius: 8,\n minWidth: 120,\n alignItems: 'center',\n },\n primaryButtonText: {\n color: 'white',\n fontWeight: '600',\n fontSize: 16,\n },\n errorText: {\n color: '#dc2626',\n fontSize: 14,\n marginTop: 8,\n textAlign: 'center',\n },\n}); "]}
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { TemplateComponent } from '../../types/KYC.types';
|
|
3
|
+
interface IIDCardPayload {
|
|
4
|
+
dir: string;
|
|
5
|
+
file: string;
|
|
6
|
+
mrz: string;
|
|
7
|
+
}
|
|
3
8
|
interface IDCardCaptureProps {
|
|
4
9
|
component: TemplateComponent;
|
|
5
|
-
value?: Record<string,
|
|
6
|
-
onValueChange: (value: Record<string, string>) => void;
|
|
10
|
+
value?: Record<string, IIDCardPayload>;
|
|
11
|
+
onValueChange: (value: Record<string, IIDCardPayload | string>) => void;
|
|
7
12
|
error?: string;
|
|
8
13
|
language?: string;
|
|
9
14
|
currentSide?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IDCardCapture.d.ts","sourceRoot":"","sources":["../../../src/components/KYCElements/IDCardCapture.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"IDCardCapture.d.ts","sourceRoot":"","sources":["../../../src/components/KYCElements/IDCardCapture.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoD,MAAM,OAAO,CAAC;AAGzE,OAAO,EAAE,iBAAiB,EAA6E,MAAM,uBAAuB,CAAC;AAarI,UAAU,cAAc;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,UAAU,kBAAkB;IAC1B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACvC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CA2etD,CAAC"}
|
|
@@ -1,84 +1,70 @@
|
|
|
1
|
-
import React, { useEffect, useState } from 'react';
|
|
2
|
-
import { View, Text, TouchableOpacity, StyleSheet, Image, Alert, ScrollView } from 'react-native';
|
|
1
|
+
import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
|
2
|
+
import { View, Text, TouchableOpacity, StyleSheet, Image, Alert, ScrollView, Dimensions } from 'react-native';
|
|
3
3
|
import { EnhancedCameraView } from '../EnhancedCameraView';
|
|
4
4
|
import IdCardOverlay from '../OverLay/IdCard';
|
|
5
5
|
import { useTemplateKYCFlowContext } from '../../hooks/useTemplateKYCFlow';
|
|
6
|
+
import { useI18n } from '../../hooks/useI18n';
|
|
6
7
|
import { Button } from '../ui/Button';
|
|
7
|
-
|
|
8
|
+
import { removeDuplicates } from '../../utils/remove-duplicate';
|
|
9
|
+
import { backVerification, frontVerification } from '../../modules/api/CardAuthentification';
|
|
10
|
+
import { getDocumentTypeInfo } from '../../utils/get-document-type-info';
|
|
11
|
+
import pathToBase64 from '../../utils/pathToBase64';
|
|
12
|
+
import { truncateFields } from '../../modules/api/KYCService';
|
|
13
|
+
import { cropImageWithBBox } from '../../utils/cropByObb';
|
|
14
|
+
export const IDCardCapture = ({ component, value = {}, onValueChange, error, language = 'en', }) => {
|
|
15
|
+
const { t } = useI18n();
|
|
8
16
|
const [showCamera, setShowCamera] = useState(false);
|
|
9
|
-
const [capturedImages, setCapturedImages] = useState(value);
|
|
10
|
-
const [
|
|
11
|
-
const [
|
|
17
|
+
const [capturedImages, setCapturedImages] = useState(value || {});
|
|
18
|
+
const [cropImageUri, setCropImageUri] = useState('');
|
|
19
|
+
const [currentSide, setCurrentSide] = useState('front');
|
|
20
|
+
const [selectedDocumentType, setSelectedDocumentType] = useState({
|
|
21
|
+
type: 'identity_card',
|
|
22
|
+
region: 'root'
|
|
23
|
+
});
|
|
24
|
+
const [showDocumentSelection, setShowDocumentSelection] = useState({
|
|
25
|
+
documentSelection: true,
|
|
26
|
+
regionSelection: false
|
|
27
|
+
});
|
|
28
|
+
const [silentCaptureResult, setSilentCaptureResult] = useState({ success: false, isAnalyzing: false });
|
|
29
|
+
// const [imageNaturalSize, setImageNaturalSize] = useState<{ width: number; height: number } | null>(null);
|
|
12
30
|
const { actions, state, } = useTemplateKYCFlowContext();
|
|
13
31
|
const config = component.config;
|
|
14
32
|
const getLocalizedText = (text) => {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
switch (docType) {
|
|
19
|
-
case 'id_card':
|
|
20
|
-
return {
|
|
21
|
-
name: { en: 'ID Card', fr: 'Carte d\'identité' },
|
|
22
|
-
icon: '🆔',
|
|
23
|
-
instructions: { en: 'Position your ID card within the frame', fr: 'Positionnez votre carte d\'identité dans le cadre' }
|
|
24
|
-
};
|
|
25
|
-
case 'passport':
|
|
26
|
-
return {
|
|
27
|
-
name: { en: 'Passport', fr: 'Passeport' },
|
|
28
|
-
icon: '📘',
|
|
29
|
-
instructions: { en: 'Position your passport within the frame', fr: 'Positionnez votre passeport dans le cadre' }
|
|
30
|
-
};
|
|
31
|
-
case 'drivers_license':
|
|
32
|
-
return {
|
|
33
|
-
name: { en: 'Driver\'s License', fr: 'Permis de conduire' },
|
|
34
|
-
icon: '🚗',
|
|
35
|
-
instructions: { en: 'Position your driver\'s license within the frame', fr: 'Positionnez votre permis de conduire dans le cadre' }
|
|
36
|
-
};
|
|
37
|
-
case 'residence_permit':
|
|
38
|
-
return {
|
|
39
|
-
name: { en: 'Residence Permit', fr: 'Permis de séjour' },
|
|
40
|
-
icon: '🏠',
|
|
41
|
-
instructions: { en: 'Position your residence permit within the frame', fr: 'Positionnez votre permis de séjour dans le cadre' }
|
|
42
|
-
};
|
|
43
|
-
case 'national_id':
|
|
44
|
-
return {
|
|
45
|
-
name: { en: 'National ID', fr: 'Carte nationale d\'identité' },
|
|
46
|
-
icon: '🏛️',
|
|
47
|
-
instructions: { en: 'Position your national ID within the frame', fr: 'Positionnez votre carte nationale d\'identité dans le cadre' }
|
|
48
|
-
};
|
|
49
|
-
case 'voter_id':
|
|
50
|
-
return {
|
|
51
|
-
name: { en: 'Voter ID', fr: 'Carte d\'électeur' },
|
|
52
|
-
icon: '🗳️',
|
|
53
|
-
instructions: { en: 'Position your voter ID within the frame', fr: 'Positionnez votre carte d\'électeur dans le cadre' }
|
|
54
|
-
};
|
|
55
|
-
case 'military_id':
|
|
56
|
-
return {
|
|
57
|
-
name: { en: 'Military ID', fr: 'Carte militaire' },
|
|
58
|
-
icon: '🎖️',
|
|
59
|
-
instructions: { en: 'Position your military ID within the frame', fr: 'Positionnez votre carte militaire dans le cadre' }
|
|
60
|
-
};
|
|
61
|
-
case 'student_id':
|
|
62
|
-
return {
|
|
63
|
-
name: { en: 'Student ID', fr: 'Carte d\'étudiant' },
|
|
64
|
-
icon: '🎓',
|
|
65
|
-
instructions: { en: 'Position your student ID within the frame', fr: 'Positionnez votre carte d\'étudiant dans le cadre' }
|
|
66
|
-
};
|
|
67
|
-
case 'work_permit':
|
|
68
|
-
return {
|
|
69
|
-
name: { en: 'Work Permit', fr: 'Permis de travail' },
|
|
70
|
-
icon: '💼',
|
|
71
|
-
instructions: { en: 'Position your work permit within the frame', fr: 'Positionnez votre permis de travail dans le cadre' }
|
|
72
|
-
};
|
|
73
|
-
case 'other':
|
|
74
|
-
default:
|
|
75
|
-
return {
|
|
76
|
-
name: { en: 'Government Document', fr: 'Document gouvernemental' },
|
|
77
|
-
icon: '📄',
|
|
78
|
-
instructions: { en: 'Position your document within the frame', fr: 'Positionnez votre document dans le cadre' }
|
|
79
|
-
};
|
|
33
|
+
// console.log("text", text, JSON.stringify(component, null, 2));
|
|
34
|
+
if (text && typeof text[currentSide] === 'object' && text[currentSide][language]) {
|
|
35
|
+
return text[currentSide][language] || '';
|
|
80
36
|
}
|
|
37
|
+
return "";
|
|
81
38
|
};
|
|
39
|
+
const countryData = useMemo(() => {
|
|
40
|
+
const geCountryID = Object.keys(state.componentData).find((c) => c === "6");
|
|
41
|
+
if (geCountryID) {
|
|
42
|
+
const countryMapping = state.componentData[geCountryID];
|
|
43
|
+
return countryMapping;
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}, [state.componentData]);
|
|
47
|
+
const availableDocumentTypes = useMemo(() => {
|
|
48
|
+
const newconfig = [];
|
|
49
|
+
if (countryData) {
|
|
50
|
+
const countryMapping = Object.keys(countryData?.regionMapping);
|
|
51
|
+
if (countryMapping && Array.isArray(countryMapping)) {
|
|
52
|
+
countryMapping.forEach((c) => {
|
|
53
|
+
newconfig.push(c);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
console.log("newconfig", truncateFields(newconfig));
|
|
58
|
+
return newconfig;
|
|
59
|
+
}, []);
|
|
60
|
+
useEffect(() => {
|
|
61
|
+
console.log("cropImageUri", JSON.stringify(truncateFields({ box: silentCaptureResult }), null, 2));
|
|
62
|
+
if (capturedImages[currentSide]?.dir && silentCaptureResult?.bbox) {
|
|
63
|
+
cropImageWithBBox(capturedImages[currentSide].dir, silentCaptureResult.bbox)?.then((uri) => {
|
|
64
|
+
setCropImageUri(uri);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}, [capturedImages[currentSide]?.dir, silentCaptureResult?.bbox]);
|
|
82
68
|
const cameraConfig = {
|
|
83
69
|
aspectRatio: 4 / 3,
|
|
84
70
|
quality: 0.8,
|
|
@@ -88,8 +74,8 @@ export const IDCardCapture = ({ component, value = {}, onValueChange, error, lan
|
|
|
88
74
|
maxRetakes: 3,
|
|
89
75
|
overlay: {
|
|
90
76
|
showGuide: true,
|
|
91
|
-
guideText: selectedDocumentType ? getDocumentTypeInfo(selectedDocumentType).instructions.en : getLocalizedText(component.instructions),
|
|
92
|
-
bbox: selectedDocumentType && config.bbox_configs[selectedDocumentType] ? config.bbox_configs[selectedDocumentType] : {
|
|
77
|
+
guideText: selectedDocumentType ? getDocumentTypeInfo(selectedDocumentType.type).instructions.en : getLocalizedText(component.instructions),
|
|
78
|
+
bbox: selectedDocumentType && config.bbox_configs[selectedDocumentType.type] ? config.bbox_configs[selectedDocumentType.type] : {
|
|
93
79
|
xMin: 20,
|
|
94
80
|
yMin: 140,
|
|
95
81
|
xMax: 370,
|
|
@@ -103,14 +89,104 @@ export const IDCardCapture = ({ component, value = {}, onValueChange, error, lan
|
|
|
103
89
|
const retakePicture = (currentSide) => {
|
|
104
90
|
setShowCamera(true);
|
|
105
91
|
actions.showCustomStepper(false);
|
|
106
|
-
setCapturedImages({ ...capturedImages, [currentSide]: '' });
|
|
107
|
-
|
|
92
|
+
setCapturedImages({ ...capturedImages, [currentSide]: { dir: '', file: '', mrz: '' } });
|
|
93
|
+
setSilentCaptureResult((prev) => ({ path: '', success: false, isAnalyzing: false, error: '' }));
|
|
94
|
+
setCropImageUri('');
|
|
95
|
+
onValueChange({ ...value, [currentSide]: { dir: '', file: '', mrz: '' } });
|
|
96
|
+
};
|
|
97
|
+
const hasRegions = useCallback((documentType) => {
|
|
98
|
+
const regionMapping = countryData?.regionMapping[documentType];
|
|
99
|
+
if (regionMapping && Object.keys(regionMapping).length > 1) {
|
|
100
|
+
return {
|
|
101
|
+
hasRegions: true,
|
|
102
|
+
regionMapping: Object.keys(regionMapping)
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
hasRegions: false,
|
|
107
|
+
regionMapping: []
|
|
108
|
+
};
|
|
109
|
+
}, [countryData]);
|
|
110
|
+
const getCurrentSideVerification = (currentSide) => {
|
|
111
|
+
const regionMapping = countryData?.regionMapping[selectedDocumentType?.type];
|
|
112
|
+
const authMethod = [];
|
|
113
|
+
const key = selectedDocumentType?.region?.trim()?.length > 0 ? selectedDocumentType?.region?.trim() : 'root';
|
|
114
|
+
// console.log("regionMapping", JSON.stringify(regionMapping, null, 2), selectedDocumentType?.region);
|
|
115
|
+
// const key = selectedDocumentType?.region as keyof typeof regionMapping;
|
|
116
|
+
if (regionMapping?.[key] && Array.isArray(regionMapping[key])) {
|
|
117
|
+
regionMapping[key].forEach((item) => {
|
|
118
|
+
if (item[currentSide]) {
|
|
119
|
+
authMethod.push(item[currentSide]);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
console.log("regionMapping", JSON.stringify(truncateFields({ regionMapping, selectedDocumentType: selectedDocumentType?.region, key }), null, 2));
|
|
124
|
+
return removeDuplicates(authMethod);
|
|
108
125
|
};
|
|
109
|
-
const
|
|
126
|
+
const handleSilentCapture = (result) => {
|
|
127
|
+
if (silentCaptureResult.isAnalyzing) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
110
130
|
if (result.success && result.path) {
|
|
111
|
-
|
|
131
|
+
setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: true, success: false, error: '' }));
|
|
132
|
+
if (currentSide === 'front') {
|
|
133
|
+
frontVerification({
|
|
134
|
+
path: result.path,
|
|
135
|
+
regionMapping: getCurrentSideVerification(currentSide),
|
|
136
|
+
selectedDocumentType: selectedDocumentType?.type || '',
|
|
137
|
+
code: countryData?.code || '',
|
|
138
|
+
currentSide: currentSide,
|
|
139
|
+
}).then((mrz) => {
|
|
140
|
+
console.log("front verification result", truncateFields(mrz));
|
|
141
|
+
setSilentCaptureResult((prev) => ({
|
|
142
|
+
...prev, path: result.path,
|
|
143
|
+
bbox: mrz?.bbox, success: true,
|
|
144
|
+
mrz: JSON.stringify(mrz), isAnalyzing: false,
|
|
145
|
+
country: countryData?.code,
|
|
146
|
+
documentType: selectedDocumentType?.type
|
|
147
|
+
}));
|
|
148
|
+
}).catch((e) => {
|
|
149
|
+
console.log("error front verification", truncateFields(e));
|
|
150
|
+
setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: false, success: false, error: e?.message || 'Erreur de détection du MRZ' }));
|
|
151
|
+
// Alert.alert('Erreur', e?.message || 'Erreur de détection du MRZ');
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
backVerification({
|
|
156
|
+
path: result.path,
|
|
157
|
+
regionMapping: getCurrentSideVerification(currentSide),
|
|
158
|
+
selectedDocumentType: selectedDocumentType?.type || '',
|
|
159
|
+
code: countryData?.code || '',
|
|
160
|
+
currentSide: currentSide,
|
|
161
|
+
}).then((mrz) => {
|
|
162
|
+
console.log("back verification result", truncateFields(mrz));
|
|
163
|
+
setSilentCaptureResult((prev) => ({
|
|
164
|
+
...prev, path: result.path, bbox: mrz?.bbox,
|
|
165
|
+
success: true, mrz: JSON.stringify(mrz), isAnalyzing: false,
|
|
166
|
+
country: countryData?.code,
|
|
167
|
+
documentType: selectedDocumentType?.type
|
|
168
|
+
}));
|
|
169
|
+
}).catch((e) => {
|
|
170
|
+
console.log("error back verification", truncateFields(e));
|
|
171
|
+
setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: false, success: false, error: e?.message || 'Erreur de détection du MRZ' }));
|
|
172
|
+
// Alert.alert('Erreur', e?.message || 'Erreur de détection du MRZ');
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
// Handle capture
|
|
178
|
+
const handleCapture = async (result) => {
|
|
179
|
+
if (silentCaptureResult.path) {
|
|
180
|
+
const base64 = await pathToBase64(silentCaptureResult.path);
|
|
181
|
+
const newImages = { ...capturedImages, [currentSide]: { dir: silentCaptureResult.path, file: base64, mrz: silentCaptureResult.mrz || "" } };
|
|
112
182
|
setCapturedImages(newImages);
|
|
113
|
-
|
|
183
|
+
if (silentCaptureResult.country && silentCaptureResult.documentType) {
|
|
184
|
+
onValueChange({
|
|
185
|
+
...newImages,
|
|
186
|
+
country: silentCaptureResult.country,
|
|
187
|
+
documentType: silentCaptureResult.documentType,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
114
190
|
setShowCamera(false);
|
|
115
191
|
actions.showCustomStepper(true);
|
|
116
192
|
}
|
|
@@ -125,11 +201,32 @@ export const IDCardCapture = ({ component, value = {}, onValueChange, error, lan
|
|
|
125
201
|
useEffect(() => {
|
|
126
202
|
actions.showCustomStepper(!showCamera);
|
|
127
203
|
}, [showCamera]);
|
|
204
|
+
// const renderBboxOverlay = () => {
|
|
205
|
+
// const bbox: any = (silentCaptureResult as any)?.bbox;
|
|
206
|
+
// if (!bbox || !imageNaturalSize) return null;
|
|
207
|
+
// const containerWidth = Dimensions.get('window').width - 24 - 24; // approximate inner width accounting paddings/margins
|
|
208
|
+
// const containerHeight = 200;
|
|
209
|
+
// const scaleX = 1;
|
|
210
|
+
// const scaleY = 1;
|
|
211
|
+
// const left = Math.max(0, bbox.minX * scaleX);
|
|
212
|
+
// const top = Math.max(0, bbox.minY * scaleY);
|
|
213
|
+
// const width = Math.max(1, bbox.width * scaleX);
|
|
214
|
+
// const height = Math.max(1, bbox.height * scaleY);
|
|
215
|
+
// return (
|
|
216
|
+
// <View
|
|
217
|
+
// pointerEvents="none"
|
|
218
|
+
// style={{ position: 'absolute', left, top, width, height, borderColor: '#2DBD60', borderWidth: 2, borderStyle: 'solid', borderRadius: 6 }}
|
|
219
|
+
// />
|
|
220
|
+
// );
|
|
221
|
+
// };
|
|
128
222
|
const handleDocumentTypeSelection = (docType) => {
|
|
129
|
-
setSelectedDocumentType(docType);
|
|
223
|
+
setSelectedDocumentType({ type: docType, region: hasRegions(docType) ? '' : 'root' });
|
|
224
|
+
};
|
|
225
|
+
const handleRegionSelection = (region) => {
|
|
226
|
+
setSelectedDocumentType((prev) => ({ ...prev, region: region }));
|
|
130
227
|
};
|
|
131
228
|
// Interface de sélection du type de document
|
|
132
|
-
if (showDocumentSelection) {
|
|
229
|
+
if (showDocumentSelection.documentSelection || showDocumentSelection.regionSelection) {
|
|
133
230
|
return (<View style={styles.root}>
|
|
134
231
|
<View style={styles.container}>
|
|
135
232
|
|
|
@@ -137,9 +234,9 @@ export const IDCardCapture = ({ component, value = {}, onValueChange, error, lan
|
|
|
137
234
|
<Text style={styles.description}>{getLocalizedText(component.instructions)}</Text>
|
|
138
235
|
|
|
139
236
|
<ScrollView style={styles.documentTypesContainer} showsVerticalScrollIndicator={false}>
|
|
140
|
-
{
|
|
237
|
+
{showDocumentSelection.documentSelection ? availableDocumentTypes.map((docType) => {
|
|
141
238
|
const docInfo = getDocumentTypeInfo(docType);
|
|
142
|
-
return (<TouchableOpacity key={docType} style={[styles.documentTypeButton, { backgroundColor: selectedDocumentType === docType ? '#2DBD6030' : '#F8F9FA', borderColor: selectedDocumentType === docType ? '#2DBD60' : '#E9ECEF', borderWidth: 2 }]} onPress={() => handleDocumentTypeSelection(docType)}>
|
|
239
|
+
return (<TouchableOpacity key={docType} style={[styles.documentTypeButton, { backgroundColor: selectedDocumentType?.type === docType ? '#2DBD6030' : '#F8F9FA', borderColor: selectedDocumentType?.type === docType ? '#2DBD60' : '#E9ECEF', borderWidth: 2 }]} onPress={() => handleDocumentTypeSelection(docType)}>
|
|
143
240
|
<View style={[styles.documentTypeIconContainer, { backgroundColor: 'gray', }]}>
|
|
144
241
|
<Text style={styles.documentTypeIcon}>{docInfo.icon}</Text>
|
|
145
242
|
</View>
|
|
@@ -148,16 +245,45 @@ export const IDCardCapture = ({ component, value = {}, onValueChange, error, lan
|
|
|
148
245
|
</Text>
|
|
149
246
|
<Text style={styles.documentTypeArrow}>→</Text>
|
|
150
247
|
</TouchableOpacity>);
|
|
151
|
-
})}
|
|
248
|
+
}) : null}
|
|
249
|
+
{showDocumentSelection.regionSelection ?
|
|
250
|
+
hasRegions(selectedDocumentType?.type || 'identity_card').regionMapping.map((region) => {
|
|
251
|
+
return (<TouchableOpacity key={region} onPress={() => handleRegionSelection(region)} style={[styles.documentTypeButton, { backgroundColor: selectedDocumentType?.region === region ? '#2DBD6030' : '#F8F9FA', borderColor: selectedDocumentType?.region === region ? '#2DBD60' : '#E9ECEF', borderWidth: 2 }]}>
|
|
252
|
+
<Text>{region}</Text>
|
|
253
|
+
</TouchableOpacity>);
|
|
254
|
+
}) : null}
|
|
152
255
|
</ScrollView>
|
|
153
|
-
<Button title={
|
|
256
|
+
<Button title={t('common.next')} onPress={() => {
|
|
154
257
|
if (!selectedDocumentType) {
|
|
155
|
-
Alert.alert('
|
|
258
|
+
Alert.alert(t('common.error'), t('validation.required'));
|
|
156
259
|
return;
|
|
157
260
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
261
|
+
if (showDocumentSelection.regionSelection) {
|
|
262
|
+
console.log("showDocumentSelection", JSON.stringify(truncateFields(showDocumentSelection), null, 2));
|
|
263
|
+
setShowDocumentSelection({
|
|
264
|
+
documentSelection: false,
|
|
265
|
+
regionSelection: false
|
|
266
|
+
});
|
|
267
|
+
setShowCamera(true);
|
|
268
|
+
actions.showCustomStepper(false);
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
if (hasRegions(selectedDocumentType?.type)?.hasRegions) {
|
|
273
|
+
setShowDocumentSelection({
|
|
274
|
+
documentSelection: false,
|
|
275
|
+
regionSelection: true
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
setShowDocumentSelection({
|
|
280
|
+
documentSelection: false,
|
|
281
|
+
regionSelection: false
|
|
282
|
+
});
|
|
283
|
+
setShowCamera(true);
|
|
284
|
+
actions.showCustomStepper(false);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
161
287
|
}} variant={selectedDocumentType ? 'primary' : "neutral"} size="large" fullWidth/>
|
|
162
288
|
|
|
163
289
|
|
|
@@ -167,12 +293,26 @@ export const IDCardCapture = ({ component, value = {}, onValueChange, error, lan
|
|
|
167
293
|
}
|
|
168
294
|
if (showCamera) {
|
|
169
295
|
return (<View style={styles.cameraContainer}>
|
|
170
|
-
<EnhancedCameraView showCamera={true} cameraType={cameraConfig.cameraType} style={styles.camera} onCapture={handleCapture} onError={handleError} onClose={() => setShowCamera(false)} quality="high" showCaptureButton={true} showSwitchCamera={true} enableFlash={cameraConfig.flashMode === 'auto' || cameraConfig.flashMode === 'on'} overlayComponent={<IdCardOverlay xMin={cameraConfig.overlay.bbox.xMin} yMin={cameraConfig.overlay.bbox.yMin} xMax={cameraConfig.overlay.bbox.xMax} yMax={cameraConfig.overlay.bbox.yMax} instructions={cameraConfig.overlay.guideText} cornerOpacity={cameraConfig.overlay.bbox.cornerRadius || 0} stepperProps={{
|
|
296
|
+
<EnhancedCameraView showCamera={true} cameraType={cameraConfig.cameraType} style={styles.camera} onCapture={handleCapture} onError={handleError} onClose={() => setShowCamera(false)} quality="high" showCaptureButton={true} showSwitchCamera={true} onSilentCapture={handleSilentCapture} silentCaptureResult={silentCaptureResult} enableFlash={cameraConfig.flashMode === 'auto' || cameraConfig.flashMode === 'on'} overlayComponent={<IdCardOverlay xMin={cameraConfig.overlay.bbox.xMin} yMin={cameraConfig.overlay.bbox.yMin} xMax={cameraConfig.overlay.bbox.xMax} yMax={cameraConfig.overlay.bbox.yMax} instructions={cameraConfig.overlay.guideText} cornerOpacity={cameraConfig.overlay.bbox.cornerRadius || 0} isSuccess={silentCaptureResult.success} language={state.currentLanguage} stepperProps={{
|
|
171
297
|
back: () => {
|
|
172
|
-
|
|
173
|
-
|
|
298
|
+
if (currentSide === 'back') {
|
|
299
|
+
setCurrentSide('front');
|
|
300
|
+
setShowCamera(false);
|
|
301
|
+
setShowDocumentSelection({
|
|
302
|
+
documentSelection: false,
|
|
303
|
+
regionSelection: false
|
|
304
|
+
});
|
|
305
|
+
setSilentCaptureResult((prev) => ({ path: '', success: false, isAnalyzing: false, error: '' }));
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
setShowDocumentSelection({
|
|
309
|
+
documentSelection: true,
|
|
310
|
+
regionSelection: false
|
|
311
|
+
});
|
|
312
|
+
actions.showCustomStepper(true);
|
|
313
|
+
}
|
|
174
314
|
},
|
|
175
|
-
selectedDocumentType: getDocumentTypeInfo(selectedDocumentType ||
|
|
315
|
+
selectedDocumentType: getDocumentTypeInfo(selectedDocumentType?.type || "identity_card").name.en || '',
|
|
176
316
|
step: state.currentComponentIndex + 1,
|
|
177
317
|
totalSteps: state.template.components.length,
|
|
178
318
|
}}/>}/>
|
|
@@ -189,7 +329,6 @@ export const IDCardCapture = ({ component, value = {}, onValueChange, error, lan
|
|
|
189
329
|
{getLocalizedText(component.instructions)}
|
|
190
330
|
</Text>
|
|
191
331
|
|
|
192
|
-
|
|
193
332
|
<View style={{ alignItems: 'center', justifyContent: 'center', flexDirection: "column", gap: 16 }}>
|
|
194
333
|
<View style={{
|
|
195
334
|
width: '100%',
|
|
@@ -206,20 +345,29 @@ export const IDCardCapture = ({ component, value = {}, onValueChange, error, lan
|
|
|
206
345
|
elevation: 8,
|
|
207
346
|
backgroundColor: '#fff', // Needed for shadow to show on iOS
|
|
208
347
|
}}>
|
|
209
|
-
<Image source={{ uri:
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
348
|
+
{cropImageUri ? (<Image source={{ uri: cropImageUri }} style={{
|
|
349
|
+
width: '100%',
|
|
350
|
+
height: 200,
|
|
351
|
+
borderRadius: 12,
|
|
352
|
+
resizeMode: 'cover',
|
|
353
|
+
}}/>) : null}
|
|
354
|
+
|
|
215
355
|
</View>
|
|
216
356
|
{/* retake button */}
|
|
217
|
-
<Button title=
|
|
357
|
+
<Button title={t('kyc.idCardCapture.retakeButton')} onPress={() => {
|
|
218
358
|
retakePicture(currentSide);
|
|
219
359
|
}} variant="outline" size="medium" fullWidth/>
|
|
220
|
-
<Button title=
|
|
221
|
-
|
|
222
|
-
|
|
360
|
+
<Button title={t('common.next')} onPress={() => {
|
|
361
|
+
if (currentSide === 'back' || selectedDocumentType?.type === 'passport') {
|
|
362
|
+
actions.nextComponent();
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
setShowCamera(true);
|
|
367
|
+
setCurrentSide('back');
|
|
368
|
+
setSilentCaptureResult((prev) => ({ path: '', success: false, isAnalyzing: false, error: '', mrz: '' }));
|
|
369
|
+
setCropImageUri('');
|
|
370
|
+
}
|
|
223
371
|
}} variant="primary" size="large" fullWidth/>
|
|
224
372
|
</View>
|
|
225
373
|
</View>
|
|
@@ -383,8 +531,9 @@ const styles = StyleSheet.create({
|
|
|
383
531
|
},
|
|
384
532
|
documentTypesContainer: {
|
|
385
533
|
// flex: 1,
|
|
386
|
-
marginBottom: 16,
|
|
534
|
+
// marginBottom: 16,
|
|
387
535
|
// paddingHorizontal: 16,
|
|
536
|
+
maxHeight: Dimensions.get('window').height - 400,
|
|
388
537
|
},
|
|
389
538
|
documentTypeButton: {
|
|
390
539
|
flexDirection: 'row',
|