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.
125 lines
4.0 KiB
125 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}; |
|
}
|
|
|