@transfergratis/react-native-sdk 0.1.24 → 0.1.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +12 -5
  2. package/android/build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar +0 -0
  3. package/android/build/intermediates/annotations_typedef_file/debug/extractDebugAnnotations/typedefs.txt +0 -0
  4. package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +1 -1
  5. package/android/build/intermediates/incremental/debug-mergeJavaRes/merge-state +0 -0
  6. package/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +61 -59
  7. package/android/build/intermediates/merged_java_res/debug/mergeDebugJavaResource/feature-transfergratis-react-native-sdk.jar +0 -0
  8. package/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +12 -5
  9. package/android/build/kotlin/compileDebugKotlin/cacheable/last-build.bin +0 -0
  10. package/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin +0 -0
  11. package/android/build/outputs/aar/transfergratis-react-native-sdk-debug.aar +0 -0
  12. package/android/build/outputs/logs/manifest-merger-debug-report.txt +26 -34
  13. package/android/src/main/AndroidManifest.xml +10 -7
  14. package/build/components/KYCElements/AdditionalDocumentsTemplate.d.ts +12 -0
  15. package/build/components/KYCElements/AdditionalDocumentsTemplate.d.ts.map +1 -0
  16. package/build/components/KYCElements/AdditionalDocumentsTemplate.js +283 -0
  17. package/build/components/KYCElements/AdditionalDocumentsTemplate.js.map +1 -0
  18. package/build/components/KYCElements/EmailVerificationTemplate.d.ts +12 -0
  19. package/build/components/KYCElements/EmailVerificationTemplate.d.ts.map +1 -0
  20. package/build/components/KYCElements/EmailVerificationTemplate.js +193 -0
  21. package/build/components/KYCElements/EmailVerificationTemplate.js.map +1 -0
  22. package/build/components/KYCElements/IDCardCapture.d.ts.map +1 -1
  23. package/build/components/KYCElements/IDCardCapture.js +180 -7
  24. package/build/components/KYCElements/IDCardCapture.js.map +1 -1
  25. package/build/components/KYCElements/OrientationVideoCapture.d.ts +2 -0
  26. package/build/components/KYCElements/OrientationVideoCapture.d.ts.map +1 -1
  27. package/build/components/KYCElements/OrientationVideoCapture.js +2 -2
  28. package/build/components/KYCElements/OrientationVideoCapture.js.map +1 -1
  29. package/build/components/KYCElements/OrientationVideoCaptureEnhanced.d.ts +2 -0
  30. package/build/components/KYCElements/OrientationVideoCaptureEnhanced.d.ts.map +1 -1
  31. package/build/components/KYCElements/OrientationVideoCaptureEnhanced.js +2 -2
  32. package/build/components/KYCElements/OrientationVideoCaptureEnhanced.js.map +1 -1
  33. package/build/components/KYCElements/OrientationVideoCaptureFinal.d.ts +2 -0
  34. package/build/components/KYCElements/OrientationVideoCaptureFinal.d.ts.map +1 -1
  35. package/build/components/KYCElements/OrientationVideoCaptureFinal.js +2 -2
  36. package/build/components/KYCElements/OrientationVideoCaptureFinal.js.map +1 -1
  37. package/build/components/KYCElements/PersonalInformationTemplate.d.ts +12 -0
  38. package/build/components/KYCElements/PersonalInformationTemplate.d.ts.map +1 -0
  39. package/build/components/KYCElements/PersonalInformationTemplate.js +120 -0
  40. package/build/components/KYCElements/PersonalInformationTemplate.js.map +1 -0
  41. package/build/components/KYCElements/PhoneVerificationTemplate.d.ts +12 -0
  42. package/build/components/KYCElements/PhoneVerificationTemplate.d.ts.map +1 -0
  43. package/build/components/KYCElements/PhoneVerificationTemplate.js +185 -0
  44. package/build/components/KYCElements/PhoneVerificationTemplate.js.map +1 -0
  45. package/build/components/KYCElements/SelfieCaptureTemplate.d.ts.map +1 -1
  46. package/build/components/KYCElements/SelfieCaptureTemplate.js +7 -3
  47. package/build/components/KYCElements/SelfieCaptureTemplate.js.map +1 -1
  48. package/build/components/TemplateKYCExample.d.ts +4 -0
  49. package/build/components/TemplateKYCExample.d.ts.map +1 -1
  50. package/build/components/TemplateKYCExample.js +7 -30
  51. package/build/components/TemplateKYCExample.js.map +1 -1
  52. package/build/components/TemplateKYCFlowRefactored.d.ts +4 -0
  53. package/build/components/TemplateKYCFlowRefactored.d.ts.map +1 -1
  54. package/build/components/TemplateKYCFlowRefactored.js +14 -2
  55. package/build/components/TemplateKYCFlowRefactored.js.map +1 -1
  56. package/build/config/KYCConfig.d.ts +14 -0
  57. package/build/config/KYCConfig.d.ts.map +1 -0
  58. package/build/config/KYCConfig.js +26 -0
  59. package/build/config/KYCConfig.js.map +1 -0
  60. package/build/config/allowedDomains.d.ts.map +1 -1
  61. package/build/config/allowedDomains.js +4 -19
  62. package/build/config/allowedDomains.js.map +1 -1
  63. package/build/hooks/useOrientationVideo.d.ts +2 -1
  64. package/build/hooks/useOrientationVideo.d.ts.map +1 -1
  65. package/build/hooks/useOrientationVideo.js +3 -3
  66. package/build/hooks/useOrientationVideo.js.map +1 -1
  67. package/build/hooks/useTemplateKYCFlow.d.ts +6 -1
  68. package/build/hooks/useTemplateKYCFlow.d.ts.map +1 -1
  69. package/build/hooks/useTemplateKYCFlow.js +286 -23
  70. package/build/hooks/useTemplateKYCFlow.js.map +1 -1
  71. package/build/i18n/en/index.d.ts +40 -0
  72. package/build/i18n/en/index.d.ts.map +1 -1
  73. package/build/i18n/en/index.js +41 -1
  74. package/build/i18n/en/index.js.map +1 -1
  75. package/build/i18n/fr/index.d.ts +26 -0
  76. package/build/i18n/fr/index.d.ts.map +1 -1
  77. package/build/i18n/fr/index.js +27 -1
  78. package/build/i18n/fr/index.js.map +1 -1
  79. package/build/index.d.ts +1 -0
  80. package/build/index.d.ts.map +1 -1
  81. package/build/index.js +2 -0
  82. package/build/index.js.map +1 -1
  83. package/build/modules/api/CardAuthentification.d.ts +24 -3
  84. package/build/modules/api/CardAuthentification.d.ts.map +1 -1
  85. package/build/modules/api/CardAuthentification.js +68 -10
  86. package/build/modules/api/CardAuthentification.js.map +1 -1
  87. package/build/modules/api/KYCService.d.ts +7 -7
  88. package/build/modules/api/KYCService.d.ts.map +1 -1
  89. package/build/modules/api/KYCService.js +101 -37
  90. package/build/modules/api/KYCService.js.map +1 -1
  91. package/build/modules/api/SelfieVerification.d.ts +3 -1
  92. package/build/modules/api/SelfieVerification.d.ts.map +1 -1
  93. package/build/modules/api/SelfieVerification.js +17 -1
  94. package/build/modules/api/SelfieVerification.js.map +1 -1
  95. package/build/modules/api/TemplateService.d.ts +0 -1
  96. package/build/modules/api/TemplateService.d.ts.map +1 -1
  97. package/build/modules/api/TemplateService.js +3 -3
  98. package/build/modules/api/TemplateService.js.map +1 -1
  99. package/build/types/KYC.types.d.ts +124 -3
  100. package/build/types/KYC.types.d.ts.map +1 -1
  101. package/build/types/KYC.types.js.map +1 -1
  102. package/build/types/env.types.d.ts +13 -0
  103. package/build/types/env.types.d.ts.map +1 -0
  104. package/build/types/env.types.js +2 -0
  105. package/build/types/env.types.js.map +1 -0
  106. package/build/utils/deviceDetection.d.ts +6 -0
  107. package/build/utils/deviceDetection.d.ts.map +1 -0
  108. package/build/utils/deviceDetection.js +12 -0
  109. package/build/utils/deviceDetection.js.map +1 -0
  110. package/build/utils/platformAlert.d.ts.map +1 -1
  111. package/build/utils/platformAlert.js.map +1 -1
  112. package/build/utils/template-transformer.d.ts.map +1 -1
  113. package/build/utils/template-transformer.js +12 -0
  114. package/build/utils/template-transformer.js.map +1 -1
  115. package/build/web/WebKYCEntry.d.ts.map +1 -1
  116. package/build/web/WebKYCEntry.js +82 -38
  117. package/build/web/WebKYCEntry.js.map +1 -1
  118. package/package.json +1 -1
  119. package/plugin/build/withVisionCamera.js +3 -4
  120. package/plugin/src/withVisionCamera.js +3 -4
  121. package/plugin/src/withVisionCamera.ts +3 -4
  122. package/src/components/KYCElements/AdditionalDocumentsTemplate.tsx +346 -0
  123. package/src/components/KYCElements/EmailVerificationTemplate.tsx +264 -0
  124. package/src/components/KYCElements/IDCardCapture.tsx +216 -15
  125. package/src/components/KYCElements/OrientationVideoCapture.tsx +4 -1
  126. package/src/components/KYCElements/OrientationVideoCaptureEnhanced.tsx +4 -1
  127. package/src/components/KYCElements/OrientationVideoCaptureFinal.tsx +4 -1
  128. package/src/components/KYCElements/PersonalInformationTemplate.tsx +158 -0
  129. package/src/components/KYCElements/PhoneVerificationTemplate.tsx +253 -0
  130. package/src/components/KYCElements/SelfieCaptureTemplate.tsx +6 -3
  131. package/src/components/TemplateKYCExample.tsx +31 -46
  132. package/src/components/TemplateKYCFlowRefactored.tsx +27 -1
  133. package/src/config/KYCConfig.ts +34 -0
  134. package/src/config/allowedDomains.ts +7 -26
  135. package/src/hooks/useOrientationVideo.ts +5 -4
  136. package/src/hooks/useTemplateKYCFlow.tsx +314 -21
  137. package/src/i18n/en/index.ts +43 -2
  138. package/src/i18n/fr/index.ts +28 -1
  139. package/src/index.ts +3 -0
  140. package/src/modules/api/CardAuthentification.ts +75 -10
  141. package/src/modules/api/KYCService.ts +117 -37
  142. package/src/modules/api/SelfieVerification.ts +25 -3
  143. package/src/modules/api/TemplateService.ts +4 -4
  144. package/src/types/KYC.types.ts +146 -3
  145. package/src/types/env.types.ts +13 -0
  146. package/src/utils/deviceDetection.ts +11 -0
  147. package/src/utils/platformAlert.ts +1 -0
  148. package/src/utils/template-transformer.ts +20 -8
  149. package/src/web/WebKYCEntry.tsx +112 -61
