powr-sdk-web 4.4.0 → 4.4.2

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.
@@ -116,6 +116,14 @@ var PowrLogin = function PowrLogin(_ref) {
116
116
  _useState28 = _slicedToArray(_useState27, 2),
117
117
  firebaseConfirm = _useState28[0],
118
118
  setFirebaseConfirm = _useState28[1];
119
+ var _useState29 = (0, _react.useState)(false),
120
+ _useState30 = _slicedToArray(_useState29, 2),
121
+ showOtpModal = _useState30[0],
122
+ setShowOtpModal = _useState30[1];
123
+ var _useState31 = (0, _react.useState)(false),
124
+ _useState32 = _slicedToArray(_useState31, 2),
125
+ isPhoneVerified = _useState32[0],
126
+ setIsPhoneVerified = _useState32[1];
119
127
  var shouldShowToggle = mode === 'toggle';
120
128
  var handleInputChange = /*#__PURE__*/function () {
121
129
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(e) {
@@ -144,39 +152,98 @@ var PowrLogin = function PowrLogin(_ref) {
144
152
  }();
145
153
  var sendFirebaseOtp = /*#__PURE__*/function () {
146
154
  var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(phone) {
147
- var appVerifier, confirmationResult, _t;
155
+ var appVerifier, confirmationResult, _t, _t2;
148
156
  return _regenerator().w(function (_context2) {
149
157
  while (1) switch (_context2.p = _context2.n) {
150
158
  case 0:
151
159
  setOtpLoading(true);
152
160
  setError('');
153
161
  _context2.p = 1;
154
- if (!window.recaptchaVerifier) {
155
- window.recaptchaVerifier = new _firebase.RecaptchaVerifier(_firebase.auth, 'recaptcha-container', {
156
- size: 'invisible'
157
- });
162
+ // Clear any existing reCAPTCHA
163
+ if (window.recaptchaVerifier) {
164
+ try {
165
+ window.recaptchaVerifier.clear();
166
+ } catch (e) {
167
+ console.log('Error clearing reCAPTCHA:', e);
168
+ }
169
+ window.recaptchaVerifier = null;
158
170
  }
171
+
172
+ // Create new reCAPTCHA verifier with proper configuration
173
+ window.recaptchaVerifier = new _firebase.RecaptchaVerifier(_firebase.auth, 'recaptcha-container', {
174
+ size: 'invisible',
175
+ callback: function callback(response) {
176
+ console.log('reCAPTCHA verified successfully');
177
+ },
178
+ 'expired-callback': function expiredCallback() {
179
+ console.log('reCAPTCHA expired');
180
+ setError('reCAPTCHA expired. Please try again.');
181
+ },
182
+ 'error-callback': function errorCallback(error) {
183
+ console.error('reCAPTCHA error:', error);
184
+ setError('reCAPTCHA verification failed. Please try again.');
185
+ }
186
+ });
187
+ _context2.p = 2;
188
+ _context2.n = 3;
189
+ return window.recaptchaVerifier.render();
190
+ case 3:
191
+ console.log('reCAPTCHA rendered successfully');
192
+ _context2.n = 5;
193
+ break;
194
+ case 4:
195
+ _context2.p = 4;
196
+ _t = _context2.v;
197
+ console.error('reCAPTCHA render error:', _t);
198
+ case 5:
159
199
  appVerifier = window.recaptchaVerifier;
160
- _context2.n = 2;
200
+ _context2.n = 6;
161
201
  return (0, _firebase.signInWithPhoneNumber)(_firebase.auth, phone, appVerifier);
162
- case 2:
202
+ case 6:
163
203
  confirmationResult = _context2.v;
164
204
  setFirebaseConfirm(confirmationResult);
165
205
  setFirebaseOtpSent(true);
206
+ setShowOtpModal(true);
166
207
  setSuccess('OTP sent to your phone!');
167
- _context2.n = 4;
208
+ _context2.n = 8;
168
209
  break;
169
- case 3:
170
- _context2.p = 3;
171
- _t = _context2.v;
172
- case 4:
173
- _context2.p = 4;
210
+ case 7:
211
+ _context2.p = 7;
212
+ _t2 = _context2.v;
213
+ console.error('Firebase OTP Error:', _t2);
214
+
215
+ // Handle specific Firebase errors
216
+ if (_t2.code === 'auth/invalid-app-credential') {
217
+ setError('Firebase configuration issue. Please check your Firebase setup.');
218
+ } else if (_t2.code === 'auth/captcha-check-failed') {
219
+ setError('Security verification failed. Please refresh and try again.');
220
+ } else if (_t2.code === 'auth/invalid-phone-number') {
221
+ setError('Invalid phone number format. Please enter a valid number.');
222
+ } else if (_t2.code === 'auth/too-many-requests') {
223
+ setError('Too many requests. Please try again after some time.');
224
+ } else if (_t2.code === 'auth/quota-exceeded') {
225
+ setError('Daily SMS quota exceeded. Please try again tomorrow.');
226
+ } else {
227
+ setError("Failed to send OTP: ".concat(_t2.message || 'Unknown error'));
228
+ }
229
+
230
+ // Clear reCAPTCHA on error
231
+ if (window.recaptchaVerifier) {
232
+ try {
233
+ window.recaptchaVerifier.clear();
234
+ } catch (e) {
235
+ console.log('Error clearing reCAPTCHA on error:', e);
236
+ }
237
+ window.recaptchaVerifier = null;
238
+ }
239
+ case 8:
240
+ _context2.p = 8;
174
241
  setOtpLoading(false);
175
- return _context2.f(4);
176
- case 5:
242
+ return _context2.f(8);
243
+ case 9:
177
244
  return _context2.a(2);
178
245
  }
179
- }, _callee2, null, [[1, 3, 4, 5]]);
246
+ }, _callee2, null, [[2, 4], [1, 7, 8, 9]]);
180
247
  }));
181
248
  return function sendFirebaseOtp(_x2) {
182
249
  return _ref3.apply(this, arguments);
@@ -184,7 +251,7 @@ var PowrLogin = function PowrLogin(_ref) {
184
251
  }();
185
252
  var verifyFirebaseOtp = /*#__PURE__*/function () {
186
253
  var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
187
- var result, _t2;
254
+ var result, _t3;
188
255
  return _regenerator().w(function (_context3) {
189
256
  while (1) switch (_context3.p = _context3.n) {
190
257
  case 0:
@@ -202,23 +269,24 @@ var PowrLogin = function PowrLogin(_ref) {
202
269
  return firebaseConfirm.confirm(otp);
203
270
  case 3:
204
271
  result = _context3.v;
205
- _context3.n = 4;
206
- return handleSubmit(null, true);
207
- case 4:
208
- _context3.n = 6;
272
+ setIsPhoneVerified(true);
273
+ setShowOtpModal(false);
274
+ setSuccess('Phone number verified successfully! Now you can sign up.');
275
+ setOtp('');
276
+ _context3.n = 5;
209
277
  break;
278
+ case 4:
279
+ _context3.p = 4;
280
+ _t3 = _context3.v;
281
+ setError('Invalid OTP. Please try again.');
210
282
  case 5:
211
283
  _context3.p = 5;
212
- _t2 = _context3.v;
213
- setError('Invalid OTP. Please try again.');
214
- case 6:
215
- _context3.p = 6;
216
284
  setLoading(false);
217
- return _context3.f(6);
218
- case 7:
285
+ return _context3.f(5);
286
+ case 6:
219
287
  return _context3.a(2);
220
288
  }
221
- }, _callee3, null, [[1, 5, 6, 7]]);
289
+ }, _callee3, null, [[1, 4, 5, 6]]);
222
290
  }));
