@alfalab/core-components-phone-input 7.5.7 → 8.0.0-snapshot-133b390

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.
Files changed (64) hide show
  1. package/Component.d.ts +3 -5
  2. package/Component.js +27 -29
  3. package/Component.js.map +1 -0
  4. package/cssm/Component.d.ts +3 -5
  5. package/cssm/Component.js +29 -31
  6. package/cssm/Component.js.map +1 -0
  7. package/cssm/index.d.ts +1 -1
  8. package/cssm/index.js +1 -0
  9. package/cssm/index.js.map +1 -0
  10. package/cssm/utils/check-insert-before.d.ts +6 -0
  11. package/cssm/utils/check-insert-before.js +45 -0
  12. package/cssm/utils/check-insert-before.js.map +1 -0
  13. package/cssm/utils/index.d.ts +5 -6
  14. package/cssm/utils/index.js +1 -0
  15. package/cssm/utils/index.js.map +1 -0
  16. package/esm/Component.d.ts +3 -5
  17. package/esm/Component.js +19 -21
  18. package/esm/Component.js.map +1 -0
  19. package/esm/index.d.ts +1 -1
  20. package/esm/index.js +1 -0
  21. package/esm/index.js.map +1 -0
  22. package/esm/utils/check-insert-before.d.ts +6 -0
  23. package/esm/utils/check-insert-before.js +41 -0
  24. package/esm/utils/check-insert-before.js.map +1 -0
  25. package/esm/utils/index.d.ts +5 -6
  26. package/esm/utils/index.js +1 -0
  27. package/esm/utils/index.js.map +1 -0
  28. package/index.d.ts +1 -1
  29. package/index.js +1 -0
  30. package/index.js.map +1 -0
  31. package/modern/Component.d.ts +3 -5
  32. package/modern/Component.js +19 -21
  33. package/modern/Component.js.map +1 -0
  34. package/modern/index.d.ts +1 -1
  35. package/modern/index.js +1 -0
  36. package/modern/index.js.map +1 -0
  37. package/modern/utils/check-insert-before.d.ts +6 -0
  38. package/modern/utils/check-insert-before.js +41 -0
  39. package/modern/utils/check-insert-before.js.map +1 -0
  40. package/modern/utils/index.d.ts +5 -6
  41. package/modern/utils/index.js +1 -0
  42. package/modern/utils/index.js.map +1 -0
  43. package/moderncssm/Component.d.ts +3 -5
  44. package/moderncssm/Component.js +19 -21
  45. package/moderncssm/Component.js.map +1 -0
  46. package/moderncssm/index.d.ts +1 -1
  47. package/moderncssm/index.js +1 -0
  48. package/moderncssm/index.js.map +1 -0
  49. package/moderncssm/utils/check-insert-before.d.ts +6 -0
  50. package/moderncssm/utils/check-insert-before.js +41 -0
  51. package/moderncssm/utils/check-insert-before.js.map +1 -0
  52. package/moderncssm/utils/index.d.ts +5 -6
  53. package/moderncssm/utils/index.js +1 -0
  54. package/moderncssm/utils/index.js.map +1 -0
  55. package/package.json +4 -4
  56. package/src/Component.tsx +24 -26
  57. package/src/text-mask-core.d.ts +44 -0
  58. package/src/utils/check-insert-before.ts +43 -0
  59. package/utils/check-insert-before.d.ts +6 -0
  60. package/utils/check-insert-before.js +45 -0
  61. package/utils/check-insert-before.js.map +1 -0
  62. package/utils/index.d.ts +5 -6
  63. package/utils/index.js +1 -0
  64. package/utils/index.js.map +1 -0
package/Component.d.ts CHANGED
@@ -1,10 +1,8 @@
1
- /// <reference types="react" />
2
1
  import React from 'react';
