Telegram Web K with changes to work inside I2P https://web.telegram.i2p/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

126 lines
4.0 KiB

/*
* 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<string, PrefixCountry> = 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};
}