@transfergratis/react-native-sdk 0.1.23 → 0.1.25
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/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +12 -5
- package/android/build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar +0 -0
- package/android/build/intermediates/annotations_typedef_file/debug/extractDebugAnnotations/typedefs.txt +0 -0
- package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +1 -1
- package/android/build/intermediates/incremental/debug-mergeJavaRes/merge-state +0 -0
- package/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +61 -59
- package/android/build/intermediates/merged_java_res/debug/mergeDebugJavaResource/feature-transfergratis-react-native-sdk.jar +0 -0
- package/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +12 -5
- package/android/build/kotlin/compileDebugKotlin/cacheable/last-build.bin +0 -0
- package/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin +0 -0
- package/android/build/outputs/aar/transfergratis-react-native-sdk-debug.aar +0 -0
- package/android/build/outputs/logs/manifest-merger-debug-report.txt +26 -34
- package/android/src/main/AndroidManifest.xml +13 -5
- package/build/components/EnhancedCameraView.d.ts.map +1 -1
- package/build/components/EnhancedCameraView.js +26 -3
- package/build/components/EnhancedCameraView.js.map +1 -1
- package/build/components/EnhancedCameraView.web.d.ts.map +1 -1
- package/build/components/EnhancedCameraView.web.js +21 -0
- package/build/components/EnhancedCameraView.web.js.map +1 -1
- package/build/components/KYCElements/AdditionalDocumentsTemplate.d.ts +12 -0
- package/build/components/KYCElements/AdditionalDocumentsTemplate.d.ts.map +1 -0
- package/build/components/KYCElements/AdditionalDocumentsTemplate.js +283 -0
- package/build/components/KYCElements/AdditionalDocumentsTemplate.js.map +1 -0
- package/build/components/KYCElements/CameraCapture.d.ts.map +1 -1
- package/build/components/KYCElements/CameraCapture.js +4 -3
- package/build/components/KYCElements/CameraCapture.js.map +1 -1
- package/build/components/KYCElements/CountrySelectionTemplate.d.ts +5 -2
- package/build/components/KYCElements/CountrySelectionTemplate.d.ts.map +1 -1
- package/build/components/KYCElements/CountrySelectionTemplate.js +360 -101
- package/build/components/KYCElements/CountrySelectionTemplate.js.map +1 -1
- package/build/components/KYCElements/EmailVerificationTemplate.d.ts +12 -0
- package/build/components/KYCElements/EmailVerificationTemplate.d.ts.map +1 -0
- package/build/components/KYCElements/EmailVerificationTemplate.js +193 -0
- package/build/components/KYCElements/EmailVerificationTemplate.js.map +1 -0
- package/build/components/KYCElements/FileUpload.d.ts.map +1 -1
- package/build/components/KYCElements/FileUpload.js +5 -4
- package/build/components/KYCElements/FileUpload.js.map +1 -1
- package/build/components/KYCElements/FileUploadTemplate.d.ts.map +1 -1
- package/build/components/KYCElements/FileUploadTemplate.js +5 -4
- package/build/components/KYCElements/FileUploadTemplate.js.map +1 -1
- package/build/components/KYCElements/IDCardCapture.d.ts.map +1 -1
- package/build/components/KYCElements/IDCardCapture.js +356 -227
- package/build/components/KYCElements/IDCardCapture.js.map +1 -1
- package/build/components/KYCElements/LocationCaptureTemplate.d.ts.map +1 -1
- package/build/components/KYCElements/LocationCaptureTemplate.js +78 -37
- package/build/components/KYCElements/LocationCaptureTemplate.js.map +1 -1
- package/build/components/KYCElements/OrientationVideoCapture.d.ts +2 -0
- package/build/components/KYCElements/OrientationVideoCapture.d.ts.map +1 -1
- package/build/components/KYCElements/OrientationVideoCapture.js +5 -4
- package/build/components/KYCElements/OrientationVideoCapture.js.map +1 -1
- package/build/components/KYCElements/OrientationVideoCaptureEnhanced.d.ts +2 -0
- package/build/components/KYCElements/OrientationVideoCaptureEnhanced.d.ts.map +1 -1
- package/build/components/KYCElements/OrientationVideoCaptureEnhanced.js +5 -4
- package/build/components/KYCElements/OrientationVideoCaptureEnhanced.js.map +1 -1
- package/build/components/KYCElements/OrientationVideoCaptureFinal.d.ts +2 -0
- package/build/components/KYCElements/OrientationVideoCaptureFinal.d.ts.map +1 -1
- package/build/components/KYCElements/OrientationVideoCaptureFinal.js +5 -4
- package/build/components/KYCElements/OrientationVideoCaptureFinal.js.map +1 -1
- package/build/components/KYCElements/PersonalInformationTemplate.d.ts +12 -0
- package/build/components/KYCElements/PersonalInformationTemplate.d.ts.map +1 -0
- package/build/components/KYCElements/PersonalInformationTemplate.js +120 -0
- package/build/components/KYCElements/PersonalInformationTemplate.js.map +1 -0
- package/build/components/KYCElements/PhoneVerificationTemplate.d.ts +12 -0
- package/build/components/KYCElements/PhoneVerificationTemplate.d.ts.map +1 -0
- package/build/components/KYCElements/PhoneVerificationTemplate.js +185 -0
- package/build/components/KYCElements/PhoneVerificationTemplate.js.map +1 -0
- package/build/components/KYCElements/SelfieCapture.d.ts.map +1 -1
- package/build/components/KYCElements/SelfieCapture.js +4 -3
- package/build/components/KYCElements/SelfieCapture.js.map +1 -1
- package/build/components/KYCElements/SelfieCaptureTemplate.d.ts.map +1 -1
- package/build/components/KYCElements/SelfieCaptureTemplate.js +189 -42
- package/build/components/KYCElements/SelfieCaptureTemplate.js.map +1 -1
- package/build/components/KYCElements/WelcomeTemplate.d.ts +12 -0
- package/build/components/KYCElements/WelcomeTemplate.d.ts.map +1 -0
- package/build/components/KYCElements/WelcomeTemplate.js +243 -0
- package/build/components/KYCElements/WelcomeTemplate.js.map +1 -0
- package/build/components/TemplateKYCExample.d.ts +8 -2
- package/build/components/TemplateKYCExample.d.ts.map +1 -1
- package/build/components/TemplateKYCExample.js +10 -97
- package/build/components/TemplateKYCExample.js.map +1 -1
- package/build/components/TemplateKYCFlowRefactored.d.ts +6 -1
- package/build/components/TemplateKYCFlowRefactored.d.ts.map +1 -1
- package/build/components/TemplateKYCFlowRefactored.js +108 -11
- package/build/components/TemplateKYCFlowRefactored.js.map +1 -1
- package/build/components/example/DynamicTemplateExample.d.ts +10 -0
- package/build/components/example/DynamicTemplateExample.d.ts.map +1 -0
- package/build/components/example/DynamicTemplateExample.js +241 -0
- package/build/components/example/DynamicTemplateExample.js.map +1 -0
- package/build/config/KYCConfig.d.ts +14 -0
- package/build/config/KYCConfig.d.ts.map +1 -0
- package/build/config/KYCConfig.js +26 -0
- package/build/config/KYCConfig.js.map +1 -0
- package/build/config/allowedDomains.d.ts +30 -0
- package/build/config/allowedDomains.d.ts.map +1 -0
- package/build/config/allowedDomains.js +112 -0
- package/build/config/allowedDomains.js.map +1 -0
- package/build/hooks/useOrientationVideo.d.ts +2 -1
- package/build/hooks/useOrientationVideo.d.ts.map +1 -1
- package/build/hooks/useOrientationVideo.js +3 -3
- package/build/hooks/useOrientationVideo.js.map +1 -1
- package/build/hooks/useTemplateKYCFlow.d.ts +6 -1
- package/build/hooks/useTemplateKYCFlow.d.ts.map +1 -1
- package/build/hooks/useTemplateKYCFlow.js +317 -34
- package/build/hooks/useTemplateKYCFlow.js.map +1 -1
- package/build/hooks/useTemplateLoader.d.ts +14 -0
- package/build/hooks/useTemplateLoader.d.ts.map +1 -0
- package/build/hooks/useTemplateLoader.js +85 -0
- package/build/hooks/useTemplateLoader.js.map +1 -0
- package/build/i18n/en/index.d.ts +49 -0
- package/build/i18n/en/index.d.ts.map +1 -1
- package/build/i18n/en/index.js +50 -1
- package/build/i18n/en/index.js.map +1 -1
- package/build/i18n/fr/index.d.ts +35 -0
- package/build/i18n/fr/index.d.ts.map +1 -1
- package/build/i18n/fr/index.js +36 -1
- package/build/i18n/fr/index.js.map +1 -1
- package/build/index.d.ts +6 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +10 -0
- package/build/index.js.map +1 -1
- package/build/modules/api/CardAuthentification.d.ts +24 -3
- package/build/modules/api/CardAuthentification.d.ts.map +1 -1
- package/build/modules/api/CardAuthentification.js +69 -10
- package/build/modules/api/CardAuthentification.js.map +1 -1
- package/build/modules/api/KYCService.d.ts +7 -7
- package/build/modules/api/KYCService.d.ts.map +1 -1
- package/build/modules/api/KYCService.js +108 -39
- package/build/modules/api/KYCService.js.map +1 -1
- package/build/modules/api/SelfieVerification.d.ts +3 -1
- package/build/modules/api/SelfieVerification.d.ts.map +1 -1
- package/build/modules/api/SelfieVerification.js +17 -1
- package/build/modules/api/SelfieVerification.js.map +1 -1
- package/build/modules/api/TemplateService.d.ts +44 -0
- package/build/modules/api/TemplateService.d.ts.map +1 -0
- package/build/modules/api/TemplateService.js +145 -0
- package/build/modules/api/TemplateService.js.map +1 -0
- package/build/types/KYC.types.d.ts +265 -4
- package/build/types/KYC.types.d.ts.map +1 -1
- package/build/types/KYC.types.js +15 -0
- package/build/types/KYC.types.js.map +1 -1
- package/build/types/env.types.d.ts +13 -0
- package/build/types/env.types.d.ts.map +1 -0
- package/build/types/env.types.js +2 -0
- package/build/types/env.types.js.map +1 -0
- package/build/utils/cropByObb.d.ts +1 -0
- package/build/utils/cropByObb.d.ts.map +1 -1
- package/build/utils/cropByObb.js +70 -0
- package/build/utils/cropByObb.js.map +1 -1
- package/build/utils/deviceDetection.d.ts +6 -0
- package/build/utils/deviceDetection.d.ts.map +1 -0
- package/build/utils/deviceDetection.js +12 -0
- package/build/utils/deviceDetection.js.map +1 -0
- package/build/utils/platformAlert.d.ts +20 -0
- package/build/utils/platformAlert.d.ts.map +1 -0
- package/build/utils/platformAlert.js +67 -0
- package/build/utils/platformAlert.js.map +1 -0
- package/build/utils/template-transformer.d.ts +10 -0
- package/build/utils/template-transformer.d.ts.map +1 -0
- package/build/utils/template-transformer.js +365 -0
- package/build/utils/template-transformer.js.map +1 -0
- package/build/web/WebKYCEntry.d.ts.map +1 -1
- package/build/web/WebKYCEntry.js +158 -32
- package/build/web/WebKYCEntry.js.map +1 -1
- package/package.json +1 -1
- package/plugin/build/withVisionCamera.js +3 -4
- package/plugin/src/withVisionCamera.js +3 -4
- package/plugin/src/withVisionCamera.ts +3 -4
- package/src/components/EnhancedCameraView.tsx +31 -2
- package/src/components/EnhancedCameraView.web.tsx +24 -0
- package/src/components/KYCElements/AdditionalDocumentsTemplate.tsx +346 -0
- package/src/components/KYCElements/CameraCapture.tsx +4 -3
- package/src/components/KYCElements/CountrySelectionTemplate.tsx +410 -113
- package/src/components/KYCElements/EmailVerificationTemplate.tsx +264 -0
- package/src/components/KYCElements/FileUpload.tsx +5 -4
- package/src/components/KYCElements/FileUploadTemplate.tsx +5 -4
- package/src/components/KYCElements/IDCardCapture.tsx +397 -254
- package/src/components/KYCElements/LocationCaptureTemplate.tsx +95 -44
- package/src/components/KYCElements/OrientationVideoCapture.tsx +6 -3
- package/src/components/KYCElements/OrientationVideoCaptureEnhanced.tsx +6 -3
- package/src/components/KYCElements/OrientationVideoCaptureFinal.tsx +6 -3
- package/src/components/KYCElements/PersonalInformationTemplate.tsx +158 -0
- package/src/components/KYCElements/PhoneVerificationTemplate.tsx +253 -0
- package/src/components/KYCElements/SelfieCapture.tsx +4 -3
- package/src/components/KYCElements/SelfieCaptureTemplate.tsx +201 -44
- package/src/components/KYCElements/WelcomeTemplate.tsx +289 -0
- package/src/components/TemplateKYCExample.tsx +37 -108
- package/src/components/TemplateKYCFlowRefactored.tsx +148 -12
- package/src/components/example/DynamicTemplateExample.tsx +289 -0
- package/src/config/KYCConfig.ts +34 -0
- package/src/config/allowedDomains.ts +133 -0
- package/src/hooks/useOrientationVideo.ts +5 -4
- package/src/hooks/useTemplateKYCFlow.tsx +347 -32
- package/src/hooks/useTemplateLoader.ts +102 -0
- package/src/i18n/en/index.ts +53 -2
- package/src/i18n/fr/index.ts +37 -1
- package/src/index.ts +14 -0
- package/src/modules/api/CardAuthentification.ts +76 -11
- package/src/modules/api/KYCService.ts +129 -45
- package/src/modules/api/SelfieVerification.ts +25 -3
- package/src/modules/api/TemplateService.ts +167 -0
- package/src/types/KYC.types.ts +331 -3
- package/src/types/env.types.ts +13 -0
- package/src/utils/cropByObb.ts +83 -3
- package/src/utils/deviceDetection.ts +11 -0
- package/src/utils/platformAlert.ts +86 -0
- package/src/utils/template-transformer.ts +445 -0
- package/src/web/WebKYCEntry.tsx +199 -50
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CountrySelectionTemplate.js","sourceRoot":"","sources":["../../../src/components/KYCElements/CountrySelectionTemplate.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useState } from 'react';\nimport { View, Text, TouchableOpacity, StyleSheet, ScrollView } from 'react-native';\nimport { TemplateComponent, CountrySelectionConfig, LocalizedText, Country } from '../../types/KYC.types';\nimport { countryMapping } from '../../config/region_mapping';\nimport { useTemplateKYCFlowContext } from '../../hooks/useTemplateKYCFlow';\nimport { useI18n } from '../../hooks/useI18n';\nimport { Button } from '../ui/Button';\nimport { countryData } from '../../config/countriesData';\n\ninterface CountrySelectionTemplateProps {\n component: TemplateComponent;\n value?: string;\n onValueChange: (value: Country) => void;\n error?: string;\n language?: string;\n}\n\nexport const CountrySelectionTemplate: React.FC<CountrySelectionTemplateProps> = ({\n component,\n value,\n onValueChange,\n error,\n language = 'en',\n}) => {\n const { t } = useI18n();\n const config = component.config as CountrySelectionConfig;\n const allowedCountries = (config.allowed_countries || Object.keys(countryData));\n const defaultCountry = config.default_country || 'CM';\n const { actions, state} = useTemplateKYCFlowContext();\n\n console.log({ language }, state.currentLanguage);\n\n const [selectedCountry, setSelectedCountry] = useState<Country>({ code: defaultCountry, ...countryData[defaultCountry] });\n\n const getLocalizedText = (text: LocalizedText): string => {\n return text[language] || text.en || '';\n };\n\n const selectedValue = value || defaultCountry;\n\n const filteredCountries = allowedCountries\n .filter(code => countryData[code])\n .map(code => ({\n code,\n ...countryData[code]\n }))\n .sort((a, b) => a.name.localeCompare(b.name));\n\n useEffect(() => {\n if (selectedCountry) {\n const mapping = selectedCountry.code ? countryMapping[selectedCountry.code as keyof typeof countryMapping] : undefined;\n onValueChange({ ...selectedCountry, regionMapping: mapping });\n }\n }, [selectedCountry]);\n\n return (\n <View style={styles.root}>\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.countriesContainer} showsVerticalScrollIndicator={false}>\n {filteredCountries.map((country) => (\n <TouchableOpacity\n key={country.code}\n style={[\n styles.countryOption,\n selectedCountry.code === country.code && styles.selectedCountryOption\n ]}\n onPress={() => {\n console.log({\n country, language\n });\n\n setSelectedCountry(country);\n }}\n >\n <Text style={styles.countryFlag}>{country.flag}</Text>\n <View style={styles.countryContent}>\n <Text style={[\n styles.countryName,\n selectedCountry.code === country.code && styles.selectedCountryName\n ]}>\n {state.currentLanguage === \"en\"? country.name_en: country.name}\n </Text>\n <Text style={styles.countryCode}>{country.code}</Text>\n </View>\n {selectedCountry.code === country.code && (\n <View style={[\n styles.checkmark,\n { backgroundColor: component.ui.themeColor as string || '#2DBD60' }\n ]}>\n <Text style={styles.checkmarkText}>✓</Text>\n </View>\n )}\n </TouchableOpacity>\n ))}\n </ScrollView>\n\n {selectedCountry.code && (\n <Button title={t('common.next')} onPress={() => {\n\n\n const mapping = selectedCountry.code ? countryMapping[selectedCountry.code as keyof typeof countryMapping] : undefined;\n onValueChange({ ...selectedCountry, regionMapping: mapping });\n setTimeout(() => {\n actions.nextComponent();\n }, 500);\n }}\n variant=\"primary\"\n size=\"large\"\n fullWidth\n />\n )}\n\n {config.required && !selectedValue && (\n <View style={styles.requiredContainer}>\n\n\n <Text style={styles.requiredText}>{\n state.currentLanguage === \"en\" ? \"⚠️ Please Select your country\" : \"⚠️ Veuillez sélectionner un pays\"\n }</Text>\n </View>\n )}\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 maxWidth: 760,\n width: '100%',\n },\n container: {\n backgroundColor: 'white',\n margin: 10,\n borderRadius: 10,\n paddingVertical: 16,\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 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 countriesContainer: {\n height: \"80%\",\n maxHeight: 600,\n },\n countryOption: {\n flexDirection: 'row',\n alignItems: 'center',\n padding: 16,\n backgroundColor: 'white',\n borderRadius: 12,\n marginBottom: 12,\n borderWidth: 2,\n borderColor: '#e5e5e5',\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 selectedCountryOption: {\n borderColor: '#2DBD60',\n backgroundColor: '#f0f9f0',\n },\n countryFlag: {\n fontSize: 32,\n marginRight: 16,\n },\n countryContent: {\n flex: 1,\n },\n countryName: {\n fontSize: 18,\n fontWeight: '600',\n color: '#333',\n },\n selectedCountryName: {\n color: '#2DBD60',\n },\n countryCode: {\n fontSize: 14,\n color: '#666',\n marginTop: 4,\n fontWeight: '500',\n },\n checkmark: {\n width: 24,\n height: 24,\n borderRadius: 12,\n justifyContent: 'center',\n alignItems: 'center',\n },\n checkmarkText: {\n color: 'white',\n fontSize: 16,\n fontWeight: 'bold',\n },\n selectionInfo: {\n backgroundColor: '#f0f9f0',\n padding: 16,\n borderRadius: 8,\n marginTop: 16,\n alignItems: 'center',\n },\n selectionText: {\n fontSize: 16,\n fontWeight: '600',\n color: '#2DBD60',\n },\n requiredContainer: {\n backgroundColor: '#fff3cd',\n padding: 16,\n borderRadius: 8,\n marginTop: 16,\n alignItems: 'center',\n },\n requiredText: {\n fontSize: 16,\n fontWeight: '600',\n color: '#856404',\n },\n errorText: {\n color: '#dc2626',\n fontSize: 14,\n marginTop: 8,\n textAlign: 'center',\n },\n}); "]}
|
|
1
|
+
{"version":3,"file":"CountrySelectionTemplate.js","sourceRoot":"","sources":["../../../src/components/KYCElements/CountrySelectionTemplate.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useMemo, useEffect } from 'react';\nimport { View, Text, TouchableOpacity, StyleSheet, ScrollView } from 'react-native';\nimport { TemplateComponent, CountrySelectionConfig, LocalizedText, Country, IDCardConfig } from '../../types/KYC.types';\nimport { countryMapping } from '../../config/region_mapping';\nimport { useTemplateKYCFlowContext } from '../../hooks/useTemplateKYCFlow';\nimport { Button } from '../ui/Button';\nimport { countryData } from '../../config/countriesData';\n\ninterface CountrySelectionTemplateProps {\n component: TemplateComponent;\n value?: any;\n onValueChange: (value: Country & { documentType?: string; region?: string }) => void;\n error?: string;\n language?: string;\n}\n\ntype SelectionStep = 'country' | 'documentType' | 'region';\n\n// Type étendu pour IDCardConfig avec les propriétés additionnelles\ntype ExtendedIDCardConfig = IDCardConfig & {\n selectedCountries?: string[];\n documentTypesByCountry?: Record<string, string[]>;\n regionsByCountry?: Record<string, Record<string, string[]>>;\n instructionsByDocumentType?: Record<string, LocalizedText>;\n};\n\nexport const CountrySelectionTemplate: React.FC<CountrySelectionTemplateProps> = ({\n component,\n value,\n onValueChange,\n error,\n language = 'en',\n}) => {\n const config = component.config as CountrySelectionConfig;\n const { actions, state } = useTemplateKYCFlowContext();\n\n // Récupérer les données depuis le composant id_card\n const idCardComponent = useMemo(() => {\n return state.template.components.find(c => c.type === 'id_card');\n }, [state.template.components]);\n\n const idCardConfig = useMemo(() => {\n return idCardComponent?.config as ExtendedIDCardConfig | undefined;\n }, [idCardComponent]);\n\n // États de navigation - initialiser depuis value si disponible\n const [currentStep, setCurrentStep] = useState<SelectionStep>(() => {\n // Si value existe, on a déjà sélectionné -> aller à la dernière étape nécessaire\n if (value?.code && value?.documentType) {\n if (value.region) return 'region';\n return 'documentType';\n }\n return 'country';\n });\n const [selectedCountryCode, setSelectedCountryCode] = useState<string | null>(value?.code || null);\n const [selectedDocumentType, setSelectedDocumentType] = useState<string | null>(value?.documentType || null);\n const [selectedRegion, setSelectedRegion] = useState<string | null>(value?.region || null);\n\n // Restaurer l'état depuis value si le composant est remonté avec des données\n useEffect(() => {\n if (value?.code && value?.documentType) {\n setSelectedCountryCode(value.code);\n setSelectedDocumentType(value.documentType);\n setSelectedRegion(value.region || null);\n // Déterminer l'étape actuelle\n if (value.region) {\n setCurrentStep('region');\n } else {\n // Vérifier si une région est nécessaire\n const needsRegionCheck = value.code && value.documentType && idCardConfig?.regionsByCountry?.[value.code]?.[value.documentType];\n if (needsRegionCheck && Array.isArray(needsRegionCheck) && needsRegionCheck.length > 0) {\n setCurrentStep('region');\n } else {\n setCurrentStep('documentType');\n }\n }\n } else {\n // Réinitialiser si value est vide\n setSelectedCountryCode(null);\n setSelectedDocumentType(null);\n setSelectedRegion(null);\n setCurrentStep('country');\n }\n }, [value?.code, value?.documentType, value?.region, idCardConfig]);\n\n // Récupérer les pays disponibles\n const availableCountries = useMemo(() => {\n const countries = idCardConfig?.selectedCountries || config.allowed_countries || Object.keys(countryData);\n return countries\n .filter((code: string) => countryData[code])\n .map((code: string) => ({ code, ...countryData[code] }))\n .sort((a: Country & { code?: string }, b: Country & { code?: string }) => a.name.localeCompare(b.name));\n }, [idCardConfig?.selectedCountries, config.allowed_countries]);\n\n // Récupérer les types de documents disponibles pour le pays sélectionné\n const availableDocumentTypes = useMemo(() => {\n if (!selectedCountryCode || !idCardConfig?.documentTypesByCountry) return [];\n return idCardConfig.documentTypesByCountry[selectedCountryCode] || [];\n }, [selectedCountryCode, idCardConfig?.documentTypesByCountry]);\n\n // Récupérer les régions disponibles pour le pays et type de document sélectionnés\n const availableRegions = useMemo(() => {\n if (!selectedCountryCode || !selectedDocumentType || !idCardConfig?.regionsByCountry) return [];\n const regions = idCardConfig.regionsByCountry[selectedCountryCode];\n if (!regions) return [];\n return Array.isArray(regions[selectedDocumentType]) ? regions[selectedDocumentType] : [];\n }, [selectedCountryCode, selectedDocumentType, idCardConfig?.regionsByCountry]);\n\n // Vérifier si une région est nécessaire\n const needsRegion = useMemo(() => {\n return availableRegions.length > 0;\n }, [availableRegions]);\n\n const getLocalizedText = (text: LocalizedText): string => {\n return text[state.currentLanguage] || text.en || '';\n };\n\n // Navigation entre les étapes\n const handleCountrySelect = (countryCode: string) => {\n setSelectedCountryCode(countryCode);\n setSelectedDocumentType(null);\n setSelectedRegion(null);\n setCurrentStep('documentType');\n };\n\n const handleDocumentTypeSelect = (docType: string) => {\n setSelectedDocumentType(docType);\n setSelectedRegion(null);\n // Vérifier si une région est nécessaire (doit être recalculé après setSelectedDocumentType)\n const regions = selectedCountryCode && idCardConfig?.regionsByCountry?.[selectedCountryCode]?.[docType];\n if (regions && Array.isArray(regions) && regions.length > 0) {\n setCurrentStep('region');\n } else {\n // Pas de région nécessaire, on peut finaliser\n if (selectedCountryCode) {\n finalizeSelection(selectedCountryCode, docType, null);\n }\n }\n };\n\n const handleRegionSelect = (region: string) => {\n setSelectedRegion(region);\n if (selectedCountryCode && selectedDocumentType) {\n finalizeSelection(selectedCountryCode, selectedDocumentType, region);\n }\n };\n\n const finalizeSelection = (countryCode: string, docType: string, region: string | null) => {\n const country = countryData[countryCode];\n if (!country) return;\n\n const mapping = countryMapping[countryCode as keyof typeof countryMapping];\n const countryObj: Country & { documentType?: string; region?: string } = {\n code: countryCode,\n ...country,\n regionMapping: mapping,\n documentType: docType,\n region: region || undefined,\n };\n\n onValueChange(countryObj);\n // Passer à l'étape suivante après un court délai\n setTimeout(() => {\n actions.nextComponent();\n }, 300);\n };\n\n const handleBack = () => {\n if (currentStep === 'region') {\n setCurrentStep('documentType');\n setSelectedRegion(null);\n } else if (currentStep === 'documentType') {\n setCurrentStep('country');\n setSelectedDocumentType(null);\n setSelectedRegion(null);\n } else if (currentStep === 'country') {\n // Retour au composant précédent\n actions.previousComponent();\n }\n };\n\n const handleNext = () => {\n if (currentStep === 'country' && selectedCountryCode) {\n setCurrentStep('documentType');\n } else if (currentStep === 'documentType' && selectedDocumentType) {\n if (needsRegion) {\n setCurrentStep('region');\n } else {\n if (selectedCountryCode) {\n finalizeSelection(selectedCountryCode, selectedDocumentType, null);\n }\n }\n } else if (currentStep === 'region' && selectedRegion) {\n if (selectedCountryCode && selectedDocumentType) {\n finalizeSelection(selectedCountryCode, selectedDocumentType, selectedRegion);\n }\n }\n };\n\n // Rendu de l'étape de sélection du pays\n const renderCountrySelection = () => {\n return (\n <>\n <ScrollView style={styles.listContainer} showsVerticalScrollIndicator={false}>\n {availableCountries.map((country: Country & { code?: string }) => (\n <TouchableOpacity\n key={country.code}\n style={[\n styles.option,\n selectedCountryCode === country.code && styles.selectedOption\n ]}\n onPress={() => handleCountrySelect(country.code!)}\n >\n <Text style={styles.flag}>{country.flag}</Text>\n <View style={styles.optionContent}>\n <Text style={[\n styles.optionName,\n selectedCountryCode === country.code && styles.selectedOptionName\n ]}>\n {state.currentLanguage === \"en\" ? country.name_en : country.name}\n </Text>\n <Text style={styles.optionCode}>{country.code}</Text>\n </View>\n {selectedCountryCode === country.code && (\n <View style={[\n styles.checkmark,\n { backgroundColor: component.ui.themeColor as string || '#2DBD60' }\n ]}>\n <Text style={styles.checkmarkText}>✓</Text>\n </View>\n )}\n </TouchableOpacity>\n ))}\n </ScrollView>\n </>\n );\n };\n\n // Rendu de l'étape de sélection du type de document\n const renderDocumentTypeSelection = () => {\n const instructions = selectedDocumentType && idCardConfig?.instructionsByDocumentType?.[selectedDocumentType]\n ? getLocalizedText(idCardConfig.instructionsByDocumentType[selectedDocumentType])\n : null;\n\n // Mapping des labels pour l'affichage\n const documentTypeLabels: Record<string, { en: string; fr: string; icon?: string }> = {\n 'nationalId': { en: 'National ID', fr: 'Carte nationale d\\'identité', icon: '🏛️' },\n 'passport': { en: 'Passport', fr: 'Passeport', icon: '📘' },\n 'driversLicense': { en: 'Driver\\'s License', fr: 'Permis de conduire', icon: '🚗' },\n 'residencePermit': { en: 'Residence Permit', fr: 'Permis de séjour', icon: '🏠' },\n 'healthInsuranceCard': { en: 'Health Insurance Card', fr: 'Carte d\\'assurance maladie', icon: '🗳️' },\n };\n\n return (\n <>\n {instructions && (\n <View style={styles.infoBox}>\n <Text style={styles.infoText}>{instructions}</Text>\n </View>\n )}\n <ScrollView style={styles.listContainer} showsVerticalScrollIndicator={false}>\n {availableDocumentTypes.map((docType: string) => {\n const label = documentTypeLabels[docType];\n const displayName = label ? (state.currentLanguage === \"en\" ? label.en : label.fr) : docType;\n const icon = label?.icon || '📄';\n\n return (\n <TouchableOpacity\n key={docType}\n style={[\n styles.option,\n selectedDocumentType === docType && styles.selectedOption\n ]}\n onPress={() => handleDocumentTypeSelect(docType)}\n >\n <Text style={styles.flag}>{icon}</Text>\n <View style={styles.optionContent}>\n <Text style={[\n styles.optionName,\n selectedDocumentType === docType && styles.selectedOptionName\n ]}>\n {displayName}\n </Text>\n </View>\n {selectedDocumentType === docType && (\n <View style={[\n styles.checkmark,\n { backgroundColor: component.ui.themeColor as string || '#2DBD60' }\n ]}>\n <Text style={styles.checkmarkText}>✓</Text>\n </View>\n )}\n </TouchableOpacity>\n );\n })}\n </ScrollView>\n </>\n );\n };\n\n // Rendu de l'étape de sélection de la région\n const renderRegionSelection = () => {\n return (\n <>\n <ScrollView style={styles.listContainer} showsVerticalScrollIndicator={false}>\n {availableRegions.map((region: string, index: number) => {\n const regionLabel = typeof region === 'string' ? region : String(region);\n return (\n <TouchableOpacity\n key={index}\n style={[\n styles.option,\n selectedRegion === regionLabel && styles.selectedOption\n ]}\n onPress={() => handleRegionSelect(regionLabel)}\n >\n <View style={styles.optionContent}>\n <Text style={[\n styles.optionName,\n selectedRegion === regionLabel && styles.selectedOptionName\n ]}>\n {regionLabel}\n </Text>\n </View>\n {selectedRegion === regionLabel && (\n <View style={[\n styles.checkmark,\n { backgroundColor: component.ui.themeColor as string || '#2DBD60' }\n ]}>\n <Text style={styles.checkmarkText}>✓</Text>\n </View>\n )}\n </TouchableOpacity>\n );\n })}\n </ScrollView>\n </>\n );\n };\n\n // Titres des étapes\n const getStepTitle = (): string => {\n switch (currentStep) {\n case 'country':\n return getLocalizedText(component.labels as LocalizedText);\n case 'documentType':\n return state.currentLanguage === \"en\" ? \"Select Document Type\" : \"Sélectionnez le type de document\";\n case 'region':\n return state.currentLanguage === \"en\" ? \"Select Region\" : \"Sélectionnez la région\";\n default:\n return '';\n }\n };\n\n const getStepDescription = (): string => {\n switch (currentStep) {\n case 'country':\n return getLocalizedText(component.instructions as LocalizedText);\n case 'documentType':\n return state.currentLanguage === \"en\" \n ? \"Choose the type of document you want to use\"\n : \"Choisissez le type de document que vous souhaitez utiliser\";\n case 'region':\n return state.currentLanguage === \"en\"\n ? \"Select your region\"\n : \"Sélectionnez votre région\";\n default:\n return '';\n }\n };\n\n // Indicateur de progression\n const getProgressStep = (): number => {\n if (currentStep === 'country') return 1;\n if (currentStep === 'documentType') return 2;\n return 3;\n };\n\n const getTotalSteps = (): number => {\n return needsRegion ? 3 : 2;\n };\n\n const canGoNext = (): boolean => {\n if (currentStep === 'country') return selectedCountryCode !== null;\n if (currentStep === 'documentType') return selectedDocumentType !== null;\n if (currentStep === 'region') return selectedRegion !== null;\n return false;\n };\n\n return (\n <View style={styles.root}>\n <View style={styles.container}>\n {/* Indicateur de progression */}\n <View style={styles.progressContainer}>\n <Text style={styles.progressText}>\n {state.currentLanguage === \"en\" \n ? `Step ${getProgressStep()} of ${getTotalSteps()}`\n : `Étape ${getProgressStep()} sur ${getTotalSteps()}`}\n </Text>\n </View>\n\n <Text style={styles.title}>{getStepTitle()}</Text>\n <Text style={styles.description}>{getStepDescription()}</Text>\n\n {/* Contenu de l'étape actuelle */}\n {currentStep === 'country' && renderCountrySelection()}\n {currentStep === 'documentType' && renderDocumentTypeSelection()}\n {currentStep === 'region' && renderRegionSelection()}\n\n {/* Boutons de navigation */}\n <View style={styles.buttonContainer}>\n <Button\n title={state.currentLanguage === \"en\" ? \"Back\" : \"Retour\"}\n onPress={handleBack}\n variant={currentStep === 'country' ? \"secondary\" : \"outline\"}\n size=\"large\"\n style={currentStep === 'country' ? { flex: 1 } : { flex: 1, marginRight: 8 }}\n />\n {currentStep !== 'country' && (\n <Button\n title={state.currentLanguage === \"en\" ? \"Next\" : \"Suivant\"}\n onPress={handleNext}\n variant=\"primary\"\n size=\"large\"\n style={{ flex: 1 }}\n disabled={!canGoNext()}\n />\n )}\n </View>\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 maxWidth: 760,\n width: '100%',\n },\n container: {\n backgroundColor: 'white',\n margin: 10,\n borderRadius: 10,\n paddingVertical: 16,\n paddingHorizontal: 16,\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.35,\n shadowRadius: 4.84,\n elevation: 10,\n },\n progressContainer: {\n marginBottom: 16,\n alignItems: 'center',\n },\n progressText: {\n fontSize: 14,\n color: '#666',\n fontWeight: '500',\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 listContainer: {\n maxHeight: 400,\n marginBottom: 24,\n },\n option: {\n flexDirection: 'row',\n alignItems: 'center',\n padding: 16,\n backgroundColor: '#F8F9FA',\n borderRadius: 12,\n marginBottom: 12,\n borderWidth: 2,\n borderColor: '#E9ECEF',\n minHeight: 64,\n },\n selectedOption: {\n borderColor: '#2DBD60',\n backgroundColor: '#F0F9F0',\n },\n flag: {\n fontSize: 32,\n marginRight: 16,\n },\n optionContent: {\n flex: 1,\n },\n optionName: {\n fontSize: 18,\n fontWeight: '600',\n color: '#333',\n },\n selectedOptionName: {\n color: '#2DBD60',\n },\n optionCode: {\n fontSize: 14,\n color: '#666',\n marginTop: 4,\n fontWeight: '500',\n },\n checkmark: {\n width: 24,\n height: 24,\n borderRadius: 12,\n justifyContent: 'center',\n alignItems: 'center',\n },\n checkmarkText: {\n color: 'white',\n fontSize: 16,\n fontWeight: 'bold',\n },\n infoBox: {\n backgroundColor: '#F9FAFB',\n padding: 12,\n borderRadius: 12,\n marginBottom: 16,\n },\n infoText: {\n fontSize: 14,\n color: '#666',\n lineHeight: 20,\n },\n buttonContainer: {\n flexDirection: 'row',\n marginTop: 24,\n gap: 12,\n },\n errorText: {\n color: '#dc2626',\n fontSize: 14,\n marginTop: 8,\n textAlign: 'center',\n },\n});\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { TemplateComponent } from '../../types/KYC.types';
|
|
3
|
+
interface EmailVerificationTemplateProps {
|
|
4
|
+
component: TemplateComponent;
|
|
5
|
+
value?: any;
|
|
6
|
+
onValueChange: (data: any) => void;
|
|
7
|
+
error?: string;
|
|
8
|
+
language?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const EmailVerificationTemplate: React.FC<EmailVerificationTemplateProps>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=EmailVerificationTemplate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmailVerificationTemplate.d.ts","sourceRoot":"","sources":["../../../src/components/KYCElements/EmailVerificationTemplate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,EAAE,iBAAiB,EAAiB,MAAM,uBAAuB,CAAC;AAKzE,UAAU,8BAA8B;IACpC,SAAS,EAAE,iBAAiB,CAAC;IAC7B,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,aAAa,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAID,eAAO,MAAM,yBAAyB,EAAE,KAAK,CAAC,EAAE,CAAC,8BAA8B,CAiK9E,CAAC"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import { View, Text, StyleSheet, TextInput, TouchableOpacity, Alert } from 'react-native';
|
|
3
|
+
import { useTemplateKYCFlowContext } from '../../hooks/useTemplateKYCFlow';
|
|
4
|
+
import { useI18n } from '../../hooks/useI18n';
|
|
5
|
+
import { Button } from '../ui/Button';
|
|
6
|
+
export const EmailVerificationTemplate = ({ component, value, onValueChange, error: propError, }) => {
|
|
7
|
+
const { actions, getLocalizedText } = useTemplateKYCFlowContext();
|
|
8
|
+
const { t } = useI18n();
|
|
9
|
+
// const config = component.config as EmailVerificationConfig; // Keep for future use
|
|
10
|
+
// State
|
|
11
|
+
const [step, setStep] = useState('email');
|
|
12
|
+
const [email, setEmail] = useState('');
|
|
13
|
+
const [otp, setOtp] = useState('');
|
|
14
|
+
const [localError, setLocalError] = useState(null);
|
|
15
|
+
const [isSimulating, setIsSimulating] = useState(false);
|
|
16
|
+
const title = getLocalizedText(component.labels);
|
|
17
|
+
const instructions = getLocalizedText(component.instructions);
|
|
18
|
+
// Determine button text based on step
|
|
19
|
+
const verifyButtonText = getLocalizedText(component.ui.buttonText) || t('common.verify') || 'Verify';
|
|
20
|
+
const sendButtonText = t('common.sendCode') || 'Send Verification Code';
|
|
21
|
+
const buttonText = step === 'email' ? sendButtonText : verifyButtonText;
|
|
22
|
+
const handleSendCode = () => {
|
|
23
|
+
if (!email || !email.includes('@')) {
|
|
24
|
+
setLocalError(t('errors.invalidEmail') || 'Please enter a valid email address');
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
setLocalError(null);
|
|
28
|
+
setIsSimulating(true);
|
|
29
|
+
// Simulate API call to send code
|
|
30
|
+
setTimeout(() => {
|
|
31
|
+
setIsSimulating(false);
|
|
32
|
+
setStep('otp');
|
|
33
|
+
// For demo purposes, we could show an alert or toast here with the code
|
|
34
|
+
// But we'll just expect them to know 123456 or type anything for now if not strict
|
|
35
|
+
}, 1500);
|
|
36
|
+
};
|
|
37
|
+
const handleVerifyCode = () => {
|
|
38
|
+
if (!otp || otp.length < 4) {
|
|
39
|
+
setLocalError(t('errors.invalidCode') || 'Please enter the 6-digit code');
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
setLocalError(null);
|
|
43
|
+
setIsSimulating(true);
|
|
44
|
+
// Simulate verification API
|
|
45
|
+
setTimeout(() => {
|
|
46
|
+
setIsSimulating(false);
|
|
47
|
+
// Mock validation logic
|
|
48
|
+
// Let's accept '123456' as the correct code or any code for testing if strictly requested?
|
|
49
|
+
// User said "verify with error message" implying we should support failure.
|
|
50
|
+
// Let's say if code is "000000" it fails, otherwise success, OR hardcode a success one.
|
|
51
|
+
// User said "verify with error message and next component if is a good one"
|
|
52
|
+
// Let's make "123456" the good one for clarity.
|
|
53
|
+
if (otp === '123456') {
|
|
54
|
+
onValueChange({ email, otp, verified: true });
|
|
55
|
+
actions.nextComponent();
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
setLocalError(t('errors.wrongCode') || 'Invalid verification code. Try 123456');
|
|
59
|
+
}
|
|
60
|
+
}, 1500);
|
|
61
|
+
};
|
|
62
|
+
const onChangeEmail = (text) => {
|
|
63
|
+
setEmail(text);
|
|
64
|
+
if (localError)
|
|
65
|
+
setLocalError(null);
|
|
66
|
+
};
|
|
67
|
+
const onChangeOtp = (text) => {
|
|
68
|
+
setOtp(text);
|
|
69
|
+
if (localError)
|
|
70
|
+
setLocalError(null);
|
|
71
|
+
};
|
|
72
|
+
const handleBackToEmail = () => {
|
|
73
|
+
setStep('email');
|
|
74
|
+
setOtp('');
|
|
75
|
+
setLocalError(null);
|
|
76
|
+
};
|
|
77
|
+
return (<View style={styles.container}>
|
|
78
|
+
<Text style={styles.title}>{title}</Text>
|
|
79
|
+
<Text style={styles.instructions}>
|
|
80
|
+
{step === 'email' ? instructions : (t('kyc.enterCodeSent') || `Please enter the code sent to ${email}`)}
|
|
81
|
+
</Text>
|
|
82
|
+
|
|
83
|
+
<View style={styles.contentContainer}>
|
|
84
|
+
{step === 'email' ? (<View style={styles.inputContainer}>
|
|
85
|
+
<Text style={styles.label}>{t('common.email') || 'Email'}</Text>
|
|
86
|
+
<TextInput style={styles.input} placeholder="name@example.com" value={email} onChangeText={onChangeEmail} keyboardType="email-address" autoCapitalize="none" autoCorrect={false} editable={!isSimulating}/>
|
|
87
|
+
</View>) : (<View style={styles.inputContainer}>
|
|
88
|
+
<Text style={styles.label}>{t('common.verificationCode') || 'Verification Code'}</Text>
|
|
89
|
+
<TextInput style={styles.input} placeholder="123456" value={otp} onChangeText={onChangeOtp} keyboardType="number-pad" maxLength={6} editable={!isSimulating}/>
|
|
90
|
+
<TouchableOpacity onPress={handleBackToEmail} style={styles.changeEmailLink}>
|
|
91
|
+
<Text style={styles.changeEmailText}>{t('common.changeEmail') || 'Change email'}</Text>
|
|
92
|
+
</TouchableOpacity>
|
|
93
|
+
</View>)}
|
|
94
|
+
|
|
95
|
+
{(localError || propError) && (<Text style={styles.errorText}>{localError || propError}</Text>)}
|
|
96
|
+
|
|
97
|
+
<Button title={isSimulating ? (t('common.processing') || 'Processing...') : buttonText} onPress={step === 'email' ? handleSendCode : handleVerifyCode} disabled={isSimulating ||
|
|
98
|
+
(step === 'email' ? !email : !otp)}/>
|
|
99
|
+
|
|
100
|
+
{step === 'otp' && (<TouchableOpacity onPress={() => {
|
|
101
|
+
// Resend logic
|
|
102
|
+
Alert.alert(t('common.codeResent') || 'Code Resent', t('common.codeResentMessage', { email }) || 'Code resent to ' + email);
|
|
103
|
+
}} style={styles.resendButton} disabled={isSimulating}>
|
|
104
|
+
<Text style={styles.resendText}>{t('common.resendCode') || 'Resend Code'}</Text>
|
|
105
|
+
</TouchableOpacity>)}
|
|
106
|
+
</View>
|
|
107
|
+
</View>);
|
|
108
|
+
};
|
|
109
|
+
const styles = StyleSheet.create({
|
|
110
|
+
container: {
|
|
111
|
+
padding: 24,
|
|
112
|
+
backgroundColor: 'white',
|
|
113
|
+
borderRadius: 16,
|
|
114
|
+
margin: 16,
|
|
115
|
+
shadowColor: '#000',
|
|
116
|
+
shadowOffset: { width: 0, height: 4 },
|
|
117
|
+
shadowOpacity: 0.1,
|
|
118
|
+
shadowRadius: 12,
|
|
119
|
+
elevation: 5,
|
|
120
|
+
width: '95%',
|
|
121
|
+
},
|
|
122
|
+
title: {
|
|
123
|
+
fontSize: 24,
|
|
124
|
+
fontWeight: '700',
|
|
125
|
+
marginBottom: 8,
|
|
126
|
+
color: '#1a1a1a',
|
|
127
|
+
textAlign: 'center',
|
|
128
|
+
},
|
|
129
|
+
instructions: {
|
|
130
|
+
fontSize: 16,
|
|
131
|
+
color: '#666',
|
|
132
|
+
marginBottom: 32,
|
|
133
|
+
lineHeight: 24,
|
|
134
|
+
textAlign: 'center',
|
|
135
|
+
},
|
|
136
|
+
contentContainer: {
|
|
137
|
+
// width: '100%',
|
|
138
|
+
},
|
|
139
|
+
inputContainer: {
|
|
140
|
+
marginBottom: 24,
|
|
141
|
+
},
|
|
142
|
+
label: {
|
|
143
|
+
fontSize: 14,
|
|
144
|
+
fontWeight: '600',
|
|
145
|
+
color: '#333',
|
|
146
|
+
marginBottom: 8,
|
|
147
|
+
marginLeft: 4,
|
|
148
|
+
},
|
|
149
|
+
input: {
|
|
150
|
+
borderWidth: 1,
|
|
151
|
+
borderColor: '#e0e0e0',
|
|
152
|
+
padding: 16,
|
|
153
|
+
borderRadius: 12,
|
|
154
|
+
fontSize: 16,
|
|
155
|
+
backgroundColor: '#f8f9fa',
|
|
156
|
+
color: '#333',
|
|
157
|
+
},
|
|
158
|
+
errorText: {
|
|
159
|
+
color: '#dc2626',
|
|
160
|
+
marginBottom: 16,
|
|
161
|
+
fontSize: 14,
|
|
162
|
+
textAlign: 'center',
|
|
163
|
+
backgroundColor: '#fee2e2',
|
|
164
|
+
padding: 8,
|
|
165
|
+
borderRadius: 8,
|
|
166
|
+
overflow: 'hidden',
|
|
167
|
+
},
|
|
168
|
+
button: {
|
|
169
|
+
height: 50,
|
|
170
|
+
borderRadius: 12,
|
|
171
|
+
width: "100%"
|
|
172
|
+
},
|
|
173
|
+
changeEmailLink: {
|
|
174
|
+
alignSelf: 'flex-end',
|
|
175
|
+
marginTop: 8,
|
|
176
|
+
},
|
|
177
|
+
changeEmailText: {
|
|
178
|
+
color: '#2DBD60',
|
|
179
|
+
fontSize: 14,
|
|
180
|
+
fontWeight: '500',
|
|
181
|
+
},
|
|
182
|
+
resendButton: {
|
|
183
|
+
marginTop: 16,
|
|
184
|
+
alignItems: 'center',
|
|
185
|
+
width: "100%"
|
|
186
|
+
},
|
|
187
|
+
resendText: {
|
|
188
|
+
color: '#666',
|
|
189
|
+
fontSize: 14,
|
|
190
|
+
textDecorationLine: 'underline',
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
//# sourceMappingURL=EmailVerificationTemplate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmailVerificationTemplate.js","sourceRoot":"","sources":["../../../src/components/KYCElements/EmailVerificationTemplate.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState } from 'react';\nimport { View, Text, StyleSheet, TextInput, TouchableOpacity, Alert } from 'react-native';\nimport { TemplateComponent, LocalizedText } from '../../types/KYC.types';\nimport { useTemplateKYCFlowContext } from '../../hooks/useTemplateKYCFlow';\nimport { useI18n } from '../../hooks/useI18n';\nimport { Button } from '../ui/Button';\n\ninterface EmailVerificationTemplateProps {\n component: TemplateComponent;\n value?: any;\n onValueChange: (data: any) => void;\n error?: string;\n language?: string;\n}\n\ntype VerificationStep = 'email' | 'otp';\n\nexport const EmailVerificationTemplate: React.FC<EmailVerificationTemplateProps> = ({\n component,\n value,\n onValueChange,\n error: propError,\n}) => {\n const { actions, getLocalizedText } = useTemplateKYCFlowContext();\n const { t } = useI18n();\n // const config = component.config as EmailVerificationConfig; // Keep for future use\n\n // State\n const [step, setStep] = useState<VerificationStep>('email');\n const [email, setEmail] = useState('');\n const [otp, setOtp] = useState('');\n const [localError, setLocalError] = useState<string | null>(null);\n const [isSimulating, setIsSimulating] = useState(false);\n\n const title = getLocalizedText(component.labels as LocalizedText);\n const instructions = getLocalizedText(component.instructions as LocalizedText);\n\n // Determine button text based on step\n const verifyButtonText = getLocalizedText((component.ui as any).buttonText) || t('common.verify') || 'Verify';\n const sendButtonText = t('common.sendCode') || 'Send Verification Code';\n const buttonText = step === 'email' ? sendButtonText : verifyButtonText;\n\n const handleSendCode = () => {\n if (!email || !email.includes('@')) {\n setLocalError(t('errors.invalidEmail') || 'Please enter a valid email address');\n return;\n }\n\n setLocalError(null);\n setIsSimulating(true);\n\n // Simulate API call to send code\n setTimeout(() => {\n setIsSimulating(false);\n setStep('otp');\n // For demo purposes, we could show an alert or toast here with the code\n // But we'll just expect them to know 123456 or type anything for now if not strict\n }, 1500);\n };\n\n const handleVerifyCode = () => {\n if (!otp || otp.length < 4) {\n setLocalError(t('errors.invalidCode') || 'Please enter the 6-digit code');\n return;\n }\n\n setLocalError(null);\n setIsSimulating(true);\n\n // Simulate verification API\n setTimeout(() => {\n setIsSimulating(false);\n\n // Mock validation logic\n // Let's accept '123456' as the correct code or any code for testing if strictly requested?\n // User said \"verify with error message\" implying we should support failure.\n // Let's say if code is \"000000\" it fails, otherwise success, OR hardcode a success one.\n // User said \"verify with error message and next component if is a good one\"\n // Let's make \"123456\" the good one for clarity.\n\n if (otp === '123456') {\n onValueChange({ email, otp, verified: true });\n actions.nextComponent();\n } else {\n setLocalError(t('errors.wrongCode') || 'Invalid verification code. Try 123456');\n }\n }, 1500);\n };\n\n const onChangeEmail = (text: string) => {\n setEmail(text);\n if (localError) setLocalError(null);\n };\n\n const onChangeOtp = (text: string) => {\n setOtp(text);\n if (localError) setLocalError(null);\n };\n\n const handleBackToEmail = () => {\n setStep('email');\n setOtp('');\n setLocalError(null);\n };\n\n return (\n <View style={styles.container}>\n <Text style={styles.title}>{title}</Text>\n <Text style={styles.instructions}>\n {step === 'email' ? instructions : (t('kyc.enterCodeSent') || `Please enter the code sent to ${email}`)}\n </Text>\n\n <View style={styles.contentContainer}>\n {step === 'email' ? (\n <View style={styles.inputContainer}>\n <Text style={styles.label}>{t('common.email') || 'Email'}</Text>\n <TextInput\n style={styles.input}\n placeholder=\"name@example.com\"\n value={email}\n onChangeText={onChangeEmail}\n keyboardType=\"email-address\"\n autoCapitalize=\"none\"\n autoCorrect={false}\n editable={!isSimulating}\n />\n </View>\n ) : (\n <View style={styles.inputContainer}>\n <Text style={styles.label}>{t('common.verificationCode') || 'Verification Code'}</Text>\n <TextInput\n style={styles.input}\n placeholder=\"123456\"\n value={otp}\n onChangeText={onChangeOtp}\n keyboardType=\"number-pad\"\n maxLength={6}\n editable={!isSimulating}\n />\n <TouchableOpacity onPress={handleBackToEmail} style={styles.changeEmailLink}>\n <Text style={styles.changeEmailText}>{t('common.changeEmail') || 'Change email'}</Text>\n </TouchableOpacity>\n </View>\n )}\n\n {(localError || propError) && (\n <Text style={styles.errorText}>{localError || propError}</Text>\n )}\n\n <Button\n title={isSimulating ? (t('common.processing') || 'Processing...') : buttonText}\n onPress={step === 'email' ? handleSendCode : handleVerifyCode}\n\n\n disabled={\n isSimulating ||\n (step === 'email' ? !email : !otp)\n }\n />\n\n {step === 'otp' && (\n <TouchableOpacity\n onPress={() => {\n // Resend logic\n Alert.alert(\n t('common.codeResent') || 'Code Resent',\n t('common.codeResentMessage', { email }) || 'Code resent to ' + email\n );\n }}\n style={styles.resendButton}\n disabled={isSimulating}\n >\n <Text style={styles.resendText}>{t('common.resendCode') || 'Resend Code'}</Text>\n </TouchableOpacity>\n )}\n </View>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n padding: 24,\n backgroundColor: 'white',\n borderRadius: 16,\n margin: 16,\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 4 },\n shadowOpacity: 0.1,\n shadowRadius: 12,\n elevation: 5,\n width: '95%',\n },\n title: {\n fontSize: 24,\n fontWeight: '700',\n marginBottom: 8,\n color: '#1a1a1a',\n textAlign: 'center',\n },\n instructions: {\n fontSize: 16,\n color: '#666',\n marginBottom: 32,\n lineHeight: 24,\n textAlign: 'center',\n },\n contentContainer: {\n // width: '100%',\n },\n inputContainer: {\n marginBottom: 24,\n },\n label: {\n fontSize: 14,\n fontWeight: '600',\n color: '#333',\n marginBottom: 8,\n marginLeft: 4,\n },\n input: {\n borderWidth: 1,\n borderColor: '#e0e0e0',\n padding: 16,\n borderRadius: 12,\n fontSize: 16,\n backgroundColor: '#f8f9fa',\n color: '#333',\n },\n errorText: {\n color: '#dc2626',\n marginBottom: 16,\n fontSize: 14,\n textAlign: 'center',\n backgroundColor: '#fee2e2',\n padding: 8,\n borderRadius: 8,\n overflow: 'hidden',\n },\n button: {\n height: 50,\n borderRadius: 12,\n width: \"100%\"\n },\n changeEmailLink: {\n alignSelf: 'flex-end',\n marginTop: 8,\n },\n changeEmailText: {\n color: '#2DBD60',\n fontSize: 14,\n fontWeight: '500',\n },\n resendButton: {\n marginTop: 16,\n alignItems: 'center',\n width: \"100%\"\n },\n resendText: {\n color: '#666',\n fontSize: 14,\n textDecorationLine: 'underline',\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileUpload.d.ts","sourceRoot":"","sources":["../../../src/components/KYCElements/FileUpload.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"FileUpload.d.ts","sourceRoot":"","sources":["../../../src/components/KYCElements/FileUpload.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAKxC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,UAAU,eAAe;IACvB,OAAO,EAAE,UAAU,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAQD,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAuJhD,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React, { useState } from 'react';
|
|
2
|
-
import { View, Text, TouchableOpacity, StyleSheet, ScrollView, Image
|
|
2
|
+
import { View, Text, TouchableOpacity, StyleSheet, ScrollView, Image } from 'react-native';
|
|
3
|
+
import { showAlert } from '../../utils/platformAlert';
|
|
3
4
|
import { useKYCStore } from '../../stores/kycStore';
|
|
4
5
|
import NativeCameraModule from '../../modules/camera/NativeCameraModule';
|
|
5
6
|
export const FileUpload = ({ element, value = [], onValueChange, error, }) => {
|
|
@@ -26,7 +27,7 @@ export const FileUpload = ({ element, value = [], onValueChange, error, }) => {
|
|
|
26
27
|
};
|
|
27
28
|
// Vérifier le nombre maximum de fichiers
|
|
28
29
|
if (uploadedFiles.length >= uploadConfig.maxFiles) {
|
|
29
|
-
|
|
30
|
+
showAlert('Limite atteinte', `Vous ne pouvez sélectionner que ${uploadConfig.maxFiles} fichiers maximum.`);
|
|
30
31
|
return;
|
|
31
32
|
}
|
|
32
33
|
const updatedFiles = [...uploadedFiles, newFile];
|
|
@@ -34,12 +35,12 @@ export const FileUpload = ({ element, value = [], onValueChange, error, }) => {
|
|
|
34
35
|
onValueChange(updatedFiles.map(file => file.uri));
|
|
35
36
|
}
|
|
36
37
|
else if (result.error) {
|
|
37
|
-
|
|
38
|
+
showAlert('Erreur', result.error);
|
|
38
39
|
}
|
|
39
40
|
}
|
|
40
41
|
catch (error) {
|
|
41
42
|
console.error('Erreur lors de la sélection de fichiers:', error);
|
|
42
|
-
|
|
43
|
+
showAlert('Erreur', 'Impossible de sélectionner le fichier');
|
|
43
44
|
}
|
|
44
45
|
finally {
|
|
45
46
|
setIsUploading(false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileUpload.js","sourceRoot":"","sources":["../../../src/components/KYCElements/FileUpload.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAClG,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,kBAAkB,MAAM,yCAAyC,CAAC;AAgBzE,MAAM,CAAC,MAAM,UAAU,GAA8B,CAAC,EACpD,OAAO,EACP,KAAK,GAAG,EAAE,EACV,aAAa,EACb,KAAK,GACN,EAAE,EAAE;IACH,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAiB,EAAE,CAAC,CAAC;IACvE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,EAAE,aAAa,EAAE,GAAG,WAAW,EAAE,CAAC;IAExC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI;QAC3C,YAAY,EAAE,CAAC,SAAS,EAAE,iBAAiB,CAAC;QAC5C,QAAQ,EAAE,CAAC;QACX,WAAW,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO;QACtC,aAAa,EAAE,IAAI;KACpB,CAAC;IAEF,MAAM,YAAY,GAAG,KAAK,IAAI,EAAE;QAC9B,IAAI,CAAC;YACH,cAAc,CAAC,IAAI,CAAC,CAAC;YACrB,aAAa,CAAC,IAAI,CAAC,CAAC;YAEpB,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,cAAc,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;YAElF,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,UAAU,CAAC;gBAC5D,MAAM,OAAO,GAAG;oBACd,GAAG,EAAE,MAAM,CAAC,GAAG;oBACf,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,IAAI,EAAE,QAAQ;iBACf,CAAC;gBAEF,yCAAyC;gBACzC,IAAI,aAAa,CAAC,MAAM,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;oBAClD,KAAK,CAAC,KAAK,CAAC,iBAAiB,EAAE,mCAAmC,YAAY,CAAC,QAAQ,oBAAoB,CAAC,CAAC;oBAC7G,OAAO;gBACT,CAAC;gBAED,MAAM,YAAY,GAAG,CAAC,GAAG,aAAa,EAAE,OAAO,CAAC,CAAC;gBACjD,gBAAgB,CAAC,YAAY,CAAC,CAAC;gBAC/B,aAAa,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACpD,CAAC;iBAAM,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACxB,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,KAAK,CAAC,CAAC;YACjE,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,uCAAuC,CAAC,CAAC;QACjE,CAAC;gBAAS,CAAC;YACT,cAAc,CAAC,KAAK,CAAC,CAAC;YACtB,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,EAAE;QACnC,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;QACjE,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAC/B,aAAa,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,QAAgB,EAAE,EAAE;QACvC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC;QAC3D,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,KAAK;gBACR,OAAO,IAAI,CAAC;YACd,KAAK,KAAK,CAAC;YACX,KAAK,MAAM,CAAC;YACZ,KAAK,KAAK,CAAC;YACX,KAAK,KAAK;gBACR,OAAO,KAAK,CAAC;YACf,KAAK,KAAK,CAAC;YACX,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC;YACd;gBACE,OAAO,IAAI,CAAC;QAChB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,QAAgB,EAAW,EAAE;QAChD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC;QAC3D,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IACzE,CAAC,CAAC;IAEF,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAC5B;MAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,CAChD;MAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,IAAI,CAE5D;;MAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAC7B;QAAA,CAAC,gBAAgB,CACf,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,IAAI,MAAM,CAAC,oBAAoB,CAAC,CAAC,CACzE,OAAO,CAAC,CAAC,YAAY,CAAC,CACtB,QAAQ,CAAC,CAAC,WAAW,CAAC,CAEtB;UAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,IAAI,CACxC;UAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAC7B;YAAA,CAAC,WAAW,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,2BAA2B,CACtE;UAAA,EAAE,IAAI,CACN;UAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAChC;4BAAgB,CAAC,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CACvD;UAAA,EAAE,IAAI,CACN;UAAA,CAAC,YAAY,CAAC,WAAW,IAAI,CAC3B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAChC;0BAAY,CAAC,cAAc,CAAC,YAAY,CAAC,WAAW,CAAC,CACvD;YAAA,EAAE,IAAI,CAAC,CACR,CACH;QAAA,EAAE,gBAAgB,CACpB;MAAA,EAAE,IAAI,CAEN;;MAAA,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,CAC3B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CACjC;UAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,uBAAuB,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAC5G;UAAA,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAClC;YAAA,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAClC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CACvC;gBAAA,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CACxB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,EAAG,CAClE,CAAC,CAAC,CAAC,CACF,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAC3B;oBAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAClE;kBAAA,EAAE,IAAI,CAAC,CACR,CACD;gBAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAC3B;kBAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CACjE;kBAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CACnE;gBAAA,EAAE,IAAI,CACN;gBAAA,CAAC,gBAAgB,CACf,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAC3B,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAEjC;kBAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,IAAI,CAC/C;gBAAA,EAAE,gBAAgB,CACpB;cAAA,EAAE,IAAI,CAAC,CACR,CAAC,CACJ;UAAA,EAAE,UAAU,CACd;QAAA,EAAE,IAAI,CAAC,CACR,CAED;;MAAA,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,IAAI,CAC7B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAC7B;UAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,yBAAyB,EAAE,IAAI,CACnE;UAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CACpC;;UACF,EAAE,IAAI,CACR;QAAA,EAAE,IAAI,CAAC,CACR,CAED;;MAAA,CAAC,KAAK,IAAI,CACR,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAC9C,CACH;IAAA,EAAE,IAAI,CAAC,CACR,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,KAAa,EAAU,EAAE;IAC/C,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAClC,MAAM,CAAC,GAAG,IAAI,CAAC;IACf,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,UAAU,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1E,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,SAAS,EAAE;QACT,IAAI,EAAE,CAAC;QACP,OAAO,EAAE,EAAE;KACZ;IACD,KAAK,EAAE;QACL,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,MAAM;QAClB,KAAK,EAAE,MAAM;QACb,YAAY,EAAE,CAAC;QACf,SAAS,EAAE,QAAQ;KACpB;IACD,WAAW,EAAE;QACX,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,QAAQ;QACnB,YAAY,EAAE,EAAE;QAChB,UAAU,EAAE,EAAE;KACf;IACD,UAAU,EAAE;QACV,YAAY,EAAE,EAAE;KACjB;IACD,YAAY,EAAE;QACZ,WAAW,EAAE,CAAC;QACd,WAAW,EAAE,SAAS;QACtB,WAAW,EAAE,QAAQ;QACrB,YAAY,EAAE,EAAE;QAChB,OAAO,EAAE,EAAE;QACX,UAAU,EAAE,QAAQ;QACpB,eAAe,EAAE,SAAS;KAC3B;IACD,oBAAoB,EAAE;QACpB,OAAO,EAAE,GAAG;KACb;IACD,UAAU,EAAE;QACV,QAAQ,EAAE,EAAE;QACZ,YAAY,EAAE,EAAE;KACjB;IACD,UAAU,EAAE;QACV,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,KAAK;QACjB,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE,CAAC;KAChB;IACD,aAAa,EAAE;QACb,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,QAAQ;KACpB;IACD,cAAc,EAAE;QACd,IAAI,EAAE,CAAC;KACR;IACD,UAAU,EAAE;QACV,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,KAAK;QACjB,KAAK,EAAE,MAAM;QACb,YAAY,EAAE,EAAE;KACjB;IACD,SAAS,EAAE;QACT,IAAI,EAAE,CAAC;KACR;IACD,QAAQ,EAAE;QACR,aAAa,EAAE,KAAK;QACpB,UAAU,EAAE,QAAQ;QACpB,OAAO,EAAE,EAAE;QACX,eAAe,EAAE,OAAO;QACxB,YAAY,EAAE,CAAC;QACf,YAAY,EAAE,CAAC;QACf,WAAW,EAAE,CAAC;QACd,WAAW,EAAE,SAAS;KACvB;IACD,aAAa,EAAE;QACb,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,EAAE;QACV,YAAY,EAAE,CAAC;QACf,WAAW,EAAE,EAAE;KAChB;IACD,QAAQ,EAAE;QACR,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,EAAE;QACV,YAAY,EAAE,CAAC;QACf,eAAe,EAAE,SAAS;QAC1B,cAAc,EAAE,QAAQ;QACxB,UAAU,EAAE,QAAQ;QACpB,WAAW,EAAE,EAAE;KAChB;IACD,YAAY,EAAE;QACZ,QAAQ,EAAE,EAAE;KACb;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,CAAC;KACR;IACD,QAAQ,EAAE;QACR,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,KAAK;QACjB,KAAK,EAAE,MAAM;KACd;IACD,QAAQ,EAAE;QACR,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,CAAC;KACb;IACD,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,EAAE;QACV,YAAY,EAAE,EAAE;QAChB,eAAe,EAAE,SAAS;QAC1B,cAAc,EAAE,QAAQ;QACxB,UAAU,EAAE,QAAQ;KACrB;IACD,gBAAgB,EAAE;QAChB,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,MAAM;KACnB;IACD,UAAU,EAAE;QACV,IAAI,EAAE,CAAC;QACP,cAAc,EAAE,QAAQ;QACxB,UAAU,EAAE,QAAQ;KACrB;IACD,cAAc,EAAE;QACd,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,MAAM;QACb,YAAY,EAAE,EAAE;KACjB;IACD,iBAAiB,EAAE;QACjB,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,QAAQ;KACpB;IACD,SAAS,EAAE;QACT,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,EAAE;QACZ,SAAS,EAAE,CAAC;QACZ,SAAS,EAAE,QAAQ;KACpB;CACF,CAAC,CAAC","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 { KYCElement } from '../../types/KYC.types';\n\ninterface FileUploadProps {\n element: KYCElement;\n value?: string[];\n onValueChange: (value: string[]) => void;\n error?: string;\n}\n\ninterface UploadedFile {\n uri: string;\n path: string;\n name: string;\n}\n\nexport const FileUpload: React.FC<FileUploadProps> = ({\n element,\n value = [],\n onValueChange,\n error,\n}) => {\n const [uploadedFiles, setUploadedFiles] = useState<UploadedFile[]>([]);\n const [isUploading, setIsUploading] = useState(false);\n const { setProcessing } = useKYCStore();\n\n const uploadConfig = element.uploadConfig || {\n allowedTypes: ['image/*', 'application/pdf'],\n maxFiles: 3,\n maxFileSize: 10 * 1024 * 1024, // 10MB\n allowMultiple: true,\n };\n\n const pickDocument = async () => {\n try {\n setIsUploading(true);\n setProcessing(true);\n\n const result = await NativeCameraModule.openFilePicker(uploadConfig.allowedTypes);\n \n if (result.success && result.uri && result.path) {\n const fileName = result.path.split('/').pop() || 'Document';\n const newFile = {\n uri: result.uri,\n path: result.path,\n name: fileName\n };\n\n // Vérifier le nombre maximum de fichiers\n if (uploadedFiles.length >= uploadConfig.maxFiles) {\n Alert.alert('Limite atteinte', `Vous ne pouvez sélectionner que ${uploadConfig.maxFiles} fichiers maximum.`);\n return;\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 return (\n <View style={styles.container}>\n <Text style={styles.title}>{element.title}</Text>\n <Text style={styles.description}>{element.description}</Text>\n \n <View style={styles.uploadArea}>\n <TouchableOpacity \n style={[styles.uploadButton, isUploading && styles.uploadButtonDisabled]}\n onPress={pickDocument}\n disabled={isUploading}\n >\n <Text style={styles.uploadIcon}>📁</Text>\n <Text style={styles.uploadText}>\n {isUploading ? 'Sélection en cours...' : 'Sélectionner des fichiers'}\n </Text>\n <Text style={styles.uploadSubtext}>\n Types acceptés: {uploadConfig.allowedTypes.join(', ')}\n </Text>\n {uploadConfig.maxFileSize && (\n <Text style={styles.uploadSubtext}>\n Taille max: {formatFileSize(uploadConfig.maxFileSize)}\n </Text>\n )}\n </TouchableOpacity>\n </View>\n\n {uploadedFiles.length > 0 && (\n <View style={styles.filesContainer}>\n <Text style={styles.filesTitle}>Fichiers sélectionnés ({uploadedFiles.length}/{uploadConfig.maxFiles})</Text>\n <ScrollView style={styles.filesList}>\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.filePath} numberOfLines={1}>{file.path}</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 {uploadedFiles.length === 0 && (\n <View style={styles.emptyState}>\n <Text style={styles.emptyStateText}>Aucun fichier sélectionné</Text>\n <Text style={styles.emptyStateSubtext}>\n Appuyez sur \"Sélectionner des fichiers\" pour commencer\n </Text>\n </View>\n )}\n\n {error && (\n <Text style={styles.errorText}>{error}</Text>\n )}\n </View>\n );\n};\n\nconst 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\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 borderColor: '#4CAF50',\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 color: '#4CAF50',\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 },\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 filePath: {\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 errorText: {\n color: '#dc2626',\n fontSize: 14,\n marginTop: 8,\n textAlign: 'center',\n },\n}); "]}
|
|
1
|
+
{"version":3,"file":"FileUpload.js","sourceRoot":"","sources":["../../../src/components/KYCElements/FileUpload.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState } from 'react';\nimport { View, Text, TouchableOpacity, StyleSheet, ScrollView, Image } from 'react-native';\nimport { showAlert } from '../../utils/platformAlert';\nimport { useKYCStore } from '../../stores/kycStore';\nimport NativeCameraModule from '../../modules/camera/NativeCameraModule';\nimport { KYCElement } from '../../types/KYC.types';\n\ninterface FileUploadProps {\n element: KYCElement;\n value?: string[];\n onValueChange: (value: string[]) => void;\n error?: string;\n}\n\ninterface UploadedFile {\n uri: string;\n path: string;\n name: string;\n}\n\nexport const FileUpload: React.FC<FileUploadProps> = ({\n element,\n value = [],\n onValueChange,\n error,\n}) => {\n const [uploadedFiles, setUploadedFiles] = useState<UploadedFile[]>([]);\n const [isUploading, setIsUploading] = useState(false);\n const { setProcessing } = useKYCStore();\n\n const uploadConfig = element.uploadConfig || {\n allowedTypes: ['image/*', 'application/pdf'],\n maxFiles: 3,\n maxFileSize: 10 * 1024 * 1024, // 10MB\n allowMultiple: true,\n };\n\n const pickDocument = async () => {\n try {\n setIsUploading(true);\n setProcessing(true);\n\n const result = await NativeCameraModule.openFilePicker(uploadConfig.allowedTypes);\n \n if (result.success && result.uri && result.path) {\n const fileName = result.path.split('/').pop() || 'Document';\n const newFile = {\n uri: result.uri,\n path: result.path,\n name: fileName\n };\n\n // Vérifier le nombre maximum de fichiers\n if (uploadedFiles.length >= uploadConfig.maxFiles) {\n showAlert('Limite atteinte', `Vous ne pouvez sélectionner que ${uploadConfig.maxFiles} fichiers maximum.`);\n return;\n }\n\n const updatedFiles = [...uploadedFiles, newFile];\n setUploadedFiles(updatedFiles);\n onValueChange(updatedFiles.map(file => file.uri));\n } else if (result.error) {\n showAlert('Erreur', result.error);\n }\n } catch (error) {\n console.error('Erreur lors de la sélection de fichiers:', error);\n showAlert('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 return (\n <View style={styles.container}>\n <Text style={styles.title}>{element.title}</Text>\n <Text style={styles.description}>{element.description}</Text>\n \n <View style={styles.uploadArea}>\n <TouchableOpacity \n style={[styles.uploadButton, isUploading && styles.uploadButtonDisabled]}\n onPress={pickDocument}\n disabled={isUploading}\n >\n <Text style={styles.uploadIcon}>📁</Text>\n <Text style={styles.uploadText}>\n {isUploading ? 'Sélection en cours...' : 'Sélectionner des fichiers'}\n </Text>\n <Text style={styles.uploadSubtext}>\n Types acceptés: {uploadConfig.allowedTypes.join(', ')}\n </Text>\n {uploadConfig.maxFileSize && (\n <Text style={styles.uploadSubtext}>\n Taille max: {formatFileSize(uploadConfig.maxFileSize)}\n </Text>\n )}\n </TouchableOpacity>\n </View>\n\n {uploadedFiles.length > 0 && (\n <View style={styles.filesContainer}>\n <Text style={styles.filesTitle}>Fichiers sélectionnés ({uploadedFiles.length}/{uploadConfig.maxFiles})</Text>\n <ScrollView style={styles.filesList}>\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.filePath} numberOfLines={1}>{file.path}</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 {uploadedFiles.length === 0 && (\n <View style={styles.emptyState}>\n <Text style={styles.emptyStateText}>Aucun fichier sélectionné</Text>\n <Text style={styles.emptyStateSubtext}>\n Appuyez sur \"Sélectionner des fichiers\" pour commencer\n </Text>\n </View>\n )}\n\n {error && (\n <Text style={styles.errorText}>{error}</Text>\n )}\n </View>\n );\n};\n\nconst 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\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 borderColor: '#4CAF50',\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 color: '#4CAF50',\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 },\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 filePath: {\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 errorText: {\n color: '#dc2626',\n fontSize: 14,\n marginTop: 8,\n textAlign: 'center',\n },\n}); "]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileUploadTemplate.d.ts","sourceRoot":"","sources":["../../../src/components/KYCElements/FileUploadTemplate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"FileUploadTemplate.d.ts","sourceRoot":"","sources":["../../../src/components/KYCElements/FileUploadTemplate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAMxC,OAAO,EAAE,iBAAiB,EAAmC,MAAM,uBAAuB,CAAC;AAE3F,UAAU,uBAAuB;IAC/B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AASD,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAmNhE,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React, { useState } from 'react';
|
|
2
|
-
import { View, Text, TouchableOpacity, StyleSheet, ScrollView, Image
|
|
2
|
+
import { View, Text, TouchableOpacity, StyleSheet, ScrollView, Image } from 'react-native';
|
|
3
|
+
import { showAlert } from '../../utils/platformAlert';
|
|
3
4
|
import { useKYCStore } from '../../stores/kycStore';
|
|
4
5
|
import NativeCameraModule from '../../modules/camera/NativeCameraModule';
|
|
5
6
|
import { useI18n } from '../../hooks/useI18n';
|
|
@@ -37,7 +38,7 @@ export const FileUploadTemplate = ({ component, value = [], onValueChange, error
|
|
|
37
38
|
// Note: La propriété size peut ne pas être disponible selon la plateforme
|
|
38
39
|
const fileSize = result.size || 0;
|
|
39
40
|
if (fileSize > maxSizeBytes) {
|
|
40
|
-
|
|
41
|
+
showAlert('Fichier trop volumineux', `La taille maximale autorisée est ${config.max_size_mb} MB.`);
|
|
41
42
|
return;
|
|
42
43
|
}
|
|
43
44
|
const newFile = {
|
|
@@ -51,12 +52,12 @@ export const FileUploadTemplate = ({ component, value = [], onValueChange, error
|
|
|
51
52
|
onValueChange(updatedFiles.map(file => file.uri));
|
|
52
53
|
}
|
|
53
54
|
else if (result.error) {
|
|
54
|
-
|
|
55
|
+
showAlert('Erreur', result.error);
|
|
55
56
|
}
|
|
56
57
|
}
|
|
57
58
|
catch (error) {
|
|
58
59
|
console.error('Erreur lors de la sélection de fichiers:', error);
|
|
59
|
-
|
|
60
|
+
showAlert('Erreur', 'Impossible de sélectionner le fichier');
|
|
60
61
|
}
|
|
61
62
|
finally {
|
|
62
63
|
setIsUploading(false);
|