@@ -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;AAQhE,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;AAiBD,QAAA,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAiO3C,CAAC;AA0DF,eAAe,WAAW,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;AAsBD,QAAA,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CA6Q3C,CAAC;AA0DF,eAAe,WAAW,CAAC"}
@@ -4,7 +4,8 @@ import { View, Text, StyleSheet, SafeAreaView, ActivityIndicator } from 'react-n
4
4
  // import { KYCTemplate } from '../types/KYC.types';
5
5
  import { useI18n } from '../hooks/useI18n';
6
6
  import { TemplateKYCExample } from '../components/TemplateKYCExample';
7
- import { isCallbackUrlAllowed, generateCallbackSignature } from '../config/allowedDomains';
7
+ import { isCallbackUrlAllowed } from '../config/allowedDomains';
8
+ import KYCConfig from '../config/KYCConfig';
8
9
  const WebKYCEntry = ({ onComplete, onError, onCancel, }) => {
9
10
  const { setLocale } = useI18n();
10
11
  const [urlParams, setUrlParams] = useState({});
@@ -16,18 +17,29 @@ const WebKYCEntry = ({ onComplete, onError, onCancel, }) => {
16
17
  if (typeof window === 'undefined')
17
18
  return {};
18
19
  const urlParams = new URLSearchParams(window.location.search);
20
+ const envParam = urlParams.get('env');
21
+ const validEnv = envParam === 'SANDBOX' || envParam === 'PRODUCTION' ? envParam : 'PRODUCTION';
22
+ const serverEnvParam = urlParams.get('server_env');
23
+ const validServerEnv = serverEnvParam === 'TEST' || serverEnvParam === 'PRODUCTION'
24
+ ? serverEnvParam
25
+ : 'PRODUCTION';
19
26
  return {
20
27
  token: urlParams.get('token') || undefined,
21
28
  return_url: urlParams.get('return_url') || undefined,
29
+ push_url: urlParams.get('push_url') || undefined,
22
30
  lang: urlParams.get('lang') || 'en',
23
31
  theme: urlParams.get('theme') || 'light',
24
32
  kyc_id: urlParams.get('kyc_id') || undefined,
25
33
  secret: urlParams.get('secret') || undefined,
34
+ env: validEnv,
35
+ template_id: urlParams.get('template_id') || undefined,
36
+ server_env: validServerEnv,
37
+ step: urlParams.get('step') || undefined,
26
38
  };
27
39
  }, []);
