@alfalab/core-components-masked-input 6.1.18 → 6.2.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/Component.d.ts CHANGED
@@ -32,38 +32,9 @@ type MaskedInputProps = InputProps & {
32
32
  onBeforeDisplay?: TextMaskConfig['pipe'];
33
33
  };
34
34
  declare const PLACEHOLDER_CHAR = "\u2000";
35
- declare const MaskedInput: React.ForwardRefExoticComponent<Omit<React.InputHTMLAttributes<HTMLInputElement>, "size" | "type" | "defaultValue" | "onChange" | "onClick" | "onMouseDown" | "value" | "enterKeyHint"> & {
36
- value?: string | undefined;
37
- defaultValue?: string | undefined;
38
- block?: boolean | undefined;
39
- clear?: boolean | undefined;
40
- size?: "s" | "m" | "l" | "xl" | undefined;
41
- colors?: "default" | "inverted" | undefined;
42
- error?: React.ReactNode;
43
- success?: boolean | undefined;
44
- hint?: React.ReactNode;
45
- label?: React.ReactNode;
46
- labelView?: "inner" | "outer" | undefined;
47
- type?: "number" | "text" | "tel" | "email" | "card" | "money" | "password" | undefined;
48
- wrapperRef?: React.Ref<HTMLDivElement> | undefined;
49
- leftAddons?: React.ReactNode;
50
- rightAddons?: React.ReactNode;
51
- bottomAddons?: React.ReactNode;
52
- className?: string | undefined;
53
- fieldClassName?: string | undefined;
54
- inputClassName?: string | undefined;
55
- labelClassName?: string | undefined;
56
- addonsClassName?: string | undefined;
57
- focusedClassName?: string | undefined;
58
- filledClassName?: string | undefined;
59
- onChange?: ((event: React.ChangeEvent<HTMLInputElement>, payload: {
60
- value: string;
61
- }) => void) | undefined;
62
- onClear?: ((event: React.MouseEvent<HTMLButtonElement, globalThis.MouseEvent>) => void) | undefined;
63
- onClick?: ((event: React.MouseEvent<HTMLDivElement, globalThis.MouseEvent>) => void) | undefined;
64
- onMouseDown?: ((event: React.MouseEvent<HTMLDivElement, globalThis.MouseEvent>) => void) | undefined;
65
- onMouseUp?: ((event: React.MouseEvent<HTMLDivElement, globalThis.MouseEvent>) => void) | undefined;
66
- dataTestId?: string | undefined;
35
+ declare const MaskedInput: React.ForwardRefExoticComponent<Omit<import("packages/input/src/components/base-input").BaseInputProps, "FormControlComponent" | "colorStyles"> & {
36
+ breakpoint?: number | undefined;
37
+ defaultMatchMediaValue?: boolean | (() => boolean) | undefined;
67
38
  } & {
68
39
  /**
69
40
  * Маска для поля ввода
package/Component.js CHANGED
@@ -15,7 +15,7 @@ var React__default = /*#__PURE__*/_interopDefaultCompat(React);
15
15
  var mergeRefs__default = /*#__PURE__*/_interopDefaultCompat(mergeRefs);
16
16
  var cn__default = /*#__PURE__*/_interopDefaultCompat(cn);
17
17
 
18
- var styles = {"textHidden":"masked-input__textHidden_1msd8"};
18
+ var styles = {"textHidden":"masked-input__textHidden_y5umu"};
19
19
  require('./index.css')
20
20
 
21
21
  // Символ плейсхолдера не может входить в маску, поэтому вместо пробела используется \u2000
@@ -23,23 +23,23 @@ var PLACEHOLDER_CHAR = '\u2000';
23
23
  var MaskedInput = React__default.default.forwardRef(function (_a, ref) {
24
24
  var _b;
25
25
  var mask = _a.mask, _c = _a.keepCharPositions, keepCharPositions = _c === void 0 ? false : _c, value = _a.value, defaultValue = _a.defaultValue, className = _a.className, onBeforeDisplay = _a.onBeforeDisplay, onChange = _a.onChange, onClear = _a.onClear, restProps = tslib.__rest(_a, ["mask", "keepCharPositions", "value", "defaultValue", "className", "onBeforeDisplay", "onChange", "onClear"]);
26
- var inputRef = React.useRef(null);
26
+ var _d = React.useState(null), inputNode = _d[0], setInputNode = _d[1];
27
27
  var textMask = React.useRef(null);
28
- var _d = React.useState(value || defaultValue || ''), inputValue = _d[0], setInputValue = _d[1];
28
+ var _e = React.useState(value || defaultValue || ''), inputValue = _e[0], setInputValue = _e[1];
29
29
  // Не показываем сырое значение до применения маски
30
- var _e = React.useState(true), textHidden = _e[0], setTextHidden = _e[1];
30
+ var _f = React.useState(true), textHidden = _f[0], setTextHidden = _f[1];
31
31
  var update = React.useCallback(function (newValue) {
32
32
  if (newValue === void 0) { newValue = ''; }
33
- if (textMask.current && inputRef.current) {
33
+ if (textMask.current && inputNode) {
34
34
  try {
35
35
  textMask.current.update(newValue);
36
36
  }
37
37
  catch (e) {
38
38
  // ignore masking errors
39
39
  }
40
- setInputValue(inputRef.current.value);
40
+ setInputValue(inputNode.value);
41
41
  }
42
- }, []);
42
+ }, [inputNode]);
43
43
  var handleInputChange = React.useCallback(function (event) {
44
44
  update(event.target.value);
45
45
  if (onChange) {
@@ -54,10 +54,10 @@ var MaskedInput = React__default.default.forwardRef(function (_a, ref) {
54
54
  onClear(event);
55
55
  }, [onClear, update]);
56
56
  React.useEffect(function () {
57
- if (inputRef.current) {
57
+ if (inputNode) {
58
58
  textMask.current = textMaskCore.createTextMaskInputElement({
59
59
  mask: mask,
60
- inputElement: inputRef.current,
60
+ inputElement: inputNode,
61
61
  pipe: onBeforeDisplay,
62
62
  guide: false,
63
63
  keepCharPositions: keepCharPositions,
@@ -68,14 +68,14 @@ var MaskedInput = React__default.default.forwardRef(function (_a, ref) {
68
68
  previousConformedValue: '',
69
69
  });
70
70
  }
71
- }, [onBeforeDisplay, mask, keepCharPositions]);
71
+ }, [onBeforeDisplay, mask, keepCharPositions, inputNode]);
72
72
  React.useEffect(function () {
73
73
  update(value || defaultValue);
74
74
  }, [value, update, defaultValue]);
75
75
  React.useEffect(function () {
76
76
  setTextHidden(false);
77
77
  }, []);
78
- return (React__default.default.createElement(coreComponentsInput.Input, tslib.__assign({}, restProps, { className: cn__default.default(className, (_b = {}, _b[styles.textHidden] = textHidden, _b)), value: inputValue, onChange: handleInputChange, onClear: handleClear, ref: mergeRefs__default.default([ref, inputRef]) })));
78
+ return (React__default.default.createElement(coreComponentsInput.Input, tslib.__assign({}, restProps, { className: cn__default.default(className, (_b = {}, _b[styles.textHidden] = textHidden, _b)), value: inputValue, onChange: handleInputChange, onClear: handleClear, ref: mergeRefs__default.default([ref, setInputNode]) })));
79
79
  });
80
80
 
81
81
  exports.MaskedInput = MaskedInput;
@@ -32,38 +32,9 @@ type MaskedInputProps = InputProps & {
32
32
  onBeforeDisplay?: TextMaskConfig['pipe'];
33
33
  };
34
34
  declare const PLACEHOLDER_CHAR = "\u2000";
35
- declare const MaskedInput: React.ForwardRefExoticComponent<Omit<React.InputHTMLAttributes<HTMLInputElement>, "size" | "type" | "defaultValue" | "onChange" | "onClick" | "onMouseDown" | "value" | "enterKeyHint"> & {
36
- value?: string | undefined;
37
- defaultValue?: string | undefined;
38
- block?: boolean | undefined;
39
- clear?: boolean | undefined;
40
- size?: "s" | "m" | "l" | "xl" | undefined;
41
- colors?: "default" | "inverted" | undefined;
42
- error?: React.ReactNode;
43
- success?: boolean | undefined;
44
- hint?: React.ReactNode;
45
- label?: React.ReactNode;
46
- labelView?: "inner" | "outer" | undefined;
47
- type?: "number" | "text" | "tel" | "email" | "card" | "money" | "password" | undefined;
48
- wrapperRef?: React.Ref<HTMLDivElement> | undefined;
49
- leftAddons?: React.ReactNode;
50
- rightAddons?: React.ReactNode;
51
- bottomAddons?: React.ReactNode;
52
- className?: string | undefined;
53
- fieldClassName?: string | undefined;
54
- inputClassName?: string | undefined;
55
- labelClassName?: string | undefined;
56
- addonsClassName?: string | undefined;
57
- focusedClassName?: string | undefined;
58
- filledClassName?: string | undefined;
59
- onChange?: ((event: React.ChangeEvent<HTMLInputElement>, payload: {
60
- value: string;
61
- }) => void) | undefined;
62
- onClear?: ((event: React.MouseEvent<HTMLButtonElement, globalThis.MouseEvent>) => void) | undefined;
63
- onClick?: ((event: React.MouseEvent<HTMLDivElement, globalThis.MouseEvent>) => void) | undefined;
64
- onMouseDown?: ((event: React.MouseEvent<HTMLDivElement, globalThis.MouseEvent>) => void) | undefined;
65
- onMouseUp?: ((event: React.MouseEvent<HTMLDivElement, globalThis.MouseEvent>) => void) | undefined;
66
- dataTestId?: string | undefined;
35
+ declare const MaskedInput: React.ForwardRefExoticComponent<Omit<import("packages/input/src/components/base-input").BaseInputProps, "FormControlComponent" | "colorStyles"> & {
36
+ breakpoint?: number | undefined;
37
+ defaultMatchMediaValue?: boolean | (() => boolean) | undefined;
67
38
  } & {
68
39
  /**
69
40
  * Маска для поля ввода
package/cssm/Component.js CHANGED
@@ -22,23 +22,23 @@ var PLACEHOLDER_CHAR = '\u2000';
22
22
  var MaskedInput = React__default.default.forwardRef(function (_a, ref) {
23
23
  var _b;
24
24
  var mask = _a.mask, _c = _a.keepCharPositions, keepCharPositions = _c === void 0 ? false : _c, value = _a.value, defaultValue = _a.defaultValue, className = _a.className, onBeforeDisplay = _a.onBeforeDisplay, onChange = _a.onChange, onClear = _a.onClear, restProps = tslib.__rest(_a, ["mask", "keepCharPositions", "value", "defaultValue", "className", "onBeforeDisplay", "onChange", "onClear"]);
25
- var inputRef = React.useRef(null);
25
+ var _d = React.useState(null), inputNode = _d[0], setInputNode = _d[1];
26
26
  var textMask = React.useRef(null);
27
- var _d = React.useState(value || defaultValue || ''), inputValue = _d[0], setInputValue = _d[1];
27
+ var _e = React.useState(value || defaultValue || ''), inputValue = _e[0], setInputValue = _e[1];
28
28
  // Не показываем сырое значение до применения маски
29
- var _e = React.useState(true), textHidden = _e[0], setTextHidden = _e[1];
29
+ var _f = React.useState(true), textHidden = _f[0], setTextHidden = _f[1];
30
30
  var update = React.useCallback(function (newValue) {
31
31
  if (newValue === void 0) { newValue = ''; }
32
- if (textMask.current && inputRef.current) {
32
+ if (textMask.current && inputNode) {
33
33
  try {
34
34
  textMask.current.update(newValue);
35
35
  }
36
36
  catch (e) {
37
37
  // ignore masking errors
38
38
  }
39
- setInputValue(inputRef.current.value);
39
+ setInputValue(inputNode.value);
40
40
  }
41
- }, []);
41
+ }, [inputNode]);
42
42
  var handleInputChange = React.useCallback(function (event) {
43
43
  update(event.target.value);
44
44
  if (onChange) {
@@ -53,10 +53,10 @@ var MaskedInput = React__default.default.forwardRef(function (_a, ref) {
53
53
  onClear(event);
54
54
  }, [onClear, update]);
55
55
  React.useEffect(function () {
56
- if (inputRef.current) {
56
+ if (inputNode) {
57
57
  textMask.current = textMaskCore.createTextMaskInputElement({
58
58
  mask: mask,
59
- inputElement: inputRef.current,
59
+ inputElement: inputNode,
60
60
  pipe: onBeforeDisplay,
61
61
  guide: false,
62
62
  keepCharPositions: keepCharPositions,
@@ -67,14 +67,14 @@ var MaskedInput = React__default.default.forwardRef(function (_a, ref) {
67
67
  previousConformedValue: '',
68
68
  });
69
69
  }
70
- }, [onBeforeDisplay, mask, keepCharPositions]);
70
+ }, [onBeforeDisplay, mask, keepCharPositions, inputNode]);
71
71
  React.useEffect(function () {
72
72
  update(value || defaultValue);
73
73
  }, [value, update, defaultValue]);
74
74
  React.useEffect(function () {
75
75
  setTextHidden(false);
76
76
  }, []);
77
- return (React__default.default.createElement(coreComponentsInput.Input, tslib.__assign({}, restProps, { className: cn__default.default(className, (_b = {}, _b[styles__default.default.textHidden] = textHidden, _b)), value: inputValue, onChange: handleInputChange, onClear: handleClear, ref: mergeRefs__default.default([ref, inputRef]) })));
77
+ return (React__default.default.createElement(coreComponentsInput.Input, tslib.__assign({}, restProps, { className: cn__default.default(className, (_b = {}, _b[styles__default.default.textHidden] = textHidden, _b)), value: inputValue, onChange: handleInputChange, onClear: handleClear, ref: mergeRefs__default.default([ref, setInputNode]) })));
78
78
  });
79
79
 
80
80
  exports.MaskedInput = MaskedInput;
@@ -32,38 +32,9 @@ type MaskedInputProps = InputProps & {
32
32
  onBeforeDisplay?: TextMaskConfig['pipe'];
33
33
  };
34
34
  declare const PLACEHOLDER_CHAR = "\u2000";
35
- declare const MaskedInput: React.ForwardRefExoticComponent<Omit<React.InputHTMLAttributes<HTMLInputElement>, "size" | "type" | "defaultValue" | "onChange" | "onClick" | "onMouseDown" | "value" | "enterKeyHint"> & {
36
- value?: string | undefined;
37
- defaultValue?: string | undefined;
38
- block?: boolean | undefined;
39
- clear?: boolean | undefined;
40
- size?: "s" | "m" | "l" | "xl" | undefined;
41
- colors?: "default" | "inverted" | undefined;
42
- error?: React.ReactNode;
43
- success?: boolean | undefined;
44
- hint?: React.ReactNode;
45
- label?: React.ReactNode;
46
- labelView?: "inner" | "outer" | undefined;
47
- type?: "number" | "text" | "tel" | "email" | "card" | "money" | "password" | undefined;
48
- wrapperRef?: React.Ref<HTMLDivElement> | undefined;
49
- leftAddons?: React.ReactNode;
50
- rightAddons?: React.ReactNode;
51
- bottomAddons?: React.ReactNode;
52
- className?: string | undefined;
53
- fieldClassName?: string | undefined;
54
- inputClassName?: string | undefined;
55
- labelClassName?: string | undefined;
56
- addonsClassName?: string | undefined;
57
- focusedClassName?: string | undefined;
58
- filledClassName?: string | undefined;
59
- onChange?: ((event: React.ChangeEvent<HTMLInputElement>, payload: {
60
- value: string;
61
- }) => void) | undefined;
62
- onClear?: ((event: React.MouseEvent<HTMLButtonElement, globalThis.MouseEvent>) => void) | undefined;
63
- onClick?: ((event: React.MouseEvent<HTMLDivElement, globalThis.MouseEvent>) => void) | undefined;
64
- onMouseDown?: ((event: React.MouseEvent<HTMLDivElement, globalThis.MouseEvent>) => void) | undefined;
65
- onMouseUp?: ((event: React.MouseEvent<HTMLDivElement, globalThis.MouseEvent>) => void) | undefined;
66
- dataTestId?: string | undefined;
35
+ declare const MaskedInput: React.ForwardRefExoticComponent<Omit<import("packages/input/src/components/base-input").BaseInputProps, "FormControlComponent" | "colorStyles"> & {
36
+ breakpoint?: number | undefined;
37
+ defaultMatchMediaValue?: boolean | (() => boolean) | undefined;
67
38
  } & {
68
39
  /**
69
40
  * Маска для поля ввода
package/esm/Component.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import { __rest, __assign } from 'tslib';
2
- import React, { useRef, useState, useCallback, useEffect } from 'react';
2
+ import React, { useState, useRef, useCallback, useEffect } from 'react';
3
3
  import mergeRefs from 'react-merge-refs';
4
4
  import cn from 'classnames';
5
5
  import { createTextMaskInputElement } from 'text-mask-core';
6
6
  import { Input } from '@alfalab/core-components-input/esm';
7
7
 
8
- var styles = {"textHidden":"masked-input__textHidden_1msd8"};
8
+ var styles = {"textHidden":"masked-input__textHidden_y5umu"};
9
9
  require('./index.css')
10
10
 
11
11
  // Символ плейсхолдера не может входить в маску, поэтому вместо пробела используется \u2000
@@ -13,23 +13,23 @@ var PLACEHOLDER_CHAR = '\u2000';
13
13
  var MaskedInput = React.forwardRef(function (_a, ref) {
14
14
  var _b;
15
15
  var mask = _a.mask, _c = _a.keepCharPositions, keepCharPositions = _c === void 0 ? false : _c, value = _a.value, defaultValue = _a.defaultValue, className = _a.className, onBeforeDisplay = _a.onBeforeDisplay, onChange = _a.onChange, onClear = _a.onClear, restProps = __rest(_a, ["mask", "keepCharPositions", "value", "defaultValue", "className", "onBeforeDisplay", "onChange", "onClear"]);
16
- var inputRef = useRef(null);
16
+ var _d = useState(null), inputNode = _d[0], setInputNode = _d[1];
17
17
  var textMask = useRef(null);
18
- var _d = useState(value || defaultValue || ''), inputValue = _d[0], setInputValue = _d[1];
18
+ var _e = useState(value || defaultValue || ''), inputValue = _e[0], setInputValue = _e[1];
19
19
  // Не показываем сырое значение до применения маски
20
- var _e = useState(true), textHidden = _e[0], setTextHidden = _e[1];
20
+ var _f = useState(true), textHidden = _f[0], setTextHidden = _f[1];
21
21
  var update = useCallback(function (newValue) {
22
22
  if (newValue === void 0) { newValue = ''; }
23
- if (textMask.current && inputRef.current) {
23
+ if (textMask.current && inputNode) {
24
24
  try {
25
25
  textMask.current.update(newValue);
26
26
  }
27
27
  catch (e) {
28
28
  // ignore masking errors
29
29
  }
30
- setInputValue(inputRef.current.value);
30
+ setInputValue(inputNode.value);
31
31
  }
32
- }, []);
32
+ }, [inputNode]);
33
33
  var handleInputChange = useCallback(function (event) {
34
34
  update(event.target.value);
35
35
  if (onChange) {
@@ -44,10 +44,10 @@ var MaskedInput = React.forwardRef(function (_a, ref) {
44
44
  onClear(event);
45
45
  }, [onClear, update]);
46
46
  useEffect(function () {
47
- if (inputRef.current) {
47
+ if (inputNode) {
48
48
  textMask.current = createTextMaskInputElement({
49
49
  mask: mask,
50
- inputElement: inputRef.current,
50
+ inputElement: inputNode,
51
51
  pipe: onBeforeDisplay,
52
52
  guide: false,
53
53
  keepCharPositions: keepCharPositions,
@@ -58,14 +58,14 @@ var MaskedInput = React.forwardRef(function (_a, ref) {
58
58
  previousConformedValue: '',
59
59
  });
60
60
  }
61
- }, [onBeforeDisplay, mask, keepCharPositions]);
61
+ }, [onBeforeDisplay, mask, keepCharPositions, inputNode]);
62
62
  useEffect(function () {
63
63
  update(value || defaultValue);
64
64
  }, [value, update, defaultValue]);
65
65
  useEffect(function () {
66
66
  setTextHidden(false);
67
67
  }, []);
68
- return (React.createElement(Input, __assign({}, restProps, { className: cn(className, (_b = {}, _b[styles.textHidden] = textHidden, _b)), value: inputValue, onChange: handleInputChange, onClear: handleClear, ref: mergeRefs([ref, inputRef]) })));
68
+ return (React.createElement(Input, __assign({}, restProps, { className: cn(className, (_b = {}, _b[styles.textHidden] = textHidden, _b)), value: inputValue, onChange: handleInputChange, onClear: handleClear, ref: mergeRefs([ref, setInputNode]) })));
69
69
  });
70
70
 
71
71
  export { MaskedInput, PLACEHOLDER_CHAR };
package/esm/index.css CHANGED
@@ -1,4 +1,4 @@
1
- /* hash: 1g931 */
2
- .masked-input__textHidden_1msd8 input {
1
+ /* hash: tsm29 */
2
+ .masked-input__textHidden_y5umu input {
3
3
  opacity: 0;
4
4
  }
package/index.css CHANGED
@@ -1,4 +1,4 @@
1
- /* hash: 1g931 */
2
- .masked-input__textHidden_1msd8 input {
1
+ /* hash: tsm29 */
2
+ .masked-input__textHidden_y5umu input {
3
3
  opacity: 0;
4
4
  }
@@ -32,38 +32,9 @@ type MaskedInputProps = InputProps & {
32
32
  onBeforeDisplay?: TextMaskConfig['pipe'];
33
33
  };
34
34
  declare const PLACEHOLDER_CHAR = "\u2000";
35
- declare const MaskedInput: React.ForwardRefExoticComponent<Omit<React.InputHTMLAttributes<HTMLInputElement>, "size" | "type" | "defaultValue" | "onChange" | "onClick" | "onMouseDown" | "value" | "enterKeyHint"> & {
36
- value?: string | undefined;
37
- defaultValue?: string | undefined;
38
- block?: boolean | undefined;
39
- clear?: boolean | undefined;
40
- size?: "s" | "m" | "l" | "xl" | undefined;
41
- colors?: "default" | "inverted" | undefined;
42
- error?: React.ReactNode;
43
- success?: boolean | undefined;
44
- hint?: React.ReactNode;
45
- label?: React.ReactNode;
46
- labelView?: "inner" | "outer" | undefined;
47
- type?: "number" | "text" | "tel" | "email" | "card" | "money" | "password" | undefined;
48
- wrapperRef?: React.Ref<HTMLDivElement> | undefined;
49
- leftAddons?: React.ReactNode;
50
- rightAddons?: React.ReactNode;
51
- bottomAddons?: React.ReactNode;
52
- className?: string | undefined;
53
- fieldClassName?: string | undefined;
54
- inputClassName?: string | undefined;
55
- labelClassName?: string | undefined;
56
- addonsClassName?: string | undefined;
57
- focusedClassName?: string | undefined;
58
- filledClassName?: string | undefined;
59
- onChange?: ((event: React.ChangeEvent<HTMLInputElement>, payload: {
60
- value: string;
61
- }) => void) | undefined;
62
- onClear?: ((event: React.MouseEvent<HTMLButtonElement, globalThis.MouseEvent>) => void) | undefined;
63
- onClick?: ((event: React.MouseEvent<HTMLDivElement, globalThis.MouseEvent>) => void) | undefined;
64
- onMouseDown?: ((event: React.MouseEvent<HTMLDivElement, globalThis.MouseEvent>) => void) | undefined;
65
- onMouseUp?: ((event: React.MouseEvent<HTMLDivElement, globalThis.MouseEvent>) => void) | undefined;
66
- dataTestId?: string | undefined;
35
+ declare const MaskedInput: React.ForwardRefExoticComponent<Omit<import("packages/input/src/components/base-input").BaseInputProps, "FormControlComponent" | "colorStyles"> & {
36
+ breakpoint?: number | undefined;
37
+ defaultMatchMediaValue?: boolean | (() => boolean) | undefined;
67
38
  } & {
68
39
  /**
69
40
  * Маска для поля ввода
@@ -1,31 +1,31 @@
1
- import React, { useRef, useState, useCallback, useEffect } from 'react';
1
+ import React, { useState, useRef, useCallback, useEffect } from 'react';
2
2
  import mergeRefs from 'react-merge-refs';
3
3
  import cn from 'classnames';
4
4
  import { createTextMaskInputElement } from 'text-mask-core';
5
5
  import { Input } from '@alfalab/core-components-input/modern';
6
6
 
7
- const styles = {"textHidden":"masked-input__textHidden_1msd8"};
7
+ const styles = {"textHidden":"masked-input__textHidden_y5umu"};
8
8
  require('./index.css')
9
9
 
10
10
  // Символ плейсхолдера не может входить в маску, поэтому вместо пробела используется \u2000
11
11
  const PLACEHOLDER_CHAR = '\u2000';
12
12
  const MaskedInput = React.forwardRef(({ mask, keepCharPositions = false, value, defaultValue, className, onBeforeDisplay, onChange, onClear, ...restProps }, ref) => {
13
- const inputRef = useRef(null);
13
+ const [inputNode, setInputNode] = useState(null);
14
14
  const textMask = useRef(null);
15
15
  const [inputValue, setInputValue] = useState(value || defaultValue || '');
16
16
  // Не показываем сырое значение до применения маски
17
17
  const [textHidden, setTextHidden] = useState(true);
18
18
  const update = useCallback((newValue = '') => {
19
- if (textMask.current && inputRef.current) {
19
+ if (textMask.current && inputNode) {
20
20
  try {
21
21
  textMask.current.update(newValue);
22
22
  }
23
23
  catch (e) {
24
24
  // ignore masking errors
25
25
  }
26
- setInputValue(inputRef.current.value);
26
+ setInputValue(inputNode.value);
27
27
  }
28
- }, []);
28
+ }, [inputNode]);
29
29
  const handleInputChange = useCallback((event) => {
30
30
  update(event.target.value);
31
31
  if (onChange) {
@@ -40,10 +40,10 @@ const MaskedInput = React.forwardRef(({ mask, keepCharPositions = false, value,
40
40
  onClear(event);
41
41
  }, [onClear, update]);
42
42
  useEffect(() => {
43
- if (inputRef.current) {
43
+ if (inputNode) {
44
44
  textMask.current = createTextMaskInputElement({
45
45
  mask,
46
- inputElement: inputRef.current,
46
+ inputElement: inputNode,
47
47
  pipe: onBeforeDisplay,
48
48
  guide: false,
49
49
  keepCharPositions,
@@ -54,14 +54,14 @@ const MaskedInput = React.forwardRef(({ mask, keepCharPositions = false, value,
54
54
  previousConformedValue: '',
55
55
  });
56
56
  }
57
- }, [onBeforeDisplay, mask, keepCharPositions]);
57
+ }, [onBeforeDisplay, mask, keepCharPositions, inputNode]);
58
58
  useEffect(() => {
59
59
  update(value || defaultValue);
60
60
  }, [value, update, defaultValue]);
61
61
  useEffect(() => {
62
62
  setTextHidden(false);
63
63
  }, []);
64
- return (React.createElement(Input, { ...restProps, className: cn(className, { [styles.textHidden]: textHidden }), value: inputValue, onChange: handleInputChange, onClear: handleClear, ref: mergeRefs([ref, inputRef]) }));
64
+ return (React.createElement(Input, { ...restProps, className: cn(className, { [styles.textHidden]: textHidden }), value: inputValue, onChange: handleInputChange, onClear: handleClear, ref: mergeRefs([ref, setInputNode]) }));
65
65
  });
66
66
 
67
67
  export { MaskedInput, PLACEHOLDER_CHAR };
package/modern/index.css CHANGED
@@ -1,4 +1,4 @@
1
- /* hash: 1g931 */
2
- .masked-input__textHidden_1msd8 input {
1
+ /* hash: tsm29 */
2
+ .masked-input__textHidden_y5umu input {
3
3
  opacity: 0;
4
4
  }
package/package.json CHANGED
@@ -1,11 +1,31 @@
1
1
  {
2
2
  "name": "@alfalab/core-components-masked-input",
3
- "version": "6.1.18",
3
+ "version": "6.2.0",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "license": "MIT",
7
7
  "main": "index.js",
8
8
  "module": "./esm/index.js",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./esm/index.js",
12
+ "require": "./index.js"
13
+ },
14
+ "./mobile": {
15
+ "import": "./esm/mobile.js",
16
+ "require": "./mobile.js"
17
+ },
18
+ "./desktop": {
19
+ "import": "./esm/desktop.js",
20
+ "require": "./desktop.js"
21
+ },
22
+ "./esm": "./esm/index.js",
23
+ "./cssm": "./cssm/index.js",
24
+ "./modern": "./modern/index.js",
25
+ "./esm/*": "./esm/*",
26
+ "./cssm/*": "./cssm/*",
27
+ "./modern/*": "./modern/*"
28
+ },
9
29
  "publishConfig": {
10
30
  "access": "public",
11
31
  "directory": "dist"
@@ -14,7 +34,7 @@
14
34
  "react": "^16.9.0 || ^17.0.1 || ^18.0.0"
15
35
  },
16
36
  "dependencies": {
17
- "@alfalab/core-components-input": "^11.1.18",
37
+ "@alfalab/core-components-input": "^12.0.0",
18
38
  "classnames": "^2.3.1",
19
39
  "react-merge-refs": "^1.1.0",
20
40
  "text-mask-core": "^5.1.2",
@@ -0,0 +1,142 @@
1
+ import React, { ChangeEvent, MouseEvent, useCallback, useEffect, useRef, useState } from 'react';
2
+ import mergeRefs from 'react-merge-refs';
3
+ import cn from 'classnames';
4
+ import { createTextMaskInputElement, TextMaskInputElement } from 'text-mask-core';
5
+
6
+ import { Input, InputProps } from '@alfalab/core-components-input';
7
+
8
+ import styles from './index.module.css';
9
+
10
+ // TODO: заставить rollup добавлять кастомные декларации в сборку
11
+ type Mask = Array<string | RegExp>;
12
+ type TextMaskConfig = {
13
+ currentCaretPosition: number;
14
+ rawValue: string;
15
+ previousConformedValue: string;
16
+ mask?: Mask | ((rawValue: string) => Mask);
17
+ guide?: boolean;
18
+ showMask?: boolean;
19
+ placeholderChar?: string;
20
+ keepCharPositions?: boolean;
21
+ pipe?: (
22
+ conformedValue: string,
23
+ config: TextMaskConfig,
24
+ ) => false | string | { value: string; indexesOfPipedChars: number[] };
25
+ };
26
+
27
+ export type MaskedInputProps = InputProps & {
28
+ /**
29
+ * Маска для поля ввода
30
+ * https://github.com/text-mask/text-mask/blob/master/componentDocumentation.md#mask-array
31
+ */
32
+ mask?: TextMaskConfig['mask'];
33
+
34
+ /**
35
+ * Управляет поведением компонента при удалении символов
36
+ */
37
+ keepCharPositions?: TextMaskConfig['keepCharPositions'];
38
+
39
+ /**
40
+ * Дает возможность изменить значение поля перед рендером
41
+ */
42
+ onBeforeDisplay?: TextMaskConfig['pipe'];
43
+ };
44
+
45
+ // Символ плейсхолдера не может входить в маску, поэтому вместо пробела используется \u2000
46
+ export const PLACEHOLDER_CHAR = '\u2000';
47
+
48
+ export const MaskedInput = React.forwardRef<HTMLInputElement, MaskedInputProps>(
49
+ (
50
+ {
51
+ mask,
52
+ keepCharPositions = false,
53
+ value,
54
+ defaultValue,
55
+ className,
56
+ onBeforeDisplay,
57
+ onChange,
58
+ onClear,
59
+ ...restProps
60
+ },
61
+ ref,
62
+ ) => {
63
+ const [inputNode, setInputNode] = useState<HTMLInputElement | null>(null);
64
+ const textMask = useRef<TextMaskInputElement | null>(null);
65
+
66
+ const [inputValue, setInputValue] = useState(value || defaultValue || '');
67
+ // Не показываем сырое значение до применения маски
68
+ const [textHidden, setTextHidden] = useState(true);
69
+
70
+ const update = useCallback(
71
+ (newValue = '') => {
72
+ if (textMask.current && inputNode) {
73
+ try {
74
+ textMask.current.update(newValue);
75
+ } catch (e) {
76
+ // ignore masking errors
77
+ }
78
+
79
+ setInputValue(inputNode.value);
80
+ }
81
+ },
82
+ [inputNode],
83
+ );
84
+
85
+ const handleInputChange = useCallback(
86
+ (event: ChangeEvent<HTMLInputElement>) => {
87
+ update(event.target.value);
88
+
89
+ if (onChange) {
90
+ onChange(event, {
91
+ value: event.target.value,
92
+ });
93
+ }
94
+ },
95
+ [onChange, update],
96
+ );
97
+
98
+ const handleClear = useCallback(
99
+ (event: MouseEvent<HTMLButtonElement>) => {
100
+ update('');
101
+ if (onClear) onClear(event);
102
+ },
103
+ [onClear, update],
104
+ );
105
+
106
+ useEffect(() => {
107
+ if (inputNode) {
108
+ textMask.current = createTextMaskInputElement({
109
+ mask,
110
+ inputElement: inputNode,
111
+ pipe: onBeforeDisplay,
112
+ guide: false,
113
+ keepCharPositions,
114
+ showMask: false,
115
+ placeholderChar: PLACEHOLDER_CHAR,
116
+ rawValue: '',
117
+ currentCaretPosition: 0,
118
+ previousConformedValue: '',
119
+ });
120
+ }
121
+ }, [onBeforeDisplay, mask, keepCharPositions, inputNode]);
122
+
123
+ useEffect(() => {
124
+ update(value || defaultValue);
125
+ }, [value, update, defaultValue]);
126
+
127
+ useEffect(() => {
128
+ setTextHidden(false);
129
+ }, []);
130
+
131
+ return (
132
+ <Input
133
+ {...restProps}
134
+ className={cn(className, { [styles.textHidden]: textHidden })}
135
+ value={inputValue}
136
+ onChange={handleInputChange}
137
+ onClear={handleClear}
138
+ ref={mergeRefs([ref, setInputNode])}
139
+ />
140
+ );
141
+ },
142
+ );
@@ -0,0 +1,3 @@
1
+ .textHidden input {
2
+ opacity: 0;
3
+ }
package/src/index.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './Component';