@transfergratis/react-native-sdk 0.1.24 → 0.1.26
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 +22 -7
- package/build/components/EnhancedCameraView.web.d.ts.map +1 -1
- package/build/components/EnhancedCameraView.web.js +76 -21
- 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/EmailVerificationTemplate.d.ts +12 -0
- package/build/components/KYCElements/EmailVerificationTemplate.d.ts.map +1 -0
- package/build/components/KYCElements/EmailVerificationTemplate.js +212 -0
- package/build/components/KYCElements/EmailVerificationTemplate.js.map +1 -0
- package/build/components/KYCElements/IDCardCapture.d.ts.map +1 -1
- package/build/components/KYCElements/IDCardCapture.js +216 -14
- package/build/components/KYCElements/IDCardCapture.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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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/SelfieCaptureTemplate.d.ts.map +1 -1
- package/build/components/KYCElements/SelfieCaptureTemplate.js +7 -3
- package/build/components/KYCElements/SelfieCaptureTemplate.js.map +1 -1
- package/build/components/KYCElements/WelcomeTemplate.js +2 -1
- package/build/components/KYCElements/WelcomeTemplate.js.map +1 -1
- package/build/components/OverLay/type.d.ts +2 -0
- 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 +10 -0
- package/build/components/TemplateKYCExample.d.ts.map +1 -1
- package/build/components/TemplateKYCExample.js +7 -30
- package/build/components/TemplateKYCExample.js.map +1 -1
- package/build/components/TemplateKYCFlowRefactored.d.ts +12 -0
- package/build/components/TemplateKYCFlowRefactored.d.ts.map +1 -1
- package/build/components/TemplateKYCFlowRefactored.js +25 -3
- package/build/components/TemplateKYCFlowRefactored.js.map +1 -1
- 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.map +1 -1
- package/build/config/allowedDomains.js +4 -19
- package/build/config/allowedDomains.js.map +1 -1
- 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 +18 -1
- package/build/hooks/useTemplateKYCFlow.d.ts.map +1 -1
- package/build/hooks/useTemplateKYCFlow.js +410 -56
- package/build/hooks/useTemplateKYCFlow.js.map +1 -1
- package/build/i18n/en/index.d.ts +42 -0
- package/build/i18n/en/index.d.ts.map +1 -1
- package/build/i18n/en/index.js +44 -2
- package/build/i18n/en/index.js.map +1 -1
- package/build/i18n/fr/index.d.ts +28 -0
- package/build/i18n/fr/index.d.ts.map +1 -1
- package/build/i18n/fr/index.js +30 -2
- package/build/i18n/fr/index.js.map +1 -1
- package/build/i18n/types.d.ts +2 -0
- package/build/i18n/types.d.ts.map +1 -1
- package/build/i18n/types.js.map +1 -1
- package/build/index.d.ts +1 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +2 -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 +90 -12
- package/build/modules/api/CardAuthentification.js.map +1 -1
- package/build/modules/api/KYCService.d.ts +17 -7
- package/build/modules/api/KYCService.d.ts.map +1 -1
- package/build/modules/api/KYCService.js +125 -37
- 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 +0 -1
- package/build/modules/api/TemplateService.d.ts.map +1 -1
- package/build/modules/api/TemplateService.js +3 -3
- package/build/modules/api/TemplateService.js.map +1 -1
- package/build/modules/camera/VisionCameraModule.web.d.ts.map +1 -1
- package/build/modules/camera/VisionCameraModule.web.js +27 -8
- package/build/modules/camera/VisionCameraModule.web.js.map +1 -1
- package/build/types/KYC.types.d.ts +130 -5
- package/build/types/KYC.types.d.ts.map +1 -1
- 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 +7 -0
- package/build/utils/cropByObb.d.ts.map +1 -1
- package/build/utils/cropByObb.js +20 -1
- 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.map +1 -1
- package/build/utils/platformAlert.js.map +1 -1
- package/build/utils/template-transformer.d.ts.map +1 -1
- package/build/utils/template-transformer.js +12 -0
- package/build/utils/template-transformer.js.map +1 -1
- package/build/web/WebKYCEntry.d.ts.map +1 -1
- package/build/web/WebKYCEntry.js +88 -38
- package/build/web/WebKYCEntry.js.map +1 -1
- package/package.json +1 -1
- package/plugin/build/index.d.ts +1 -0
- package/plugin/build/index.js +3 -1
- package/plugin/build/withRemovePermissions.d.ts +3 -0
- package/plugin/build/withRemovePermissions.js +67 -0
- package/plugin/build/withVisionCamera.js +3 -4
- package/plugin/src/index.ts +2 -1
- package/plugin/src/withRemovePermissions.js +85 -0
- package/plugin/src/withRemovePermissions.ts +83 -0
- package/plugin/src/withVisionCamera.js +3 -4
- package/plugin/src/withVisionCamera.ts +3 -4
- package/plugin/tsconfig.tsbuildinfo +1 -1
- package/plugin.js +6 -1
- package/src/components/EnhancedCameraView.web.tsx +76 -21
- package/src/components/KYCElements/AdditionalDocumentsTemplate.tsx +346 -0
- package/src/components/KYCElements/EmailVerificationTemplate.tsx +278 -0
- package/src/components/KYCElements/IDCardCapture.tsx +253 -21
- package/src/components/KYCElements/OrientationVideoCapture.tsx +4 -1
- package/src/components/KYCElements/OrientationVideoCaptureEnhanced.tsx +4 -1
- package/src/components/KYCElements/OrientationVideoCaptureFinal.tsx +4 -1
- package/src/components/KYCElements/PersonalInformationTemplate.tsx +158 -0
- package/src/components/KYCElements/PhoneVerificationTemplate.tsx +253 -0
- package/src/components/KYCElements/SelfieCaptureTemplate.tsx +6 -3
- package/src/components/KYCElements/WelcomeTemplate.tsx +2 -1
- package/src/components/OverLay/type.ts +2 -0
- package/src/components/TemplateKYCExample.tsx +35 -46
- package/src/components/TemplateKYCFlowRefactored.tsx +46 -2
- package/src/config/KYCConfig.ts +34 -0
- package/src/config/allowedDomains.ts +7 -26
- package/src/hooks/useOrientationVideo.ts +5 -4
- package/src/hooks/useTemplateKYCFlow.tsx +443 -56
- package/src/i18n/en/index.ts +46 -3
- package/src/i18n/fr/index.ts +31 -2
- package/src/i18n/types.ts +2 -0
- package/src/index.ts +3 -0
- package/src/modules/api/CardAuthentification.ts +98 -12
- package/src/modules/api/KYCService.ts +158 -37
- package/src/modules/api/SelfieVerification.ts +25 -3
- package/src/modules/api/TemplateService.ts +4 -4
- package/src/modules/camera/VisionCameraModule.web.ts +30 -12
- package/src/types/KYC.types.ts +153 -6
- package/src/types/env.types.ts +13 -0
- package/src/utils/cropByObb.ts +20 -1
- package/src/utils/deviceDetection.ts +11 -0
- package/src/utils/platformAlert.ts +1 -0
- package/src/utils/template-transformer.ts +20 -8
- package/src/web/WebKYCEntry.tsx +123 -61
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KYC.types.js","sourceRoot":"","sources":["../../src/types/KYC.types.ts"],"names":[],"mappings":"AA8UA,MAAM,CAAC,MAAM,6BAA6B,GAA2C;IACnF,aAAa,EAAE,IAAI;IACnB,QAAQ,EAAE,IAAI;IACd,eAAe,EAAE,IAAI;IACrB,qBAAqB,EAAE,KAAK;IAC5B,mBAAmB,EAAE,IAAI;IACzB,WAAW,EAAE,IAAI;IACjB,WAAW,EAAE,IAAI;IACjB,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,IAAI;IACR,GAAG,EAAE,KAAK;IACV,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,IAAI;CACT,CAAA;AAED,MAAM,CAAC,MAAM,6BAA6B,GAA2C;IACnF,WAAW,EAAE,eAAe;IAC5B,QAAQ,EAAE,UAAU;IACpB,cAAc,EAAE,iBAAiB;IACjC,mBAAmB,EAAE,uBAAuB;IAC5C,kBAAkB,EAAE,qBAAqB;IACzC,UAAU,EAAE,aAAa;IACzB,eAAe,EAAE,qBAAqB;CACvC,CAAA","sourcesContent":["import { VerificationResult } from \"../modules/api/types\";\n\n// Types pour les documents\nexport interface Document {\n id: string;\n type: DocumentType;\n imageUri: string;\n uploadedAt: Date;\n validated: boolean;\n extractedData?: DocumentData;\n}\n\nexport type DocumentType = 'passport' | 'id_card' | 'drivers_license';\n\nexport interface DocumentData {\n firstName?: string;\n lastName?: string;\n dateOfBirth?: string;\n documentNumber?: string;\n expiryDate?: string;\n nationality?: string;\n}\n\n// Types pour les selfies\nexport interface Selfie {\n id: string;\n imageUri: string;\n capturedAt: Date;\n validated: boolean;\n faceDetected: boolean;\n}\n\n// Types pour la session KYC\nexport interface KYCSession {\n id: string;\n userId: string;\n status: KYCStatus;\n currentStep: number;\n documents: Document[];\n selfie?: Selfie;\n verificationId?: string;\n createdAt: Date;\n updatedAt: Date;\n completedAt?: Date;\n}\n\nexport type KYCStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'rejected';\n\n// Types pour les étapes du processus\nexport interface KYCStep {\n id: number;\n title: string;\n description: string;\n isCompleted: boolean;\n isRequired: boolean;\n}\n\n// Types pour les erreurs\nexport interface KYCError {\n code: string;\n message: string;\n field?: string;\n details?: any;\n}\n\n// Types pour les réponses API\nexport interface KYCResponse {\n success: boolean;\n data?: any;\n error?: KYCError;\n message?: string;\n}\n\n// Types pour les événements\nexport interface KYCEvent {\n type: 'step_completed' | 'document_uploaded' | 'selfie_captured' | 'verification_started' | 'verification_completed';\n timestamp: Date;\n data?: any;\n}\n\n// Types pour les configurations\nexport interface KYCConfig {\n apiBaseUrl: string;\n apiKey: string;\n timeout: number;\n retryAttempts: number;\n enableDebug: boolean;\n}\n\n// Types pour les hooks\nexport interface UseKYCReturn {\n session: KYCSession | null;\n currentStep: number;\n isProcessing: boolean;\n error: KYCError | null;\n startSession: (userId: string) => void;\n nextStep: () => void;\n previousStep: () => void;\n uploadDocument: (document: Document) => Promise<void>;\n captureSelfie: (selfie: Selfie) => Promise<void>;\n submitVerification: () => Promise<void>;\n resetSession: () => void;\n}\n\n// ===== NOUVEAUX TYPES POUR CONFIGURATION AUTOMATIQUE =====\n\n// Types d'éléments KYC configurables\nexport type KYCElementType =\n | 'country_selection'\n | 'document_type_selection'\n | 'camera_capture'\n | 'file_upload'\n | 'selfie_capture'\n | 'verification'\n | 'completion';\n//KYCElementType shorted\n\n\n// Configuration d'un élément KYC\nexport interface KYCElement {\n id: string;\n type: KYCElementType;\n title: string;\n description: string;\n isRequired: boolean;\n isVisible: boolean;\n order: number;\n validation?: KYCValidation;\n options?: KYCElementOption[];\n cameraConfig?: KYCCameraConfig;\n uploadConfig?: KYCUploadConfig;\n}\n\n// Options pour les éléments de sélection\nexport interface KYCElementOption {\n value: string;\n label: string;\n icon?: string;\n description?: string;\n}\n\n// Configuration de validation\nexport interface KYCValidation {\n required: boolean;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n customValidator?: (value: any) => boolean | string;\n}\n\n// Configuration de la caméra\nexport interface KYCCameraConfig {\n aspectRatio?: number;\n quality?: number;\n flashMode?: 'on' | 'off' | 'auto';\n cameraType?: 'front' | 'back';\n allowRetake: boolean;\n maxRetakes?: number;\n overlay?: {\n showGuide: boolean;\n guideText?: string;\n guideImage?: string;\n };\n}\n\n// Configuration d'upload\nexport interface KYCUploadConfig {\n allowedTypes: string[];\n maxFiles: number;\n maxFileSize?: number;\n allowMultiple: boolean;\n}\n\n// Configuration complète du flux KYC\nexport interface KYCFlowConfig {\n id: string;\n name: string;\n description: string;\n version: string;\n elements: KYCElement[];\n settings: {\n allowBackNavigation: boolean;\n showProgressBar: boolean;\n showStepNumbers: boolean;\n autoAdvance: boolean;\n enableRetry: boolean;\n maxRetries: number;\n };\n styling: {\n primaryColor: string;\n secondaryColor: string;\n backgroundColor: string;\n textColor: string;\n borderRadius: number;\n fontFamily?: string;\n };\n localization: {\n language: string;\n translations: Record<string, Record<string, string>>;\n };\n}\n\n// État du flux KYC\nexport interface KYCFlowState {\n config: KYCFlowConfig;\n currentElementIndex: number;\n completedElements: string[];\n elementData: Record<string, any>;\n errors: Record<string, string>;\n isProcessing: boolean;\n}\n\n// Actions pour le flux KYC\nexport interface KYCFlowActions {\n initializeFlow: (config: KYCFlowConfig) => void;\n nextElement: () => void;\n previousElement: () => void;\n goToElement: (elementId: string) => void;\n updateElementData: (elementId: string, data: any) => void;\n validateElement: (elementId: string) => boolean;\n submitFlow: () => Promise<void>;\n resetFlow: () => void;\n}\n\n// Hook pour le flux KYC\nexport interface UseKYCFlowReturn {\n state: KYCFlowState;\n actions: KYCFlowActions;\n currentElement: KYCElement | null;\n progress: number;\n canGoNext: boolean;\n canGoPrevious: boolean;\n isComplete: boolean;\n}\n\n// ===== TYPES FOR ORIENTATION VIDEO PROCESSING =====\n\n// Orientation types for liveness detection\nexport type OrientationType = 'center' | 'left' | 'right';\n\n// Individual orientation capture result\nexport interface OrientationCapture {\n captured: boolean;\n frame: number | null;\n}\n\n// Complete orientation video processing result\nexport interface OrientationVideoResult {\n center: OrientationCapture;\n right: OrientationCapture;\n left: OrientationCapture;\n}\n\n// Orientation video processing request\nexport interface OrientationVideoRequest {\n file: string; // Base64 encoded video or file path\n}\n\n// Orientation video processing response\nexport interface OrientationVideoResponse {\n success: boolean;\n data?: OrientationVideoResult;\n error?: KYCError;\n message?: string;\n}\n\n// Configuration for orientation video capture\nexport interface OrientationVideoConfig {\n duration: number; // Duration in seconds\n orientations: OrientationType[];\n instructions: Record<OrientationType, string>;\n showPreview: boolean;\n allowRetake: boolean;\n maxRetakes: number;\n quality: number;\n aspectRatio: number;\n}\n\n// State for orientation video capture\nexport interface OrientationVideoState {\n isRecording: boolean;\n currentOrientation: OrientationType | null;\n recordedVideo: string | null;\n processingResult: OrientationVideoResult | null;\n isProcessing: boolean;\n error: string | null;\n retakeCount: number;\n}\n\n// Actions for orientation video capture\nexport interface OrientationVideoActions {\n startRecording: () => void;\n stopRecording: () => void;\n processVideo: () => Promise<OrientationVideoResult>;\n retake: () => void;\n reset: () => void;\n setCurrentOrientation: (orientation: OrientationType) => void;\n}\n\n// ===== NOUVEAUX TYPES POUR TEMPLATE JSON =====\n\n// Types pour les labels et instructions multilingues\nexport interface LocalizedText {\n en: string;\n fr: string;\n [key: string]: string; // Support pour d'autres langues\n}\n\n// Configuration UI pour les composants\nexport interface ComponentUI {\n icon?: string;\n themeColor?: string;\n buttonText: LocalizedText | Record<string, LocalizedText>;\n backgroundColor?: string;\n textColor?: string;\n borderRadius?: number;\n}\n\n// Types de documents gouvernementaux supportés\nexport type GovernmentDocumentType =\n | 'identity_card'\n | 'passport'\n | 'drivers_licence'\n | 'health_insurance_card'\n | 'permanent_residence'\n | 'national_id'\n | 'work_permit'\n | 'id'\n | 'pp'\n | 'dl'\n | 'hic'\n | 'pr'\n | 'wp'\n\nexport const GovernmentDocumentTypeShorted: Record<GovernmentDocumentType, string> = {\n identity_card: 'id',\n passport: 'pp',\n drivers_licence: 'dl',\n health_insurance_card: 'hic',\n permanent_residence: 'pr',\n national_id: 'id',\n work_permit: 'wp',\n id: 'id',\n pp: 'pp',\n dl: 'dl',\n hic: 'hic',\n pr: 'pr',\n wp: 'wp',\n}\n\nexport const GovernmentDocumentTypeBackend: Record<string, GovernmentDocumentType> = {\n national_id: 'identity_card',\n passport: 'passport',\n driversLicense: 'drivers_licence',\n healthInsuranceCard: 'health_insurance_card',\n permanentResidence: 'permanent_residence',\n workPermit: 'work_permit',\n residencePermit: 'permanent_residence',\n}\n\n// Configuration spécifique pour chaque type de composant\nexport interface IDCardConfig {\n sides: string[];\n allowed_formats: string[];\n max_size_mb: number;\n document_types: GovernmentDocumentType[]; // Types de documents disponibles\n bbox_configs?: Record<GovernmentDocumentType, {\n xMin: number;\n yMin: number;\n xMax: number;\n yMax: number;\n borderColor?: string;\n borderWidth?: number;\n cornerRadius?: number;\n }>;\n}\n\n\nexport interface SelfieConfig {\n liveness_check: boolean;\n max_attempts: number;\n orientations: ('center' | 'left' | 'right')[]; // Tableau d'orientations à capturer\n}\n\nexport interface FileUploadConfig {\n allowed_formats: string[];\n max_size_mb: number;\n required: boolean;\n}\n\nexport interface LocationConfig {\n accuracy: string;\n required: boolean;\n}\n\nexport interface CountrySelectionConfig {\n allowed_countries: string[];\n default_country: string;\n required: boolean;\n}\n\n// Union type pour toutes les configurations\nexport type ComponentConfig =\n | IDCardConfig\n | SelfieConfig\n | FileUploadConfig\n | LocationConfig\n | CountrySelectionConfig\n | WelcomeConfig;\n\n// Nouveau type de composant basé sur le template JSON\nexport interface TemplateComponent {\n id: number;\n type: 'id_card' | 'selfie' | 'file_upload' | 'location' | 'country_selection' | 'initialization' | 'review_submit' | 'verification_progress' | 'welcome';\n order: number;\n templateId?: number;\n labels: LocalizedText | Record<string, LocalizedText>;\n instructions: LocalizedText | Record<string, LocalizedText>;\n ui: ComponentUI | Record<string, ComponentUI>;\n config: ComponentConfig;\n}\n\n// Template KYC complet\nexport interface KYCTemplate {\n id: number;\n name: LocalizedText;\n description: LocalizedText;\n version: string;\n components: TemplateComponent[];\n}\n\n// État pour le template KYC\nexport interface TemplateState {\n template: KYCTemplate;\n currentComponentIndex: number;\n completedComponents: number[];\n componentData: Record<number, any>;\n errors: Record<number, string>;\n isProcessing: boolean;\n currentLanguage: string;\n showCustomStepper: boolean;\n session: SessionState;\n verification: VerificationState;\n}\n\nexport interface SessionState {\n session_id: string;\n token: string;\n isInitialized: boolean;\n isProcessing: boolean;\n error: string | null;\n}\n\nexport type VerificationStatus = 'idle' | 'in_progress' | 'success' | 'failed';\n\n\n\nexport interface VerificationState {\n status: VerificationStatus;\n result?: VerificationResult;\n}\n\n// Actions pour le template KYC\nexport interface TemplateActions {\n initializeTemplate: (template: KYCTemplate) => void;\n nextComponent: () => void;\n previousComponent: () => void;\n goToComponent: (componentId: number) => void;\n updateComponentData: (componentId: number, data: any) => void;\n validateComponent: (componentId: number) => boolean;\n submitTemplate: () => Promise<void>;\n resetTemplate: () => void;\n setLanguage: (language: string) => void;\n showCustomStepper: (show: boolean) => void;\n setVerificationState: (state: VerificationState) => void;\n submitVerification: () => Promise<void>;\n}\n\n// Hook pour le template KYC\nexport interface UseTemplateReturn {\n state: TemplateState;\n actions: TemplateActions;\n currentComponent: TemplateComponent | null;\n progress: number;\n canGoNext: boolean;\n canGoPrevious: boolean;\n isComplete: boolean;\n getLocalizedText: (text: LocalizedText) => string;\n initializeSession: () => Promise<void>;\n}\n\n\nexport interface ISilentCaptureResult {\n success: boolean;\n path?: string;\n mrz?: string;\n error?: string;\n isAnalyzing?: boolean;\n bbox?: IBbox;\n country?: string;\n documentType?: string;\n templatePath?: string;\n lpipsScore?: number;\n}\n\nexport interface IBbox {\n minX: number;\n minY: number;\n width: number;\n height: number;\n}\n\nexport interface ICountryMapping {\n py_file?: string;\n front?: string;\n back?: string;\n keys_found?: string | null;\n mrz_type?: string;\n}\n\nexport interface Country {\n code?: string; // ISO 3166-1 alpha-2\n name: string;\n name_en: string;\n flag: string;\n regionMapping?: ICountryMapping;\n hasRegions?: boolean;\n}\n\n// ===== TYPES FOR BACKEND TEMPLATE FORMAT =====\n\n// Backend component configuration types\nexport interface WelcomeConfig {\n subtitle?: string;\n buttonText?: string;\n requirements?: string[];\n estimatedTime?: string;\n consentOptions?: {\n showPrivacyPolicy?: boolean;\n showTermsOfService?: boolean;\n showMarketingConsent?: boolean;\n };\n welcomeMessage?: string;\n showEstimatedTime?: boolean;\n}\n\nexport interface LocationCaptureConfig {\n showMap?: boolean;\n accuracy?: string;\n required?: boolean;\n maxDistance?: number;\n captureMethod?: string;\n allowManualEntry?: boolean;\n countryRestrictions?: string[];\n}\n\nexport interface GovernmentIdConfig {\n required?: boolean;\n allowSkip?: boolean;\n cameraOverlay?: {\n bbox?: {\n xMax?: number;\n xMin?: number;\n yMax?: number;\n yMin?: number;\n borderColor?: string;\n borderWidth?: number;\n cornerRadius?: number;\n };\n };\n documentTypes?: string[];\n requiredSides?: string;\n cameraSettings?: {\n quality?: number;\n flashMode?: string;\n maxRetakes?: number;\n allowRetake?: boolean;\n aspectRatio?: number;\n };\n validationRules?: string[];\n regionsByCountry?: Record<string, any>;\n selectedCountries?: string[];\n authenticationMethods?: Record<string, Record<string, {\n back?: string[];\n front?: string[];\n mrzTypes?: string[];\n }>>;\n documentTypesByCountry?: Record<string, string[]>;\n instructionsByDocumentType?: Record<string, LocalizedText>;\n}\n\nexport interface SelfieCaptureConfig {\n timeout?: number;\n maxAttempts?: number;\n faceMatching?: boolean;\n captureMethod?: string;\n qualityChecks?: string[];\n livenessChecks?: string[];\n matchThreshold?: string;\n livenessEnabled?: boolean;\n}\n\nexport interface ReviewSubmitConfig {\n allowEditing?: boolean;\n displayOptions?: string[];\n requireConsent?: boolean;\n postSubmitActions?: string[];\n}\n\nexport type BackendComponentConfig =\n | WelcomeConfig\n | LocationCaptureConfig\n | GovernmentIdConfig\n | SelfieCaptureConfig\n | ReviewSubmitConfig\n | Record<string, any>;\n\n// Backend component translation structure\nexport interface BackendComponentTranslations {\n en?: {\n title?: string;\n description?: string;\n instructions?: string;\n buttonText?: string;\n consentText?: string;\n successMessage?: string;\n };\n fr?: {\n title?: string;\n description?: string;\n instructions?: string;\n buttonText?: string;\n consentText?: string;\n successMessage?: string;\n };\n [key: string]: {\n title?: string;\n description?: string;\n instructions?: string;\n buttonText?: string;\n consentText?: string;\n successMessage?: string;\n } | undefined;\n}\n\n// Backend template component\nexport interface BackendTemplateComponent {\n id: string;\n type: 'welcome' | 'location-capture' | 'government-id' | 'selfie-capture' | 'review-submit' | 'verification-progress';\n order: number;\n config: BackendComponentConfig;\n required?: boolean;\n translations: BackendComponentTranslations;\n}\n\n// Backend template structure\nexport interface BackendKYCTemplate {\n id: string;\n name: {\n en: string;\n fr: string;\n [key: string]: string;\n };\n status?: string;\n version?: string;\n components: BackendTemplateComponent[];\n description?: {\n en: string;\n fr: string;\n [key: string]: string;\n };\n}\n\n// API response for template\nexport interface TemplateAPIResponse {\n id: string;\n name: {\n en: string;\n fr: string;\n [key: string]: string;\n };\n status?: string;\n version?: string;\n components: BackendTemplateComponent[];\n description?: {\n en: string;\n fr: string;\n [key: string]: string;\n };\n}"]}
|
|
1
|
+
{"version":3,"file":"KYC.types.js","sourceRoot":"","sources":["../../src/types/KYC.types.ts"],"names":[],"mappings":"AA+UA,MAAM,CAAC,MAAM,6BAA6B,GAA2C;IACnF,aAAa,EAAE,IAAI;IACnB,QAAQ,EAAE,IAAI;IACd,eAAe,EAAE,IAAI;IACrB,qBAAqB,EAAE,KAAK;IAC5B,mBAAmB,EAAE,IAAI;IACzB,WAAW,EAAE,IAAI;IACjB,WAAW,EAAE,IAAI;IACjB,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,IAAI;IACR,GAAG,EAAE,KAAK;IACV,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,IAAI;CACT,CAAA;AAED,MAAM,CAAC,MAAM,6BAA6B,GAA2C;IACnF,WAAW,EAAE,eAAe;IAC5B,QAAQ,EAAE,UAAU;IACpB,cAAc,EAAE,iBAAiB;IACjC,mBAAmB,EAAE,uBAAuB;IAC5C,kBAAkB,EAAE,qBAAqB;IACzC,UAAU,EAAE,aAAa;IACzB,eAAe,EAAE,qBAAqB;CACvC,CAAA","sourcesContent":["import { VerificationResult } from \"../modules/api/types\";\n\n// Types pour les documents\nexport interface Document {\n id: string;\n type: DocumentType;\n imageUri: string;\n uploadedAt: Date;\n validated: boolean;\n extractedData?: DocumentData;\n\n}\n\nexport type DocumentType = 'passport' | 'id_card' | 'drivers_license';\n\nexport interface DocumentData {\n firstName?: string;\n lastName?: string;\n dateOfBirth?: string;\n documentNumber?: string;\n expiryDate?: string;\n nationality?: string;\n}\n\n// Types pour les selfies\nexport interface Selfie {\n id: string;\n imageUri: string;\n capturedAt: Date;\n validated: boolean;\n faceDetected: boolean;\n}\n\n// Types pour la session KYC\nexport interface KYCSession {\n id: string;\n userId: string;\n status: KYCStatus;\n currentStep: number;\n documents: Document[];\n selfie?: Selfie;\n verificationId?: string;\n createdAt: Date;\n updatedAt: Date;\n completedAt?: Date;\n}\n\nexport type KYCStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'rejected';\n\n// Types pour les étapes du processus\nexport interface KYCStep {\n id: number;\n title: string;\n description: string;\n isCompleted: boolean;\n isRequired: boolean;\n}\n\n// Types pour les erreurs\nexport interface KYCError {\n code: string;\n message: string;\n field?: string;\n details?: any;\n}\n\n// Types pour les réponses API\nexport interface KYCResponse {\n success: boolean;\n data?: any;\n error?: KYCError;\n message?: string;\n}\n\n// Types pour les événements\nexport interface KYCEvent {\n type: 'step_completed' | 'document_uploaded' | 'selfie_captured' | 'verification_started' | 'verification_completed';\n timestamp: Date;\n data?: any;\n}\n\n// Types pour les configurations\nexport interface KYCConfig {\n apiBaseUrl: string;\n apiKey: string;\n timeout: number;\n retryAttempts: number;\n enableDebug: boolean;\n}\n\n// Types pour les hooks\nexport interface UseKYCReturn {\n session: KYCSession | null;\n currentStep: number;\n isProcessing: boolean;\n error: KYCError | null;\n startSession: (userId: string) => void;\n nextStep: () => void;\n previousStep: () => void;\n uploadDocument: (document: Document) => Promise<void>;\n captureSelfie: (selfie: Selfie) => Promise<void>;\n submitVerification: () => Promise<void>;\n resetSession: () => void;\n}\n\n// ===== NOUVEAUX TYPES POUR CONFIGURATION AUTOMATIQUE =====\n\n// Types d'éléments KYC configurables\nexport type KYCElementType =\n | 'country_selection'\n | 'document_type_selection'\n | 'camera_capture'\n | 'file_upload'\n | 'selfie_capture'\n | 'verification'\n | 'completion';\n//KYCElementType shorted\n\n\n// Configuration d'un élément KYC\nexport interface KYCElement {\n id: string;\n type: KYCElementType;\n title: string;\n description: string;\n isRequired: boolean;\n isVisible: boolean;\n order: number;\n validation?: KYCValidation;\n options?: KYCElementOption[];\n cameraConfig?: KYCCameraConfig;\n uploadConfig?: KYCUploadConfig;\n}\n\n// Options pour les éléments de sélection\nexport interface KYCElementOption {\n value: string;\n label: string;\n icon?: string;\n description?: string;\n}\n\n// Configuration de validation\nexport interface KYCValidation {\n required: boolean;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n customValidator?: (value: any) => boolean | string;\n}\n\n// Configuration de la caméra\nexport interface KYCCameraConfig {\n aspectRatio?: number;\n quality?: number;\n flashMode?: 'on' | 'off' | 'auto';\n cameraType?: 'front' | 'back';\n allowRetake: boolean;\n maxRetakes?: number;\n overlay?: {\n showGuide: boolean;\n guideText?: string;\n guideImage?: string;\n };\n}\n\n// Configuration d'upload\nexport interface KYCUploadConfig {\n allowedTypes: string[];\n maxFiles: number;\n maxFileSize?: number;\n allowMultiple: boolean;\n}\n\n// Configuration complète du flux KYC\nexport interface KYCFlowConfig {\n id: string;\n name: string;\n description: string;\n version: string;\n elements: KYCElement[];\n settings: {\n allowBackNavigation: boolean;\n showProgressBar: boolean;\n showStepNumbers: boolean;\n autoAdvance: boolean;\n enableRetry: boolean;\n maxRetries: number;\n };\n styling: {\n primaryColor: string;\n secondaryColor: string;\n backgroundColor: string;\n textColor: string;\n borderRadius: number;\n fontFamily?: string;\n };\n localization: {\n language: string;\n translations: Record<string, Record<string, string>>;\n };\n}\n\n// État du flux KYC\nexport interface KYCFlowState {\n config: KYCFlowConfig;\n currentElementIndex: number;\n completedElements: string[];\n elementData: Record<string, any>;\n errors: Record<string, string>;\n isProcessing: boolean;\n}\n\n// Actions pour le flux KYC\nexport interface KYCFlowActions {\n initializeFlow: (config: KYCFlowConfig) => void;\n nextElement: () => void;\n previousElement: () => void;\n goToElement: (elementId: string) => void;\n updateElementData: (elementId: string, data: any) => void;\n validateElement: (elementId: string) => boolean;\n submitFlow: () => Promise<void>;\n resetFlow: () => void;\n}\n\n// Hook pour le flux KYC\nexport interface UseKYCFlowReturn {\n state: KYCFlowState;\n actions: KYCFlowActions;\n currentElement: KYCElement | null;\n progress: number;\n canGoNext: boolean;\n canGoPrevious: boolean;\n isComplete: boolean;\n}\n\n// ===== TYPES FOR ORIENTATION VIDEO PROCESSING =====\n\n// Orientation types for liveness detection\nexport type OrientationType = 'center' | 'left' | 'right';\n\n// Individual orientation capture result\nexport interface OrientationCapture {\n captured: boolean;\n frame: number | null;\n}\n\n// Complete orientation video processing result\nexport interface OrientationVideoResult {\n center: OrientationCapture;\n right: OrientationCapture;\n left: OrientationCapture;\n}\n\n// Orientation video processing request\nexport interface OrientationVideoRequest {\n file: string; // Base64 encoded video or file path\n}\n\n// Orientation video processing response\nexport interface OrientationVideoResponse {\n success: boolean;\n data?: OrientationVideoResult;\n error?: KYCError;\n message?: string;\n}\n\n// Configuration for orientation video capture\nexport interface OrientationVideoConfig {\n duration: number; // Duration in seconds\n orientations: OrientationType[];\n instructions: Record<OrientationType, string>;\n showPreview: boolean;\n allowRetake: boolean;\n maxRetakes: number;\n quality: number;\n aspectRatio: number;\n}\n\n// State for orientation video capture\nexport interface OrientationVideoState {\n isRecording: boolean;\n currentOrientation: OrientationType | null;\n recordedVideo: string | null;\n processingResult: OrientationVideoResult | null;\n isProcessing: boolean;\n error: string | null;\n retakeCount: number;\n}\n\n// Actions for orientation video capture\nexport interface OrientationVideoActions {\n startRecording: () => void;\n stopRecording: () => void;\n processVideo: () => Promise<OrientationVideoResult>;\n retake: () => void;\n reset: () => void;\n setCurrentOrientation: (orientation: OrientationType) => void;\n}\n\n// ===== NOUVEAUX TYPES POUR TEMPLATE JSON =====\n\n// Types pour les labels et instructions multilingues\nexport interface LocalizedText {\n en: string;\n fr: string;\n [key: string]: string; // Support pour d'autres langues\n}\n\n// Configuration UI pour les composants\nexport interface ComponentUI {\n icon?: string;\n themeColor?: string;\n buttonText: LocalizedText | Record<string, LocalizedText>;\n backgroundColor?: string;\n textColor?: string;\n borderRadius?: number;\n}\n\n// Types de documents gouvernementaux supportés\nexport type GovernmentDocumentType =\n | 'identity_card'\n | 'passport'\n | 'drivers_licence'\n | 'health_insurance_card'\n | 'permanent_residence'\n | 'national_id'\n | 'work_permit'\n | 'id'\n | 'pp'\n | 'dl'\n | 'hic'\n | 'pr'\n | 'wp'\n\nexport const GovernmentDocumentTypeShorted: Record<GovernmentDocumentType, string> = {\n identity_card: 'id',\n passport: 'pp',\n drivers_licence: 'dl',\n health_insurance_card: 'hic',\n permanent_residence: 'pr',\n national_id: 'id',\n work_permit: 'wp',\n id: 'id',\n pp: 'pp',\n dl: 'dl',\n hic: 'hic',\n pr: 'pr',\n wp: 'wp',\n}\n\nexport const GovernmentDocumentTypeBackend: Record<string, GovernmentDocumentType> = {\n national_id: 'identity_card',\n passport: 'passport',\n driversLicense: 'drivers_licence',\n healthInsuranceCard: 'health_insurance_card',\n permanentResidence: 'permanent_residence',\n workPermit: 'work_permit',\n residencePermit: 'permanent_residence',\n}\n\n// Configuration spécifique pour chaque type de composant\nexport interface IDCardConfig {\n sides: string[];\n allowed_formats: string[];\n max_size_mb: number;\n document_types: GovernmentDocumentType[]; // Types de documents disponibles\n bbox_configs?: Record<GovernmentDocumentType, {\n xMin: number;\n yMin: number;\n xMax: number;\n yMax: number;\n borderColor?: string;\n borderWidth?: number;\n cornerRadius?: number;\n }>;\n}\n\n\nexport interface SelfieConfig {\n liveness_check: boolean;\n max_attempts: number;\n orientations: ('center' | 'left' | 'right')[]; // Tableau d'orientations à capturer\n}\n\nexport interface FileUploadConfig {\n allowed_formats: string[];\n max_size_mb: number;\n required: boolean;\n}\n\nexport interface LocationConfig {\n accuracy: string;\n required: boolean;\n}\n\nexport interface CountrySelectionConfig {\n allowed_countries: string[];\n default_country: string;\n required: boolean;\n}\n\n// Union type pour toutes les configurations\nexport type ComponentConfig =\n | IDCardConfig\n | SelfieConfig\n | FileUploadConfig\n | LocationConfig\n | CountrySelectionConfig\n | CountrySelectionConfig\n | WelcomeConfig\n | EmailVerificationConfig\n | PhoneVerificationConfig\n | PersonalInformationConfig\n | AdditionalDocumentsConfig;\n\n// Nouveau type de composant basé sur le template JSON\nexport interface TemplateComponent {\n id: number;\n type: 'id_card' | 'selfie' | 'file_upload' | 'location' | 'country_selection' | 'initialization' | 'review_submit' | 'verification_progress' | 'welcome' | 'email_verification' | 'phone_verification' | 'personal_information' | 'additional_documents';\n order: number;\n templateId?: number;\n labels: LocalizedText | Record<string, LocalizedText>;\n instructions: LocalizedText | Record<string, LocalizedText>;\n ui: ComponentUI | Record<string, ComponentUI>;\n config: ComponentConfig;\n}\n\n// Template KYC complet\nexport interface KYCTemplate {\n id: number;\n name: LocalizedText;\n description: LocalizedText;\n version: string;\n components: TemplateComponent[];\n}\n\n// État pour le template KYC\nexport interface TemplateState {\n template: KYCTemplate;\n currentComponentIndex: number;\n completedComponents: number[];\n componentData: Record<number, any>;\n errors: Record<number, string>;\n isProcessing: boolean;\n currentLanguage: string;\n showCustomStepper: boolean;\n session: SessionState;\n verification: VerificationState;\n}\n\nexport interface SessionState {\n session_id: string;\n token: string;\n isInitialized: boolean;\n isProcessing: boolean;\n error: string | null;\n /** True once loadSessionData has run (for resume flow); allows UI to show loading until country/data restored */\n sessionDataRestored?: boolean;\n}\n\nexport type VerificationStatus = 'idle' | 'in_progress' | 'success' | 'failed';\n\n\n\nexport interface VerificationState {\n status: VerificationStatus;\n result?: VerificationResult;\n}\n\n// Actions pour le template KYC\nexport interface TemplateActions {\n initializeTemplate: (template: KYCTemplate) => void;\n nextComponent: (overrideData?: any) => void;\n previousComponent: () => void;\n goToComponent: (componentId: number) => void;\n updateComponentData: (componentId: number, data: any) => void;\n validateComponent: (componentId: number, dataOverride?: any) => boolean;\n submitTemplate: () => Promise<void>;\n resetTemplate: () => void;\n setLanguage: (language: string) => void;\n showCustomStepper: (show: boolean) => void;\n setVerificationState: (state: VerificationState) => void;\n submitVerification: () => Promise<void>;\n}\n\n// Hook pour le template KYC (return type of useTemplateKYCFlow)\nexport interface UseTemplateReturn {\n state: TemplateState;\n actions: TemplateActions;\n currentComponent: TemplateComponent | null;\n progress: number;\n canGoNext: boolean;\n canGoPrevious: boolean;\n isComplete: boolean;\n getLocalizedText: (text: LocalizedText) => string;\n initializeSession: () => Promise<void>;\n env: 'PRODUCTION' | 'SANDBOX';\n /** Optional API key for backend auth (e.g. email verification endpoints). */\n apiKey?: string;\n}\n\n\nexport interface ISilentCaptureResult {\n success: boolean;\n path?: string;\n mrz?: string;\n error?: string;\n isAnalyzing?: boolean;\n bbox?: IBbox;\n country?: string;\n documentType?: string;\n templatePath?: string;\n lpipsScore?: number;\n}\n\nexport interface IBbox {\n minX: number;\n minY: number;\n width: number;\n height: number;\n}\n\nexport interface ICountryMapping {\n py_file?: string;\n front?: string;\n back?: string;\n keys_found?: string | null;\n mrz_type?: string;\n}\n\nexport interface Country {\n code?: string; // ISO 3166-1 alpha-2\n name: string;\n name_en: string;\n flag: string;\n regionMapping?: ICountryMapping;\n hasRegions?: boolean;\n}\n\n// ===== TYPES FOR BACKEND TEMPLATE FORMAT =====\n\n// Backend component configuration types\nexport interface WelcomeConfig {\n subtitle?: string;\n buttonText?: string;\n requirements?: string[];\n estimatedTime?: string;\n consentOptions?: {\n showPrivacyPolicy?: boolean;\n showTermsOfService?: boolean;\n showMarketingConsent?: boolean;\n };\n welcomeMessage?: string;\n showEstimatedTime?: boolean;\n}\n\nexport interface LocationCaptureConfig {\n showMap?: boolean;\n accuracy?: string;\n required?: boolean;\n maxDistance?: number;\n captureMethod?: string;\n allowManualEntry?: boolean;\n countryRestrictions?: string[];\n}\n\nexport interface GovernmentIdConfig {\n required?: boolean;\n allowSkip?: boolean;\n cameraOverlay?: {\n bbox?: {\n xMax?: number;\n xMin?: number;\n yMax?: number;\n yMin?: number;\n borderColor?: string;\n borderWidth?: number;\n cornerRadius?: number;\n };\n };\n documentTypes?: string[];\n requiredSides?: string;\n cameraSettings?: {\n quality?: number;\n flashMode?: string;\n maxRetakes?: number;\n allowRetake?: boolean;\n aspectRatio?: number;\n };\n validationRules?: string[];\n regionsByCountry?: Record<string, any>;\n selectedCountries?: string[];\n authenticationMethods?: Record<string, Record<string, {\n back?: string[];\n front?: string[];\n mrzTypes?: string[];\n }>>;\n documentTypesByCountry?: Record<string, string[]>;\n instructionsByDocumentType?: Record<string, LocalizedText>;\n}\n\nexport interface SelfieCaptureConfig {\n timeout?: number;\n maxAttempts?: number;\n faceMatching?: boolean;\n captureMethod?: string;\n qualityChecks?: string[];\n livenessChecks?: string[];\n matchThreshold?: string;\n livenessEnabled?: boolean;\n}\n\nexport interface ReviewSubmitConfig {\n allowEditing?: boolean;\n displayOptions?: string[];\n requireConsent?: boolean;\n postSubmitActions?: string[];\n}\n\nexport type BackendComponentConfig =\n | WelcomeConfig\n | LocationCaptureConfig\n | GovernmentIdConfig\n | SelfieCaptureConfig\n | ReviewSubmitConfig\n | Record<string, any>;\n\n// Backend component translation structure\nexport interface BackendComponentTranslations {\n en?: {\n title?: string;\n description?: string;\n instructions?: string;\n buttonText?: string;\n consentText?: string;\n successMessage?: string;\n };\n fr?: {\n title?: string;\n description?: string;\n instructions?: string;\n buttonText?: string;\n consentText?: string;\n successMessage?: string;\n };\n [key: string]: {\n title?: string;\n description?: string;\n instructions?: string;\n buttonText?: string;\n consentText?: string;\n successMessage?: string;\n } | undefined;\n}\n\n// Backend template component\nexport interface BackendTemplateComponent {\n id: string;\n type: 'welcome' | 'location-capture' | 'government-id' | 'selfie-capture' | 'review-submit' | 'verification-progress' | 'email-verification' | 'phone-verification' | 'personal-information' | 'additional-documents';\n order: number;\n config: BackendComponentConfig;\n required?: boolean;\n translations: BackendComponentTranslations;\n}\n\n// Backend template structure\nexport interface BackendKYCTemplate {\n id: string;\n name: {\n en: string;\n fr: string;\n [key: string]: string;\n };\n status?: string;\n version?: string;\n components: BackendTemplateComponent[];\n description?: {\n en: string;\n fr: string;\n [key: string]: string;\n };\n}\n\n// ===== NEW CONFIG TYPES FOR INPUT VERIFICATION =====\n\nexport interface EmailVerificationConfig {\n allowResend: boolean;\n otpSettings: {\n codeLength: number;\n expiryTime: number;\n };\n resendCooldown: number;\n emailValidation: {\n corporateOnly: boolean;\n validateFormat: boolean;\n checkDisposable: boolean;\n checkDeliverability: boolean;\n };\n verificationMethod: string;\n required?: boolean;\n}\n\nexport interface PhoneVerificationConfig {\n required: boolean;\n codeExpiry: number;\n codeLength: number;\n maxAttempts: number;\n resendDelay: number;\n countryRestrictions: string;\n verificationMethods: string[];\n allowSkipForVerified: boolean;\n}\n\nexport interface PersonalInfoField {\n id: string;\n type: string;\n label: string;\n required: boolean;\n placeholder?: string;\n autoFillFromId?: boolean;\n minAge?: number;\n verifyAge?: boolean;\n dateFormat?: string;\n}\n\nexport interface PersonalInformationConfig {\n fields: PersonalInfoField[];\n validationSettings: {\n validateOnBlur: boolean;\n showAllErrorsAtOnce: boolean;\n preventSubmissionWithErrors: boolean;\n };\n required?: boolean;\n}\n\nexport interface DocumentCategory {\n enabled: boolean;\n category: string;\n documentTypes: string[];\n}\n\nexport interface AdditionalDocumentsConfig {\n required: boolean;\n maxSizeEach: string;\n maxDocuments: number;\n minDocuments: number;\n documentCategories: DocumentCategory[];\n customDocumentTypes: any[];\n showBasedOnUserProfile: boolean;\n}\n\n// API response for template\nexport interface TemplateAPIResponse {\n id: string;\n name: {\n en: string;\n fr: string;\n [key: string]: string;\n };\n status?: string;\n version?: string;\n components: BackendTemplateComponent[];\n description?: {\n en: string;\n fr: string;\n [key: string]: string;\n };\n}\n\n// ===== NEW CONFIG TYPES FOR INPUT VERIFICATION =====\n\nexport interface EmailVerificationConfig {\n allowResend: boolean;\n otpSettings: {\n codeLength: number;\n expiryTime: number;\n };\n resendCooldown: number;\n emailValidation: {\n corporateOnly: boolean;\n validateFormat: boolean;\n checkDisposable: boolean;\n checkDeliverability: boolean;\n };\n verificationMethod: string;\n required?: boolean;\n}\n\nexport interface PhoneVerificationConfig {\n required: boolean;\n codeExpiry: number;\n codeLength: number;\n maxAttempts: number;\n resendDelay: number;\n countryRestrictions: string;\n verificationMethods: string[];\n allowSkipForVerified: boolean;\n}\n\nexport interface PersonalInfoField {\n id: string;\n type: string;\n label: string;\n required: boolean;\n placeholder?: string;\n autoFillFromId?: boolean;\n minAge?: number;\n verifyAge?: boolean;\n dateFormat?: string;\n}\n\nexport interface PersonalInformationConfig {\n fields: PersonalInfoField[];\n validationSettings: {\n validateOnBlur: boolean;\n showAllErrorsAtOnce: boolean;\n preventSubmissionWithErrors: boolean;\n };\n required?: boolean;\n}\n\nexport interface DocumentCategory {\n enabled: boolean;\n category: string;\n documentTypes: string[];\n}\n\nexport interface AdditionalDocumentsConfig {\n required: boolean;\n maxSizeEach: string;\n maxDocuments: number;\n minDocuments: number;\n documentCategories: DocumentCategory[];\n customDocumentTypes: any[];\n showBasedOnUserProfile: boolean;\n}"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KYC Environment types
|
|
3
|
+
* PRODUCTION: Full verification with AI checks
|
|
4
|
+
* SANDBOX: Skip AI verification, only save data to backend
|
|
5
|
+
*/
|
|
6
|
+
export type KycEnvironment = 'PRODUCTION' | 'SANDBOX';
|
|
7
|
+
/**
|
|
8
|
+
* Backend Environment types
|
|
9
|
+
* PRODUCTION: Production backend
|
|
10
|
+
* TEST: Test backend
|
|
11
|
+
*/
|
|
12
|
+
export type BackendEnvironment = 'PRODUCTION' | 'TEST';
|
|
13
|
+
//# sourceMappingURL=env.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.types.d.ts","sourceRoot":"","sources":["../../src/types/env.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG,SAAS,CAAC;AAEtD;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.types.js","sourceRoot":"","sources":["../../src/types/env.types.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * KYC Environment types\n * PRODUCTION: Full verification with AI checks\n * SANDBOX: Skip AI verification, only save data to backend\n */\nexport type KycEnvironment = 'PRODUCTION' | 'SANDBOX';\n\n/**\n * Backend Environment types\n * PRODUCTION: Production backend\n * TEST: Test backend\n */\nexport type BackendEnvironment = 'PRODUCTION' | 'TEST';\n"]}
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
/** OBB confidence below this = card not fully in frame; don't crop, give user feedback. */
|
|
2
|
+
export declare const OBB_CONFIDENCE_THRESHOLD = 0.85;
|
|
3
|
+
/**
|
|
4
|
+
* card_obb format from API: [ [ [p1,p2,p3,p4], confidence ] ]
|
|
5
|
+
* Returns confidence in [0,1] or null if not present.
|
|
6
|
+
*/
|
|
7
|
+
export declare function getObbConfidence(cardObb: any): number | null;
|
|
1
8
|
export declare function cropByObb(uri: string, cardObb: any): Promise<{
|
|
2
9
|
base64?: string;
|
|
3
10
|
bbox?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cropByObb.d.ts","sourceRoot":"","sources":["../../src/utils/cropByObb.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cropByObb.d.ts","sourceRoot":"","sources":["../../src/utils/cropByObb.ts"],"names":[],"mappings":"AAOA,2FAA2F;AAC3F,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAE7C;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI,CAM5D;AA4CD,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,CAsB7J;AAMD,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,mBA4B7D;AAGD,wBAAsB,8BAA8B,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,GAAE,MAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CA0ErH"}
|
package/build/utils/cropByObb.js
CHANGED
|
@@ -2,6 +2,21 @@ import { Image as RNImage, Platform } from 'react-native';
|
|
|
2
2
|
import * as ImageManipulator from "expo-image-manipulator";
|
|
3
3
|
import { truncateFields } from '../modules/api/KYCService';
|
|
4
4
|
import { logger } from './logger';
|
|
5
|
+
/** OBB confidence below this = card not fully in frame; don't crop, give user feedback. */
|
|
6
|
+
export const OBB_CONFIDENCE_THRESHOLD = 0.85;
|
|
7
|
+
/**
|
|
8
|
+
* card_obb format from API: [ [ [p1,p2,p3,p4], confidence ] ]
|
|
9
|
+
* Returns confidence in [0,1] or null if not present.
|
|
10
|
+
*/
|
|
11
|
+
export function getObbConfidence(cardObb) {
|
|
12
|
+
if (!cardObb || !Array.isArray(cardObb) || cardObb.length === 0)
|
|
13
|
+
return null;
|
|
14
|
+
const first = cardObb[0];
|
|
15
|
+
if (!Array.isArray(first) || first.length < 2)
|
|
16
|
+
return null;
|
|
17
|
+
const score = first[1];
|
|
18
|
+
return typeof score === 'number' ? score : null;
|
|
19
|
+
}
|
|
5
20
|
// Compute axis-aligned bounding box from oriented quadrilateral
|
|
6
21
|
function computeAabb(points) {
|
|
7
22
|
const xs = points.map(p => p[0]);
|
|
@@ -39,7 +54,11 @@ async function cropWeb(uri, points) {
|
|
|
39
54
|
// Fallback: return original for native (no dependency added); caller can still use bbox to draw overlay
|
|
40
55
|
export async function cropByObb(uri, cardObb) {
|
|
41
56
|
try {
|
|
42
|
-
// card_obb format: [ [ [p1,p2,p3,p4], score ] ]
|
|
57
|
+
// card_obb format: [ [ [p1,p2,p3,p4], score ] ] — if confidence too low, don't crop (send full image)
|
|
58
|
+
const confidence = getObbConfidence(cardObb);
|
|
59
|
+
if (confidence !== null && confidence < OBB_CONFIDENCE_THRESHOLD) {
|
|
60
|
+
return {};
|
|
61
|
+
}
|
|
43
62
|
const first = Array.isArray(cardObb) ? cardObb[0] : null;
|
|
44
63
|
const points = Array.isArray(first?.[0]) ? first[0] : null;
|
|
45
64
|
if (!points || points.length !== 4)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cropByObb.js","sourceRoot":"","sources":["../../src/utils/cropByObb.ts"],"names":[],"mappings":"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","sourcesContent":["import { Image as RNImage, Platform } from 'react-native';\nimport * as ImageManipulator from \"expo-image-manipulator\";\nimport { truncateFields } from '../modules/api/KYCService';\nimport { logger } from './logger';\n\ntype Point = [number, number];\n\n// Compute axis-aligned bounding box from oriented quadrilateral\nfunction computeAabb(points: Point[]) {\n const xs = points.map(p => p[0]);\n const ys = points.map(p => p[1]);\n const minX = Math.min(...xs);\n const minY = Math.min(...ys);\n const maxX = Math.max(...xs);\n const maxY = Math.max(...ys);\n return { minX, minY, maxX, maxY, width: maxX - minX, height: maxY - minY };\n}\n\n// Web-only crop using Canvas; returns dataURL (base64)\nasync function cropWeb(uri: string, points: Point[]): Promise<string> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.onload = () => {\n const { minX, minY, width, height } = computeAabb(points);\n const canvas = document.createElement('canvas');\n canvas.width = Math.max(1, Math.round(width));\n canvas.height = Math.max(1, Math.round(height));\n const ctx = canvas.getContext('2d');\n if (!ctx) return reject(new Error('Canvas context not available'));\n ctx.drawImage(\n img,\n minX, // sx\n minY, // sy\n width, // sw\n height, // sh\n 0,\n 0,\n canvas.width,\n canvas.height\n );\n resolve(canvas.toDataURL('image/jpeg', 0.92));\n };\n img.onerror = (e) => reject(e);\n img.src = uri;\n });\n}\n\n// Fallback: return original for native (no dependency added); caller can still use bbox to draw overlay\nexport async function cropByObb(uri: string, cardObb: any): Promise<{ base64?: string; bbox?: { minX: number; minY: number; width: number; height: number } }> {\n try {\n // card_obb format: [ [ [p1,p2,p3,p4], score ] ]\n const first = Array.isArray(cardObb) ? cardObb[0] : null;\n const points = Array.isArray(first?.[0]) ? (first[0] as Point[]) : null;\n if (!points || points.length !== 4) return {};\n\n const { minX, minY, width, height } = computeAabb(points);\n\n if (Platform.OS === 'web') {\n const base64 = await cropWeb(uri, points);\n return { base64, bbox: { minX, minY, width, height } };\n }\n // Native: return bbox only; keep base64 undefined\n return { bbox: { minX, minY, width, height } };\n } catch (e) {\n return {};\n }\n}\n\n\n\n\n// exemple d'appel :\nexport async function cropImageWithBBox(uri: string, bbox: any) {\n // 1️⃣ Récupère la taille originale de l'image\n await RNImage.getSize(uri, (width, height) => {\n console.log(\"Image originale:\", width, height);\n });\n\n // // 2️⃣ Suppose que ton bbox vient d'une image affichée dans `displayedSize`\n // const scaleX = originalWidth / displayedSize.width;\n // const scaleY = originalHeight / displayedSize.height;\n\n // 3️⃣ Convertir le bbox à la taille réelle scale 0.10 = 10%\n const crop = {\n originX: bbox.minX,\n originY: bbox.minY,\n width: bbox.width,\n height: bbox.height,\n };\n\n // 4️⃣ Appliquer le crop\n // @ts-ignore - manipulateAsync is deprecated but still functional, new API (useImageManipulator) is a React hook and not suitable for utility functions\n const result = await ImageManipulator.manipulateAsync(\n uri,\n [{ crop }],\n { compress: 1, format: ImageManipulator.SaveFormat.PNG }\n );\n\n console.log(\"Image recadrée:\", result.uri);\n return result.uri;\n}\n\n// Fonction pour rogner avec une tolérance de 10% autour du bbox\nexport async function cropImageWithBBoxWithTolerance(uri: string, bbox: any, tolerance: number = 0.1): Promise<string> {\n console.log(\"cropImageWithBBoxWithTolerance\", JSON.stringify(truncateFields({ uri, bbox, tolerance }), null, 2));\n \n return new Promise<string>((resolve, reject) => {\n let isResolved = false;\n \n // Timeout de sécurité (15 secondes)\n const timeout = setTimeout(() => {\n if (!isResolved) {\n isResolved = true;\n console.warn(\"Timeout lors du rognage avec tolérance, utilisation de l'image originale\");\n resolve(uri); // Retourner l'URI original en cas de timeout\n }\n }, 15000);\n\n // 1️⃣ Récupère la taille originale de l'image\n RNImage.getSize(uri, (imageWidth, imageHeight) => {\n if (isResolved) return;\n \n // 2️⃣ Calculer la tolérance en pixels (10% de chaque côté)\n const toleranceX = bbox.width * tolerance;\n const toleranceY = bbox.height * tolerance;\n\n // 3️⃣ Ajuster le bbox avec la tolérance\n // Calculer les nouvelles coordonnées avec tolérance\n const newMinX = Math.max(0, bbox.minX - toleranceX);\n const newMinY = Math.max(0, bbox.minY - toleranceY);\n const newMaxX = Math.min(imageWidth, bbox.minX + bbox.width + toleranceX);\n const newMaxY = Math.min(imageHeight, bbox.minY + bbox.height + toleranceY);\n\n // Calculer la largeur et hauteur finales\n const finalWidth = newMaxX - newMinX;\n const finalHeight = newMaxY - newMinY;\n\n const crop = {\n originX: newMinX,\n originY: newMinY,\n width: finalWidth,\n height: finalHeight,\n };\n\n logger.log(\"cropImageWithBBoxWithTolerance - crop params\", JSON.stringify(truncateFields({ uri, crop, tolerance, imageWidth, imageHeight }), null, 2));\n\n // 4️⃣ Appliquer le crop avec tolérance\n // @ts-ignore - manipulateAsync is deprecated but still functional, new API (useImageManipulator) is a React hook and not suitable for utility functions\n ImageManipulator.manipulateAsync(\n uri,\n [{ crop }],\n { compress: 0.95, format: ImageManipulator.SaveFormat.JPEG }\n )\n .then((result) => {\n if (isResolved) return;\n isResolved = true;\n clearTimeout(timeout);\n console.log(\"Image recadrée avec tolérance:\", result.uri);\n resolve(result.uri);\n })\n .catch((error) => {\n if (isResolved) return;\n isResolved = true;\n clearTimeout(timeout);\n console.error(\"Erreur lors du rognage avec tolérance:\", error);\n // En cas d'erreur, retourner l'URI original au lieu de rejeter\n resolve(uri);\n });\n }, (error) => {\n if (isResolved) return;\n isResolved = true;\n clearTimeout(timeout);\n console.error(\"Erreur lors de la récupération de la taille de l'image:\", error);\n // En cas d'erreur, retourner l'URI original au lieu de rejeter\n resolve(uri);\n });\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"cropByObb.js","sourceRoot":"","sources":["../../src/utils/cropByObb.ts"],"names":[],"mappings":"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","sourcesContent":["import { Image as RNImage, Platform } from 'react-native';\nimport * as ImageManipulator from \"expo-image-manipulator\";\nimport { truncateFields } from '../modules/api/KYCService';\nimport { logger } from './logger';\n\ntype Point = [number, number];\n\n/** OBB confidence below this = card not fully in frame; don't crop, give user feedback. */\nexport const OBB_CONFIDENCE_THRESHOLD = 0.85;\n\n/**\n * card_obb format from API: [ [ [p1,p2,p3,p4], confidence ] ]\n * Returns confidence in [0,1] or null if not present.\n */\nexport function getObbConfidence(cardObb: any): number | null {\n if (!cardObb || !Array.isArray(cardObb) || cardObb.length === 0) return null;\n const first = cardObb[0];\n if (!Array.isArray(first) || first.length < 2) return null;\n const score = first[1];\n return typeof score === 'number' ? score : null;\n}\n\n// Compute axis-aligned bounding box from oriented quadrilateral\nfunction computeAabb(points: Point[]) {\n const xs = points.map(p => p[0]);\n const ys = points.map(p => p[1]);\n const minX = Math.min(...xs);\n const minY = Math.min(...ys);\n const maxX = Math.max(...xs);\n const maxY = Math.max(...ys);\n return { minX, minY, maxX, maxY, width: maxX - minX, height: maxY - minY };\n}\n\n// Web-only crop using Canvas; returns dataURL (base64)\nasync function cropWeb(uri: string, points: Point[]): Promise<string> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.onload = () => {\n const { minX, minY, width, height } = computeAabb(points);\n const canvas = document.createElement('canvas');\n canvas.width = Math.max(1, Math.round(width));\n canvas.height = Math.max(1, Math.round(height));\n const ctx = canvas.getContext('2d');\n if (!ctx) return reject(new Error('Canvas context not available'));\n ctx.drawImage(\n img,\n minX, // sx\n minY, // sy\n width, // sw\n height, // sh\n 0,\n 0,\n canvas.width,\n canvas.height\n );\n resolve(canvas.toDataURL('image/jpeg', 0.92));\n };\n img.onerror = (e) => reject(e);\n img.src = uri;\n });\n}\n\n// Fallback: return original for native (no dependency added); caller can still use bbox to draw overlay\nexport async function cropByObb(uri: string, cardObb: any): Promise<{ base64?: string; bbox?: { minX: number; minY: number; width: number; height: number } }> {\n try {\n // card_obb format: [ [ [p1,p2,p3,p4], score ] ] — if confidence too low, don't crop (send full image)\n const confidence = getObbConfidence(cardObb);\n if (confidence !== null && confidence < OBB_CONFIDENCE_THRESHOLD) {\n return {};\n }\n const first = Array.isArray(cardObb) ? cardObb[0] : null;\n const points = Array.isArray(first?.[0]) ? (first[0] as Point[]) : null;\n if (!points || points.length !== 4) return {};\n\n const { minX, minY, width, height } = computeAabb(points);\n\n if (Platform.OS === 'web') {\n const base64 = await cropWeb(uri, points);\n return { base64, bbox: { minX, minY, width, height } };\n }\n // Native: return bbox only; keep base64 undefined\n return { bbox: { minX, minY, width, height } };\n } catch (e) {\n return {};\n }\n}\n\n\n\n\n// exemple d'appel :\nexport async function cropImageWithBBox(uri: string, bbox: any) {\n // 1️⃣ Récupère la taille originale de l'image\n await RNImage.getSize(uri, (width, height) => {\n console.log(\"Image originale:\", width, height);\n });\n\n // // 2️⃣ Suppose que ton bbox vient d'une image affichée dans `displayedSize`\n // const scaleX = originalWidth / displayedSize.width;\n // const scaleY = originalHeight / displayedSize.height;\n\n // 3️⃣ Convertir le bbox à la taille réelle scale 0.10 = 10%\n const crop = {\n originX: bbox.minX,\n originY: bbox.minY,\n width: bbox.width,\n height: bbox.height,\n };\n\n // 4️⃣ Appliquer le crop\n // @ts-ignore - manipulateAsync is deprecated but still functional, new API (useImageManipulator) is a React hook and not suitable for utility functions\n const result = await ImageManipulator.manipulateAsync(\n uri,\n [{ crop }],\n { compress: 1, format: ImageManipulator.SaveFormat.PNG }\n );\n\n console.log(\"Image recadrée:\", result.uri);\n return result.uri;\n}\n\n// Fonction pour rogner avec une tolérance de 10% autour du bbox\nexport async function cropImageWithBBoxWithTolerance(uri: string, bbox: any, tolerance: number = 0.1): Promise<string> {\n console.log(\"cropImageWithBBoxWithTolerance\", JSON.stringify(truncateFields({ uri, bbox, tolerance }), null, 2));\n \n return new Promise<string>((resolve, reject) => {\n let isResolved = false;\n \n // Timeout de sécurité (15 secondes)\n const timeout = setTimeout(() => {\n if (!isResolved) {\n isResolved = true;\n console.warn(\"Timeout lors du rognage avec tolérance, utilisation de l'image originale\");\n resolve(uri); // Retourner l'URI original en cas de timeout\n }\n }, 15000);\n\n // 1️⃣ Récupère la taille originale de l'image\n RNImage.getSize(uri, (imageWidth, imageHeight) => {\n if (isResolved) return;\n \n // 2️⃣ Calculer la tolérance en pixels (10% de chaque côté)\n const toleranceX = bbox.width * tolerance;\n const toleranceY = bbox.height * tolerance;\n\n // 3️⃣ Ajuster le bbox avec la tolérance\n // Calculer les nouvelles coordonnées avec tolérance\n const newMinX = Math.max(0, bbox.minX - toleranceX);\n const newMinY = Math.max(0, bbox.minY - toleranceY);\n const newMaxX = Math.min(imageWidth, bbox.minX + bbox.width + toleranceX);\n const newMaxY = Math.min(imageHeight, bbox.minY + bbox.height + toleranceY);\n\n // Calculer la largeur et hauteur finales\n const finalWidth = newMaxX - newMinX;\n const finalHeight = newMaxY - newMinY;\n\n const crop = {\n originX: newMinX,\n originY: newMinY,\n width: finalWidth,\n height: finalHeight,\n };\n\n logger.log(\"cropImageWithBBoxWithTolerance - crop params\", JSON.stringify(truncateFields({ uri, crop, tolerance, imageWidth, imageHeight }), null, 2));\n\n // 4️⃣ Appliquer le crop avec tolérance\n // @ts-ignore - manipulateAsync is deprecated but still functional, new API (useImageManipulator) is a React hook and not suitable for utility functions\n ImageManipulator.manipulateAsync(\n uri,\n [{ crop }],\n { compress: 0.95, format: ImageManipulator.SaveFormat.JPEG }\n )\n .then((result) => {\n if (isResolved) return;\n isResolved = true;\n clearTimeout(timeout);\n console.log(\"Image recadrée avec tolérance:\", result.uri);\n resolve(result.uri);\n })\n .catch((error) => {\n if (isResolved) return;\n isResolved = true;\n clearTimeout(timeout);\n console.error(\"Erreur lors du rognage avec tolérance:\", error);\n // En cas d'erreur, retourner l'URI original au lieu de rejeter\n resolve(uri);\n });\n }, (error) => {\n if (isResolved) return;\n isResolved = true;\n clearTimeout(timeout);\n console.error(\"Erreur lors de la récupération de la taille de l'image:\", error);\n // En cas d'erreur, retourner l'URI original au lieu de rejeter\n resolve(uri);\n });\n });\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deviceDetection.d.ts","sourceRoot":"","sources":["../../src/utils/deviceDetection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,WAAW,QAAO,OAM9B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checks if the current environment is a mobile web browser based on User Agent.
|
|
3
|
+
* This can be used to distinguish between desktop web and mobile web.
|
|
4
|
+
*/
|
|
5
|
+
export const isMobileWeb = () => {
|
|
6
|
+
if (typeof window === 'undefined' || !window.navigator) {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
const userAgent = window.navigator.userAgent;
|
|
10
|
+
return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent);
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=deviceDetection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deviceDetection.js","sourceRoot":"","sources":["../../src/utils/deviceDetection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,GAAY,EAAE;IACrC,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACrD,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC;IAC7C,OAAO,gEAAgE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC5F,CAAC,CAAC","sourcesContent":["/**\n * Checks if the current environment is a mobile web browser based on User Agent.\n * This can be used to distinguish between desktop web and mobile web.\n */\nexport const isMobileWeb = (): boolean => {\n if (typeof window === 'undefined' || !window.navigator) {\n return false;\n }\n const userAgent = window.navigator.userAgent;\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent);\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platformAlert.d.ts","sourceRoot":"","sources":["../../src/utils/platformAlert.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,aAAa,CAAC;CAC9C;AAED;;;;GAIG;AACH,eAAO,MAAM,SAAS,GACpB,OAAO,MAAM,EACb,UAAU,MAAM,EAChB,UAAU,WAAW,EAAE,KACtB,
|
|
1
|
+
{"version":3,"file":"platformAlert.d.ts","sourceRoot":"","sources":["../../src/utils/platformAlert.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,aAAa,CAAC;CAC9C;AAED;;;;GAIG;AACH,eAAO,MAAM,SAAS,GACpB,OAAO,MAAM,EACb,UAAU,MAAM,EAChB,UAAU,WAAW,EAAE,KACtB,IAiCF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,GACtB,OAAO,MAAM,EACb,SAAS,MAAM,EACf,WAAW,MAAM,IAAI,EACrB,WAAW,MAAM,IAAI,KACpB,IAYF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,MAAM,EAAE,UAAU,MAAM,EAAE,UAAU,MAAM,IAAI,KAAG,IAOvF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platformAlert.js","sourceRoot":"","sources":["../../src/utils/platformAlert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAQ/C;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,KAAa,EACb,OAAgB,EAChB,OAAuB,EACjB,EAAE;IACR,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;QAC1B,kDAAkD;QAClD,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QAE/D,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"platformAlert.js","sourceRoot":"","sources":["../../src/utils/platformAlert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAQ/C;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,KAAa,EACb,OAAgB,EAChB,OAAuB,EACjB,EAAE;IACR,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;QAC1B,kDAAkD;QAClD,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QAE/D,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAElC,wCAAwC;YACxC,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAE9C,IAAI,SAAS,EAAE,CAAC;gBACd,qDAAqD;gBACrD,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAChC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,CAC7C,CAAC;gBACF,aAAa,EAAE,OAAO,EAAE,EAAE,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,2CAA2C;gBAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC;gBACjE,YAAY,EAAE,OAAO,EAAE,EAAE,CAAC;YAC5B,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3C,mCAAmC;YACnC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC1B,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,+BAA+B;YAC/B,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,mDAAmD;QACnD,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;AACH,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,KAAa,EACb,OAAe,EACf,SAAqB,EACrB,QAAqB,EACf,EAAE;IACR,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE;QACxB;YACE,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,QAAQ;SAClB;QACD;YACE,IAAI,EAAE,IAAI;YACV,OAAO,EAAE,SAAS;SACnB;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAa,EAAE,OAAgB,EAAE,OAAoB,EAAQ,EAAE;IAC7F,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE;QACxB;YACE,IAAI,EAAE,IAAI;YACV,OAAO;SACR;KACF,CAAC,CAAC;AACL,CAAC,CAAC","sourcesContent":["import { Platform, Alert } from 'react-native';\n\nexport interface AlertButton {\n text?: string;\n onPress?: () => void;\n style?: 'default' | 'cancel' | 'destructive';\n}\n\n/**\n * Platform-aware alert helper that works on both native and web platforms\n * On web, uses window.confirm/window.alert since Alert.alert is not supported\n * On native, uses the standard Alert.alert\n */\nexport const showAlert = (\n title: string,\n message?: string,\n buttons?: AlertButton[]\n): void => {\n if (Platform.OS === 'web') {\n // Web implementation using native browser dialogs\n const fullMessage = message ? `${title}\\n\\n${message}` : title;\n\n if (buttons && buttons.length > 1) {\n \n // Multiple buttons - use confirm dialog\n const confirmed = window.confirm(fullMessage);\n \n if (confirmed) {\n // Find and call the primary/positive button callback\n const confirmButton = buttons.find(\n btn => btn.style !== 'cancel' && btn.onPress\n );\n confirmButton?.onPress?.();\n } else {\n // Find and call the cancel button callback\n const cancelButton = buttons.find(btn => btn.style === 'cancel');\n cancelButton?.onPress?.();\n }\n } else if (buttons && buttons.length === 1) {\n // Single button - use alert dialog\n window.alert(fullMessage);\n buttons[0]?.onPress?.();\n } else {\n // No buttons - just show alert\n window.alert(fullMessage);\n }\n } else {\n // Native implementation - use standard Alert.alert\n Alert.alert(title, message, buttons);\n }\n};\n\n/**\n * Simplified confirm dialog for yes/no scenarios\n */\nexport const showConfirm = (\n title: string,\n message: string,\n onConfirm: () => void,\n onCancel?: () => void\n): void => {\n showAlert(title, message, [\n {\n text: 'Cancel',\n style: 'cancel',\n onPress: onCancel,\n },\n {\n text: 'OK',\n onPress: onConfirm,\n },\n ]);\n};\n\n/**\n * Simple alert with just an OK button\n */\nexport const showSimpleAlert = (title: string, message?: string, onPress?: () => void): void => {\n showAlert(title, message, [\n {\n text: 'OK',\n onPress,\n },\n ]);\n};\n\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-transformer.d.ts","sourceRoot":"","sources":["../../src/utils/template-transformer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAElB,WAAW,EAaZ,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"template-transformer.d.ts","sourceRoot":"","sources":["../../src/utils/template-transformer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAElB,WAAW,EAaZ,MAAM,oBAAoB,CAAC;AA6S5B;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,eAAe,EAAE,kBAAkB,GAClC,WAAW,CAgGb;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAqB1E"}
|
|
@@ -23,6 +23,10 @@ const COMPONENT_TYPE_MAPPING = {
|
|
|
23
23
|
'verification-progress': 'verification_progress',
|
|
24
24
|
'file-upload': 'file_upload',
|
|
25
25
|
'country-selection': 'country_selection',
|
|
26
|
+
'email-verification': 'email_verification',
|
|
27
|
+
'phone-verification': 'phone_verification',
|
|
28
|
+
'personal-information': 'personal_information',
|
|
29
|
+
'additional-documents': 'additional_documents',
|
|
26
30
|
};
|
|
27
31
|
/**
|
|
28
32
|
* Transform backend translations to SDK labels and instructions
|
|
@@ -197,6 +201,14 @@ function transformComponentConfig(type, backendConfig) {
|
|
|
197
201
|
default_country: backendConfig.default_country || '',
|
|
198
202
|
required: backendConfig.required !== false,
|
|
199
203
|
};
|
|
204
|
+
case 'email_verification':
|
|
205
|
+
return backendConfig;
|
|
206
|
+
case 'phone_verification':
|
|
207
|
+
return backendConfig;
|
|
208
|
+
case 'personal_information':
|
|
209
|
+
return backendConfig;
|
|
210
|
+
case 'additional_documents':
|
|
211
|
+
return backendConfig;
|
|
200
212
|
default:
|
|
201
213
|
return backendConfig;
|
|
202
214
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-transformer.js","sourceRoot":"","sources":["../../src/utils/template-transformer.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BackendKYCTemplate,\n BackendTemplateComponent,\n KYCTemplate,\n TemplateComponent,\n LocalizedText,\n ComponentUI,\n IDCardConfig,\n LocationConfig,\n SelfieConfig,\n FileUploadConfig,\n CountrySelectionConfig,\n ComponentConfig,\n WelcomeConfig,\n GovernmentDocumentType,\n GovernmentIdConfig,\n} from '../types/KYC.types';\nimport { logger } from './logger';\n\n/**\n * Hash a string to a number (simple hash function)\n */\nfunction hashStringToNumber(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return Math.abs(hash);\n}\n\n/**\n * Map backend component types to SDK component types\n */\nconst COMPONENT_TYPE_MAPPING: Record<string, TemplateComponent['type']> = {\n 'welcome': 'welcome',\n 'government-id': 'id_card',\n 'selfie-capture': 'selfie',\n 'location-capture': 'location',\n 'review-submit': 'review_submit',\n 'verification-progress': 'verification_progress',\n 'file-upload': 'file_upload',\n 'country-selection': 'country_selection',\n};\n\n/**\n * Transform backend translations to SDK labels and instructions\n */\nfunction transformTranslations(\n translations: BackendTemplateComponent['translations'],\n defaultLanguage: string = 'en'\n): { labels: LocalizedText; instructions: LocalizedText } {\n const labels: LocalizedText = { en: '', fr: '' };\n const instructions: LocalizedText = { en: '', fr: '' };\n\n // Extract title as label\n if (translations.en?.title) labels.en = translations.en.title;\n if (translations.fr?.title) labels.fr = translations.fr.title;\n\n // Extract instructions\n if (translations.en?.instructions) instructions.en = translations.en.instructions;\n if (translations.fr?.instructions) instructions.fr = translations.fr.instructions;\n\n // Fallback to description if instructions not available\n if (!instructions.en && translations.en?.description) {\n instructions.en = translations.en.description;\n }\n if (!instructions.fr && translations.fr?.description) {\n instructions.fr = translations.fr.description;\n }\n\n // Support other languages\n Object.keys(translations).forEach((lang) => {\n if (lang !== 'en' && lang !== 'fr' && translations[lang]) {\n labels[lang] = translations[lang]?.title || '';\n instructions[lang] = translations[lang]?.instructions || translations[lang]?.description || '';\n }\n });\n\n return { labels, instructions };\n}\n\n/**\n * Transform UI configuration\n */\nfunction transformUI(translations: BackendTemplateComponent['translations']): ComponentUI {\n const buttonText: LocalizedText = { en: '', fr: '' };\n\n if (translations.en?.buttonText) buttonText.en = translations.en.buttonText;\n if (translations.fr?.buttonText) buttonText.fr = translations.fr.buttonText;\n\n // Support other languages\n Object.keys(translations).forEach((lang) => {\n if (lang !== 'en' && lang !== 'fr' && translations[lang]?.buttonText) {\n buttonText[lang] = translations[lang]!.buttonText!;\n }\n });\n\n return {\n buttonText,\n themeColor: '#2DBD60', // Default theme color\n };\n}\n\n/**\n * Transform welcome config\n */\nfunction transformWelcomeConfig(config: any): WelcomeConfig {\n return {\n subtitle: config.subtitle,\n buttonText: config.buttonText,\n requirements: config.requirements || [],\n estimatedTime: config.estimatedTime,\n consentOptions: config.consentOptions || {\n showPrivacyPolicy: true,\n showTermsOfService: true,\n showMarketingConsent: false,\n },\n welcomeMessage: config.welcomeMessage,\n showEstimatedTime: config.showEstimatedTime !== false,\n } as WelcomeConfig;\n}\n\n/**\n * Transform government ID config to IDCardConfig\n */\nfunction transformGovernmentIdConfig(config: any): IDCardConfig {\n const documentTypes: string[] = config.documentTypes || ['passport', 'nationalId'];\n const sides: string[] = [];\n\n if (config.requiredSides === 'front-back' || config.requiredSides === 'both') {\n sides.push('front', 'back');\n } else if (config.requiredSides === 'front') {\n sides.push('front');\n } else if (config.requiredSides === 'back') {\n sides.push('back');\n } else {\n // Default to both sides\n sides.push('front', 'back');\n }\n\n const idCardConfig: IDCardConfig = {\n sides,\n allowed_formats: ['jpg', 'jpeg', 'png'],\n max_size_mb: 10,\n document_types: documentTypes.map((dt: string) => {\n const mapping: Record<string, any> = {\n 'passport': 'passport',\n 'nationalId': 'national_id',\n 'driversLicense': 'drivers_licence',\n 'identityCard': 'identity_card',\n };\n return mapping[dt] || dt;\n }) as any[],\n };\n\n // Add bbox configs if available\n if (config.cameraOverlay?.bbox) {\n const bbox = config.cameraOverlay.bbox;\n idCardConfig.bbox_configs = {} as Record<GovernmentDocumentType, {\n xMin: number;\n yMin: number;\n xMax: number;\n yMax: number;\n borderColor?: string;\n borderWidth?: number;\n cornerRadius?: number;\n }>;\n documentTypes.forEach((dt: string) => {\n const docType = dt as GovernmentDocumentType;\n (idCardConfig.bbox_configs as any)[docType] = {\n xMin: bbox.xMin || 20,\n yMin: bbox.yMin || 140,\n xMax: bbox.xMax || 370,\n yMax: bbox.yMax || 340,\n borderColor: bbox.borderColor || '#2DBD60',\n borderWidth: bbox.borderWidth || 3,\n cornerRadius: bbox.cornerRadius || 8,\n };\n });\n }\n\n // Store additional backend-specific config in a way that can be accessed\n (idCardConfig as any).authenticationMethods = config.authenticationMethods;\n (idCardConfig as any).documentTypesByCountry = config.documentTypesByCountry;\n (idCardConfig as any).selectedCountries = config.selectedCountries;\n (idCardConfig as any).instructionsByDocumentType = config.instructionsByDocumentType;\n (idCardConfig as any).cameraSettings = config.cameraSettings;\n (idCardConfig as any).validationRules = config.validationRules;\n\n return idCardConfig;\n}\n\n/**\n * Transform location capture config\n */\nfunction transformLocationConfig(config: any): LocationConfig {\n return {\n accuracy: config.accuracy || 'high',\n required: config.required !== false,\n } as LocationConfig;\n}\n\n/**\n * Transform selfie capture config\n */\nfunction transformSelfieConfig(config: any): SelfieConfig {\n return {\n liveness_check: config.livenessEnabled !== false,\n max_attempts: config.maxAttempts || 5,\n orientations: config.orientations || ['center'],\n } as SelfieConfig;\n}\n\n/**\n * Transform component config based on type\n */\nfunction transformComponentConfig(\n type: TemplateComponent['type'],\n backendConfig: any\n): ComponentConfig {\n switch (type) {\n case 'welcome':\n return transformWelcomeConfig(backendConfig);\n case 'id_card':\n return transformGovernmentIdConfig(backendConfig);\n case 'location':\n return transformLocationConfig(backendConfig);\n case 'selfie':\n return transformSelfieConfig(backendConfig);\n case 'file_upload':\n return {\n allowed_formats: backendConfig.allowed_formats || ['jpg', 'jpeg', 'png', 'pdf'],\n max_size_mb: backendConfig.max_size_mb || 10,\n required: backendConfig.required !== false,\n } as FileUploadConfig;\n case 'country_selection':\n return {\n allowed_countries: backendConfig.allowed_countries || [],\n default_country: backendConfig.default_country || '',\n required: backendConfig.required !== false,\n } as CountrySelectionConfig;\n default:\n return backendConfig as ComponentConfig;\n }\n}\n\n/**\n * Transform a single backend component to SDK component\n */\nfunction transformComponent(\n backendComponent: BackendTemplateComponent,\n componentIndex: number\n): TemplateComponent {\n const mappedType = COMPONENT_TYPE_MAPPING[backendComponent.type];\n\n if (!mappedType) {\n logger.warn(`Unknown component type: ${backendComponent.type}, defaulting to initialization`);\n }\n\n const componentId = hashStringToNumber(backendComponent.id);\n const { labels, instructions } = transformTranslations(backendComponent.translations);\n const ui = transformUI(backendComponent.translations);\n const config = transformComponentConfig(mappedType || 'initialization', backendComponent.config);\n\n // For components with multiple sides (like id_card), create nested structure\n let finalLabels: LocalizedText | Record<string, LocalizedText> = labels;\n let finalInstructions: LocalizedText | Record<string, LocalizedText> = instructions;\n let finalUI: ComponentUI | Record<string, ComponentUI> = ui;\n\n if (mappedType === 'id_card' && (backendComponent.config as GovernmentIdConfig).requiredSides === 'front-back') {\n // Create separate labels/instructions for front and back\n finalLabels = {\n front: {\n en: backendComponent.translations.en?.title || labels.en,\n fr: backendComponent.translations.fr?.title || labels.fr,\n },\n back: {\n en: `${labels.en} (Back)`,\n fr: `${labels.fr} (Verso)`,\n },\n };\n finalInstructions = {\n front: instructions,\n back: instructions,\n };\n finalUI = {\n front: ui,\n back: ui,\n };\n }\n\n return {\n id: componentId,\n type: mappedType || 'initialization',\n order: backendComponent.order,\n labels: finalLabels,\n instructions: finalInstructions,\n ui: finalUI,\n config,\n required: backendComponent.required !== false,\n } as TemplateComponent;\n}\n\n/**\n * Transform backend template to SDK template format\n */\nexport function transformBackendTemplateToSDK(\n backendTemplate: BackendKYCTemplate\n): KYCTemplate {\n try {\n // Validate backend template\n if (!backendTemplate.id || !backendTemplate.name || !Array.isArray(backendTemplate.components)) {\n throw new Error('Invalid backend template structure');\n }\n\n // Sort components by order\n const sortedComponents = [...backendTemplate.components].sort(\n (a, b) => a.order - b.order\n );\n\n // Transform each component\n const transformedComponents = sortedComponents.map((comp, index) =>\n transformComponent(comp, index)\n );\n\n // Auto-create country_selection component before id_card if government-id has selection data\n // Check if country_selection already exists in backend template\n const hasCountrySelectionInBackend = sortedComponents.some(c => (c as any).type === 'country-selection');\n \n if (!hasCountrySelectionInBackend) {\n // Find the first government-id component with selection data\n const govIdWithSelection = sortedComponents.find(backendComp => \n backendComp.type === 'government-id' && \n backendComp.config && (\n (backendComp.config as any).selectedCountries ||\n (backendComp.config as any).documentTypesByCountry\n )\n );\n \n if (govIdWithSelection) {\n // Find the corresponding transformed id_card component\n const transformedIdCard = transformedComponents.find(c => \n hashStringToNumber(govIdWithSelection.id) === c.id\n );\n \n if (transformedIdCard) {\n // Create a country_selection component before id_card\n const countrySelectionComponent: TemplateComponent = {\n id: hashStringToNumber(`${govIdWithSelection.id}-country-selection`),\n type: 'country_selection',\n order: transformedIdCard.order - 0.5, // Insert before id_card\n labels: {\n en: govIdWithSelection.translations.en?.title || 'Select Country and Document',\n fr: govIdWithSelection.translations.fr?.title || 'Sélectionnez le pays et le document',\n },\n instructions: {\n en: 'Please select your country and document type',\n fr: 'Veuillez sélectionner votre pays et le type de document',\n },\n ui: {\n themeColor: '#2DBD60',\n buttonText: {\n en: 'Continue',\n fr: 'Continuer',\n },\n } as ComponentUI,\n config: {\n allowed_countries: (govIdWithSelection.config as any).selectedCountries || [],\n default_country: '',\n required: true,\n } as CountrySelectionConfig,\n };\n \n // Insert country_selection before id_card in transformedComponents\n const idCardIndex = transformedComponents.indexOf(transformedIdCard);\n transformedComponents.splice(idCardIndex, 0, countrySelectionComponent);\n }\n }\n }\n \n // Re-assign order values sequentially after insertion\n transformedComponents.forEach((comp, index) => {\n comp.order = index + 1;\n });\n\n // Create SDK template\n const sdkTemplate: KYCTemplate = {\n id: hashStringToNumber(backendTemplate.id),\n name: backendTemplate.name as LocalizedText,\n description: backendTemplate.description || {\n en: '',\n fr: '',\n },\n version: backendTemplate.version || '1.0.0',\n components: transformedComponents,\n };\n\n logger.log(`Template transformed: ${backendTemplate.id} -> ${sdkTemplate.id} with ${transformedComponents.length} components`);\n\n return sdkTemplate;\n } catch (error: any) {\n logger.error('Error transforming template:', error);\n throw new Error(`Failed to transform template: ${error.message}`);\n }\n}\n\n/**\n * Validate transformed template\n */\nexport function validateTransformedTemplate(template: KYCTemplate): boolean {\n if (!template.id || !template.name || !Array.isArray(template.components)) {\n return false;\n }\n\n if (!template.name.en || !template.name.fr) {\n return false;\n }\n\n // Validate each component\n for (const component of template.components) {\n if (!component.id || !component.type || typeof component.order !== 'number') {\n return false;\n }\n\n if (!component.labels || !component.instructions || !component.config) {\n return false;\n }\n }\n\n return true;\n}"]}
|
|
1
|
+
{"version":3,"file":"template-transformer.js","sourceRoot":"","sources":["../../src/utils/template-transformer.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BackendKYCTemplate,\n BackendTemplateComponent,\n KYCTemplate,\n TemplateComponent,\n LocalizedText,\n ComponentUI,\n IDCardConfig,\n LocationConfig,\n SelfieConfig,\n FileUploadConfig,\n CountrySelectionConfig,\n ComponentConfig,\n WelcomeConfig,\n GovernmentDocumentType,\n GovernmentIdConfig,\n} from '../types/KYC.types';\nimport { logger } from './logger';\n\n/**\n * Hash a string to a number (simple hash function)\n */\nfunction hashStringToNumber(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return Math.abs(hash);\n}\n\n/**\n * Map backend component types to SDK component types\n */\nconst COMPONENT_TYPE_MAPPING: Record<string, TemplateComponent['type']> = {\n 'welcome': 'welcome',\n 'government-id': 'id_card',\n 'selfie-capture': 'selfie',\n 'location-capture': 'location',\n 'review-submit': 'review_submit',\n 'verification-progress': 'verification_progress',\n 'file-upload': 'file_upload',\n 'country-selection': 'country_selection',\n 'email-verification': 'email_verification',\n 'phone-verification': 'phone_verification',\n 'personal-information': 'personal_information',\n 'additional-documents': 'additional_documents',\n};\n\n/**\n * Transform backend translations to SDK labels and instructions\n */\nfunction transformTranslations(\n translations: BackendTemplateComponent['translations'],\n defaultLanguage: string = 'en'\n): { labels: LocalizedText; instructions: LocalizedText } {\n const labels: LocalizedText = { en: '', fr: '' };\n const instructions: LocalizedText = { en: '', fr: '' };\n\n // Extract title as label\n if (translations.en?.title) labels.en = translations.en.title;\n if (translations.fr?.title) labels.fr = translations.fr.title;\n\n // Extract instructions\n if (translations.en?.instructions) instructions.en = translations.en.instructions;\n if (translations.fr?.instructions) instructions.fr = translations.fr.instructions;\n\n // Fallback to description if instructions not available\n if (!instructions.en && translations.en?.description) {\n instructions.en = translations.en.description;\n }\n if (!instructions.fr && translations.fr?.description) {\n instructions.fr = translations.fr.description;\n }\n\n // Support other languages\n Object.keys(translations).forEach((lang) => {\n if (lang !== 'en' && lang !== 'fr' && translations[lang]) {\n labels[lang] = translations[lang]?.title || '';\n instructions[lang] = translations[lang]?.instructions || translations[lang]?.description || '';\n }\n });\n\n return { labels, instructions };\n}\n\n/**\n * Transform UI configuration\n */\nfunction transformUI(translations: BackendTemplateComponent['translations']): ComponentUI {\n const buttonText: LocalizedText = { en: '', fr: '' };\n\n if (translations.en?.buttonText) buttonText.en = translations.en.buttonText;\n if (translations.fr?.buttonText) buttonText.fr = translations.fr.buttonText;\n\n // Support other languages\n Object.keys(translations).forEach((lang) => {\n if (lang !== 'en' && lang !== 'fr' && translations[lang]?.buttonText) {\n buttonText[lang] = translations[lang]!.buttonText!;\n }\n });\n\n return {\n buttonText,\n themeColor: '#2DBD60', // Default theme color\n };\n}\n\n/**\n * Transform welcome config\n */\nfunction transformWelcomeConfig(config: any): WelcomeConfig {\n return {\n subtitle: config.subtitle,\n buttonText: config.buttonText,\n requirements: config.requirements || [],\n estimatedTime: config.estimatedTime,\n consentOptions: config.consentOptions || {\n showPrivacyPolicy: true,\n showTermsOfService: true,\n showMarketingConsent: false,\n },\n welcomeMessage: config.welcomeMessage,\n showEstimatedTime: config.showEstimatedTime !== false,\n } as WelcomeConfig;\n}\n\n/**\n * Transform government ID config to IDCardConfig\n */\nfunction transformGovernmentIdConfig(config: any): IDCardConfig {\n const documentTypes: string[] = config.documentTypes || ['passport', 'nationalId'];\n const sides: string[] = [];\n\n if (config.requiredSides === 'front-back' || config.requiredSides === 'both') {\n sides.push('front', 'back');\n } else if (config.requiredSides === 'front') {\n sides.push('front');\n } else if (config.requiredSides === 'back') {\n sides.push('back');\n } else {\n // Default to both sides\n sides.push('front', 'back');\n }\n\n const idCardConfig: IDCardConfig = {\n sides,\n allowed_formats: ['jpg', 'jpeg', 'png'],\n max_size_mb: 10,\n document_types: documentTypes.map((dt: string) => {\n const mapping: Record<string, any> = {\n 'passport': 'passport',\n 'nationalId': 'national_id',\n 'driversLicense': 'drivers_licence',\n 'identityCard': 'identity_card',\n };\n return mapping[dt] || dt;\n }) as any[],\n };\n\n // Add bbox configs if available\n if (config.cameraOverlay?.bbox) {\n const bbox = config.cameraOverlay.bbox;\n idCardConfig.bbox_configs = {} as Record<GovernmentDocumentType, {\n xMin: number;\n yMin: number;\n xMax: number;\n yMax: number;\n borderColor?: string;\n borderWidth?: number;\n cornerRadius?: number;\n }>;\n documentTypes.forEach((dt: string) => {\n const docType = dt as GovernmentDocumentType;\n (idCardConfig.bbox_configs as any)[docType] = {\n xMin: bbox.xMin || 20,\n yMin: bbox.yMin || 140,\n xMax: bbox.xMax || 370,\n yMax: bbox.yMax || 340,\n borderColor: bbox.borderColor || '#2DBD60',\n borderWidth: bbox.borderWidth || 3,\n cornerRadius: bbox.cornerRadius || 8,\n };\n });\n }\n\n // Store additional backend-specific config in a way that can be accessed\n (idCardConfig as any).authenticationMethods = config.authenticationMethods;\n (idCardConfig as any).documentTypesByCountry = config.documentTypesByCountry;\n (idCardConfig as any).selectedCountries = config.selectedCountries;\n (idCardConfig as any).instructionsByDocumentType = config.instructionsByDocumentType;\n (idCardConfig as any).cameraSettings = config.cameraSettings;\n (idCardConfig as any).validationRules = config.validationRules;\n\n return idCardConfig;\n}\n\n/**\n * Transform location capture config\n */\nfunction transformLocationConfig(config: any): LocationConfig {\n return {\n accuracy: config.accuracy || 'high',\n required: config.required !== false,\n } as LocationConfig;\n}\n\n/**\n * Transform selfie capture config\n */\nfunction transformSelfieConfig(config: any): SelfieConfig {\n return {\n liveness_check: config.livenessEnabled !== false,\n max_attempts: config.maxAttempts || 5,\n orientations: config.orientations || ['center'],\n } as SelfieConfig;\n}\n\n/**\n * Transform component config based on type\n */\nfunction transformComponentConfig(\n type: TemplateComponent['type'],\n backendConfig: any\n): ComponentConfig {\n switch (type) {\n case 'welcome':\n return transformWelcomeConfig(backendConfig);\n case 'id_card':\n return transformGovernmentIdConfig(backendConfig);\n case 'location':\n return transformLocationConfig(backendConfig);\n case 'selfie':\n return transformSelfieConfig(backendConfig);\n case 'file_upload':\n return {\n allowed_formats: backendConfig.allowed_formats || ['jpg', 'jpeg', 'png', 'pdf'],\n max_size_mb: backendConfig.max_size_mb || 10,\n required: backendConfig.required !== false,\n } as FileUploadConfig;\n case 'country_selection':\n return {\n allowed_countries: backendConfig.allowed_countries || [],\n default_country: backendConfig.default_country || '',\n required: backendConfig.required !== false,\n } as CountrySelectionConfig;\n case 'email_verification':\n return backendConfig as any;\n case 'phone_verification':\n return backendConfig as any;\n case 'personal_information':\n return backendConfig as any;\n case 'additional_documents':\n return backendConfig as any;\n default:\n return backendConfig as ComponentConfig;\n }\n}\n\n/**\n * Transform a single backend component to SDK component\n */\nfunction transformComponent(\n backendComponent: BackendTemplateComponent,\n componentIndex: number\n): TemplateComponent {\n const mappedType = COMPONENT_TYPE_MAPPING[backendComponent.type];\n\n if (!mappedType) {\n logger.warn(`Unknown component type: ${backendComponent.type}, defaulting to initialization`);\n }\n\n const componentId = hashStringToNumber(backendComponent.id);\n const { labels, instructions } = transformTranslations(backendComponent.translations);\n const ui = transformUI(backendComponent.translations);\n const config = transformComponentConfig(mappedType || 'initialization', backendComponent.config);\n\n // For components with multiple sides (like id_card), create nested structure\n let finalLabels: LocalizedText | Record<string, LocalizedText> = labels;\n let finalInstructions: LocalizedText | Record<string, LocalizedText> = instructions;\n let finalUI: ComponentUI | Record<string, ComponentUI> = ui;\n\n if (mappedType === 'id_card' && (backendComponent.config as GovernmentIdConfig).requiredSides === 'front-back') {\n // Create separate labels/instructions for front and back\n finalLabels = {\n front: {\n en: backendComponent.translations.en?.title || labels.en,\n fr: backendComponent.translations.fr?.title || labels.fr,\n },\n back: {\n en: `${labels.en} (Back)`,\n fr: `${labels.fr} (Verso)`,\n },\n };\n finalInstructions = {\n front: instructions,\n back: instructions,\n };\n finalUI = {\n front: ui,\n back: ui,\n };\n }\n\n return {\n id: componentId,\n type: mappedType || 'initialization',\n order: backendComponent.order,\n labels: finalLabels,\n instructions: finalInstructions,\n ui: finalUI,\n config,\n required: backendComponent.required !== false,\n } as TemplateComponent;\n}\n\n/**\n * Transform backend template to SDK template format\n */\nexport function transformBackendTemplateToSDK(\n backendTemplate: BackendKYCTemplate\n): KYCTemplate {\n try {\n // Validate backend template\n if (!backendTemplate.id || !backendTemplate.name || !Array.isArray(backendTemplate.components)) {\n throw new Error('Invalid backend template structure');\n }\n\n // Sort components by order\n const sortedComponents = [...backendTemplate.components].sort(\n (a, b) => a.order - b.order\n );\n\n // Transform each component\n const transformedComponents = sortedComponents.map((comp, index) =>\n transformComponent(comp, index)\n );\n\n // Auto-create country_selection component before id_card if government-id has selection data\n // Check if country_selection already exists in backend template\n const hasCountrySelectionInBackend = sortedComponents.some(c => (c as any).type === 'country-selection');\n\n if (!hasCountrySelectionInBackend) {\n // Find the first government-id component with selection data\n const govIdWithSelection = sortedComponents.find(backendComp =>\n backendComp.type === 'government-id' &&\n backendComp.config && (\n (backendComp.config as any).selectedCountries ||\n (backendComp.config as any).documentTypesByCountry\n )\n );\n\n if (govIdWithSelection) {\n // Find the corresponding transformed id_card component\n const transformedIdCard = transformedComponents.find(c =>\n hashStringToNumber(govIdWithSelection.id) === c.id\n );\n\n if (transformedIdCard) {\n // Create a country_selection component before id_card\n const countrySelectionComponent: TemplateComponent = {\n id: hashStringToNumber(`${govIdWithSelection.id}-country-selection`),\n type: 'country_selection',\n order: transformedIdCard.order - 0.5, // Insert before id_card\n labels: {\n en: govIdWithSelection.translations.en?.title || 'Select Country and Document',\n fr: govIdWithSelection.translations.fr?.title || 'Sélectionnez le pays et le document',\n },\n instructions: {\n en: 'Please select your country and document type',\n fr: 'Veuillez sélectionner votre pays et le type de document',\n },\n ui: {\n themeColor: '#2DBD60',\n buttonText: {\n en: 'Continue',\n fr: 'Continuer',\n },\n } as ComponentUI,\n config: {\n allowed_countries: (govIdWithSelection.config as any).selectedCountries || [],\n default_country: '',\n required: true,\n } as CountrySelectionConfig,\n };\n\n // Insert country_selection before id_card in transformedComponents\n const idCardIndex = transformedComponents.indexOf(transformedIdCard);\n transformedComponents.splice(idCardIndex, 0, countrySelectionComponent);\n }\n }\n }\n\n // Re-assign order values sequentially after insertion\n transformedComponents.forEach((comp, index) => {\n comp.order = index + 1;\n });\n\n // Create SDK template\n const sdkTemplate: KYCTemplate = {\n id: hashStringToNumber(backendTemplate.id),\n name: backendTemplate.name as LocalizedText,\n description: backendTemplate.description || {\n en: '',\n fr: '',\n },\n version: backendTemplate.version || '1.0.0',\n components: transformedComponents,\n };\n\n logger.log(`Template transformed: ${backendTemplate.id} -> ${sdkTemplate.id} with ${transformedComponents.length} components`);\n\n return sdkTemplate;\n } catch (error: any) {\n logger.error('Error transforming template:', error);\n throw new Error(`Failed to transform template: ${error.message}`);\n }\n}\n\n/**\n * Validate transformed template\n */\nexport function validateTransformedTemplate(template: KYCTemplate): boolean {\n if (!template.id || !template.name || !Array.isArray(template.components)) {\n return false;\n }\n\n if (!template.name.en || !template.name.fr) {\n return false;\n }\n\n // Validate each component\n for (const component of template.components) {\n if (!component.id || !component.type || typeof component.order !== 'number') {\n return false;\n }\n\n if (!component.labels || !component.instructions || !component.config) {\n return false;\n }\n }\n\n return true;\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebKYCEntry.d.ts","sourceRoot":"","sources":["../../src/web/WebKYCEntry.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"WebKYCEntry.d.ts","sourceRoot":"","sources":["../../src/web/WebKYCEntry.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAUhE,UAAU,gBAAgB;IACxB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AA0BD,QAAA,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAoR3C,CAAC;AA0DF,eAAe,WAAW,CAAC"}
|