@sanctum-key/react-native-sdk 1.0.24 → 1.0.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/package.json +5 -2
- package/build/src/components/EnhancedCameraView.d.ts +7 -1
- package/build/src/components/EnhancedCameraView.d.ts.map +1 -1
- package/build/src/components/EnhancedCameraView.js +88 -30
- package/build/src/components/EnhancedCameraView.js.map +1 -1
- package/build/src/components/EnhancedCameraView.web.d.ts +5 -1
- package/build/src/components/EnhancedCameraView.web.d.ts.map +1 -1
- package/build/src/components/EnhancedCameraView.web.js +80 -295
- package/build/src/components/EnhancedCameraView.web.js.map +1 -1
- package/build/src/components/KYCElements/CameraCapture.js +1 -1
- package/build/src/components/KYCElements/CameraCapture.js.map +1 -1
- package/build/src/components/KYCElements/CountrySelection.d.ts.map +1 -1
- package/build/src/components/KYCElements/CountrySelection.js +38 -218
- package/build/src/components/KYCElements/CountrySelection.js.map +1 -1
- package/build/src/components/KYCElements/CountrySelectionTemplate.d.ts.map +1 -1
- package/build/src/components/KYCElements/CountrySelectionTemplate.js +5 -17
- package/build/src/components/KYCElements/CountrySelectionTemplate.js.map +1 -1
- package/build/src/components/KYCElements/IDCardCapture.d.ts.map +1 -1
- package/build/src/components/KYCElements/IDCardCapture.js +509 -95
- package/build/src/components/KYCElements/IDCardCapture.js.map +1 -1
- package/build/src/components/KYCElements/VerificationProgressTemplate.d.ts.map +1 -1
- package/build/src/components/KYCElements/VerificationProgressTemplate.js +93 -51
- package/build/src/components/KYCElements/VerificationProgressTemplate.js.map +1 -1
- package/build/src/components/OverLay/type.d.ts +1 -0
- package/build/src/components/OverLay/type.d.ts.map +1 -1
- package/build/src/components/OverLay/type.js.map +1 -1
- package/build/src/components/WebBarcodeScanner.d.ts +9 -0
- package/build/src/components/WebBarcodeScanner.d.ts.map +1 -0
- package/build/src/components/WebBarcodeScanner.js +152 -0
- package/build/src/components/WebBarcodeScanner.js.map +1 -0
- package/build/src/config/KYCConfigs.js +2 -2
- package/build/src/config/KYCConfigs.js.map +1 -1
- package/build/src/config/region_mapping.json +0 -14
- package/build/src/modules/api/CardAuthentification.d.ts +2 -0
- package/build/src/modules/api/CardAuthentification.d.ts.map +1 -1
- package/build/src/modules/api/CardAuthentification.js +22 -39
- package/build/src/modules/api/CardAuthentification.js.map +1 -1
- package/build/src/modules/api/KYCService.d.ts +7 -2
- package/build/src/modules/api/KYCService.d.ts.map +1 -1
- package/build/src/modules/api/KYCService.js +163 -57
- package/build/src/modules/api/KYCService.js.map +1 -1
- package/build/src/types/KYC.types.d.ts +1 -0
- package/build/src/types/KYC.types.d.ts.map +1 -1
- package/build/src/types/KYC.types.js.map +1 -1
- package/build/src/utils/aamvaParser.d.ts +62 -0
- package/build/src/utils/aamvaParser.d.ts.map +1 -0
- package/build/src/utils/aamvaParser.js +91 -0
- package/build/src/utils/aamvaParser.js.map +1 -0
- package/build/src/utils/cropByObb.d.ts.map +1 -1
- package/build/src/utils/cropByObb.js +4 -3
- package/build/src/utils/cropByObb.js.map +1 -1
- package/build/src/web/WebKYCEntry.d.ts +1 -1
- package/build/src/web/WebKYCEntry.d.ts.map +1 -1
- package/build/src/web/WebKYCEntry.js +105 -239
- package/build/src/web/WebKYCEntry.js.map +1 -1
- package/package.json +5 -2
- package/src/components/EnhancedCameraView.tsx +116 -42
- package/src/components/EnhancedCameraView.web.tsx +98 -338
- package/src/components/KYCElements/CameraCapture.tsx +1 -1
- package/src/components/KYCElements/CountrySelection.tsx +60 -240
- package/src/components/KYCElements/CountrySelectionTemplate.tsx +7 -20
- package/src/components/KYCElements/IDCardCapture.tsx +672 -151
- package/src/components/KYCElements/VerificationProgressTemplate.tsx +112 -65
- package/src/components/OverLay/type.ts +1 -1
- package/src/components/WebBarcodeScanner.tsx +273 -0
- package/src/config/KYCConfigs.ts +2 -2
- package/src/config/region_mapping.json +0 -14
- package/src/modules/api/CardAuthentification.ts +41 -56
- package/src/modules/api/KYCService.ts +236 -82
- package/src/types/KYC.types.ts +1 -0
- package/src/utils/aamvaParser.ts +102 -0
- package/src/utils/cropByObb.ts +5 -3
- package/src/web/WebKYCEntry.tsx +125 -301
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import React, { useEffect, useState, useCallback } from 'react';
|
|
2
2
|
import { View, Text, StyleSheet, SafeAreaView, ActivityIndicator } from 'react-native';
|
|
3
|
-
// import { TemplateKYCFlow } from '../components/TemplateKYCFlowRefactored';
|
|
4
|
-
// import { KYCTemplate } from '../types/KYC.types';
|
|
5
3
|
import { useI18n } from '../hooks/useI18n';
|
|
6
4
|
import { TemplateKYCExample } from '../components/TemplateKYCExample';
|
|
7
5
|
import { isCallbackUrlAllowed } from '../config/allowedDomains';
|
|
@@ -12,100 +10,69 @@ const postWebhook = async (url, payload, timeoutMs = 5000) => {
|
|
|
12
10
|
const controller = new AbortController();
|
|
13
11
|
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
14
12
|
try {
|
|
15
|
-
return await fetch(url, {
|
|
16
|
-
method: 'POST',
|
|
17
|
-
...init,
|
|
18
|
-
signal: controller.signal,
|
|
19
|
-
});
|
|
13
|
+
return await fetch(url, { method: 'POST', ...init, signal: controller.signal });
|
|
20
14
|
}
|
|
21
15
|
finally {
|
|
22
16
|
clearTimeout(timeoutId);
|
|
23
17
|
}
|
|
24
18
|
};
|
|
25
|
-
// In browser, first try a regular JSON POST so servers validating Content-Type
|
|
26
|
-
// behave the same as Postman/cURL.
|
|
27
19
|
if (typeof window !== 'undefined') {
|
|
28
20
|
try {
|
|
29
|
-
const response = await postWithTimeout({
|
|
30
|
-
|
|
31
|
-
'Content-Type': 'application/json',
|
|
32
|
-
},
|
|
33
|
-
body,
|
|
34
|
-
keepalive: true,
|
|
35
|
-
});
|
|
36
|
-
if (!response.ok) {
|
|
21
|
+
const response = await postWithTimeout({ headers: { 'Content-Type': 'application/json' }, body, keepalive: true });
|
|
22
|
+
if (!response.ok)
|
|
37
23
|
throw new Error(`Webhook failed with status ${response.status}`);
|
|
38
|
-
}
|
|
39
24
|
return;
|
|
40
25
|
}
|
|
41
26
|
catch (error) {
|
|
42
|
-
|
|
43
|
-
// fallback to no-cors + text/plain for best-effort delivery.
|
|
44
|
-
if (error instanceof Error && error.name === 'AbortError') {
|
|
27
|
+
if (error instanceof Error && error.name === 'AbortError')
|
|
45
28
|
throw error;
|
|
46
|
-
}
|
|
47
|
-
await postWithTimeout({
|
|
48
|
-
mode: 'no-cors',
|
|
49
|
-
headers: {
|
|
50
|
-
'Content-Type': 'text/plain;charset=UTF-8',
|
|
51
|
-
},
|
|
52
|
-
body,
|
|
53
|
-
keepalive: true,
|
|
54
|
-
});
|
|
29
|
+
await postWithTimeout({ mode: 'no-cors', headers: { 'Content-Type': 'text/plain;charset=UTF-8' }, body, keepalive: true });
|
|
55
30
|
return;
|
|
56
31
|
}
|
|
57
32
|
}
|
|
58
|
-
const response = await postWithTimeout({
|
|
59
|
-
|
|
60
|
-
'Content-Type': 'application/json',
|
|
61
|
-
},
|
|
62
|
-
body,
|
|
63
|
-
});
|
|
64
|
-
if (!response.ok) {
|
|
33
|
+
const response = await postWithTimeout({ headers: { 'Content-Type': 'application/json' }, body });
|
|
34
|
+
if (!response.ok)
|
|
65
35
|
throw new Error(`Webhook failed with status ${response.status}`);
|
|
66
|
-
}
|
|
67
36
|
};
|
|
68
|
-
export function WebKYCEntry({ onComplete, onError, onCancel, onSessionSave
|
|
69
|
-
console.log('first');
|
|
37
|
+
export function WebKYCEntry({ onComplete, onError, onCancel, onSessionSave }) {
|
|
70
38
|
const { setLocale } = useI18n();
|
|
71
39
|
const [urlParams, setUrlParams] = useState({});
|
|
72
40
|
const [isLoading, setIsLoading] = useState(true);
|
|
73
41
|
const [error, setError] = useState(null);
|
|
74
42
|
const [isAnalyzing, setIsAnalyzing] = useState(false);
|
|
75
|
-
// Parse URL parameters
|
|
76
43
|
const parseUrlParams = useCallback(() => {
|
|
77
44
|
if (typeof window === 'undefined')
|
|
78
45
|
return {};
|
|
79
|
-
const
|
|
80
|
-
|
|
46
|
+
const rawUrl = window.location.href;
|
|
47
|
+
console.log("Raw URL intercepted:", rawUrl);
|
|
48
|
+
const paramsString = rawUrl.replace(/^[^?#]*[?#]/, '').replace(/[?#]/g, '&');
|
|
49
|
+
const urlParams = new URLSearchParams(paramsString);
|
|
50
|
+
const getParam = (key) => urlParams.get(key) || undefined;
|
|
51
|
+
const envParam = getParam('env');
|
|
81
52
|
const validEnv = envParam === 'SANDBOX' || envParam === 'PRODUCTION' ? envParam : 'PRODUCTION';
|
|
82
|
-
const serverEnvParam =
|
|
83
|
-
const validServerEnv = serverEnvParam === 'TEST' || serverEnvParam === 'PRODUCTION'
|
|
84
|
-
? serverEnvParam
|
|
85
|
-
: 'PRODUCTION';
|
|
53
|
+
const serverEnvParam = getParam('server_env');
|
|
54
|
+
const validServerEnv = serverEnvParam === 'TEST' || serverEnvParam === 'PRODUCTION' ? serverEnvParam : 'PRODUCTION';
|
|
86
55
|
return {
|
|
87
|
-
token:
|
|
88
|
-
return_url:
|
|
89
|
-
push_url:
|
|
90
|
-
save_session_url:
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
kyc_id: urlParams.get('kyc_id') || undefined,
|
|
97
|
-
secret: urlParams.get('secret') || undefined,
|
|
56
|
+
token: getParam('token'),
|
|
57
|
+
return_url: getParam('return_url'),
|
|
58
|
+
push_url: getParam('push_url'),
|
|
59
|
+
save_session_url: getParam('save_session_url') || getParam('saveSessionUrl'),
|
|
60
|
+
reference_id: getParam('reference_id'),
|
|
61
|
+
lang: getParam('lang') || 'en',
|
|
62
|
+
theme: getParam('theme') || 'light',
|
|
63
|
+
kyc_id: getParam('kyc_id') || getParam('session_id'),
|
|
64
|
+
secret: getParam('secret'),
|
|
98
65
|
env: validEnv,
|
|
99
|
-
template_id:
|
|
66
|
+
template_id: getParam('template_id'),
|
|
100
67
|
server_env: validServerEnv,
|
|
101
|
-
step:
|
|
102
|
-
component_index:
|
|
103
|
-
country:
|
|
104
|
-
document_type:
|
|
105
|
-
region:
|
|
68
|
+
step: getParam('step'),
|
|
69
|
+
component_index: getParam('component_index'),
|
|
70
|
+
country: getParam('country'),
|
|
71
|
+
document_type: getParam('document_type'),
|
|
72
|
+
region: getParam('region'),
|
|
73
|
+
resume: getParam('resume') === 'true',
|
|
106
74
|
};
|
|
107
75
|
}, []);
|
|
108
|
-
// Safe redirect function with enhanced validation
|
|
109
76
|
const redirectToReturnUrl = useCallback(async (params) => {
|
|
110
77
|
const { return_url } = urlParams;
|
|
111
78
|
if (!return_url) {
|
|
@@ -113,30 +80,15 @@ export function WebKYCEntry({ onComplete, onError, onCancel, onSessionSave, }) {
|
|
|
113
80
|
return;
|
|
114
81
|
}
|
|
115
82
|
try {
|
|
116
|
-
// Enhanced URL validation with domain whitelist
|
|
117
83
|
const validation = isCallbackUrlAllowed(return_url);
|
|
118
84
|
if (!validation.allowed) {
|
|
119
85
|
console.error('Callback URL validation failed:', validation.reason);
|
|
120
86
|
setError(`Security Error: ${validation.reason}`);
|
|
121
|
-
// Log suspicious redirect attempt
|
|
122
|
-
console.warn('Suspicious redirect attempt blocked:', {
|
|
123
|
-
url: return_url,
|
|
124
|
-
reason: validation.reason,
|
|
125
|
-
timestamp: new Date().toISOString(),
|
|
126
|
-
});
|
|
127
87
|
return;
|
|
128
88
|
}
|
|
129
|
-
// Send postMessage to parent if in iframe
|
|
130
89
|
if (window.parent !== window) {
|
|
131
90
|
const targetOrigin = new URL(return_url).origin;
|
|
132
|
-
window.parent.postMessage({
|
|
133
|
-
type: 'kyc_result',
|
|
134
|
-
status: params.status,
|
|
135
|
-
kyc_id: params.kyc_id,
|
|
136
|
-
message: params.message,
|
|
137
|
-
processing_state: params.processing_state,
|
|
138
|
-
verification_steps: params.verification_steps,
|
|
139
|
-
}, targetOrigin);
|
|
91
|
+
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);
|
|
140
92
|
}
|
|
141
93
|
else {
|
|
142
94
|
window.location.href = return_url;
|
|
@@ -148,166 +100,126 @@ export function WebKYCEntry({ onComplete, onError, onCancel, onSessionSave, }) {
|
|
|
148
100
|
}
|
|
149
101
|
}, [urlParams]);
|
|
150
102
|
const handleComplete = useCallback(async (data) => {
|
|
151
|
-
console.log('KYC completed:', data);
|
|
152
|
-
|
|
153
|
-
const isStillProcessing = data.isProcessing || data.session?.isProcessing;
|
|
154
|
-
// Handle Push URL webhook if provided
|
|
103
|
+
console.log('KYC completed, raw state:', data);
|
|
104
|
+
const isStillProcessing = data?.isProcessing || data?.session?.isProcessing;
|
|
155
105
|
if (urlParams.push_url) {
|
|
156
106
|
try {
|
|
157
|
-
|
|
158
|
-
const
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
107
|
+
// 1. Locate the actual backend payload from the Context state
|
|
108
|
+
const backendResult = data?.verification?.result || data?.result?.result || data?.result || data;
|
|
109
|
+
// 2. Safely extract session ID
|
|
110
|
+
const finalSessionId = data?.session?.session_id ||
|
|
111
|
+
backendResult?.session_id ||
|
|
112
|
+
backendResult?.data?.session_id ||
|
|
113
|
+
urlParams.kyc_id ||
|
|
114
|
+
'unknown';
|
|
115
|
+
// 3. Extract the core data payload
|
|
116
|
+
let parsedKycData = {};
|
|
117
|
+
if (backendResult?.data) {
|
|
118
|
+
try {
|
|
119
|
+
parsedKycData = typeof backendResult.data === 'string'
|
|
120
|
+
? JSON.parse(backendResult.data)
|
|
121
|
+
: backendResult.data;
|
|
122
|
+
}
|
|
123
|
+
catch (e) {
|
|
124
|
+
console.warn("Could not parse backendResult.data JSON");
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (parsedKycData && typeof parsedKycData === 'object' && parsedKycData[finalSessionId]) {
|
|
128
|
+
const nested = parsedKycData[finalSessionId];
|
|
129
|
+
if (nested?.data) {
|
|
130
|
+
parsedKycData = typeof nested.data === 'string' ? JSON.parse(nested.data) : nested.data;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
parsedKycData = nested;
|
|
181
134
|
}
|
|
182
135
|
}
|
|
183
|
-
const finalSessionId = kycSessionId || parsedKycData?.session_id || urlParams.kyc_id || 'unknown';
|
|
184
|
-
// 3. Build your exact un-nested payload signature
|
|
185
136
|
const verificationState = {
|
|
186
137
|
session_id: finalSessionId,
|
|
187
|
-
|
|
188
|
-
|
|
138
|
+
reference_id: urlParams.reference_id || backendResult?.referenceId || null,
|
|
139
|
+
status: backendResult?.status || data?.verification?.status || 'completed',
|
|
140
|
+
message: backendResult?.message || backendResult?.reason || backendResult?.issues?.[0] || 'Verification finished.',
|
|
189
141
|
data: parsedKycData || {}
|
|
190
142
|
};
|
|
191
|
-
|
|
192
|
-
|
|
143
|
+
const hasValidSessionId = finalSessionId && finalSessionId !== 'unknown';
|
|
144
|
+
const hasValidData = parsedKycData && Object.keys(parsedKycData).length > 0;
|
|
145
|
+
if (!hasValidSessionId || !hasValidData) {
|
|
146
|
+
console.log("Webhook Blocked: Payload contains no data or session_id is unknown.", JSON.stringify(verificationState));
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
console.log("Pushing Webhook Payload:", JSON.stringify(verificationState, null, 2));
|
|
150
|
+
await postWebhook(urlParams.push_url, verificationState, 5000);
|
|
151
|
+
}
|
|
193
152
|
}
|
|
194
153
|
catch (err) {
|
|
195
|
-
console.warn('Failed to push data to webhook URL:', err);
|
|
154
|
+
console.warn('Failed to construct or push data to webhook URL:', err);
|
|
196
155
|
}
|
|
197
156
|
}
|
|
157
|
+
setIsAnalyzing(false);
|
|
158
|
+
// Always redirect the user back to your main app/website, regardless of webhook success/block
|
|
198
159
|
redirectToReturnUrl({
|
|
199
|
-
status: 'completed',
|
|
200
|
-
kyc_id: data
|
|
201
|
-
message: 'KYC process
|
|
160
|
+
status: data?.verification?.status === 'failed' ? 'error' : 'completed',
|
|
161
|
+
kyc_id: data?.session?.session_id || urlParams.kyc_id,
|
|
162
|
+
message: 'KYC process concluded',
|
|
202
163
|
processing_state: isStillProcessing ? 'analyzing' : 'completed',
|
|
203
164
|
verification_steps: {
|
|
204
|
-
document_analyzed:
|
|
205
|
-
selfie_analyzed:
|
|
206
|
-
liveness_checked:
|
|
165
|
+
document_analyzed: true,
|
|
166
|
+
selfie_analyzed: true,
|
|
167
|
+
liveness_checked: true
|
|
207
168
|
},
|
|
208
169
|
});
|
|
209
170
|
onComplete?.(data);
|
|
210
171
|
}, [redirectToReturnUrl, urlParams, onComplete]);
|
|
211
|
-
// Handle KYC error
|
|
212
172
|
const handleError = useCallback((error) => {
|
|
213
173
|
console.error('KYC error:', error);
|
|
214
174
|
setIsAnalyzing(false);
|
|
215
|
-
redirectToReturnUrl({
|
|
216
|
-
status: 'error',
|
|
217
|
-
kyc_id: urlParams.kyc_id,
|
|
218
|
-
message: error,
|
|
219
|
-
processing_state: 'pending',
|
|
220
|
-
});
|
|
175
|
+
redirectToReturnUrl({ status: 'error', kyc_id: urlParams.kyc_id, message: error, processing_state: 'pending' });
|
|
221
176
|
onError?.(error);
|
|
222
177
|
}, [redirectToReturnUrl, urlParams.kyc_id, onError]);
|
|
223
|
-
// Handle KYC cancellation
|
|
224
178
|
const handleCancel = useCallback(async () => {
|
|
225
|
-
console.log('KYC cancelled', urlParams.push_url, urlParams);
|
|
226
179
|
setIsAnalyzing(false);
|
|
227
180
|
if (urlParams.push_url) {
|
|
228
181
|
try {
|
|
229
|
-
|
|
230
|
-
status: 'cancelled', // verification cancelled
|
|
231
|
-
result: null, // pass null as result
|
|
232
|
-
reference_id: urlParams.reference_id,
|
|
233
|
-
};
|
|
234
|
-
await postWebhook(urlParams.push_url, verificationState, 5000);
|
|
235
|
-
console.log('Successfully pushed KYC cancellation data to webhook');
|
|
182
|
+
await postWebhook(urlParams.push_url, { status: 'cancelled', result: null, reference_id: urlParams.reference_id }, 5000);
|
|
236
183
|
}
|
|
237
184
|
catch (err) {
|
|
238
|
-
// Fail open - redirect anyway even if webhook fails
|
|
239
185
|
console.warn('Failed to push data to webhook URL:', err);
|
|
240
186
|
}
|
|
241
187
|
}
|
|
242
|
-
redirectToReturnUrl({
|
|
243
|
-
status: 'cancelled',
|
|
244
|
-
kyc_id: urlParams.kyc_id,
|
|
245
|
-
message: 'KYC process was cancelled',
|
|
246
|
-
processing_state: 'pending',
|
|
247
|
-
});
|
|
188
|
+
redirectToReturnUrl({ status: 'cancelled', kyc_id: urlParams.kyc_id, message: 'KYC process was cancelled', processing_state: 'pending' });
|
|
248
189
|
onCancel?.();
|
|
249
190
|
}, [redirectToReturnUrl, urlParams.kyc_id, urlParams.push_url, urlParams.reference_id, onCancel]);
|
|
250
191
|
const handleSessionSave = useCallback(async (sessionId) => {
|
|
251
|
-
console.log('KYC session created:', sessionId);
|
|
252
192
|
if (urlParams.save_session_url) {
|
|
253
193
|
try {
|
|
254
|
-
|
|
255
|
-
status: 'session_created',
|
|
256
|
-
reference_id: urlParams.reference_id,
|
|
257
|
-
result: {
|
|
258
|
-
session_id: sessionId,
|
|
259
|
-
kyc_id: sessionId,
|
|
260
|
-
},
|
|
261
|
-
};
|
|
262
|
-
await postWebhook(urlParams.save_session_url, payload, 5000);
|
|
263
|
-
console.log('Successfully pushed session data to save_session_url');
|
|
194
|
+
await postWebhook(urlParams.save_session_url, { status: 'session_created', reference_id: urlParams.reference_id, result: { session_id: sessionId, kyc_id: sessionId } }, 5000);
|
|
264
195
|
}
|
|
265
196
|
catch (err) {
|
|
266
|
-
|
|
267
|
-
console.warn('Failed to push session data to save_session_url:', err);
|
|
197
|
+
console.warn('Failed to push session data:', err);
|
|
268
198
|
}
|
|
269
199
|
}
|
|
270
|
-
else {
|
|
271
|
-
console.warn('save_session_url is missing in URL params, webhook not called');
|
|
272
|
-
}
|
|
273
200
|
onSessionSave?.(sessionId);
|
|
274
201
|
}, [urlParams.save_session_url, urlParams.reference_id, onSessionSave]);
|
|
275
|
-
// Initialize component
|
|
276
202
|
useEffect(() => {
|
|
277
203
|
try {
|
|
278
204
|
const params = parseUrlParams();
|
|
279
205
|
setUrlParams(params);
|
|
280
|
-
|
|
281
|
-
if (params.lang) {
|
|
206
|
+
if (params.lang)
|
|
282
207
|
setLocale(params.lang);
|
|
283
|
-
|
|
284
|
-
// Configure backend environment
|
|
285
|
-
if (params.server_env) {
|
|
208
|
+
if (params.server_env)
|
|
286
209
|
KYCConfig.setBackendEnvironment(params.server_env);
|
|
287
|
-
}
|
|
288
210
|
setIsLoading(false);
|
|
289
211
|
}
|
|
290
212
|
catch (error) {
|
|
291
|
-
console.error('Error parsing URL parameters:', error);
|
|
292
213
|
setError('Error parsing URL parameters');
|
|
293
214
|
setIsLoading(false);
|
|
294
215
|
}
|
|
295
216
|
}, [parseUrlParams, setLocale]);
|
|
296
|
-
if (isLoading)
|
|
297
|
-
return
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
return (<View style={styles.container}>
|
|
303
|
-
<Text style={styles.errorText}>Error: {error}</Text>
|
|
304
|
-
</View>);
|
|
305
|
-
}
|
|
306
|
-
if (!urlParams.token) {
|
|
307
|
-
return (<View style={styles.container}>
|
|
308
|
-
<Text style={styles.errorText}>No token provided in URL parameters</Text>
|
|
309
|
-
</View>);
|
|
310
|
-
}
|
|
217
|
+
if (isLoading)
|
|
218
|
+
return <View style={styles.container}><Text style={styles.loadingText}>Loading KYC process...</Text></View>;
|
|
219
|
+
if (error)
|
|
220
|
+
return <View style={styles.container}><Text style={styles.errorText}>Error: {error}</Text></View>;
|
|
221
|
+
if (!urlParams.token)
|
|
222
|
+
return <View style={styles.container}><Text style={styles.errorText}>No token provided in URL parameters</Text></View>;
|
|
311
223
|
return (<SafeAreaView style={styles.container}>
|
|
312
224
|
{isAnalyzing && (<View style={styles.analyzingOverlay}>
|
|
313
225
|
<View style={styles.analyzingContainer}>
|
|
@@ -316,7 +228,8 @@ export function WebKYCEntry({ onComplete, onError, onCancel, onSessionSave, }) {
|
|
|
316
228
|
<Text style={styles.analyzingSubtext}>This may take a few moments</Text>
|
|
317
229
|
</View>
|
|
318
230
|
</View>)}
|
|
319
|
-
<TemplateKYCExample onComplete={handleComplete} onCancel={handleCancel} onError={handleError} language={urlParams.lang || 'en'} API_KEY={urlParams.token} templateId={urlParams.template_id} env={urlParams.env || 'PRODUCTION'} serverEnv={urlParams.server_env} existingSessionId={urlParams.kyc_id}
|
|
231
|
+
<TemplateKYCExample onComplete={handleComplete} onCancel={handleCancel} onError={handleError} language={urlParams.lang || 'en'} API_KEY={urlParams.token} templateId={urlParams.template_id} env={urlParams.env || 'PRODUCTION'} serverEnv={urlParams.server_env} existingSessionId={urlParams.kyc_id} // Successfully passes session_id down
|
|
232
|
+
initialComponentIndex={(() => {
|
|
320
233
|
const raw = urlParams.component_index ?? urlParams.step;
|
|
321
234
|
if (raw == null || raw === '')
|
|
322
235
|
return undefined;
|
|
@@ -325,61 +238,14 @@ export function WebKYCEntry({ onComplete, onError, onCancel, onSessionSave, }) {
|
|
|
325
238
|
})()} initialCountryResume={urlParams.country && urlParams.document_type ? { code: urlParams.country, documentType: urlParams.document_type, region: urlParams.region || undefined } : undefined} referenceId={urlParams.reference_id} onSessionSave={handleSessionSave}/>
|
|
326
239
|
</SafeAreaView>);
|
|
327
240
|
}
|
|
328
|
-
;
|
|
329
241
|
const styles = StyleSheet.create({
|
|
330
|
-
container: {
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
},
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
textAlign: 'center',
|
|
338
|
-
marginTop: 50,
|
|
339
|
-
color: '#666',
|
|
340
|
-
},
|
|
341
|
-
errorText: {
|
|
342
|
-
fontSize: 16,
|
|
343
|
-
textAlign: 'center',
|
|
344
|
-
marginTop: 50,
|
|
345
|
-
color: '#dc2626',
|
|
346
|
-
paddingHorizontal: 20,
|
|
347
|
-
},
|
|
348
|
-
analyzingOverlay: {
|
|
349
|
-
position: 'absolute',
|
|
350
|
-
top: 0,
|
|
351
|
-
left: 0,
|
|
352
|
-
right: 0,
|
|
353
|
-
bottom: 0,
|
|
354
|
-
backgroundColor: 'rgba(0, 0, 0, 0.7)',
|
|
355
|
-
justifyContent: 'center',
|
|
356
|
-
alignItems: 'center',
|
|
357
|
-
zIndex: 9999,
|
|
358
|
-
},
|
|
359
|
-
analyzingContainer: {
|
|
360
|
-
backgroundColor: 'white',
|
|
361
|
-
borderRadius: 12,
|
|
362
|
-
padding: 32,
|
|
363
|
-
alignItems: 'center',
|
|
364
|
-
shadowColor: '#000',
|
|
365
|
-
shadowOffset: { width: 0, height: 4 },
|
|
366
|
-
shadowOpacity: 0.3,
|
|
367
|
-
shadowRadius: 8,
|
|
368
|
-
elevation: 8,
|
|
369
|
-
},
|
|
370
|
-
analyzingText: {
|
|
371
|
-
fontSize: 18,
|
|
372
|
-
fontWeight: '600',
|
|
373
|
-
color: '#333',
|
|
374
|
-
marginTop: 16,
|
|
375
|
-
textAlign: 'center',
|
|
376
|
-
},
|
|
377
|
-
analyzingSubtext: {
|
|
378
|
-
fontSize: 14,
|
|
379
|
-
color: '#666',
|
|
380
|
-
marginTop: 8,
|
|
381
|
-
textAlign: 'center',
|
|
382
|
-
},
|
|
242
|
+
container: { flex: 1, backgroundColor: '#f5f5f5', overflow: 'visible' },
|
|
243
|
+
loadingText: { fontSize: 18, textAlign: 'center', marginTop: 50, color: '#666' },
|
|
244
|
+
errorText: { fontSize: 16, textAlign: 'center', marginTop: 50, color: '#dc2626', paddingHorizontal: 20 },
|
|
245
|
+
analyzingOverlay: { position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, backgroundColor: 'rgba(0, 0, 0, 0.7)', justifyContent: 'center', alignItems: 'center', zIndex: 9999 },
|
|
246
|
+
analyzingContainer: { backgroundColor: 'white', borderRadius: 12, padding: 32, alignItems: 'center', shadowColor: '#000', shadowOffset: { width: 0, height: 4 }, shadowOpacity: 0.3, shadowRadius: 8, elevation: 8 },
|
|
247
|
+
analyzingText: { fontSize: 18, fontWeight: '600', color: '#333', marginTop: 16, textAlign: 'center' },
|
|
248
|
+
analyzingSubtext: { fontSize: 14, color: '#666', marginTop: 8, textAlign: 'center' },
|
|
383
249
|
});
|
|
384
250
|
export default WebKYCEntry;
|
|
385
251
|
//# sourceMappingURL=WebKYCEntry.js.map
|
|
@@ -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';\n// import { TemplateKYCFlow } from '../components/TemplateKYCFlowRefactored';\n// import { KYCTemplate } from '../types/KYC.types';\nimport { useI18n } from '../hooks/useI18n';\nimport { TemplateKYCExample } from '../components/TemplateKYCExample';\nimport { isCallbackUrlAllowed } from '../config/allowedDomains';\nimport KYCConfig from '../config/KYCConfig';\nimport { BackendEnvironment } from '../types/env.types';\n\ninterface WebKYCEntryProps {\n onComplete?: (data: any) => void;\n onError?: (error: string) => void;\n onCancel?: () => void;\n 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; // Optional secret for signature generation\n env?: 'PRODUCTION' | 'SANDBOX'; // Environment mode\n template_id?: string; // Template ID for dynamic template loading\n server_env?: BackendEnvironment; // Backend environment mode\n step?: string; // Deprecated: use component_index.\n component_index?: string; // Index in template.components (0-based) to resume at\n country?: string; // Code pays pour restaurer la sélection (reprise multi-appareil)\n document_type?: string; // Type de document (national_id, passport, etc.)\n region?: string; // Région si applicable\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\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, {\n method: 'POST',\n ...init,\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeoutId);\n }\n };\n\n // In browser, first try a regular JSON POST so servers validating Content-Type\n // behave the same as Postman/cURL.\n if (typeof window !== 'undefined') {\n try {\n const response = await postWithTimeout({\n headers: {\n 'Content-Type': 'application/json',\n },\n body,\n keepalive: true,\n });\n\n if (!response.ok) {\n throw new Error(`Webhook failed with status ${response.status}`);\n }\n return;\n } catch (error) {\n // If the request is blocked by browser CORS policy or a network error occurs,\n // fallback to no-cors + text/plain for best-effort delivery.\n if (error instanceof Error && error.name === 'AbortError') {\n throw error;\n }\n\n await postWithTimeout({\n mode: 'no-cors',\n headers: {\n 'Content-Type': 'text/plain;charset=UTF-8',\n },\n body,\n keepalive: true,\n });\n return;\n }\n }\n\n const response = await postWithTimeout({\n headers: {\n 'Content-Type': 'application/json',\n },\n body,\n });\n\n if (!response.ok) {\n throw new Error(`Webhook failed with status ${response.status}`);\n }\n};\n\nexport function WebKYCEntry({\n onComplete,\n onError,\n onCancel,\n onSessionSave,\n}: WebKYCEntryProps): JSX.Element {\n console.log('first')\n const { setLocale } = useI18n();\n const [urlParams, setUrlParams] = useState<URLParams>({});\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [isAnalyzing, setIsAnalyzing] = useState(false);\n\n // Parse URL parameters\n const parseUrlParams = useCallback((): URLParams => {\n if (typeof window === 'undefined') return {};\n\n const urlParams = new URLSearchParams(window.location.search);\n const envParam = urlParams.get('env');\n const validEnv = envParam === 'SANDBOX' || envParam === 'PRODUCTION' ? envParam : 'PRODUCTION';\n\n const serverEnvParam = urlParams.get('server_env');\n const validServerEnv: BackendEnvironment = serverEnvParam === 'TEST' || serverEnvParam === 'PRODUCTION'\n ? (serverEnvParam as BackendEnvironment)\n : 'PRODUCTION';\n\n return {\n token: urlParams.get('token') || undefined,\n return_url: urlParams.get('return_url') || undefined,\n push_url: urlParams.get('push_url') || undefined,\n save_session_url:\n urlParams.get('save_session_url') ||\n urlParams.get('saveSessionUrl') ||\n undefined,\n reference_id: urlParams.get('reference_id') || undefined,\n lang: urlParams.get('lang') || 'en',\n theme: urlParams.get('theme') || 'light',\n kyc_id: urlParams.get('kyc_id') || undefined,\n secret: urlParams.get('secret') || undefined,\n env: validEnv,\n template_id: urlParams.get('template_id') || undefined,\n server_env: validServerEnv,\n step: urlParams.get('step') || undefined,\n component_index: urlParams.get('component_index') || undefined,\n country: urlParams.get('country') || undefined,\n document_type: urlParams.get('document_type') || undefined,\n region: urlParams.get('region') || undefined,\n };\n }, []);\n\n // Safe redirect function with enhanced validation\n const redirectToReturnUrl = useCallback(async (params: {\n status: 'completed' | 'cancelled' | 'error';\n kyc_id?: string;\n message?: string;\n processing_state?: 'analyzing' | 'completed' | 'pending';\n verification_steps?: VerificationSteps;\n }) => {\n const { return_url } = urlParams;\n\n if (!return_url) {\n console.warn('No return_url provided');\n return;\n }\n\n try {\n // Enhanced URL validation with domain whitelist\n const validation = isCallbackUrlAllowed(return_url);\n if (!validation.allowed) {\n console.error('Callback URL validation failed:', validation.reason);\n setError(`Security Error: ${validation.reason}`);\n\n // Log suspicious redirect attempt\n console.warn('Suspicious redirect attempt blocked:', {\n url: return_url,\n reason: validation.reason,\n timestamp: new Date().toISOString(),\n });\n return;\n }\n // Send postMessage to parent if in iframe\n if (window.parent !== window) {\n const targetOrigin = new URL(return_url).origin;\n window.parent.postMessage({\n type: 'kyc_result',\n status: params.status,\n kyc_id: params.kyc_id,\n message: params.message,\n processing_state: params.processing_state,\n verification_steps: params.verification_steps,\n }, targetOrigin);\n } else {\n window.location.href = return_url;\n }\n } catch (error) {\n console.error('Error during redirect:', error);\n setError('Failed to redirect to callback URL');\n }\n }, [urlParams]);\n\n const handleComplete = useCallback(async (data: any) => {\n console.log('KYC completed:', data);\n\n // Check if still processing/analyzing\n const isStillProcessing = data.isProcessing || data.session?.isProcessing;\n\n // Handle Push URL webhook if provided\n if (urlParams.push_url) {\n try {\n const innerResult = data?.result?.result || data?.result || data;\n const nestedDataMap = innerResult?.data;\n \n let kycSessionId = data?.session_id || urlParams.kyc_id || '';\n let parsedKycData: any = null;\n\n if (nestedDataMap) {\n const mapKeys = Object.keys(nestedDataMap);\n if (mapKeys.length > 0) {\n const detectedSessionId = mapKeys.find(key => key.startsWith('kyc-')) || mapKeys[0];\n if (detectedSessionId) {\n kycSessionId = detectedSessionId;\n }\n \n const rawData = nestedDataMap[kycSessionId]?.data;\n\n if (typeof rawData === 'string') {\n try {\n parsedKycData = JSON.parse(rawData);\n } catch (parseErr) {\n console.warn('Failed parsing inner stringified JSON string:', parseErr);\n parsedKycData = rawData;\n }\n } else {\n parsedKycData = rawData;\n }\n }\n }\n\n const finalSessionId = kycSessionId || parsedKycData?.session_id || urlParams.kyc_id || 'unknown';\n\n // 3. Build your exact un-nested payload signature\n const verificationState = {\n session_id: finalSessionId,\n status: 'success',\n message: innerResult?.message || 'Verification data retrieved successfully.',\n data: parsedKycData || {}\n };\n\n await postWebhook(urlParams.push_url, verificationState, 5000);\n console.log('Successfully pushed beautifully clean KYC data payload to webhook');\n } catch (err) {\n console.warn('Failed to push data to webhook URL:', err);\n }\n }\n\n redirectToReturnUrl({\n status: 'completed',\n kyc_id: data.session_id || urlParams.kyc_id,\n message: 'KYC process completed successfully',\n processing_state: isStillProcessing ? 'analyzing' : 'completed',\n verification_steps: {\n document_analyzed: data.documentAnalysisComplete || false,\n selfie_analyzed: data.selfieAnalysisComplete || false,\n liveness_checked: data.livenessCheckComplete || false,\n },\n });\n\n onComplete?.(data);\n }, [redirectToReturnUrl, urlParams, onComplete]);\n\n // Handle KYC error\n const handleError = useCallback((error: string) => {\n console.error('KYC error:', error);\n setIsAnalyzing(false);\n redirectToReturnUrl({\n status: 'error',\n kyc_id: urlParams.kyc_id,\n message: error,\n processing_state: 'pending',\n });\n onError?.(error);\n }, [redirectToReturnUrl, urlParams.kyc_id, onError]);\n\n // Handle KYC cancellation\n const handleCancel = useCallback(async () => {\n console.log('KYC cancelled', urlParams.push_url, urlParams);\n setIsAnalyzing(false);\n if (urlParams.push_url) {\n try {\n const verificationState = {\n status: 'cancelled', // verification cancelled\n result: null, // pass null as result\n reference_id: urlParams.reference_id,\n };\n await postWebhook(urlParams.push_url, verificationState, 5000);\n console.log('Successfully pushed KYC cancellation data to webhook');\n } catch (err) {\n // Fail open - redirect anyway even if webhook fails\n console.warn('Failed to push data to webhook URL:', err);\n }\n }\n redirectToReturnUrl({\n status: 'cancelled',\n kyc_id: urlParams.kyc_id,\n message: 'KYC process was cancelled',\n processing_state: 'pending',\n });\n onCancel?.();\n }, [redirectToReturnUrl, urlParams.kyc_id, urlParams.push_url, urlParams.reference_id, onCancel]);\n\n const handleSessionSave = useCallback(async (sessionId: string) => {\n console.log('KYC session created:', sessionId);\n\n if (urlParams.save_session_url) {\n try {\n const payload = {\n status: 'session_created',\n reference_id: urlParams.reference_id,\n result: {\n session_id: sessionId,\n kyc_id: sessionId,\n },\n };\n await postWebhook(urlParams.save_session_url, payload, 5000);\n console.log('Successfully pushed session data to save_session_url');\n } catch (err) {\n // Fail open - do not block the KYC flow if save_session webhook fails\n console.warn('Failed to push session data to save_session_url:', err);\n }\n } else {\n console.warn('save_session_url is missing in URL params, webhook not called');\n }\n\n onSessionSave?.(sessionId);\n }, [urlParams.save_session_url, urlParams.reference_id, onSessionSave]);\n\n // Initialize component\n useEffect(() => {\n try {\n const params = parseUrlParams();\n\n setUrlParams(params);\n\n // Set language if provided\n if (params.lang) {\n setLocale(params.lang);\n }\n\n // Configure backend environment\n if (params.server_env) {\n KYCConfig.setBackendEnvironment(params.server_env);\n }\n\n setIsLoading(false);\n } catch (error) {\n console.error('Error parsing URL parameters:', error);\n setError('Error parsing URL parameters');\n setIsLoading(false);\n }\n }, [parseUrlParams, setLocale]);\n\n\n if (isLoading) {\n return (\n <View style={styles.container}>\n <Text style={styles.loadingText}>Loading KYC process...</Text>\n </View>\n );\n }\n\n if (error) {\n return (\n <View style={styles.container}>\n <Text style={styles.errorText}>Error: {error}</Text>\n </View>\n );\n }\n\n if (!urlParams.token) {\n return (\n <View style={styles.container}>\n <Text style={styles.errorText}>No token provided in URL parameters</Text>\n </View>\n );\n }\n\n return (\n <SafeAreaView style={styles.container}>\n {isAnalyzing && (\n <View style={styles.analyzingOverlay}>\n <View style={styles.analyzingContainer}>\n <ActivityIndicator size=\"large\" color=\"#2DBD60\" />\n <Text style={styles.analyzingText}>Analyzing verification data...</Text>\n <Text style={styles.analyzingSubtext}>This may take a few moments</Text>\n </View>\n </View>\n )}\n <TemplateKYCExample\n onComplete={handleComplete}\n onCancel={handleCancel}\n onError={handleError}\n language={urlParams.lang || 'en'}\n API_KEY={urlParams.token}\n templateId={urlParams.template_id}\n env={urlParams.env || 'PRODUCTION'}\n 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 ? { 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: {\n flex: 1,\n backgroundColor: '#f5f5f5',\n overflow: 'visible' as any, // Allow scrolling on web\n },\n loadingText: {\n fontSize: 18,\n textAlign: 'center',\n marginTop: 50,\n color: '#666',\n },\n errorText: {\n fontSize: 16,\n textAlign: 'center',\n marginTop: 50,\n color: '#dc2626',\n paddingHorizontal: 20,\n },\n analyzingOverlay: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.7)',\n justifyContent: 'center',\n alignItems: 'center',\n zIndex: 9999,\n },\n analyzingContainer: {\n backgroundColor: 'white',\n borderRadius: 12,\n padding: 32,\n alignItems: 'center',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 4 },\n shadowOpacity: 0.3,\n shadowRadius: 8,\n elevation: 8,\n },\n analyzingText: {\n fontSize: 18,\n fontWeight: '600',\n color: '#333',\n marginTop: 16,\n textAlign: 'center',\n },\n analyzingSubtext: {\n fontSize: 14,\n color: '#666',\n marginTop: 8,\n textAlign: 'center',\n },\n});\n\nexport default WebKYCEntry;"]}
|
|
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;"]}
|