@alfalab/core-components-phone-input 9.0.4 → 9.0.5
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 +2 -2
- package/Component.js.map +1 -1
- package/cssm/Component.d.ts +2 -2
- package/cssm/Component.js.map +1 -1
- package/cssm/utils/check-insert-before.js.map +1 -1
- package/cssm/utils/index.d.ts +0 -1
- package/cssm/utils/index.js.map +1 -1
- package/esm/Component.d.ts +2 -2
- package/esm/Component.js.map +1 -1
- package/esm/utils/check-insert-before.js.map +1 -1
- package/esm/utils/index.d.ts +0 -1
- package/esm/utils/index.js.map +1 -1
- package/modern/Component.d.ts +2 -2
- package/modern/Component.js.map +1 -1
- package/modern/utils/check-insert-before.js.map +1 -1
- package/modern/utils/index.d.ts +0 -1
- package/modern/utils/index.js.map +1 -1
- package/moderncssm/Component.d.ts +2 -2
- package/moderncssm/Component.js.map +1 -1
- package/moderncssm/utils/check-insert-before.js.map +1 -1
- package/moderncssm/utils/index.d.ts +0 -1
- package/moderncssm/utils/index.js.map +1 -1
- package/package.json +3 -3
- package/utils/check-insert-before.js.map +1 -1
- package/utils/index.d.ts +0 -1
- package/utils/index.js.map +1 -1
package/Component.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type MaskedInputProps } from '@alfalab/core-components-masked-input';
|
|
3
|
-
export
|
|
3
|
+
export type PhoneInputProps = Omit<MaskedInputProps, 'onBeforeDisplay' | 'type' | 'mask'> & {
|
|
4
4
|
clearableCountryCode?: boolean;
|
|
5
5
|
};
|
|
6
6
|
export declare const PhoneInput: React.ForwardRefExoticComponent<Omit<MaskedInputProps, "type" | "onBeforeDisplay" | "mask"> & {
|
|
7
|
-
clearableCountryCode?: boolean
|
|
7
|
+
clearableCountryCode?: boolean;
|
|
8
8
|
} & React.RefAttributes<HTMLInputElement>>;
|
package/Component.js.map
CHANGED
|
@@ -1 +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, type TextMaskConfig } from 'text-mask-core';\n\nimport { MaskedInput, type 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":";;;;;;;;;;;;;;;;;AAUA,IAAM,IAAI,GAAG;IACT,GAAG;IACH,GAAG;IACH,GAAG;IACH,eAAe;IACf,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,IAAI;IACJ,IAAI;CACP;AAED,IAAM,aAAa,GAAG,KAAK;AAMd,IAAA,UAAU,GAAGA,sBAAK,CAAC,UAAU,CACtC,UAAC,EAA6C,EAAE,GAAG,EAAA;IAAhD,IAAA,EAAA,GAAA,EAAA,CAAA,oBAA2B,EAA3B,oBAAoB,GAAG,EAAA,KAAA,MAAA,GAAA,IAAI,KAAA,EAAK,SAAS,GAA3CC,YAAA,CAAA,EAAA,EAAA,CAAA,sBAAA,CAA6C,CAAF;AACxC,IAAA,IAAM,QAAQ,GAAGC,YAAM,CAAmB,IAAI,CAAC;AAE/C,IAAA,IAAM,mBAAmB,GAAGC,iBAAW,CACnC,UAAC,cAAsB,EAAE,MAAsB,EAAA;AACnC,QAAA,IAAA,QAAQ,GAAmD,MAAM,CAAA,QAAzD,EAAE,sBAAsB,GAA2B,MAAM,CAAA,sBAAjC,EAAE,oBAAoB,GAAK,MAAM,qBAAX;QAE9D,IAAM,8BAA8B,GAAG;AACnC,cAAEC,sBAAgB,CAAC,sBAAsB;cACvC,EAAE;;QAGR,IAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QAE1C,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,EAAE,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;YAC9E,IAAI,eAAe,GAAG,MAAM;AAE5B,YAAA,IACI,MAAM,CAAC,MAAM,KAAK,EAAE;AACpB,iBAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EACpD;AACE,gBAAA,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC
|
|
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, type TextMaskConfig } from 'text-mask-core';\n\nimport { MaskedInput, type 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/Component.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type MaskedInputProps } from '@alfalab/core-components-masked-input/cssm';
|
|
3
|
-
export
|
|
3
|
+
export type PhoneInputProps = Omit<MaskedInputProps, 'onBeforeDisplay' | 'type' | 'mask'> & {
|
|
4
4
|
clearableCountryCode?: boolean;
|
|
5
5
|
};
|
|
6
6
|
export declare const PhoneInput: React.ForwardRefExoticComponent<Omit<MaskedInputProps, "type" | "onBeforeDisplay" | "mask"> & {
|
|
7
|
-
clearableCountryCode?: boolean
|
|
7
|
+
clearableCountryCode?: boolean;
|
|
8
8
|
} & React.RefAttributes<HTMLInputElement>>;
|
package/cssm/Component.js.map
CHANGED
|
@@ -1 +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, type TextMaskConfig } from 'text-mask-core';\n\nimport { MaskedInput, type 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":";;;;;;;;;;;;;;;;;AAUA,IAAM,IAAI,GAAG;IACT,GAAG;IACH,GAAG;IACH,GAAG;IACH,eAAe;IACf,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,IAAI;IACJ,IAAI;CACP;AAED,IAAM,aAAa,GAAG,KAAK;AAMd,IAAA,UAAU,GAAGA,sBAAK,CAAC,UAAU,CACtC,UAAC,EAA6C,EAAE,GAAG,EAAA;IAAhD,IAAA,EAAA,GAAA,EAAA,CAAA,oBAA2B,EAA3B,oBAAoB,GAAG,EAAA,KAAA,MAAA,GAAA,IAAI,KAAA,EAAK,SAAS,GAA3CC,YAAA,CAAA,EAAA,EAAA,CAAA,sBAAA,CAA6C,CAAF;AACxC,IAAA,IAAM,QAAQ,GAAGC,YAAM,CAAmB,IAAI,CAAC;AAE/C,IAAA,IAAM,mBAAmB,GAAGC,iBAAW,CACnC,UAAC,cAAsB,EAAE,MAAsB,EAAA;AACnC,QAAA,IAAA,QAAQ,GAAmD,MAAM,CAAA,QAAzD,EAAE,sBAAsB,GAA2B,MAAM,CAAA,sBAAjC,EAAE,oBAAoB,GAAK,MAAM,qBAAX;QAE9D,IAAM,8BAA8B,GAAG;AACnC,cAAEC,sBAAgB,CAAC,sBAAsB;cACvC,EAAE;;QAGR,IAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QAE1C,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,EAAE,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;YAC9E,IAAI,eAAe,GAAG,MAAM;AAE5B,YAAA,IACI,MAAM,CAAC,MAAM,KAAK,EAAE;AACpB,iBAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EACpD;AACE,gBAAA,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC
|
|
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, type TextMaskConfig } from 'text-mask-core';\n\nimport { MaskedInput, type 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 +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;
|
|
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;IACpF,IAAI,UAAU,EAAE;AACZ,QAAA,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;;AAGf;;;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;;AAGf,YAAA,OAAO,KAAK;;QACd,OAAO,CAAC,EAAE;;AAER,YAAA,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC,CAAC;;;AAIlD,IAAA,OAAO,KAAK;AAChB;;;;"}
|
package/cssm/utils/index.d.ts
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
* Удаляет форматирование номера телефона
|
|
3
3
|
* @param phone Номер телефона
|
|
4
4
|
*/
|
|
5
|
-
/// <reference types="react" />
|
|
6
5
|
export declare const deleteFormatting: (phone: string) => string;
|
|
7
6
|
export declare function setCaretPosition({ position, inputRef, }: {
|
|
8
7
|
position: number;
|
package/cssm/utils/index.js.map
CHANGED
|
@@ -1 +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 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;;QACzB,CAAA,EAAA,GAAA,QAAQ,CAAC,OAAO,MAAE,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC;AAC3D,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
|
|
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 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;;QACzB,CAAA,EAAA,GAAA,QAAQ,CAAC,OAAO,MAAE,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC;AAC3D,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;;QAGnB,OAAO,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC;;AAG/C,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;;AACtB,aAAA,IAAI,IAAI,KAAK,GAAG,EAAE;YACrB,aAAa,GAAG,IAAI;;AAE5B,KAAC,CAAC;IAEF,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;AACpC;;;;;;;"}
|
package/esm/Component.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type MaskedInputProps } from '@alfalab/core-components-masked-input/esm';
|
|
3
|
-
export
|
|
3
|
+
export type PhoneInputProps = Omit<MaskedInputProps, 'onBeforeDisplay' | 'type' | 'mask'> & {
|
|
4
4
|
clearableCountryCode?: boolean;
|
|
5
5
|
};
|
|
6
6
|
export declare const PhoneInput: React.ForwardRefExoticComponent<Omit<MaskedInputProps, "type" | "onBeforeDisplay" | "mask"> & {
|
|
7
|
-
clearableCountryCode?: boolean
|
|
7
|
+
clearableCountryCode?: boolean;
|
|
8
8
|
} & React.RefAttributes<HTMLInputElement>>;
|
package/esm/Component.js.map
CHANGED
|
@@ -1 +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, type TextMaskConfig } from 'text-mask-core';\n\nimport { MaskedInput, type 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":";;;;;;;;AAUA,IAAM,IAAI,GAAG;IACT,GAAG;IACH,GAAG;IACH,GAAG;IACH,eAAe;IACf,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,IAAI;IACJ,IAAI;CACP;AAED,IAAM,aAAa,GAAG,KAAK;AAMd,IAAA,UAAU,GAAG,KAAK,CAAC,UAAU,CACtC,UAAC,EAA6C,EAAE,GAAG,EAAA;IAAhD,IAAA,EAAA,GAAA,EAAA,CAAA,oBAA2B,EAA3B,oBAAoB,GAAG,EAAA,KAAA,MAAA,GAAA,IAAI,KAAA,EAAK,SAAS,GAA3C,MAAA,CAAA,EAAA,EAAA,CAAA,sBAAA,CAA6C,CAAF;AACxC,IAAA,IAAM,QAAQ,GAAG,MAAM,CAAmB,IAAI,CAAC;AAE/C,IAAA,IAAM,mBAAmB,GAAG,WAAW,CACnC,UAAC,cAAsB,EAAE,MAAsB,EAAA;AACnC,QAAA,IAAA,QAAQ,GAAmD,MAAM,CAAA,QAAzD,EAAE,sBAAsB,GAA2B,MAAM,CAAA,sBAAjC,EAAE,oBAAoB,GAAK,MAAM,qBAAX;QAE9D,IAAM,8BAA8B,GAAG;AACnC,cAAE,gBAAgB,CAAC,sBAAsB;cACvC,EAAE;;QAGR,IAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QAE1C,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,EAAE,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;YAC9E,IAAI,eAAe,GAAG,MAAM;AAE5B,YAAA,IACI,MAAM,CAAC,MAAM,KAAK,EAAE;AACpB,iBAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EACpD;AACE,gBAAA,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC
|
|
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, type TextMaskConfig } from 'text-mask-core';\n\nimport { MaskedInput, type 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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"}
|
|
@@ -1 +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;
|
|
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;IACpF,IAAI,UAAU,EAAE;AACZ,QAAA,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;;AAGf;;;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;;AAGf,YAAA,OAAO,KAAK;;QACd,OAAO,CAAC,EAAE;;AAER,YAAA,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC,CAAC;;;AAIlD,IAAA,OAAO,KAAK;AAChB;;;;"}
|
package/esm/utils/index.d.ts
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
* Удаляет форматирование номера телефона
|
|
3
3
|
* @param phone Номер телефона
|
|
4
4
|
*/
|
|
5
|
-
/// <reference types="react" />
|
|
6
5
|
export declare const deleteFormatting: (phone: string) => string;
|
|
7
6
|
export declare function setCaretPosition({ position, inputRef, }: {
|
|
8
7
|
position: number;
|
package/esm/utils/index.js.map
CHANGED
|
@@ -1 +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 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;;QACzB,CAAA,EAAA,GAAA,QAAQ,CAAC,OAAO,MAAE,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC;AAC3D,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
|
|
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 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;;QACzB,CAAA,EAAA,GAAA,QAAQ,CAAC,OAAO,MAAE,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC;AAC3D,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;;QAGnB,OAAO,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC;;AAG/C,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;;AACtB,aAAA,IAAI,IAAI,KAAK,GAAG,EAAE;YACrB,aAAa,GAAG,IAAI;;AAE5B,KAAC,CAAC;IAEF,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;AACpC;;;;"}
|
package/modern/Component.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type MaskedInputProps } from '@alfalab/core-components-masked-input/modern';
|
|
3
|
-
export
|
|
3
|
+
export type PhoneInputProps = Omit<MaskedInputProps, 'onBeforeDisplay' | 'type' | 'mask'> & {
|
|
4
4
|
clearableCountryCode?: boolean;
|
|
5
5
|
};
|
|
6
6
|
export declare const PhoneInput: React.ForwardRefExoticComponent<Omit<MaskedInputProps, "type" | "onBeforeDisplay" | "mask"> & {
|
|
7
|
-
clearableCountryCode?: boolean
|
|
7
|
+
clearableCountryCode?: boolean;
|
|
8
8
|
} & React.RefAttributes<HTMLInputElement>>;
|
package/modern/Component.js.map
CHANGED
|
@@ -1 +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, type TextMaskConfig } from 'text-mask-core';\n\nimport { MaskedInput, type 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":";;;;;;;AAAA;AAUA,MAAM,IAAI,GAAG;IACT,GAAG;IACH,GAAG;IACH,GAAG;IACH,eAAe;IACf,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,IAAI;IACJ,IAAI;CACP;AAED,MAAM,aAAa,GAAG,KAAK;MAMd,UAAU,GAAG,KAAK,CAAC,UAAU,CACtC,CAAC,EAAE,oBAAoB,GAAG,IAAI,EAAE,GAAG,SAAS,EAAE,EAAE,GAAG,KAAI;AACnD,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAmB,IAAI,CAAC;IAE/C,MAAM,mBAAmB,GAAG,WAAW,CACnC,CAAC,cAAsB,EAAE,MAAsB,KAAI;QAC/C,MAAM,EAAE,QAAQ,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,GAAG,MAAM;QAEzE,MAAM,8BAA8B,GAAG;AACnC,cAAE,gBAAgB,CAAC,sBAAsB;cACvC,EAAE;;QAGR,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QAE1C,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,EAAE,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;YAC9E,IAAI,eAAe,GAAG,MAAM;AAE5B,YAAA,IACI,MAAM,CAAC,MAAM,KAAK,EAAE;AACpB,iBAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EACpD;AACE,gBAAA,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC
|
|
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, type TextMaskConfig } from 'text-mask-core';\n\nimport { MaskedInput, type 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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"}
|
|
@@ -1 +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;MACU,iBAAiB,GAAG,CAAC,UAA8B,EAAE,cAAsB,KAAI;
|
|
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;MACU,iBAAiB,GAAG,CAAC,UAA8B,EAAE,cAAsB,KAAI;IACxF,IAAI,UAAU,EAAE;AACZ,QAAA,IAAI;;;AAGA,YAAA,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;;YAE5D,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AAEnD;;;AAGG;YACH,MAAM,gBAAgB,GAAG,IAAI,MAAM,CAAC,CAAW,QAAA,EAAA,IAAI,CAAG,CAAA,CAAA,CAAC;AAEvD,YAAA,IAAI,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;AACjC,gBAAA,OAAO,IAAI;;AAGf;;;AAGG;YACH,MAAM,iBAAiB,GAAG,IAAI,MAAM,CAAC,CAAW,QAAA,EAAA,IAAI,CAAG,CAAA,CAAA,CAAC;AAExD,YAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;AAClC,gBAAA,OAAO,IAAI;;AAGf,YAAA,OAAO,KAAK;;QACd,OAAO,CAAC,EAAE;;AAER,YAAA,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC,CAAC;;;AAIlD,IAAA,OAAO,KAAK;AAChB;;;;"}
|
package/modern/utils/index.d.ts
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
* Удаляет форматирование номера телефона
|
|
3
3
|
* @param phone Номер телефона
|
|
4
4
|
*/
|
|
5
|
-
/// <reference types="react" />
|
|
6
5
|
export declare const deleteFormatting: (phone: string) => string;
|
|
7
6
|
export declare function setCaretPosition({ position, inputRef, }: {
|
|
8
7
|
position: number;
|
|
@@ -1 +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 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,MAAM,gBAAgB,GAAG,CAAC,KAAa,KAC1C,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE;SAE9C,gBAAgB,CAAC,EAC7B,QAAQ,EACR,QAAQ,GAIX,EAAA;AACG,IAAA,MAAM,CAAC,qBAAqB,CAAC,MAAK;QAC9B,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC;AAC3D,KAAC,CAAC;AACN;AAEM,SAAU,iBAAiB,CAAC,EAC9B,QAAQ,EACR,oBAAoB,EACpB,aAAa,EACb,sBAAsB,GAMzB,EAAA;AACG,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
|
|
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 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,MAAM,gBAAgB,GAAG,CAAC,KAAa,KAC1C,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE;SAE9C,gBAAgB,CAAC,EAC7B,QAAQ,EACR,QAAQ,GAIX,EAAA;AACG,IAAA,MAAM,CAAC,qBAAqB,CAAC,MAAK;QAC9B,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC;AAC3D,KAAC,CAAC;AACN;AAEM,SAAU,iBAAiB,CAAC,EAC9B,QAAQ,EACR,oBAAoB,EACpB,aAAa,EACb,sBAAsB,GAMzB,EAAA;AACG,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;;QAGnB,OAAO,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC;;AAG/C,IAAA,OAAO,QAAQ;AACnB;AAEgB,SAAA,cAAc,CAAC,aAAqB,EAAE,QAAgB,EAAA;AAClE,IAAA,MAAM,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,MAAM,MAAM,GAAa,EAAE;AAE3B,IAAA,iBAAiB,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;QAC/B,IAAI,aAAa,IAAI,IAAI,KAAK,aAAa,CAAC,oBAAoB,CAAC,EAAE;AAC/D,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;YACjB,oBAAoB,IAAI,CAAC;;AACtB,aAAA,IAAI,IAAI,KAAK,GAAG,EAAE;YACrB,aAAa,GAAG,IAAI;;AAE5B,KAAC,CAAC;IAEF,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;AACpC;;;;"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type MaskedInputProps } from '@alfalab/core-components-masked-input/moderncssm';
|
|
3
|
-
export
|
|
3
|
+
export type PhoneInputProps = Omit<MaskedInputProps, 'onBeforeDisplay' | 'type' | 'mask'> & {
|
|
4
4
|
clearableCountryCode?: boolean;
|
|
5
5
|
};
|
|
6
6
|
export declare const PhoneInput: React.ForwardRefExoticComponent<Omit<MaskedInputProps, "type" | "onBeforeDisplay" | "mask"> & {
|
|
7
|
-
clearableCountryCode?: boolean
|
|
7
|
+
clearableCountryCode?: boolean;
|
|
8
8
|
} & React.RefAttributes<HTMLInputElement>>;
|
|
@@ -1 +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, type TextMaskConfig } from 'text-mask-core';\n\nimport { MaskedInput, type 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":";;;;;;;AAAA;AAUA,MAAM,IAAI,GAAG;IACT,GAAG;IACH,GAAG;IACH,GAAG;IACH,eAAe;IACf,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,IAAI;IACJ,IAAI;CACP;AAED,MAAM,aAAa,GAAG,KAAK;MAMd,UAAU,GAAG,KAAK,CAAC,UAAU,CACtC,CAAC,EAAE,oBAAoB,GAAG,IAAI,EAAE,GAAG,SAAS,EAAE,EAAE,GAAG,KAAI;AACnD,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAmB,IAAI,CAAC;IAE/C,MAAM,mBAAmB,GAAG,WAAW,CACnC,CAAC,cAAsB,EAAE,MAAsB,KAAI;QAC/C,MAAM,EAAE,QAAQ,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,GAAG,MAAM;QAEzE,MAAM,8BAA8B,GAAG;AACnC,cAAE,gBAAgB,CAAC,sBAAsB;cACvC,EAAE;;QAGR,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QAE1C,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,EAAE,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;YAC9E,IAAI,eAAe,GAAG,MAAM;AAE5B,YAAA,IACI,MAAM,CAAC,MAAM,KAAK,EAAE;AACpB,iBAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EACpD;AACE,gBAAA,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC
|
|
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, type TextMaskConfig } from 'text-mask-core';\n\nimport { MaskedInput, type 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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"}
|
|
@@ -1 +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;MACU,iBAAiB,GAAG,CAAC,UAA8B,EAAE,cAAsB,KAAI;
|
|
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;MACU,iBAAiB,GAAG,CAAC,UAA8B,EAAE,cAAsB,KAAI;IACxF,IAAI,UAAU,EAAE;AACZ,QAAA,IAAI;;;AAGA,YAAA,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;;YAE5D,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AAEnD;;;AAGG;YACH,MAAM,gBAAgB,GAAG,IAAI,MAAM,CAAC,CAAW,QAAA,EAAA,IAAI,CAAG,CAAA,CAAA,CAAC;AAEvD,YAAA,IAAI,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;AACjC,gBAAA,OAAO,IAAI;;AAGf;;;AAGG;YACH,MAAM,iBAAiB,GAAG,IAAI,MAAM,CAAC,CAAW,QAAA,EAAA,IAAI,CAAG,CAAA,CAAA,CAAC;AAExD,YAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;AAClC,gBAAA,OAAO,IAAI;;AAGf,YAAA,OAAO,KAAK;;QACd,OAAO,CAAC,EAAE;;AAER,YAAA,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC,CAAC;;;AAIlD,IAAA,OAAO,KAAK;AAChB;;;;"}
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
* Удаляет форматирование номера телефона
|
|
3
3
|
* @param phone Номер телефона
|
|
4
4
|
*/
|
|
5
|
-
/// <reference types="react" />
|
|
6
5
|
export declare const deleteFormatting: (phone: string) => string;
|
|
7
6
|
export declare function setCaretPosition({ position, inputRef, }: {
|
|
8
7
|
position: number;
|
|
@@ -1 +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 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,MAAM,gBAAgB,GAAG,CAAC,KAAa,KAC1C,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE;SAE9C,gBAAgB,CAAC,EAC7B,QAAQ,EACR,QAAQ,GAIX,EAAA;AACG,IAAA,MAAM,CAAC,qBAAqB,CAAC,MAAK;QAC9B,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC;AAC3D,KAAC,CAAC;AACN;AAEM,SAAU,iBAAiB,CAAC,EAC9B,QAAQ,EACR,oBAAoB,EACpB,aAAa,EACb,sBAAsB,GAMzB,EAAA;AACG,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
|
|
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 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,MAAM,gBAAgB,GAAG,CAAC,KAAa,KAC1C,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE;SAE9C,gBAAgB,CAAC,EAC7B,QAAQ,EACR,QAAQ,GAIX,EAAA;AACG,IAAA,MAAM,CAAC,qBAAqB,CAAC,MAAK;QAC9B,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC;AAC3D,KAAC,CAAC;AACN;AAEM,SAAU,iBAAiB,CAAC,EAC9B,QAAQ,EACR,oBAAoB,EACpB,aAAa,EACb,sBAAsB,GAMzB,EAAA;AACG,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;;QAGnB,OAAO,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC;;AAG/C,IAAA,OAAO,QAAQ;AACnB;AAEgB,SAAA,cAAc,CAAC,aAAqB,EAAE,QAAgB,EAAA;AAClE,IAAA,MAAM,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,MAAM,MAAM,GAAa,EAAE;AAE3B,IAAA,iBAAiB,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;QAC/B,IAAI,aAAa,IAAI,IAAI,KAAK,aAAa,CAAC,oBAAoB,CAAC,EAAE;AAC/D,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;YACjB,oBAAoB,IAAI,CAAC;;AACtB,aAAA,IAAI,IAAI,KAAK,GAAG,EAAE;YACrB,aAAa,GAAG,IAAI;;AAE5B,KAAC,CAAC;IAEF,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;AACpC;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alfalab/core-components-phone-input",
|
|
3
|
-
"version": "9.0.
|
|
3
|
+
"version": "9.0.5",
|
|
4
4
|
"description": "",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"license": "MIT",
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"main": "index.js",
|
|
11
11
|
"module": "./esm/index.js",
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@alfalab/core-components-masked-input": "^8.0.
|
|
13
|
+
"@alfalab/core-components-masked-input": "^8.0.5",
|
|
14
14
|
"react-merge-refs": "^1.1.0",
|
|
15
15
|
"text-mask-core": "^5.1.2",
|
|
16
16
|
"tslib": "^2.4.0"
|
|
@@ -24,5 +24,5 @@
|
|
|
24
24
|
"directory": "dist"
|
|
25
25
|
},
|
|
26
26
|
"themesVersion": "15.0.2",
|
|
27
|
-
"varsVersion": "11.0.
|
|
27
|
+
"varsVersion": "11.0.2"
|
|
28
28
|
}
|
|
@@ -1 +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;
|
|
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;IACpF,IAAI,UAAU,EAAE;AACZ,QAAA,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;;AAGf;;;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;;AAGf,YAAA,OAAO,KAAK;;QACd,OAAO,CAAC,EAAE;;AAER,YAAA,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC,CAAC;;;AAIlD,IAAA,OAAO,KAAK;AAChB;;;;"}
|
package/utils/index.d.ts
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
* Удаляет форматирование номера телефона
|
|
3
3
|
* @param phone Номер телефона
|
|
4
4
|
*/
|
|
5
|
-
/// <reference types="react" />
|
|
6
5
|
export declare const deleteFormatting: (phone: string) => string;
|
|
7
6
|
export declare function setCaretPosition({ position, inputRef, }: {
|
|
8
7
|
position: number;
|
package/utils/index.js.map
CHANGED
|
@@ -1 +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 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;;QACzB,CAAA,EAAA,GAAA,QAAQ,CAAC,OAAO,MAAE,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC;AAC3D,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
|
|
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 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;;QACzB,CAAA,EAAA,GAAA,QAAQ,CAAC,OAAO,MAAE,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC;AAC3D,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;;QAGnB,OAAO,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC;;AAG/C,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;;AACtB,aAAA,IAAI,IAAI,KAAK,GAAG,EAAE;YACrB,aAAa,GAAG,IAAI;;AAE5B,KAAC,CAAC;IAEF,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;AACpC;;;;;;;"}
|