3
- import { MaskedInputProps } from "@alfalab/core-components-masked-input";
4
- type PhoneInputProps = Omit<MaskedInputProps, 'onBeforeDisplay' | 'type' | 'mask'> & {
2
+ import { MaskedInputProps } from '@alfalab/core-components-masked-input';
3
+ export declare type PhoneInputProps = Omit<MaskedInputProps, 'onBeforeDisplay' | 'type' | 'mask'> & {
5
4
  clearableCountryCode?: boolean;
6
5
  };
7
- declare const PhoneInput: React.ForwardRefExoticComponent<Omit<MaskedInputProps, "mask" | "type" | "onBeforeDisplay"> & {
6
+ export declare const PhoneInput: React.ForwardRefExoticComponent<Omit<MaskedInputProps, "type" | "onBeforeDisplay" | "mask"> & {
8
7
  clearableCountryCode?: boolean | undefined;
9
8
  } & React.RefAttributes<HTMLInputElement>>;
10
- export { PhoneInputProps, PhoneInput };
package/Component.js CHANGED
@@ -7,7 +7,8 @@ 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_index = require('./utils/index.js');
10
+ var checkInsertBefore = require('./utils/check-insert-before.js');
11
+ var index = require('./utils/index.js');
11
12
 
12
13
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
13
14
 
@@ -39,16 +40,27 @@ var PhoneInput = React__default.default.forwardRef(function (_a, ref) {
39
40
  var handleBeforeDisplay = React.useCallback(function (conformedValue, config) {
40
41
  var rawValue = config.rawValue, previousConformedValue = config.previousConformedValue, currentCaretPosition = config.currentCaretPosition;
41
42
  var previousValueWithoutFormatting = previousConformedValue
42
- ? utils_index.deleteFormatting(previousConformedValue)
43
+ ? 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) {
48
- var newRaw = utils_index.deleteMaskChar(previousValueWithoutFormatting, rawValue);
59
+ if (checkInsertBefore.checkInsertBefore(previousConformedValue, rawValue)) {
60
+ var newRaw = index.deleteMaskChar(previousValueWithoutFormatting, rawValue);
49
61
  conformedValue = textMaskCore.conformToMask(newRaw, mask, config).conformedValue;
50
62
  }
51
- var currentValueWithoutFormatting = utils_index.deleteFormatting(conformedValue) || '';
63
+ var currentValueWithoutFormatting = index.deleteFormatting(conformedValue) || '';
52
64
  /*
53
65
  * код ниже нужен для фикса следующих багов библиотеки text-mask:
54
66
  * 1) так как код страны указан в маске жестко как "+7",
@@ -63,38 +75,25 @@ var PhoneInput = React__default.default.forwardRef(function (_a, ref) {
63
75
  currentValueWithoutFormatting.length) === 1) ||
64
76
  ([7, 10, 13].includes(currentCaretPosition) &&
65
77
  previousConformedValue.length > currentCaretPosition))) {
66
- utils_index.setCaretPosition({ position: currentCaretPosition, inputRef: inputRef });
78
+ index.setCaretPosition({ position: currentCaretPosition, inputRef: inputRef });
67
79
  }
68
80
  // // В режиме clearableCountryCode удаляет лишний пробел, чтобы можно было стереть код города.
69
81
  if (rawValue === '+7' && conformedValue === '' && clearableCountryCode) {
70
- utils_index.setCaretPosition({ position: countryPrefix.length - 1, inputRef: inputRef });
82
+ index.setCaretPosition({ position: countryPrefix.length - 1, inputRef: inputRef });
71
83
  }
72
84
  // Удаление цифры перед кодом страны удаляет только саму цифру, код остается ("+7 1" -> "+7 ")
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
- var insertedNumber = utils_index.getInsertedNumber({
88
+ var insertedNumber = index.getInsertedNumber({
90
89
  rawValue: rawValue,
91
90
  clearableCountryCode: clearableCountryCode,
92
91
  countryPrefix: countryPrefix,
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) {
107
- utils_index.setCaretPosition({ position: countryPrefix.length, inputRef: inputRef });
108
- if (!rawValue.length)
109
- return countryPrefix;
110
- return false;
104
+ // Запрет на удаление кода страны
105
+ if (!clearableCountryCode && !conformedValue) {
106
+ index.setCaretPosition({ position: countryPrefix.length, inputRef: inputRef });
107
+ return rawValue.length ? false : countryPrefix;
111
108
  }
112
109
  return conformedValue;
113
110
  }, [clearableCountryCode]);
@@ -116,3 +113,4 @@ var PhoneInput = React__default.default.forwardRef(function (_a, ref) {
116
113
  PhoneInput.displayName = 'PhoneInputs';
117
114
 
118
115
  exports.PhoneInput = PhoneInput;
116
+ //# sourceMappingURL=Component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Component.js","sources":["src/Component.tsx"],"sourcesContent":["/* eslint-disable complexity, no-param-reassign */\nimport React, { useCallback, useRef } from 'react';\nimport mergeRefs from 'react-merge-refs';\nimport { conformToMask, TextMaskConfig } from 'text-mask-core';\n\nimport { MaskedInput, MaskedInputProps } from '@alfalab/core-components-masked-input';\n\nimport { checkInsertBefore } from './utils/check-insert-before';\nimport { deleteFormatting, deleteMaskChar, getInsertedNumber, setCaretPosition } from './utils';\n\nconst mask = [\n '+',\n '7',\n ' ',\n /([0-6]|[8-9])/,\n /\\d/,\n /\\d/,\n ' ',\n /\\d/,\n /\\d/,\n /\\d/,\n ' ',\n /\\d/,\n /\\d/,\n ' ',\n /\\d/,\n /\\d/,\n];\n\nconst countryPrefix = '+7 ';\n\nexport type PhoneInputProps = Omit<MaskedInputProps, 'onBeforeDisplay' | 'type' | 'mask'> & {\n clearableCountryCode?: boolean;\n};\n\nexport const PhoneInput = React.forwardRef<HTMLInputElement, PhoneInputProps>(\n ({ clearableCountryCode = true, ...restProps }, ref) => {\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleBeforeDisplay = useCallback(\n (conformedValue: string, config: TextMaskConfig) => {\n const { rawValue, previousConformedValue, currentCaretPosition } = config;\n\n const previousValueWithoutFormatting = previousConformedValue\n ? deleteFormatting(previousConformedValue)\n : '';\n\n // Вставка номера с 10 или 11 цифрами без кода страны\n const digits = rawValue.replace(/\\D/g, '');\n\n if ((digits.length === 10 || digits.length === 11) && !rawValue.startsWith('+7')) {\n let processedDigits = digits;\n\n if (\n digits.length === 11 &&\n (digits.startsWith('7') || digits.startsWith('8'))\n ) {\n processedDigits = digits.slice(1);\n }\n const masked = conformToMask(`+7${processedDigits}`, mask, config);\n\n return masked.conformedValue;\n }\n\n /*\n * Удаляем лишний символ маски при вводе или вставке значений перед знаком + или после него.\n */\n if (checkInsertBefore(previousConformedValue, rawValue)) {\n const newRaw = deleteMaskChar(previousValueWithoutFormatting, rawValue);\n\n conformedValue = conformToMask(newRaw, mask, config).conformedValue;\n }\n\n const currentValueWithoutFormatting = deleteFormatting(conformedValue) || '';\n\n /*\n * код ниже нужен для фикса следующих багов библиотеки text-mask:\n * 1) так как код страны указан в маске жестко как \"+7\",\n * то при удалении цифры перед ним каретка устанавливается перед кодом страны\n * 2) в номере телефона есть пробелы и дефисы,\n * при редактировании цифр рядом с этими символами каретка перескакивает через них,\n * а не остается на том же месте, на котором была до редактирования\n */\n if (\n previousConformedValue &&\n (([3, 6].includes(currentCaretPosition) &&\n Math.abs(\n previousValueWithoutFormatting.length -\n currentValueWithoutFormatting.length,\n ) === 1) ||\n ([7, 10, 13].includes(currentCaretPosition) &&\n previousConformedValue.length > currentCaretPosition))\n ) {\n setCaretPosition({ position: currentCaretPosition, inputRef });\n }\n\n // // В режиме clearableCountryCode удаляет лишний пробел, чтобы можно было стереть код города.\n if (rawValue === '+7' && conformedValue === '' && clearableCountryCode) {\n setCaretPosition({ position: countryPrefix.length - 1, inputRef });\n }\n\n // Удаление цифры перед кодом страны удаляет только саму цифру, код остается (\"+7 1\" -> \"+7 \")\n if (rawValue === countryPrefix) {\n return rawValue;\n }\n\n const insertedNumber = getInsertedNumber({\n rawValue,\n clearableCountryCode,\n countryPrefix,\n previousConformedValue,\n });\n\n // Вставка номера, начинающегося с 8 или 7: 89990313131, 71112223344\n if (\n (insertedNumber.startsWith('7') || insertedNumber.startsWith('8')) &&\n insertedNumber.length >= 10\n ) {\n const masked = conformToMask(`+7${insertedNumber.slice(1)}`, mask, config);\n\n return masked.conformedValue;\n }\n\n // Если ввод начат с 7 или 8 - выводит \"+7 \" и дает продолжить ввод со след. цифры\n if (rawValue.length === 1 && ['7', '8'].includes(rawValue[0])) {\n return countryPrefix;\n }\n\n // Запрет на удаление кода страны\n if (!clearableCountryCode && !conformedValue) {\n setCaretPosition({ position: countryPrefix.length, inputRef });\n\n return rawValue.length ? false : countryPrefix;\n }\n\n return conformedValue;\n },\n [clearableCountryCode],\n );\n\n return (\n <MaskedInput\n {...restProps}\n defaultValue={clearableCountryCode ? restProps.defaultValue : countryPrefix}\n mask={mask}\n onBeforeDisplay={handleBeforeDisplay}\n type='tel'\n ref={mergeRefs([ref, inputRef])}\n />\n );\n },\n);\n\nPhoneInput.displayName = 'PhoneInputs';\n"],"names":["React","__rest","useRef","useCallback","deleteFormatting","conformToMask","checkInsertBefore","deleteMaskChar","setCaretPosition","getInsertedNumber","MaskedInput","__assign","mergeRefs"],"mappings":"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"}
@@ -1,10 +1,8 @@
1
- /// <reference types="react" />
2
1
  import React from 'react';
3
- import { MaskedInputProps } from "@alfalab/core-components-masked-input";
4
- type PhoneInputProps = Omit<MaskedInputProps, 'onBeforeDisplay' | 'type' | 'mask'> & {
2
+ import { MaskedInputProps } from '@alfalab/core-components-masked-input';
3
+ export declare type PhoneInputProps = Omit<MaskedInputProps, 'onBeforeDisplay' | 'type' | 'mask'> & {
5
4
  clearableCountryCode?: boolean;
6
5
  };
7
- declare const PhoneInput: React.ForwardRefExoticComponent<Omit<MaskedInputProps, "mask" | "type" | "onBeforeDisplay"> & {
6
+ export declare const PhoneInput: React.ForwardRefExoticComponent<Omit<MaskedInputProps, "type" | "onBeforeDisplay" | "mask"> & {
8
7
  clearableCountryCode?: boolean | undefined;
9
8
  } & React.RefAttributes<HTMLInputElement>>;
10
- export { PhoneInputProps, PhoneInput };
package/cssm/Component.js CHANGED
@@ -6,8 +6,9 @@ var tslib = require('tslib');
6
6
  var React = require('react');
7
7
  var mergeRefs = require('react-merge-refs');
8
8
  var textMaskCore = require('text-mask-core');
9
- var coreComponentsMaskedInput = require('@alfalab/core-components-masked-input/cssm');
10
- var utils_index = require('./utils/index.js');
9
+ var cssm = require('@alfalab/core-components-masked-input/cssm');
10
+ var checkInsertBefore = require('./utils/check-insert-before.js');
11
+ var index = require('./utils/index.js');
11
12
 
12
13
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
13
14
 
@@ -39,16 +40,27 @@ var PhoneInput = React__default.default.forwardRef(function (_a, ref) {
39
40
  var handleBeforeDisplay = React.useCallback(function (conformedValue, config) {
40
41
  var rawValue = config.rawValue, previousConformedValue = config.previousConformedValue, currentCaretPosition = config.currentCaretPosition;
41
42
  var previousValueWithoutFormatting = previousConformedValue
42
- ? utils_index.deleteFormatting(previousConformedValue)
43
+ ? 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) {
48
- var newRaw = utils_index.deleteMaskChar(previousValueWithoutFormatting, rawValue);
59
+ if (checkInsertBefore.checkInsertBefore(previousConformedValue, rawValue)) {
60
+ var newRaw = index.deleteMaskChar(previousValueWithoutFormatting, rawValue);
49
61
  conformedValue = textMaskCore.conformToMask(newRaw, mask, config).conformedValue;
50
62
  }
51
- var currentValueWithoutFormatting = utils_index.deleteFormatting(conformedValue) || '';
63
+ var currentValueWithoutFormatting = index.deleteFormatting(conformedValue) || '';
52
64
  /*
53
65
  * код ниже нужен для фикса следующих багов библиотеки text-mask:
54
66
  * 1) так как код страны указан в маске жестко как "+7",
@@ -63,38 +75,25 @@ var PhoneInput = React__default.default.forwardRef(function (_a, ref) {
63
75
  currentValueWithoutFormatting.length) === 1) ||
64
76
  ([7, 10, 13].includes(currentCaretPosition) &&
65
77
  previousConformedValue.length > currentCaretPosition))) {
66
- utils_index.setCaretPosition({ position: currentCaretPosition, inputRef: inputRef });
78
+ index.setCaretPosition({ position: currentCaretPosition, inputRef: inputRef });
67
79
  }
68
80
  // // В режиме clearableCountryCode удаляет лишний пробел, чтобы можно было стереть код города.
69
81
  if (rawValue === '+7' && conformedValue === '' && clearableCountryCode) {
70
- utils_index.setCaretPosition({ position: countryPrefix.length - 1, inputRef: inputRef });
82
+ index.setCaretPosition({ position: countryPrefix.length - 1, inputRef: inputRef });
71
83
  }
72
84
  // Удаление цифры перед кодом страны удаляет только саму цифру, код остается ("+7 1" -> "+7 ")
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
- var insertedNumber = utils_index.getInsertedNumber({
88
+ var insertedNumber = index.getInsertedNumber({
90
89
  rawValue: rawValue,
91
90
  clearableCountryCode: clearableCountryCode,
92
91
  countryPrefix: countryPrefix,
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,17 +101,16 @@ 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) {
107
- utils_index.setCaretPosition({ position: countryPrefix.length, inputRef: inputRef });
108
- if (!rawValue.length)
109
- return countryPrefix;
110
- return false;
104
+ // Запрет на удаление кода страны
105
+ if (!clearableCountryCode && !conformedValue) {
106
+ index.setCaretPosition({ position: countryPrefix.length, inputRef: inputRef });
107
+ return rawValue.length ? false : countryPrefix;
111
108
  }
112
109
  return conformedValue;
113
110
  }, [clearableCountryCode]);
114
- return (React__default.default.createElement(coreComponentsMaskedInput.MaskedInput, tslib.__assign({}, restProps, { defaultValue: clearableCountryCode ? restProps.defaultValue : countryPrefix, mask: mask, onBeforeDisplay: handleBeforeDisplay, type: 'tel', ref: mergeRefs__default.default([ref, inputRef]) })));
111
+ return (React__default.default.createElement(cssm.MaskedInput, tslib.__assign({}, restProps, { defaultValue: clearableCountryCode ? restProps.defaultValue : countryPrefix, mask: mask, onBeforeDisplay: handleBeforeDisplay, type: 'tel', ref: mergeRefs__default.default([ref, inputRef]) })));
115
112
  });
116
113
  PhoneInput.displayName = 'PhoneInputs';
117
114
 
118
115
  exports.PhoneInput = PhoneInput;
116
+ //# sourceMappingURL=Component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Component.js","sources":["../src/Component.tsx"],"sourcesContent":["/* eslint-disable complexity, no-param-reassign */\nimport React, { useCallback, useRef } from 'react';\nimport mergeRefs from 'react-merge-refs';\nimport { conformToMask, TextMaskConfig } from 'text-mask-core';\n\nimport { MaskedInput, MaskedInputProps } from '@alfalab/core-components-masked-input';\n\nimport { checkInsertBefore } from './utils/check-insert-before';\nimport { deleteFormatting, deleteMaskChar, getInsertedNumber, setCaretPosition } from './utils';\n\nconst mask = [\n '+',\n '7',\n ' ',\n /([0-6]|[8-9])/,\n /\\d/,\n /\\d/,\n ' ',\n /\\d/,\n /\\d/,\n /\\d/,\n ' ',\n /\\d/,\n /\\d/,\n ' ',\n /\\d/,\n /\\d/,\n];\n\nconst countryPrefix = '+7 ';\n\nexport type PhoneInputProps = Omit<MaskedInputProps, 'onBeforeDisplay' | 'type' | 'mask'> & {\n clearableCountryCode?: boolean;\n};\n\nexport const PhoneInput = React.forwardRef<HTMLInputElement, PhoneInputProps>(\n ({ clearableCountryCode = true, ...restProps }, ref) => {\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleBeforeDisplay = useCallback(\n (conformedValue: string, config: TextMaskConfig) => {\n const { rawValue, previousConformedValue, currentCaretPosition } = config;\n\n const previousValueWithoutFormatting = previousConformedValue\n ? deleteFormatting(previousConformedValue)\n : '';\n\n // Вставка номера с 10 или 11 цифрами без кода страны\n const digits = rawValue.replace(/\\D/g, '');\n\n if ((digits.length === 10 || digits.length === 11) && !rawValue.startsWith('+7')) {\n let processedDigits = digits;\n\n if (\n digits.length === 11 &&\n (digits.startsWith('7') || digits.startsWith('8'))\n ) {\n processedDigits = digits.slice(1);\n }\n const masked = conformToMask(`+7${processedDigits}`, mask, config);\n\n return masked.conformedValue;\n }\n\n /*\n * Удаляем лишний символ маски при вводе или вставке значений перед знаком + или после него.\n */\n if (checkInsertBefore(previousConformedValue, rawValue)) {\n const newRaw = deleteMaskChar(previousValueWithoutFormatting, rawValue);\n\n conformedValue = conformToMask(newRaw, mask, config).conformedValue;\n }\n\n const currentValueWithoutFormatting = deleteFormatting(conformedValue) || '';\n\n /*\n * код ниже нужен для фикса следующих багов библиотеки text-mask:\n * 1) так как код страны указан в маске жестко как \"+7\",\n * то при удалении цифры перед ним каретка устанавливается перед кодом страны\n * 2) в номере телефона есть пробелы и дефисы,\n * при редактировании цифр рядом с этими символами каретка перескакивает через них,\n * а не остается на том же месте, на котором была до редактирования\n */\n if (\n previousConformedValue &&\n (([3, 6].includes(currentCaretPosition) &&\n Math.abs(\n previousValueWithoutFormatting.length -\n currentValueWithoutFormatting.length,\n ) === 1) ||\n ([7, 10, 13].includes(currentCaretPosition) &&\n previousConformedValue.length > currentCaretPosition))\n ) {\n setCaretPosition({ position: currentCaretPosition, inputRef });\n }\n\n // // В режиме clearableCountryCode удаляет лишний пробел, чтобы можно было стереть код города.\n if (rawValue === '+7' && conformedValue === '' && clearableCountryCode) {\n setCaretPosition({ position: countryPrefix.length - 1, inputRef });\n }\n\n // Удаление цифры перед кодом страны удаляет только саму цифру, код остается (\"+7 1\" -> \"+7 \")\n if (rawValue === countryPrefix) {\n return rawValue;\n }\n\n const insertedNumber = getInsertedNumber({\n rawValue,\n clearableCountryCode,\n countryPrefix,\n previousConformedValue,\n });\n\n // Вставка номера, начинающегося с 8 или 7: 89990313131, 71112223344\n if (\n (insertedNumber.startsWith('7') || insertedNumber.startsWith('8')) &&\n insertedNumber.length >= 10\n ) {\n const masked = conformToMask(`+7${insertedNumber.slice(1)}`, mask, config);\n\n return masked.conformedValue;\n }\n\n // Если ввод начат с 7 или 8 - выводит \"+7 \" и дает продолжить ввод со след. цифры\n if (rawValue.length === 1 && ['7', '8'].includes(rawValue[0])) {\n return countryPrefix;\n }\n\n // Запрет на удаление кода страны\n if (!clearableCountryCode && !conformedValue) {\n setCaretPosition({ position: countryPrefix.length, inputRef });\n\n return rawValue.length ? false : countryPrefix;\n }\n\n return conformedValue;\n },\n [clearableCountryCode],\n );\n\n return (\n <MaskedInput\n {...restProps}\n defaultValue={clearableCountryCode ? restProps.defaultValue : countryPrefix}\n mask={mask}\n onBeforeDisplay={handleBeforeDisplay}\n type='tel'\n ref={mergeRefs([ref, inputRef])}\n />\n );\n },\n);\n\nPhoneInput.displayName = 'PhoneInputs';\n"],"names":["React","__rest","useRef","useCallback","deleteFormatting","conformToMask","checkInsertBefore","deleteMaskChar","setCaretPosition","getInsertedNumber","MaskedInput","__assign","mergeRefs"],"mappings":"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"}
package/cssm/index.d.ts CHANGED
@@ -1 +1 @@
1
- export * from "./Component";
1
+ export * from './Component';
package/cssm/index.js CHANGED
@@ -7,3 +7,4 @@ var Component = require('./Component.js');
7
7
 
8
8
 
9
9
  exports.PhoneInput = Component.PhoneInput;
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Позволяет проверить что цифры были вставлены до или после знака плюс [+]
3
+ * @description +7 123 => paste 222 => +2227 123
4
+ * @description +7 123 => paste 222 => 222+7 123
5
+ */
6
+ export declare const checkInsertBefore: (baseNumber: string | undefined, modifiedNumber: string) => boolean;
@@ -0,0 +1,45 @@
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;
45
+ //# sourceMappingURL=check-insert-before.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-insert-before.js","sources":["../../src/utils/check-insert-before.ts"],"sourcesContent":["/**\n * Позволяет проверить что цифры были вставлены до или после знака плюс [+]\n * @description +7 123 => paste 222 => +2227 123\n * @description +7 123 => paste 222 => 222+7 123\n */\nexport const checkInsertBefore = (baseNumber: string | undefined, modifiedNumber: string) => {\n if (baseNumber) {\n try {\n /** Удаляем лишние символы */\n // +7 123 => 7123\n const base = baseNumber.replace(/\\s+/g, '').replace('+', '');\n // +7 123 => +7123\n const modified = modifiedNumber.replace(/\\s+/g, '');\n\n /**\n * Числа вставлены между [+] и номером\n * +7 123 => paste 222 => +2227 123\n */\n const afterPlusPattern = new RegExp(`^\\\\+\\\\d*${base}$`);\n\n if (afterPlusPattern.test(modified)) {\n return true;\n }\n\n /**\n * Числа вставлены перед [+]\n * +7 123 => paste 222 => 222+7 123\n */\n const beforePlusPattern = new RegExp(`^\\\\d*\\\\+${base}$`);\n\n if (beforePlusPattern.test(modified)) {\n return true;\n }\n\n return false;\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('checkInsertAtBeginning', e);\n }\n }\n\n return false;\n};\n"],"names":[],"mappings":";;;;AAAA;;;;AAIG;AACU,IAAA,iBAAiB,GAAG,UAAC,UAA8B,EAAE,cAAsB,EAAA;AACpF,IAAA,IAAI,UAAU,EAAE;QACZ,IAAI;;;AAGA,YAAA,IAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;;YAE5D,IAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AAEnD;;;AAGG;YACH,IAAM,gBAAgB,GAAG,IAAI,MAAM,CAAC,UAAW,CAAA,MAAA,CAAA,IAAI,EAAG,GAAA,CAAA,CAAC;AAEvD,YAAA,IAAI,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;AACjC,gBAAA,OAAO,IAAI;AACd;AAED;;;AAGG;YACH,IAAM,iBAAiB,GAAG,IAAI,MAAM,CAAC,UAAW,CAAA,MAAA,CAAA,IAAI,EAAG,GAAA,CAAA,CAAC;AAExD,YAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;AAClC,gBAAA,OAAO,IAAI;AACd;AAED,YAAA,OAAO,KAAK;AACf;AAAC,QAAA,OAAO,CAAC,EAAE;;AAER,YAAA,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC,CAAC;AAC7C;AACJ;AAED,IAAA,OAAO,KAAK;AAChB;;;;"}
@@ -1,18 +1,17 @@
1
- /// <reference types="react" />
2
1
  /**
3
2
  * Удаляет форматирование номера телефона
4
3
  * @param phone Номер телефона
5
4
  */
6
- declare const deleteFormatting: (phone: string) => string;
7
- declare function setCaretPosition({ position, inputRef, }: {
5
+ /// <reference types="react" />
6
+ export declare const deleteFormatting: (phone: string) => string;
7
+ export declare function setCaretPosition({ position, inputRef, }: {
8
8
  position: number;
9
9
  inputRef: React.RefObject<HTMLInputElement>;
10
10
  }): void;
11
- declare function getInsertedNumber({ rawValue, clearableCountryCode, countryPrefix, previousConformedValue, }: {
11
+ export declare function getInsertedNumber({ rawValue, clearableCountryCode, countryPrefix, previousConformedValue, }: {
12
12
  rawValue: string;
13
13
  clearableCountryCode: boolean;
14
14
  countryPrefix: string;
15
15
  previousConformedValue: string;
16
16
  }): string;
17
- declare function deleteMaskChar(previousValue: string, rawValue: string): string;
18
- export { deleteFormatting, setCaretPosition, getInsertedNumber, deleteMaskChar };
17
+ export declare function deleteMaskChar(previousValue: string, rawValue: string): string;
@@ -48,3 +48,4 @@ exports.deleteFormatting = deleteFormatting;
48
48
  exports.deleteMaskChar = deleteMaskChar;
49
49
  exports.getInsertedNumber = getInsertedNumber;
50
50
  exports.setCaretPosition = setCaretPosition;
51
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/utils/index.ts"],"sourcesContent":["/**\n * Удаляет форматирование номера телефона\n * @param phone Номер телефона\n */\n\nexport const deleteFormatting = (phone: string) =>\n phone.replace('+', '').replace(/^7/, '').replace(/\\s/g, '');\n\nexport function setCaretPosition({\n position,\n inputRef,\n}: {\n position: number;\n inputRef: React.RefObject<HTMLInputElement>;\n}) {\n window.requestAnimationFrame(() => {\n if (inputRef === null || !inputRef.current) return;\n\n inputRef.current.setSelectionRange(position, position);\n });\n}\n\nexport function getInsertedNumber({\n rawValue,\n clearableCountryCode,\n countryPrefix,\n previousConformedValue,\n}: {\n rawValue: string;\n clearableCountryCode: boolean;\n countryPrefix: string;\n previousConformedValue: string;\n}) {\n if (!clearableCountryCode && previousConformedValue === countryPrefix) {\n if (rawValue.startsWith('7') || rawValue.startsWith('8')) {\n return rawValue;\n }\n\n return rawValue.slice(countryPrefix.length);\n }\n\n return rawValue;\n}\n\nexport function deleteMaskChar(previousValue: string, rawValue: string) {\n const prevRawValueAsArr = deleteFormatting(rawValue).split('').reverse();\n let prevConformedCharIdx = previousValue.length - 1;\n let isMaskRemoved = false;\n const newRaw: string[] = [];\n\n prevRawValueAsArr.forEach((char) => {\n if (isMaskRemoved || char === previousValue[prevConformedCharIdx]) {\n newRaw.push(char);\n prevConformedCharIdx -= 1;\n } else if (char === '7') {\n isMaskRemoved = true;\n }\n });\n\n return newRaw.reverse().join('');\n}\n"],"names":[],"mappings":";;;;AAAA;;;AAGG;AAEI,IAAM,gBAAgB,GAAG,UAAC,KAAa,EAAA;IAC1C,OAAA,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;AAA3D;AAEE,SAAU,gBAAgB,CAAC,EAMhC,EAAA;QALG,QAAQ,GAAA,EAAA,CAAA,QAAA,EACR,QAAQ,GAAA,EAAA,CAAA,QAAA;IAKR,MAAM,CAAC,qBAAqB,CAAC,YAAA;AACzB,QAAA,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO;YAAE;QAE5C,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC;AAC1D,KAAC,CAAC;AACN;AAEM,SAAU,iBAAiB,CAAC,EAUjC,EAAA;QATG,QAAQ,GAAA,EAAA,CAAA,QAAA,EACR,oBAAoB,GAAA,EAAA,CAAA,oBAAA,EACpB,aAAa,GAAA,EAAA,CAAA,aAAA,EACb,sBAAsB,GAAA,EAAA,CAAA,sBAAA;AAOtB,IAAA,IAAI,CAAC,oBAAoB,IAAI,sBAAsB,KAAK,aAAa,EAAE;AACnE,QAAA,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AACtD,YAAA,OAAO,QAAQ;AAClB;QAED,OAAO,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC;AAC9C;AAED,IAAA,OAAO,QAAQ;AACnB;AAEgB,SAAA,cAAc,CAAC,aAAqB,EAAE,QAAgB,EAAA;AAClE,IAAA,IAAM,iBAAiB,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE;AACxE,IAAA,IAAI,oBAAoB,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC;IACnD,IAAI,aAAa,GAAG,KAAK;IACzB,IAAM,MAAM,GAAa,EAAE;AAE3B,IAAA,iBAAiB,CAAC,OAAO,CAAC,UAAC,IAAI,EAAA;QAC3B,IAAI,aAAa,IAAI,IAAI,KAAK,aAAa,CAAC,oBAAoB,CAAC,EAAE;AAC/D,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;YACjB,oBAAoB,IAAI,CAAC;AAC5B;aAAM,IAAI,IAAI,KAAK,GAAG,EAAE;YACrB,aAAa,GAAG,IAAI;AACvB;AACL,KAAC,CAAC;IAEF,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;AACpC;;;;;;;"}
@@ -1,10 +1,8 @@
1
- /// <reference types="react" />
2
1
  import React from 'react';
3
- import { MaskedInputProps } from "@alfalab/core-components-masked-input";
4
- type PhoneInputProps = Omit<MaskedInputProps, 'onBeforeDisplay' | 'type' | 'mask'> & {
2
+ import { MaskedInputProps } from '@alfalab/core-components-masked-input';
3
+ export declare type PhoneInputProps = Omit<MaskedInputProps, 'onBeforeDisplay' | 'type' | 'mask'> & {
5
4
  clearableCountryCode?: boolean;
6
5
  };
7
- declare const PhoneInput: React.ForwardRefExoticComponent<Omit<MaskedInputProps, "mask" | "type" | "onBeforeDisplay"> & {
6
+ export declare const PhoneInput: React.ForwardRefExoticComponent<Omit<MaskedInputProps, "type" | "onBeforeDisplay" | "mask"> & {
8
7
  clearableCountryCode?: boolean | undefined;
9
8
  } & React.RefAttributes<HTMLInputElement>>;
10
- export { PhoneInputProps, PhoneInput };
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]);
@@ -107,3 +104,4 @@ var PhoneInput = React.forwardRef(function (_a, ref) {
107
104
  PhoneInput.displayName = 'PhoneInputs';
108
105
 
109
106
  export { PhoneInput };
107
+ //# sourceMappingURL=Component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Component.js","sources":["../src/Component.tsx"],"sourcesContent":["/* eslint-disable complexity, no-param-reassign */\nimport React, { useCallback, useRef } from 'react';\nimport mergeRefs from 'react-merge-refs';\nimport { conformToMask, TextMaskConfig } from 'text-mask-core';\n\nimport { MaskedInput, MaskedInputProps } from '@alfalab/core-components-masked-input';\n\nimport { checkInsertBefore } from './utils/check-insert-before';\nimport { deleteFormatting, deleteMaskChar, getInsertedNumber, setCaretPosition } from './utils';\n\nconst mask = [\n '+',\n '7',\n ' ',\n /([0-6]|[8-9])/,\n /\\d/,\n /\\d/,\n ' ',\n /\\d/,\n /\\d/,\n /\\d/,\n ' ',\n /\\d/,\n /\\d/,\n ' ',\n /\\d/,\n /\\d/,\n];\n\nconst countryPrefix = '+7 ';\n\nexport type PhoneInputProps = Omit<MaskedInputProps, 'onBeforeDisplay' | 'type' | 'mask'> & {\n clearableCountryCode?: boolean;\n};\n\nexport const PhoneInput = React.forwardRef<HTMLInputElement, PhoneInputProps>(\n ({ clearableCountryCode = true, ...restProps }, ref) => {\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleBeforeDisplay = useCallback(\n (conformedValue: string, config: TextMaskConfig) => {\n const { rawValue, previousConformedValue, currentCaretPosition } = config;\n\n const previousValueWithoutFormatting = previousConformedValue\n ? deleteFormatting(previousConformedValue)\n : '';\n\n // Вставка номера с 10 или 11 цифрами без кода страны\n const digits = rawValue.replace(/\\D/g, '');\n\n if ((digits.length === 10 || digits.length === 11) && !rawValue.startsWith('+7')) {\n let processedDigits = digits;\n\n if (\n digits.length === 11 &&\n (digits.startsWith('7') || digits.startsWith('8'))\n ) {\n processedDigits = digits.slice(1);\n }\n const masked = conformToMask(`+7${processedDigits}`, mask, config);\n\n return masked.conformedValue;\n }\n\n /*\n * Удаляем лишний символ маски при вводе или вставке значений перед знаком + или после него.\n */\n if (checkInsertBefore(previousConformedValue, rawValue)) {\n const newRaw = deleteMaskChar(previousValueWithoutFormatting, rawValue);\n\n conformedValue = conformToMask(newRaw, mask, config).conformedValue;\n }\n\n const currentValueWithoutFormatting = deleteFormatting(conformedValue) || '';\n\n /*\n * код ниже нужен для фикса следующих багов библиотеки text-mask:\n * 1) так как код страны указан в маске жестко как \"+7\",\n * то при удалении цифры перед ним каретка устанавливается перед кодом страны\n * 2) в номере телефона есть пробелы и дефисы,\n * при редактировании цифр рядом с этими символами каретка перескакивает через них,\n * а не остается на том же месте, на котором была до редактирования\n */\n if (\n previousConformedValue &&\n (([3, 6].includes(currentCaretPosition) &&\n Math.abs(\n previousValueWithoutFormatting.length -\n currentValueWithoutFormatting.length,\n ) === 1) ||\n ([7, 10, 13].includes(currentCaretPosition) &&\n previousConformedValue.length > currentCaretPosition))\n ) {\n setCaretPosition({ position: currentCaretPosition, inputRef });\n }\n\n // // В режиме clearableCountryCode удаляет лишний пробел, чтобы можно было стереть код города.\n if (rawValue === '+7' && conformedValue === '' && clearableCountryCode) {\n setCaretPosition({ position: countryPrefix.length - 1, inputRef });\n }\n\n // Удаление цифры перед кодом страны удаляет только саму цифру, код остается (\"+7 1\" -> \"+7 \")\n if (rawValue === countryPrefix) {\n return rawValue;\n }\n\n const insertedNumber = getInsertedNumber({\n rawValue,\n clearableCountryCode,\n countryPrefix,\n previousConformedValue,\n });\n\n // Вставка номера, начинающегося с 8 или 7: 89990313131, 71112223344\n if (\n (insertedNumber.startsWith('7') || insertedNumber.startsWith('8')) &&\n insertedNumber.length >= 10\n ) {\n const masked = conformToMask(`+7${insertedNumber.slice(1)}`, mask, config);\n\n return masked.conformedValue;\n }\n\n // Если ввод начат с 7 или 8 - выводит \"+7 \" и дает продолжить ввод со след. цифры\n if (rawValue.length === 1 && ['7', '8'].includes(rawValue[0])) {\n return countryPrefix;\n }\n\n // Запрет на удаление кода страны\n if (!clearableCountryCode && !conformedValue) {\n setCaretPosition({ position: countryPrefix.length, inputRef });\n\n return rawValue.length ? false : countryPrefix;\n }\n\n return conformedValue;\n },\n [clearableCountryCode],\n );\n\n return (\n <MaskedInput\n {...restProps}\n defaultValue={clearableCountryCode ? restProps.defaultValue : countryPrefix}\n mask={mask}\n onBeforeDisplay={handleBeforeDisplay}\n type='tel'\n ref={mergeRefs([ref, inputRef])}\n />\n );\n },\n);\n\nPhoneInput.displayName = 'PhoneInputs';\n"],"names":[],"mappings":"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"}
package/esm/index.d.ts CHANGED
@@ -1 +1 @@
1
- export * from "./Component";
1
+ export * from './Component';
package/esm/index.js CHANGED
@@ -1 +1,2 @@
1
1
  export { PhoneInput } from './Component.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Позволяет проверить что цифры были вставлены до или после знака плюс [+]
3
+ * @description +7 123 => paste 222 => +2227 123
4
+ * @description +7 123 => paste 222 => 222+7 123
5
+ */
6
+ export declare const checkInsertBefore: (baseNumber: string | undefined, modifiedNumber: string) => boolean;
@@ -0,0 +1,41 @@
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 };
41
+ //# sourceMappingURL=check-insert-before.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-insert-before.js","sources":["../../src/utils/check-insert-before.ts"],"sourcesContent":["/**\n * Позволяет проверить что цифры были вставлены до или после знака плюс [+]\n * @description +7 123 => paste 222 => +2227 123\n * @description +7 123 => paste 222 => 222+7 123\n */\nexport const checkInsertBefore = (baseNumber: string | undefined, modifiedNumber: string) => {\n if (baseNumber) {\n try {\n /** Удаляем лишние символы */\n // +7 123 => 7123\n const base = baseNumber.replace(/\\s+/g, '').replace('+', '');\n // +7 123 => +7123\n const modified = modifiedNumber.replace(/\\s+/g, '');\n\n /**\n * Числа вставлены между [+] и номером\n * +7 123 => paste 222 => +2227 123\n */\n const afterPlusPattern = new RegExp(`^\\\\+\\\\d*${base}$`);\n\n if (afterPlusPattern.test(modified)) {\n return true;\n }\n\n /**\n * Числа вставлены перед [+]\n * +7 123 => paste 222 => 222+7 123\n */\n const beforePlusPattern = new RegExp(`^\\\\d*\\\\+${base}$`);\n\n if (beforePlusPattern.test(modified)) {\n return true;\n }\n\n return false;\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('checkInsertAtBeginning', e);\n }\n }\n\n return false;\n};\n"],"names":[],"mappings":"AAAA;;;;AAIG;AACU,IAAA,iBAAiB,GAAG,UAAC,UAA8B,EAAE,cAAsB,EAAA;AACpF,IAAA,IAAI,UAAU,EAAE;QACZ,IAAI;;;AAGA,YAAA,IAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;;YAE5D,IAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AAEnD;;;AAGG;YACH,IAAM,gBAAgB,GAAG,IAAI,MAAM,CAAC,UAAW,CAAA,MAAA,CAAA,IAAI,EAAG,GAAA,CAAA,CAAC;AAEvD,YAAA,IAAI,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;AACjC,gBAAA,OAAO,IAAI;AACd;AAED;;;AAGG;YACH,IAAM,iBAAiB,GAAG,IAAI,MAAM,CAAC,UAAW,CAAA,MAAA,CAAA,IAAI,EAAG,GAAA,CAAA,CAAC;AAExD,YAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;AAClC,gBAAA,OAAO,IAAI;AACd;AAED,YAAA,OAAO,KAAK;AACf;AAAC,QAAA,OAAO,CAAC,EAAE;;AAER,YAAA,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC,CAAC;AAC7C;AACJ;AAED,IAAA,OAAO,KAAK;AAChB;;;;"}