astra-sdk-web 1.1.10 → 1.1.12
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/dist/astra-sdk.cjs.js +44 -13
- package/dist/astra-sdk.cjs.js.map +1 -1
- package/dist/astra-sdk.es.js +44 -13
- package/dist/astra-sdk.es.js.map +1 -1
- package/dist/components.cjs.js +44 -13
- package/dist/components.cjs.js.map +1 -1
- package/dist/components.es.js +44 -13
- package/dist/components.es.js.map +1 -1
- package/package.json +1 -1
- package/src/features/faceScan/hooks/useFaceScan.ts +37 -10
- package/src/pages/DocumentUploadModal.tsx +2 -3
- package/src/pages/FaceScanModal.tsx +12 -5
- package/src/services/kycApiService.ts +9 -1
package/package.json
CHANGED
|
@@ -118,6 +118,7 @@ export function useFaceScan(
|
|
|
118
118
|
if (callbacks?.onFaceUpload) {
|
|
119
119
|
try {
|
|
120
120
|
await callbacks.onFaceUpload(blob);
|
|
121
|
+
// Only proceed if upload was successful (not face already registered)
|
|
121
122
|
setState(prev => ({
|
|
122
123
|
...prev,
|
|
123
124
|
capturedImage: dataUrl,
|
|
@@ -125,8 +126,34 @@ export function useFaceScan(
|
|
|
125
126
|
livenessInstruction: "Face captured and uploaded successfully!",
|
|
126
127
|
loading: false,
|
|
127
128
|
}));
|
|
129
|
+
|
|
130
|
+
// Call completion callback
|
|
131
|
+
if (callbacks?.onFaceCaptureComplete) {
|
|
132
|
+
callbacks.onFaceCaptureComplete(dataUrl);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
setTimeout(() => {
|
|
136
|
+
setState(prev => ({ ...prev, showDocumentUpload: true }));
|
|
137
|
+
}, 500);
|
|
128
138
|
} catch (uploadError: any) {
|
|
129
|
-
|
|
139
|
+
// If it's the face already registered error, don't show document upload
|
|
140
|
+
if (uploadError.message === 'FACE_ALREADY_REGISTERED' || (uploadError as any).isFaceAlreadyRegistered) {
|
|
141
|
+
setState(prev => ({
|
|
142
|
+
...prev,
|
|
143
|
+
loading: false,
|
|
144
|
+
allStepsCompleted: false,
|
|
145
|
+
showDocumentUpload: false,
|
|
146
|
+
livenessInstruction: "Face already registered. Please click Retry to register again.",
|
|
147
|
+
}));
|
|
148
|
+
return; // Don't proceed to document upload
|
|
149
|
+
}
|
|
150
|
+
// For other errors, show error message
|
|
151
|
+
setState(prev => ({
|
|
152
|
+
...prev,
|
|
153
|
+
livenessInstruction: uploadError.message || 'Error capturing image. Please try again.',
|
|
154
|
+
loading: false,
|
|
155
|
+
}));
|
|
156
|
+
throw uploadError;
|
|
130
157
|
}
|
|
131
158
|
} else {
|
|
132
159
|
setState(prev => ({
|
|
@@ -136,16 +163,16 @@ export function useFaceScan(
|
|
|
136
163
|
livenessInstruction: "Face captured successfully!",
|
|
137
164
|
loading: false,
|
|
138
165
|
}));
|
|
166
|
+
|
|
167
|
+
// Call completion callback
|
|
168
|
+
if (callbacks?.onFaceCaptureComplete) {
|
|
169
|
+
callbacks.onFaceCaptureComplete(dataUrl);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
setTimeout(() => {
|
|
173
|
+
setState(prev => ({ ...prev, showDocumentUpload: true }));
|
|
174
|
+
}, 500);
|
|
139
175
|
}
|
|
140
|
-
|
|
141
|
-
// Call completion callback
|
|
142
|
-
if (callbacks?.onFaceCaptureComplete) {
|
|
143
|
-
callbacks.onFaceCaptureComplete(dataUrl);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
setTimeout(() => {
|
|
147
|
-
setState(prev => ({ ...prev, showDocumentUpload: true }));
|
|
148
|
-
}, 500);
|
|
149
176
|
} catch (err: any) {
|
|
150
177
|
console.error('Error capturing image:', err);
|
|
151
178
|
setState(prev => ({
|
|
@@ -33,8 +33,8 @@ function DocumentUploadModal({ onComplete }: DocumentUploadModalProps) {
|
|
|
33
33
|
// Check if KYC is completed after document upload
|
|
34
34
|
try {
|
|
35
35
|
const statusResponse = await apiService.getSessionStatus();
|
|
36
|
-
const { completed_steps,
|
|
37
|
-
if (
|
|
36
|
+
const { completed_steps, next_step } = statusResponse.data;
|
|
37
|
+
if (next_step === 'completed' || completed_steps.includes(COMPLETED_STEPS.COMPLETED)) {
|
|
38
38
|
setKycCompleted(true);
|
|
39
39
|
}
|
|
40
40
|
} catch (error) {
|
|
@@ -103,7 +103,6 @@ function DocumentUploadModal({ onComplete }: DocumentUploadModalProps) {
|
|
|
103
103
|
}, [apiService, navigate]);
|
|
104
104
|
|
|
105
105
|
|
|
106
|
-
// Show KYC completion message
|
|
107
106
|
if (kycCompleted) {
|
|
108
107
|
return (
|
|
109
108
|
<div className="fixed inset-0 bg-black p-5 z-[1000] flex items-center justify-center font-sans overflow-y-auto custom__scrollbar">
|
|
@@ -34,20 +34,27 @@ function FaceScanModal({ onComplete }: FaceScanModalProps) {
|
|
|
34
34
|
} catch (error: any) {
|
|
35
35
|
const errorMessage = error?.message || '';
|
|
36
36
|
const errorData = (error as any)?.errorData || {};
|
|
37
|
+
const statusCode = (error as any)?.statusCode;
|
|
37
38
|
|
|
38
|
-
|
|
39
|
+
// Check for "Face already registered" error in various formats
|
|
40
|
+
// The API returns: { success: false, statusCode: 500, message: "Face already registered", errorData: {...} }
|
|
41
|
+
const isFaceAlreadyRegistered =
|
|
39
42
|
errorMessage.includes('Face already registered') ||
|
|
40
43
|
errorMessage.includes('already registered') ||
|
|
41
44
|
errorData?.message?.includes('Face already registered') ||
|
|
42
|
-
(
|
|
43
|
-
|
|
45
|
+
(statusCode === 500 && errorMessage.includes('Face already registered'));
|
|
46
|
+
|
|
47
|
+
if (isFaceAlreadyRegistered) {
|
|
44
48
|
setShowRetryButton(true);
|
|
45
49
|
setToast({
|
|
46
50
|
message: 'Face already registered. Click Retry to register again.',
|
|
47
51
|
type: 'warning',
|
|
48
52
|
});
|
|
49
|
-
setState(prev => ({ ...prev, loading: false }));
|
|
50
|
-
|
|
53
|
+
setState(prev => ({ ...prev, loading: false, allStepsCompleted: false, showDocumentUpload: false }));
|
|
54
|
+
// Throw a special error to prevent continuing to document upload
|
|
55
|
+
const faceRegisteredError = new Error('FACE_ALREADY_REGISTERED');
|
|
56
|
+
(faceRegisteredError as any).isFaceAlreadyRegistered = true;
|
|
57
|
+
throw faceRegisteredError;
|
|
51
58
|
}
|
|
52
59
|
throw error;
|
|
53
60
|
}
|
|
@@ -120,17 +120,25 @@ export class KycApiService {
|
|
|
120
120
|
|
|
121
121
|
if (!response.ok) {
|
|
122
122
|
const errorData = await response.json().catch(() => ({}));
|
|
123
|
-
const message = errorData?.message || `Face upload failed with status ${response.status}`;
|
|
123
|
+
const message = errorData?.message || errorData?.errorData?.message || `Face upload failed with status ${response.status}`;
|
|
124
124
|
// Preserve the original error message for better error handling
|
|
125
125
|
const error = new Error(message);
|
|
126
126
|
(error as any).statusCode = response.status;
|
|
127
127
|
(error as any).errorData = errorData;
|
|
128
|
+
// Also preserve the full error response structure
|
|
129
|
+
if (errorData.statusCode) {
|
|
130
|
+
(error as any).statusCode = errorData.statusCode;
|
|
131
|
+
}
|
|
128
132
|
throw error;
|
|
129
133
|
}
|
|
130
134
|
|
|
131
135
|
const data = await response.json();
|
|
132
136
|
return data;
|
|
133
137
|
} catch (error: any) {
|
|
138
|
+
// If error already has a message from the response, preserve it
|
|
139
|
+
if (error.message && !error.message.includes('Face upload failed')) {
|
|
140
|
+
throw error;
|
|
141
|
+
}
|
|
134
142
|
const message = error?.message || 'Face upload failed';
|
|
135
143
|
throw new Error(`Face upload failed: ${message}`);
|
|
136
144
|
}
|