@telus-uds/components-base 1.87.0 → 1.88.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,12 +1,26 @@
1
1
  # Change Log - @telus-uds/components-base
2
2
 
3
- This log was last generated on Mon, 24 Jun 2024 16:19:28 GMT and should not be manually modified.
3
+ This log was last generated on Thu, 04 Jul 2024 19:28:59 GMT and should not be manually modified.
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
+ ## 1.88.0
8
+
9
+ Thu, 04 Jul 2024 19:28:59 GMT
10
+
11
+ ### Minor changes
12
+
13
+ - Add data masking to validator component (Mauricio.BatresMontejo@telus.com)
14
+ - Bump @telus-uds/system-theme-tokens to v2.59.0
15
+
16
+ ### Patches
17
+
18
+ - Remove label like unique field in RadioGroup component (Mauricio.BatresMontejo@telus.com)
19
+ - `OrderedList`: fix numbered text alignment (guillermo.peitzner@telus.com)
20
+
7
21
  ## 1.87.0
8
22
 
9
- Mon, 24 Jun 2024 16:19:28 GMT
23
+ Mon, 24 Jun 2024 16:28:34 GMT
10
24
 
11
25
  ### Minor changes
12
26
 
@@ -10,7 +10,6 @@ var _View = _interopRequireDefault(require("react-native-web/dist/cjs/exports/Vi
10
10
  var _StyleSheet = _interopRequireDefault(require("react-native-web/dist/cjs/exports/StyleSheet"));
11
11
  var _utils = require("../utils");
12
12
  var _ThemeProvider = require("../ThemeProvider");
13
- var _StackView = _interopRequireDefault(require("../StackView"));
14
13
  var _Typography = _interopRequireDefault(require("../Typography"));
15
14
  var _ItemBase = _interopRequireDefault(require("./ItemBase"));
16
15
  var _jsxRuntime = require("react/jsx-runtime");
@@ -36,20 +35,18 @@ const selectItemTextStyles = (_ref, themeOptions) => {
36
35
  const selectItemCounterStyles = _ref2 => {
37
36
  let {
38
37
  itemBulletContainerWidth,
39
- itemBulletContainerAlign,
38
+ itemBulletTextAlign,
40
39
  itemFontWeight,
41
40
  itemFontSize,
42
41
  itemFontName,
43
42
  itemLineHeight,
44
43
  themeOptions,
45
- listGutter,
46
44
  itemColor
47
45
  } = _ref2;
48
46
  return {
49
47
  color: itemColor,
50
48
  width: itemBulletContainerWidth,
51
- paddingRight: listGutter,
52
- textAlign: itemBulletContainerAlign,
49
+ textAlign: itemBulletTextAlign,
53
50
  ...(0, _ThemeProvider.applyTextStyles)({
54
51
  fontWeight: itemFontWeight,
55
52
  fontSize: itemFontSize,
@@ -62,10 +59,12 @@ const selectItemCounterStyles = _ref2 => {
62
59
  const selectItemContentStyles = (_ref3, isLastChild) => {
63
60
  let {
64
61
  interItemMargin,
62
+ listGutter,
65
63
  ...themeTokens
66
64
  } = _ref3;
67
65
  return {
68
66
  ...themeTokens,
67
+ marginLeft: listGutter,
69
68
  marginBottom: !isLastChild ? interItemMargin : 0
70
69
  };
71
70
  };
@@ -106,27 +105,19 @@ const Item = /*#__PURE__*/_react.default.forwardRef((_ref4, ref) => {
106
105
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_View.default, {
107
106
  style: [staticStyles.itemCounter, selectItemCounterStyles(themeTokens)],
108
107
  children: itemCounter
109
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_View.default, {
110
- style: staticStyles.itemContent,
111
- children: title ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_StackView.default, {
112
- tokens: {
113
- flexShrink: 1
114
- },
115
- space: 0,
116
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography.default, {
108
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_View.default, {
109
+ style: [staticStyles.itemContent, selectItemContentStyles(themeTokens, isLastChild)],
110
+ children: [title && /*#__PURE__*/(0, _jsxRuntime.jsx)(_View.default, {
111
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography.default, {
117
112
  variant: {
118
113
  size: 'h4'
119
114
  },
120
115
  tokens: headingTokens,
121
116
  children: title
122
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_View.default, {
123
- style: selectItemContentStyles(themeTokens, isLastChild),
124
- children: itemContent
125
- })]
126
- }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_View.default, {
127
- style: selectItemContentStyles(themeTokens, isLastChild),
117
+ })
118
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_View.default, {
128
119
  children: itemContent
129
- })
120
+ })]
130
121
  })]
131
122
  });
132
123
  });
@@ -162,13 +153,13 @@ var _default = Item;
162
153
  exports.default = _default;
163
154
  const staticStyles = _StyleSheet.default.create({
164
155
  container: {
156
+ flex: 1,
165
157
  flexDirection: 'row'
166
158
  },
167
159
  itemCounter: {
168
- flexWrap: 'wrap'
160
+ alignItems: 'flex-end'
169
161
  },
170
162
  itemContent: {
171
- flexDirection: 'column',
172
- marginLeft: 8
163
+ flexShrink: 1
173
164
  }
174
165
  });
@@ -121,7 +121,7 @@ const RadioGroup = /*#__PURE__*/_react.default.forwardRef((_ref, ref) => {
121
121
  onChange,
122
122
  readOnly: readOnly || inactive
123
123
  });
124
- const uniqueFields = ['id', 'label'];
124
+ const uniqueFields = ['id'];
125
125
  if (!(0, _utils.containUniqueFields)(items, uniqueFields)) {
126
126
  throw new Error(`RadioGroup items must have unique ${uniqueFields.join(', ')}`);
127
127
  }
@@ -32,6 +32,7 @@ const Validator = /*#__PURE__*/_react.default.forwardRef((_ref2, ref) => {
32
32
  let {
33
33
  value = '',
34
34
  inactive,
35
+ mask = '',
35
36
  onChange,
36
37
  tokens = {},
37
38
  variant = {},
@@ -77,32 +78,36 @@ const Validator = /*#__PURE__*/_react.default.forwardRef((_ref2, ref) => {
77
78
  [codeId]: val
78
79
  });
79
80
  };
81
+ const changeDataMasking = boxElement => {
82
+ let charMasking = '';
83
+ const element = boxElement;
84
+ if (mask && mask.length === 1) charMasking = mask;else if (mask && mask.length > 1) charMasking = mask.substring(0, 1);
85
+ if (charMasking) element.value = charMasking;
86
+ };
80
87
  const handleChangeCode = () => {
81
88
  let code = '';
82
89
  for (let i = 0; i < validatorsLength; i += 1) code += singleCodes[prefix + i];
83
90
  if (typeof onChange === 'function') onChange(code, singleCodes);
84
91
  };
85
92
  const handleChangeCodeValues = (event, codeId, nextIndex) => {
86
- var _codeReferences$codeI, _event$nativeEvent, _event$target, _codeElement$value, _codeElement$value2;
93
+ var _codeReferences$codeI, _event$nativeEvent, _event$target, _codeElement$value;
87
94
  const codeElement = (_codeReferences$codeI = codeReferences[codeId]) === null || _codeReferences$codeI === void 0 ? void 0 : _codeReferences$codeI.current;
88
95
  const val = ((_event$nativeEvent = event.nativeEvent) === null || _event$nativeEvent === void 0 ? void 0 : _event$nativeEvent.value) || ((_event$target = event.target) === null || _event$target === void 0 ? void 0 : _event$target.value);
89
96
  if (Number(val).toString() === 'NaN') {
90
97
  codeElement.value = singleCodes[codeId] ?? '';
91
98
  return;
92
99
  }
93
- if ((codeElement === null || codeElement === void 0 ? void 0 : (_codeElement$value = codeElement.value) === null || _codeElement$value === void 0 ? void 0 : _codeElement$value.length) > 1) {
94
- const oldValue = singleCodes[codeId];
95
- const newValue = codeElement.value.replace(oldValue, '');
96
- codeElement.value = newValue;
97
- handleSingleCodes(codeId, codeElement.value, 'success');
98
- }
99
100
  handleSingleCodes(codeId, (codeElement === null || codeElement === void 0 ? void 0 : codeElement.value) ?? singleCodes[codeId], 'success');
100
101
  handleChangeCode();
101
102
  if (nextIndex === validatorsLength) {
102
103
  codeElement.blur();
104
+ changeDataMasking(codeElement);
103
105
  return;
104
106
  }
105
- if ((codeElement === null || codeElement === void 0 ? void 0 : (_codeElement$value2 = codeElement.value) === null || _codeElement$value2 === void 0 ? void 0 : _codeElement$value2.length) > 0) codeReferences[prefix + nextIndex].current.focus();
107
+ if ((codeElement === null || codeElement === void 0 ? void 0 : (_codeElement$value = codeElement.value) === null || _codeElement$value === void 0 ? void 0 : _codeElement$value.length) > 0) {
108
+ codeReferences[prefix + nextIndex].current.focus();
109
+ changeDataMasking(codeElement);
110
+ }
106
111
  };
107
112
  const handleKeyPress = (event, currentIndex, previousIndex) => {
108
113
  if (!(event.keyCode === 8 || event.code === 'Backspace')) return;
@@ -150,7 +155,7 @@ const Validator = /*#__PURE__*/_react.default.forwardRef((_ref2, ref) => {
150
155
  /* eslint-disable react-hooks/exhaustive-deps */
151
156
  _react.default.useEffect(() => {
152
157
  for (let i = 0; i < validatorsLength; i += 1) {
153
- codeReferences[prefix + i].current.value = text[i] ?? '';
158
+ if (mask && text[i]) codeReferences[prefix + i].current.value = mask;else codeReferences[prefix + i].current.value = text[i] ?? '';
154
159
  handleSingleCodes(prefix + i, text[i] ?? '', text[i] ? 'success' : '');
155
160
  }
156
161
  }, [text]);
@@ -207,6 +212,10 @@ Validator.propTypes = {
207
212
  * If true, the component is inactive and non editable.
208
213
  */
209
214
  inactive: _propTypes.default.bool,
215
+ /**
216
+ * Show masked characters and obscure the actual input. For example: '*'
217
+ */
218
+ mask: _propTypes.default.string,
210
219
  /**
211
220
  * Use to react upon input's value changes. Required when the `value` prop is set. Will receive the input's value as an argument.
212
221
  */
@@ -4,7 +4,6 @@ import View from "react-native-web/dist/exports/View";
4
4
  import StyleSheet from "react-native-web/dist/exports/StyleSheet";
5
5
  import { getTokensPropType, htmlAttrs, selectSystemProps, variantProp, viewProps, wrapStringsInText } from '../utils';
6
6
  import { applyTextStyles, useTheme, useThemeTokens } from '../ThemeProvider';
7
- import StackView from '../StackView';
8
7
  import Typography from '../Typography';
9
8
  import ItemBase from './ItemBase';
10
9
  import { jsx as _jsx } from "react/jsx-runtime";
@@ -30,20 +29,18 @@ const selectItemTextStyles = (_ref, themeOptions) => {
30
29
  const selectItemCounterStyles = _ref2 => {
31
30
  let {
32
31
  itemBulletContainerWidth,
33
- itemBulletContainerAlign,
32
+ itemBulletTextAlign,
34
33
  itemFontWeight,
35
34
  itemFontSize,
36
35
  itemFontName,
37
36
  itemLineHeight,
38
37
  themeOptions,
39
- listGutter,
40
38
  itemColor
41
39
  } = _ref2;
42
40
  return {
43
41
  color: itemColor,
44
42
  width: itemBulletContainerWidth,
45
- paddingRight: listGutter,
46
- textAlign: itemBulletContainerAlign,
43
+ textAlign: itemBulletTextAlign,
47
44
  ...applyTextStyles({
48
45
  fontWeight: itemFontWeight,
49
46
  fontSize: itemFontSize,
@@ -56,10 +53,12 @@ const selectItemCounterStyles = _ref2 => {
56
53
  const selectItemContentStyles = (_ref3, isLastChild) => {
57
54
  let {
58
55
  interItemMargin,
56
+ listGutter,
59
57
  ...themeTokens
60
58
  } = _ref3;
61
59
  return {
62
60
  ...themeTokens,
61
+ marginLeft: listGutter,
63
62
  marginBottom: !isLastChild ? interItemMargin : 0
64
63
  };
65
64
  };
@@ -100,27 +99,19 @@ const Item = /*#__PURE__*/React.forwardRef((_ref4, ref) => {
100
99
  children: [/*#__PURE__*/_jsx(View, {
101
100
  style: [staticStyles.itemCounter, selectItemCounterStyles(themeTokens)],
102
101
  children: itemCounter
103
- }), /*#__PURE__*/_jsx(View, {
104
- style: staticStyles.itemContent,
105
- children: title ? /*#__PURE__*/_jsxs(StackView, {
106
- tokens: {
107
- flexShrink: 1
108
- },
109
- space: 0,
110
- children: [/*#__PURE__*/_jsx(Typography, {
102
+ }), /*#__PURE__*/_jsxs(View, {
103
+ style: [staticStyles.itemContent, selectItemContentStyles(themeTokens, isLastChild)],
104
+ children: [title && /*#__PURE__*/_jsx(View, {
105
+ children: /*#__PURE__*/_jsx(Typography, {
111
106
  variant: {
112
107
  size: 'h4'
113
108
  },
114
109
  tokens: headingTokens,
115
110
  children: title
116
- }), /*#__PURE__*/_jsx(View, {
117
- style: selectItemContentStyles(themeTokens, isLastChild),
118
- children: itemContent
119
- })]
120
- }) : /*#__PURE__*/_jsx(View, {
121
- style: selectItemContentStyles(themeTokens, isLastChild),
111
+ })
112
+ }), /*#__PURE__*/_jsx(View, {
122
113
  children: itemContent
123
- })
114
+ })]
124
115
  })]
125
116
  });
126
117
  });
@@ -155,13 +146,13 @@ Item.displayName = 'OrderedListItem';
155
146
  export default Item;
156
147
  const staticStyles = StyleSheet.create({
157
148
  container: {
149
+ flex: 1,
158
150
  flexDirection: 'row'
159
151
  },
160
152
  itemCounter: {
161
- flexWrap: 'wrap'
153
+ alignItems: 'flex-end'
162
154
  },
163
155
  itemContent: {
164
- flexDirection: 'column',
165
- marginLeft: 8
156
+ flexShrink: 1
166
157
  }
167
158
  });
@@ -114,7 +114,7 @@ const RadioGroup = /*#__PURE__*/React.forwardRef((_ref, ref) => {
114
114
  onChange,
115
115
  readOnly: readOnly || inactive
116
116
  });
117
- const uniqueFields = ['id', 'label'];
117
+ const uniqueFields = ['id'];
118
118
  if (!containUniqueFields(items, uniqueFields)) {
119
119
  throw new Error(`RadioGroup items must have unique ${uniqueFields.join(', ')}`);
120
120
  }
@@ -25,6 +25,7 @@ const Validator = /*#__PURE__*/React.forwardRef((_ref2, ref) => {
25
25
  let {
26
26
  value = '',
27
27
  inactive,
28
+ mask = '',
28
29
  onChange,
29
30
  tokens = {},
30
31
  variant = {},
@@ -70,32 +71,36 @@ const Validator = /*#__PURE__*/React.forwardRef((_ref2, ref) => {
70
71
  [codeId]: val
71
72
  });
72
73
  };
74
+ const changeDataMasking = boxElement => {
75
+ let charMasking = '';
76
+ const element = boxElement;
77
+ if (mask && mask.length === 1) charMasking = mask;else if (mask && mask.length > 1) charMasking = mask.substring(0, 1);
78
+ if (charMasking) element.value = charMasking;
79
+ };
73
80
  const handleChangeCode = () => {
74
81
  let code = '';
75
82
  for (let i = 0; i < validatorsLength; i += 1) code += singleCodes[prefix + i];
76
83
  if (typeof onChange === 'function') onChange(code, singleCodes);
77
84
  };
78
85
  const handleChangeCodeValues = (event, codeId, nextIndex) => {
79
- var _codeReferences$codeI, _event$nativeEvent, _event$target, _codeElement$value, _codeElement$value2;
86
+ var _codeReferences$codeI, _event$nativeEvent, _event$target, _codeElement$value;
80
87
  const codeElement = (_codeReferences$codeI = codeReferences[codeId]) === null || _codeReferences$codeI === void 0 ? void 0 : _codeReferences$codeI.current;
81
88
  const val = ((_event$nativeEvent = event.nativeEvent) === null || _event$nativeEvent === void 0 ? void 0 : _event$nativeEvent.value) || ((_event$target = event.target) === null || _event$target === void 0 ? void 0 : _event$target.value);
82
89
  if (Number(val).toString() === 'NaN') {
83
90
  codeElement.value = singleCodes[codeId] ?? '';
84
91
  return;
85
92
  }
86
- if ((codeElement === null || codeElement === void 0 ? void 0 : (_codeElement$value = codeElement.value) === null || _codeElement$value === void 0 ? void 0 : _codeElement$value.length) > 1) {
87
- const oldValue = singleCodes[codeId];
88
- const newValue = codeElement.value.replace(oldValue, '');
89
- codeElement.value = newValue;
90
- handleSingleCodes(codeId, codeElement.value, 'success');
91
- }
92
93
  handleSingleCodes(codeId, (codeElement === null || codeElement === void 0 ? void 0 : codeElement.value) ?? singleCodes[codeId], 'success');
93
94
  handleChangeCode();
94
95
  if (nextIndex === validatorsLength) {
95
96
  codeElement.blur();
97
+ changeDataMasking(codeElement);
96
98
  return;
97
99
  }
98
- if ((codeElement === null || codeElement === void 0 ? void 0 : (_codeElement$value2 = codeElement.value) === null || _codeElement$value2 === void 0 ? void 0 : _codeElement$value2.length) > 0) codeReferences[prefix + nextIndex].current.focus();
100
+ if ((codeElement === null || codeElement === void 0 ? void 0 : (_codeElement$value = codeElement.value) === null || _codeElement$value === void 0 ? void 0 : _codeElement$value.length) > 0) {
101
+ codeReferences[prefix + nextIndex].current.focus();
102
+ changeDataMasking(codeElement);
103
+ }
99
104
  };
100
105
  const handleKeyPress = (event, currentIndex, previousIndex) => {
101
106
  if (!(event.keyCode === 8 || event.code === 'Backspace')) return;
@@ -143,7 +148,7 @@ const Validator = /*#__PURE__*/React.forwardRef((_ref2, ref) => {
143
148
  /* eslint-disable react-hooks/exhaustive-deps */
144
149
  React.useEffect(() => {
145
150
  for (let i = 0; i < validatorsLength; i += 1) {
146
- codeReferences[prefix + i].current.value = text[i] ?? '';
151
+ if (mask && text[i]) codeReferences[prefix + i].current.value = mask;else codeReferences[prefix + i].current.value = text[i] ?? '';
147
152
  handleSingleCodes(prefix + i, text[i] ?? '', text[i] ? 'success' : '');
148
153
  }
149
154
  }, [text]);
@@ -200,6 +205,10 @@ Validator.propTypes = {
200
205
  * If true, the component is inactive and non editable.
201
206
  */
202
207
  inactive: PropTypes.bool,
208
+ /**
209
+ * Show masked characters and obscure the actual input. For example: '*'
210
+ */
211
+ mask: PropTypes.string,
203
212
  /**
204
213
  * Use to react upon input's value changes. Required when the `value` prop is set. Will receive the input's value as an argument.
205
214
  */
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "@floating-ui/react-native": "^0.8.1",
12
12
  "@gorhom/portal": "^1.0.14",
13
13
  "@telus-uds/system-constants": "^1.3.0",
14
- "@telus-uds/system-theme-tokens": "^2.58.0",
14
+ "@telus-uds/system-theme-tokens": "^2.59.0",
15
15
  "airbnb-prop-types": "^2.16.0",
16
16
  "css-mediaquery": "^0.1.2",
17
17
  "expo-linear-gradient": "^12.5.0",
@@ -85,6 +85,6 @@
85
85
  "standard-engine": {
86
86
  "skip": true
87
87
  },
88
- "version": "1.87.0",
88
+ "version": "1.88.0",
89
89
  "types": "types/index.d.ts"
90
90
  }
@@ -11,7 +11,6 @@ import {
11
11
  wrapStringsInText
12
12
  } from '../utils'
13
13
  import { applyTextStyles, useTheme, useThemeTokens } from '../ThemeProvider'
14
- import StackView from '../StackView'
15
14
  import Typography from '../Typography'
16
15
  import ItemBase from './ItemBase'
17
16
 
@@ -32,19 +31,17 @@ const selectItemTextStyles = (
32
31
 
33
32
  const selectItemCounterStyles = ({
34
33
  itemBulletContainerWidth,
35
- itemBulletContainerAlign,
34
+ itemBulletTextAlign,
36
35
  itemFontWeight,
37
36
  itemFontSize,
38
37
  itemFontName,
39
38
  itemLineHeight,
40
39
  themeOptions,
41
- listGutter,
42
40
  itemColor
43
41
  }) => ({
44
42
  color: itemColor,
45
43
  width: itemBulletContainerWidth,
46
- paddingRight: listGutter,
47
- textAlign: itemBulletContainerAlign,
44
+ textAlign: itemBulletTextAlign,
48
45
  ...applyTextStyles({
49
46
  fontWeight: itemFontWeight,
50
47
  fontSize: itemFontSize,
@@ -54,8 +51,9 @@ const selectItemCounterStyles = ({
54
51
  lineHeight: itemLineHeight * itemFontSize
55
52
  })
56
53
 
57
- const selectItemContentStyles = ({ interItemMargin, ...themeTokens }, isLastChild) => ({
54
+ const selectItemContentStyles = ({ interItemMargin, listGutter, ...themeTokens }, isLastChild) => ({
58
55
  ...themeTokens,
56
+ marginLeft: listGutter,
59
57
  marginBottom: !isLastChild ? interItemMargin : 0
60
58
  })
61
59
 
@@ -87,17 +85,15 @@ const Item = React.forwardRef(
87
85
  <View style={[staticStyles.itemCounter, selectItemCounterStyles(themeTokens)]}>
88
86
  {itemCounter}
89
87
  </View>
90
- <View style={staticStyles.itemContent}>
91
- {title ? (
92
- <StackView tokens={{ flexShrink: 1 }} space={0}>
88
+ <View style={[staticStyles.itemContent, selectItemContentStyles(themeTokens, isLastChild)]}>
89
+ {title && (
90
+ <View>
93
91
  <Typography variant={{ size: 'h4' }} tokens={headingTokens}>
94
92
  {title}
95
93
  </Typography>
96
- <View style={selectItemContentStyles(themeTokens, isLastChild)}>{itemContent}</View>
97
- </StackView>
98
- ) : (
99
- <View style={selectItemContentStyles(themeTokens, isLastChild)}>{itemContent}</View>
94
+ </View>
100
95
  )}
96
+ <View>{itemContent}</View>
101
97
  </View>
102
98
  </ItemBase>
103
99
  )
@@ -138,13 +134,13 @@ export default Item
138
134
 
139
135
  const staticStyles = StyleSheet.create({
140
136
  container: {
137
+ flex: 1,
141
138
  flexDirection: 'row'
142
139
  },
143
140
  itemCounter: {
144
- flexWrap: 'wrap'
141
+ alignItems: 'flex-end'
145
142
  },
146
143
  itemContent: {
147
- flexDirection: 'column',
148
- marginLeft: 8
144
+ flexShrink: 1
149
145
  }
150
146
  })
@@ -131,7 +131,7 @@ const RadioGroup = React.forwardRef(
131
131
  readOnly: readOnly || inactive
132
132
  })
133
133
 
134
- const uniqueFields = ['id', 'label']
134
+ const uniqueFields = ['id']
135
135
  if (!containUniqueFields(items, uniqueFields)) {
136
136
  throw new Error(`RadioGroup items must have unique ${uniqueFields.join(', ')}`)
137
137
  }
@@ -18,7 +18,7 @@ const selectCodeTextInputTokens = ({ outerBorderColor, outerBackgroundColor }) =
18
18
  }
19
19
 
20
20
  const Validator = React.forwardRef(
21
- ({ value = '', inactive, onChange, tokens = {}, variant = {}, ...rest }, ref) => {
21
+ ({ value = '', inactive, mask = '', onChange, tokens = {}, variant = {}, ...rest }, ref) => {
22
22
  const defaultRef = React.useRef()
23
23
  const codeRef = ref ?? defaultRef
24
24
 
@@ -62,6 +62,15 @@ const Validator = React.forwardRef(
62
62
  })
63
63
  }
64
64
 
65
+ const changeDataMasking = (boxElement) => {
66
+ let charMasking = ''
67
+ const element = boxElement
68
+ if (mask && mask.length === 1) charMasking = mask
69
+ else if (mask && mask.length > 1) charMasking = mask.substring(0, 1)
70
+
71
+ if (charMasking) element.value = charMasking
72
+ }
73
+
65
74
  const handleChangeCode = () => {
66
75
  let code = ''
67
76
  for (let i = 0; i < validatorsLength; i += 1) code += singleCodes[prefix + i]
@@ -76,20 +85,18 @@ const Validator = React.forwardRef(
76
85
  codeElement.value = singleCodes[codeId] ?? ''
77
86
  return
78
87
  }
79
- if (codeElement?.value?.length > 1) {
80
- const oldValue = singleCodes[codeId]
81
- const newValue = codeElement.value.replace(oldValue, '')
82
- codeElement.value = newValue
83
- handleSingleCodes(codeId, codeElement.value, 'success')
84
- }
85
88
 
86
89
  handleSingleCodes(codeId, codeElement?.value ?? singleCodes[codeId], 'success')
87
90
  handleChangeCode()
88
91
  if (nextIndex === validatorsLength) {
89
92
  codeElement.blur()
93
+ changeDataMasking(codeElement)
90
94
  return
91
95
  }
92
- if (codeElement?.value?.length > 0) codeReferences[prefix + nextIndex].current.focus()
96
+ if (codeElement?.value?.length > 0) {
97
+ codeReferences[prefix + nextIndex].current.focus()
98
+ changeDataMasking(codeElement)
99
+ }
93
100
  }
94
101
 
95
102
  const handleKeyPress = (event, currentIndex, previousIndex) => {
@@ -138,7 +145,8 @@ const Validator = React.forwardRef(
138
145
  /* eslint-disable react-hooks/exhaustive-deps */
139
146
  React.useEffect(() => {
140
147
  for (let i = 0; i < validatorsLength; i += 1) {
141
- codeReferences[prefix + i].current.value = text[i] ?? ''
148
+ if (mask && text[i]) codeReferences[prefix + i].current.value = mask
149
+ else codeReferences[prefix + i].current.value = text[i] ?? ''
142
150
  handleSingleCodes(prefix + i, text[i] ?? '', text[i] ? 'success' : '')
143
151
  }
144
152
  }, [text])
@@ -203,6 +211,10 @@ Validator.propTypes = {
203
211
  * If true, the component is inactive and non editable.
204
212
  */
205
213
  inactive: PropTypes.bool,
214
+ /**
215
+ * Show masked characters and obscure the actual input. For example: '*'
216
+ */
217
+ mask: PropTypes.string,
206
218
  /**
207
219
  * Use to react upon input's value changes. Required when the `value` prop is set. Will receive the input's value as an argument.
208
220
  */