@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.
- package/README.md +7 -2
- package/android/build/.transforms/3db9b15041d4285a820fc84462995ea1/results.bin +1 -0
- package/android/build/.transforms/3db9b15041d4285a820fc84462995ea1/transformed/classes/classes_dex/classes.dex +0 -0
- package/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
- package/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/counters.tab +1 -1
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/last-build.bin +0 -0
- package/android/build/kotlin/compileDebugKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin +0 -0
- package/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin +0 -0
- package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/SanctumKeySdkModule$BarcodeRegion.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/SanctumKeySdkModule$Companion.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$1$5$1.class → SanctumKeySdkModule$definition$1$6$1.class} +0 -0
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$1$5$2.class → SanctumKeySdkModule$definition$1$6$2.class} +0 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$3.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$4.class +0 -0
- 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
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$6.class +0 -0
- 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
- 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
- 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
- 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
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/SanctumKeySdkModule.class +0 -0
- package/android/build.gradle +7 -0
- package/android/src/main/java/kyc/sanctumkey/com/SanctumKeySdkModule.kt +428 -1
- package/build/package.json +3 -1
- package/build/src/SanctumKeySdkModule.d.ts +1 -0
- package/build/src/SanctumKeySdkModule.d.ts.map +1 -1
- package/build/src/SanctumKeySdkModule.js.map +1 -1
- package/build/src/components/EnhancedCameraView.d.ts.map +1 -1
- package/build/src/components/EnhancedCameraView.js +50 -41
- package/build/src/components/EnhancedCameraView.js.map +1 -1
- package/build/src/components/EnhancedCameraView.web.d.ts +2 -0
- package/build/src/components/EnhancedCameraView.web.d.ts.map +1 -1
- package/build/src/components/EnhancedCameraView.web.js +11 -6
- package/build/src/components/EnhancedCameraView.web.js.map +1 -1
- package/build/src/components/KYCElements/IDCardCapture.d.ts.map +1 -1
- package/build/src/components/KYCElements/IDCardCapture.js +499 -78
- package/build/src/components/KYCElements/IDCardCapture.js.map +1 -1
- package/build/src/components/TemplateKYCExample.d.ts.map +1 -1
- package/build/src/components/TemplateKYCExample.js +3 -9
- package/build/src/components/TemplateKYCExample.js.map +1 -1
- package/build/src/components/TemplateKYCFlowRefactored.d.ts.map +1 -1
- package/build/src/components/TemplateKYCFlowRefactored.js +0 -2
- package/build/src/components/TemplateKYCFlowRefactored.js.map +1 -1
- package/build/src/components/WebBarcodeScanner.d.ts +2 -0
- package/build/src/components/WebBarcodeScanner.d.ts.map +1 -1
- package/build/src/components/WebBarcodeScanner.js +99 -85
- package/build/src/components/WebBarcodeScanner.js.map +1 -1
- package/build/src/modules/api/KYCService.d.ts +1 -0
- package/build/src/modules/api/KYCService.d.ts.map +1 -1
- package/build/src/modules/api/KYCService.js +1 -1
- package/build/src/modules/api/KYCService.js.map +1 -1
- package/build/src/modules/api/types.d.ts +1 -0
- package/build/src/modules/api/types.d.ts.map +1 -1
- package/build/src/modules/api/types.js.map +1 -1
- package/build/src/web/WebKYCEntry.d.ts.map +1 -1
- package/build/src/web/WebKYCEntry.js +50 -32
- package/build/src/web/WebKYCEntry.js.map +1 -1
- package/package.json +3 -1
- package/plugin/build/withVisionCamera.d.ts +1 -0
- package/plugin/build/withVisionCamera.js +13 -1
- package/plugin/src/withVisionCamera.js +18 -2
- package/plugin/src/withVisionCamera.ts +19 -2
- package/src/SanctumKeySdkModule.ts +1 -0
- package/src/components/EnhancedCameraView.tsx +52 -41
- package/src/components/EnhancedCameraView.web.tsx +15 -5
- package/src/components/KYCElements/IDCardCapture.tsx +552 -75
- package/src/components/TemplateKYCExample.tsx +6 -14
- package/src/components/TemplateKYCFlowRefactored.tsx +0 -2
- package/src/components/WebBarcodeScanner.tsx +147 -198
- package/src/modules/api/KYCService.ts +3 -3
- package/src/modules/api/types.ts +1 -0
- 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.
|
|
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(() =>
|
|
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 &&
|
|
131
|
+
if (!isProcessingRef.current && isScanningBarcodeRef.current) {
|
|
118
132
|
for (const code of codes) {
|
|
119
|
-
if (code.value
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
//
|
|
141
|
-
//
|
|
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
|
-
|
|
152
|
-
|
|
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
|
-
//
|
|
189
|
-
//
|
|
190
|
-
|
|
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
|
-
|
|
199
|
-
|
|
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
|
-
},
|
|
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,
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
227
|
-
|
|
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
|
+
});
|