223
291
  return function verifyFirebaseOtp() {
224
292
  return _ref4.apply(this, arguments);
@@ -248,7 +316,6 @@ var PowrLogin = function PowrLogin(_ref) {
248
316
  data,
249
317
  ok,
250
318
  _args4 = arguments,
251
- _t3,
252
319
  _t4;
253
320
  return _regenerator().w(function (_context4) {
254
321
  while (1) switch (_context4.p = _context4.n) {
@@ -290,8 +357,8 @@ var PowrLogin = function PowrLogin(_ref) {
290
357
  if (!isLogin && formData.password !== formData.confirmPassword) {
291
358
  errors.confirmPassword = 'Passwords do not match';
292
359
  }
293
- if (!isLogin && (!otp || !firebaseConfirm)) {
294
- errors.otp = 'Please verify OTP before signing up';
360
+ if (!isLogin && !isPhoneVerified) {
361
+ errors.phoneOrEmail = 'Please verify your phone number first';
295
362
  }
296
363
  if (!(Object.keys(errors).length > 0)) {
297
364
  _context4.n = 1;
@@ -301,35 +368,7 @@ var PowrLogin = function PowrLogin(_ref) {
301
368
  setLoading(false);
302
369
  return _context4.a(2);
303
370
  case 1:
304
- if (isLogin) {
305
- _context4.n = 7;
306
- break;
307
- }
308
- _context4.p = 2;
309
- if (!(firebaseConfirm && otp)) {
310
- _context4.n = 4;
311
- break;
312
- }
313
- _context4.n = 3;
314
- return firebaseConfirm.confirm(otp);
315
- case 3:
316
- _context4.n = 5;
317
- break;
318
- case 4:
319
- setError('Please verify OTP before signing up');
320
- setLoading(false);
321
- return _context4.a(2);
322
- case 5:
323
- _context4.n = 7;
324
- break;
325
- case 6:
326
- _context4.p = 6;
327
- _t3 = _context4.v;
328
- setError('Invalid OTP. Please try again.');
329
- setLoading(false);
330
- return _context4.a(2);
331
- case 7:
332
- _context4.p = 7;
371
+ _context4.p = 1;
333
372
  endpoint = isLogin ? "/auth/login" : "/auth/register";
334
373
  payload = isLogin ? {
335
374
  phoneOrEmail: formData.phoneOrEmail,
@@ -339,12 +378,12 @@ var PowrLogin = function PowrLogin(_ref) {
339
378
  phoneOrEmail: formData.phoneOrEmail,
340
379
  password: formData.password
341
380
  };
342
- _context4.n = 8;
381
+ _context4.n = 2;
343
382
  return (0, _auth.apiCall)(apiUrl, endpoint, projectId, {
344
383
  method: 'POST',
345
384
  body: payload
346
385
  });
347
- case 8:
386
+ case 2:
348
387
  _yield$apiCall = _context4.v;
349
388
  data = _yield$apiCall.data;
350
389
  ok = _yield$apiCall.ok;
@@ -380,20 +419,20 @@ var PowrLogin = function PowrLogin(_ref) {
380
419
  setError("".concat(isLogin ? 'Login' : 'Registration', " failed. Please try again."));
381
420
  }
382
421
  }
383
- _context4.n = 10;
422
+ _context4.n = 4;
384
423
  break;
385
- case 9:
386
- _context4.p = 9;
424
+ case 3:
425
+ _context4.p = 3;
387
426
  _t4 = _context4.v;
388
427
  setError('Network error. Please try again.');
389
- case 10:
390
- _context4.p = 10;
428
+ case 4:
429
+ _context4.p = 4;
391
430
  setLoading(false);
392
- return _context4.f(10);
393
- case 11:
431
+ return _context4.f(4);
432
+ case 5:
394
433
  return _context4.a(2);
395
434
  }
396
- }, _callee4, null, [[7, 9, 10, 11], [2, 6]]);
435
+ }, _callee4, null, [[1, 3, 4, 5]]);
397
436
  }));
398
437
  return function handleSubmit(_x3) {
399
438
  return _ref5.apply(this, arguments);
@@ -409,6 +448,8 @@ var PowrLogin = function PowrLogin(_ref) {
409
448
  setOtp('');
410
449
  setFirebaseOtpSent(false);
411
450
  setFirebaseConfirm(null);
451
+ setShowOtpModal(false);
452
+ setIsPhoneVerified(false);
412
453
  setFormData({
413
454
  phoneOrEmail: '',
414
455
  password: '',
@@ -537,35 +578,20 @@ var PowrLogin = function PowrLogin(_ref) {
537
578
  style: styles.fieldError
538
579
  }, fieldErrors.phoneOrEmail), !isLogin && /*#__PURE__*/_react["default"].createElement("div", {
539
580
  style: styles.helpText
540
- }, "Registration requires phone verification for security"), !isLogin && isValidPhone(formData.phoneOrEmail) && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, !firebaseOtpSent ? /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("button", {
581
+ }, "Registration requires phone verification for security"), !isLogin && isValidPhone(formData.phoneOrEmail) && !isPhoneVerified && /*#__PURE__*/_react["default"].createElement("button", {
541
582
  type: "button",
542
583
  onClick: function onClick() {
543
584
  return sendFirebaseOtp(formatPhone(formData.phoneOrEmail));
544
585
  },
545
- style: styles.otpButton,
586
+ style: _objectSpread(_objectSpread({}, styles.otpButton), {}, {
587
+ marginTop: '8px'
588
+ }),
546
589
  disabled: otpLoading
547
- }, otpLoading ? 'Sending OTP...' : 'Send OTP to Phone'), /*#__PURE__*/_react["default"].createElement("div", {
590
+ }, otpLoading ? 'Sending OTP...' : 'Verify Phone Number'), !isLogin && isPhoneVerified && /*#__PURE__*/_react["default"].createElement("div", {
591
+ style: styles.successText
592
+ }, "\u2705 Phone number verified successfully!"), /*#__PURE__*/_react["default"].createElement("div", {
548
593
  id: "recaptcha-container"
549
- })) : /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("label", {
550
- htmlFor: "otp",
551
- style: styles.label
552
- }, "Enter OTP"), /*#__PURE__*/_react["default"].createElement("input", {
553
- type: "text",
554
- id: "otp",
555
- name: "otp",
556
- value: otp,
557
- onChange: function onChange(e) {
558
- return setOtp(e.target.value);
559
- },
560
- style: styles.input,
561
- placeholder: "Enter OTP received",
562
- required: true
563
- }), /*#__PURE__*/_react["default"].createElement("button", {
564
- type: "button",
565
- onClick: verifyFirebaseOtp,
566
- style: styles.otpButton,
567
- disabled: loading || !otp
568
- }, loading ? 'Verifying...' : 'Verify OTP & Sign Up')))), /*#__PURE__*/_react["default"].createElement("div", {
594
+ })), /*#__PURE__*/_react["default"].createElement("div", {
569
595
  style: styles.formGroup
570
596
  }, /*#__PURE__*/_react["default"].createElement("label", {
571
597
  htmlFor: "password",
@@ -679,7 +705,55 @@ var PowrLogin = function PowrLogin(_ref) {
679
705
  }, "Sign in here") : /*#__PURE__*/_react["default"].createElement("a", {
680
706
  href: "/login",
681
707
  style: styles.navigationLink
682
- }, "Sign in here"))))));
708
+ }, "Sign in here"))))), showOtpModal && /*#__PURE__*/_react["default"].createElement("div", {
709
+ style: styles.modalOverlay
710
+ }, /*#__PURE__*/_react["default"].createElement("div", {
711
+ style: styles.modalContent
712
+ }, /*#__PURE__*/_react["default"].createElement("div", {
713
+ style: styles.modalHeader
714
+ }, /*#__PURE__*/_react["default"].createElement("h2", {
715
+ style: styles.modalTitle
716
+ }, "Verify Phone Number"), /*#__PURE__*/_react["default"].createElement("button", {
717
+ onClick: function onClick() {
718
+ setShowOtpModal(false);
719
+ setOtp('');
720
+ setError('');
721
+ },
722
+ style: styles.closeButton
723
+ }, "\xD7")), /*#__PURE__*/_react["default"].createElement("p", {
724
+ style: styles.modalText
725
+ }, "We've sent a verification code to ", /*#__PURE__*/_react["default"].createElement("strong", null, formData.phoneOrEmail)), /*#__PURE__*/_react["default"].createElement("div", {
726
+ style: styles.formGroup
727
+ }, /*#__PURE__*/_react["default"].createElement("label", {
728
+ htmlFor: "modalOtp",
729
+ style: styles.label
730
+ }, "Enter OTP"), /*#__PURE__*/_react["default"].createElement("input", {
731
+ type: "text",
732
+ id: "modalOtp",
733
+ value: otp,
734
+ onChange: function onChange(e) {
735
+ return setOtp(e.target.value);
736
+ },
737
+ style: styles.input,
738
+ placeholder: "Enter 6-digit OTP",
739
+ maxLength: "6",
740
+ autoFocus: true
741
+ })), error && /*#__PURE__*/_react["default"].createElement("div", {
742
+ style: styles.errorMessage
743
+ }, error), /*#__PURE__*/_react["default"].createElement("div", {
744
+ style: styles.modalButtons
745
+ }, /*#__PURE__*/_react["default"].createElement("button", {
746
+ onClick: function onClick() {
747
+ setShowOtpModal(false);
748
+ setOtp('');
749
+ setError('');
750
+ },
751
+ style: styles.cancelButton
752
+ }, "Cancel"), /*#__PURE__*/_react["default"].createElement("button", {
753
+ onClick: verifyFirebaseOtp,
754
+ disabled: loading || !otp || otp.length < 6,
755
+ style: _objectSpread(_objectSpread({}, styles.button), loading || !otp || otp.length < 6 ? styles.buttonDisabled : {})
756
+ }, loading ? 'Verifying...' : 'Verify')))));
683
757
  };
