@telefonica/mistica 10.20.0 → 10.21.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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,16 @@
1
+ # [10.21.0](https://github.com/Telefonica/mistica-web/compare/v10.20.0...v10.21.0) (2022-01-27)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **ButtonLayout:** missed button press in button layout when gaining focus ([#396](https://github.com/Telefonica/mistica-web/issues/396)) ([9f3bba5](https://github.com/Telefonica/mistica-web/commit/9f3bba57affeac7b89c7dc831d00ce4ef33cdb5f))
7
+ * **ButtonLayout:** unstable in acceptance tests ([#404](https://github.com/Telefonica/mistica-web/issues/404)) ([11d4772](https://github.com/Telefonica/mistica-web/commit/11d4772c49d5f35bfcfa4ead6826782eccde5a18))
8
+
9
+
10
+ ### Features
11
+
12
+ * **Touchable:** WEB-435 add hrefDecorator to theme ([#401](https://github.com/Telefonica/mistica-web/issues/401)) ([21a45ee](https://github.com/Telefonica/mistica-web/commit/21a45ee84259af4ccca2a5adf2a7242b442d2874))
13
+
1
14
  # [10.20.0](https://github.com/Telefonica/mistica-web/compare/v10.19.0...v10.20.0) (2022-01-24)
2
15
 
3
16
 
@@ -9,6 +9,7 @@ var _jss = require("./jss");
9
9
  var _hooks = require("./hooks");
10
10
  var _button = require("./button");
11
11
  var _classnames = _interopRequireDefault(require("classnames"));
12
+ var _debounce = _interopRequireDefault(require("lodash/debounce"));
12
13
  function _interopRequireDefault(obj) {
13
14
  return obj && obj.__esModule ? obj : {
14
15
  default: obj
@@ -207,28 +208,29 @@ var buttonsRange = [
207
208
  var ButtonLayout = function ButtonLayout(param) {
208
209
  var children = param.children, _align = param.align, align = _align === void 0 ? 'full-width' : _align, link = param.link, _withMargins = param.withMargins, withMargins = _withMargins === void 0 ? false : _withMargins;
209
210
  var ref = (0, _hooks).useScreenSize(), isTabletOrSmaller = ref.isTabletOrSmaller;
210
- var ref1 = _slicedToArray(React.useState(true), 2), isMeasuring = ref1[0], setIsMeasuring = ref1[1];
211
211
  var childrenCount = React.Children.count(children);
212
- var ref2 = _slicedToArray(React.useState(0), 2), buttonWidth = ref2[0], setButtonWidth = ref2[1];
213
- var updateButtonWidth = function updateButtonWidth(buttonWidth) {
212
+ var ref1 = _slicedToArray(React.useState({
213
+ isMeasuring: true,
214
+ buttonWidth: 0
215
+ }), 2), buttonStatus = ref1[0], setButtonStatus = ref1[1];
216
+ var updateButtonStatus = function updateButtonStatus(param) {
217
+ var isMeasuring = param.isMeasuring, buttonWidth = param.buttonWidth;
214
218
  if (process.env.NODE_ENV !== 'test') {
215
- setButtonWidth(buttonWidth);
216
- }
217
- };
218
- var updateIsMeasuring = function updateIsMeasuring(isMeasuring) {
219
- if (process.env.NODE_ENV !== 'test') {
220
- setIsMeasuring(isMeasuring);
219
+ setButtonStatus({
220
+ isMeasuring: isMeasuring,
221
+ buttonWidth: buttonWidth
222
+ });
221
223
  }
222
224
  };
223
225
  var classes = useStyles({
224
- buttonWidth: buttonWidth,
226
+ buttonWidth: buttonStatus.buttonWidth,
225
227
  isTabletOrSmaller: isTabletOrSmaller,
226
228
  align: align,
227
229
  childrenCount: childrenCount
228
230
  });
229
231
  var wrapperElRef = React.useRef(null);
230
232
  (0, _hooks).useIsomorphicLayoutEffect(function() {
231
- if (isMeasuring) {
233
+ if (buttonStatus.isMeasuring) {
232
234
  var req = window.requestAnimationFrame(function() {
233
235
  if (wrapperElRef.current) {
234
236
  var childrenWidths = Array.from(wrapperElRef.current.children).map(function(el) {
@@ -243,8 +245,10 @@ var ButtonLayout = function ButtonLayout(param) {
243
245
  var maxChildWidth = Math.ceil((_Math = Math).max.apply(_Math, _toConsumableArray(childrenWidths).concat([
244
246
  _button.BUTTON_MIN_WIDTH
245
247
  ])));
246
- updateButtonWidth(maxChildWidth);
247
- updateIsMeasuring(false);
248
+ updateButtonStatus({
249
+ isMeasuring: false,
250
+ buttonWidth: maxChildWidth
251
+ });
248
252
  }
249
253
  });
250
254
  return function() {
@@ -255,11 +259,18 @@ var ButtonLayout = function ButtonLayout(param) {
255
259
  };
256
260
  }, [
257
261
  classes.link,
258
- isMeasuring
262
+ buttonStatus
259
263
  ]);
260
- var calcLayout = React.useCallback(function() {
261
- updateButtonWidth(0);
262
- updateIsMeasuring(true);
264
+ /**
265
+ * Multiple calls to calcLayout are debounced to workaround an issue that can be reproduced in chrome when pressing
266
+ * the button during a focus/visibility change. For example, pressing the button having the focus on the devTools.
267
+ */ var calcLayout = React.useMemo(function() {
268
+ return (0, _debounce).default(function() {
269
+ updateButtonStatus({
270
+ isMeasuring: true,
271
+ buttonWidth: 0
272
+ });
273
+ }, 50);
263
274
  }, []);
264
275
  useOnChildrenChangeEffect(wrapperElRef.current, calcLayout);
265
276
  useOnFontsReadyEffect(calcLayout);
@@ -3,5 +3,5 @@ Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
5
  exports.PACKAGE_VERSION = void 0;
6
- var PACKAGE_VERSION = '10.20.0';
6
+ var PACKAGE_VERSION = '10.21.0';
7
7
  exports.PACKAGE_VERSION = PACKAGE_VERSION;
@@ -148,6 +148,11 @@ var generateId = function() {
148
148
  // in frontend, use the same generator for all JssProvider renders, this way we avoid classname collisions
149
149
  return (0, _jss).createGenerateId();
150
150
  }();
151
+ var useDefaultHrefDecorator = function useDefaultHrefDecorator() {
152
+ return function(href) {
153
+ return href;
154
+ };
155
+ };
151
156
  var ThemeContextProvider = function ThemeContextProvider(param) {
152
157
  var theme = param.theme, children = param.children;
153
158
  var classNamePrefix = React.useMemo(// we'll have missmatches when rendering client side. The disadvantage of this is that we can only have one instance of
@@ -173,7 +178,7 @@ var ThemeContextProvider = function ThemeContextProvider(param) {
173
178
  platform: (0, _platform).getPlatform(),
174
179
  insideNovumNativeApp: (0, _platform).isInsideNovumNativeApp()
175
180
  }, theme.platformOverrides);
176
- var _mediaQueries1, _Link;
181
+ var _mediaQueries1, _Link, _useHrefDecorator;
177
182
  return {
178
183
  skinName: theme.skin.name,
179
184
  i18n: theme.i18n,
@@ -191,7 +196,8 @@ var ThemeContextProvider = function ThemeContextProvider(param) {
191
196
  colors: colors,
192
197
  Link: (_Link = theme.Link) !== null && _Link !== void 0 ? _Link : _theme.AnchorLink,
193
198
  isDarkMode: isDarkModeEnabled,
194
- isIos: (0, _platform).getPlatform(platformOverrides) === 'ios'
199
+ isIos: (0, _platform).getPlatform(platformOverrides) === 'ios',
200
+ useHrefDecorator: (_useHrefDecorator = theme.useHrefDecorator) !== null && _useHrefDecorator !== void 0 ? _useHrefDecorator : useDefaultHrefDecorator
195
201
  };
196
202
  }, [
197
203
  theme,
package/dist/theme.d.ts CHANGED
@@ -98,6 +98,7 @@ export declare type ThemeConfig = {
98
98
  desktopOrTabletMinHeight: number;
99
99
  };
100
100
  Link?: LinkComponent;
101
+ useHrefDecorator?: () => (href: string) => string;
101
102
  enableTabFocus?: boolean;
102
103
  };
103
104
  export declare type Theme = {
@@ -132,5 +133,6 @@ export declare type Theme = {
132
133
  Link: LinkComponent;
133
134
  isDarkMode: boolean;
134
135
  isIos: boolean;
136
+ useHrefDecorator: () => (href: string) => string;
135
137
  };
136
138
  export {};
@@ -102,6 +102,7 @@ export type ThemeConfig = {
102
102
  desktopOrTabletMinHeight: number,
103
103
  },
104
104
  Link?: LinkComponent,
105
+ useHrefDecorator?: () => (href: string) => string,
105
106
  enableTabFocus?: boolean,
106
107
  };
107
108
  export type Theme = {
@@ -136,6 +137,7 @@ export type Theme = {
136
137
  Link: LinkComponent,
137
138
  isDarkMode: boolean,
138
139
  isIos: boolean,
140
+ useHrefDecorator: () => (href: string) => string,
139
141
  };
140
142
  declare export {};
141
143
 
package/dist/touchable.js CHANGED
@@ -114,7 +114,8 @@ var useStyles = (0, _jss).createUseStyles(function() {
114
114
  };
115
115
  });
116
116
  var Touchable = /*#__PURE__*/ React.forwardRef(function(props, ref) {
117
- var ref1 = (0, _hooks).useTheme(), texts = ref1.texts, analytics = ref1.analytics, platformOverrides = ref1.platformOverrides, Link = ref1.Link;
117
+ var ref1 = (0, _hooks).useTheme(), texts = ref1.texts, analytics = ref1.analytics, platformOverrides = ref1.platformOverrides, Link = ref1.Link, useHrefDecorator = ref1.useHrefDecorator;
118
+ var hrefDecorator = useHrefDecorator();
118
119
  var classes = useStyles();
119
120
  var isClicked = React.useRef(false);
120
121
  var trackingEvents = [];
@@ -150,7 +151,7 @@ var Touchable = /*#__PURE__*/ React.forwardRef(function(props, ref) {
150
151
  };
151
152
  var getHref = function getHref() {
152
153
  if (props.href) {
153
- return props.href;
154
+ return hrefDecorator(props.href);
154
155
  }
155
156
  if (props.to && props.fullPageOnWebView) {
156
157
  if (typeof props.to === 'string') {
@@ -4,6 +4,7 @@ import { createUseStyles } from './jss';
4
4
  import { useScreenSize, useIsomorphicLayoutEffect } from './hooks';
5
5
  import { BUTTON_MIN_WIDTH, ButtonPrimary, ButtonSecondary, ButtonDanger } from './button';
6
6
  import classNames from 'classnames';
7
+ import debounce from 'lodash/debounce';
7
8
  function _arrayWithHoles(arr) {
8
9
  if (Array.isArray(arr)) return arr;
9
10
  }
@@ -174,28 +175,29 @@ var buttonsRange = [
174
175
  var ButtonLayout = function(param) {
175
176
  var children = param.children, _align = param.align, align = _align === void 0 ? 'full-width' : _align, link = param.link, _withMargins = param.withMargins, withMargins = _withMargins === void 0 ? false : _withMargins;
176
177
  var ref = useScreenSize(), isTabletOrSmaller = ref.isTabletOrSmaller;
177
- var ref1 = _slicedToArray(React.useState(true), 2), isMeasuring = ref1[0], setIsMeasuring = ref1[1];
178
178
  var childrenCount = React.Children.count(children);
179
- var ref2 = _slicedToArray(React.useState(0), 2), buttonWidth = ref2[0], setButtonWidth = ref2[1];
180
- var updateButtonWidth = function(buttonWidth) {
179
+ var ref1 = _slicedToArray(React.useState({
180
+ isMeasuring: true,
181
+ buttonWidth: 0
182
+ }), 2), buttonStatus = ref1[0], setButtonStatus = ref1[1];
183
+ var updateButtonStatus = function(param) {
184
+ var isMeasuring = param.isMeasuring, buttonWidth = param.buttonWidth;
181
185
  if (process.env.NODE_ENV !== 'test') {
182
- setButtonWidth(buttonWidth);
183
- }
184
- };
185
- var updateIsMeasuring = function(isMeasuring) {
186
- if (process.env.NODE_ENV !== 'test') {
187
- setIsMeasuring(isMeasuring);
186
+ setButtonStatus({
187
+ isMeasuring: isMeasuring,
188
+ buttonWidth: buttonWidth
189
+ });
188
190
  }
189
191
  };
190
192
  var classes = useStyles({
191
- buttonWidth: buttonWidth,
193
+ buttonWidth: buttonStatus.buttonWidth,
192
194
  isTabletOrSmaller: isTabletOrSmaller,
193
195
  align: align,
194
196
  childrenCount: childrenCount
195
197
  });
196
198
  var wrapperElRef = React.useRef(null);
197
199
  useIsomorphicLayoutEffect(function() {
198
- if (isMeasuring) {
200
+ if (buttonStatus.isMeasuring) {
199
201
  var req = window.requestAnimationFrame(function() {
200
202
  if (wrapperElRef.current) {
201
203
  var childrenWidths = Array.from(wrapperElRef.current.children).map(function(el) {
@@ -210,8 +212,10 @@ var ButtonLayout = function(param) {
210
212
  var maxChildWidth = Math.ceil((_Math = Math).max.apply(_Math, _toConsumableArray(childrenWidths).concat([
211
213
  BUTTON_MIN_WIDTH
212
214
  ])));
213
- updateButtonWidth(maxChildWidth);
214
- updateIsMeasuring(false);
215
+ updateButtonStatus({
216
+ isMeasuring: false,
217
+ buttonWidth: maxChildWidth
218
+ });
215
219
  }
216
220
  });
217
221
  return function() {
@@ -222,11 +226,18 @@ var ButtonLayout = function(param) {
222
226
  };
223
227
  }, [
224
228
  classes.link,
225
- isMeasuring
229
+ buttonStatus
226
230
  ]);
227
- var calcLayout = React.useCallback(function() {
228
- updateButtonWidth(0);
229
- updateIsMeasuring(true);
231
+ /**
232
+ * Multiple calls to calcLayout are debounced to workaround an issue that can be reproduced in chrome when pressing
233
+ * the button during a focus/visibility change. For example, pressing the button having the focus on the devTools.
234
+ */ var calcLayout = React.useMemo(function() {
235
+ return debounce(function() {
236
+ updateButtonStatus({
237
+ isMeasuring: true,
238
+ buttonWidth: 0
239
+ });
240
+ }, 50);
230
241
  }, []);
231
242
  useOnChildrenChangeEffect(wrapperElRef.current, calcLayout);
232
243
  useOnFontsReadyEffect(calcLayout);
@@ -1,2 +1,2 @@
1
1
  // DO NOT EDIT THIS FILE. It's autogenerated by set-version.js
2
- export var PACKAGE_VERSION = '10.20.0';
2
+ export var PACKAGE_VERSION = '10.21.0';
@@ -113,6 +113,11 @@ var generateId = function() {
113
113
  // in frontend, use the same generator for all JssProvider renders, this way we avoid classname collisions
114
114
  return createGenerateId();
115
115
  }();
116
+ var useDefaultHrefDecorator = function() {
117
+ return function(href) {
118
+ return href;
119
+ };
120
+ };
116
121
  var ThemeContextProvider = function(param) {
117
122
  var theme = param.theme, children = param.children;
118
123
  var classNamePrefix = React.useMemo(// Always start the counter in 0 in server side, otherwise every new request to the server will inclrement the counter and
@@ -139,7 +144,7 @@ var ThemeContextProvider = function(param) {
139
144
  platform: getPlatform(),
140
145
  insideNovumNativeApp: isInsideNovumNativeApp()
141
146
  }, theme.platformOverrides);
142
- var _mediaQueries, _Link;
147
+ var _mediaQueries, _Link, _useHrefDecorator;
143
148
  return {
144
149
  skinName: theme.skin.name,
145
150
  i18n: theme.i18n,
@@ -157,7 +162,8 @@ var ThemeContextProvider = function(param) {
157
162
  colors: colors,
158
163
  Link: (_Link = theme.Link) !== null && _Link !== void 0 ? _Link : AnchorLink,
159
164
  isDarkMode: isDarkModeEnabled,
160
- isIos: getPlatform(platformOverrides) === 'ios'
165
+ isIos: getPlatform(platformOverrides) === 'ios',
166
+ useHrefDecorator: (_useHrefDecorator = theme.useHrefDecorator) !== null && _useHrefDecorator !== void 0 ? _useHrefDecorator : useDefaultHrefDecorator
161
167
  };
162
168
  }, [
163
169
  theme,
@@ -80,7 +80,8 @@ var useStyles = createUseStyles(function() {
80
80
  };
81
81
  });
82
82
  var Touchable = /*#__PURE__*/ React.forwardRef(function(props, ref) {
83
- var ref1 = useTheme(), texts = ref1.texts, analytics = ref1.analytics, platformOverrides = ref1.platformOverrides, Link = ref1.Link;
83
+ var ref1 = useTheme(), texts = ref1.texts, analytics = ref1.analytics, platformOverrides = ref1.platformOverrides, Link = ref1.Link, useHrefDecorator = ref1.useHrefDecorator;
84
+ var hrefDecorator = useHrefDecorator();
84
85
  var classes = useStyles();
85
86
  var isClicked = React.useRef(false);
86
87
  var trackingEvents = [];
@@ -116,7 +117,7 @@ var Touchable = /*#__PURE__*/ React.forwardRef(function(props, ref) {
116
117
  };
117
118
  var getHref = function() {
118
119
  if (props.href) {
119
- return props.href;
120
+ return hrefDecorator(props.href);
120
121
  }
121
122
  if (props.to && props.fullPageOnWebView) {
122
123
  if (typeof props.to === 'string') {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@telefonica/mistica",
3
- "version": "10.20.0",
3
+ "version": "10.21.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",