From 6b750c7196a01b87f9b483206b4cb644df7e823a Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Fri, 16 Apr 2021 14:48:10 +0300 Subject: [PATCH] Auth: Fix phone number formatting, add missing countries (#1010) --- src/@types/global.d.ts | 1 + src/util/countries.ts | 338 ++++++++++++++++++++++++---------------- src/util/phoneNumber.ts | 18 +-- 3 files changed, 204 insertions(+), 153 deletions(-) diff --git a/src/@types/global.d.ts b/src/@types/global.d.ts index fc8dc4338..3257ce5b2 100644 --- a/src/@types/global.d.ts +++ b/src/@types/global.d.ts @@ -27,6 +27,7 @@ type Country = { name: string; flag: string; code: string; + phoneFormat: RegExp; }; type EmojiCategory = { diff --git a/src/util/countries.ts b/src/util/countries.ts index d09677a8d..cc89f3668 100644 --- a/src/util/countries.ts +++ b/src/util/countries.ts @@ -1,197 +1,240 @@ -const DATA = `AF🇦🇫93Afghanistan -AO🇦🇴244Angola -AL🇦🇱355Albania -AD🇦🇩376Andorra -AE🇦🇪971United Arab Emirates +// This data was received from Telegram Desktop (Telegram/Resources/numbers.txt) +const DATA = `AF🇦🇫93Afghanistan333 +AO🇦🇴244Angola333 +AL🇦🇱355Albania234 +AD🇦🇩376Andorra222 +AE🇦🇪971United Arab Emirates234 +AI🇦🇮1264Anguilla34 AR🇦🇷54Argentina -AM🇦🇲374Armenia -AG🇦🇬1268Antigua and Barbuda -AU🇦🇺61Australia +AM🇦🇲374Armenia233 +AG🇦🇬1268Antigua and Barbuda34 +AU🇦🇺61Australia333 +AS🇦🇸1684American Samoa34 AT🇦🇹43Austria -AZ🇦🇿994Azerbaijan -BI🇧🇮257Burundi -BE🇧🇪32Belgium -BJ🇧🇯229Benin -BF🇧🇫226Burkina Faso +AW🇦🇼297Aruba34 +AZ🇦🇿994Azerbaijan2322 +BI🇧🇮257Burundi224 +BE🇧🇪32Belgium3222 +BJ🇧🇯229Benin233 +BF🇧🇫226Burkina Faso2222 BD🇧🇩880Bangladesh BG🇧🇬359Bulgaria -BH🇧🇭973Bahrain -BS🇧🇸1242Bahamas +BH🇧🇭973Bahrain44 +BS🇧🇸1242Bahamas34 BA🇧🇦387Bosnia and Herzegovina -BY🇧🇾375Belarus +BY🇧🇾375Belarus2322 BZ🇧🇿501Belize -BO🇧🇴591Bolivia -BR🇧🇷55Brazil -BB🇧🇧1246Barbados -BN🇧🇳673Brunei +BO🇧🇴591Bolivia134 +BR🇧🇷55Brazil254 +BB🇧🇧1246Barbados34 +BM🇧🇲1441Bermuda34 +BN🇧🇳673Brunei34 +BQ🇧🇶599Bonaire, Sint Eustatius and Saba BT🇧🇹975Bhutan -BW🇧🇼267Botswana -CF🇨🇫236Central African Republic -CA🇨🇦1Canada -CH🇨🇭41Switzerland -CL🇨🇱56Chile -CN🇨🇳86China -CI🇨🇮225Ivory Coast -CM🇨🇲237Cameroon -CD🇨🇩243DR Congo -CG🇨🇬242Republic of the Congo -CO🇨🇴57Colombia -KM🇰🇲269Comoros -CV🇨🇻238Cape Verde +BW🇧🇼267Botswana233 +CF🇨🇫236Central African Republic2222 +CA🇨🇦1Canada334 +CH🇨🇭41Switzerland234 +CK🇨🇰682Cook Islands +CL🇨🇱56Chile144 +CN🇨🇳86China344 +CI🇨🇮225Côte d\`Ivoire233 +CM🇨🇲237Cameroon44 +CD🇨🇩243DR Congo234 +CG🇨🇬242Republic of the Congo234 +CO🇨🇴57Colombia334 +KM🇰🇲269Comoros34 +CV🇨🇻238Cape Verde34 CR🇨🇷506Costa Rica -CU🇨🇺53Cuba -CY🇨🇾357Cyprus -CZ🇨🇿420Czechia -DE🇩🇪49Germany -DJ🇩🇯253Djibouti -DM🇩🇲1767Dominica -DK🇩🇰45Denmark -DO🇩🇴1Dominican Republic -DZ🇩🇿213Algeria +CU🇨🇺53Cuba44 +CY🇨🇾357Cyprus44 +CW🇨🇼599Curaçao +CZ🇨🇿420Czech Republic +DE🇩🇪49Germany38 +DJ🇩🇯253Djibouti2222 +DM🇩🇲1767Dominica34 +DK🇩🇰45Denmark44 +DO🇩🇴1Dominican Republic334 +DZ🇩🇿213Algeria3222 EC🇪🇨593Ecuador -EG🇪🇬20Egypt -ER🇪🇷291Eritrea -ES🇪🇸34Spain +EG🇪🇬20Egypt234 +ER🇪🇷291Eritrea133 +ES🇪🇸34Spain333 EE🇪🇪372Estonia -ET🇪🇹251Ethiopia +ET🇪🇹251Ethiopia234 FI🇫🇮358Finland FJ🇫🇯679Fiji -FR🇫🇷33France +FK🇫🇰500Falkland Islands FM🇫🇲691Micronesia -GA🇬🇦241Gabon -GB🇬🇧44United Kingdom +FO🇫🇴298Faroe Islands33 +FR🇫🇷33France12222 +GA🇬🇦241Gabon1222 +GB🇬🇧44United Kingdom46 GE🇬🇪995Georgia +GF🇬🇫594French Guiana GH🇬🇭233Ghana -GN🇬🇳224Guinea -GM🇬🇲220Gambia -GW🇬🇼245Guinea-Bissau -GQ🇬🇶240Equatorial Guinea -GR🇬🇷30Greece -GD🇬🇩1473Grenada -GT🇬🇹502Guatemala +GI🇬🇮350Gibraltar44 +GL🇬🇱299Greenland33 +GN🇬🇳224Guinea333 +GM🇬🇲220Gambia34 +GP🇬🇵590Guadeloupe +GU🇬🇺1671Guam34 +GW🇬🇼245Guinea-Bissau34 +GQ🇬🇶240Equatorial Guinea333 +GR🇬🇷30Greece244 +GD🇬🇩1473Grenada34 +GT🇬🇹502Guatemala134 GY🇬🇾592Guyana -HN🇭🇳504Honduras +HK🇭🇰852Hong Kong +HN🇭🇳504Honduras44 HR🇭🇷385Croatia HT🇭🇹509Haiti -HU🇭🇺36Hungary +HU🇭🇺36Hungary234 ID🇮🇩62Indonesia -IN🇮🇳91India -IE🇮🇪353Ireland -IR🇮🇷98Iran -IQ🇮🇶964Iraq -IS🇮🇸354Iceland -IL🇮🇱972Israel -IT🇮🇹39Italy -JM🇯🇲1876Jamaica -JO🇯🇴962Jordan -JP🇯🇵81Japan -KZ🇰🇿7Kazakhstan -KE🇰🇪254Kenya +IN🇮🇳91India55 +IO🇩🇬246Diego Garcia34 +IE🇮🇪353Ireland234 +IR🇮🇷98Iran334 +IQ🇮🇶964Iraq334 +IS🇮🇸354Iceland34 +IL🇮🇱972Israel234 +IT🇮🇹39Italy334 +JM🇯🇲1876Jamaica34 +JO🇯🇴962Jordan144 +JP🇯🇵81Japan244 +KZ🇰🇿7Kazakhstan3322 +KE🇰🇪254Kenya333 KG🇰🇬996Kyrgyzstan KH🇰🇭855Cambodia KI🇰🇮686Kiribati -KN🇰🇳1869Saint Kitts and Nevis +KN🇰🇳1869Saint Kitts and Nevis34 KR🇰🇷82South Korea -KW🇰🇼965Kuwait +KW🇰🇼965Kuwait44 +KY🇰🇾1345Cayman Islands34 LA🇱🇦856Laos LB🇱🇧961Lebanon LR🇱🇷231Liberia -LY🇱🇾218Libya -LC🇱🇨1758Saint Lucia +LY🇱🇾218Libya234 +LC🇱🇨1758Saint Lucia34 LI🇱🇮423Liechtenstein -LK🇱🇰94Sri Lanka -LS🇱🇸266Lesotho -LT🇱🇹370Lithuania +LK🇱🇰94Sri Lanka234 +LS🇱🇸266Lesotho233 +LT🇱🇹370Lithuania35 LU🇱🇺352Luxembourg -LV🇱🇻371Latvia -MA🇲🇦212Morocco -MC🇲🇨377Monaco -MD🇲🇩373Moldova -MG🇲🇬261Madagascar +LV🇱🇻371Latvia35 +MA🇲🇦212Morocco234 +MC🇲🇨377Monaco44 +MD🇲🇩373Moldova233 +MG🇲🇬261Madagascar2232 +MP🇲🇵1670Northern Mariana Islands34 +MO🇲🇴853Macau +MS🇲🇸1664Montserrat34 MV🇲🇻960Maldives MX🇲🇽52Mexico MH🇲🇭692Marshall Islands -MK🇲🇰389North Macedonia -ML🇲🇱223Mali -MT🇲🇹356Malta +MK🇲🇰389Macedonia +ML🇲🇱223Mali44 +MT🇲🇹356Malta2222 MM🇲🇲95Myanmar ME🇲🇪382Montenegro MN🇲🇳976Mongolia -MZ🇲🇿258Mozambique -MR🇲🇷222Mauritania +MZ🇲🇿258Mozambique234 +MQ🇲🇶596Martinique +MR🇲🇷222Mauritania44 MU🇲🇺230Mauritius MW🇲🇼265Malawi MY🇲🇾60Malaysia -NA🇳🇦264Namibia -NE🇳🇪227Niger +NA🇳🇦264Namibia234 +NC🇳🇨687New Caledonia +NE🇳🇪227Niger2222 +NF🇳🇫672Norfolk Island NG🇳🇬234Nigeria -NI🇳🇮505Nicaragua -NL🇳🇱31Netherlands -NO🇳🇴47Norway +NI🇳🇮505Nicaragua44 +NL🇳🇱31Netherlands12222 +NO🇳🇴47Norway44 NP🇳🇵977Nepal +NU🇳🇺683Niue NR🇳🇷674Nauru NZ🇳🇿64New Zealand -OM🇴🇲968Oman -PK🇵🇰92Pakistan -PA🇵🇦507Panama -PE🇵🇪51Peru -PH🇵🇭63Philippines +OM🇴🇲968Oman44 +PK🇵🇰92Pakistan334 +PA🇵🇦507Panama44 +PE🇵🇪51Peru333 +PF🇵🇫689French Polynesia +PH🇵🇭63Philippines334 +PM🇵🇲508Saint Pierre and Miquelon +PR🇵🇷1Puerto Rico334 +PS🇵🇸970Palestine324 PW🇵🇼680Palau PG🇵🇬675Papua New Guinea -PL🇵🇱48Poland +PL🇵🇱48Poland333 KP🇰🇵850North Korea -PT🇵🇹351Portugal -PY🇵🇾595Paraguay +PT🇵🇹351Portugal144 +PY🇵🇾595Paraguay333 QA🇶🇦974Qatar -RO🇷🇴40Romania -RU🇷🇺7Russia -RW🇷🇼250Rwanda +RE🇷🇪262Réunion333 +RO🇷🇴40Romania333 +RU🇷🇺7Russia3322 +RW🇷🇼250Rwanda333 SA🇸🇦966Saudi Arabia -SD🇸🇩249Sudan -SN🇸🇳221Senegal -SG🇸🇬65Singapore +SD🇸🇩249Sudan234 +SN🇸🇳221Senegal234 +SG🇸🇬65Singapore44 +SH🇸🇭290Saint Helena23 +SH🇸🇭247Saint Helena4 SB🇸🇧677Solomon Islands -SL🇸🇱232Sierra Leone -SV🇸🇻503El Salvador -SM🇸🇲378San Marino -SO🇸🇴252Somalia -RS🇷🇸381Serbia -SS🇸🇸211South Sudan -ST🇸🇹239São Tomé and Príncipe -SR🇸🇷597Suriname +SL🇸🇱232Sierra Leone233 +SV🇸🇻503El Salvador44 +SM🇸🇲378San Marino334 +SO🇸🇴252Somalia233 +RS🇷🇸381Serbia234 +SS🇸🇸211South Sudan234 +ST🇸🇹239São Tomé and Príncipe25 +SR🇸🇷597Suriname34 SK🇸🇰421Slovakia SI🇸🇮386Slovenia -SE🇸🇪46Sweden -SZ🇸🇿268Eswatini -SC🇸🇨248Seychelles +SE🇸🇪46Sweden234 +SZ🇸🇿268Swaziland44 +SC🇸🇨248Seychelles1222 +SX🇸🇽1721Sint Maarten34 SY🇸🇾963Syria -TD🇹🇩235Chad -TG🇹🇬228Togo -TH🇹🇭66Thailand +TC🇹🇨1649Turks and Caicos Islands34 +TD🇹🇩235Chad2222 +TG🇹🇬228Togo233 +TH🇹🇭66Thailand144 TJ🇹🇯992Tajikistan -TM🇹🇲993Turkmenistan +TK🇹🇰690Tokelau +TM🇹🇲993Turkmenistan26 TL🇹🇱670Timor-Leste TO🇹🇴676Tonga -TT🇹🇹1868Trinidad and Tobago -TN🇹🇳216Tunisia -TR🇹🇷90Turkey +TT🇹🇹1868Trinidad and Tobago34 +TN🇹🇳216Tunisia233 +TR🇹🇷90Turkey334 TV🇹🇻688Tuvalu -TZ🇹🇿255Tanzania -UG🇺🇬256Uganda -UA🇺🇦380Ukraine -UY🇺🇾598Uruguay -US🇺🇸1United States -UZ🇺🇿998Uzbekistan +TW🇹🇼886Taiwan +TZ🇹🇿255Tanzania234 +UG🇺🇬256Uganda234 +UA🇺🇦380Ukraine2322 +UY🇺🇾598Uruguay44 +US🇺🇸1United States334 +UZ🇺🇿998Uzbekistan27 VA🇻🇦3Vatican City -VC🇻🇨1784Saint Vincent and the Grenadines -VE🇻🇪58Venezuela +VC🇻🇨1784Saint Vincent and the Grenadines34 +VE🇻🇪58Venezuela334 +VG🇻🇬1284British Virgin Islands34 +VI🇻🇮1340US Virgin Islands34 VN🇻🇳84Vietnam VU🇻🇺678Vanuatu +WF🇼🇫681Wallis and Futuna WS🇼🇸685Samoa -YE🇾🇪967Yemen -ZA🇿🇦27South Africa -ZM🇿🇲260Zambia -ZW🇿🇼263Zimbabwe`; +XK🇽🇰383Kosovo44 +YE🇾🇪967Yemen333 +ZA🇿🇦27South Africa234 +ZM🇿🇲260Zambia234 +ZW🇿🇼263Zimbabwe234`; + +const formatsCache: Record = {}; +export const defaultPhoneNumberFormat = /(\d{1,3})(\d{1,3})?(\d{1,3})?(\d{1,3})?(\d{1,3})?/; const parsed = DATA .split('\n') @@ -200,10 +243,31 @@ const parsed = DATA const flag = str.substr(2, 4); const code = `+${str.match(/\d+/)![0]}`; const name = str.split(/\d+/)[1]; + const format = str.match(/\d+$/); + const phoneFormat = getPhoneNumberFormat(format); return { - id, flag, code, name, + id, flag, code, name, phoneFormat, }; }); +function getPhoneNumberFormat(format: RegExpMatchArray | null) { + if (!format) { + return defaultPhoneNumberFormat; + } + + const formatValue = format[0] as string; + let phoneNumberFormat; + + if (!formatsCache[formatValue]) { + const phoneNumberGroups = formatValue.split('').map(Number); + phoneNumberFormat = phoneNumberGroups.reduce((result, count, i) => { + return `${result}(\\d{1,${count}})${i > 0 ? '?' : ''}`; + }, ''); + formatsCache[formatValue] = new RegExp(`${phoneNumberFormat}${'()?'.repeat(5 - phoneNumberGroups.length)}`); + } + + return formatsCache[formatValue]; +} + export default parsed; diff --git a/src/util/phoneNumber.ts b/src/util/phoneNumber.ts index 6b1b81f29..961e4c08c 100644 --- a/src/util/phoneNumber.ts +++ b/src/util/phoneNumber.ts @@ -1,4 +1,4 @@ -import countryList from './countries'; +import countryList, { defaultPhoneNumberFormat } from './countries'; export function getCountryById(id: string) { return countryList.find((c) => c.id === id) as Country; @@ -6,21 +6,7 @@ export function getCountryById(id: string) { // Empty groups are used to preserve 5 callback arguments for `replace` method function getPhoneNumberFormat(country?: Country) { - const id = country ? country.id : 'UNKNOWN'; - - switch (id) { - case 'RU': - case 'US': - return /(\d{1,3})(\d{1,3})?(\d{1,2})?(\d{1,2})?()?/; - case 'GB': - return /(\d{1,4})(\d{1,5})?()?()?()?/; - case 'UA': - case 'FI': - case 'AE': - return /(\d{1,2})(\d{1,3})?(\d{1,2})?(\d{1,2})?()?/; - default: - return /(\d{1,3})(\d{1,3})?(\d{1,3})?(\d{1,3})?(\d{1,3})?/; - } + return country ? country.phoneFormat : defaultPhoneNumberFormat; } export function getCountryFromPhoneNumber(input: string) {