@stokr/components-library 2.3.41-beta.23 → 2.3.41-beta.25

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.
@@ -97,15 +97,9 @@ var ForgotPasswordModal = /*#__PURE__*/function (_PureComponent) {
97
97
  var values = _ref.values,
98
98
  errors = _ref.errors,
99
99
  touched = _ref.touched,
100
- handleBlur = _ref.handleBlur,
101
- setFieldValue = _ref.setFieldValue,
102
- setFieldTouched = _ref.setFieldTouched;
103
- var onChangeWithTouch = function onChangeWithTouch(e) {
104
- var field = e.target;
105
- setFieldValue(field.name, field.value, false);
106
- setFieldTouched(field.name);
107
- };
108
- var submitDisabled = !touched.email || !!errors.email || isActionLoading === 'forgot';
100
+ handleChange = _ref.handleChange,
101
+ handleBlur = _ref.handleBlur;
102
+ var submitDisabled = !values.email || !!errors.email || isActionLoading === 'forgot';
109
103
  return /*#__PURE__*/_react.default.createElement(_Form.default, null, /*#__PURE__*/_react.default.createElement(_ComponentWrapper.default, {
110
104
  noPadding: true
111
105
  }, /*#__PURE__*/_react.default.createElement(_Form.FormField, null, /*#__PURE__*/_react.default.createElement(_Input.default, {
@@ -114,10 +108,12 @@ var ForgotPasswordModal = /*#__PURE__*/function (_PureComponent) {
114
108
  type: "email",
115
109
  label: "Your email",
116
110
  value: values.email,
117
- onChange: onChangeWithTouch,
118
- onBlur: handleBlur,
119
111
  error: !!errors.email,
120
- touched: !!touched.email
112
+ touched: !!touched.email,
113
+ onChange: handleChange,
114
+ onBlur: handleBlur,
115
+ validateOnChange: true,
116
+ validateOnBlur: true
121
117
  }), /*#__PURE__*/_react.default.createElement(_Form.FormError, {
122
118
  show: errors.email && touched.email
123
119
  }, errors.email))), /*#__PURE__*/_react.default.createElement(_ComponentWrapper.default, {
@@ -133,14 +129,7 @@ var ForgotPasswordModal = /*#__PURE__*/function (_PureComponent) {
133
129
  }, /*#__PURE__*/_react.default.createElement(_Form.FormError, {
134
130
  show: popupError.popup === 'forgot'
135
131
  }, popupError.message)));
136
- }) :
137
- /*#__PURE__*/
138
- // <ComponentWrapper paddingVeticalHalf noPaddingHorizontal>
139
- // <FormError show={popupSuccess.popup === 'forgot'}>
140
- // {popupSuccess.message}
141
- // </FormError>
142
- // </ComponentWrapper>
143
- _react.default.createElement(_Text.default, null, /*#__PURE__*/_react.default.createElement("br", null), /*#__PURE__*/_react.default.createElement("br", null), /*#__PURE__*/_react.default.createElement("p", null, popupSuccess.message))))));
132
+ }) : /*#__PURE__*/_react.default.createElement(_Text.default, null, /*#__PURE__*/_react.default.createElement("br", null), /*#__PURE__*/_react.default.createElement("br", null), /*#__PURE__*/_react.default.createElement("p", null, popupSuccess.message))))));
144
133
  }
145
134
  }]);
146
135
  return ForgotPasswordModal;
@@ -31,6 +31,29 @@ var _default = {
31
31
  type: 'function',
32
32
  action: 'onModalSwitch',
33
33
  required: true
34
+ },
35
+ isActionLoading: {
36
+ control: {
37
+ type: 'select',
38
+ options: [false, 'forgot']
39
+ },
40
+ description: 'Loading state for the form submission'
41
+ },
42
+ background: {
43
+ control: 'text',
44
+ description: 'Background style for the modal'
45
+ },
46
+ isResettingExpiredToken: {
47
+ control: 'boolean',
48
+ description: 'Changes modal content for expired token reset'
49
+ },
50
+ popupError: {
51
+ control: 'object',
52
+ description: 'Error object to display form errors'
53
+ },
54
+ popupSuccess: {
55
+ control: 'object',
56
+ description: 'Success object to display success messages'
34
57
  }
