@sanctum-key/react-native-sdk 1.0.56 → 1.0.58
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/build/package.json +6 -1
- package/build/src/components/KYCElements/IDCardCapture.js +3 -3
- package/build/src/components/KYCElements/IDCardCapture.js.map +1 -1
- package/build/src/config/countriesData.d.ts.map +1 -1
- package/build/src/config/countriesData.js +249 -77
- package/build/src/config/countriesData.js.map +1 -1
- package/build/src/config/region_mapping.d.ts.map +1 -1
- package/build/src/config/region_mapping.js +45 -15
- package/build/src/config/region_mapping.js.map +1 -1
- package/build/src/utils/cameraPermissions.d.ts +7 -0
- package/build/src/utils/cameraPermissions.d.ts.map +1 -0
- package/build/src/utils/cameraPermissions.js +8 -0
- package/build/src/utils/cameraPermissions.js.map +1 -0
- package/build/src/utils/cameraPermissions.web.d.ts +7 -0
- package/build/src/utils/cameraPermissions.web.d.ts.map +1 -0
- package/build/src/utils/cameraPermissions.web.js +7 -0
- package/build/src/utils/cameraPermissions.web.js.map +1 -0
- package/build/src/utils/logger.d.ts +1 -0
- package/build/src/utils/logger.d.ts.map +1 -1
- package/build/src/utils/logger.js +37 -73
- package/build/src/utils/logger.js.map +1 -1
- package/build/src/web/WebKYCEntry.d.ts.map +1 -1
- package/build/src/web/WebKYCEntry.js +0 -2
- package/build/src/web/WebKYCEntry.js.map +1 -1
- package/package.json +6 -1
- package/src/components/KYCElements/IDCardCapture.tsx +3 -3
- package/src/config/countriesData.ts +250 -78
- package/src/config/region_mapping.ts +700 -670
- package/src/utils/cameraPermissions.ts +9 -0
- package/src/utils/cameraPermissions.web.ts +7 -0
- package/src/utils/logger.ts +42 -93
- package/src/web/WebKYCEntry.tsx +0 -2
|
@@ -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';\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;"]}
|
|
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\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 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.58",
|
|
4
4
|
"description": "Sanctum Key React Native SDK",
|
|
5
5
|
"main": "build/src/index.js",
|
|
6
6
|
"types": "build/src/index.d.ts",
|
|
@@ -59,11 +59,16 @@
|
|
|
59
59
|
"zustand": "^5.0.8"
|
|
60
60
|
},
|
|
61
61
|
"devDependencies": {
|
|
62
|
+
"@react-native-async-storage/async-storage": "^3.1.1",
|
|
62
63
|
"@types/crypto-js": "^4.2.2",
|
|
63
64
|
"@types/react": "~19.1.0",
|
|
64
65
|
"copyfiles": "^2.4.1",
|
|
65
66
|
"expo": "~54.0.0",
|
|
67
|
+
"expo-application": "^57.0.2",
|
|
68
|
+
"expo-device": "^57.0.1",
|
|
69
|
+
"expo-localization": "^57.0.1",
|
|
66
70
|
"expo-module-scripts": "^4.1.10",
|
|
71
|
+
"posthog-react-native": "^4.68.0",
|
|
67
72
|
"react-native": "0.81.5"
|
|
68
73
|
},
|
|
69
74
|
"peerDependencies": {
|
|
@@ -17,9 +17,9 @@ import QRCode from 'react-native-qrcode-svg';
|
|
|
17
17
|
import { cropImageWithBBoxWithTolerance } from '../../utils/cropByObb';
|
|
18
18
|
import kycService, { authentification, clearAuthToken, errorMessage } from '../../modules/api/KYCService';
|
|
19
19
|
import { Linking } from 'react-native';
|
|
20
|
-
import { Camera } from 'react-native-vision-camera';
|
|
21
20
|
import { sdkLogger } from '../../utils/logger';
|
|
22
21
|
import SanctumKeySdkModule from '../../SanctumKeySdkModule';
|
|
22
|
+
import { getCameraPermissionStatus, requestCameraPermission } from '../../utils/cameraPermissions';
|
|
23
23
|
|
|
24
24
|
const ISO_TO_COUNTRY_NAME: Record<string, string> = {
|
|
25
25
|
'KE': 'Kenya', 'CM': 'Cameroon', 'NG': 'Nigeria', 'CA': 'Canada',
|
|
@@ -338,10 +338,10 @@ export const IDCardCapture: React.FC<IDCardCaptureProps> = ({ component, value =
|
|
|
338
338
|
return;
|
|
339
339
|
}
|
|
340
340
|
try {
|
|
341
|
-
let status =
|
|
341
|
+
let status = getCameraPermissionStatus();
|
|
342
342
|
if (status !== 'granted') {
|
|
343
343
|
sdkLogger.info(`Camera permission not granted yet, requesting...`);
|
|
344
|
-
status = await
|
|
344
|
+
status = await requestCameraPermission();
|
|
345
345
|
}
|
|
346
346
|
if (status === 'granted') {
|
|
347
347
|
sdkLogger.info(`Camera permission granted. Mounting camera...`);
|
|
@@ -1,81 +1,253 @@
|
|
|
1
1
|
import { Country } from "../types/KYC.types";
|
|
2
2
|
|
|
3
3
|
export const countryData: Record<string, Country> = {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
}
|
|
4
|
+
AD: { name: "Andorre", name_en: "Andorra", flag: "🇦🇩" },
|
|
5
|
+
AE: { name: "Émirats Arabes Unis", name_en: "United Arab Emirates", flag: "🇦🇪" },
|
|
6
|
+
AF: { name: "Afghanistan", name_en: "Afghanistan", flag: "🇦🇫" },
|
|
7
|
+
AG: { name: "Antigua-et-Barbuda", name_en: "Antigua and Barbuda", flag: "🇦🇬" },
|
|
8
|
+
AI: { name: "Anguilla", name_en: "Anguilla", flag: "🇦🇮" },
|
|
9
|
+
AL: { name: "Albanie", name_en: "Albania", flag: "🇦🇱" },
|
|
10
|
+
AM: { name: "Arménie", name_en: "Armenia", flag: "🇦🇲" },
|
|
11
|
+
AO: { name: "Angola", name_en: "Angola", flag: "🇦🇴" },
|
|
12
|
+
AQ: { name: "Antarctique", name_en: "Antarctica", flag: "🇦🇶" },
|
|
13
|
+
AR: { name: "Argentine", name_en: "Argentina", flag: "🇦🇷" },
|
|
14
|
+
AS: { name: "Samoa Américaines", name_en: "American Samoa", flag: "🇦🇸" },
|
|
15
|
+
AT: { name: "Autriche", name_en: "Austria", flag: "🇦🇹" },
|
|
16
|
+
AU: { name: "Australie", name_en: "Australia", flag: "🇦🇺" },
|
|
17
|
+
AW: { name: "Aruba", name_en: "Aruba", flag: "🇦🇼" },
|
|
18
|
+
AX: { name: "Îles Åland", name_en: "Åland Islands", flag: "🇦🇽" },
|
|
19
|
+
AZ: { name: "Azerbaïdjan", name_en: "Azerbaijan", flag: "🇦🇿" },
|
|
20
|
+
BA: { name: "Bosnie-Herzégovine", name_en: "Bosnia and Herzegovina", flag: "🇧🇦" },
|
|
21
|
+
BB: { name: "Barbade", name_en: "Barbados", flag: "🇧🇧" },
|
|
22
|
+
BD: { name: "Bangladesh", name_en: "Bangladesh", flag: "🇧🇩" },
|
|
23
|
+
BE: { name: "Belgique", name_en: "Belgium", flag: "🇧🇪" },
|
|
24
|
+
BF: { name: "Burkina Faso", name_en: "Burkina Faso", flag: "🇧🇫" },
|
|
25
|
+
BG: { name: "Bulgarie", name_en: "Bulgaria", flag: "🇧🇬" },
|
|
26
|
+
BH: { name: "Bahreïn", name_en: "Bahrain", flag: "🇧🇭" },
|
|
27
|
+
BI: { name: "Burundi", name_en: "Burundi", flag: "🇧🇮" },
|
|
28
|
+
BJ: { name: "Bénin", name_en: "Benin", flag: "🇧🇯" },
|
|
29
|
+
BL: { name: "Saint-Barthélemy", name_en: "Saint Barthélemy", flag: "🇧🇱" },
|
|
30
|
+
BM: { name: "Bermudes", name_en: "Bermuda", flag: "🇧🇲" },
|
|
31
|
+
BN: { name: "Brunéi Darussalam", name_en: "Brunei", flag: "🇧🇳" },
|
|
32
|
+
BO: { name: "Bolivie", name_en: "Bolivia", flag: "🇧🇴" },
|
|
33
|
+
BQ: { name: "Pays-Bas caribéens", name_en: "Caribbean Netherlands", flag: "🇧🇶" },
|
|
34
|
+
BR: { name: "Brésil", name_en: "Brazil", flag: "🇧🇷" },
|
|
35
|
+
BS: { name: "Bahamas", name_en: "Bahamas", flag: "🇧🇸" },
|
|
36
|
+
BT: { name: "Bhoutan", name_en: "Bhutan", flag: "🇧🇹" },
|
|
37
|
+
BV: { name: "Île Bouvet", name_en: "Bouvet Island", flag: "🇧🇻" },
|
|
38
|
+
BW: { name: "Botswana", name_en: "Botswana", flag: "🇧🇼" },
|
|
39
|
+
BY: { name: "Biélorussie", name_en: "Belarus", flag: "🇧🇾" },
|
|
40
|
+
BZ: { name: "Belize", name_en: "Belize", flag: "🇧🇿" },
|
|
41
|
+
CA: { name: "Canada", name_en: "Canada", flag: "🇨🇦", hasRegions: true },
|
|
42
|
+
CC: { name: "Îles Cocos", name_en: "Cocos (Keeling) Islands", flag: "🇨🇨" },
|
|
43
|
+
CD: { name: "République démocratique du Congo", name_en: "DR Congo", flag: "🇨🇩" },
|
|
44
|
+
CF: { name: "République centrafricaine", name_en: "Central African Republic", flag: "🇨🇫" },
|
|
45
|
+
CG: { name: "Congo", name_en: "Republic of the Congo", flag: "🇨🇬" },
|
|
46
|
+
CH: { name: "Suisse", name_en: "Switzerland", flag: "🇨🇭" },
|
|
47
|
+
CI: { name: "Côte d'Ivoire", name_en: "Ivory Coast", flag: "🇨🇮" },
|
|
48
|
+
CK: { name: "Îles Cook", name_en: "Cook Islands", flag: "🇨🇰" },
|
|
49
|
+
CL: { name: "Chili", name_en: "Chile", flag: "🇨🇱" },
|
|
50
|
+
CM: { name: "Cameroun", name_en: "Cameroon", flag: "🇨🇲" },
|
|
51
|
+
CN: { name: "Chine", name_en: "China", flag: "🇨🇳" },
|
|
52
|
+
CO: { name: "Colombie", name_en: "Colombia", flag: "🇨🇴" },
|
|
53
|
+
CR: { name: "Costa Rica", name_en: "Costa Rica", flag: "🇨🇷" },
|
|
54
|
+
CU: { name: "Cuba", name_en: "Cuba", flag: "🇨🇺" },
|
|
55
|
+
CV: { name: "Cap-Vert", name_en: "Cape Verde", flag: "🇨🇻" },
|
|
56
|
+
CW: { name: "Curaçao", name_en: "Curaçao", flag: "🇨🇼" },
|
|
57
|
+
CX: { name: "Île Christmas", name_en: "Christmas Island", flag: "🇨🇽" },
|
|
58
|
+
CY: { name: "Chypre", name_en: "Cyprus", flag: "🇨🇾" },
|
|
59
|
+
CZ: { name: "République Tchèque", name_en: "Czech Republic", flag: "🇨🇿" },
|
|
60
|
+
DE: { name: "Allemagne", name_en: "Germany", flag: "🇩🇪" },
|
|
61
|
+
DJ: { name: "Djibouti", name_en: "Djibouti", flag: "🇩🇯" },
|
|
62
|
+
DK: { name: "Danemark", name_en: "Denmark", flag: "🇩🇰" },
|
|
63
|
+
DM: { name: "Dominique", name_en: "Dominica", flag: "🇩🇲" },
|
|
64
|
+
DO: { name: "République dominicaine", name_en: "Dominican Republic", flag: "🇩🇴" },
|
|
65
|
+
DZ: { name: "Algérie", name_en: "Algeria", flag: "🇩🇿" },
|
|
66
|
+
EC: { name: "Équateur", name_en: "Ecuador", flag: "🇪🇨" },
|
|
67
|
+
EE: { name: "Estonie", name_en: "Estonia", flag: "🇪🇪" },
|
|
68
|
+
EG: { name: "Égypte", name_en: "Egypt", flag: "🇪🇬" },
|
|
69
|
+
EH: { name: "Sahara occidental", name_en: "Western Sahara", flag: "🇪🇭" },
|
|
70
|
+
ER: { name: "Érythrée", name_en: "Eritrea", flag: "🇪🇷" },
|
|
71
|
+
ES: { name: "Espagne", name_en: "Spain", flag: "🇪🇸" },
|
|
72
|
+
ET: { name: "Éthiopie", name_en: "Ethiopia", flag: "🇪🇹" },
|
|
73
|
+
FI: { name: "Finlande", name_en: "Finland", flag: "🇫🇮" },
|
|
74
|
+
FJ: { name: "Fidji", name_en: "Fiji", flag: "🇫🇯" },
|
|
75
|
+
FK: { name: "Îles Malouines", name_en: "Falkland Islands", flag: "🇫🇰" },
|
|
76
|
+
FM: { name: "Micronésie", name_en: "Micronesia", flag: "🇫🇲" },
|
|
77
|
+
FO: { name: "Îles Féroé", name_en: "Faroe Islands", flag: "🇫🇴" },
|
|
78
|
+
FR: { name: "France", name_en: "France", flag: "🇫🇷" },
|
|
79
|
+
GA: { name: "Gabon", name_en: "Gabon", flag: "🇬🇦" },
|
|
80
|
+
GB: { name: "Royaume-Uni", name_en: "United Kingdom", flag: "🇬🇧" },
|
|
81
|
+
GD: { name: "Grenade", name_en: "Grenada", flag: "🇬🇩" },
|
|
82
|
+
GE: { name: "Géorgie", name_en: "Georgia", flag: "🇬🇪" },
|
|
83
|
+
GF: { name: "Guyane", name_en: "French Guiana", flag: "🇬🇫" },
|
|
84
|
+
GG: { name: "Guernesey", name_en: "Guernsey", flag: "🇬🇬" },
|
|
85
|
+
GH: { name: "Ghana", name_en: "Ghana", flag: "🇬🇭" },
|
|
86
|
+
GI: { name: "Gibraltar", name_en: "Gibraltar", flag: "🇬🇮" },
|
|
87
|
+
GL: { name: "Groenland", name_en: "Greenland", flag: "🇬🇱" },
|
|
88
|
+
GM: { name: "Gambie", name_en: "Gambia", flag: "🇬🇲" },
|
|
89
|
+
GN: { name: "Guinée", name_en: "Guinea", flag: "🇬🇳" },
|
|
90
|
+
GP: { name: "Guadeloupe", name_en: "Guadeloupe", flag: "🇬🇵" },
|
|
91
|
+
GQ: { name: "Guinée équatoriale", name_en: "Equatorial Guinea", flag: "🇬🇶" },
|
|
92
|
+
GR: { name: "Grèce", name_en: "Greece", flag: "🇬🇷" },
|
|
93
|
+
GS: { name: "Géorgie du Sud-et-les Îles Sandwich du Sud", name_en: "South Georgia", flag: "🇬🇸" },
|
|
94
|
+
GT: { name: "Guatemala", name_en: "Guatemala", flag: "🇬🇹" },
|
|
95
|
+
GU: { name: "Guam", name_en: "Guam", flag: "🇬🇺" },
|
|
96
|
+
GW: { name: "Guinée-Bissau", name_en: "Guinea-Bissau", flag: "🇬🇼" },
|
|
97
|
+
GY: { name: "Guyana", name_en: "Guyana", flag: "🇬🇾" },
|
|
98
|
+
HK: { name: "Hong Kong", name_en: "Hong Kong", flag: "🇭🇰" },
|
|
99
|
+
HM: { name: "Îles Heard-et-MacDonald", name_en: "Heard Island and McDonald Islands", flag: "🇭🇲" },
|
|
100
|
+
HN: { name: "Honduras", name_en: "Honduras", flag: "🇭🇳" },
|
|
101
|
+
HR: { name: "Croatie", name_en: "Croatia", flag: "🇭🇷" },
|
|
102
|
+
HT: { name: "Haïti", name_en: "Haiti", flag: "🇭🇹" },
|
|
103
|
+
HU: { name: "Hongrie", name_en: "Hungary", flag: "🇭🇺" },
|
|
104
|
+
ID: { name: "Indonésie", name_en: "Indonesia", flag: "🇮🇩" },
|
|
105
|
+
IE: { name: "Irlande", name_en: "Ireland", flag: "🇮🇪" },
|
|
106
|
+
IL: { name: "Israël", name_en: "Israel", flag: "🇮🇱" },
|
|
107
|
+
IM: { name: "Île de Man", name_en: "Isle of Man", flag: "🇮🇲" },
|
|
108
|
+
IN: { name: "Inde", name_en: "India", flag: "🇮🇳" },
|
|
109
|
+
IO: { name: "Territoire britannique de l'océan Indien", name_en: "British Indian Ocean Territory", flag: "🇮🇴" },
|
|
110
|
+
IQ: { name: "Irak", name_en: "Iraq", flag: "🇮🇶" },
|
|
111
|
+
IR: { name: "Iran", name_en: "Iran", flag: "🇮🇷" },
|
|
112
|
+
IS: { name: "Islande", name_en: "Iceland", flag: "🇮🇸" },
|
|
113
|
+
IT: { name: "Italie", name_en: "Italy", flag: "🇮🇹" },
|
|
114
|
+
JE: { name: "Jersey", name_en: "Jersey", flag: "🇯🇪" },
|
|
115
|
+
JM: { name: "Jamaïque", name_en: "Jamaica", flag: "🇯🇲" },
|
|
116
|
+
JO: { name: "Jordanie", name_en: "Jordan", flag: "🇯🇴" },
|
|
117
|
+
JP: { name: "Japon", name_en: "Japan", flag: "🇯🇵" },
|
|
118
|
+
KE: { name: "Kenya", name_en: "Kenya", flag: "🇰🇪" },
|
|
119
|
+
KG: { name: "Kirghizistan", name_en: "Kyrgyzstan", flag: "🇰🇬" },
|
|
120
|
+
KH: { name: "Cambodge", name_en: "Cambodia", flag: "🇰🇭" },
|
|
121
|
+
KI: { name: "Kiribati", name_en: "Kiribati", flag: "🇰🇮" },
|
|
122
|
+
KM: { name: "Comores", name_en: "Comoros", flag: "🇰🇲" },
|
|
123
|
+
KN: { name: "Saint-Kitts-et-Nevis", name_en: "Saint Kitts and Nevis", flag: "🇰🇳" },
|
|
124
|
+
KP: { name: "Corée du Nord", name_en: "North Korea", flag: "🇰🇵" },
|
|
125
|
+
KR: { name: "Corée du Sud", name_en: "South Korea", flag: "🇰🇷" },
|
|
126
|
+
KW: { name: "Koweït", name_en: "Kuwait", flag: "🇰🇼" },
|
|
127
|
+
KY: { name: "Îles Caïmans", name_en: "Cayman Islands", flag: "🇰🇾" },
|
|
128
|
+
KZ: { name: "Kazakhstan", name_en: "Kazakhstan", flag: "🇰🇿" },
|
|
129
|
+
LA: { name: "Laos", name_en: "Laos", flag: "🇱🇦" },
|
|
130
|
+
LB: { name: "Liban", name_en: "Lebanon", flag: "🇱🇧" },
|
|
131
|
+
LC: { name: "Sainte-Lucie", name_en: "Saint Lucia", flag: "🇱🇨" },
|
|
132
|
+
LI: { name: "Liechtenstein", name_en: "Liechtenstein", flag: "🇱🇮" },
|
|
133
|
+
LK: { name: "Sri Lanka", name_en: "Sri Lanka", flag: "🇱🇰" },
|
|
134
|
+
LR: { name: "Libéria", name_en: "Liberia", flag: "🇱🇷" },
|
|
135
|
+
LS: { name: "Lesotho", name_en: "Lesotho", flag: "🇱🇸" },
|
|
136
|
+
LT: { name: "Lituanie", name_en: "Lithuania", flag: "🇱🇹" },
|
|
137
|
+
LU: { name: "Luxembourg", name_en: "Luxembourg", flag: "🇱🇺" },
|
|
138
|
+
LV: { name: "Lettonie", name_en: "Latvia", flag: "🇱🇻" },
|
|
139
|
+
LY: { name: "Libye", name_en: "Libya", flag: "🇱🇾" },
|
|
140
|
+
MA: { name: "Maroc", name_en: "Morocco", flag: "🇲🇦" },
|
|
141
|
+
MC: { name: "Monaco", name_en: "Monaco", flag: "🇲🇨" },
|
|
142
|
+
MD: { name: "Moldavie", name_en: "Moldova", flag: "🇲🇩" },
|
|
143
|
+
ME: { name: "Monténégro", name_en: "Montenegro", flag: "🇲🇪" },
|
|
144
|
+
MF: { name: "Saint-Martin", name_en: "Saint Martin", flag: "🇲🇫" },
|
|
145
|
+
MG: { name: "Madagascar", name_en: "Madagascar", flag: "🇲🇬" },
|
|
146
|
+
MH: { name: "Îles Marshall", name_en: "Marshall Islands", flag: "🇲🇭" },
|
|
147
|
+
MK: { name: "Macédoine du Nord", name_en: "North Macedonia", flag: "🇲🇰" },
|
|
148
|
+
ML: { name: "Mali", name_en: "Mali", flag: "🇲🇱" },
|
|
149
|
+
MM: { name: "Myanmar", name_en: "Myanmar", flag: "🇲🇲" },
|
|
150
|
+
MN: { name: "Mongolie", name_en: "Mongolia", flag: "🇲🇳" },
|
|
151
|
+
MO: { name: "Macao", name_en: "Macau", flag: "🇲🇴" },
|
|
152
|
+
MP: { name: "Îles Mariannes du Nord", name_en: "Northern Mariana Islands", flag: "🇲🇵" },
|
|
153
|
+
MQ: { name: "Martinique", name_en: "Martinique", flag: "🇲🇶" },
|
|
154
|
+
MR: { name: "Mauritanie", name_en: "Mauritania", flag: "🇲🇷" },
|
|
155
|
+
MS: { name: "Montserrat", name_en: "Montserrat", flag: "🇲🇸" },
|
|
156
|
+
MT: { name: "Malte", name_en: "Malta", flag: "🇲🇹" },
|
|
157
|
+
MU: { name: "Maurice", name_en: "Mauritius", flag: "🇲🇺" },
|
|
158
|
+
MV: { name: "Maldives", name_en: "Maldives", flag: "🇲🇻" },
|
|
159
|
+
MW: { name: "Malawi", name_en: "Malawi", flag: "🇲🇼" },
|
|
160
|
+
MX: { name: "Mexique", name_en: "Mexico", flag: "🇲🇽" },
|
|
161
|
+
MY: { name: "Malaisie", name_en: "Malaysia", flag: "🇲🇾" },
|
|
162
|
+
MZ: { name: "Mozambique", name_en: "Mozambique", flag: "🇲🇿" },
|
|
163
|
+
NA: { name: "Namibie", name_en: "Namibia", flag: "🇳🇦" },
|
|
164
|
+
NC: { name: "Nouvelle-Calédonie", name_en: "New Caledonia", flag: "🇳🇨" },
|
|
165
|
+
NE: { name: "Niger", name_en: "Niger", flag: "🇳🇪" },
|
|
166
|
+
NF: { name: "Île Norfolk", name_en: "Norfolk Island", flag: "🇳🇫" },
|
|
167
|
+
NG: { name: "Nigeria", name_en: "Nigeria", flag: "🇳🇬" },
|
|
168
|
+
NI: { name: "Nicaragua", name_en: "Nicaragua", flag: "🇳🇮" },
|
|
169
|
+
NL: { name: "Pays-Bas", name_en: "Netherlands", flag: "🇳🇱" },
|
|
170
|
+
NO: { name: "Norvège", name_en: "Norway", flag: "🇳🇴" },
|
|
171
|
+
NP: { name: "Népal", name_en: "Nepal", flag: "🇳🇵" },
|
|
172
|
+
NR: { name: "Nauru", name_en: "Nauru", flag: "🇳🇷" },
|
|
173
|
+
NU: { name: "Niue", name_en: "Niue", flag: "🇳🇺" },
|
|
174
|
+
NZ: { name: "Nouvelle-Zélande", name_en: "New Zealand", flag: "🇳🇿" },
|
|
175
|
+
OM: { name: "Oman", name_en: "Oman", flag: "🇴🇲" },
|
|
176
|
+
PA: { name: "Panama", name_en: "Panama", flag: "🇵🇦" },
|
|
177
|
+
PE: { name: "Pérou", name_en: "Peru", flag: "🇵🇪" },
|
|
178
|
+
PF: { name: "Polynésie française", name_en: "French Polynesia", flag: "🇵🇫" },
|
|
179
|
+
PG: { name: "Papouasie-Nouvelle-Guinée", name_en: "Papua New Guinea", flag: "🇵🇬" },
|
|
180
|
+
PH: { name: "Philippines", name_en: "Philippines", flag: "🇵🇭" },
|
|
181
|
+
PK: { name: "Pakistan", name_en: "Pakistan", flag: "🇵🇰" },
|
|
182
|
+
PL: { name: "Pologne", name_en: "Poland", flag: "🇵🇱" },
|
|
183
|
+
PM: { name: "Saint-Pierre-et-Miquelon", name_en: "Saint Pierre and Miquelon", flag: "🇵🇲" },
|
|
184
|
+
PN: { name: "Pitcairn", name_en: "Pitcairn", flag: "🇵🇳" },
|
|
185
|
+
PR: { name: "Porto Rico", name_en: "Puerto Rico", flag: "🇵🇷" },
|
|
186
|
+
PS: { name: "Palestine", name_en: "Palestine", flag: "🇵🇸" },
|
|
187
|
+
PT: { name: "Portugal", name_en: "Portugal", flag: "🇵🇹" },
|
|
188
|
+
PW: { name: "Palaos", name_en: "Palau", flag: "🇵🇼" },
|
|
189
|
+
PY: { name: "Paraguay", name_en: "Paraguay", flag: "🇵🇾" },
|
|
190
|
+
QA: { name: "Qatar", name_en: "Qatar", flag: "🇶🇦" },
|
|
191
|
+
RE: { name: "La Réunion", name_en: "Réunion", flag: "🇷🇪" },
|
|
192
|
+
RO: { name: "Roumanie", name_en: "Romania", flag: "🇷🇴" },
|
|
193
|
+
RS: { name: "Serbie", name_en: "Serbia", flag: "🇷🇸" },
|
|
194
|
+
RU: { name: "Russie", name_en: "Russia", flag: "🇷🇺" },
|
|
195
|
+
RW: { name: "Rwanda", name_en: "Rwanda", flag: "🇷🇼" },
|
|
196
|
+
SA: { name: "Arabie Saoudite", name_en: "Saudi Arabia", flag: "🇸🇦" },
|
|
197
|
+
SB: { name: "Îles Salomon", name_en: "Solomon Islands", flag: "🇸🇧" },
|
|
198
|
+
SC: { name: "Seychelles", name_en: "Seychelles", flag: "🇸🇨" },
|
|
199
|
+
SD: { name: "Soudan", name_en: "Sudan", flag: "🇸🇩" },
|
|
200
|
+
SE: { name: "Suède", name_en: "Sweden", flag: "🇸🇪" },
|
|
201
|
+
SG: { name: "Singapour", name_en: "Singapore", flag: "🇸🇬" },
|
|
202
|
+
SH: { name: "Sainte-Hélène", name_en: "Saint Helena", flag: "🇸🇭" },
|
|
203
|
+
SI: { name: "Slovénie", name_en: "Slovenia", flag: "🇸🇮" },
|
|
204
|
+
SJ: { name: "Svalbard et Jan Mayen", name_en: "Svalbard and Jan Mayen", flag: "🇸🇯" },
|
|
205
|
+
SK: { name: "Slovaquie", name_en: "Slovakia", flag: "🇸🇰" },
|
|
206
|
+
SL: { name: "Sierra Leone", name_en: "Sierra Leone", flag: "🇸🇱" },
|
|
207
|
+
SM: { name: "Saint-Marin", name_en: "San Marino", flag: "🇸🇲" },
|
|
208
|
+
SN: { name: "Sénégal", name_en: "Senegal", flag: "🇸🇳" },
|
|
209
|
+
SO: { name: "Somalie", name_en: "Somalia", flag: "🇸🇴" },
|
|
210
|
+
SR: { name: "Suriname", name_en: "Suriname", flag: "🇸🇷" },
|
|
211
|
+
SS: { name: "Soudan du Sud", name_en: "South Sudan", flag: "🇸🇸" },
|
|
212
|
+
ST: { name: "Sao Tomé-et-Principe", name_en: "Sao Tome and Principe", flag: "🇸🇹" },
|
|
213
|
+
SV: { name: "Salvador", name_en: "El Salvador", flag: "🇸🇻" },
|
|
214
|
+
SX: { name: "Saint-Martin (partie néerlandaise)", name_en: "Sint Maarten", flag: "🇸🇽" },
|
|
215
|
+
SY: { name: "Syrie", name_en: "Syria", flag: "🇸🇾" },
|
|
216
|
+
SZ: { name: "Eswatini", name_en: "Eswatini", flag: "🇸🇿" },
|
|
217
|
+
TC: { name: "Îles Turques-et-Caïques", name_en: "Turks and Caicos Islands", flag: "🇹🇨" },
|
|
218
|
+
TD: { name: "Tchad", name_en: "Chad", flag: "🇹🇩" },
|
|
219
|
+
TF: { name: "Terres australes françaises", name_en: "French Southern Territories", flag: "🇹🇫" },
|
|
220
|
+
TG: { name: "Togo", name_en: "Togo", flag: "🇹🇬" },
|
|
221
|
+
TH: { name: "Thaïlande", name_en: "Thailand", flag: "🇹🇭" },
|
|
222
|
+
TJ: { name: "Tadjikistan", name_en: "Tajikistan", flag: "🇹🇯" },
|
|
223
|
+
TK: { name: "Tokelau", name_en: "Tokelau", flag: "🇹🇰" },
|
|
224
|
+
TL: { name: "Timor oriental", name_en: "Timor-Leste", flag: "🇹🇱" },
|
|
225
|
+
TM: { name: "Turkménistan", name_en: "Turkmenistan", flag: "🇹🇲" },
|
|
226
|
+
TN: { name: "Tunisie", name_en: "Tunisia", flag: "🇹🇳" },
|
|
227
|
+
TO: { name: "Tonga", name_en: "Tonga", flag: "🇹🇴" },
|
|
228
|
+
TR: { name: "Turquie", name_en: "Turkey", flag: "🇹🇷" },
|
|
229
|
+
TT: { name: "Trinité-et-Tobago", name_en: "Trinidad and Tobago", flag: "🇹🇹" },
|
|
230
|
+
TV: { name: "Tuvalu", name_en: "Tuvalu", flag: "🇹🇻" },
|
|
231
|
+
TW: { name: "Taïwan", name_en: "Taiwan", flag: "🇹🇼" },
|
|
232
|
+
TZ: { name: "Tanzanie", name_en: "Tanzania", flag: "🇹🇿" },
|
|
233
|
+
UA: { name: "Ukraine", name_en: "Ukraine", flag: "🇺🇦" },
|
|
234
|
+
UG: { name: "Ouganda", name_en: "Uganda", flag: "🇺🇬" },
|
|
235
|
+
UM: { name: "Îles mineures éloignées des États-Unis", name_en: "United States Minor Outlying Islands", flag: "🇺🇲" },
|
|
236
|
+
US: { name: "États-Unis", name_en: "United States of America", flag: "🇺🇸", hasRegions: true },
|
|
237
|
+
UY: { name: "Uruguay", name_en: "Uruguay", flag: "🇺🇾" },
|
|
238
|
+
UZ: { name: "Ouzbékistan", name_en: "Uzbekistan", flag: "🇺🇿" },
|
|
239
|
+
VA: { name: "Vatican", name_en: "Vatican City", flag: "🇻🇦" },
|
|
240
|
+
VC: { name: "Saint-Vincent-et-les-Grenadines", name_en: "Saint Vincent and the Grenadines", flag: "🇻🇨" },
|
|
241
|
+
VE: { name: "Venezuela", name_en: "Venezuela", flag: "🇻🇪" },
|
|
242
|
+
VG: { name: "Îles Vierges britanniques", name_en: "British Virgin Islands", flag: "🇻🇬" },
|
|
243
|
+
VI: { name: "Îles Vierges des États-Unis", name_en: "United States Virgin Islands", flag: "🇻🇮" },
|
|
244
|
+
VN: { name: "Vietnam", name_en: "Vietnam", flag: "🇻🇳" },
|
|
245
|
+
VU: { name: "Vanuatu", name_en: "Vanuatu", flag: "🇻🇺" },
|
|
246
|
+
WF: { name: "Wallis-et-Futuna", name_en: "Wallis and Futuna", flag: "🇼🇫" },
|
|
247
|
+
WS: { name: "Samoa", name_en: "Samoa", flag: "🇼🇸" },
|
|
248
|
+
YE: { name: "Yémen", name_en: "Yemen", flag: "🇾🇪" },
|
|
249
|
+
YT: { name: "Mayotte", name_en: "Mayotte", flag: "🇾🇹" },
|
|
250
|
+
ZA: { name: "Afrique du Sud", name_en: "South Africa", flag: "🇿🇦" },
|
|
251
|
+
ZM: { name: "Zambie", name_en: "Zambia", flag: "🇿🇲" },
|
|
252
|
+
ZW: { name: "Zimbabwe", name_en: "Zimbabwe", flag: "🇿🇼" }
|
|
253
|
+
};
|