684
758
  var styles = {
685
759
  container: {
@@ -820,6 +894,17 @@ var styles = {
820
894
  fontSize: '14px',
821
895
  fontWeight: '500'
822
896
  },
897
+ successText: {
898
+ background: '#f0fdf4',
899
+ color: '#16a34a',
900
+ padding: '8px 12px',
901
+ borderRadius: '6px',
902
+ border: '1px solid #bbf7d0',
903
+ fontSize: '12px',
904
+ fontWeight: '500',
905
+ marginTop: '8px',
906
+ textAlign: 'center'
907
+ },
823
908
  toggleSection: {
824
909
  marginTop: '24px',
825
910
  textAlign: 'center',
@@ -29,7 +29,7 @@ var getAuthToken = exports.getAuthToken = function getAuthToken() {
29
29
  return null;
30
30
  };
31
31
 
32
- // Create headers with authentication token
32
+ // Create headers with authentication
33
33
  var createAuthHeaders = exports.createAuthHeaders = function createAuthHeaders() {
34
34
  var additionalHeaders = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
35
35
  var token = getAuthToken();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "powr-sdk-web",
3
- "version": "4.4.0",
3
+ "version": "4.4.2",
4
4
  "main": "dist/index.js",
5
5
  "scripts": {
6
6
  "build": "babel src -d dist --copy-files",