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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "astra-sdk-web",
3
- "version": "1.1.10",
3
+ "version": "1.1.12",
4
4
  "description": "Official Astra SDK for JavaScript/TypeScript",
5
5
  "type": "module",
6
6
  "main": "./dist/astra-sdk.cjs.js",
@@ -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
- throw new Error(uploadError.message || 'Failed to upload face scan');
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, status } = statusResponse.data;
37
- if (status === 'COMPLETED' || completed_steps.includes(COMPLETED_STEPS.COMPLETED)) {
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
- if (
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
- (error as any)?.statusCode === 500 && errorMessage.includes('Face')
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
- return;
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
  }