28
40
  // Safe redirect function with enhanced validation
29
41
  const redirectToReturnUrl = useCallback(async (params) => {
30
- const { return_url, secret } = urlParams;
42
+ const { return_url } = urlParams;
31
43
  if (!return_url) {
32
44
  console.warn('No return_url provided');
33
45
  return;
@@ -46,37 +58,9 @@ const WebKYCEntry = ({ onComplete, onError, onCancel, }) => {
46
58
  });
47
59
  return;
48
60
  }
49
- const returnUrl = new URL(return_url);
50
- // Build redirect URL with parameters
51
- const redirectUrl = new URL(returnUrl);
52
- const redirectParams = {
53
- status: params.status,
54
- };
55
- if (params.kyc_id) {
56
- redirectParams.kyc_id = params.kyc_id;
57
- }
58
- if (params.message) {
59
- redirectParams.message = params.message;
60
- }
61
- if (params.processing_state) {
62
- redirectParams.processing_state = params.processing_state;
63
- }
64
- if (params.verification_steps) {
65
- redirectParams.verification_steps = JSON.stringify(params.verification_steps);
66
- }
67
- // Generate signature for integrity verification
68
- if (secret) {
69
- const signature = await generateCallbackSignature(redirectParams, secret);
70
- if (signature) {
71
- redirectParams.sig = signature;
72
- }
73
- }
74
- // Add all params to URL
75
- Object.entries(redirectParams).forEach(([key, value]) => {
76
- redirectUrl.searchParams.set(key, value);
77
- });
78
61
  // Send postMessage to parent if in iframe
79
62
  if (window.parent !== window) {
63
+ const targetOrigin = new URL(return_url).origin;
80
64
  window.parent.postMessage({
81
65
  type: 'kyc_result',
82
66
  status: params.status,
@@ -84,10 +68,11 @@ const WebKYCEntry = ({ onComplete, onError, onCancel, }) => {
84
68
  message: params.message,
85
69
  processing_state: params.processing_state,
86
70
  verification_steps: params.verification_steps,
87
- }, returnUrl.origin); // Use specific origin instead of '*'
71
+ }, targetOrigin);
72
+ }
73
+ else {
74
+ window.location.href = return_url;
88
75
  }
89
- // Redirect to return URL
90
- window.location.href = redirectUrl.toString();
91
76
  }
92
77
  catch (error) {
93
78
  console.error('Error during redirect:', error);
@@ -95,10 +80,36 @@ const WebKYCEntry = ({ onComplete, onError, onCancel, }) => {
95
80
  }
96
81
  }, [urlParams]);
97
82
  // Handle KYC completion
