@sanctum-key/react-native-sdk 1.0.53 → 1.0.56

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 (128) hide show
  1. package/README.md +7 -2
  2. package/android/build/.transforms/3db9b15041d4285a820fc84462995ea1/results.bin +1 -0
  3. package/android/build/.transforms/3db9b15041d4285a820fc84462995ea1/transformed/classes/classes_dex/classes.dex +0 -0
  4. package/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
  5. package/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
  6. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab +0 -0
  7. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at +0 -0
  8. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab +0 -0
  9. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream +0 -0
  10. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len +0 -0
  11. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len +0 -0
  12. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at +0 -0
  13. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i +0 -0
  14. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab +0 -0
  15. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream +0 -0
  16. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len +0 -0
  17. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len +0 -0
  18. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at +0 -0
  19. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i +0 -0
  20. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab +0 -0
  21. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream +0 -0
  22. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len +0 -0
  23. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len +0 -0
  24. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at +0 -0
  25. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i +0 -0
  26. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab +0 -0
  27. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream +0 -0
  28. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len +0 -0
  29. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len +0 -0
  30. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at +0 -0
  31. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i +0 -0
  32. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab +0 -0
  33. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at +0 -0
  34. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab +0 -0
  35. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at +0 -0
  36. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab +0 -0
  37. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at +0 -0
  38. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/counters.tab +1 -1
  39. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab +0 -0
  40. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at +0 -0
  41. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab +0 -0
  42. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream +0 -0
  43. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len +0 -0
  44. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len +0 -0
  45. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at +0 -0
  46. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i +0 -0
  47. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab +0 -0
  48. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream +0 -0
  49. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len +0 -0
  50. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.len +0 -0
  51. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at +0 -0
  52. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i +0 -0
  53. package/android/build/kotlin/compileDebugKotlin/cacheable/last-build.bin +0 -0
  54. package/android/build/kotlin/compileDebugKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin +0 -0
  55. package/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin +0 -0
  56. package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
  57. package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/SanctumKeySdkModule$BarcodeRegion.class +0 -0
  58. package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/SanctumKeySdkModule$Companion.class +0 -0
  59. package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$1$5$1.class → SanctumKeySdkModule$definition$1$6$1.class} +0 -0
  60. package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$1$5$2.class → SanctumKeySdkModule$definition$1$6$2.class} +0 -0
  61. package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunction$1.class → SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunction$1.class} +0 -0
  62. package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunction$5.class → SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunction$2.class} +0 -0
  63. package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunction$3.class → SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunction$3.class} +0 -0
  64. package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunction$4.class → SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunction$4.class} +0 -0
  65. package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunction$2.class → SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunction$5.class} +0 -0
  66. package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunction$6.class → SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunction$6.class} +0 -0
  67. package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunctionWithPromise$1.class → SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$1.class} +0 -0
  68. package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunctionWithPromise$3.class → SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$2.class} +0 -0
  69. package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$3.class +0 -0
  70. package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$4.class +0 -0
  71. package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunctionWithPromise$2.class → SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$5.class} +0 -0
  72. package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$6.class +0 -0
  73. package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunctionWithPromise$4.class → SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$7.class} +0 -0
  74. package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$lambda$5$$inlined$View$1.class → SanctumKeySdkModule$definition$lambda$16$$inlined$View$1.class} +0 -0
  75. package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$lambda$5$lambda$4$$inlined$Prop$1.class → SanctumKeySdkModule$definition$lambda$16$lambda$15$$inlined$Prop$1.class} +0 -0
  76. package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$lambda$5$lambda$4$$inlined$Prop$2.class → SanctumKeySdkModule$definition$lambda$16$lambda$15$$inlined$Prop$2.class} +0 -0
  77. package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/SanctumKeySdkModule.class +0 -0
  78. package/android/build.gradle +7 -0
  79. package/android/src/main/java/kyc/sanctumkey/com/SanctumKeySdkModule.kt +428 -1
  80. package/build/package.json +3 -1
  81. package/build/src/SanctumKeySdkModule.d.ts +1 -0
  82. package/build/src/SanctumKeySdkModule.d.ts.map +1 -1
  83. package/build/src/SanctumKeySdkModule.js.map +1 -1
  84. package/build/src/components/EnhancedCameraView.d.ts.map +1 -1
  85. package/build/src/components/EnhancedCameraView.js +50 -41
  86. package/build/src/components/EnhancedCameraView.js.map +1 -1
  87. package/build/src/components/EnhancedCameraView.web.d.ts +2 -0
  88. package/build/src/components/EnhancedCameraView.web.d.ts.map +1 -1
  89. package/build/src/components/EnhancedCameraView.web.js +11 -6
  90. package/build/src/components/EnhancedCameraView.web.js.map +1 -1
  91. package/build/src/components/KYCElements/IDCardCapture.d.ts.map +1 -1
  92. package/build/src/components/KYCElements/IDCardCapture.js +499 -78
  93. package/build/src/components/KYCElements/IDCardCapture.js.map +1 -1
  94. package/build/src/components/TemplateKYCExample.d.ts.map +1 -1
  95. package/build/src/components/TemplateKYCExample.js +3 -9
  96. package/build/src/components/TemplateKYCExample.js.map +1 -1
  97. package/build/src/components/TemplateKYCFlowRefactored.d.ts.map +1 -1
  98. package/build/src/components/TemplateKYCFlowRefactored.js +0 -2
  99. package/build/src/components/TemplateKYCFlowRefactored.js.map +1 -1
  100. package/build/src/components/WebBarcodeScanner.d.ts +2 -0
  101. package/build/src/components/WebBarcodeScanner.d.ts.map +1 -1
  102. package/build/src/components/WebBarcodeScanner.js +99 -85
  103. package/build/src/components/WebBarcodeScanner.js.map +1 -1
  104. package/build/src/modules/api/KYCService.d.ts +1 -0
  105. package/build/src/modules/api/KYCService.d.ts.map +1 -1
  106. package/build/src/modules/api/KYCService.js +1 -1
  107. package/build/src/modules/api/KYCService.js.map +1 -1
  108. package/build/src/modules/api/types.d.ts +1 -0
  109. package/build/src/modules/api/types.d.ts.map +1 -1
  110. package/build/src/modules/api/types.js.map +1 -1
  111. package/build/src/web/WebKYCEntry.d.ts.map +1 -1
  112. package/build/src/web/WebKYCEntry.js +50 -32
  113. package/build/src/web/WebKYCEntry.js.map +1 -1
  114. package/package.json +3 -1
  115. package/plugin/build/withVisionCamera.d.ts +1 -0
  116. package/plugin/build/withVisionCamera.js +13 -1
  117. package/plugin/src/withVisionCamera.js +18 -2
  118. package/plugin/src/withVisionCamera.ts +19 -2
  119. package/src/SanctumKeySdkModule.ts +1 -0
  120. package/src/components/EnhancedCameraView.tsx +52 -41
  121. package/src/components/EnhancedCameraView.web.tsx +15 -5
  122. package/src/components/KYCElements/IDCardCapture.tsx +552 -75
  123. package/src/components/TemplateKYCExample.tsx +6 -14
  124. package/src/components/TemplateKYCFlowRefactored.tsx +0 -2
  125. package/src/components/WebBarcodeScanner.tsx +147 -198
  126. package/src/modules/api/KYCService.ts +3 -3
  127. package/src/modules/api/types.ts +1 -0
  128. package/src/web/WebKYCEntry.tsx +89 -50
