/* * https://github.com/morethanwords/tweb * Copyright (C) 2019-2021 Eduard Kuzmenko * https://github.com/morethanwords/tweb/blob/master/LICENSE */ import { HelpCountry, HelpCountryCode } from "../layer"; import I18n from "../lib/langPack"; let sortedCountries: HelpCountry[]; type PrefixCountry = {country: HelpCountry, code: HelpCountryCode}; const prefixes: Map = new Map(); let maxPrefixLength = 0; const setPrefix = (country: HelpCountry, code: HelpCountryCode, prefix: string = '') => { prefix = code.country_code + prefix; /* if(prefixes.has(prefix)) { console.error('asdasdasd', prefixes.get(prefix), country, code); } */ maxPrefixLength = Math.max(maxPrefixLength, prefix.length); prefixes.set(prefix, {country, code}); }; export function formatPhoneNumber(originalStr: string): { formatted: string, country: HelpCountry, code: HelpCountryCode, leftPattern: string } { originalStr = originalStr || ''; if(!prefixes.size) { I18n.countriesList.forEach((country) => { country.country_codes.forEach((code) => { if(code.prefixes) { code.prefixes.forEach((prefix) => { setPrefix(country, code, prefix); }); } else { setPrefix(country, code); } }); }); } // return {formatted: originalStr, country: undefined as any, leftPattern: ''}; let str = originalStr.replace(/\D/g, ''); let phoneCode = str.slice(0, maxPrefixLength); ////console.log('str', str, phoneCode); // if(!sortedCountries) { // sortedCountries = I18n.countriesList.slice().sort((a, b) => b.country_codes[0].country_code.length - a.country_codes[0].country_code.length); // } // let country = sortedCountries.find((c) => { // return c.country_codes.find((c) => phoneCode.indexOf(c.replace(/\D/g, '')) === 0); // }); let prefixCountry: PrefixCountry; for(let i = phoneCode.length - 1; i >= 0; --i) { // lookup for country by prefix prefixCountry = prefixes.get(phoneCode.slice(0, i + 1)); if(prefixCountry) { break; } } if(!prefixCountry) { return { formatted: str, country: undefined, code: undefined, leftPattern: '' }; } // country = /* PhoneCodesMain[country.phoneCode] || */country; const country = prefixCountry.country; const patterns = prefixCountry.code.patterns || []; const searchForPattern = str.slice(prefixCountry.code.country_code.length); // splice country code let pattern = '', mostMatchedPatternMatches = 0, mostMatchedPattern = ''; for(let i = patterns.length - 1; i >= 0; --i) { pattern = patterns[i]; const _pattern = pattern.replace(/ /g, ''); let patternMatches = 0; for(let k = 0, length = Math.min(searchForPattern.length, _pattern.length); k < length; ++k) { if(searchForPattern[k] === _pattern[k] || _pattern[k] === 'X') { ++patternMatches; } else { patternMatches = 0; break; } } if(patternMatches > mostMatchedPatternMatches) { mostMatchedPatternMatches = patternMatches; mostMatchedPattern = pattern; } } pattern = mostMatchedPattern || pattern; pattern = pattern.replace(/\d/g, 'X'); pattern = prefixCountry.code.country_code + ' ' + pattern; // let pattern = country.pattern || country.phoneCode; pattern.split('').forEach((symbol, idx) => { if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) { str = str.slice(0, idx) + ' ' + str.slice(idx); } }); /* if(country.pattern) { str = str.slice(0, country.pattern.length); } */ let leftPattern = pattern && pattern.length > str.length ? pattern.slice(str.length) : ''; if(leftPattern) { /* const length = str.length; leftPattern = leftPattern.split('').map((_, idx) => (length + idx).toString().slice(-1)).join(''); */ leftPattern = leftPattern.replace(/X/g, '‒'); // leftPattern = leftPattern.replace(/X/g, '0'); } return {formatted: str, country, code: prefixCountry.code, leftPattern}; }