98
- const handleComplete = useCallback((data) => {
83
+ const handleComplete = useCallback(async (data) => {
99
84
  console.log('KYC completed:', data);
100
85
  // Check if still processing/analyzing
101
86
  const isStillProcessing = data.isProcessing || data.session?.isProcessing;
87
+ // Handle Push URL webhook if provided
88
+ if (urlParams.push_url) {
89
+ try {
90
+ const verificationState = {
91
+ status: 'success', // verification completed successfully
92
+ result: data, // pass complete data object as result
93
+ };
94
+ // Send data to provided push_url with a timeout
95
+ const controller = new AbortController();
96
+ const timeoutId = setTimeout(() => controller.abort(), 5000); // 5s timeout
97
+ await fetch(urlParams.push_url, {
98
+ method: 'POST',
99
+ headers: {
100
+ 'Content-Type': 'application/json',
101
+ },
102
+ body: JSON.stringify(verificationState),
103
+ signal: controller.signal,
104
+ });
105
+ clearTimeout(timeoutId);
106
+ console.log('Successfully pushed KYC data to webhook');
107
+ }
108
+ catch (err) {
109
+ // Fail open - redirect anyway even if webhook fails
110
+ console.warn('Failed to push data to webhook URL:', err);
111
+ }
112
+ }
102
113
  redirectToReturnUrl({
103
114
  status: 'completed',
104
115
  kyc_id: data.session_id || urlParams.kyc_id,
@@ -111,7 +122,7 @@ const WebKYCEntry = ({ onComplete, onError, onCancel, }) => {
111
122
  },
112
123
  });
113
124
  onComplete?.(data);
114
- }, [redirectToReturnUrl, urlParams.kyc_id, onComplete]);
125
+ }, [redirectToReturnUrl, urlParams, onComplete]);
115
126
  // Handle KYC error