@@ -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, JSX } from 'react';\nimport { View, Text, StyleSheet, SafeAreaView, ActivityIndicator } from 'react-native';\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 onSessionSave?: (sessionId: string) => void;\n}\n\ninterface URLParams {\n token?: string;\n return_url?: string;\n push_url?: string;\n save_session_url?: string;\n reference_id?: string;\n lang?: string;\n theme?: string;\n kyc_id?: string;\n secret?: string;\n env?: 'PRODUCTION' | 'SANDBOX';\n template_id?: string;\n server_env?: BackendEnvironment;\n step?: string;\n component_index?: string;\n country?: string;\n document_type?: string;\n region?: string;\n // 🚨 NEW: Added explicitly for the mobile handoff\n session_id?: string; \n resume?: boolean;\n}\n\ninterface VerificationSteps {\n document_analyzed?: boolean;\n selfie_analyzed?: boolean;\n liveness_checked?: boolean;\n}\n\nconst postWebhook = async (url: string, payload: unknown, timeoutMs: number = 5000) => {\n const body = JSON.stringify(payload);\n const postWithTimeout = async (init: RequestInit) => {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await fetch(url, { method: 'POST', ...init, signal: controller.signal });\n } finally {\n clearTimeout(timeoutId);\n }\n };\n\n if (typeof window !== 'undefined') {\n try {\n const response = await postWithTimeout({ headers: { 'Content-Type': 'application/json' }, body, keepalive: true });\n if (!response.ok) throw new Error(`Webhook failed with status ${response.status}`);\n return;\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') throw error;\n await postWithTimeout({ mode: 'no-cors', headers: { 'Content-Type': 'text/plain;charset=UTF-8' }, body, keepalive: true });\n return;\n }\n }\n\n const response = await postWithTimeout({ headers: { 'Content-Type': 'application/json' }, body });\n if (!response.ok) throw new Error(`Webhook failed with status ${response.status}`);\n};\n\nexport function WebKYCEntry({ onComplete, onError, onCancel, onSessionSave }: WebKYCEntryProps): JSX.Element {\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 const parseUrlParams = useCallback((): URLParams => {\n if (typeof window === 'undefined') return {};\n\n const rawUrl = window.location.href;\n console.log(\"Raw URL intercepted:\", rawUrl);\n \n const paramsString = rawUrl.replace(/^[^?#]*[?#]/, '').replace(/[?#]/g, '&');\n\n const urlParams = new URLSearchParams(paramsString);\n\n const getParam = (key: string) => urlParams.get(key) || undefined;\n\n const envParam = getParam('env');\n const validEnv = envParam === 'SANDBOX' || envParam === 'PRODUCTION' ? envParam : 'PRODUCTION';\n const serverEnvParam = getParam('server_env');\n const validServerEnv: BackendEnvironment = serverEnvParam === 'TEST' || serverEnvParam === 'PRODUCTION' ? (serverEnvParam as BackendEnvironment) : 'PRODUCTION';\n\n return {\n token: getParam('token'),\n return_url: getParam('return_url'),\n push_url: getParam('push_url'),\n save_session_url: getParam('save_session_url') || getParam('saveSessionUrl'),\n reference_id: getParam('reference_id'),\n lang: getParam('lang') || 'en',\n theme: getParam('theme') || 'light',\n kyc_id: getParam('kyc_id') || getParam('session_id'), \n secret: getParam('secret'),\n env: validEnv,\n template_id: getParam('template_id'),\n server_env: validServerEnv,\n step: getParam('step'),\n component_index: getParam('component_index'),\n country: getParam('country'),\n document_type: getParam('document_type'),\n region: getParam('region'),\n resume: getParam('resume') === 'true',\n };\n }, []);\n\n const redirectToReturnUrl = useCallback(async (params: { status: 'completed' | 'cancelled' | 'error'; kyc_id?: string; message?: string; processing_state?: 'analyzing' | 'completed' | 'pending'; verification_steps?: VerificationSteps; }) => {\n const { return_url } = urlParams;\n if (!return_url) { console.warn('No return_url provided'); return; }\n try {\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 return;\n }\n if (window.parent !== window) {\n const targetOrigin = new URL(return_url).origin;\n window.parent.postMessage({ type: 'kyc_result', status: params.status, kyc_id: params.kyc_id, message: params.message, processing_state: params.processing_state, verification_steps: params.verification_steps }, 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 const handleComplete = useCallback(async (data: any) => {\n console.log('KYC completed, raw state:', data);\n const isStillProcessing = data?.isProcessing || data?.session?.isProcessing;\n\n if (urlParams.push_url) {\n try {\n // 1. Locate the actual backend payload from the Context state\n const backendResult = data?.verification?.result || data?.result?.result || data?.result || data;\n\n // 2. Safely extract session ID\n const finalSessionId = \n data?.session?.session_id || \n backendResult?.session_id || \n backendResult?.data?.session_id || \n urlParams.kyc_id || \n 'unknown';\n\n // 3. Extract the core data payload\n let parsedKycData: any = {};\n if (backendResult?.data) {\n try {\n parsedKycData = typeof backendResult.data === 'string' \n ? JSON.parse(backendResult.data) \n : backendResult.data;\n } catch (e) {\n console.warn(\"Could not parse backendResult.data JSON\");\n }\n }\n\n if (parsedKycData && typeof parsedKycData === 'object' && parsedKycData[finalSessionId]) {\n const nested = parsedKycData[finalSessionId];\n if (nested?.data) {\n parsedKycData = typeof nested.data === 'string' ? JSON.parse(nested.data) : nested.data;\n } else {\n parsedKycData = nested;\n }\n }\n\n const verificationState = {\n session_id: finalSessionId,\n reference_id: urlParams.reference_id || backendResult?.referenceId || null,\n status: backendResult?.status || data?.verification?.status || 'completed',\n message: backendResult?.message || backendResult?.reason || backendResult?.issues?.[0] || 'Verification finished.',\n data: parsedKycData || {}\n };\n\n const hasValidSessionId = finalSessionId && finalSessionId !== 'unknown';\n const hasValidData = parsedKycData && Object.keys(parsedKycData).length > 0;\n\n if (!hasValidSessionId || !hasValidData) {\n console.log(\"Webhook Blocked: Payload contains no data or session_id is unknown.\", JSON.stringify(verificationState));\n } else {\n console.log(\"Pushing Webhook Payload:\", JSON.stringify(verificationState, null, 2));\n await postWebhook(urlParams.push_url, verificationState, 5000);\n }\n\n } catch (err) {\n console.warn('Failed to construct or push data to webhook URL:', err);\n }\n }\n\n setIsAnalyzing(false);\n \n // Always redirect the user back to your main app/website, regardless of webhook success/block\n redirectToReturnUrl({\n status: data?.verification?.status === 'failed' ? 'error' : 'completed',\n kyc_id: data?.session?.session_id || urlParams.kyc_id,\n message: 'KYC process concluded',\n processing_state: isStillProcessing ? 'analyzing' : 'completed',\n verification_steps: {\n document_analyzed: true,\n selfie_analyzed: true,\n liveness_checked: true\n },\n });\n \n onComplete?.(data);\n }, [redirectToReturnUrl, urlParams, onComplete]);\n\n const handleError = useCallback((error: string) => {\n console.error('KYC error:', error);\n setIsAnalyzing(false);\n redirectToReturnUrl({ status: 'error', kyc_id: urlParams.kyc_id, message: error, processing_state: 'pending' });\n onError?.(error);\n }, [redirectToReturnUrl, urlParams.kyc_id, onError]);\n\n const handleCancel = useCallback(async () => {\n setIsAnalyzing(false);\n if (urlParams.push_url) {\n try {\n await postWebhook(urlParams.push_url, { status: 'cancelled', result: null, reference_id: urlParams.reference_id }, 5000);\n } catch (err) { console.warn('Failed to push data to webhook URL:', err); }\n }\n redirectToReturnUrl({ status: 'cancelled', kyc_id: urlParams.kyc_id, message: 'KYC process was cancelled', processing_state: 'pending' });\n onCancel?.();\n }, [redirectToReturnUrl, urlParams.kyc_id, urlParams.push_url, urlParams.reference_id, onCancel]);\n\n const handleSessionSave = useCallback(async (sessionId: string) => {\n if (urlParams.save_session_url) {\n try {\n await postWebhook(urlParams.save_session_url, { status: 'session_created', reference_id: urlParams.reference_id, result: { session_id: sessionId, kyc_id: sessionId } }, 5000);\n } catch (err) { console.warn('Failed to push session data:', err); }\n }\n onSessionSave?.(sessionId);\n }, [urlParams.save_session_url, urlParams.reference_id, onSessionSave]);\n\n useEffect(() => {\n try {\n const params = parseUrlParams();\n setUrlParams(params);\n if (params.lang) setLocale(params.lang);\n if (params.server_env) KYCConfig.setBackendEnvironment(params.server_env);\n setIsLoading(false);\n } catch (error) {\n setError('Error parsing URL parameters');\n setIsLoading(false);\n }\n }, [parseUrlParams, setLocale]);\n\n if (isLoading) return <View style={styles.container}><Text style={styles.loadingText}>Loading KYC process...</Text></View>;\n if (error) return <View style={styles.container}><Text style={styles.errorText}>Error: {error}</Text></View>;\n if (!urlParams.token) return <View style={styles.container}><Text style={styles.errorText}>No token provided in URL parameters</Text></View>;\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 serverEnv={urlParams.server_env}\n existingSessionId={urlParams.kyc_id} // Successfully passes session_id down\n initialComponentIndex={(() => {\n const raw = urlParams.component_index ?? urlParams.step;\n if (raw == null || raw === '') return undefined;\n const index = parseInt(raw, 10);\n return Number.isNaN(index) ? undefined : index;\n })()}\n initialCountryResume={urlParams.country && urlParams.document_type ? { code: urlParams.country, documentType: urlParams.document_type, region: urlParams.region || undefined } : undefined}\n referenceId={urlParams.reference_id}\n onSessionSave={handleSessionSave}\n />\n </SafeAreaView>\n );\n}\n\nconst styles = StyleSheet.create({\n container: { flex: 1, backgroundColor: '#f5f5f5', overflow: 'visible' as any },\n loadingText: { fontSize: 18, textAlign: 'center', marginTop: 50, color: '#666' },\n errorText: { fontSize: 16, textAlign: 'center', marginTop: 50, color: '#dc2626', paddingHorizontal: 20 },\n analyzingOverlay: { position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, backgroundColor: 'rgba(0, 0, 0, 0.7)', justifyContent: 'center', alignItems: 'center', zIndex: 9999 },\n analyzingContainer: { backgroundColor: 'white', borderRadius: 12, padding: 32, alignItems: 'center', shadowColor: '#000', shadowOffset: { width: 0, height: 4 }, shadowOpacity: 0.3, shadowRadius: 8, elevation: 8 },\n analyzingText: { fontSize: 18, fontWeight: '600', color: '#333', marginTop: 16, textAlign: 'center' },\n analyzingSubtext: { fontSize: 14, color: '#666', marginTop: 8, textAlign: 'center' },\n});\n\nexport default WebKYCEntry;"]}
1
+ {"version":3,"file":"WebKYCEntry.js","sourceRoot":"","sources":["../../../src/web/WebKYCEntry.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useState, useCallback, JSX } from 'react';\nimport { View, Text, StyleSheet, SafeAreaView, ActivityIndicator } from 'react-native';\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';\nimport CryptoJS from 'crypto-js'; // 🚨 IMPORT ADDED\n\ninterface WebKYCEntryProps {\n onComplete?: (data: any) => void;\n onError?: (error: string) => void;\n onCancel?: () => void;\n onSessionSave?: (sessionId: string) => void;\n}\n\ninterface URLParams {\n token?: string;\n return_url?: string;\n push_url?: string;\n save_session_url?: string;\n reference_id?: string;\n lang?: string;\n theme?: string;\n kyc_id?: string;\n secret?: string;\n env?: 'PRODUCTION' | 'SANDBOX';\n template_id?: string;\n server_env?: BackendEnvironment;\n step?: string;\n component_index?: string;\n country?: string;\n document_type?: string;\n region?: string;\n session_id?: string;\n resume?: boolean;\n}\n\ninterface VerificationSteps {\n document_analyzed?: boolean;\n selfie_analyzed?: boolean;\n liveness_checked?: boolean;\n}\n\n// 🚨 MODIFIED: Accepts the webhook secret to generate the signature\nconst postWebhook = async (url: string, payload: unknown, secret?: string, timeoutMs: number = 5000) => {\n const body = JSON.stringify(payload);\n \n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // 🚨 Generate HMAC SHA-256 Signature if secret is provided\n if (secret) {\n const signature = CryptoJS.HmacSHA256(body, secret).toString(CryptoJS.enc.Hex);\n headers['x-sanctumkey-signature'] = signature;\n console.log(\"🔒 Generated Webhook Signature:\", signature);\n }\n\n const postWithTimeout = async (init: RequestInit) => {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await fetch(url, { method: 'POST', ...init, signal: controller.signal });\n } finally {\n clearTimeout(timeoutId);\n }\n };\n\n if (typeof window !== 'undefined') {\n try {\n const response = await postWithTimeout({ headers, body, keepalive: true });\n if (!response.ok) throw new Error(`Webhook failed with status ${response.status}`);\n return;\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') throw error;\n // Fallback for CORS issues, though signature headers might be stripped in 'no-cors' mode\n await postWithTimeout({ \n mode: 'no-cors', \n headers: { 'Content-Type': 'text/plain;charset=UTF-8' }, \n body, \n keepalive: true \n });\n return;\n }\n }\n\n const response = await postWithTimeout({ headers, body });\n if (!response.ok) throw new Error(`Webhook failed with status ${response.status}`);\n};\n\nexport function WebKYCEntry({ onComplete, onError, onCancel, onSessionSave }: WebKYCEntryProps): JSX.Element {\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 const parseUrlParams = useCallback((): URLParams => {\n if (typeof window === 'undefined') return {};\n const rawUrl = window.location.href;\n console.log(\"Raw URL intercepted:\", rawUrl);\n \n const paramsString = rawUrl.replace(/^[^?#]*[?#]/, '').replace(/[?#]/g, '&');\n const urlParams = new URLSearchParams(paramsString);\n const getParam = (key: string) => urlParams.get(key) || undefined;\n \n const envParam = getParam('env');\n const validEnv = envParam === 'SANDBOX' || envParam === 'PRODUCTION' ? envParam : 'PRODUCTION';\n \n const serverEnvParam = getParam('server_env');\n const validServerEnv: BackendEnvironment = serverEnvParam === 'TEST' || serverEnvParam === 'PRODUCTION' ? (serverEnvParam as BackendEnvironment) : 'PRODUCTION';\n \n return {\n token: getParam('token'),\n return_url: getParam('return_url'),\n push_url: getParam('push_url'),\n save_session_url: getParam('save_session_url') || getParam('saveSessionUrl'),\n reference_id: getParam('reference_id'),\n lang: getParam('lang') || 'en',\n theme: getParam('theme') || 'light',\n kyc_id: getParam('kyc_id') || getParam('session_id'),\n secret: getParam('secret'),\n env: validEnv,\n template_id: getParam('template_id'),\n server_env: validServerEnv,\n step: getParam('step'),\n component_index: getParam('component_index'),\n country: getParam('country'),\n document_type: getParam('document_type'),\n region: getParam('region'),\n resume: getParam('resume') === 'true',\n };\n }, []);\n\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 if (!return_url) {\n console.warn('No return_url provided');\n return;\n }\n\n try {\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 return;\n }\n\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 const handleComplete = useCallback(async (data: any) => {\n console.log('KYC completed, raw state:', data);\n const isStillProcessing = data?.isProcessing || data?.session?.isProcessing;\n\n if (urlParams.push_url) {\n try {\n const backendResult = data?.verification?.result || data?.result?.result || data?.result || data;\n const finalSessionId = data?.session?.session_id || backendResult?.session_id || backendResult?.data?.session_id || urlParams.kyc_id || 'unknown';\n \n let parsedKycData: any = {};\n if (backendResult?.data) {\n try {\n parsedKycData = typeof backendResult.data === 'string' ? JSON.parse(backendResult.data) : backendResult.data;\n } catch (e) {\n console.warn(\"Could not parse backendResult.data JSON\");\n }\n }\n \n if (parsedKycData && typeof parsedKycData === 'object' && parsedKycData[finalSessionId]) {\n const nested = parsedKycData[finalSessionId];\n if (nested?.data) {\n parsedKycData = typeof nested.data === 'string' ? JSON.parse(nested.data) : nested.data;\n } else {\n parsedKycData = nested;\n }\n }\n\n const verificationState = {\n session_id: finalSessionId,\n reference_id: urlParams.reference_id || backendResult?.referenceId || null,\n status: backendResult?.status || data?.verification?.status || 'completed',\n message: backendResult?.message || backendResult?.reason || backendResult?.issues?.[0] || 'Verification finished.',\n data: parsedKycData || {}\n };\n\n const hasValidSessionId = finalSessionId && finalSessionId !== 'unknown';\n const hasValidData = parsedKycData && Object.keys(parsedKycData).length > 0;\n\n if (!hasValidSessionId || !hasValidData) {\n console.log(\"Webhook Blocked: Payload contains no data or session_id is unknown.\");\n } else {\n // 🚨 MODIFIED: Passing urlParams.secret\n await postWebhook(urlParams.push_url, verificationState, urlParams.secret, 5000);\n }\n } catch (err) {\n console.warn('Failed to construct or push data to webhook URL:', err);\n }\n }\n\n setIsAnalyzing(false);\n redirectToReturnUrl({\n status: data?.verification?.status === 'failed' ? 'error' : 'completed',\n kyc_id: data?.session?.session_id || urlParams.kyc_id,\n message: 'KYC process concluded',\n processing_state: isStillProcessing ? 'analyzing' : 'completed',\n verification_steps: { document_analyzed: true, selfie_analyzed: true, liveness_checked: true },\n });\n onComplete?.(data);\n }, [redirectToReturnUrl, urlParams, onComplete]);\n\n const handleError = useCallback((error: string) => {\n console.error('KYC error:', error);\n setIsAnalyzing(false);\n redirectToReturnUrl({ status: 'error', kyc_id: urlParams.kyc_id, message: error, processing_state: 'pending' });\n onError?.(error);\n }, [redirectToReturnUrl, urlParams.kyc_id, onError]);\n\n const handleCancel = useCallback(async () => {\n setIsAnalyzing(false);\n if (urlParams.push_url) {\n try {\n // 🚨 MODIFIED: Passing urlParams.secret\n await postWebhook(\n urlParams.push_url, \n { status: 'cancelled', result: null, reference_id: urlParams.reference_id }, \n urlParams.secret, \n 5000\n );\n } catch (err) {\n console.warn('Failed to push data to webhook URL:', err);\n }\n }\n \n redirectToReturnUrl({ status: 'cancelled', kyc_id: urlParams.kyc_id, message: 'KYC process was cancelled', processing_state: 'pending' });\n onCancel?.();\n }, [redirectToReturnUrl, urlParams.kyc_id, urlParams.push_url, urlParams.reference_id, urlParams.secret, onCancel]);\n\n const handleSessionSave = useCallback(async (sessionId: string) => {\n if (urlParams.save_session_url) {\n try {\n // 🚨 MODIFIED: Passing urlParams.secret\n await postWebhook(\n urlParams.save_session_url, \n { status: 'session_created', reference_id: urlParams.reference_id, result: { session_id: sessionId, kyc_id: sessionId } }, \n urlParams.secret, \n 5000\n );\n } catch (err) {\n console.warn('Failed to push session data:', err);\n }\n }\n onSessionSave?.(sessionId);\n }, [urlParams.save_session_url, urlParams.reference_id, urlParams.secret, onSessionSave]);\n\n useEffect(() => {\n try {\n const params = parseUrlParams();\n setUrlParams(params);\n if (params.lang) setLocale(params.lang);\n if (params.server_env) KYCConfig.setBackendEnvironment(params.server_env);\n setIsLoading(false);\n } catch (error) {\n setError('Error parsing URL parameters');\n setIsLoading(false);\n }\n }, [parseUrlParams, setLocale]);\n\n if (isLoading) return <View style={styles.container}><Text style={styles.loadingText}>Loading KYC process...</Text></View>;\n if (error) return <View style={styles.container}><Text style={styles.errorText}>Error: {error}</Text></View>;\n if (!urlParams.token) return <View style={styles.container}><Text style={styles.errorText}>No token provided in URL parameters</Text></View>;\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 {/* Overlay UI unchanged */}\n <TemplateKYCExample\n // ...Props unchanged...\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 serverEnv={urlParams.server_env}\n existingSessionId={urlParams.kyc_id}\n initialComponentIndex={(() => {\n const raw = urlParams.component_index ?? urlParams.step;\n if (raw == null || raw === '') return undefined;\n const index = parseInt(raw, 10);\n return Number.isNaN(index) ? undefined : index;\n })()}\n initialCountryResume={urlParams.country && urlParams.document_type ? { \n code: urlParams.country, \n documentType: urlParams.document_type, \n region: urlParams.region || undefined \n } : undefined}\n referenceId={urlParams.reference_id}\n onSessionSave={handleSessionSave}\n />\n </SafeAreaView>\n );\n}\n\nconst styles = StyleSheet.create({\n container: { flex: 1, backgroundColor: '#f5f5f5', overflow: 'visible' as any },\n loadingText: { fontSize: 18, textAlign: 'center', marginTop: 50, color: '#666' },\n errorText: { fontSize: 16, textAlign: 'center', marginTop: 50, color: '#dc2626', paddingHorizontal: 20 },\n analyzingOverlay: { position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, backgroundColor: 'rgba(0, 0, 0, 0.7)', justifyContent: 'center', alignItems: 'center', zIndex: 9999 },\n analyzingContainer: { backgroundColor: 'white', borderRadius: 12, padding: 32, alignItems: 'center', shadowColor: '#000', shadowOffset: { width: 0, height: 4 }, shadowOpacity: 0.3, shadowRadius: 8, elevation: 8 },\n analyzingText: { fontSize: 18, fontWeight: '600', color: '#333', marginTop: 16, textAlign: 'center' },\n analyzingSubtext: { fontSize: 14, color: '#666', marginTop: 8, textAlign: 'center' },\n});\n\nexport default WebKYCEntry;"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sanctum-key/react-native-sdk",
3
- "version": "1.0.53",
3
+ "version": "1.0.56",
4
4
  "description": "Sanctum Key React Native SDK",
5
5
  "main": "build/src/index.js",
6
6
  "types": "build/src/index.d.ts",
@@ -50,6 +50,7 @@
50
50
  "@zxing/browser": "^0.2.0",
51
51
  "@zxing/library": "^0.22.0",
52
52
  "axios": "^1.11.0",
53
+ "crypto-js": "^4.2.0",
53
54
  "expo-blur": "~15.0.8",
54
55
  "i18n-js": "4.5.1",
55
56
  "iconsax-react-nativejs": "^0.0.8",
@@ -58,6 +59,7 @@
58
59
  "zustand": "^5.0.8"
59
60
  },
60
61
  "devDependencies": {
62
+ "@types/crypto-js": "^4.2.2",
61
63
  "@types/react": "~19.1.0",
62
64
  "copyfiles": "^2.4.1",
63
65
  "expo": "~54.0.0",
@@ -3,6 +3,7 @@ export interface VisionCameraPluginProps {
3
3
  cameraPermissionText?: string;
4
4
  microphonePermissionText?: string;
5
5
  enableFrameProcessors?: boolean;
6
+ enableCodeScanner?: boolean;
6
7
  }
7
8
  declare const withVisionCameraPermissions: ConfigPlugin<VisionCameraPluginProps>;
8
9
  export default withVisionCameraPermissions;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const config_plugins_1 = require("@expo/config-plugins");
4
- const withVisionCameraPermissions = (config, { cameraPermissionText = 'This app uses the camera to capture photos and videos for identity verification.', microphonePermissionText = 'This app uses the microphone to record audio for video capture.', enableFrameProcessors = false, } = {}) => {
4
+ const withVisionCameraPermissions = (config, { cameraPermissionText = 'This app uses the camera to capture photos and videos for identity verification.', microphonePermissionText = 'This app uses the microphone to record audio for video capture.', enableFrameProcessors = false, enableCodeScanner = true, } = {}) => {
5
5
  // iOS permissions
6
6
  config = (0, config_plugins_1.withInfoPlist)(config, (config) => {
7
7
  var _a, _b;
@@ -63,6 +63,18 @@ const withVisionCameraPermissions = (config, { cameraPermissionText = 'This app
63
63
  }
64
64
  return config;
65
65
  });
66
+ // VisionCamera's Android code scanner requires the bundled ML Kit model.
67
+ // Default this to true because IDCapture relies on native barcode scanning.
68
+ config = (0, config_plugins_1.withGradleProperties)(config, (config) => {
69
+ const key = 'VisionCamera_enableCodeScanner';
70
+ config.modResults = config.modResults.filter((item) => item.type !== 'property' || item.key !== key);
71
+ config.modResults.push({
72
+ type: 'property',
73
+ key,
74
+ value: String(enableCodeScanner),
75
+ });
76
+ return config;
77
+ });
66
78
  return config;
67
79
  };
68
80
  exports.default = withVisionCameraPermissions;
@@ -1,9 +1,10 @@
1
- const { withInfoPlist, withAndroidManifest } = require('@expo/config-plugins');
1
+ const { withInfoPlist, withAndroidManifest, withGradleProperties } = require('@expo/config-plugins');
2
2
 
3
3
  const withVisionCameraPermissions = (config, {
4
4
  cameraPermissionText = 'This app uses the camera to capture photos and videos for identity verification.',
5
5
  microphonePermissionText = 'This app uses the microphone to record audio for video capture.',
6
6
  enableFrameProcessors = false,
7
+ enableCodeScanner = true,
7
8
  } = {}) => {
8
9
  // iOS permissions
9
10
  config = withInfoPlist(config, (config) => {
@@ -82,7 +83,22 @@ const withVisionCameraPermissions = (config, {
82
83
  return config;
83
84
  });
84
85
 
86
+ // VisionCamera's Android code scanner requires the bundled ML Kit model.
87
+ // Default this to true because IDCapture relies on native barcode scanning.
88
+ config = withGradleProperties(config, (config) => {
89
+ const key = 'VisionCamera_enableCodeScanner';
90
+ config.modResults = config.modResults.filter(
91
+ (item) => item.type !== 'property' || item.key !== key
92
+ );
93
+ config.modResults.push({
94
+ type: 'property',
95
+ key,
96
+ value: String(enableCodeScanner),
97
+ });
98
+ return config;
99
+ });
100
+
85
101
  return config;
86
102
  };
87
103
 
88
- module.exports = withVisionCameraPermissions;
104
+ module.exports = withVisionCameraPermissions;
@@ -1,9 +1,10 @@
1
- import { ConfigPlugin, withInfoPlist, withAndroidManifest } from '@expo/config-plugins';
1
+ import { ConfigPlugin, withInfoPlist, withAndroidManifest, withGradleProperties } from '@expo/config-plugins';
2
2
 
3
3
  export interface VisionCameraPluginProps {
4
4
  cameraPermissionText?: string;
5
5
  microphonePermissionText?: string;
6
6
  enableFrameProcessors?: boolean;
7
+ enableCodeScanner?: boolean;
7
8
  }
8
9
 
9
10
  const withVisionCameraPermissions: ConfigPlugin<VisionCameraPluginProps> = (
@@ -12,6 +13,7 @@ const withVisionCameraPermissions: ConfigPlugin<VisionCameraPluginProps> = (
12
13
  cameraPermissionText = 'This app uses the camera to capture photos and videos for identity verification.',
13
14
  microphonePermissionText = 'This app uses the microphone to record audio for video capture.',
14
15
  enableFrameProcessors = false,
16
+ enableCodeScanner = true,
15
17
  } = {}
16
18
  ) => {
17
19
  // iOS permissions
@@ -91,7 +93,22 @@ const withVisionCameraPermissions: ConfigPlugin<VisionCameraPluginProps> = (
91
93
  return config;
92
94
  });
93
95
 
96
+ // VisionCamera's Android code scanner requires the bundled ML Kit model.
97
+ // Default this to true because IDCapture relies on native barcode scanning.
98
+ config = withGradleProperties(config, (config) => {
99
+ const key = 'VisionCamera_enableCodeScanner';
100
+ config.modResults = config.modResults.filter(
101
+ (item) => item.type !== 'property' || item.key !== key
102
+ );
103
+ config.modResults.push({
104
+ type: 'property',
105
+ key,
106
+ value: String(enableCodeScanner),
107
+ });
108
+ return config;
109
+ });
110
+
94
111
  return config;
95
112
  };
96
113
 
97
- export default withVisionCameraPermissions;
114
+ export default withVisionCameraPermissions;
@@ -8,6 +8,7 @@ declare class SanctumKeySdkModule extends NativeModule<SanctumKeySdkModuleEvents
8
8
  PI: number;
9
9
  testModule(): Promise<string>;
10
10
  requestCameraPermission(): Promise<boolean>;
11
+ decodeBarcodeFromImage?(imagePath: string, formats: string[]): Promise<string | null>;
11
12
  openCameraWithInstructions(instructions: string): Promise<{ success: boolean; path?: string; error?: string }>;
12
13
  openFilePicker(allowedTypes: string[]): Promise<{ success: boolean; uri?: string; path?: string; error?: string }>;
13
14
  }
@@ -22,6 +22,7 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
22
22
  silentCaptureResult,
23
23
  isProcessing = false,
24
24
  overlayComponent,
25
+ captureStabilizationDelayMs = 4000,
25
26
  isScanningBarcode = false,
26
27
  onBarcodeScanned,
27
28
  barcodeTypes
@@ -32,6 +33,8 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
32
33
 
33
34
  const isCapturingRef = useRef(false);
34
35
  const isProcessingRef = useRef(isProcessing);
36
+ const isScanningBarcodeRef = useRef(isScanningBarcode);
37
+ const onBarcodeScannedRef = useRef(onBarcodeScanned);
35
38
  // Ref-tracked isAnalyzing so captureSilentPhoto always reads the latest
36
39
  // value — the prop-based closure goes stale on iOS between renders.
37
40
  const isAnalyzingRef = useRef(silentCaptureResult?.isAnalyzing ?? false);
@@ -42,7 +45,7 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
42
45
  const [refreshCamera] = useState(false);
43
46
 
44
47
  const [isVideoFound, setIsVideoFound] = useState(false);
45
- const scannedBarcodeRef = useRef<string | null>(null);
48
+ const scannedBarcodeRef = useRef<{ value: string | null; emittedAt: number }>({ value: null, emittedAt: 0 });
46
49
  const containerRef = useRef<any>(null);
47
50
 
48
51
  const [appState, setAppState] = useState<AppStateStatus>(AppState.currentState);
@@ -50,8 +53,14 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
50
53
  const device = useCameraDevice(cameraType);
51
54
 
52
55
  useEffect(() => { isProcessingRef.current = isProcessing; }, [isProcessing]);
56
+ useEffect(() => { isScanningBarcodeRef.current = isScanningBarcode; }, [isScanningBarcode]);
57
+ useEffect(() => { onBarcodeScannedRef.current = onBarcodeScanned; }, [onBarcodeScanned]);
53
58
  useEffect(() => { isAnalyzingRef.current = silentCaptureResult?.isAnalyzing ?? false; }, [silentCaptureResult?.isAnalyzing]);
54
59
 
60
+ useEffect(() => {
61
+ scannedBarcodeRef.current = { value: null, emittedAt: 0 };
62
+ }, [isScanningBarcode]);
63
+
55
64
  useEffect(() => {
56
65
  const subscription = AppState.addEventListener('change', nextAppState => {
57
66
  setAppState(nextAppState);
@@ -100,7 +109,12 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
100
109
  if (showCamera) checkPermissions();
101
110
  }, [showCamera, refreshCamera]);
102
111
 
103
- const onInitialized = useCallback(() => setIsInitialized(true), []);
112
+ const onInitialized = useCallback(() => {
113
+ setIsInitialized(true);
114
+ if (isScanningBarcodeRef.current) {
115
+ console.log('📷 Barcode camera initialized');
116
+ }
117
+ }, []);
104
118
 
105
119
  const onCameraError = useCallback((error: any) => {
106
120
  console.warn("🎥 [Vision Camera Error Caught]:", error);
@@ -114,11 +128,15 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
114
128
  const codeScanner = useCodeScanner({
115
129
  codeTypes: barcodeTypes || ['pdf-417', 'qr', 'code-128', 'code-39'],
116
130
  onCodeScanned: (codes) => {
117
- if (!isProcessingRef.current && isScanningBarcode) {
131
+ if (!isProcessingRef.current && isScanningBarcodeRef.current) {
118
132
  for (const code of codes) {
119
- if (code.value && scannedBarcodeRef.current !== code.value) {
120
- scannedBarcodeRef.current = code.value;
121
- onBarcodeScanned?.(code.value);
133
+ if (!code.value) continue;
134
+
135
+ const now = Date.now();
136
+ const previous = scannedBarcodeRef.current;
137
+ if (previous.value !== code.value || now - previous.emittedAt > 1500) {
138
+ scannedBarcodeRef.current = { value: code.value, emittedAt: now };
139
+ onBarcodeScannedRef.current?.(code.value);
122
140
  break;
123
141
  }
124
142
  }
@@ -137,8 +155,8 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
137
155
  // Web handles its own stream via WebBarcodeScanner; do not run native camera methods on web.
138
156
  if (Platform.OS === 'web') return;
139
157
 
140
- // We intentionally ignore `isInitialized`. If AVFoundation (iOS) or CameraX (Android)
141
- // aren't ready, the try/catch will handle it gracefully.
158
+ // The scheduling effect waits for camera initialization and a positioning
159
+ // grace period before this function can run.
142
160
  if (!camera.current || isProcessingRef.current || isCapturingRef.current) return;
143
161
  if (isAnalyzingRef.current) return;
144
162
 
@@ -148,8 +166,14 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
148
166
  const photo = await camera.current.takePhoto({
149
167
  enableShutterSound: false,
150
168
  flash: 'off',
151
- // iOS requires aggressive compression to prevent RAM crashes during interval captures
152
- ...(Platform.OS === 'ios' ? { photoCodec: 'jpeg', qualityPrioritization: 'speed' } : {})
169
+ ...(Platform.OS === 'ios'
170
+ ? {
171
+ photoCodec: 'jpeg' as const,
172
+ // Barcode stills are decoded off the live path, so preserve the
173
+ // fine PDF417 modules instead of favoring capture speed.
174
+ qualityPrioritization: isScanningBarcodeRef.current ? 'quality' as const : 'balanced' as const,
175
+ }
176
+ : {})
153
177
  });
154
178
 
155
179
  // 3. CROSS-PLATFORM PATH NORMALIZATION
@@ -172,7 +196,7 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
172
196
  onSilentCaptureRef.current?.({
173
197
  success: captureSuccess,
174
198
  path: finalPath,
175
- barcode: scannedBarcodeRef.current
199
+ barcode: scannedBarcodeRef.current.value
176
200
  });
177
201
 
178
202
  } catch (error: any) {
@@ -185,45 +209,26 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
185
209
 
186
210
  // 5. THE UNBREAKABLE INTERVAL
187
211
  useEffect(() => {
188
- // If we shouldn't scan, or if web (web handles its own stream), abort.
189
- // We intentionally don't require `isInitialized` here, the try/catch inside
190
- // captureSilentPhoto handles unready cameras gracefully without breaking the loop.
191
- if (!showCamera || isProcessing || Platform.OS === 'web') return;
212
+ // Give autofocus/exposure and the user time to settle before the first
213
+ // automatic capture. A remount creates a fresh grace period for each side.
214
+ if (!showCamera || !isInitialized || isProcessing || Platform.OS === 'web') return;
192
215
 
193
216
  let active = true;
194
217
  let id: ReturnType<typeof setInterval>;
195
218
 
196
219
  const timer = setTimeout(() => {
197
220
  if (!active) return;
198
- const intervalDelay = isScanningBarcode ? 3000 : 1500;
199
- id = setInterval(captureSilentPhoto, intervalDelay);
200
- }, 1500);
201
-
202
- return () => {
203
- active = false;
204
- clearTimeout(timer);
205
- if (id) clearInterval(id);
206
- };
207
- }, [showCamera, isProcessing, isScanningBarcode, captureSilentPhoto]);
208
-
209
-
210
- useEffect(() => {
211
- if (!showCamera || !isInitialized || isProcessing) return;
212
- let active = true;
213
- let id: ReturnType<typeof setInterval>;
214
-
215
- const timer = setTimeout(() => {
216
- if (!active) return;
217
- const intervalDelay = isScanningBarcode ? 3000 : 1500;
221
+ captureSilentPhoto();
222
+ const intervalDelay = isScanningBarcode ? 4500 : 3000;
218
223
  id = setInterval(captureSilentPhoto, intervalDelay);
219
- }, 1500);
224
+ }, Math.max(0, captureStabilizationDelayMs));
220
225
 
221
226
  return () => {
222
227
  active = false;
223
228
  clearTimeout(timer);
224
229
  if (id) clearInterval(id);
225
230
  };
226
- }, [showCamera, isInitialized, isProcessing, captureSilentPhoto, isScanningBarcode]);
231
+ }, [showCamera, isInitialized, isProcessing, isScanningBarcode, captureStabilizationDelayMs, captureSilentPhoto]);
227
232
 
228
233
  useEffect(() => {
229
234
  if (Platform.OS !== 'web' || !showCamera) return;
@@ -252,8 +257,8 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
252
257
  }, [showCamera]);
253
258
 
254
259
  const handleWebBarcodeScanned = useCallback((value: string) => {
255
- if (!isProcessingRef.current && value !== scannedBarcodeRef.current) {
256
- scannedBarcodeRef.current = value;
260
+ if (!isProcessingRef.current && value !== scannedBarcodeRef.current.value) {
261
+ scannedBarcodeRef.current = { value, emittedAt: Date.now() };
257
262
  onBarcodeScanned?.(value);
258
263
  }
259
264
  }, [onBarcodeScanned]);
@@ -291,16 +296,22 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
291
296
  resizeMode="cover"
292
297
  isActive={showCamera && !isProcessing && appState === 'active'}
293
298
  photo={true}
299
+ photoQualityBalance={isScanningBarcode ? 'quality' : 'balanced'}
294
300
  video={false}
295
301
  audio={false}
296
302
  onInitialized={onInitialized}
297
303
  onError={onCameraError}
298
- codeScanner={Platform.OS !== 'web' && isScanningBarcode ? codeScanner : undefined}
304
+ // Some Android camera levels cannot configure Preview + ImageCapture +
305
+ // ImageAnalysis together and fail with invalid-output-configuration.
306
+ // Android barcodes use the bundled full-resolution ML Kit/ZXing still
307
+ // decoder; iOS can retain Vision Camera's low-latency live scanner.
308
+ codeScanner={Platform.OS === 'ios' && isScanningBarcode ? codeScanner : undefined}
299
309
  />
300
310
  {Platform.OS === 'web' && isScanningBarcode && isVideoFound && (
301
311
  <WebBarcodeScanner
302
312
  videoRef={webVideoRef as React.RefObject<HTMLVideoElement>}
303
313
  onBarcodeScanned={handleWebBarcodeScanned}
314
+ formats={barcodeTypes}
304
315
  active={!isProcessingRef.current}
305
316
  />
306
317
  )}
@@ -312,4 +323,4 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
312
323
  const styles = StyleSheet.create({
313
324
  container: { flex: 1, backgroundColor: 'black' },
314
325
  permissionMessage: { color: 'white', textAlign: 'center', margin: 20, fontSize: 16 },
315
- });
326
+ });
@@ -2,6 +2,7 @@ import React, { useCallback, useEffect, useRef, useState } from 'react';
2
2
  import { View, StyleSheet, TouchableOpacity, Text, Platform } from 'react-native';
3
3
  import { EnhancedCameraViewProps } from './OverLay/type';
4
4
  import { useI18n } from '../hooks/useI18n';
5
+ import type { CodeType } from 'react-native-vision-camera';
5
6
  // 🚨 Import the WebBarcodeScanner we built earlier
6
7
  import { WebBarcodeScanner } from './WebBarcodeScanner';
7
8
 
@@ -9,6 +10,7 @@ import { WebBarcodeScanner } from './WebBarcodeScanner';
9
10
  export interface ExtendedCameraProps extends EnhancedCameraViewProps {
10
11
  isScanningBarcode?: boolean;
11
12
  onBarcodeScanned?: (data: string) => void;
13
+ barcodeTypes?: CodeType[];
12
14
  }
13
15
 
14
16
  export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
@@ -34,10 +36,11 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
34
36
  videoDuration = 10,
35
37
  onSilentCapture,
36
38
  silentCaptureResult,
37
- captureStabilizationDelayMs = 2500,
39
+ captureStabilizationDelayMs = 4000,
38
40
  // 🚨 New props for barcode support
39
41
  isScanningBarcode = false,
40
42
  onBarcodeScanned,
43
+ barcodeTypes,
41
44
  }) => {
42
45
  const { t } = useI18n();
43
46
 
@@ -61,12 +64,16 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
61
64
 
62
65
  // 🚨 New Refs for Barcode Logic
63
66
  const isProcessingRef = useRef(silentCaptureResult?.isAnalyzing || false);
64
- const scannedBarcodeRef = useRef<string | null>(null);
67
+ const scannedBarcodeRef = useRef<{ value: string | null; emittedAt: number }>({ value: null, emittedAt: 0 });
65
68
 
66
69
  useEffect(() => {
67
70
  isProcessingRef.current = silentCaptureResult?.isAnalyzing || false;
68
71
  }, [silentCaptureResult?.isAnalyzing]);
69
72
 
73
+ useEffect(() => {
74
+ scannedBarcodeRef.current = { value: null, emittedAt: 0 };
75
+ }, [isScanningBarcode]);
76
+
70
77
  useEffect(() => {
71
78
  if (showCamera) {
72
79
  checkPermissions();
@@ -223,8 +230,10 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
223
230
  // 🚨 Memoized Callback for Barcode Decoding
224
231
  const handleWebBarcodeScanned = useCallback((value: string) => {
225
232
  console.log(`🎉 [WEB SCANNER] SUCCESS! Decoded value:`, value);
226
- if (!isProcessingRef.current && value !== scannedBarcodeRef.current) {
227
- scannedBarcodeRef.current = value;
233
+ const now = Date.now();
234
+ const previous = scannedBarcodeRef.current;
235
+ if (!isProcessingRef.current && (value !== previous.value || now - previous.emittedAt > 1500)) {
236
+ scannedBarcodeRef.current = { value, emittedAt: now };
228
237
  onBarcodeScanned?.(value);
229
238
  }
230
239
  }, [onBarcodeScanned]);
@@ -289,6 +298,7 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
289
298
  <WebBarcodeScanner
290
299
  videoRef={videoRef}
291
300
  onBarcodeScanned={handleWebBarcodeScanned}
301
+ formats={barcodeTypes}
292
302
  // Use silentCaptureResult.isAnalyzing (state) not the ref so
293
303
  // React re-renders with the correct active value
294
304
  active={isScanningBarcode && isInitialized && !(silentCaptureResult?.isAnalyzing ?? false)}
@@ -354,4 +364,4 @@ const styles = StyleSheet.create({
354
364
  bbox: { position: 'absolute', borderStyle: 'solid', backgroundColor: 'transparent' },
355
365
  analyzingContainer: { position: 'absolute', bottom: 100, alignSelf: 'center', backgroundColor: 'rgba(0, 0, 0, 0.7)', padding: 10, borderRadius: 10, zIndex: 1000 },
356
366
  analyzingText: { color: 'white', fontSize: 16, fontWeight: 'bold' },
357
- });
367
+ });