@cloud-ru/ds-uikit-product-fields-predefined 2.0.30-preview-20b4671f.0 → 2.0.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/README.md +10 -19
- package/dist/cjs/components/FieldPhone/FieldPhone.d.ts +2 -2
- package/dist/cjs/components/FieldPhone/hooks/useCountries.d.ts +1 -1
- package/dist/cjs/components/FieldPhone/hooks/useCountries.js +28 -12
- package/dist/cjs/components/FieldPhone/types.d.ts +5 -6
- package/dist/cjs/components/FieldPhone/utils.d.ts +1 -0
- package/dist/cjs/components/FieldPhone/utils.js +3 -1
- package/dist/esm/components/FieldPhone/FieldPhone.d.ts +2 -2
- package/dist/esm/components/FieldPhone/countries.js +1 -1
- package/dist/esm/components/FieldPhone/hooks/useCountries.d.ts +1 -1
- package/dist/esm/components/FieldPhone/hooks/useCountries.js +28 -12
- package/dist/esm/components/FieldPhone/types.d.ts +5 -6
- package/dist/esm/components/FieldPhone/utils.d.ts +1 -0
- package/dist/esm/components/FieldPhone/utils.js +1 -0
- package/dist/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +16 -16
- package/src/components/FieldPhone/FieldPhone.tsx +2 -2
- package/src/components/FieldPhone/countries.tsx +1 -1
- package/src/components/FieldPhone/hooks/useCountries.ts +32 -17
- package/src/components/FieldPhone/types.ts +5 -6
- package/src/components/FieldPhone/utils.ts +2 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cloud-ru/ds-uikit-product-fields-predefined",
|
|
3
|
-
"version": "2.0.30
|
|
3
|
+
"version": "2.0.30",
|
|
4
4
|
"description": "Набор предопределённых полей формы поверх @ds/fields — телефон, маски, имя, описание, код и другие готовые сценарии ввода.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -44,21 +44,21 @@
|
|
|
44
44
|
"imask": "^7.6.1",
|
|
45
45
|
"merge-refs": "^2.0.0",
|
|
46
46
|
"react-imask": "^7.6.1",
|
|
47
|
-
"@cloud-ru/ds-adaptive": "1.0.2",
|
|
48
|
-
"@cloud-ru/ds-
|
|
49
|
-
"@cloud-ru/ds-
|
|
50
|
-
"@cloud-ru/ds-
|
|
51
|
-
"@cloud-ru/ds-
|
|
52
|
-
"@cloud-ru/ds-
|
|
53
|
-
"@cloud-ru/ds-
|
|
54
|
-
"@cloud-ru/ds-
|
|
55
|
-
"@cloud-ru/ds-
|
|
56
|
-
"@cloud-ru/ds-
|
|
57
|
-
"@cloud-ru/ds-
|
|
58
|
-
"@cloud-ru/ds-
|
|
59
|
-
"@cloud-ru/ds-
|
|
60
|
-
"@cloud-ru/ds-
|
|
61
|
-
"@cloud-ru/ds-
|
|
47
|
+
"@cloud-ru/ds-adaptive": "^1.0.2",
|
|
48
|
+
"@cloud-ru/ds-attachment": "^1.1.19",
|
|
49
|
+
"@cloud-ru/ds-drawer": "^2.1.0",
|
|
50
|
+
"@cloud-ru/ds-button": "^1.0.4",
|
|
51
|
+
"@cloud-ru/ds-dropzone": "^1.0.3",
|
|
52
|
+
"@cloud-ru/ds-field-decorator": "^1.1.4",
|
|
53
|
+
"@cloud-ru/ds-fields": "^2.5.3",
|
|
54
|
+
"@cloud-ru/ds-icons": "^1.5.1",
|
|
55
|
+
"@cloud-ru/ds-input-private": "^1.0.11",
|
|
56
|
+
"@cloud-ru/ds-list": "^2.3.3",
|
|
57
|
+
"@cloud-ru/ds-locale": "^1.0.0",
|
|
58
|
+
"@cloud-ru/ds-tooltip": "^1.0.12",
|
|
59
|
+
"@cloud-ru/ds-utils": "^1.2.0",
|
|
60
|
+
"@cloud-ru/ds-scroll": "^1.0.5",
|
|
61
|
+
"@cloud-ru/ds-modal": "^2.0.1"
|
|
62
62
|
},
|
|
63
63
|
"peerDependencies": {
|
|
64
64
|
"react-hook-form": "^7.79.0",
|
|
@@ -41,8 +41,8 @@ export type FieldPhoneProps = Omit<
|
|
|
41
41
|
/** Плейсхолдер поля поиска в выпадающем списке стран */
|
|
42
42
|
searchPlaceholder?: string;
|
|
43
43
|
onChangeCountry?(country: FieldPhoneOptionsProps): void;
|
|
44
|
-
/**
|
|
45
|
-
options
|
|
44
|
+
/** Конфигурация для изменения стандартного списка стран */
|
|
45
|
+
options?: CountrySettings;
|
|
46
46
|
};
|
|
47
47
|
|
|
48
48
|
export const FieldPhone = forwardRef<HTMLInputElement, FieldPhoneProps>(function FieldPhone(
|
|
@@ -1752,4 +1752,4 @@ export const ALL_COUNTRY_CODES = [
|
|
|
1752
1752
|
JAPAN_COUNTRY_CODE,
|
|
1753
1753
|
] as const;
|
|
1754
1754
|
|
|
1755
|
-
export const ENABLED_COUNTRY_CODES =
|
|
1755
|
+
export const ENABLED_COUNTRY_CODES = ALL_COUNTRY_CODES.filter(({ enabled }) => enabled);
|
|
@@ -1,25 +1,40 @@
|
|
|
1
1
|
import { useMemo } from 'react';
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { ALL_COUNTRY_CODES } from '../countries';
|
|
4
|
+
import { Country, CountrySettings, FieldPhoneOptionsProps } from '../types';
|
|
5
|
+
import { uniqueSet } from '../utils';
|
|
4
6
|
import { useMapCountryToOptions } from './useMapCountryToOptions';
|
|
5
7
|
|
|
6
|
-
function
|
|
7
|
-
|
|
8
|
-
return overriddenOptions
|
|
9
|
-
.map(({ id, iso2, mask, content }) => [id, iso2, mask, content.label, content.caption].join(':'))
|
|
10
|
-
.join();
|
|
11
|
-
}
|
|
8
|
+
export function useCountries(optionsSettings?: CountrySettings): FieldPhoneOptionsProps[] {
|
|
9
|
+
const mapCountryToOption = useMapCountryToOptions();
|
|
12
10
|
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
const filterCountries = useMemo(() => {
|
|
12
|
+
if (!optionsSettings) {
|
|
13
|
+
return () => true;
|
|
14
|
+
}
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
const { includedCountries, excludedCountries } = optionsSettings;
|
|
17
|
+
const uniqueKey = 'value' satisfies keyof Country;
|
|
18
|
+
|
|
19
|
+
if (includedCountries) {
|
|
20
|
+
const includedSet = uniqueSet(includedCountries, uniqueKey);
|
|
21
|
+
return (country: Country) => includedSet.has(country[uniqueKey]);
|
|
22
|
+
}
|
|
23
|
+
if (excludedCountries) {
|
|
24
|
+
const excludedSet = uniqueSet(excludedCountries, uniqueKey);
|
|
25
|
+
return (country: Country) => !excludedSet.has(country[uniqueKey]);
|
|
26
|
+
}
|
|
27
|
+
return () => true;
|
|
28
|
+
}, [optionsSettings]);
|
|
29
|
+
|
|
30
|
+
return useMemo(() => {
|
|
31
|
+
if (optionsSettings?.overriddenOptions) return optionsSettings.overriddenOptions;
|
|
19
32
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
33
|
+
return ALL_COUNTRY_CODES.reduce<FieldPhoneOptionsProps[]>((result, country) => {
|
|
34
|
+
if (filterCountries(country)) {
|
|
35
|
+
result.push(mapCountryToOption(country));
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
}, []);
|
|
39
|
+
}, [optionsSettings, filterCountries, mapCountryToOption]);
|
|
25
40
|
}
|
|
@@ -23,11 +23,10 @@ type OneOf<T extends object> = {
|
|
|
23
23
|
}[keyof T];
|
|
24
24
|
|
|
25
25
|
export type CountrySettings = OneOf<{
|
|
26
|
-
/**
|
|
27
|
-
* Страны селектора в порядке передачи. В бандл попадают флаги только переданных стран;
|
|
28
|
-
* весь встроенный перечень — `ALL_COUNTRY_CODES`.
|
|
29
|
-
*/
|
|
30
|
-
includedCountries: readonly Country[];
|
|
31
|
-
/** Собственные элементы выпадающего списка вместо встроенных стран */
|
|
26
|
+
/** Список элементов выпадающего списка со странами; переопределяет встроенный список пакета */
|
|
32
27
|
overriddenOptions: FieldPhoneOptionsProps[];
|
|
28
|
+
/** Список стран, которые должны отображаться в селекторе (из встроенного перечня пакета) */
|
|
29
|
+
includedCountries: Country[];
|
|
30
|
+
/** Список стран, которые будут исключены из встроенного перечня пакета */
|
|
31
|
+
excludedCountries: Country[];
|
|
33
32
|
}>;
|
|
@@ -3,6 +3,8 @@ import { parsePhoneNumber } from 'awesome-phonenumber';
|
|
|
3
3
|
import { ABKHAZIA_COUNTRY_CODE, RUSSIA_COUNTRY_CODE } from './countries';
|
|
4
4
|
import { FieldPhoneOptionsProps } from './types';
|
|
5
5
|
|
|
6
|
+
export const uniqueSet = <T, K extends keyof T>(arr: T[], key: K): Set<T[K]> => new Set(arr.map(obj => obj[key]));
|
|
7
|
+
|
|
6
8
|
/* Приходит +79878887879/+7987****875, на основании mask возвращается +7 987-888-78-79/+7 987-***-*8-75 */
|
|
7
9
|
export const formatPhoneNumber = <T extends { caption: string; mask: string }>(
|
|
8
10
|
phone: string,
|