Skip to content

Commit f796cd4

Browse files
Implement support for localized search query (GH-60)
2 parents 9ad4bfb + 39241cb commit f796cd4

File tree

10 files changed

+105
-85
lines changed

10 files changed

+105
-85
lines changed

development/src/ant-phone/index.tsx

+3-2
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,8 @@ const PhoneInput = forwardRef(({
5757
...antInputProps
5858
}: PhoneInputProps, forwardedRef: any) => {
5959
const formInstance = useFormInstance();
60-
const {locale = {}} = useContext(ConfigContext);
60+
const {locale = {}, getPrefixCls} = useContext(ConfigContext);
6161
const formContext = useContext(FormContext);
62-
const {getPrefixCls} = useContext(ConfigContext);
6362
const inputRef = useRef<any>(null);
6463
const searchRef = useRef<any>(null);
6564
const selectedRef = useRef<boolean>(false);
@@ -69,6 +68,7 @@ const PhoneInput = forwardRef(({
6968
const [countryCode, setCountryCode] = useState<string>(country);
7069

7170
const {
71+
locale: localeIdentifier,
7272
searchNotFound = defaultSearchNotFound,
7373
searchPlaceholder = defaultSearchPlaceholder,
7474
countries = new Proxy({}, ({get: (_: any, prop: any) => prop})),
@@ -92,6 +92,7 @@ const PhoneInput = forwardRef(({
9292
excludeCountries,
9393
preferredCountries,
9494
disableParentheses,
95+
locale: localeIdentifier,
9596
});
9697

9798
const {

development/src/ant-phone/locale.ts

+73-73
Original file line numberDiff line numberDiff line change
@@ -1,86 +1,86 @@
1-
import arEG from "antd/locale/ar_EG";
2-
import bnBD from "antd/locale/bn_BD";
3-
import csCZ from "antd/locale/cs_CZ";
4-
import elGR from "antd/locale/el_GR";
5-
import esES from "antd/locale/es_ES";
6-
import faIR from "antd/locale/fa_IR";
7-
import frCA from "antd/locale/fr_CA";
8-
import glES from "antd/locale/gl_ES";
9-
import hrHR from "antd/locale/hr_HR";
10-
import idID from "antd/locale/id_ID";
11-
import jaJP from "antd/locale/ja_JP";
12-
import kmKH from "antd/locale/km_KH";
13-
import koKR from "antd/locale/ko_KR";
14-
import lvLV from "antd/locale/lv_LV";
15-
import mnMN from "antd/locale/mn_MN";
16-
import nbNO from "antd/locale/nb_NO";
17-
import nlNL from "antd/locale/nl_NL";
18-
import ptPT from "antd/locale/pt_PT";
19-
import siLK from "antd/locale/si_LK";
20-
import srRS from "antd/locale/sr_RS";
21-
import thTH from "antd/locale/th_TH";
22-
import ukUA from "antd/locale/uk_UA";
23-
import viVN from "antd/locale/vi_VN";
24-
import zhTW from "antd/locale/zh_TW";
25-
import azAZ from "antd/locale/az_AZ";
26-
import byBY from "antd/locale/by_BY";
27-
import daDK from "antd/locale/da_DK";
28-
import enGB from "antd/locale/en_GB";
29-
import etEE from "antd/locale/et_EE";
30-
import fiFI from "antd/locale/fi_FI";
31-
import frFR from "antd/locale/fr_FR";
32-
import heIL from "antd/locale/he_IL";
33-
import huHU from "antd/locale/hu_HU";
34-
import isIS from "antd/locale/is_IS";
35-
import kaGE from "antd/locale/ka_GE";
36-
import kmrIQ from "antd/locale/kmr_IQ";
37-
import kuIQ from "antd/locale/ku_IQ";
38-
import mkMK from "antd/locale/mk_MK";
39-
import msMY from "antd/locale/ms_MY";
40-
import neNP from "antd/locale/ne_NP";
41-
import plPL from "antd/locale/pl_PL";
42-
import roRO from "antd/locale/ro_RO";
43-
import skSK from "antd/locale/sk_SK";
44-
import svSE from "antd/locale/sv_SE";
45-
import tkTK from "antd/locale/tk_TK";
46-
import urPK from "antd/locale/ur_PK";
47-
import zhCN from "antd/locale/zh_CN";
48-
import bgBG from "antd/locale/bg_BG";
49-
import caES from "antd/locale/ca_ES";
50-
import deDE from "antd/locale/de_DE";
51-
import enUS from "antd/locale/en_US";
52-
import euES from "antd/locale/eu_ES";
53-
import frBE from "antd/locale/fr_BE";
54-
import gaIE from "antd/locale/ga_IE";
55-
import hiIN from "antd/locale/hi_IN";
56-
import hyAM from "antd/locale/hy_AM";
57-
import itIT from "antd/locale/it_IT";
58-
import kkKZ from "antd/locale/kk_KZ";
59-
import knIN from "antd/locale/kn_IN";
60-
import ltLT from "antd/locale/lt_LT";
61-
import mlIN from "antd/locale/ml_IN";
62-
import myMM from "antd/locale/my_MM";
63-
import nlBE from "antd/locale/nl_BE";
64-
import ptBR from "antd/locale/pt_BR";
65-
import ruRU from "antd/locale/ru_RU";
66-
import slSI from "antd/locale/sl_SI";
67-
import taIN from "antd/locale/ta_IN";
68-
import trTR from "antd/locale/tr_TR";
69-
import uzUZ from "antd/locale/uz_UZ";
70-
import zhHK from "antd/locale/zh_HK";
1+
import arEG from "antd/es/locale/ar_EG";
2+
import bnBD from "antd/es/locale/bn_BD";
3+
import csCZ from "antd/es/locale/cs_CZ";
4+
import elGR from "antd/es/locale/el_GR";
5+
import esES from "antd/es/locale/es_ES";
6+
import faIR from "antd/es/locale/fa_IR";
7+
import frCA from "antd/es/locale/fr_CA";
8+
import glES from "antd/es/locale/gl_ES";
9+
import hrHR from "antd/es/locale/hr_HR";
10+
import idID from "antd/es/locale/id_ID";
11+
import jaJP from "antd/es/locale/ja_JP";
12+
import kmKH from "antd/es/locale/km_KH";
13+
import koKR from "antd/es/locale/ko_KR";
14+
import lvLV from "antd/es/locale/lv_LV";
15+
import mnMN from "antd/es/locale/mn_MN";
16+
import nbNO from "antd/es/locale/nb_NO";
17+
import nlNL from "antd/es/locale/nl_NL";
18+
import ptPT from "antd/es/locale/pt_PT";
19+
import siLK from "antd/es/locale/si_LK";
20+
import srRS from "antd/es/locale/sr_RS";
21+
import thTH from "antd/es/locale/th_TH";
22+
import ukUA from "antd/es/locale/uk_UA";
23+
import viVN from "antd/es/locale/vi_VN";
24+
import zhTW from "antd/es/locale/zh_TW";
25+
import azAZ from "antd/es/locale/az_AZ";
26+
import byBY from "antd/es/locale/by_BY";
27+
import daDK from "antd/es/locale/da_DK";
28+
import enGB from "antd/es/locale/en_GB";
29+
import etEE from "antd/es/locale/et_EE";
30+
import fiFI from "antd/es/locale/fi_FI";
31+
import frFR from "antd/es/locale/fr_FR";
32+
import heIL from "antd/es/locale/he_IL";
33+
import huHU from "antd/es/locale/hu_HU";
34+
import isIS from "antd/es/locale/is_IS";
35+
import kaGE from "antd/es/locale/ka_GE";
36+
import kmrIQ from "antd/es/locale/kmr_IQ";
37+
import kuIQ from "antd/es/locale/ku_IQ";
38+
import mkMK from "antd/es/locale/mk_MK";
39+
import msMY from "antd/es/locale/ms_MY";
40+
import neNP from "antd/es/locale/ne_NP";
41+
import plPL from "antd/es/locale/pl_PL";
42+
import roRO from "antd/es/locale/ro_RO";
43+
import skSK from "antd/es/locale/sk_SK";
44+
import svSE from "antd/es/locale/sv_SE";
45+
import tkTK from "antd/es/locale/tk_TK";
46+
import urPK from "antd/es/locale/ur_PK";
47+
import zhCN from "antd/es/locale/zh_CN";
48+
import bgBG from "antd/es/locale/bg_BG";
49+
import caES from "antd/es/locale/ca_ES";
50+
import deDE from "antd/es/locale/de_DE";
51+
import enUS from "antd/es/locale/en_US";
52+
import frBE from "antd/es/locale/fr_BE";
53+
import gaIE from "antd/es/locale/ga_IE";
54+
import hiIN from "antd/es/locale/hi_IN";
55+
import hyAM from "antd/es/locale/hy_AM";
56+
import itIT from "antd/es/locale/it_IT";
57+
import kkKZ from "antd/es/locale/kk_KZ";
58+
import knIN from "antd/es/locale/kn_IN";
59+
import ltLT from "antd/es/locale/lt_LT";
60+
import mlIN from "antd/es/locale/ml_IN";
61+
import nlBE from "antd/es/locale/nl_BE";
62+
import ptBR from "antd/es/locale/pt_BR";
63+
import ruRU from "antd/es/locale/ru_RU";
64+
import slSI from "antd/es/locale/sl_SI";
65+
import taIN from "antd/es/locale/ta_IN";
66+
import trTR from "antd/es/locale/tr_TR";
67+
import zhHK from "antd/es/locale/zh_HK";
7168
import * as phoneLocale from "../phone-hooks/locale";
7269

7370
const locale = {
7471
arEG, bnBD, csCZ, elGR, esES, faIR, frCA, glES, hrHR, idID, jaJP, kmKH, koKR, lvLV,
7572
mnMN, nbNO, nlNL, ptPT, siLK, srRS, thTH, ukUA, viVN, zhTW, azAZ, byBY, daDK, enGB,
7673
etEE, fiFI, frFR, heIL, huHU, isIS, kaGE, kmrIQ, kuIQ, mkMK, msMY, neNP, plPL, roRO,
77-
skSK, svSE, tkTK, urPK, zhCN, bgBG, caES, deDE, enUS, euES, frBE, gaIE, hiIN, hyAM,
78-
itIT, kkKZ, knIN, ltLT, mlIN, myMM, nlBE, ptBR, ruRU, slSI, taIN, trTR, uzUZ, zhHK,
74+
skSK, svSE, tkTK, urPK, zhCN, bgBG, caES, deDE, enUS, frBE, gaIE, hiIN, hyAM, itIT,
75+
kkKZ, knIN, ltLT, mlIN, nlBE, ptBR, ruRU, slSI, taIN, trTR, zhHK,
7976
}
8077

8178
type Locale = keyof typeof locale;
8279

8380
export default (lang: Locale) => ({
8481
...locale[lang],
85-
PhoneInput: (phoneLocale as any)[lang],
82+
PhoneInput: {
83+
...(phoneLocale as any)[lang],
84+
locale: lang,
85+
},
8686
})

development/src/mui-phone/index.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ const PhoneInput = forwardRef(({
5353
const [countryCode, setCountryCode] = useState<string>(country);
5454

5555
const {
56+
locale,
5657
searchNotFound = defaultSearchNotFound,
5758
searchPlaceholder = defaultSearchPlaceholder,
5859
countries = new Proxy({}, ({get: (_: any, prop: any) => prop})),
@@ -66,6 +67,7 @@ const PhoneInput = forwardRef(({
6667
countriesList,
6768
} = usePhone({
6869
query,
70+
locale,
6971
country,
7072
countryCode,
7173
initialValue,

development/src/mui-phone/joy/index.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ const PhoneInput = forwardRef(({
5353
const [countryCode, setCountryCode] = useState<string>(country);
5454

5555
const {
56+
locale,
5657
searchNotFound = defaultSearchNotFound,
5758
searchPlaceholder = defaultSearchPlaceholder,
5859
countries = new Proxy({}, ({get: (_: any, prop: any) => prop})),
@@ -66,6 +67,7 @@ const PhoneInput = forwardRef(({
6667
countriesList,
6768
} = usePhone({
6869
query,
70+
locale,
6971
country,
7072
countryCode,
7173
initialValue,

development/src/mui-phone/locale.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ export default (lang: Locale) => ({
77
components: {
88
...locale[lang].components,
99
MuiPhoneInput: {
10-
defaultProps: (phoneLocale as any)[lang],
10+
defaultProps: {
11+
...(phoneLocale as any)[lang],
12+
locale: lang,
13+
},
1114
}
1215
}
1316
})

development/src/phone-hooks/index.ts

+9-4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {ChangeEvent, KeyboardEvent, useCallback, useMemo, useRef, useState} from
44

55
import {PhoneNumber, usePhoneOptions} from "./types";
66

7+
import * as phoneLocale from "./locale";
78
import countries from "./metadata/countries.json";
89
import timezones from "./metadata/timezones.json";
910
import validations from "./metadata/validations.json";
@@ -113,6 +114,7 @@ export const useMask = (pattern: string) => {
113114

114115
export const usePhone = ({
115116
query = "",
117+
locale = "",
116118
country = "",
117119
countryCode = "",
118120
initialValue = "",
@@ -135,14 +137,17 @@ export const usePhone = ({
135137
}, [onlyCountries, excludeCountries])
136138

137139
const countriesList = useMemo(() => {
138-
const filteredCountries = countriesOnly.filter(([_1, name, dial, mask]) => (
139-
name.toLowerCase().startsWith(query.toLowerCase()) || dial.includes(query) || mask.includes(query)
140-
));
140+
const filteredCountries = countriesOnly.filter(([_1, name, dial, mask]) => {
141+
const q = query.toLowerCase();
142+
const countries = locale && ((phoneLocale as any)[locale])?.countries;
143+
const localized = countries && (countries[name] || "").toLowerCase();
144+
return [localized, name.toLowerCase(), dial, mask].some(component => component.includes(q));
145+
});
141146
return [
142147
...filteredCountries.filter(([iso]) => preferredCountries.includes(iso)),
143148
...filteredCountries.filter(([iso]) => !preferredCountries.includes(iso)),
144149
];
145-
}, [countriesOnly, preferredCountries, query])
150+
}, [countriesOnly, preferredCountries, locale, query])
146151

147152
const metadata = useMemo(() => {
148153
const calculatedMetadata = getMetadata(getRawValue(value), countriesList, countryCode);

development/src/phone-hooks/types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export interface PhoneNumber {
1111

1212
export interface usePhoneOptions {
1313
query?: string;
14+
locale?: string;
1415
country?: string;
1516
countryCode?: string;
1617
onlyCountries?: string[];

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"version": "0.1.11",
2+
"version": "0.1.12",
33
"name": "react-phone-hooks",
44
"description": "React hooks and utility functions for parsing and validating phone numbers.",
55
"keywords": [

src/index.ts

+9-4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {ChangeEvent, KeyboardEvent, useCallback, useMemo, useRef, useState} from
44

55
import {PhoneNumber, usePhoneOptions} from "./types";
66

7+
import * as phoneLocale from "./locale";
78
import countries from "./metadata/countries.json";
89
import timezones from "./metadata/timezones.json";
910
import validations from "./metadata/validations.json";
@@ -113,6 +114,7 @@ export const useMask = (pattern: string) => {
113114

114115
export const usePhone = ({
115116
query = "",
117+
locale = "",
116118
country = "",
117119
countryCode = "",
118120
initialValue = "",
@@ -135,14 +137,17 @@ export const usePhone = ({
135137
}, [onlyCountries, excludeCountries])
136138

137139
const countriesList = useMemo(() => {
138-
const filteredCountries = countriesOnly.filter(([_1, name, dial, mask]) => (
139-
name.toLowerCase().startsWith(query.toLowerCase()) || dial.includes(query) || mask.includes(query)
140-
));
140+
const filteredCountries = countriesOnly.filter(([_1, name, dial, mask]) => {
141+
const q = query.toLowerCase();
142+
const countries = locale && ((phoneLocale as any)[locale])?.countries;
143+
const localized = countries && (countries[name] || "").toLowerCase();
144+
return [localized, name.toLowerCase(), dial, mask].some(component => component.includes(q));
145+
});
141146
return [
142147
...filteredCountries.filter(([iso]) => preferredCountries.includes(iso)),
143148
...filteredCountries.filter(([iso]) => !preferredCountries.includes(iso)),
144149
];
145-
}, [countriesOnly, preferredCountries, query])
150+
}, [countriesOnly, preferredCountries, locale, query])
146151

147152
const metadata = useMemo(() => {
148153
const calculatedMetadata = getMetadata(getRawValue(value), countriesList, countryCode);

src/types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export interface PhoneNumber {
1111

1212
export interface usePhoneOptions {
1313
query?: string;
14+
locale?: string;
1415
country?: string;
1516
countryCode?: string;
1617
onlyCountries?: string[];

0 commit comments

Comments
 (0)