116
127
  const handleError = useCallback((error) => {
117
128
  console.error('KYC error:', error);
@@ -126,8 +137,33 @@ const WebKYCEntry = ({ onComplete, onError, onCancel, }) => {
126
137
  }, [redirectToReturnUrl, urlParams.kyc_id, onError]);
127
138
  // Handle KYC cancellation
128
139
  const handleCancel = useCallback(() => {
129
- console.log('KYC cancelled');
140
+ console.log('KYC cancelled', urlParams.push_url, urlParams);
130
141
  setIsAnalyzing(false);
142
+ if (urlParams.push_url) {
143
+ try {
144
+ const verificationState = {
145
+ status: 'cancelled', // verification cancelled
146
+ result: null, // pass null as result
147
+ };
148
+ // Send data to provided push_url with a timeout
149
+ const controller = new AbortController();
150
+ const timeoutId = setTimeout(() => controller.abort(), 5000); // 5s timeout
151
+ fetch(urlParams.push_url, {
152
+ method: 'POST',
153
+ headers: {
154
+ 'Content-Type': 'application/json',
155
+ },
156
+ body: JSON.stringify(verificationState),
157
+ signal: controller.signal,
158
+ });
159
+ clearTimeout(timeoutId);
160
+ console.log('Successfully pushed KYC cancellation data to webhook');
161
+ }
162
+ catch (err) {
163
+ // Fail open - redirect anyway even if webhook fails
164
+ console.warn('Failed to push data to webhook URL:', err);
165
+ }
166
+ }
131
167
  redirectToReturnUrl({
132
168
  status: 'cancelled',
133
169
  kyc_id: urlParams.kyc_id,
@@ -145,6 +181,10 @@ const WebKYCEntry = ({ onComplete, onError, onCancel, }) => {
145
181
  if (params.lang) {
146
182
  setLocale(params.lang);
147
183
  }
184
+ // Configure backend environment
185
+ if (params.server_env) {
186
+ KYCConfig.setBackendEnvironment(params.server_env);
187
+ }
148
188
  setIsLoading(false);
149
189
  }
150
190
  catch (error) {
@@ -176,7 +216,11 @@ const WebKYCEntry = ({ onComplete, onError, onCancel, }) => {
176
216
  <Text style={styles.analyzingSubtext}>This may take a few moments</Text>
177
217
  </View>
178
218
  </View>)}
179
- <TemplateKYCExample onComplete={handleComplete} onCancel={handleCancel} onError={handleError} language={urlParams.lang || 'en'} API_KEY={urlParams.token}/>
219
+ <TemplateKYCExample onComplete={handleComplete} onCancel={handleCancel} onError={handleError} language={urlParams.lang || 'en'} API_KEY={urlParams.token} templateId={urlParams.template_id} env={urlParams.env || 'PRODUCTION'} existingSessionId={urlParams.kyc_id} initialStep={urlParams.step ? (() => {
220
+ const stepNum = parseInt(urlParams.step, 10);
221
+ console.log('Parsing step from URL:', { stepString: urlParams.step, stepNumber: stepNum, isNaN: isNaN(stepNum) });
222
+ return isNaN(stepNum) ? undefined : stepNum;
223
+ })() : undefined}/>
180
224
  </SafeAreaView>);
181
225
  };
182
226
  const styles = StyleSheet.create({
@@ -1 +1 @@
1
- {"version":3,"file":"WebKYCEntry.js","sourceRoot":"","sources":["../../src/web/WebKYCEntry.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useState, useCallback } from 'react';\nimport { View, Text, StyleSheet, SafeAreaView, ActivityIndicator } from 'react-native';\n// import { TemplateKYCFlow } from '../components/TemplateKYCFlowRefactored';\n// import { KYCTemplate } from '../types/KYC.types';\nimport { useI18n } from '../hooks/useI18n';\nimport { TemplateKYCExample } from '../components/TemplateKYCExample';\nimport { isCallbackUrlAllowed, generateCallbackSignature } from '../config/allowedDomains';\n\ninterface WebKYCEntryProps {\n onComplete?: (data: any) => void;\n onError?: (error: string) => void;\n onCancel?: () => void;\n}\n\ninterface URLParams {\n token?: string;\n return_url?: string;\n lang?: string;\n theme?: string;\n kyc_id?: string;\n secret?: string; // Optional secret for signature generation\n}\n\ninterface VerificationSteps {\n document_analyzed?: boolean;\n selfie_analyzed?: boolean;\n liveness_checked?: boolean;\n}\n\nconst WebKYCEntry: React.FC<WebKYCEntryProps> = ({\n onComplete,\n onError,\n onCancel,\n}) => {\n const { setLocale } = useI18n();\n const [urlParams, setUrlParams] = useState<URLParams>({});\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [isAnalyzing, setIsAnalyzing] = useState(false);\n\n // Parse URL parameters\n const parseUrlParams = useCallback((): URLParams => {\n if (typeof window === 'undefined') return {};\n \n const urlParams = new URLSearchParams(window.location.search);\n return {\n token: urlParams.get('token') || undefined,\n return_url: urlParams.get('return_url') || undefined,\n lang: urlParams.get('lang') || 'en',\n theme: urlParams.get('theme') || 'light',\n kyc_id: urlParams.get('kyc_id') || undefined,\n secret: urlParams.get('secret') || undefined,\n };\n }, []);\n\n // Safe redirect function with enhanced validation\n const redirectToReturnUrl = useCallback(async (params: {\n status: 'completed' | 'cancelled' | 'error';\n kyc_id?: string;\n message?: string;\n processing_state?: 'analyzing' | 'completed' | 'pending';\n verification_steps?: VerificationSteps;\n }) => {\n const { return_url, secret } = urlParams;\n \n if (!return_url) {\n console.warn('No return_url provided');\n return;\n }\n\n try {\n // Enhanced URL validation with domain whitelist\n const validation = isCallbackUrlAllowed(return_url);\n if (!validation.allowed) {\n console.error('Callback URL validation failed:', validation.reason);\n setError(`Security Error: ${validation.reason}`);\n \n // Log suspicious redirect attempt\n console.warn('Suspicious redirect attempt blocked:', {\n url: return_url,\n reason: validation.reason,\n timestamp: new Date().toISOString(),\n });\n return;\n }\n\n const returnUrl = new URL(return_url);\n\n // Build redirect URL with parameters\n const redirectUrl = new URL(returnUrl);\n const redirectParams: Record<string, string> = {\n status: params.status,\n };\n\n if (params.kyc_id) {\n redirectParams.kyc_id = params.kyc_id;\n }\n \n if (params.message) {\n redirectParams.message = params.message;\n }\n\n if (params.processing_state) {\n redirectParams.processing_state = params.processing_state;\n }\n\n if (params.verification_steps) {\n redirectParams.verification_steps = JSON.stringify(params.verification_steps);\n }\n\n // Generate signature for integrity verification\n if (secret) {\n const signature = await generateCallbackSignature(redirectParams, secret);\n if (signature) {\n redirectParams.sig = signature;\n }\n }\n\n // Add all params to URL\n Object.entries(redirectParams).forEach(([key, value]) => {\n redirectUrl.searchParams.set(key, value);\n });\n\n // Send postMessage to parent if in iframe\n if (window.parent !== window) {\n window.parent.postMessage({\n type: 'kyc_result',\n status: params.status,\n kyc_id: params.kyc_id,\n message: params.message,\n processing_state: params.processing_state,\n verification_steps: params.verification_steps,\n }, returnUrl.origin); // Use specific origin instead of '*'\n }\n\n // Redirect to return URL\n window.location.href = redirectUrl.toString();\n } catch (error) {\n console.error('Error during redirect:', error);\n setError('Failed to redirect to callback URL');\n }\n }, [urlParams]);\n\n // Handle KYC completion\n const handleComplete = useCallback((data: any) => {\n console.log('KYC completed:', data);\n \n // Check if still processing/analyzing\n const isStillProcessing = data.isProcessing || data.session?.isProcessing;\n \n redirectToReturnUrl({\n status: 'completed',\n kyc_id: data.session_id || urlParams.kyc_id,\n message: 'KYC process completed successfully',\n processing_state: isStillProcessing ? 'analyzing' : 'completed',\n verification_steps: {\n document_analyzed: data.documentAnalysisComplete || false,\n selfie_analyzed: data.selfieAnalysisComplete || false,\n liveness_checked: data.livenessCheckComplete || false,\n },\n });\n onComplete?.(data);\n }, [redirectToReturnUrl, urlParams.kyc_id, onComplete]);\n\n // Handle KYC error\n const handleError = useCallback((error: string) => {\n console.error('KYC error:', error);\n setIsAnalyzing(false);\n redirectToReturnUrl({\n status: 'error',\n kyc_id: urlParams.kyc_id,\n message: error,\n processing_state: 'pending',\n });\n onError?.(error);\n }, [redirectToReturnUrl, urlParams.kyc_id, onError]);\n\n // Handle KYC cancellation\n const handleCancel = useCallback(() => {\n console.log('KYC cancelled');\n setIsAnalyzing(false);\n redirectToReturnUrl({\n status: 'cancelled',\n kyc_id: urlParams.kyc_id,\n message: 'KYC process was cancelled',\n processing_state: 'pending',\n });\n onCancel?.();\n }, [redirectToReturnUrl, urlParams.kyc_id, onCancel]);\n\n // Initialize component\n useEffect(() => {\n try {\n const params = parseUrlParams();\n setUrlParams(params);\n \n // Set language if provided\n if (params.lang) {\n setLocale(params.lang);\n }\n \n setIsLoading(false);\n } catch (error) {\n console.error('Error parsing URL parameters:', error);\n setError('Error parsing URL parameters');\n setIsLoading(false);\n }\n }, [parseUrlParams, setLocale]);\n\n\n if (isLoading) {\n return (\n <View style={styles.container}>\n <Text style={styles.loadingText}>Loading KYC process...</Text>\n </View>\n );\n }\n\n if (error) {\n return (\n <View style={styles.container}>\n <Text style={styles.errorText}>Error: {error}</Text>\n </View>\n );\n }\n\n if (!urlParams.token) {\n return (\n <View style={styles.container}>\n <Text style={styles.errorText}>No token provided in URL parameters</Text>\n </View>\n );\n }\n\n return (\n <SafeAreaView style={styles.container}>\n {isAnalyzing && (\n <View style={styles.analyzingOverlay}>\n <View style={styles.analyzingContainer}>\n <ActivityIndicator size=\"large\" color=\"#2DBD60\" />\n <Text style={styles.analyzingText}>Analyzing verification data...</Text>\n <Text style={styles.analyzingSubtext}>This may take a few moments</Text>\n </View>\n </View>\n )}\n <TemplateKYCExample \n onComplete={handleComplete} \n onCancel={handleCancel} \n onError={handleError}\n language={urlParams.lang || 'en'}\n API_KEY={urlParams.token}\n />\n </SafeAreaView>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: '#f5f5f5',\n overflow: 'visible' as any, // Allow scrolling on web\n },\n loadingText: {\n fontSize: 18,\n textAlign: 'center',\n marginTop: 50,\n color: '#666',\n },\n errorText: {\n fontSize: 16,\n textAlign: 'center',\n marginTop: 50,\n color: '#dc2626',\n paddingHorizontal: 20,\n },\n analyzingOverlay: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.7)',\n justifyContent: 'center',\n alignItems: 'center',\n zIndex: 9999,\n },\n analyzingContainer: {\n backgroundColor: 'white',\n borderRadius: 12,\n padding: 32,\n alignItems: 'center',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 4 },\n shadowOpacity: 0.3,\n shadowRadius: 8,\n elevation: 8,\n },\n analyzingText: {\n fontSize: 18,\n fontWeight: '600',\n color: '#333',\n marginTop: 16,\n textAlign: 'center',\n },\n analyzingSubtext: {\n fontSize: 14,\n color: '#666',\n marginTop: 8,\n textAlign: 'center',\n },\n});\n\nexport default WebKYCEntry;\n"]}
1
+ {"version":3,"file":"WebKYCEntry.js","sourceRoot":"","sources":["../../src/web/WebKYCEntry.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useState, useCallback } from 'react';\nimport { View, Text, StyleSheet, SafeAreaView, ActivityIndicator } from 'react-native';\n// import { TemplateKYCFlow } from '../components/TemplateKYCFlowRefactored';\n// import { KYCTemplate } from '../types/KYC.types';\nimport { useI18n } from '../hooks/useI18n';\nimport { TemplateKYCExample } from '../components/TemplateKYCExample';\nimport { isCallbackUrlAllowed } from '../config/allowedDomains';\nimport KYCConfig from '../config/KYCConfig';\nimport { BackendEnvironment } from '../types/env.types';\n\ninterface WebKYCEntryProps {\n onComplete?: (data: any) => void;\n onError?: (error: string) => void;\n onCancel?: () => void;\n}\n\ninterface URLParams {\n token?: string;\n return_url?: string;\n push_url?: string;\n lang?: string;\n theme?: string;\n kyc_id?: string;\n secret?: string; // Optional secret for signature generation\n env?: 'PRODUCTION' | 'SANDBOX'; // Environment mode\n template_id?: string; // Template ID for dynamic template loading\n server_env?: BackendEnvironment; // Backend environment mode\n step?: string; // Step index to resume verification at the correct point\n}\n\ninterface VerificationSteps {\n document_analyzed?: boolean;\n selfie_analyzed?: boolean;\n liveness_checked?: boolean;\n}\n\nconst WebKYCEntry: React.FC<WebKYCEntryProps> = ({\n onComplete,\n onError,\n onCancel,\n}) => {\n const { setLocale } = useI18n();\n const [urlParams, setUrlParams] = useState<URLParams>({});\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [isAnalyzing, setIsAnalyzing] = useState(false);\n\n // Parse URL parameters\n const parseUrlParams = useCallback((): URLParams => {\n if (typeof window === 'undefined') return {};\n\n const urlParams = new URLSearchParams(window.location.search);\n const envParam = urlParams.get('env');\n const validEnv = envParam === 'SANDBOX' || envParam === 'PRODUCTION' ? envParam : 'PRODUCTION';\n\n const serverEnvParam = urlParams.get('server_env');\n const validServerEnv: BackendEnvironment = serverEnvParam === 'TEST' || serverEnvParam === 'PRODUCTION'\n ? (serverEnvParam as BackendEnvironment)\n : 'PRODUCTION';\n\n return {\n token: urlParams.get('token') || undefined,\n return_url: urlParams.get('return_url') || undefined,\n push_url: urlParams.get('push_url') || undefined,\n lang: urlParams.get('lang') || 'en',\n theme: urlParams.get('theme') || 'light',\n kyc_id: urlParams.get('kyc_id') || undefined,\n secret: urlParams.get('secret') || undefined,\n env: validEnv,\n template_id: urlParams.get('template_id') || undefined,\n server_env: validServerEnv,\n step: urlParams.get('step') || undefined,\n };\n }, []);\n\n // Safe redirect function with enhanced validation\n const redirectToReturnUrl = useCallback(async (params: {\n status: 'completed' | 'cancelled' | 'error';\n kyc_id?: string;\n message?: string;\n processing_state?: 'analyzing' | 'completed' | 'pending';\n verification_steps?: VerificationSteps;\n }) => {\n const { return_url } = urlParams;\n\n if (!return_url) {\n console.warn('No return_url provided');\n return;\n }\n\n try {\n // Enhanced URL validation with domain whitelist\n const validation = isCallbackUrlAllowed(return_url);\n if (!validation.allowed) {\n console.error('Callback URL validation failed:', validation.reason);\n setError(`Security Error: ${validation.reason}`);\n\n // Log suspicious redirect attempt\n console.warn('Suspicious redirect attempt blocked:', {\n url: return_url,\n reason: validation.reason,\n timestamp: new Date().toISOString(),\n });\n return;\n }\n // Send postMessage to parent if in iframe\n if (window.parent !== window) {\n const targetOrigin = new URL(return_url).origin;\n window.parent.postMessage({\n type: 'kyc_result',\n status: params.status,\n kyc_id: params.kyc_id,\n message: params.message,\n processing_state: params.processing_state,\n verification_steps: params.verification_steps,\n }, targetOrigin);\n } else {\n window.location.href = return_url;\n }\n } catch (error) {\n console.error('Error during redirect:', error);\n setError('Failed to redirect to callback URL');\n }\n }, [urlParams]);\n\n // Handle KYC completion\n const handleComplete = useCallback(async (data: any) => {\n console.log('KYC completed:', data);\n\n // Check if still processing/analyzing\n const isStillProcessing = data.isProcessing || data.session?.isProcessing;\n\n // Handle Push URL webhook if provided\n if (urlParams.push_url) {\n try {\n const verificationState = {\n status: 'success', // verification completed successfully\n result: data, // pass complete data object as result\n };\n\n // Send data to provided push_url with a timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 5000); // 5s timeout\n\n await fetch(urlParams.push_url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(verificationState),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n console.log('Successfully pushed KYC data to webhook');\n } catch (err) {\n // Fail open - redirect anyway even if webhook fails\n console.warn('Failed to push data to webhook URL:', err);\n }\n }\n\n redirectToReturnUrl({\n status: 'completed',\n kyc_id: data.session_id || urlParams.kyc_id,\n message: 'KYC process completed successfully',\n processing_state: isStillProcessing ? 'analyzing' : 'completed',\n verification_steps: {\n document_analyzed: data.documentAnalysisComplete || false,\n selfie_analyzed: data.selfieAnalysisComplete || false,\n liveness_checked: data.livenessCheckComplete || false,\n },\n });\n onComplete?.(data);\n }, [redirectToReturnUrl, urlParams, onComplete]);\n\n // Handle KYC error\n const handleError = useCallback((error: string) => {\n console.error('KYC error:', error);\n setIsAnalyzing(false);\n redirectToReturnUrl({\n status: 'error',\n kyc_id: urlParams.kyc_id,\n message: error,\n processing_state: 'pending',\n });\n onError?.(error);\n }, [redirectToReturnUrl, urlParams.kyc_id, onError]);\n\n // Handle KYC cancellation\n const handleCancel = useCallback(() => {\n console.log('KYC cancelled', urlParams.push_url, urlParams);\n setIsAnalyzing(false);\n if (urlParams.push_url) {\n try {\n const verificationState = {\n status: 'cancelled', // verification cancelled\n result: null, // pass null as result\n };\n\n // Send data to provided push_url with a timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 5000); // 5s timeout\n\n fetch(urlParams.push_url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(verificationState),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n console.log('Successfully pushed KYC cancellation data to webhook');\n } catch (err) {\n // Fail open - redirect anyway even if webhook fails\n console.warn('Failed to push data to webhook URL:', err);\n }\n }\n redirectToReturnUrl({\n status: 'cancelled',\n kyc_id: urlParams.kyc_id,\n message: 'KYC process was cancelled',\n processing_state: 'pending',\n });\n onCancel?.();\n }, [redirectToReturnUrl, urlParams.kyc_id, onCancel]);\n\n // Initialize component\n useEffect(() => {\n try {\n const params = parseUrlParams();\n setUrlParams(params);\n\n // Set language if provided\n if (params.lang) {\n setLocale(params.lang);\n }\n\n // Configure backend environment\n if (params.server_env) {\n KYCConfig.setBackendEnvironment(params.server_env);\n }\n\n setIsLoading(false);\n } catch (error) {\n console.error('Error parsing URL parameters:', error);\n setError('Error parsing URL parameters');\n setIsLoading(false);\n }\n }, [parseUrlParams, setLocale]);\n\n\n if (isLoading) {\n return (\n <View style={styles.container}>\n <Text style={styles.loadingText}>Loading KYC process...</Text>\n </View>\n );\n }\n\n if (error) {\n return (\n <View style={styles.container}>\n <Text style={styles.errorText}>Error: {error}</Text>\n </View>\n );\n }\n\n if (!urlParams.token) {\n return (\n <View style={styles.container}>\n <Text style={styles.errorText}>No token provided in URL parameters</Text>\n </View>\n );\n }\n\n return (\n <SafeAreaView style={styles.container}>\n {isAnalyzing && (\n <View style={styles.analyzingOverlay}>\n <View style={styles.analyzingContainer}>\n <ActivityIndicator size=\"large\" color=\"#2DBD60\" />\n <Text style={styles.analyzingText}>Analyzing verification data...</Text>\n <Text style={styles.analyzingSubtext}>This may take a few moments</Text>\n </View>\n </View>\n )}\n <TemplateKYCExample\n onComplete={handleComplete}\n onCancel={handleCancel}\n onError={handleError}\n language={urlParams.lang || 'en'}\n API_KEY={urlParams.token}\n templateId={urlParams.template_id}\n env={urlParams.env || 'PRODUCTION'}\n existingSessionId={urlParams.kyc_id}\n initialStep={urlParams.step ? (() => {\n const stepNum = parseInt(urlParams.step, 10);\n console.log('Parsing step from URL:', { stepString: urlParams.step, stepNumber: stepNum, isNaN: isNaN(stepNum) });\n return isNaN(stepNum) ? undefined : stepNum;\n })() : undefined}\n />\n </SafeAreaView>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: '#f5f5f5',\n overflow: 'visible' as any, // Allow scrolling on web\n },\n loadingText: {\n fontSize: 18,\n textAlign: 'center',\n marginTop: 50,\n color: '#666',\n },\n errorText: {\n fontSize: 16,\n textAlign: 'center',\n marginTop: 50,\n color: '#dc2626',\n paddingHorizontal: 20,\n },\n analyzingOverlay: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.7)',\n justifyContent: 'center',\n alignItems: 'center',\n zIndex: 9999,\n },\n analyzingContainer: {\n backgroundColor: 'white',\n borderRadius: 12,\n padding: 32,\n alignItems: 'center',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 4 },\n shadowOpacity: 0.3,\n shadowRadius: 8,\n elevation: 8,\n },\n analyzingText: {\n fontSize: 18,\n fontWeight: '600',\n color: '#333',\n marginTop: 16,\n textAlign: 'center',\n },\n analyzingSubtext: {\n fontSize: 14,\n color: '#666',\n marginTop: 8,\n textAlign: 'center',\n },\n});\n\nexport default WebKYCEntry;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@transfergratis/react-native-sdk",
3
- "version": "0.1.24",
3
+ "version": "0.1.25",
4
4
  "description": "transfergratis react native sdk",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -28,10 +28,9 @@ const withVisionCameraPermissions = (config, { cameraPermissionText = 'This app
28
28
  'android.permission.CAMERA',
29
29
  'android.permission.RECORD_AUDIO',
30
30
  ];
31
- // Add frame processors permission if enabled
32
- if (enableFrameProcessors) {
33
- permissions.push('android.permission.WRITE_EXTERNAL_STORAGE');
34
- }
31
+ // Note: WRITE_EXTERNAL_STORAGE is NOT needed even with frame processors
32
+ // Frame processors work in memory, and photos are saved to app's internal storage
33
+ // Adding storage permissions causes Google Play Store rejection for KYC apps
35
34
  for (const permission of permissions) {
36
35
  if (!androidManifest.manifest['uses-permission'].find((perm) => perm.$['android:name'] === permission)) {
37
36
  androidManifest.manifest['uses-permission'].push({
@@ -37,10 +37,9 @@ const withVisionCameraPermissions = (config, {
37
37
  'android.permission.RECORD_AUDIO',
38
38
  ];
39
39
 
40
- // Add frame processors permission if enabled
41
- if (enableFrameProcessors) {
42
- permissions.push('android.permission.WRITE_EXTERNAL_STORAGE');
43
- }
40
+ // Note: WRITE_EXTERNAL_STORAGE is NOT needed even with frame processors
41
+ // Frame processors work in memory, and photos are saved to app's internal storage
42
+ // Adding storage permissions causes Google Play Store rejection for KYC apps
44
43
 
45
44
  for (const permission of permissions) {
46
45
  if (!androidManifest.manifest['uses-permission'].find(
@@ -46,10 +46,9 @@ const withVisionCameraPermissions: ConfigPlugin<VisionCameraPluginProps> = (
46
46
  'android.permission.RECORD_AUDIO',
47
47
  ];
48
48
 
49
- // Add frame processors permission if enabled
50
- if (enableFrameProcessors) {
51
- permissions.push('android.permission.WRITE_EXTERNAL_STORAGE');
52
- }
49
+ // Note: WRITE_EXTERNAL_STORAGE is NOT needed even with frame processors
50
+ // Frame processors work in memory, and photos are saved to app's internal storage
51
+ // Adding storage permissions causes Google Play Store rejection for KYC apps
53
52
 
54
53
  for (const permission of permissions) {
55
54
  if (!androidManifest.manifest['uses-permission'].find(