@alfalab/core-components-phone-input 7.5.7 → 7.5.8

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.js CHANGED
@@ -7,6 +7,7 @@ var React = require('react');
7
7
  var mergeRefs = require('react-merge-refs');
8
8
  var textMaskCore = require('text-mask-core');
9
9
  var coreComponentsMaskedInput = require('@alfalab/core-components-masked-input');
10
+ var utils_checkInsertBefore = require('./utils/check-insert-before.js');
10
11
  var utils_index = require('./utils/index.js');
11
12
 
12
13
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
@@ -41,10 +42,21 @@ var PhoneInput = React__default.default.forwardRef(function (_a, ref) {
41
42
  var previousValueWithoutFormatting = previousConformedValue
42
43
  ? utils_index.deleteFormatting(previousConformedValue)
43
44
  : '';
45
+ // Вставка номера с 10 или 11 цифрами без кода страны
46
+ var digits = rawValue.replace(/\D/g, '');
47
+ if ((digits.length === 10 || digits.length === 11) && !rawValue.startsWith('+7')) {
48
+ var processedDigits = digits;
49
+ if (digits.length === 11 &&
50
+ (digits.startsWith('7') || digits.startsWith('8'))) {
51
+ processedDigits = digits.slice(1);
52
+ }
53
+ var masked = textMaskCore.conformToMask("+7".concat(processedDigits), mask, config);
54
+ return masked.conformedValue;
55
+ }
44
56
  /*
45
57
  * Удаляем лишний символ маски при вводе или вставке значений перед знаком + или после него.
46
58
  */
47
- if (previousConformedValue && rawValue.indexOf('+7') !== 0) {
59
+ if (utils_checkInsertBefore.checkInsertBefore(previousConformedValue, rawValue)) {
48
60
  var newRaw = utils_index.deleteMaskChar(previousValueWithoutFormatting, rawValue);
49
61
  conformedValue = textMaskCore.conformToMask(newRaw, mask, config).conformedValue;
50
62
  }
@@ -73,19 +85,6 @@ var PhoneInput = React__default.default.forwardRef(function (_a, ref) {
73
85
  if (rawValue === countryPrefix) {
74
86
  return rawValue;
75
87
  }
76
- // Вставка номера с 10 цифрами без кода страны
77
- if (rawValue.length === 10 && conformedValue.length === mask.length) {
78
- var masked = textMaskCore.conformToMask("+7".concat(rawValue), mask, config);
79
- return masked.conformedValue;
80
- }
81
- /*
82
- * Код нужен для исправления ошибки в библиотеке text-mask: если цифра 7 находится на второй позиции при вставке, то она удаляется
83
- * Это происходит потому что цифра 7 есть уже в маске
84
- */
85
- if (rawValue[1] === '7') {
86
- var masked = textMaskCore.conformToMask("+7".concat(rawValue), mask, config);
87
- return masked.conformedValue;
88
- }
89
88
  var insertedNumber = utils_index.getInsertedNumber({
90
89
  rawValue: rawValue,
91
90
  clearableCountryCode: clearableCountryCode,
@@ -93,8 +92,8 @@ var PhoneInput = React__default.default.forwardRef(function (_a, ref) {
93
92
  previousConformedValue: previousConformedValue,
94
93
  });
95
94
  // Вставка номера, начинающегося с 8 или 7: 89990313131, 71112223344
96
- if (conformedValue.length === mask.length &&
97
- (insertedNumber.startsWith('8') || insertedNumber.startsWith('7'))) {
95
+ if ((insertedNumber.startsWith('7') || insertedNumber.startsWith('8')) &&
96
+ insertedNumber.length >= 10) {
98
97
  var masked = textMaskCore.conformToMask("+7".concat(insertedNumber.slice(1)), mask, config);
99
98
  return masked.conformedValue;
100
99
  }
@@ -102,12 +101,10 @@ var PhoneInput = React__default.default.forwardRef(function (_a, ref) {
102
101
  if (rawValue.length === 1 && ['7', '8'].includes(rawValue[0])) {
103
102
  return countryPrefix;
104
103
  }
105
- var abortCountryCodeClearing = !clearableCountryCode && !conformedValue;
106
- if (abortCountryCodeClearing) {
104
+ // Запрет на удаление кода страны
105
+ if (!clearableCountryCode && !conformedValue) {
107
106
  utils_index.setCaretPosition({ position: countryPrefix.length, inputRef: inputRef });
108
- if (!rawValue.length)
109
- return countryPrefix;
110
- return false;
107
+ return rawValue.length ? false : countryPrefix;
111
108
  }
112
109
  return conformedValue;
113
110
  }, [clearableCountryCode]);
package/cssm/Component.js CHANGED
@@ -7,6 +7,7 @@ var React = require('react');
7
7
  var mergeRefs = require('react-merge-refs');
8
8
  var textMaskCore = require('text-mask-core');
9
9
  var coreComponentsMaskedInput = require('@alfalab/core-components-masked-input/cssm');
10
+ var utils_checkInsertBefore = require('./utils/check-insert-before.js');
10
11
  var utils_index = require('./utils/index.js');
11
12
 
12
13
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
@@ -41,10 +42,21 @@ var PhoneInput = React__default.default.forwardRef(function (_a, ref) {
41
42
  var previousValueWithoutFormatting = previousConformedValue
42
43
  ? utils_index.deleteFormatting(previousConformedValue)
43
44
  : '';
45
+ // Вставка номера с 10 или 11 цифрами без кода страны
46
+ var digits = rawValue.replace(/\D/g, '');
47
+ if ((digits.length === 10 || digits.length === 11) && !rawValue.startsWith('+7')) {
48
+ var processedDigits = digits;
49
+ if (digits.length === 11 &&
50
+ (digits.startsWith('7') || digits.startsWith('8'))) {
51
+ processedDigits = digits.slice(1);
52
+ }
53
+ var masked = textMaskCore.conformToMask("+7".concat(processedDigits), mask, config);
54
+ return masked.conformedValue;
55
+ }
44
56
  /*
45
57
  * Удаляем лишний символ маски при вводе или вставке значений перед знаком + или после него.
46
58
  */
47
- if (previousConformedValue && rawValue.indexOf('+7') !== 0) {
59
+ if (utils_checkInsertBefore.checkInsertBefore(previousConformedValue, rawValue)) {
48
60
  var newRaw = utils_index.deleteMaskChar(previousValueWithoutFormatting, rawValue);
49
61
  conformedValue = textMaskCore.conformToMask(newRaw, mask, config).conformedValue;
50
62
  }
@@ -73,19 +85,6 @@ var PhoneInput = React__default.default.forwardRef(function (_a, ref) {
73
85
  if (rawValue === countryPrefix) {
74
86
  return rawValue;
75
87
  }
76
- // Вставка номера с 10 цифрами без кода страны
77
- if (rawValue.length === 10 && conformedValue.length === mask.length) {
78
- var masked = textMaskCore.conformToMask("+7".concat(rawValue), mask, config);
79
- return masked.conformedValue;
80
- }
81
- /*
82
- * Код нужен для исправления ошибки в библиотеке text-mask: если цифра 7 находится на второй позиции при вставке, то она удаляется
83
- * Это происходит потому что цифра 7 есть уже в маске
84
- */
85
- if (rawValue[1] === '7') {
86
- var masked = textMaskCore.conformToMask("+7".concat(rawValue), mask, config);
87
- return masked.conformedValue;
88
- }
89
88
  var insertedNumber = utils_index.getInsertedNumber({
90
89
  rawValue: rawValue,
91
90
  clearableCountryCode: clearableCountryCode,
@@ -93,8 +92,8 @@ var PhoneInput = React__default.default.forwardRef(function (_a, ref) {
93
92
  previousConformedValue: previousConformedValue,
94
93
  });
95
94
  // Вставка номера, начинающегося с 8 или 7: 89990313131, 71112223344
96
- if (conformedValue.length === mask.length &&
97
- (insertedNumber.startsWith('8') || insertedNumber.startsWith('7'))) {
95
+ if ((insertedNumber.startsWith('7') || insertedNumber.startsWith('8')) &&
96
+ insertedNumber.length >= 10) {
98
97
  var masked = textMaskCore.conformToMask("+7".concat(insertedNumber.slice(1)), mask, config);
99
98
  return masked.conformedValue;
100
99
  }
@@ -102,12 +101,10 @@ var PhoneInput = React__default.default.forwardRef(function (_a, ref) {
102
101
  if (rawValue.length === 1 && ['7', '8'].includes(rawValue[0])) {
103
102
  return countryPrefix;
104
103
  }
105
- var abortCountryCodeClearing = !clearableCountryCode && !conformedValue;
106
- if (abortCountryCodeClearing) {
104
+ // Запрет на удаление кода страны
105
+ if (!clearableCountryCode && !conformedValue) {
107
106
  utils_index.setCaretPosition({ position: countryPrefix.length, inputRef: inputRef });
108
- if (!rawValue.length)
109
- return countryPrefix;
110
- return false;
107
+ return rawValue.length ? false : countryPrefix;
111
108
  }
112
109
  return conformedValue;
113
110
  }, [clearableCountryCode]);
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Позволяет проверить что цифры были вставлены до или после знака плюс [+]
3
+ * @description +7 123 => paste 222 => +2227 123
4
+ * @description +7 123 => paste 222 => 222+7 123
5
+ */
6
+ declare const checkInsertBefore: (baseNumber: string | undefined, modifiedNumber: string) => boolean;
7
+ export { checkInsertBefore };
@@ -0,0 +1,44 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ /**
6
+ * Позволяет проверить что цифры были вставлены до или после знака плюс [+]
7
+ * @description +7 123 => paste 222 => +2227 123
8
+ * @description +7 123 => paste 222 => 222+7 123
9
+ */
10
+ var checkInsertBefore = function (baseNumber, modifiedNumber) {
11
+ if (baseNumber) {
12
+ try {
13
+ /** Удаляем лишние символы */
14
+ // +7 123 => 7123
15
+ var base = baseNumber.replace(/\s+/g, '').replace('+', '');
16
+ // +7 123 => +7123
17
+ var modified = modifiedNumber.replace(/\s+/g, '');
18
+ /**
19
+ * Числа вставлены между [+] и номером
20
+ * +7 123 => paste 222 => +2227 123
21
+ */
22
+ var afterPlusPattern = new RegExp("^\\+\\d*".concat(base, "$"));
23
+ if (afterPlusPattern.test(modified)) {
24
+ return true;
25
+ }
26
+ /**
27
+ * Числа вставлены перед [+]
28
+ * +7 123 => paste 222 => 222+7 123
29
+ */
30
+ var beforePlusPattern = new RegExp("^\\d*\\+".concat(base, "$"));
31
+ if (beforePlusPattern.test(modified)) {
32
+ return true;
33
+ }
34
+ return false;
35
+ }
36
+ catch (e) {
37
+ // eslint-disable-next-line no-console
38
+ console.error('checkInsertAtBeginning', e);
39
+ }
40
+ }
41
+ return false;
42
+ };
43
+
44
+ exports.checkInsertBefore = checkInsertBefore;
package/esm/Component.js CHANGED
@@ -3,6 +3,7 @@ import React, { useRef, useCallback } from 'react';
3
3
  import mergeRefs from 'react-merge-refs';
4
4
  import { conformToMask } from 'text-mask-core';
5
5
  import { MaskedInput } from '@alfalab/core-components-masked-input/esm';
6
+ import { checkInsertBefore } from './utils/check-insert-before.js';
6
7
  import { deleteFormatting, deleteMaskChar, setCaretPosition, getInsertedNumber } from './utils/index.js';
7
8
 
8
9
  var mask = [
@@ -32,10 +33,21 @@ var PhoneInput = React.forwardRef(function (_a, ref) {
32
33
  var previousValueWithoutFormatting = previousConformedValue
33
34
  ? deleteFormatting(previousConformedValue)
34
35
  : '';
36
+ // Вставка номера с 10 или 11 цифрами без кода страны
37
+ var digits = rawValue.replace(/\D/g, '');
38
+ if ((digits.length === 10 || digits.length === 11) && !rawValue.startsWith('+7')) {
39
+ var processedDigits = digits;
40
+ if (digits.length === 11 &&
41
+ (digits.startsWith('7') || digits.startsWith('8'))) {
42
+ processedDigits = digits.slice(1);
43
+ }
44
+ var masked = conformToMask("+7".concat(processedDigits), mask, config);
45
+ return masked.conformedValue;
46
+ }
35
47
  /*
36
48
  * Удаляем лишний символ маски при вводе или вставке значений перед знаком + или после него.
37
49
  */
38
- if (previousConformedValue && rawValue.indexOf('+7') !== 0) {
50
+ if (checkInsertBefore(previousConformedValue, rawValue)) {
39
51
  var newRaw = deleteMaskChar(previousValueWithoutFormatting, rawValue);
40
52
  conformedValue = conformToMask(newRaw, mask, config).conformedValue;
41
53
  }
@@ -64,19 +76,6 @@ var PhoneInput = React.forwardRef(function (_a, ref) {
64
76
  if (rawValue === countryPrefix) {
65
77
  return rawValue;
66
78
  }
67
- // Вставка номера с 10 цифрами без кода страны
68
- if (rawValue.length === 10 && conformedValue.length === mask.length) {
69
- var masked = conformToMask("+7".concat(rawValue), mask, config);
70
- return masked.conformedValue;
71
- }
72
- /*
73
- * Код нужен для исправления ошибки в библиотеке text-mask: если цифра 7 находится на второй позиции при вставке, то она удаляется
74
- * Это происходит потому что цифра 7 есть уже в маске
75
- */
76
- if (rawValue[1] === '7') {
77
- var masked = conformToMask("+7".concat(rawValue), mask, config);
78
- return masked.conformedValue;
79
- }
80
79
  var insertedNumber = getInsertedNumber({
81
80
  rawValue: rawValue,
82
81
  clearableCountryCode: clearableCountryCode,
@@ -84,8 +83,8 @@ var PhoneInput = React.forwardRef(function (_a, ref) {
84
83
  previousConformedValue: previousConformedValue,
85
84
  });
86
85
  // Вставка номера, начинающегося с 8 или 7: 89990313131, 71112223344
87
- if (conformedValue.length === mask.length &&
88
- (insertedNumber.startsWith('8') || insertedNumber.startsWith('7'))) {
86
+ if ((insertedNumber.startsWith('7') || insertedNumber.startsWith('8')) &&
87
+ insertedNumber.length >= 10) {
89
88
  var masked = conformToMask("+7".concat(insertedNumber.slice(1)), mask, config);
90
89
  return masked.conformedValue;
91
90
  }
@@ -93,12 +92,10 @@ var PhoneInput = React.forwardRef(function (_a, ref) {
93
92
  if (rawValue.length === 1 && ['7', '8'].includes(rawValue[0])) {
94
93
  return countryPrefix;
95
94
  }
96
- var abortCountryCodeClearing = !clearableCountryCode && !conformedValue;
97
- if (abortCountryCodeClearing) {
95
+ // Запрет на удаление кода страны
96
+ if (!clearableCountryCode && !conformedValue) {
98
97
  setCaretPosition({ position: countryPrefix.length, inputRef: inputRef });
99
- if (!rawValue.length)
100
- return countryPrefix;
101
- return false;
98
+ return rawValue.length ? false : countryPrefix;
102
99
  }
103
100
  return conformedValue;
104
101
  }, [clearableCountryCode]);
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Позволяет проверить что цифры были вставлены до или после знака плюс [+]
3
+ * @description +7 123 => paste 222 => +2227 123
4
+ * @description +7 123 => paste 222 => 222+7 123
5
+ */
6
+ declare const checkInsertBefore: (baseNumber: string | undefined, modifiedNumber: string) => boolean;
7
+ export { checkInsertBefore };
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Позволяет проверить что цифры были вставлены до или после знака плюс [+]
3
+ * @description +7 123 => paste 222 => +2227 123
4
+ * @description +7 123 => paste 222 => 222+7 123
5
+ */
6
+ var checkInsertBefore = function (baseNumber, modifiedNumber) {
7
+ if (baseNumber) {
8
+ try {
9
+ /** Удаляем лишние символы */
10
+ // +7 123 => 7123
11
+ var base = baseNumber.replace(/\s+/g, '').replace('+', '');
12
+ // +7 123 => +7123
13
+ var modified = modifiedNumber.replace(/\s+/g, '');
14
+ /**
15
+ * Числа вставлены между [+] и номером
16
+ * +7 123 => paste 222 => +2227 123
17
+ */
18
+ var afterPlusPattern = new RegExp("^\\+\\d*".concat(base, "$"));
19
+ if (afterPlusPattern.test(modified)) {
20
+ return true;
21
+ }
22
+ /**
23
+ * Числа вставлены перед [+]
24
+ * +7 123 => paste 222 => 222+7 123
25
+ */
26
+ var beforePlusPattern = new RegExp("^\\d*\\+".concat(base, "$"));
27
+ if (beforePlusPattern.test(modified)) {
28
+ return true;
29
+ }
30
+ return false;
31
+ }
32
+ catch (e) {
33
+ // eslint-disable-next-line no-console
34
+ console.error('checkInsertAtBeginning', e);
35
+ }
36
+ }
37
+ return false;
38
+ };
39
+
40
+ export { checkInsertBefore };
@@ -2,6 +2,7 @@ import React, { useRef, useCallback } from 'react';
2
2
  import mergeRefs from 'react-merge-refs';
3
3
  import { conformToMask } from 'text-mask-core';
4
4
  import { MaskedInput } from '@alfalab/core-components-masked-input/modern';
5
+ import { checkInsertBefore } from './utils/check-insert-before.js';
5
6
  import { deleteFormatting, deleteMaskChar, setCaretPosition, getInsertedNumber } from './utils/index.js';
6
7
 
7
8
  /* eslint-disable complexity, no-param-reassign */
@@ -31,10 +32,21 @@ const PhoneInput = React.forwardRef(({ clearableCountryCode = true, ...restProps
31
32
  const previousValueWithoutFormatting = previousConformedValue
32
33
  ? deleteFormatting(previousConformedValue)
33
34
  : '';
35
+ // Вставка номера с 10 или 11 цифрами без кода страны
36
+ const digits = rawValue.replace(/\D/g, '');
37
+ if ((digits.length === 10 || digits.length === 11) && !rawValue.startsWith('+7')) {
38
+ let processedDigits = digits;
39
+ if (digits.length === 11 &&
40
+ (digits.startsWith('7') || digits.startsWith('8'))) {
41
+ processedDigits = digits.slice(1);
42
+ }
43
+ const masked = conformToMask(`+7${processedDigits}`, mask, config);
44
+ return masked.conformedValue;
45
+ }
34
46
  /*
35
47
  * Удаляем лишний символ маски при вводе или вставке значений перед знаком + или после него.
36
48
  */
37
- if (previousConformedValue && rawValue.indexOf('+7') !== 0) {
49
+ if (checkInsertBefore(previousConformedValue, rawValue)) {
38
50
  const newRaw = deleteMaskChar(previousValueWithoutFormatting, rawValue);
39
51
  conformedValue = conformToMask(newRaw, mask, config).conformedValue;
40
52
  }
@@ -63,19 +75,6 @@ const PhoneInput = React.forwardRef(({ clearableCountryCode = true, ...restProps
63
75
  if (rawValue === countryPrefix) {
64
76
  return rawValue;
65
77
  }
66
- // Вставка номера с 10 цифрами без кода страны
67
- if (rawValue.length === 10 && conformedValue.length === mask.length) {
68
- const masked = conformToMask(`+7${rawValue}`, mask, config);
69
- return masked.conformedValue;
70
- }
71
- /*
72
- * Код нужен для исправления ошибки в библиотеке text-mask: если цифра 7 находится на второй позиции при вставке, то она удаляется
73
- * Это происходит потому что цифра 7 есть уже в маске
74
- */
75
- if (rawValue[1] === '7') {
76
- const masked = conformToMask(`+7${rawValue}`, mask, config);
77
- return masked.conformedValue;
78
- }
79
78
  const insertedNumber = getInsertedNumber({
80
79
  rawValue,
81
80
  clearableCountryCode,
@@ -83,8 +82,8 @@ const PhoneInput = React.forwardRef(({ clearableCountryCode = true, ...restProps
83
82
  previousConformedValue,
84
83
  });
85
84
  // Вставка номера, начинающегося с 8 или 7: 89990313131, 71112223344
86
- if (conformedValue.length === mask.length &&
87
- (insertedNumber.startsWith('8') || insertedNumber.startsWith('7'))) {
85
+ if ((insertedNumber.startsWith('7') || insertedNumber.startsWith('8')) &&
86
+ insertedNumber.length >= 10) {
88
87
  const masked = conformToMask(`+7${insertedNumber.slice(1)}`, mask, config);
89
88
  return masked.conformedValue;
90
89
  }
@@ -92,12 +91,10 @@ const PhoneInput = React.forwardRef(({ clearableCountryCode = true, ...restProps
92
91
  if (rawValue.length === 1 && ['7', '8'].includes(rawValue[0])) {
93
92
  return countryPrefix;
94
93
  }
95
- const abortCountryCodeClearing = !clearableCountryCode && !conformedValue;
96
- if (abortCountryCodeClearing) {
94
+ // Запрет на удаление кода страны
95
+ if (!clearableCountryCode && !conformedValue) {
97
96
  setCaretPosition({ position: countryPrefix.length, inputRef });
98
- if (!rawValue.length)
99
- return countryPrefix;
100
- return false;
97
+ return rawValue.length ? false : countryPrefix;
101
98
  }
102
99
  return conformedValue;
103
100
  }, [clearableCountryCode]);
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Позволяет проверить что цифры были вставлены до или после знака плюс [+]
3
+ * @description +7 123 => paste 222 => +2227 123
4
+ * @description +7 123 => paste 222 => 222+7 123
5
+ */
6
+ declare const checkInsertBefore: (baseNumber: string | undefined, modifiedNumber: string) => boolean;
7
+ export { checkInsertBefore };
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Позволяет проверить что цифры были вставлены до или после знака плюс [+]
3
+ * @description +7 123 => paste 222 => +2227 123
4
+ * @description +7 123 => paste 222 => 222+7 123
5
+ */
6
+ const checkInsertBefore = (baseNumber, modifiedNumber) => {
7
+ if (baseNumber) {
8
+ try {
9
+ /** Удаляем лишние символы */
10
+ // +7 123 => 7123
11
+ const base = baseNumber.replace(/\s+/g, '').replace('+', '');
12
+ // +7 123 => +7123
13
+ const modified = modifiedNumber.replace(/\s+/g, '');
14
+ /**
15
+ * Числа вставлены между [+] и номером
16
+ * +7 123 => paste 222 => +2227 123
17
+ */
18
+ const afterPlusPattern = new RegExp(`^\\+\\d*${base}$`);
19
+ if (afterPlusPattern.test(modified)) {
20
+ return true;
21
+ }
22
+ /**
23
+ * Числа вставлены перед [+]
24
+ * +7 123 => paste 222 => 222+7 123
25
+ */
26
+ const beforePlusPattern = new RegExp(`^\\d*\\+${base}$`);
27
+ if (beforePlusPattern.test(modified)) {
28
+ return true;
29
+ }
30
+ return false;
31
+ }
32
+ catch (e) {
33
+ // eslint-disable-next-line no-console
34
+ console.error('checkInsertAtBeginning', e);
35
+ }
36
+ }
37
+ return false;
38
+ };
39
+
40
+ export { checkInsertBefore };
@@ -2,6 +2,7 @@ import React, { useRef, useCallback } from 'react';
2
2
  import mergeRefs from 'react-merge-refs';
3
3
  import { conformToMask } from 'text-mask-core';
4
4
  import { MaskedInput } from '@alfalab/core-components-masked-input/moderncssm';
5
+ import { checkInsertBefore } from './utils/check-insert-before.js';
5
6
  import { deleteFormatting, deleteMaskChar, setCaretPosition, getInsertedNumber } from './utils/index.js';
6
7
 
7
8
  /* eslint-disable complexity, no-param-reassign */
@@ -31,10 +32,21 @@ const PhoneInput = React.forwardRef(({ clearableCountryCode = true, ...restProps
31
32
  const previousValueWithoutFormatting = previousConformedValue
32
33
  ? deleteFormatting(previousConformedValue)
33
34
  : '';
35
+ // Вставка номера с 10 или 11 цифрами без кода страны
36
+ const digits = rawValue.replace(/\D/g, '');
37
+ if ((digits.length === 10 || digits.length === 11) && !rawValue.startsWith('+7')) {
38
+ let processedDigits = digits;
39
+ if (digits.length === 11 &&
40
+ (digits.startsWith('7') || digits.startsWith('8'))) {
41
+ processedDigits = digits.slice(1);
42
+ }
43
+ const masked = conformToMask(`+7${processedDigits}`, mask, config);
44
+ return masked.conformedValue;
45
+ }
34
46
  /*
35
47
  * Удаляем лишний символ маски при вводе или вставке значений перед знаком + или после него.
36
48
  */
37
- if (previousConformedValue && rawValue.indexOf('+7') !== 0) {
49
+ if (checkInsertBefore(previousConformedValue, rawValue)) {
38
50
  const newRaw = deleteMaskChar(previousValueWithoutFormatting, rawValue);
39
51
  conformedValue = conformToMask(newRaw, mask, config).conformedValue;
40
52
  }
@@ -63,19 +75,6 @@ const PhoneInput = React.forwardRef(({ clearableCountryCode = true, ...restProps
63
75
  if (rawValue === countryPrefix) {
64
76
  return rawValue;
65
77
  }
66
- // Вставка номера с 10 цифрами без кода страны
67
- if (rawValue.length === 10 && conformedValue.length === mask.length) {
68
- const masked = conformToMask(`+7${rawValue}`, mask, config);
69
- return masked.conformedValue;
70
- }
71
- /*
72
- * Код нужен для исправления ошибки в библиотеке text-mask: если цифра 7 находится на второй позиции при вставке, то она удаляется
73
- * Это происходит потому что цифра 7 есть уже в маске
74
- */
75
- if (rawValue[1] === '7') {
76
- const masked = conformToMask(`+7${rawValue}`, mask, config);
77
- return masked.conformedValue;
78
- }
79
78
  const insertedNumber = getInsertedNumber({
80
79
  rawValue,
81
80
  clearableCountryCode,
@@ -83,8 +82,8 @@ const PhoneInput = React.forwardRef(({ clearableCountryCode = true, ...restProps
83
82
  previousConformedValue,
84
83
  });
85
84
  // Вставка номера, начинающегося с 8 или 7: 89990313131, 71112223344
86
- if (conformedValue.length === mask.length &&
87
- (insertedNumber.startsWith('8') || insertedNumber.startsWith('7'))) {
85
+ if ((insertedNumber.startsWith('7') || insertedNumber.startsWith('8')) &&
86
+ insertedNumber.length >= 10) {
88
87
  const masked = conformToMask(`+7${insertedNumber.slice(1)}`, mask, config);
89
88
  return masked.conformedValue;
90
89
  }
@@ -92,12 +91,10 @@ const PhoneInput = React.forwardRef(({ clearableCountryCode = true, ...restProps
92
91
  if (rawValue.length === 1 && ['7', '8'].includes(rawValue[0])) {
93
92
  return countryPrefix;
94
93
  }
95
- const abortCountryCodeClearing = !clearableCountryCode && !conformedValue;
96
- if (abortCountryCodeClearing) {
94
+ // Запрет на удаление кода страны
95
+ if (!clearableCountryCode && !conformedValue) {
97
96
  setCaretPosition({ position: countryPrefix.length, inputRef });
98
- if (!rawValue.length)
99
- return countryPrefix;
100
- return false;
97
+ return rawValue.length ? false : countryPrefix;
101
98
  }
102
99
  return conformedValue;
103
100
  }, [clearableCountryCode]);
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Позволяет проверить что цифры были вставлены до или после знака плюс [+]
3
+ * @description +7 123 => paste 222 => +2227 123
4
+ * @description +7 123 => paste 222 => 222+7 123
5
+ */
6
+ declare const checkInsertBefore: (baseNumber: string | undefined, modifiedNumber: string) => boolean;
7
+ export { checkInsertBefore };
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Позволяет проверить что цифры были вставлены до или после знака плюс [+]
3
+ * @description +7 123 => paste 222 => +2227 123
4
+ * @description +7 123 => paste 222 => 222+7 123
5
+ */
6
+ const checkInsertBefore = (baseNumber, modifiedNumber) => {
7
+ if (baseNumber) {
8
+ try {
9
+ /** Удаляем лишние символы */
10
+ // +7 123 => 7123
11
+ const base = baseNumber.replace(/\s+/g, '').replace('+', '');
12
+ // +7 123 => +7123
13
+ const modified = modifiedNumber.replace(/\s+/g, '');
14
+ /**
15
+ * Числа вставлены между [+] и номером
16
+ * +7 123 => paste 222 => +2227 123
17
+ */
18
+ const afterPlusPattern = new RegExp(`^\\+\\d*${base}$`);
19
+ if (afterPlusPattern.test(modified)) {
20
+ return true;
21
+ }
22
+ /**
23
+ * Числа вставлены перед [+]
24
+ * +7 123 => paste 222 => 222+7 123
25
+ */
26
+ const beforePlusPattern = new RegExp(`^\\d*\\+${base}$`);
27
+ if (beforePlusPattern.test(modified)) {
28
+ return true;
29
+ }
30
+ return false;
31
+ }
32
+ catch (e) {
33
+ // eslint-disable-next-line no-console
34
+ console.error('checkInsertAtBeginning', e);
35
+ }
36
+ }
37
+ return false;
38
+ };
39
+
40
+ export { checkInsertBefore };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alfalab/core-components-phone-input",
3
- "version": "7.5.7",
3
+ "version": "7.5.8",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "license": "MIT",
@@ -15,11 +15,11 @@
15
15
  "react": "^16.9.0 || ^17.0.1 || ^18.0.0"
16
16
  },
17
17
  "dependencies": {
18
- "@alfalab/core-components-masked-input": "^6.3.38",
18
+ "@alfalab/core-components-masked-input": "^6.3.39",
19
19
  "react-merge-refs": "^1.1.0",
20
20
  "text-mask-core": "^5.1.2",
21
21
  "tslib": "^2.4.0"
22
22
  },
23
- "themesVersion": "13.7.3",
24
- "varsVersion": "9.20.0"
23
+ "themesVersion": "13.7.4",
24
+ "varsVersion": "9.20.1"
25
25
  }
package/src/Component.tsx CHANGED
@@ -5,6 +5,7 @@ import { conformToMask, TextMaskConfig } from 'text-mask-core';
5
5
 
6
6
  import { MaskedInput, MaskedInputProps } from '@alfalab/core-components-masked-input';
7
7
 
8
+ import { checkInsertBefore } from './utils/check-insert-before';
8
9
  import { deleteFormatting, deleteMaskChar, getInsertedNumber, setCaretPosition } from './utils';
9
10
 
10
11
  const mask = [
@@ -44,10 +45,27 @@ export const PhoneInput = React.forwardRef<HTMLInputElement, PhoneInputProps>(
44
45
  ? deleteFormatting(previousConformedValue)
45
46
  : '';
46
47
 
48
+ // Вставка номера с 10 или 11 цифрами без кода страны
49
+ const digits = rawValue.replace(/\D/g, '');
50
+
51
+ if ((digits.length === 10 || digits.length === 11) && !rawValue.startsWith('+7')) {
52
+ let processedDigits = digits;
53
+
54
+ if (
55
+ digits.length === 11 &&
56
+ (digits.startsWith('7') || digits.startsWith('8'))
57
+ ) {
58
+ processedDigits = digits.slice(1);
59
+ }
60
+ const masked = conformToMask(`+7${processedDigits}`, mask, config);
61
+
62
+ return masked.conformedValue;
63
+ }
64
+
47
65
  /*
48
66
  * Удаляем лишний символ маски при вводе или вставке значений перед знаком + или после него.
49
67
  */
50
- if (previousConformedValue && rawValue.indexOf('+7') !== 0) {
68
+ if (checkInsertBefore(previousConformedValue, rawValue)) {
51
69
  const newRaw = deleteMaskChar(previousValueWithoutFormatting, rawValue);
52
70
 
53
71
  conformedValue = conformToMask(newRaw, mask, config).conformedValue;
@@ -86,23 +104,6 @@ export const PhoneInput = React.forwardRef<HTMLInputElement, PhoneInputProps>(
86
104
  return rawValue;
87
105
  }
88
106
 
89
- // Вставка номера с 10 цифрами без кода страны
90
- if (rawValue.length === 10 && conformedValue.length === mask.length) {
91
- const masked = conformToMask(`+7${rawValue}`, mask, config);
92
-
93
- return masked.conformedValue;
94
- }
95
-
96
- /*
97
- * Код нужен для исправления ошибки в библиотеке text-mask: если цифра 7 находится на второй позиции при вставке, то она удаляется
98
- * Это происходит потому что цифра 7 есть уже в маске
99
- */
100
- if (rawValue[1] === '7') {
101
- const masked = conformToMask(`+7${rawValue}`, mask, config);
102
-
103
- return masked.conformedValue;
104
- }
105
-
106
107
  const insertedNumber = getInsertedNumber({
107
108
  rawValue,
108
109
  clearableCountryCode,
@@ -112,8 +113,8 @@ export const PhoneInput = React.forwardRef<HTMLInputElement, PhoneInputProps>(
112
113
 
113
114
  // Вставка номера, начинающегося с 8 или 7: 89990313131, 71112223344
114
115
  if (
115
- conformedValue.length === mask.length &&
116
- (insertedNumber.startsWith('8') || insertedNumber.startsWith('7'))
116
+ (insertedNumber.startsWith('7') || insertedNumber.startsWith('8')) &&
117
+ insertedNumber.length >= 10
117
118
  ) {
118
119
  const masked = conformToMask(`+7${insertedNumber.slice(1)}`, mask, config);
119
120
 
@@ -125,14 +126,11 @@ export const PhoneInput = React.forwardRef<HTMLInputElement, PhoneInputProps>(
125
126
  return countryPrefix;
126
127
  }
127
128
 
128
- const abortCountryCodeClearing = !clearableCountryCode && !conformedValue;
129
-
130
- if (abortCountryCodeClearing) {
129
+ // Запрет на удаление кода страны
130
+ if (!clearableCountryCode && !conformedValue) {
131
131
  setCaretPosition({ position: countryPrefix.length, inputRef });
132
132
 
133
- if (!rawValue.length) return countryPrefix;
134
-
135
- return false;
133
+ return rawValue.length ? false : countryPrefix;
136
134
  }
137
135
 
138
136
  return conformedValue;
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Позволяет проверить что цифры были вставлены до или после знака плюс [+]
3
+ * @description +7 123 => paste 222 => +2227 123
4
+ * @description +7 123 => paste 222 => 222+7 123
5
+ */
6
+ export const checkInsertBefore = (baseNumber: string | undefined, modifiedNumber: string) => {
7
+ if (baseNumber) {
8
+ try {
9
+ /** Удаляем лишние символы */
10
+ // +7 123 => 7123
11
+ const base = baseNumber.replace(/\s+/g, '').replace('+', '');
12
+ // +7 123 => +7123
13
+ const modified = modifiedNumber.replace(/\s+/g, '');
14
+
15
+ /**
16
+ * Числа вставлены между [+] и номером
17
+ * +7 123 => paste 222 => +2227 123
18
+ */
19
+ const afterPlusPattern = new RegExp(`^\\+\\d*${base}$`);
20
+
21
+ if (afterPlusPattern.test(modified)) {
22
+ return true;
23
+ }
24
+
25
+ /**
26
+ * Числа вставлены перед [+]
27
+ * +7 123 => paste 222 => 222+7 123
28
+ */
29
+ const beforePlusPattern = new RegExp(`^\\d*\\+${base}$`);
30
+
31
+ if (beforePlusPattern.test(modified)) {
32
+ return true;
33
+ }
34
+
35
+ return false;
36
+ } catch (e) {
37
+ // eslint-disable-next-line no-console
38
+ console.error('checkInsertAtBeginning', e);
39
+ }
40
+ }
41
+
42
+ return false;
43
+ };
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Позволяет проверить что цифры были вставлены до или после знака плюс [+]
3
+ * @description +7 123 => paste 222 => +2227 123
4
+ * @description +7 123 => paste 222 => 222+7 123
5
+ */
6
+ declare const checkInsertBefore: (baseNumber: string | undefined, modifiedNumber: string) => boolean;
7
+ export { checkInsertBefore };
@@ -0,0 +1,44 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ /**
6
+ * Позволяет проверить что цифры были вставлены до или после знака плюс [+]
7
+ * @description +7 123 => paste 222 => +2227 123
8
+ * @description +7 123 => paste 222 => 222+7 123
9
+ */
10
+ var checkInsertBefore = function (baseNumber, modifiedNumber) {
11
+ if (baseNumber) {
12
+ try {
13
+ /** Удаляем лишние символы */
14
+ // +7 123 => 7123
15
+ var base = baseNumber.replace(/\s+/g, '').replace('+', '');
16
+ // +7 123 => +7123
17
+ var modified = modifiedNumber.replace(/\s+/g, '');
18
+ /**
19
+ * Числа вставлены между [+] и номером
20
+ * +7 123 => paste 222 => +2227 123
21
+ */
22
+ var afterPlusPattern = new RegExp("^\\+\\d*".concat(base, "$"));
23
+ if (afterPlusPattern.test(modified)) {
24
+ return true;
25
+ }
26
+ /**
27
+ * Числа вставлены перед [+]
28
+ * +7 123 => paste 222 => 222+7 123
29
+ */
30
+ var beforePlusPattern = new RegExp("^\\d*\\+".concat(base, "$"));
31
+ if (beforePlusPattern.test(modified)) {
32
+ return true;
33
+ }
34
+ return false;
35
+ }
36
+ catch (e) {
37
+ // eslint-disable-next-line no-console
38
+ console.error('checkInsertAtBeginning', e);
39
+ }
40
+ }
41
+ return false;
42
+ };
43
+
44
+ exports.checkInsertBefore = checkInsertBefore;