35
58
  }
36
59
  };
@@ -41,6 +64,10 @@ var Template = function Template(args) {
41
64
  var ForgotPasswordModalOverview = Template.bind({});
42
65
  exports.ForgotPasswordModalOverview = ForgotPasswordModalOverview;
43
66
  ForgotPasswordModalOverview.args = {
67
+ isModalOpen: true,
44
68
  popupError: {},
45
- popupSuccess: {}
69
+ popupSuccess: {},
70
+ isActionLoading: false,
71
+ background: '',
72
+ isResettingExpiredToken: false
46
73
  };
@@ -51,20 +51,29 @@ var Input = function Input(props) {
51
51
  (0, _react.useEffect)(function () {
52
52
  if (value && !labelUp) setLabelUp(true);
53
53
  }, [value, labelUp]);
54
- var onFocus = function onFocus(e, field) {
55
- var onFocus = props.onFocus;
56
- onFocus && onFocus(e, field);
57
- checkLabel(true);
58
- };
59
54
  var onBlur = function onBlur(e, field) {
60
55
  var onBlur = props.onBlur;
56
+
57
+ // formik handler MUST be called before our logic !
61
58
  onBlur && onBlur(e, field);
59
+
60
+ // our logic follows
62
61
  checkLabel(false);
63
62
  };
63
+ var onFocus = function onFocus(e, field) {
64
+ var onFocus = props.onFocus;
65
+
66
+ // formik handler MUST be called before our logic !
67
+ onFocus && onFocus(e, field);
68
+
69
+ // our logic follows
70
+ checkLabel(true);
71
+ };
64
72
  var onChange = function onChange(e, field) {
65
73
  var onChange = props.onChange;
66
- onChange && onChange(e, field);
74
+ onChange && onChange(e, field); // formik handler
67
75
  };
76
+
68
77
  var checkLabel = function checkLabel(focus) {
69
78
  setHasFocus(focus);
70
79
  setLabelUp(focus || !!value);
@@ -10,7 +10,6 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
10
10
  var _reactRouterDom = require("react-router-dom");
11
11
  var _formik = require("formik");
12
12
  var Yup = _interopRequireWildcard(require("yup"));
13
- var _formikPersist = require("formik-persist");
14
13
  var _Modal = require("../Modal/Modal");
15
14
  var _Form = _interopRequireWildcard(require("../Form/Form"));
16
15
  var _Text = _interopRequireDefault(require("../Text/Text.styles"));
@@ -34,20 +33,20 @@ var LoginModal = function LoginModal(props) {
34
33
  var _React$useState = _react.default.useState(),
35
34
  _React$useState2 = _slicedToArray(_React$useState, 2),
36
35
  email = _React$useState2[0],
37
- setemail = _React$useState2[1];
36
+ setEmail = _React$useState2[1];
38
37
  var location = (0, _reactRouterDom.useLocation)();
39
- var emailSetRef = _react.default.useRef(false);
40
38
  _react.default.useEffect(function () {
41
39
  //the URL will look like this: /login?email=some.email@email.com
42
40
  var search = location.search;
43
41
  var query = new URLSearchParams(search);
44
42
  var email = query.get('email');
45
43
  if (email) {
46
- setemail(email);
44
+ setEmail(email);
47
45
  }
48
46
  }, []);
49
47
  var validationSchema = Yup.object().shape({
50
- email: Yup.string().matches(_globalVariables.emailRegex, "Oops, that's not a valid address").required('Oops, this cant be blank')
48
+ email: Yup.string().matches(_globalVariables.emailRegex, "Oops, that's not a valid address").required("Oops, this can't be blank"),
49
+ password: Yup.string().min(6, 'Password must be at least 6 characters').required('Password is required')
51
50
  });
52
51
  var popupError = props.popupError,
53
52
  isModalOpen = props.isModalOpen,
@@ -77,9 +76,9 @@ var LoginModal = function LoginModal(props) {
77
76
  initialValues: {
78
77
  email: email || '',
79
78
  password: ''
80
- }
81
- // initialTouched={{ email: false, password: false }}
82
- ,
79
+ },
80
+ validateOnChange: true,
81
+ validateOnBlur: true,
83
82
  validationSchema: validationSchema,
84
83
  onSubmit: function onSubmit(values) {
85
84
  onFormSend(values);
@@ -89,26 +88,8 @@ var LoginModal = function LoginModal(props) {
89
88
  errors = _ref.errors,
90
89
  touched = _ref.touched,
91
90
  handleChange = _ref.handleChange,
92
- handleBlur = _ref.handleBlur,
93
- setFieldValue = _ref.setFieldValue,
94
- setFieldTouched = _ref.setFieldTouched,
95
- setErrors = _ref.setErrors;
96
- var onChangeWithTouch = function onChangeWithTouch(e) {
97
- var field = e.target;
98
- setFieldValue(field.name, field.value, false);
99
- setFieldTouched(field.name);
100
- };
101
- if (email && values.email !== email && !emailSetRef.current) {
102
- setFieldValue('email', email);
103
- emailSetRef.current = true;
104
- }
105
-
106
- //hack to avoid error when autofill from browser
107
- if (values.password && errors.password && values.email && !errors.email) {
108
- setErrors({});
109
- setFieldValue('password', values.password, false);
110
- }
111
- var submitDisabled = !touched.email || !touched.password || !!errors.email || !!errors.password || isActionLoading === 'login';
91
+ handleBlur = _ref.handleBlur;
92
+ var submitDisabled = !values.email || !values.password || !!errors.email || !!errors.password || isActionLoading === 'login';
112
93
  return /*#__PURE__*/_react.default.createElement(_Form.default, null, /*#__PURE__*/_react.default.createElement(_ComponentWrapper.default, {
113
94
  noPadding: true
114
95
  }, /*#__PURE__*/_react.default.createElement(_Form.FormField, null, /*#__PURE__*/_react.default.createElement(_Input.default, {
@@ -117,7 +98,7 @@ var LoginModal = function LoginModal(props) {
117
98
  type: "email",
118
99
  label: "Your email",
119
100
  value: values.email,
120
- onChange: onChangeWithTouch,
101
+ onChange: handleChange,
121
102
  onBlur: handleBlur,
122
103
  error: !!errors.email,
123
104
  touched: !!touched.email
@@ -132,7 +113,7 @@ var LoginModal = function LoginModal(props) {
132
113
  type: "password",
133
114
  label: "Password",
134
115
  value: values.password,
135
- onChange: onChangeWithTouch,
116
+ onChange: handleChange,
136
117
  onBlur: handleBlur,
137
118
  error: !!errors.password,
138
119
  touched: !!touched.password
@@ -13,37 +13,35 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
13
13
  var _default = {
14
14
  title: 'Components Library/LoginModal',
15
15
  component: _LoginModal.default,
16
+ parameters: {
17
+ layout: 'fullscreen'
18
+ },
16
19
  argTypes: {
17
20
  popupError: {
18
- type: 'object',
19
- defaultValue: {
20
- message: null,
21
- popup: null
22
- },
23
- required: true
21
+ control: 'object'
24
22
  },
25
23
  isActionLoading: {
26
- type: 'boolean',
27
- defaultValue: false
24
+ control: {
25
+ type: 'select'
26
+ },
27
+ options: [false, 'login']
28
28
  },
29
29
  isModalOpen: {
30
- type: 'boolean',
31
- defaultValue: true
30
+ control: 'boolean'
31
+ },
32
+ background: {
33
+ control: 'text'
32
34
  },
33
35
  onFormSend: {
34
- type: 'function',
35
36
  action: 'onFormSend'
36
37
  },
37
38
  onModalSwitch: {
38
- type: 'function',
39
39
  action: 'onModalSwitch'
40
40
  },
41
41
  onForgotPassword: {
42
- type: 'function',
43
42
  action: 'onForgotPassword'
44
43
  },
45
44
  onModalClose: {
46
- type: 'function',
47
45
  action: 'onModalClose'
48
46
  }
49
47
  }
@@ -55,6 +53,7 @@ var Template = function Template(args) {
55
53
  var LoginModalOpen = Template.bind({});
56
54
  exports.LoginModalOpen = LoginModalOpen;
57
55
  LoginModalOpen.args = {
56
+ isModalOpen: true,
58
57
  popupError: {
59
58
  message: null,
60
59
  popup: null
@@ -74,5 +73,6 @@ LoginModalOpen.args = {
74
73
  },
75
74
  onForgotPassword: function onForgotPassword(data) {
76
75
  console.log('forgot password');
77
- }
76
+ },
77
+ isActionLoading: false
78
78
  };
@@ -211,7 +211,7 @@ var RegisterModal = function RegisterModal(props) {
211
211
  handleChange(e);
212
212
  }
213
213
  };
214
- var submitDisabled = !!errors.email || !!errors.terms || values.password.length <= 5 || isActionLoading === 'signUp' || popupError.popup === 'register';
214
+ var submitDisabled = !values.email || !!errors.email || !!errors.terms || values.password.length <= 5 || isActionLoading === 'signUp' || popupError.popup === 'register';
215
215
  return /*#__PURE__*/_react.default.createElement(_Form.default, null, /*#__PURE__*/_react.default.createElement(_ComponentWrapper.default, {
216
216
  noPadding: true
217
217
  }, /*#__PURE__*/_react.default.createElement(_Form.FormField, null, /*#__PURE__*/_react.default.createElement(_Input.default, {
@@ -243,16 +243,9 @@ var RegisterModal = function RegisterModal(props) {
243
243
  error: !!errors.password,
244
244
  touched: !!touched.password,
245
245
  info: "For a stronger password, try a mix of lowercase, capitals, numbers and special characters."
246
- // showStrength
247
246
  }), /*#__PURE__*/_react.default.createElement(_Form.FormError, {
248
247
  show: errors.password && touched.password
249
- }, errors.password), /*#__PURE__*/_react.default.createElement(_Form.FormError
250
- // show={
251
- // !errors.password &&
252
- // touched.password &&
253
- // passwordStrengthMeter(values.password) !== 5
254
- // }
255
- , {
248
+ }, errors.password), /*#__PURE__*/_react.default.createElement(_Form.FormError, {
256
249
  show: !errors.password && touched.password && values.password.length <= 5
257
250
  }, "The password must be at least 6 characters long"))), /*#__PURE__*/_react.default.createElement(_ComponentWrapper.default, {
258
251
  noPaddingBottom: true,
@@ -100,6 +100,8 @@ var RenderErrorModal = function RenderErrorModal(props) {
100
100
  email: userEmail || ''
101
101
  },
102
102
  validationSchema: validationSchema,
103
+ validateOnBlur: true,
104
+ validateOnChange: true,
103
105
  onSubmit: function onSubmit(values) {
104
106
  startCooldown();
105
107
  onResend(values);
@@ -109,14 +111,8 @@ var RenderErrorModal = function RenderErrorModal(props) {
109
111
  errors = _ref2.errors,
110
112
  touched = _ref2.touched,
111
113
  handleBlur = _ref2.handleBlur,
112
- setFieldValue = _ref2.setFieldValue,
113
- setFieldTouched = _ref2.setFieldTouched;
114
- var onChangeWithTouch = function onChangeWithTouch(e) {
115
- var field = e.target;
116
- setFieldValue(field.name, field.value, false);
117
- setFieldTouched(field.name);
118
- };
119
- var submitDisabled = !touched.email || !!errors.email || isDisabled || isActionLoading === 'resend';
114
+ handleChange = _ref2.handleChange;
115
+ var submitDisabled = !values.email || !!errors.email || isDisabled || isActionLoading === 'resend';
120
116
  return /*#__PURE__*/_react.default.createElement(_Form2.default, null, /*#__PURE__*/_react.default.createElement(_ComponentWrapper.default, {
121
117
  noPadding: true
122
118
  }, /*#__PURE__*/_react.default.createElement(_Form.FormField, null, /*#__PURE__*/_react.default.createElement(_Input.default, {
@@ -125,7 +121,7 @@ var RenderErrorModal = function RenderErrorModal(props) {
125
121
  type: "email",
126
122
  label: "Your email",
127
123
  value: values.email,
128
- onChange: onChangeWithTouch,
124
+ onChange: handleChange,
129
125
  onBlur: handleBlur,
130
126
  error: !!errors.email,
131
127
  touched: !!touched.email
@@ -135,9 +131,7 @@ var RenderErrorModal = function RenderErrorModal(props) {
135
131
  noPaddingBottom: true,
136
132
  noPaddingHorizontal: true
137
133
  }, /*#__PURE__*/_react.default.createElement(_Button.default, {
138
- type: "submit"
139
- //fluid
140
- ,
134
+ type: "submit",
141
135
  disabled: submitDisabled
142
136
  }, isActionLoading === 'resend' ? 'Resending email' : 'Resend email')), /*#__PURE__*/_react.default.createElement(_ComponentWrapper.default, {
143
137
  paddingVeticalHalf: true,
@@ -646,6 +646,12 @@ var HeaderHoClass = /*#__PURE__*/function (_Component) {
646
646
  _this2.clearPopupError();
647
647
  _this2.clearPopupSuccess();
648
648
  _this2.setIsActionLoading(undefined);
649
+
650
+ // if we are in the expired token reset flow, we
651
+ // also need to close the reset password modal
652
+ if (isResettingExpiredToken) {
653
+ _this2.setOpenModalStatus('resetPassword', false);
654
+ }
649
655
  },
650
656
  onModalSwitch: function onModalSwitch() {
651
657
  _this2.switchOpenModal('forgot', 'login');
@@ -699,6 +705,11 @@ var HeaderHoClass = /*#__PURE__*/function (_Component) {
699
705
  popupError: this.state.popupError,
700
706
  isModalOpen: isModalOpen.resetPassword,
701
707
  onModalClose: function onModalClose() {
708
+ // clean up URL params
709
+ var url = new URL(window.location);
710
+ url.searchParams.delete('oobCode');
711
+ url.searchParams.delete('mode');
712
+ window.history.replaceState({}, '', url.toString());
702
713
  _this2.setOpenModalStatus('resetPassword', false);
703
714
  _this2.clearPopupError();
704
715
  _this2.setIsActionLoading(undefined);
@@ -743,7 +754,7 @@ var HeaderHoClass = /*#__PURE__*/function (_Component) {
743
754
  };
744
755
  }(),
745
756
  onLoad: /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7() {
746
- var location, query, oobCode;
757
+ var location, query, oobCode, url;
747
758
  return _regeneratorRuntime().wrap(function _callee7$(_context7) {
748
759
  while (1) switch (_context7.prev = _context7.next) {
749
760
  case 0:
@@ -773,11 +784,17 @@ var HeaderHoClass = /*#__PURE__*/function (_Component) {
773
784
  });
774
785
  });
775
786
 
787
+ // before switching to Forgot Password modal, we need to clean up
788
+ // the URL parameters that keep the reset password modal open.
789
+ url = new URL(window.location);
790
+ url.searchParams.delete('oobCode');
791
+ url.searchParams.delete('mode');
792
+ window.history.replaceState({}, '', url.toString());
793
+
776
794
  // we use a special version of Forgot Password modal
777
795
  // adjusted to handle and resend expired tokens.
778
796
  // isResettingExpiredToken makes it adjust.
779
797
  _this2.switchOpenModal('resetPassword', 'forgot');
780
- _this2.setPopupError('forgot', 'This password reset link has expired or is invalid. Please request a new one.');
781
798
  } else {
782
799
  _this2.setPopupError('resetPassword', 'Something went wrong with the password reset link. Please try again.');
783
800
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stokr/components-library",
3
- "version": "2.3.41-beta.23",
3
+ "version": "2.3.41-beta.25",
4
4
  "description": "STOKR - Components Library",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",