powr-sdk-web 6.15.0 → 6.17.0

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.
@@ -10,6 +10,7 @@ var _firebase = require("../utils/firebase");
10
10
  var _AddPhonePanel = _interopRequireDefault(require("../onboarding/AddPhonePanel"));
11
11
  var _PhoneInput = _interopRequireDefault(require("../components/PhoneInput"));
12
12
  var _utils = require("../onboarding/utils");
13
+ var _profileNameStep = require("../onboarding/steps/profileNameStep");
13
14
  var _phone = require("../utils/phone");
14
15
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
15
16
  var cache;
@@ -17,13 +18,13 @@ function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e;
17
18
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
18
19
  function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
19
20
  function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
21
+ function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
22
+ function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
20
23
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
21
24
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
22
25
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
23
26
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
24
27
  function _toPrimitive(t, e) { if ("object" != _typeof(t) || !t) return t; var r; if ("undefined" != typeof Symbol && void 0 !== (r = t[Symbol.toPrimitive])) { var i = r.call(t, e || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === e ? String : Number)(t); }
25
- function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
26
- function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
27
28
  function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
28
29
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
29
30
  function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
@@ -48,6 +49,12 @@ var PowrLogin = function PowrLogin(_ref) {
48
49
  passwordResetHelpUrl = _ref$passwordResetHel === void 0 ? null : _ref$passwordResetHel,
49
50
  _ref$passwordResetHel2 = _ref.passwordResetHelpLabel,
50
51
  passwordResetHelpLabel = _ref$passwordResetHel2 === void 0 ? 'Forgot password? WhatsApp us' : _ref$passwordResetHel2,
52
+ _ref$forgotPasswordCh = _ref.forgotPasswordChannel,
53
+ forgotPasswordChannel = _ref$forgotPasswordCh === void 0 ? null : _ref$forgotPasswordCh,
54
+ _ref$otpApp = _ref.otpApp,
55
+ otpApp = _ref$otpApp === void 0 ? null : _ref$otpApp,
56
+ _ref$otpReset = _ref.otpReset,
57
+ otpReset = _ref$otpReset === void 0 ? false : _ref$otpReset,
51
58
  _ref$completeProfileO = _ref.completeProfileOnLogin,
52
59
  completeProfileOnLogin = _ref$completeProfileO === void 0 ? false : _ref$completeProfileO,
53
60
  _ref$requireTerms = _ref.requireTerms,
@@ -63,6 +70,7 @@ var PowrLogin = function PowrLogin(_ref) {
63
70
  onSessionExpired = _ref.onSessionExpired;
64
71
  var projectId = projectIdProp || config.projectId;
65
72
  var resolvedDefaultCountry = (0, _phone.resolveCountry)(defaultCountry, defaultCountryCode);
73
+ var resetChannel = forgotPasswordChannel || (otpReset ? 'otp' : 'whatsapp');
66
74
  var _useState = (0, _react.useState)(function () {
67
75
  switch (mode) {
68
76
  case 'login':
@@ -122,55 +130,116 @@ var PowrLogin = function PowrLogin(_ref) {
122
130
  _useState20 = _slicedToArray(_useState19, 2),
123
131
  otpSent = _useState20[0],
124
132
  setOtpSent = _useState20[1];
125
- var _useState21 = (0, _react.useState)(false),
133
+ var _useState21 = (0, _react.useState)(null),
126
134
  _useState22 = _slicedToArray(_useState21, 2),
127
- otpLoading = _useState22[0],
128
- setOtpLoading = _useState22[1];
135
+ smsResetStep = _useState22[0],
136
+ setSmsResetStep = _useState22[1];
129
137
  var _useState23 = (0, _react.useState)(''),
130
138
  _useState24 = _slicedToArray(_useState23, 2),
131
- otp = _useState24[0],
132
- setOtp = _useState24[1];
133
- var _useState25 = (0, _react.useState)(false),
139
+ smsOtp = _useState24[0],
140
+ setSmsOtp = _useState24[1];
141
+ var _useState25 = (0, _react.useState)(''),
134
142
  _useState26 = _slicedToArray(_useState25, 2),
135
- firebaseOtpSent = _useState26[0],
136
- setFirebaseOtpSent = _useState26[1];
137
- var _useState27 = (0, _react.useState)(null),
143
+ smsNewPassword = _useState26[0],
144
+ setSmsNewPassword = _useState26[1];
145
+ var _useState27 = (0, _react.useState)(''),
138
146
  _useState28 = _slicedToArray(_useState27, 2),
139
- firebaseConfirm = _useState28[0],
140
- setFirebaseConfirm = _useState28[1];
141
- var _useState29 = (0, _react.useState)(false),
147
+ smsConfirmPassword = _useState28[0],
148
+ setSmsConfirmPassword = _useState28[1];
149
+ var _useState29 = (0, _react.useState)(null),
142
150
  _useState30 = _slicedToArray(_useState29, 2),
143
- showOtpModal = _useState30[0],
144
- setShowOtpModal = _useState30[1];
145
- var _useState31 = (0, _react.useState)(false),
151
+ smsVerifyAuth = _useState30[0],
152
+ setSmsVerifyAuth = _useState30[1];
153
+ var _useState31 = (0, _react.useState)('phone'),
146
154
  _useState32 = _slicedToArray(_useState31, 2),
147
- isPhoneVerified = _useState32[0],
148
- setIsPhoneVerified = _useState32[1];
149
- var _useState33 = (0, _react.useState)('form'),
155
+ loginGate = _useState32[0],
156
+ setLoginGate = _useState32[1];
157
+ var _useState33 = (0, _react.useState)(false),
150
158
  _useState34 = _slicedToArray(_useState33, 2),
151
- authView = _useState34[0],
152
- setAuthView = _useState34[1];
153
- var _useState35 = (0, _react.useState)(null),
159
+ otpLoading = _useState34[0],
160
+ setOtpLoading = _useState34[1];
161
+ var _useState35 = (0, _react.useState)(''),
154
162
  _useState36 = _slicedToArray(_useState35, 2),
155
- pendingAuth = _useState36[0],
156
- setPendingAuth = _useState36[1];
163
+ otp = _useState36[0],
164
+ setOtp = _useState36[1];
157
165
  var _useState37 = (0, _react.useState)(false),
158
166
  _useState38 = _slicedToArray(_useState37, 2),
159
- termsAccepted = _useState38[0],
160
- setTermsAccepted = _useState38[1];
161
- var _useState39 = (0, _react.useState)(resolvedDefaultCountry),
167
+ firebaseOtpSent = _useState38[0],
168
+ setFirebaseOtpSent = _useState38[1];
169
+ var _useState39 = (0, _react.useState)(null),
162
170
  _useState40 = _slicedToArray(_useState39, 2),
163
- phoneCountry = _useState40[0],
164
- setPhoneCountry = _useState40[1];
171
+ firebaseConfirm = _useState40[0],
172
+ setFirebaseConfirm = _useState40[1];
165
173
  var _useState41 = (0, _react.useState)(false),
166
174
  _useState42 = _slicedToArray(_useState41, 2),
167
- registerPhoneValid = _useState42[0],
168
- setRegisterPhoneValid = _useState42[1];
169
- var _useState43 = (0, _react.useState)(''),
175
+ showOtpModal = _useState42[0],
176
+ setShowOtpModal = _useState42[1];
177
+ var _useState43 = (0, _react.useState)(false),
170
178
  _useState44 = _slicedToArray(_useState43, 2),
171
- registerPhoneE164 = _useState44[0],
172
- setRegisterPhoneE164 = _useState44[1];
173
- var shouldShowToggle = mode === 'toggle';
179
+ isPhoneVerified = _useState44[0],
180
+ setIsPhoneVerified = _useState44[1];
181
+ var _useState45 = (0, _react.useState)('form'),
182
+ _useState46 = _slicedToArray(_useState45, 2),
183
+ authView = _useState46[0],
184
+ setAuthView = _useState46[1];
185
+ var _useState47 = (0, _react.useState)(null),
186
+ _useState48 = _slicedToArray(_useState47, 2),
187
+ pendingAuth = _useState48[0],
188
+ setPendingAuth = _useState48[1];
189
+ var _useState49 = (0, _react.useState)(false),
190
+ _useState50 = _slicedToArray(_useState49, 2),
191
+ termsAccepted = _useState50[0],
192
+ setTermsAccepted = _useState50[1];
193
+ var _useState51 = (0, _react.useState)(resolvedDefaultCountry),
194
+ _useState52 = _slicedToArray(_useState51, 2),
195
+ phoneCountry = _useState52[0],
196
+ setPhoneCountry = _useState52[1];
197
+ var _useState53 = (0, _react.useState)(false),
198
+ _useState54 = _slicedToArray(_useState53, 2),
199
+ registerPhoneValid = _useState54[0],
200
+ setRegisterPhoneValid = _useState54[1];
201
+ var _useState55 = (0, _react.useState)(''),
202
+ _useState56 = _slicedToArray(_useState55, 2),
203
+ registerPhoneE164 = _useState56[0],
204
+ setRegisterPhoneE164 = _useState56[1];
205
+ var shouldShowToggle = false;
206
+ var askForProfile = true;
207
+ var finishWithSession = function finishWithSession(data) {
208
+ if (!(data !== null && data !== void 0 && data.token)) return;
209
+ if (askForProfile && data.user && (0, _utils.needsPhone)(data.user)) {
210
+ setPendingAuth({
211
+ user: data.user,
212
+ token: data.token,
213
+ refreshToken: data.refreshToken,
214
+ onTokenRefreshed: function onTokenRefreshed(newToken) {
215
+ setPendingAuth(function (prev) {
216
+ return prev ? _objectSpread(_objectSpread({}, prev), {}, {
217
+ token: newToken
218
+ }) : prev;
219
+ });
220
+ }
221
+ });
222
+ setAuthView('add-phone');
223
+ return;
224
+ }
225
+ if (askForProfile && data.user && (0, _utils.needsProfileName)(data.user)) {
226
+ setPendingAuth({
227
+ user: data.user,
228
+ token: data.token,
229
+ refreshToken: data.refreshToken,
230
+ onTokenRefreshed: function onTokenRefreshed(newToken) {
231
+ setPendingAuth(function (prev) {
232
+ return prev ? _objectSpread(_objectSpread({}, prev), {}, {
233
+ token: newToken
234
+ }) : prev;
235
+ });
236
+ }
237
+ });
238
+ setAuthView('add-name');
239
+ return;
240
+ }
241
+ if (onLogin) onLogin(data);
242
+ };
174
243
  var handleInputChange = /*#__PURE__*/function () {
175
244
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(e) {
176
245
  var _e$target, name, value;
@@ -401,48 +470,144 @@ var PowrLogin = function PowrLogin(_ref) {
401
470
  var emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
402
471
  return emailRegex.test(email);
403
472
  };
473
+ var storedPhone = function storedPhone() {
474
+ return registerPhoneE164 || (0, _phone.coercePhoneForStorage)(formData.phoneOrEmail.trim(), phoneCountry) || (0, _phone.coercePhoneForStorage)(formData.phoneOrEmail.trim(), resolvedDefaultCountry) || (0, _phone.normalizePhone)(formData.phoneOrEmail.trim(), phoneCountry);
475
+ };
476
+ var isIndiaNumber = function isIndiaNumber() {
477
+ var e164 = storedPhone() || '';
478
+ return e164.startsWith('+91') || phoneCountry === 'IN';
479
+ };
480
+ var continuePhone = /*#__PURE__*/function () {
481
+ var _ref6 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4() {
482
+ var phoneOrEmail, _yield$apiCall, data, ok, _t5;
483
+ return _regenerator().w(function (_context4) {
484
+ while (1) switch (_context4.p = _context4.n) {
485
+ case 0:
486
+ phoneOrEmail = storedPhone();
487
+ if (registerPhoneValid) {
488
+ _context4.n = 1;
489
+ break;
490
+ }
491
+ setFieldErrors({
492
+ phoneOrEmail: 'Enter a valid mobile number'
493
+ });
494
+ return _context4.a(2);
495
+ case 1:
496
+ setLoading(true);
497
+ setError('');
498
+ setSuccess('');
499
+ _context4.p = 2;
500
+ _context4.n = 3;
501
+ return (0, _auth.apiCall)(apiUrl, '/auth/login-options', projectId, {
502
+ method: 'POST',
503
+ body: {
504
+ phoneOrEmail: phoneOrEmail,
505
+ mobile: smsMobile()
506
+ }
507
+ });
508
+ case 3:
509
+ _yield$apiCall = _context4.v;
510
+ data = _yield$apiCall.data;
511
+ ok = _yield$apiCall.ok;
512
+ if (!(ok && data.exists && data.hasPassword)) {
513
+ _context4.n = 4;
514
+ break;
515
+ }
516
+ setLoginGate('password');
517
+ setSuccess('');
518
+ return _context4.a(2);
519
+ case 4:
520
+ if (!(resetChannel === 'otp')) {
521
+ _context4.n = 8;
522
+ break;
523
+ }
524
+ if (isIndiaNumber()) {
525
+ _context4.n = 5;
526
+ break;
527
+ }
528
+ setLoginGate('password');
529
+ setError('SMS is for Indian numbers. Sign in with your password.');
530
+ return _context4.a(2);
531
+ case 5:
532
+ if (!ok) {
533
+ _context4.n = 7;
534
+ break;
535
+ }
536
+ setLoading(false);
537
+ _context4.n = 6;
538
+ return handleSmsForgotStart();
539
+ case 6:
540
+ return _context4.a(2);
541
+ case 7:
542
+ setLoginGate('password');
543
+ return _context4.a(2);
544
+ case 8:
545
+ if (!(ok && (!data.exists || !data.hasPassword))) {
546
+ _context4.n = 9;
547
+ break;
548
+ }
549
+ setLoginGate('help');
550
+ return _context4.a(2);
551
+ case 9:
552
+ setLoginGate('password');
553
+ _context4.n = 11;
554
+ break;
555
+ case 10:
556
+ _context4.p = 10;
557
+ _t5 = _context4.v;
558
+ setLoginGate('password');
559
+ case 11:
560
+ _context4.p = 11;
561
+ setLoading(false);
562
+ return _context4.f(11);
563
+ case 12:
564
+ return _context4.a(2);
565
+ }
566
+ }, _callee4, null, [[2, 10, 11, 12]]);
567
+ }));
568
+ return function continuePhone() {
569
+ return _ref6.apply(this, arguments);
570
+ };
571
+ }();
404
572
  var handleSubmit = /*#__PURE__*/function () {
405
- var _ref6 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(e) {
573
+ var _ref7 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5(e) {
406
574
  var skipPhoneValidation,
407
575
  errors,
408
576
  value,
409
- isEmail,
410
577
  endpoint,
411
578
  normalizedPhone,
412
579
  payload,
413
- _yield$apiCall,
580
+ _yield$apiCall2,
414
581
  data,
415
582
  ok,
416
- _args4 = arguments,
417
- _t5;
418
- return _regenerator().w(function (_context4) {
419
- while (1) switch (_context4.p = _context4.n) {
583
+ _login$data,
584
+ login,
585
+ _args5 = arguments,
586
+ _t6;
587
+ return _regenerator().w(function (_context5) {
588
+ while (1) switch (_context5.p = _context5.n) {
420
589
  case 0:
421
- skipPhoneValidation = _args4.length > 1 && _args4[1] !== undefined ? _args4[1] : false;
590
+ skipPhoneValidation = _args5.length > 1 && _args5[1] !== undefined ? _args5[1] : false;
422
591
  if (e) e.preventDefault();
423
- setLoading(true);
424
592
  setError('');
425
593
  setSuccess('');
426
594
  setFieldErrors({});
427
595
  errors = {};
428
596
  value = formData.phoneOrEmail.trim();
429
- isEmail = value.includes('@');
430
- if (!formData.phoneOrEmail.trim()) {
431
- errors.phoneOrEmail = isLogin ? 'Phone or email is required' : 'Phone number is required';
597
+ if (!(isLogin && loginGate === 'phone' && !smsResetStep)) {
598
+ _context5.n = 2;
599
+ break;
432
600
  }
433
-
434
- // Registration: Only allow phone numbers
435
- if (!isLogin && !registerPhoneValid) {
436
- errors.phoneOrEmail = international ? 'Please enter a valid phone number' : 'Please enter a valid mobile number';
601
+ _context5.n = 1;
602
+ return continuePhone();
603
+ case 1:
604
+ return _context5.a(2);
605
+ case 2:
606
+ if (!formData.phoneOrEmail.trim()) {
607
+ errors.phoneOrEmail = 'Phone number is required';
437
608
  }
438
-
439
- // Login: Allow both phone and email
440
- if (isLogin) {
441
- if (isEmail && !isValidEmail(value)) {
442
- errors.phoneOrEmail = 'Please enter a valid email address';
443
- } else if (!isEmail && !(0, _phone.coercePhoneForStorage)(value, resolvedDefaultCountry)) {
444
- errors.phoneOrEmail = 'Please enter a valid phone number (include country code, e.g. +1…) or email';
445
- }
609
+ if (!registerPhoneValid && !storedPhone()) {
610
+ errors.phoneOrEmail = 'Please enter a valid mobile number';
446
611
  }
447
612
  if (!formData.password.trim()) {
448
613
  errors.password = 'Password is required';
@@ -462,72 +627,62 @@ var PowrLogin = function PowrLogin(_ref) {
462
627
  errors.terms = 'Please accept the terms to continue';
463
628
  }
464
629
  if (!(Object.keys(errors).length > 0)) {
465
- _context4.n = 1;
630
+ _context5.n = 3;
466
631
  break;
467
632
  }
468
633
  setFieldErrors(errors);
469
- setLoading(false);
470
- return _context4.a(2);
471
- case 1:
472
- _context4.p = 1;
634
+ return _context5.a(2);
635
+ case 3:
636
+ setLoading(true);
637
+ _context5.p = 4;
473
638
  endpoint = isLogin ? "/auth/login" : "/auth/register";
474
- normalizedPhone = isLogin ? isEmail ? value : (0, _phone.coercePhoneForStorage)(value, resolvedDefaultCountry) || (0, _phone.normalizePhone)(value, resolvedDefaultCountry) : registerPhoneE164 || (0, _phone.coercePhoneForStorage)(value, phoneCountry) || (0, _phone.normalizePhone)(value, phoneCountry);
639
+ normalizedPhone = storedPhone() || value;
475
640
  payload = isLogin ? {
476
- phoneOrEmail: isEmail ? value : normalizedPhone,
641
+ phoneOrEmail: normalizedPhone,
477
642
  password: formData.password
478
643
  } : {
479
644
  fullName: formData.fullName,
480
645
  phoneOrEmail: normalizedPhone,
481
646
  password: formData.password
482
647
  };
483
- _context4.n = 2;
648
+ _context5.n = 5;
484
649
  return (0, _auth.apiCall)(apiUrl, endpoint, projectId, {
485
650
  method: 'POST',
486
651
  body: payload
487
652
  });
488
- case 2:
489
- _yield$apiCall = _context4.v;
490
- data = _yield$apiCall.data;
491
- ok = _yield$apiCall.ok;
653
+ case 5:
654
+ _yield$apiCall2 = _context5.v;
655
+ data = _yield$apiCall2.data;
656
+ ok = _yield$apiCall2.ok;
492
657
  if (!ok) {
493
- _context4.n = 6;
658
+ _context5.n = 9;
494
659
  break;
495
660
  }
496
661
  setSuccess(isLogin ? 'Login successful!' : 'Registration successful!');
497
662
  if (!isLogin) {
498
- _context4.n = 4;
499
- break;
500
- }
501
- if (!(completeProfileOnLogin && (0, _utils.needsPhone)(data.user))) {
502
- _context4.n = 3;
663
+ _context5.n = 6;
503
664
  break;
504
665
  }
505
- setPendingAuth({
506
- user: data.user,
507
- token: data.token,
508
- refreshToken: data.refreshToken,
509
- onTokenRefreshed: function onTokenRefreshed(newToken) {
510
- setPendingAuth(function (prev) {
511
- return prev ? _objectSpread(_objectSpread({}, prev), {}, {
512
- token: newToken
513
- }) : prev;
514
- });
666
+ finishWithSession(data);
667
+ _context5.n = 8;
668
+ break;
669
+ case 6:
670
+ _context5.n = 7;
671
+ return (0, _auth.apiCall)(apiUrl, '/auth/login', projectId, {
672
+ method: 'POST',
673
+ body: {
674
+ phoneOrEmail: normalizedPhone,
675
+ password: formData.password
515
676
  }
516
677
  });
517
- setAuthView('add-phone');
518
- setLoading(false);
519
- return _context4.a(2);
520
- case 3:
521
- if (onLogin) {
522
- onLogin(data);
523
- }
524
- _context4.n = 5;
525
- break;
526
- case 4:
527
- if (!isLogin && onRegister) {
678
+ case 7:
679
+ login = _context5.v;
680
+ if (login.ok && (_login$data = login.data) !== null && _login$data !== void 0 && _login$data.token) {
681
+ if (onLogin) finishWithSession(login.data);else if (onRegister) onRegister(login.data);
682
+ } else if (onRegister) {
528
683
  onRegister(data);
529
684
  }
530
- case 5:
685
+ case 8:
531
686
  setFormData({
532
687
  phoneOrEmail: '',
533
688
  password: '',
@@ -538,9 +693,9 @@ var PowrLogin = function PowrLogin(_ref) {
538
693
  setOtp('');
539
694
  setFirebaseOtpSent(false);
540
695
  setFirebaseConfirm(null);
541
- _context4.n = 7;
696
+ _context5.n = 10;
542
697
  break;
543
- case 6:
698
+ case 9:
544
699
  if (data.message) {
545
700
  setError(data.message);
546
701
  } else if (data.error) {
@@ -554,24 +709,24 @@ var PowrLogin = function PowrLogin(_ref) {
554
709
  } else {
555
710
  setError("".concat(isLogin ? 'Login' : 'Registration', " failed. Please try again."));
556
711
  }
557
- case 7:
558
- _context4.n = 9;
712
+ case 10:
713
+ _context5.n = 12;
559
714
  break;
560
- case 8:
561
- _context4.p = 8;
562
- _t5 = _context4.v;
715
+ case 11:
716
+ _context5.p = 11;
717
+ _t6 = _context5.v;
563
718
  setError('Network error. Please try again.');
564
- case 9:
565
- _context4.p = 9;
719
+ case 12:
720
+ _context5.p = 12;
566
721
  setLoading(false);
567
- return _context4.f(9);
568
- case 10:
569
- return _context4.a(2);
722
+ return _context5.f(12);
723
+ case 13:
724
+ return _context5.a(2);
570
725
  }
571
- }, _callee4, null, [[1, 8, 9, 10]]);
726
+ }, _callee5, null, [[4, 11, 12, 13]]);
572
727
  }));
573
728
  return function handleSubmit(_x3) {
574
- return _ref6.apply(this, arguments);
729
+ return _ref7.apply(this, arguments);
575
730
  };
576
731
  }();
577
732
  var toggleMode = function toggleMode() {
@@ -631,26 +786,313 @@ var PowrLogin = function PowrLogin(_ref) {
631
786
  }
632
787
  setError('Your session timed out. Sign in again to add your phone number.');
633
788
  };
789
+ var smsMobile = function smsMobile() {
790
+ var digits = formData.phoneOrEmail.replace(/\D/g, '');
791
+ if (digits.length === 10) return digits;
792
+ if (digits.length === 12 && digits.startsWith('91')) return digits.slice(2);
793
+ if (digits.length === 11 && digits.startsWith('0')) return digits.slice(1);
794
+ return digits;
795
+ };
796
+ var hostOtp = /*#__PURE__*/function () {
797
+ var _ref8 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6(path, extra) {
798
+ var body, app, _yield$apiCall3, data, ok;
799
+ return _regenerator().w(function (_context6) {
800
+ while (1) switch (_context6.n) {
801
+ case 0:
802
+ body = _objectSpread({
803
+ mobile: smsMobile()
804
+ }, extra);
805
+ app = otpApp && String(otpApp).trim();
806
+ if (app) body.app = app;
807
+ _context6.n = 1;
808
+ return (0, _auth.apiCall)(apiUrl, path, projectId, {
809
+ method: 'POST',
810
+ body: body
811
+ });
812
+ case 1:
813
+ _yield$apiCall3 = _context6.v;
814
+ data = _yield$apiCall3.data;
815
+ ok = _yield$apiCall3.ok;
816
+ if (!(!ok || data.success === false)) {
817
+ _context6.n = 2;
818
+ break;
819
+ }
820
+ throw new Error(data.message || 'Could not complete the phone check');
821
+ case 2:
822
+ return _context6.a(2, data);
823
+ }
824
+ }, _callee6);
825
+ }));
826
+ return function hostOtp(_x4, _x5) {
827
+ return _ref8.apply(this, arguments);
828
+ };
829
+ }();
830
+ var handleSmsForgotStart = /*#__PURE__*/function () {
831
+ var _ref9 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee7() {
832
+ var _t7;
833
+ return _regenerator().w(function (_context7) {
834
+ while (1) switch (_context7.p = _context7.n) {
835
+ case 0:
836
+ if (!(resetChannel !== 'otp')) {
837
+ _context7.n = 1;
838
+ break;
839
+ }
840
+ return _context7.a(2);
841
+ case 1:
842
+ if (!(!isIndiaNumber() || smsMobile().length !== 10)) {
843
+ _context7.n = 2;
844
+ break;
845
+ }
846
+ setFieldErrors({
847
+ phoneOrEmail: 'SMS is for a 10-digit Indian mobile'
848
+ });
849
+ return _context7.a(2);
850
+ case 2:
851
+ setSmsOtp('');
852
+ setSmsResetStep('otp');
853
+ setOtpLoading(true);
854
+ setError('');
855
+ setSuccess('Sending a code…');
856
+ _context7.p = 3;
857
+ _context7.n = 4;
858
+ return hostOtp('/auth/send-otp');
859
+ case 4:
860
+ setSuccess('Code sent. Enter the 5-digit SMS.');
861
+ _context7.n = 6;
862
+ break;
863
+ case 5:
864
+ _context7.p = 5;
865
+ _t7 = _context7.v;
866
+ setSmsResetStep(null);
867
+ setSuccess('');
868
+ setError(_t7.message || 'Could not send the code.');
869
+ case 6:
870
+ _context7.p = 6;
871
+ setOtpLoading(false);
872
+ return _context7.f(6);
873
+ case 7:
874
+ return _context7.a(2);
875
+ }
876
+ }, _callee7, null, [[3, 5, 6, 7]]);
877
+ }));
878
+ return function handleSmsForgotStart() {
879
+ return _ref9.apply(this, arguments);
880
+ };
881
+ }();
882
+ var handleSmsVerify = /*#__PURE__*/function () {
883
+ var _ref0 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee8() {
884
+ var code, data, _t8;
885
+ return _regenerator().w(function (_context8) {
886
+ while (1) switch (_context8.p = _context8.n) {
887
+ case 0:
888
+ code = smsOtp.replace(/\D/g, '').slice(0, 5);
889
+ if (!(code.length !== 5)) {
890
+ _context8.n = 1;
891
+ break;
892
+ }
893
+ setError('Enter the 5-digit code.');
894
+ return _context8.a(2);
895
+ case 1:
896
+ setOtpLoading(true);
897
+ setError('');
898
+ _context8.p = 2;
899
+ _context8.n = 3;
900
+ return hostOtp('/auth/verify-otp', {
901
+ otp: code
902
+ });
903
+ case 3:
904
+ data = _context8.v;
905
+ setSmsVerifyAuth(data);
906
+ setSmsNewPassword('');
907
+ setSmsConfirmPassword('');
908
+ setSmsResetStep('password');
909
+ setSuccess(data.user ? 'Phone confirmed. Set a new password.' : 'Create a password. Next time you sign in with this number and password.');
910
+ _context8.n = 5;
911
+ break;
912
+ case 4:
913
+ _context8.p = 4;
914
+ _t8 = _context8.v;
915
+ setError(_t8.message || 'Could not verify the code.');
916
+ case 5:
917
+ _context8.p = 5;
918
+ setOtpLoading(false);
919
+ return _context8.f(5);
920
+ case 6:
921
+ return _context8.a(2);
922
+ }
923
+ }, _callee8, null, [[2, 4, 5, 6]]);
924
+ }));
925
+ return function handleSmsVerify() {
926
+ return _ref0.apply(this, arguments);
927
+ };
928
+ }();
929
+ var handleSmsSavePassword = /*#__PURE__*/function () {
930
+ var _ref1 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee0() {
931
+ var phoneOrEmail, resetExisting, registered, _registered$data, msg, login, _login$data2, _t9;
932
+ return _regenerator().w(function (_context0) {
933
+ while (1) switch (_context0.p = _context0.n) {
934
+ case 0:
935
+ if (!(smsNewPassword.length < 6)) {
936
+ _context0.n = 1;
937
+ break;
938
+ }
939
+ setError('Password must be at least 6 characters');
940
+ return _context0.a(2);
941
+ case 1:
942
+ if (!(smsNewPassword !== smsConfirmPassword)) {
943
+ _context0.n = 2;
944
+ break;
945
+ }
946
+ setError('Passwords do not match');
947
+ return _context0.a(2);
948
+ case 2:
949
+ phoneOrEmail = storedPhone() || formData.phoneOrEmail.trim();
950
+ setOtpLoading(true);
951
+ setError('');
952
+ _context0.p = 3;
953
+ resetExisting = /*#__PURE__*/function () {
954
+ var _ref10 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee9() {
955
+ var _forgot$data;
956
+ var forgot, _forgot$data2, reset, _reset$data;
957
+ return _regenerator().w(function (_context9) {
958
+ while (1) switch (_context9.n) {
959
+ case 0:
960
+ _context9.n = 1;
961
+ return (0, _auth.apiCall)(apiUrl, '/auth/forgot-password', projectId, {
962
+ method: 'POST',
963
+ body: {
964
+ phoneOrEmail: phoneOrEmail
965
+ }
966
+ });
967
+ case 1:
968
+ forgot = _context9.v;
969
+ if (!(!forgot.ok || !((_forgot$data = forgot.data) !== null && _forgot$data !== void 0 && _forgot$data.resetToken))) {
970
+ _context9.n = 2;
971
+ break;
972
+ }
973
+ throw new Error(((_forgot$data2 = forgot.data) === null || _forgot$data2 === void 0 ? void 0 : _forgot$data2.message) || 'Could not reset password.');
974
+ case 2:
975
+ _context9.n = 3;
976
+ return (0, _auth.apiCall)(apiUrl, '/auth/reset-password', projectId, {
977
+ method: 'POST',
978
+ body: {
979
+ resetToken: forgot.data.resetToken,
980
+ newPassword: smsNewPassword
981
+ }
982
+ });
983
+ case 3:
984
+ reset = _context9.v;
985
+ if (reset.ok) {
986
+ _context9.n = 4;
987
+ break;
988
+ }
989
+ throw new Error(((_reset$data = reset.data) === null || _reset$data === void 0 ? void 0 : _reset$data.message) || 'Could not save the new password.');
990
+ case 4:
991
+ return _context9.a(2);
992
+ }
993
+ }, _callee9);
994
+ }));
995
+ return function resetExisting() {
996
+ return _ref10.apply(this, arguments);
997
+ };
998
+ }();
999
+ if (!(smsVerifyAuth !== null && smsVerifyAuth !== void 0 && smsVerifyAuth.user)) {
1000
+ _context0.n = 5;
1001
+ break;
1002
+ }
1003
+ _context0.n = 4;
1004
+ return resetExisting();
1005
+ case 4:
1006
+ _context0.n = 9;
1007
+ break;
1008
+ case 5:
1009
+ _context0.n = 6;
1010
+ return (0, _auth.apiCall)(apiUrl, '/auth/register', projectId, {
1011
+ method: 'POST',
1012
+ body: {
1013
+ fullName: (formData.fullName || '').trim() || 'User',
1014
+ phoneOrEmail: phoneOrEmail,
1015
+ password: smsNewPassword
1016
+ }
1017
+ });
1018
+ case 6:
1019
+ registered = _context0.v;
1020
+ if (registered.ok) {
1021
+ _context0.n = 9;
1022
+ break;
1023
+ }
1024
+ msg = ((_registered$data = registered.data) === null || _registered$data === void 0 ? void 0 : _registered$data.message) || '';
1025
+ if (!/exist|already|registered/i.test(msg)) {
1026
+ _context0.n = 8;
1027
+ break;
1028
+ }
1029
+ _context0.n = 7;
1030
+ return resetExisting();
1031
+ case 7:
1032
+ _context0.n = 9;
1033
+ break;
1034
+ case 8:
1035
+ throw new Error(msg || 'Could not create the account.');
1036
+ case 9:
1037
+ _context0.n = 10;
1038
+ return (0, _auth.apiCall)(apiUrl, '/auth/login', projectId, {
1039
+ method: 'POST',
1040
+ body: {
1041
+ phoneOrEmail: phoneOrEmail,
1042
+ password: smsNewPassword
1043
+ }
1044
+ });
1045
+ case 10:
1046
+ login = _context0.v;
1047
+ if (login.ok) {
1048
+ _context0.n = 11;
1049
+ break;
1050
+ }
1051
+ throw new Error(((_login$data2 = login.data) === null || _login$data2 === void 0 ? void 0 : _login$data2.message) || 'Password saved. Sign in with it.');
1052
+ case 11:
1053
+ setSmsResetStep(null);
1054
+ setSmsVerifyAuth(null);
1055
+ setSuccess('Password saved.');
1056
+ finishWithSession(login.data);
1057
+ _context0.n = 13;
1058
+ break;
1059
+ case 12:
1060
+ _context0.p = 12;
1061
+ _t9 = _context0.v;
1062
+ setError(_t9.message || 'Could not reset password.');
1063
+ case 13:
1064
+ _context0.p = 13;
1065
+ setOtpLoading(false);
1066
+ return _context0.f(13);
1067
+ case 14:
1068
+ return _context0.a(2);
1069
+ }
1070
+ }, _callee0, null, [[3, 12, 13, 14]]);
1071
+ }));
1072
+ return function handleSmsSavePassword() {
1073
+ return _ref1.apply(this, arguments);
1074
+ };
1075
+ }();
634
1076
  var handleGetOtp = /*#__PURE__*/function () {
635
- var _ref7 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5() {
636
- var _yield$apiCall2, data, ok, _t6;
637
- return _regenerator().w(function (_context5) {
638
- while (1) switch (_context5.p = _context5.n) {
1077
+ var _ref11 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee1() {
1078
+ var _yield$apiCall4, data, ok, _t0;
1079
+ return _regenerator().w(function (_context1) {
1080
+ while (1) switch (_context1.p = _context1.n) {
639
1081
  case 0:
640
1082
  if (formData.phoneOrEmail.trim()) {
641
- _context5.n = 1;
1083
+ _context1.n = 1;
642
1084
  break;
643
1085
  }
644
1086
  setFieldErrors({
645
1087
  phoneOrEmail: 'Phone or email is required for OTP'
646
1088
  });
647
- return _context5.a(2);
1089
+ return _context1.a(2);
648
1090
  case 1:
649
1091
  setOtpLoading(true);
650
1092
  setError('');
651
1093
  setFieldErrors({});
652
- _context5.p = 2;
653
- _context5.n = 3;
1094
+ _context1.p = 2;
1095
+ _context1.n = 3;
654
1096
  return (0, _auth.apiCall)(apiUrl, "/auth/send-otp", projectId, {
655
1097
  method: 'POST',
656
1098
  body: {
@@ -658,9 +1100,9 @@ var PowrLogin = function PowrLogin(_ref) {
658
1100
  }
659
1101
  });
660
1102
  case 3:
661
- _yield$apiCall2 = _context5.v;
662
- data = _yield$apiCall2.data;
663
- ok = _yield$apiCall2.ok;
1103
+ _yield$apiCall4 = _context1.v;
1104
+ data = _yield$apiCall4.data;
1105
+ ok = _yield$apiCall4.ok;
664
1106
  if (ok) {
665
1107
  setOtpSent(true);
666
1108
  setSuccess('OTP sent successfully! Check your phone/email.');
@@ -668,23 +1110,23 @@ var PowrLogin = function PowrLogin(_ref) {
668
1110
  } else {
669
1111
  setError(data.message || 'Failed to send OTP. Please try again.');
670
1112
  }
671
- _context5.n = 5;
1113
+ _context1.n = 5;
672
1114
  break;
673
1115
  case 4:
674
- _context5.p = 4;
675
- _t6 = _context5.v;
1116
+ _context1.p = 4;
1117
+ _t0 = _context1.v;
676
1118
  setError('Network error. Please try again.');
677
1119
  case 5:
678
- _context5.p = 5;
1120
+ _context1.p = 5;
679
1121
  setOtpLoading(false);
680
- return _context5.f(5);
1122
+ return _context1.f(5);
681
1123
  case 6:
682
- return _context5.a(2);
1124
+ return _context1.a(2);
683
1125
  }
684
- }, _callee5, null, [[2, 4, 5, 6]]);
1126
+ }, _callee1, null, [[2, 4, 5, 6]]);
685
1127
  }));
686
1128
  return function handleGetOtp() {
687
- return _ref7.apply(this, arguments);
1129
+ return _ref11.apply(this, arguments);
688
1130
  };
689
1131
  }();
690
1132
  return /*#__PURE__*/_react["default"].createElement("div", {
@@ -705,17 +1147,20 @@ var PowrLogin = function PowrLogin(_ref) {
705
1147
  style: styles.subtitleContainer
706
1148
  }, /*#__PURE__*/_react["default"].createElement("p", {
707
1149
  style: styles.subtitle
708
- }, isLogin ? 'Sign in to your ' : 'Create your ', /*#__PURE__*/_react["default"].createElement("span", {
709
- style: styles.powrAccountText,
710
- onMouseEnter: function onMouseEnter() {
711
- return setShowTooltip(true);
1150
+ }, !isLogin ? 'Create your account' : loginGate === 'password' ? 'Enter your password.' : smsResetStep === 'otp' ? 'Enter the code we sent.' : loginGate === 'help' ? 'WhatsApp us to get in.' : smsResetStep === 'password' ? 'Set a password for next time.' : 'Enter your mobile number.'), showTooltip && /*#__PURE__*/_react["default"].createElement("div", {
1151
+ style: styles.tooltip
1152
+ }, "Secure authentication powered by Lawazia Tech"))), authView === 'add-name' && pendingAuth ? /*#__PURE__*/_react["default"].createElement(_profileNameStep.profileNameStep.Component, {
1153
+ ctx: {
1154
+ user: pendingAuth.user,
1155
+ token: pendingAuth.token,
1156
+ apiUrl: apiUrl,
1157
+ projectId: projectId,
1158
+ defaultCountry: resolvedDefaultCountry
712
1159
  },
713
- onMouseLeave: function onMouseLeave() {
714
- return setShowTooltip(false);
1160
+ onComplete: function onComplete(patch) {
1161
+ handleAddPhoneComplete(_objectSpread(_objectSpread({}, pendingAuth.user), patch), pendingAuth.token);
715
1162
  }
716
- }, "PowrAccount")), showTooltip && /*#__PURE__*/_react["default"].createElement("div", {
717
- style: styles.tooltip
718
- }, "Secure authentication powered by Lawazia Tech"))), authView === 'add-phone' && pendingAuth ? /*#__PURE__*/_react["default"].createElement(_AddPhonePanel["default"], {
1163
+ }) : authView === 'add-phone' && pendingAuth ? /*#__PURE__*/_react["default"].createElement(_AddPhonePanel["default"], {
719
1164
  apiUrl: apiUrl,
720
1165
  projectId: projectId,
721
1166
  pendingAuth: pendingAuth,
@@ -753,23 +1198,14 @@ var PowrLogin = function PowrLogin(_ref) {
753
1198
  }, /*#__PURE__*/_react["default"].createElement("label", {
754
1199
  htmlFor: "phoneOrEmail",
755
1200
  style: styles.label
756
- }, isLogin ? 'Phone or Email' : 'Phone Number'), !isLogin ? /*#__PURE__*/_react["default"].createElement(_PhoneInput["default"], {
1201
+ }, "Mobile"), /*#__PURE__*/_react["default"].createElement(_PhoneInput["default"], {
757
1202
  value: formData.phoneOrEmail,
758
1203
  country: phoneCountry,
759
1204
  onChange: handleRegisterPhoneChange,
760
- international: international,
1205
+ international: true,
761
1206
  allowedCountries: allowedCountries,
762
1207
  defaultCountry: resolvedDefaultCountry,
763
1208
  inputStyle: _objectSpread({}, fieldErrors.phoneOrEmail ? styles.inputError : {})
764
- }) : /*#__PURE__*/_react["default"].createElement("input", {
765
- type: "text",
766
- id: "phoneOrEmail",
767
- name: "phoneOrEmail",
768
- value: formData.phoneOrEmail,
769
- onChange: handlePhoneOrEmailChange,
770
- style: _objectSpread(_objectSpread({}, styles.input), fieldErrors.phoneOrEmail ? styles.inputError : {}),
771
- placeholder: "Phone (+country code) or email",
772
- required: true
773
1209
  }), fieldErrors.phoneOrEmail && /*#__PURE__*/_react["default"].createElement("div", {
774
1210
  style: styles.fieldError
775
1211
  }, fieldErrors.phoneOrEmail), !isLogin && requirePhoneVerification && /*#__PURE__*/_react["default"].createElement("div", {
@@ -787,7 +1223,7 @@ var PowrLogin = function PowrLogin(_ref) {
787
1223
  style: styles.successText
788
1224
  }, "Phone number verified successfully!"), /*#__PURE__*/_react["default"].createElement("div", {
789
1225
  id: "recaptcha-container"
790
- })), /*#__PURE__*/_react["default"].createElement("div", {
1226
+ })), (!isLogin || loginGate === 'password') && smsResetStep !== 'otp' && smsResetStep !== 'password' && /*#__PURE__*/_react["default"].createElement("div", {
791
1227
  style: styles.formGroup
792
1228
  }, /*#__PURE__*/_react["default"].createElement("label", {
793
1229
  htmlFor: "password",
@@ -867,27 +1303,78 @@ var PowrLogin = function PowrLogin(_ref) {
867
1303
  style: styles.checkboxText
868
1304
  }, "I agree to the Terms of Service and Privacy Policy")), fieldErrors.terms && /*#__PURE__*/_react["default"].createElement("div", {
869
1305
  style: styles.fieldError
870
- }, fieldErrors.terms)), isLogin && /*#__PURE__*/_react["default"].createElement("div", {
871
- style: styles.rememberSection
872
- }, /*#__PURE__*/_react["default"].createElement("label", {
873
- style: styles.checkboxLabel
874
- }, /*#__PURE__*/_react["default"].createElement("input", {
875
- type: "checkbox",
876
- style: styles.checkbox
877
- }), /*#__PURE__*/_react["default"].createElement("span", {
878
- style: styles.checkboxText
879
- }, "Remember me")), passwordResetHelpUrl ? /*#__PURE__*/_react["default"].createElement("a", {
1306
+ }, fieldErrors.terms)), isLogin && loginGate === 'help' && !smsResetStep && /*#__PURE__*/_react["default"].createElement("div", {
1307
+ style: styles.otpSection
1308
+ }, /*#__PURE__*/_react["default"].createElement("p", {
1309
+ style: styles.otpText
1310
+ }, "No password on this number yet. WhatsApp us to create an account or reset."), passwordResetHelpUrl ? /*#__PURE__*/_react["default"].createElement("a", {
880
1311
  href: passwordResetHelpUrl,
881
1312
  target: "_blank",
882
1313
  rel: "noopener noreferrer",
883
- style: styles.forgotPasswordLink
884
- }, passwordResetHelpLabel) : showForgotPassword ? /*#__PURE__*/_react["default"].createElement("button", {
1314
+ style: _objectSpread(_objectSpread({}, styles.otpButton), {}, {
1315
+ display: 'block',
1316
+ textAlign: 'center',
1317
+ textDecoration: 'none'
1318
+ })
1319
+ }, passwordResetHelpLabel) : /*#__PURE__*/_react["default"].createElement("p", {
1320
+ style: styles.otpText
1321
+ }, "WhatsApp the app\u2019s support number."), /*#__PURE__*/_react["default"].createElement("button", {
885
1322
  type: "button",
886
1323
  onClick: function onClick() {
887
- return setShowOtpOption(!showOtpOption);
1324
+ setLoginGate('password');
1325
+ setError('');
1326
+ setSuccess('');
888
1327
  },
889
1328
  style: styles.forgotPasswordLink
890
- }, "Forgot password?") : null), isLogin && !passwordResetHelpUrl && showForgotPassword && showOtpOption && /*#__PURE__*/_react["default"].createElement("div", {
1329
+ }, "I already have a password")), isLogin && resetChannel === 'otp' && smsResetStep === 'otp' && /*#__PURE__*/_react["default"].createElement("div", {
1330
+ style: styles.otpSection
1331
+ }, /*#__PURE__*/_react["default"].createElement("p", {
1332
+ style: styles.otpText
1333
+ }, otpLoading && success === 'Sending a code…' ? 'Sending a code to your phone…' : 'Enter the 5-digit code we sent to your phone.'), /*#__PURE__*/_react["default"].createElement("input", {
1334
+ type: "text",
1335
+ inputMode: "numeric",
1336
+ autoComplete: "one-time-code",
1337
+ value: smsOtp.replace(/\D/g, '').slice(0, 5),
1338
+ onChange: function onChange(e) {
1339
+ return setSmsOtp(e.target.value);
1340
+ },
1341
+ placeholder: "5-digit code",
1342
+ style: styles.input
1343
+ }), /*#__PURE__*/_react["default"].createElement("button", {
1344
+ type: "button",
1345
+ onClick: handleSmsVerify,
1346
+ disabled: otpLoading || smsOtp.replace(/\D/g, '').length !== 5,
1347
+ style: _objectSpread(_objectSpread({}, styles.otpButton), otpLoading ? styles.buttonDisabled : {})
1348
+ }, otpLoading ? 'Checking…' : 'Verify code')), isLogin && resetChannel === 'otp' && smsResetStep === 'password' && /*#__PURE__*/_react["default"].createElement("div", {
1349
+ style: styles.otpSection
1350
+ }, /*#__PURE__*/_react["default"].createElement("p", {
1351
+ style: styles.otpText
1352
+ }, smsVerifyAuth !== null && smsVerifyAuth !== void 0 && smsVerifyAuth.user ? 'Set a new password for this number.' : 'Create a password. Next time you sign in without SMS.'), /*#__PURE__*/_react["default"].createElement("input", {
1353
+ type: "password",
1354
+ autoComplete: "new-password",
1355
+ value: smsNewPassword,
1356
+ onChange: function onChange(e) {
1357
+ return setSmsNewPassword(e.target.value);
1358
+ },
1359
+ placeholder: "New password",
1360
+ style: _objectSpread(_objectSpread({}, styles.input), {}, {
1361
+ marginBottom: 8
1362
+ })
1363
+ }), /*#__PURE__*/_react["default"].createElement("input", {
1364
+ type: "password",
1365
+ autoComplete: "new-password",
1366
+ value: smsConfirmPassword,
1367
+ onChange: function onChange(e) {
1368
+ return setSmsConfirmPassword(e.target.value);
1369
+ },
1370
+ placeholder: "Confirm password",
1371
+ style: styles.input
1372
+ }), /*#__PURE__*/_react["default"].createElement("button", {
1373
+ type: "button",
1374
+ onClick: handleSmsSavePassword,
1375
+ disabled: otpLoading || smsNewPassword.length < 6,
1376
+ style: _objectSpread(_objectSpread({}, styles.otpButton), otpLoading ? styles.buttonDisabled : {})
1377
+ }, otpLoading ? 'Saving…' : 'Save password and sign in')), isLogin && resetChannel !== 'otp' && resetChannel !== 'whatsapp' && !passwordResetHelpUrl && showForgotPassword && showOtpOption && /*#__PURE__*/_react["default"].createElement("div", {
891
1378
  style: styles.otpSection
892
1379
  }, /*#__PURE__*/_react["default"].createElement("p", {
893
1380
  style: styles.otpText
@@ -902,33 +1389,32 @@ var PowrLogin = function PowrLogin(_ref) {
902
1389
  style: styles.errorMessage
903
1390
  }, error), success && /*#__PURE__*/_react["default"].createElement("div", {
904
1391
  style: styles.successMessage
905
- }, success), /*#__PURE__*/_react["default"].createElement("button", {
1392
+ }, success), !smsResetStep && loginGate !== 'help' && /*#__PURE__*/_react["default"].createElement("button", {
906
1393
  type: "submit",
907
- disabled: loading,
908
- style: _objectSpread(_objectSpread({}, styles.button), loading ? styles.buttonDisabled : {})
909
- }, loading ? /*#__PURE__*/_react["default"].createElement("div", {
1394
+ disabled: loading || otpLoading,
1395
+ style: _objectSpread(_objectSpread({}, styles.button), loading || otpLoading ? styles.buttonDisabled : {})
1396
+ }, loading || otpLoading ? /*#__PURE__*/_react["default"].createElement("div", {
910
1397
  style: _objectSpread(_objectSpread({}, styles.spinner), {}, {
911
1398
  animation: 'spin 1s linear infinite'
912
1399
  })
913
- }) : isLogin ? 'Sign In' : 'Sign Up')), /*#__PURE__*/_react["default"].createElement("div", {
914
- style: styles.navigationSection
915
- }, /*#__PURE__*/_react["default"].createElement("p", {
916
- style: styles.navigationText
917
- }, isLogin ? /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, "Don't have an account?", ' ', shouldShowToggle ? /*#__PURE__*/_react["default"].createElement("button", {
918
- type: "button",
919
- onClick: toggleMode,
920
- style: styles.navigationLink
921
- }, "Create one here") : /*#__PURE__*/_react["default"].createElement("a", {
922
- href: "/signup",
923
- style: styles.navigationLink
924
- }, "Create one here")) : /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, "Already have an account?", ' ', shouldShowToggle ? /*#__PURE__*/_react["default"].createElement("button", {
1400
+ }) : isLogin ? loginGate === 'password' ? 'Sign In' : 'Continue' : 'Sign Up'), isLogin && loginGate === 'password' && !smsResetStep && /*#__PURE__*/_react["default"].createElement("div", {
1401
+ style: {
1402
+ textAlign: 'center',
1403
+ marginTop: 12
1404
+ }
1405
+ }, resetChannel === 'otp' ? /*#__PURE__*/_react["default"].createElement("button", {
925
1406
  type: "button",
926
- onClick: toggleMode,
927
- style: styles.navigationLink
928
- }, "Sign in here") : /*#__PURE__*/_react["default"].createElement("a", {
929
- href: "/login",
930
- style: styles.navigationLink
931
- }, "Sign in here")))))), showOtpModal && /*#__PURE__*/_react["default"].createElement("div", {
1407
+ onClick: handleSmsForgotStart,
1408
+ disabled: otpLoading,
1409
+ style: styles.forgotPasswordLink
1410
+ }, otpLoading ? 'Sending a code…' : 'Forgot password? Get a code') : passwordResetHelpUrl ? /*#__PURE__*/_react["default"].createElement("a", {
1411
+ href: passwordResetHelpUrl,
1412
+ target: "_blank",
1413
+ rel: "noopener noreferrer",
1414
+ style: styles.forgotPasswordLink
1415
+ }, passwordResetHelpLabel) : /*#__PURE__*/_react["default"].createElement("span", {
1416
+ style: styles.forgotPasswordLink
1417
+ }, "Forgot password? WhatsApp us"))))), showOtpModal && /*#__PURE__*/_react["default"].createElement("div", {
932
1418
  style: styles.modalOverlay
933
1419
  }, /*#__PURE__*/_react["default"].createElement("div", {
934
1420
  style: styles.modalContent