@hh.ru/magritte-ui-phone-input 4.3.42 → 4.3.43
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/CallingCodeInput-CccAVXGJ.js +139 -0
- package/{CallingCodeInput-Ogu4q8KJ.js.map → CallingCodeInput-CccAVXGJ.js.map} +1 -1
- package/CallingCodeInput.d.ts +1 -1
- package/CallingCodeInput.js +1 -1
- package/PhoneInput.js +162 -80
- package/PhoneInput.js.map +1 -1
- package/RegionSelect.d.ts +2 -2
- package/RegionSelect.js +95 -28
- package/RegionSelect.js.map +1 -1
- package/basicMetadata.js +246 -246
- package/basicMetadata.js.map +1 -1
- package/index.css +86 -86
- package/index.d.ts +1 -1
- package/index.js +1 -1
- package/index.mock.d.ts +1 -1
- package/index.mock.js +2 -2
- package/index.mock.js.map +1 -1
- package/{metadata.max-9QE7yvT0.js → metadata.max-BtLm3_Jz.js} +1 -1
- package/{metadata.max-9QE7yvT0.js.map → metadata.max-BtLm3_Jz.js.map} +1 -1
- package/{metadata.mobile-Cg_YYjqX.js → metadata.mobile-PgGgMG2t.js} +1 -1
- package/{metadata.mobile-Cg_YYjqX.js.map → metadata.mobile-PgGgMG2t.js.map} +1 -1
- package/{metadata.ru_by_kz_uz.max-nBKQvqlT.js → metadata.ru_by_kz_uz.max-DOkjzVfi.js} +1 -1
- package/{metadata.ru_by_kz_uz.max-nBKQvqlT.js.map → metadata.ru_by_kz_uz.max-DOkjzVfi.js.map} +1 -1
- package/{metadata.ru_by_kz_uz.mobile-BwubXzSX.js → metadata.ru_by_kz_uz.mobile-BjjwTeqx.js} +1 -1
- package/{metadata.ru_by_kz_uz.mobile-BwubXzSX.js.map → metadata.ru_by_kz_uz.mobile-BjjwTeqx.js.map} +1 -1
- package/package.json +9 -9
- package/phoneFormatter.d.ts +1 -1
- package/phoneFormatter.js +59 -83
- package/phoneFormatter.js.map +1 -1
- package/useCountrySelectDataProvider.d.ts +1 -1
- package/useCountrySelectDataProvider.js +116 -136
- package/useCountrySelectDataProvider.js.map +1 -1
- package/useLibPhoneNumber.js +65 -65
- package/useLibPhoneNumber.js.map +1 -1
- package/CallingCodeInput-Ogu4q8KJ.js +0 -95
package/RegionSelect.js
CHANGED
|
@@ -5,55 +5,122 @@ import classNames from 'classnames';
|
|
|
5
5
|
import { useIsFlagEmojiSupported, useFlagEmojiFont } from '@hh.ru/magritte-common-flag-emoji-font';
|
|
6
6
|
import { CellText, Cell, CellRightLabel } from '@hh.ru/magritte-ui-cell';
|
|
7
7
|
import { NavBar } from '@hh.ru/magritte-ui-nav-bar';
|
|
8
|
-
import { s as styles, C as CallingCodeInput } from './CallingCodeInput-
|
|
8
|
+
import { s as styles, C as CallingCodeInput } from './CallingCodeInput-CccAVXGJ.js';
|
|
9
9
|
import { Select } from '@hh.ru/magritte-ui-select';
|
|
10
10
|
import '@hh.ru/magritte-common-keyboard';
|
|
11
11
|
import '@hh.ru/magritte-common-use-multiple-refs';
|
|
12
12
|
import '@hh.ru/magritte-ui-breakpoint';
|
|
13
13
|
|
|
14
14
|
const getFlagEmoji = (countryCode) => {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
.split('')
|
|
18
|
-
.map((char) => 127397 + char.charCodeAt(0));
|
|
19
|
-
return String.fromCodePoint(...codePoints);
|
|
15
|
+
const codePoints = countryCode.toUpperCase().split("").map((char) => 127397 + char.charCodeAt(0));
|
|
16
|
+
return String.fromCodePoint(...codePoints);
|
|
20
17
|
};
|
|
21
18
|
const SelectItem = ({ data, onChange, type }) => {
|
|
22
|
-
|
|
23
|
-
|
|
19
|
+
if (type === "delimiter") {
|
|
20
|
+
return /* @__PURE__ */ jsx(CellText, { maxLines: 1, style: "secondary", children: data.text });
|
|
21
|
+
}
|
|
22
|
+
return /* @__PURE__ */ jsx(
|
|
23
|
+
Cell,
|
|
24
|
+
{
|
|
25
|
+
left: /* @__PURE__ */ jsx("div", { className: styles.flagContainer, children: /* @__PURE__ */ jsx("span", { className: classNames(styles.flagEmoji), children: getFlagEmoji(data.value) }) }),
|
|
26
|
+
right: /* @__PURE__ */ jsxs(CellRightLabel, { hideIcon: true, children: [
|
|
27
|
+
"+",
|
|
28
|
+
data.callingCode
|
|
29
|
+
] }),
|
|
30
|
+
horPadding: false,
|
|
31
|
+
vertPadding: false,
|
|
32
|
+
onClick: () => onChange(data),
|
|
33
|
+
tabIndex: -1,
|
|
34
|
+
children: /* @__PURE__ */ jsx(CellText, { children: data.text })
|
|
24
35
|
}
|
|
25
|
-
|
|
36
|
+
);
|
|
26
37
|
};
|
|
27
|
-
const RegionSelect = forwardRef(
|
|
38
|
+
const RegionSelect = forwardRef(
|
|
39
|
+
({
|
|
40
|
+
selectDataProvider,
|
|
41
|
+
selectOptions,
|
|
42
|
+
country,
|
|
43
|
+
countryLocked,
|
|
44
|
+
callingCode,
|
|
45
|
+
onChange,
|
|
46
|
+
invalid,
|
|
47
|
+
libPhoneNumberAPI,
|
|
48
|
+
showSearchInMobile,
|
|
49
|
+
disabled,
|
|
50
|
+
metadataVariant,
|
|
51
|
+
descriptionId
|
|
52
|
+
}, ref) => {
|
|
28
53
|
const { getCountryCallingCode } = libPhoneNumberAPI;
|
|
29
54
|
const [inputValue, setInputValue] = useState(`+${callingCode}`);
|
|
30
55
|
const exactMatchRef = useRef(true);
|
|
31
56
|
const isFlagEmojiSupported = useIsFlagEmojiSupported();
|
|
32
57
|
useFlagEmojiFont(metadataVariant, isFlagEmojiSupported);
|
|
33
|
-
const pickerRefCallback = useCallback(
|
|
58
|
+
const pickerRefCallback = useCallback(
|
|
59
|
+
(node) => {
|
|
34
60
|
if (node) {
|
|
35
|
-
|
|
61
|
+
node.classList.toggle(styles.noFlagEmoji, !isFlagEmojiSupported);
|
|
36
62
|
}
|
|
37
|
-
|
|
63
|
+
},
|
|
64
|
+
[isFlagEmojiSupported]
|
|
65
|
+
);
|
|
38
66
|
useEffect(() => {
|
|
39
|
-
|
|
67
|
+
setInputValue(`+${callingCode}`);
|
|
40
68
|
}, [callingCode]);
|
|
41
69
|
const value = useMemo(() => selectOptions.find((item) => item.value === country), [selectOptions, country]);
|
|
42
|
-
return
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
70
|
+
return /* @__PURE__ */ jsxs(
|
|
71
|
+
Select,
|
|
72
|
+
{
|
|
73
|
+
dataProvider: selectDataProvider,
|
|
74
|
+
value,
|
|
75
|
+
onChange: (selectedValue) => {
|
|
76
|
+
exactMatchRef.current = true;
|
|
77
|
+
onChange?.(selectedValue.value, getCountryCallingCode(selectedValue.value));
|
|
78
|
+
},
|
|
79
|
+
onBlur: () => {
|
|
80
|
+
if (!exactMatchRef.current) {
|
|
81
|
+
const code = inputValue.substring(1);
|
|
82
|
+
const bestMatch = selectOptions.find((option) => option?.callingCode.startsWith(code));
|
|
83
|
+
if (bestMatch && bestMatch.value) {
|
|
84
|
+
onChange(bestMatch.value, bestMatch.callingCode);
|
|
85
|
+
setInputValue(`+${bestMatch.callingCode}`);
|
|
53
86
|
}
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
children: [
|
|
90
|
+
/* @__PURE__ */ jsx(
|
|
91
|
+
CallingCodeInput,
|
|
92
|
+
{
|
|
93
|
+
inputElementRef: ref,
|
|
94
|
+
className: !isFlagEmojiSupported && styles.noFlagEmoji,
|
|
95
|
+
flag: /* @__PURE__ */ jsx("span", { className: classNames(styles.flagEmoji), children: getFlagEmoji(country) }),
|
|
96
|
+
invalid,
|
|
97
|
+
disabled: disabled || countryLocked,
|
|
98
|
+
descriptionId,
|
|
99
|
+
selectOptions,
|
|
100
|
+
exactMatchRef,
|
|
101
|
+
onChange,
|
|
102
|
+
value: inputValue,
|
|
103
|
+
setValue: setInputValue
|
|
104
|
+
}
|
|
105
|
+
),
|
|
106
|
+
/* @__PURE__ */ jsx(Select.Drop, { widthEqualToActivator: false, ref: pickerRefCallback, children: /* @__PURE__ */ jsx(Select.Options, { type: "radio", optionLayoutComponent: SelectItem }) }),
|
|
107
|
+
/* @__PURE__ */ jsx(
|
|
108
|
+
Select.BottomSheet,
|
|
109
|
+
{
|
|
110
|
+
ref: pickerRefCallback,
|
|
111
|
+
header: /* @__PURE__ */ jsxs(NavBar, { children: [
|
|
112
|
+
/* @__PURE__ */ jsx(NavBar.Pane, { children: /* @__PURE__ */ jsx(NavBar.Actions, { centered: true, right: /* @__PURE__ */ jsx(Select.PickerCloseIcon, {}) }) }),
|
|
113
|
+
showSearchInMobile && /* @__PURE__ */ jsx(NavBar.Pane, { children: /* @__PURE__ */ jsx(Select.SearchInput, { clearable: true, size: "medium" }) })
|
|
114
|
+
] }),
|
|
115
|
+
children: /* @__PURE__ */ jsx(Select.Options, { type: "radio", optionLayoutComponent: SelectItem })
|
|
116
|
+
}
|
|
117
|
+
)
|
|
118
|
+
]
|
|
119
|
+
}
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
);
|
|
123
|
+
RegionSelect.displayName = "RegionSelect";
|
|
57
124
|
|
|
58
125
|
export { RegionSelect };
|
|
59
126
|
//# sourceMappingURL=RegionSelect.js.map
|
package/RegionSelect.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RegionSelect.js","sources":["src/RegionSelect.tsx"],"sourcesContent":["import { forwardRef, useState, useRef, useEffect, useCallback, useMemo } from 'react';\nimport classNames from 'classnames';\nimport { type CountryCode, type CountryCallingCode } from 'libphonenumber-js';\n\nimport { DataProvider } from '@hh.ru/magritte-common-data-provider';\nimport { useFlagEmojiFont, useIsFlagEmojiSupported } from '@hh.ru/magritte-common-flag-emoji-font';\nimport { Cell, CellRightLabel, CellText } from '@hh.ru/magritte-ui-cell';\nimport { NavBar } from '@hh.ru/magritte-ui-nav-bar';\nimport { CallingCodeInput } from '@hh.ru/magritte-ui-phone-input/CallingCodeInput';\nimport { type PhoneCodeOption } from '@hh.ru/magritte-ui-phone-input/useCountrySelectDataProvider';\nimport { type LibPhoneNumberAPI, type MetadataVariant } from '@hh.ru/magritte-ui-phone-input/useLibPhoneNumber';\nimport { Select, OptionCustomLayoutComponent } from '@hh.ru/magritte-ui-select';\n\nimport styles from './phoneInput.less';\n\nconst getFlagEmoji = (countryCode: CountryCode) => {\n const codePoints = countryCode\n .toUpperCase()\n .split('')\n .map((char) => 127397 + char.charCodeAt(0));\n return String.fromCodePoint(...codePoints);\n};\n\nconst SelectItem: OptionCustomLayoutComponent<PhoneCodeOption> = ({ data, onChange, type }) => {\n if (type === 'delimiter') {\n return (\n <CellText maxLines={1} style=\"secondary\">\n {data.text}\n </CellText>\n );\n }\n\n return (\n <Cell\n left={\n <div className={styles.flagContainer}>\n <span className={classNames(styles.flagEmoji)}>{getFlagEmoji(data.value)}</span>\n </div>\n }\n right={<CellRightLabel hideIcon>+{data.callingCode}</CellRightLabel>}\n horPadding={false}\n vertPadding={false}\n onClick={() => onChange(data)}\n tabIndex={-1}\n >\n <CellText>{data.text}</CellText>\n </Cell>\n );\n};\n\ntype RegionSelectProps = {\n country: CountryCode;\n countryLocked: boolean;\n selectDataProvider: DataProvider<PhoneCodeOption>;\n selectOptions: PhoneCodeOption[];\n callingCode: CountryCallingCode;\n onChange: (country: CountryCode, callingCode: CountryCallingCode) => void;\n availableCountries?: CountryCode[];\n priorityCountries: CountryCode[];\n invalid?: boolean;\n libPhoneNumberAPI: LibPhoneNumberAPI;\n showSearchInMobile: boolean;\n disabled?: boolean;\n metadataVariant: MetadataVariant;\n descriptionId: string;\n};\n\nexport const RegionSelect = forwardRef<HTMLInputElement, RegionSelectProps>(\n (\n {\n selectDataProvider,\n selectOptions,\n country,\n countryLocked,\n callingCode,\n onChange,\n invalid,\n libPhoneNumberAPI,\n showSearchInMobile,\n disabled,\n metadataVariant,\n descriptionId,\n },\n ref\n ) => {\n const { getCountryCallingCode } = libPhoneNumberAPI;\n const [inputValue, setInputValue] = useState<string>(`+${callingCode}`);\n const exactMatchRef = useRef(true);\n\n const isFlagEmojiSupported = useIsFlagEmojiSupported();\n useFlagEmojiFont(metadataVariant, isFlagEmojiSupported);\n const pickerRefCallback = useCallback(\n (node: HTMLElement) => {\n if (node) {\n node.classList.toggle(styles.noFlagEmoji, !isFlagEmojiSupported);\n }\n },\n [isFlagEmojiSupported]\n );\n\n useEffect(() => {\n setInputValue(`+${callingCode}`);\n }, [callingCode]);\n\n const value = useMemo(() => selectOptions.find((item) => item.value === country), [selectOptions, country]);\n return (\n <Select\n dataProvider={selectDataProvider}\n value={value}\n onChange={(selectedValue) => {\n exactMatchRef.current = true;\n onChange?.(selectedValue.value, getCountryCallingCode(selectedValue.value));\n }}\n onBlur={() => {\n if (!exactMatchRef.current) {\n const code = inputValue.substring(1);\n const bestMatch = selectOptions.find((option) => option?.callingCode.startsWith(code));\n if (bestMatch && bestMatch.value) {\n onChange(bestMatch.value, bestMatch.callingCode);\n setInputValue(`+${bestMatch.callingCode}`);\n }\n }\n }}\n >\n <CallingCodeInput\n inputElementRef={ref}\n className={!isFlagEmojiSupported && styles.noFlagEmoji}\n flag={<span className={classNames(styles.flagEmoji)}>{getFlagEmoji(country)}</span>}\n invalid={invalid}\n disabled={disabled || countryLocked}\n descriptionId={descriptionId}\n selectOptions={selectOptions}\n exactMatchRef={exactMatchRef}\n onChange={onChange}\n value={inputValue}\n setValue={setInputValue}\n />\n <Select.Drop widthEqualToActivator={false} ref={pickerRefCallback}>\n <Select.Options type=\"radio\" optionLayoutComponent={SelectItem} />\n </Select.Drop>\n <Select.BottomSheet\n ref={pickerRefCallback}\n header={\n <NavBar>\n <NavBar.Pane>\n <NavBar.Actions centered right={<Select.PickerCloseIcon />} />\n </NavBar.Pane>\n {showSearchInMobile && (\n <NavBar.Pane>\n <Select.SearchInput clearable size=\"medium\" />\n </NavBar.Pane>\n )}\n </NavBar>\n }\n >\n <Select.Options type=\"radio\" optionLayoutComponent={SelectItem} />\n </Select.BottomSheet>\n </Select>\n );\n }\n);\n\nRegionSelect.displayName = 'RegionSelect';\n"],"names":["_jsx","_jsxs"],"mappings":";;;;;;;;;;;;AAeA,MAAM,YAAY,GAAG,CAAC,WAAwB,KAAI;IAC9C,MAAM,UAAU,GAAG,WAAW;AACzB,SAAA,WAAW,EAAE;SACb,KAAK,CAAC,EAAE,CAAC;AACT,SAAA,GAAG,CAAC,CAAC,IAAI,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,IAAA,OAAO,MAAM,CAAC,aAAa,CAAC,GAAG,UAAU,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,MAAM,UAAU,GAAiD,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAI;AAC1F,IAAA,IAAI,IAAI,KAAK,WAAW,EAAE;AACtB,QAAA,QACIA,GAAC,CAAA,QAAQ,EAAC,EAAA,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAC,WAAW,EACnC,QAAA,EAAA,IAAI,CAAC,IAAI,EAAA,CACH,EACb;KACL;AAED,IAAA,QACIA,GAAC,CAAA,IAAI,EACD,EAAA,IAAI,EACAA,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,MAAM,CAAC,aAAa,EAAA,QAAA,EAChCA,GAAM,CAAA,MAAA,EAAA,EAAA,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,EAAA,QAAA,EAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAA,CAAQ,GAC9E,EAEV,KAAK,EAAEC,IAAA,CAAC,cAAc,EAAC,EAAA,QAAQ,EAAG,IAAA,EAAA,QAAA,EAAA,CAAA,GAAA,EAAA,IAAI,CAAC,WAAW,CAAA,EAAA,CAAkB,EACpE,UAAU,EAAE,KAAK,EACjB,WAAW,EAAE,KAAK,EAClB,OAAO,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,EAC7B,QAAQ,EAAE,CAAC,CAAC,EAEZ,QAAA,EAAAD,GAAA,CAAC,QAAQ,EAAA,EAAA,QAAA,EAAE,IAAI,CAAC,IAAI,EAAY,CAAA,EAAA,CAC7B,EACT;AACN,CAAC,CAAC;AAmBK,MAAM,YAAY,GAAG,UAAU,CAClC,CACI,EACI,kBAAkB,EAClB,aAAa,EACb,OAAO,EACP,aAAa,EACb,WAAW,EACX,QAAQ,EACR,OAAO,EACP,iBAAiB,EACjB,kBAAkB,EAClB,QAAQ,EACR,eAAe,EACf,aAAa,GAChB,EACD,GAAG,KACH;AACA,IAAA,MAAM,EAAE,qBAAqB,EAAE,GAAG,iBAAiB,CAAC;AACpD,IAAA,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAS,CAAI,CAAA,EAAA,WAAW,CAAE,CAAA,CAAC,CAAC;AACxE,IAAA,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;AAEnC,IAAA,MAAM,oBAAoB,GAAG,uBAAuB,EAAE,CAAC;AACvD,IAAA,gBAAgB,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC;AACxD,IAAA,MAAM,iBAAiB,GAAG,WAAW,CACjC,CAAC,IAAiB,KAAI;QAClB,IAAI,IAAI,EAAE;AACN,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,oBAAoB,CAAC,CAAC;SACpE;AACL,KAAC,EACD,CAAC,oBAAoB,CAAC,CACzB,CAAC;IAEF,SAAS,CAAC,MAAK;AACX,QAAA,aAAa,CAAC,CAAA,CAAA,EAAI,WAAW,CAAA,CAAE,CAAC,CAAC;AACrC,KAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;AAElB,IAAA,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;AAC5G,IAAA,QACIC,IAAC,CAAA,MAAM,EACH,EAAA,YAAY,EAAE,kBAAkB,EAChC,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,aAAa,KAAI;AACxB,YAAA,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC;AAC7B,YAAA,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,qBAAqB,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AAChF,SAAC,EACD,MAAM,EAAE,MAAK;AACT,YAAA,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE;gBACxB,MAAM,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBACrC,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;AACvF,gBAAA,IAAI,SAAS,IAAI,SAAS,CAAC,KAAK,EAAE;oBAC9B,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;AACjD,oBAAA,aAAa,CAAC,CAAI,CAAA,EAAA,SAAS,CAAC,WAAW,CAAA,CAAE,CAAC,CAAC;iBAC9C;aACJ;AACL,SAAC,aAEDD,GAAC,CAAA,gBAAgB,IACb,eAAe,EAAE,GAAG,EACpB,SAAS,EAAE,CAAC,oBAAoB,IAAI,MAAM,CAAC,WAAW,EACtD,IAAI,EAAEA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,YAAG,YAAY,CAAC,OAAO,CAAC,GAAQ,EACnF,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,IAAI,aAAa,EACnC,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,aAAa,EAAA,CACzB,EACFA,GAAC,CAAA,MAAM,CAAC,IAAI,EAAA,EAAC,qBAAqB,EAAE,KAAK,EAAE,GAAG,EAAE,iBAAiB,EAAA,QAAA,EAC7DA,IAAC,MAAM,CAAC,OAAO,EAAA,EAAC,IAAI,EAAC,OAAO,EAAC,qBAAqB,EAAE,UAAU,EAAI,CAAA,EAAA,CACxD,EACdA,GAAA,CAAC,MAAM,CAAC,WAAW,IACf,GAAG,EAAE,iBAAiB,EACtB,MAAM,EACFC,IAAA,CAAC,MAAM,EACH,EAAA,QAAA,EAAA,CAAAD,GAAA,CAAC,MAAM,CAAC,IAAI,cACRA,GAAC,CAAA,MAAM,CAAC,OAAO,IAAC,QAAQ,EAAA,IAAA,EAAC,KAAK,EAAEA,GAAA,CAAC,MAAM,CAAC,eAAe,EAAG,EAAA,CAAA,EAAA,CAAI,GACpD,EACb,kBAAkB,KACfA,GAAA,CAAC,MAAM,CAAC,IAAI,EACR,EAAA,QAAA,EAAAA,GAAA,CAAC,MAAM,CAAC,WAAW,IAAC,SAAS,EAAA,IAAA,EAAC,IAAI,EAAC,QAAQ,EAAG,CAAA,EAAA,CACpC,CACjB,CACI,EAAA,CAAA,EAAA,QAAA,EAGbA,IAAC,MAAM,CAAC,OAAO,EAAC,EAAA,IAAI,EAAC,OAAO,EAAC,qBAAqB,EAAE,UAAU,GAAI,EACjD,CAAA,CAAA,EAAA,CAChB,EACX;AACN,CAAC,EACH;AAEF,YAAY,CAAC,WAAW,GAAG,cAAc;;;;"}
|
|
1
|
+
{"version":3,"file":"RegionSelect.js","sources":["src/RegionSelect.tsx"],"sourcesContent":["import { forwardRef, useState, useRef, useEffect, useCallback, useMemo } from 'react';\nimport classNames from 'classnames';\nimport { type CountryCode, type CountryCallingCode } from 'libphonenumber-js';\n\nimport { DataProvider } from '@hh.ru/magritte-common-data-provider';\nimport { useFlagEmojiFont, useIsFlagEmojiSupported } from '@hh.ru/magritte-common-flag-emoji-font';\nimport { Cell, CellRightLabel, CellText } from '@hh.ru/magritte-ui-cell';\nimport { NavBar } from '@hh.ru/magritte-ui-nav-bar';\nimport { CallingCodeInput } from '@hh.ru/magritte-ui-phone-input/CallingCodeInput';\nimport { type PhoneCodeOption } from '@hh.ru/magritte-ui-phone-input/useCountrySelectDataProvider';\nimport { type LibPhoneNumberAPI, type MetadataVariant } from '@hh.ru/magritte-ui-phone-input/useLibPhoneNumber';\nimport { Select, OptionCustomLayoutComponent } from '@hh.ru/magritte-ui-select';\n\nimport styles from './phoneInput.less';\n\nconst getFlagEmoji = (countryCode: CountryCode) => {\n const codePoints = countryCode\n .toUpperCase()\n .split('')\n .map((char) => 127397 + char.charCodeAt(0));\n return String.fromCodePoint(...codePoints);\n};\n\nconst SelectItem: OptionCustomLayoutComponent<PhoneCodeOption> = ({ data, onChange, type }) => {\n if (type === 'delimiter') {\n return (\n <CellText maxLines={1} style=\"secondary\">\n {data.text}\n </CellText>\n );\n }\n\n return (\n <Cell\n left={\n <div className={styles.flagContainer}>\n <span className={classNames(styles.flagEmoji)}>{getFlagEmoji(data.value)}</span>\n </div>\n }\n right={<CellRightLabel hideIcon>+{data.callingCode}</CellRightLabel>}\n horPadding={false}\n vertPadding={false}\n onClick={() => onChange(data)}\n tabIndex={-1}\n >\n <CellText>{data.text}</CellText>\n </Cell>\n );\n};\n\ntype RegionSelectProps = {\n country: CountryCode;\n countryLocked: boolean;\n selectDataProvider: DataProvider<PhoneCodeOption>;\n selectOptions: PhoneCodeOption[];\n callingCode: CountryCallingCode;\n onChange: (country: CountryCode, callingCode: CountryCallingCode) => void;\n availableCountries?: CountryCode[];\n priorityCountries: CountryCode[];\n invalid?: boolean;\n libPhoneNumberAPI: LibPhoneNumberAPI;\n showSearchInMobile: boolean;\n disabled?: boolean;\n metadataVariant: MetadataVariant;\n descriptionId: string;\n};\n\nexport const RegionSelect = forwardRef<HTMLInputElement, RegionSelectProps>(\n (\n {\n selectDataProvider,\n selectOptions,\n country,\n countryLocked,\n callingCode,\n onChange,\n invalid,\n libPhoneNumberAPI,\n showSearchInMobile,\n disabled,\n metadataVariant,\n descriptionId,\n },\n ref\n ) => {\n const { getCountryCallingCode } = libPhoneNumberAPI;\n const [inputValue, setInputValue] = useState<string>(`+${callingCode}`);\n const exactMatchRef = useRef(true);\n\n const isFlagEmojiSupported = useIsFlagEmojiSupported();\n useFlagEmojiFont(metadataVariant, isFlagEmojiSupported);\n const pickerRefCallback = useCallback(\n (node: HTMLElement) => {\n if (node) {\n node.classList.toggle(styles.noFlagEmoji, !isFlagEmojiSupported);\n }\n },\n [isFlagEmojiSupported]\n );\n\n useEffect(() => {\n setInputValue(`+${callingCode}`);\n }, [callingCode]);\n\n const value = useMemo(() => selectOptions.find((item) => item.value === country), [selectOptions, country]);\n return (\n <Select\n dataProvider={selectDataProvider}\n value={value}\n onChange={(selectedValue) => {\n exactMatchRef.current = true;\n onChange?.(selectedValue.value, getCountryCallingCode(selectedValue.value));\n }}\n onBlur={() => {\n if (!exactMatchRef.current) {\n const code = inputValue.substring(1);\n const bestMatch = selectOptions.find((option) => option?.callingCode.startsWith(code));\n if (bestMatch && bestMatch.value) {\n onChange(bestMatch.value, bestMatch.callingCode);\n setInputValue(`+${bestMatch.callingCode}`);\n }\n }\n }}\n >\n <CallingCodeInput\n inputElementRef={ref}\n className={!isFlagEmojiSupported && styles.noFlagEmoji}\n flag={<span className={classNames(styles.flagEmoji)}>{getFlagEmoji(country)}</span>}\n invalid={invalid}\n disabled={disabled || countryLocked}\n descriptionId={descriptionId}\n selectOptions={selectOptions}\n exactMatchRef={exactMatchRef}\n onChange={onChange}\n value={inputValue}\n setValue={setInputValue}\n />\n <Select.Drop widthEqualToActivator={false} ref={pickerRefCallback}>\n <Select.Options type=\"radio\" optionLayoutComponent={SelectItem} />\n </Select.Drop>\n <Select.BottomSheet\n ref={pickerRefCallback}\n header={\n <NavBar>\n <NavBar.Pane>\n <NavBar.Actions centered right={<Select.PickerCloseIcon />} />\n </NavBar.Pane>\n {showSearchInMobile && (\n <NavBar.Pane>\n <Select.SearchInput clearable size=\"medium\" />\n </NavBar.Pane>\n )}\n </NavBar>\n }\n >\n <Select.Options type=\"radio\" optionLayoutComponent={SelectItem} />\n </Select.BottomSheet>\n </Select>\n );\n }\n);\n\nRegionSelect.displayName = 'RegionSelect';\n"],"names":[],"mappings":"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"}
|