diff --git a/src/components/sidebarLeft/index.ts b/src/components/sidebarLeft/index.ts index c030a2b3..4c34251f 100644 --- a/src/components/sidebarLeft/index.ts +++ b/src/components/sidebarLeft/index.ts @@ -478,12 +478,13 @@ export class AppSidebarLeft extends SidebarSlider { this.searchGroups.people.container.append(peopleContainer); let peopleScrollable = new ScrollableX(peopleContainer); + let first = true; let hideNewBtnMenuTimeout: number; //const transition = Transition.bind(null, searchContainer.parentElement, 150); const transition = TransitionSlider(searchContainer.parentElement, 'zoom-fade', 150, (id) => { if(hideNewBtnMenuTimeout) clearTimeout(hideNewBtnMenuTimeout); - if(id === 0) { + if(id === 0 && !first) { searchSuper.selectTab(0, false); this.inputSearch.onClearClick(); hideNewBtnMenuTimeout = window.setTimeout(() => { @@ -491,6 +492,8 @@ export class AppSidebarLeft extends SidebarSlider { this.newBtnMenu.classList.remove('is-hidden'); }, 150); } + + first = false; }); transition(0); diff --git a/src/components/sidebarLeft/tabs/blockedUsers.ts b/src/components/sidebarLeft/tabs/blockedUsers.ts index 38e2f5d5..7d1f1244 100644 --- a/src/components/sidebarLeft/tabs/blockedUsers.ts +++ b/src/components/sidebarLeft/tabs/blockedUsers.ts @@ -64,7 +64,7 @@ export default class AppBlockedUsersTab extends SliderSuperTab { if(user.pFlags.bot) { dom.lastMessageSpan.append('@' + user.username); } else { - if(user.rPhone) dom.lastMessageSpan.innerHTML = user.rPhone; + if(user.phone) dom.lastMessageSpan.innerHTML = appUsersManager.formatUserPhone(user.phone); else dom.lastMessageSpan.append(user.username ? '@' + user.username : appUsersManager.getUserStatusString(peerId)); } diff --git a/src/components/sidebarLeft/tabs/settings.ts b/src/components/sidebarLeft/tabs/settings.ts index a726f93e..110c910f 100644 --- a/src/components/sidebarLeft/tabs/settings.ts +++ b/src/components/sidebarLeft/tabs/settings.ts @@ -153,6 +153,6 @@ export default class AppSettingsTab extends SliderSuperTab { this.avatarElem.setAttribute('peer', '' + user.id); this.nameDiv.append(new PeerTitle({peerId: user.id}).element); - this.phoneDiv.innerHTML = user.rPhone || ''; + this.phoneDiv.innerHTML = user.phone ? appUsersManager.formatUserPhone(user.phone) : ''; } } diff --git a/src/components/sidebarRight/tabs/sharedMedia.ts b/src/components/sidebarRight/tabs/sharedMedia.ts index bd68a281..cef16511 100644 --- a/src/components/sidebarRight/tabs/sharedMedia.ts +++ b/src/components/sidebarRight/tabs/sharedMedia.ts @@ -670,7 +670,7 @@ class PeerProfile { let user = appUsersManager.getUser(peerId); if(user.phone && peerId !== rootScope.myId) { - setText(user.rPhone, this.phone); + setText(appUsersManager.formatUserPhone(user.phone), this.phone); } }/* else { //membersLi.style.display = appPeersManager.isBroadcast(peerId) ? 'none' : ''; @@ -824,7 +824,7 @@ export default class AppSharedMediaTab extends SliderSuperTab { const rect = this.searchSuper.nav.getBoundingClientRect(); if(!rect.width) return; - const top = rect.top; + const top = rect.top - 1; const isSharedMedia = top <= HEADER_HEIGHT; animatedCloseIcon.classList.toggle('state-back', isSharedMedia); this.searchSuper.container.classList.toggle('is-full-viewport', isSharedMedia); diff --git a/src/config/database.ts b/src/config/database.ts index 1f05cb59..94bb66c9 100644 --- a/src/config/database.ts +++ b/src/config/database.ts @@ -11,11 +11,19 @@ export type DatabaseStoreName = 'session' | 'stickerSets' | 'users' | 'chats' | export type DatabaseStore = Omit & {name: DatabaseStoreName}; const Database = { name: 'tweb' + (Modes.test ? '_test' : ''), - version: 5, + version: 7, stores: [{ name: 'session' }, { name: 'stickerSets' + }, { + name: 'users' + }, { + name: 'chats' + }, { + name: 'dialogs' + }, { + name: 'messages' }] as DatabaseStore[], }; diff --git a/src/countries.ts b/src/countries.ts index b4bdeb78..1824f9c4 100644 --- a/src/countries.ts +++ b/src/countries.ts @@ -14,7 +14,7 @@ export type Country = { emoji: string }; -const Countries: Country[] = [{"phoneCode":"7 840","code":"AB","name":"Abkhazia","pattern":"","emoji":""},{"phoneCode":"93","code":"AF","name":"Afghanistan","pattern":"93 XXX XXX XXX","emoji":"๐Ÿ‡ฆ๐Ÿ‡ซ"},{"phoneCode":"358 18","code":"AX","name":"Aland Islands","pattern":"","emoji":"๐Ÿ‡ฆ๐Ÿ‡ฝ"},{"phoneCode":"355","code":"AL","name":"Albania","pattern":"355 XX XXX XXXX","emoji":"๐Ÿ‡ฆ๐Ÿ‡ฑ"},{"phoneCode":"213","code":"DZ","name":"Algeria","pattern":"213 XXX XX XX XX","emoji":"๐Ÿ‡ฉ๐Ÿ‡ฟ"},{"phoneCode":"1 684","code":"AS","name":"American Samoa","pattern":"1684 XXX XXXX","emoji":"๐Ÿ‡ฆ๐Ÿ‡ธ"},{"phoneCode":"376","code":"AD","name":"Andorra","pattern":"376 XX XX XX","emoji":"๐Ÿ‡ฆ๐Ÿ‡ฉ"},{"phoneCode":"244","code":"AO","name":"Angola","pattern":"244 XXX XXX XXX","emoji":"๐Ÿ‡ฆ๐Ÿ‡ด"},{"phoneCode":"1 264","code":"AI","name":"Anguilla","pattern":"1264 XXX XXXX","emoji":"๐Ÿ‡ฆ๐Ÿ‡ฎ"},{"phoneCode":"1 268","code":"AG","name":"Antigua & Barbuda","pattern":"1268 XXX XXXX","emoji":"๐Ÿ‡ฆ๐Ÿ‡ฌ"},{"phoneCode":"54","code":"AR","name":"Argentina","pattern":"","emoji":"๐Ÿ‡ฆ๐Ÿ‡ท"},{"phoneCode":"374","code":"AM","name":"Armenia","pattern":"374 XX XXX XXX","emoji":"๐Ÿ‡ฆ๐Ÿ‡ฒ"},{"phoneCode":"297","code":"AW","name":"Aruba","pattern":"297 XXX XXXX","emoji":"๐Ÿ‡ฆ๐Ÿ‡ผ"},{"phoneCode":"247","code":"SH","name":"Ascension","pattern":"290 XX XXX","emoji":"๐Ÿ‡ธ๐Ÿ‡ญ"},{"phoneCode":"61","code":"AU","name":"Australia","pattern":"61 XXX XXX XXX","emoji":"๐Ÿ‡ฆ๐Ÿ‡บ"},{"phoneCode":"672","code":"AU","name":"Australian External Territories","pattern":"61 XXX XXX XXX","emoji":"๐Ÿ‡ฆ๐Ÿ‡บ"},{"phoneCode":"43","code":"AT","name":"Austria","pattern":"","emoji":"๐Ÿ‡ฆ๐Ÿ‡น"},{"phoneCode":"994","code":"AZ","name":"Azerbaijan","pattern":"994 XX XXX XX XX","emoji":"๐Ÿ‡ฆ๐Ÿ‡ฟ"},{"phoneCode":"1 242","code":"BS","name":"Bahamas","pattern":"1242 XXX XXXX","emoji":"๐Ÿ‡ง๐Ÿ‡ธ"},{"phoneCode":"973","code":"BH","name":"Bahrain","pattern":"973 XXXX XXXX","emoji":"๐Ÿ‡ง๐Ÿ‡ญ"},{"phoneCode":"880","code":"BD","name":"Bangladesh","pattern":"","emoji":"๐Ÿ‡ง๐Ÿ‡ฉ"},{"phoneCode":"1 246","code":"BB","name":"Barbados","pattern":"1246 XXX XXXX","emoji":"๐Ÿ‡ง๐Ÿ‡ง"},{"phoneCode":"1 268","code":"AG","name":"Barbuda","pattern":"1268 XXX XXXX","emoji":"๐Ÿ‡ฆ๐Ÿ‡ฌ"},{"phoneCode":"375","code":"BY","name":"Belarus","pattern":"375 XX XXX XXXX","emoji":"๐Ÿ‡ง๐Ÿ‡พ"},{"phoneCode":"32","code":"BE","name":"Belgium","pattern":"32 XXX XX XX XX","emoji":"๐Ÿ‡ง๐Ÿ‡ช"},{"phoneCode":"501","code":"BZ","name":"Belize","pattern":"","emoji":"๐Ÿ‡ง๐Ÿ‡ฟ"},{"phoneCode":"229","code":"BJ","name":"Benin","pattern":"229 XX XXX XXX","emoji":"๐Ÿ‡ง๐Ÿ‡ฏ"},{"phoneCode":"1 441","code":"BM","name":"Bermuda","pattern":"1441 XXX XXXX","emoji":"๐Ÿ‡ง๐Ÿ‡ฒ"},{"phoneCode":"975","code":"BT","name":"Bhutan","pattern":"","emoji":"๐Ÿ‡ง๐Ÿ‡น"},{"phoneCode":"591","code":"BO","name":"Bolivia","pattern":"591 X XXX XXXX","emoji":"๐Ÿ‡ง๐Ÿ‡ด"},{"phoneCode":"599 7","code":"BQ","name":"Caribbean Netherlands","pattern":"","emoji":"๐Ÿ‡ง๐Ÿ‡ถ"},{"phoneCode":"387","code":"BA","name":"Bosnia & Herzegovina","pattern":"","emoji":"๐Ÿ‡ง๐Ÿ‡ฆ"},{"phoneCode":"267","code":"BW","name":"Botswana","pattern":"267 XX XXX XXX","emoji":"๐Ÿ‡ง๐Ÿ‡ผ"},{"phoneCode":"55","code":"BR","name":"Brazil","pattern":"55 XX XXXXX XXXX","emoji":"๐Ÿ‡ง๐Ÿ‡ท"},{"phoneCode":"246","code":"IO","name":"British Indian Ocean Territory","pattern":"246 XXX XXXX","emoji":"๐Ÿ‡ฎ๐Ÿ‡ด"},{"phoneCode":"1 284","code":"VG","name":"British Virgin Islands","pattern":"1284 XXX XXXX","emoji":"๐Ÿ‡ป๐Ÿ‡ฌ"},{"phoneCode":"673","code":"BN","name":"Brunei","pattern":"673 XXX XXXX","emoji":"๐Ÿ‡ง๐Ÿ‡ณ"},{"phoneCode":"359","code":"BG","name":"Bulgaria","pattern":"","emoji":"๐Ÿ‡ง๐Ÿ‡ฌ"},{"phoneCode":"226","code":"BF","name":"Burkina Faso","pattern":"226 XX XX XX XX","emoji":"๐Ÿ‡ง๐Ÿ‡ซ"},{"phoneCode":"95","code":"MM","name":"Myanmar (Burma)","pattern":"","emoji":"๐Ÿ‡ฒ๐Ÿ‡ฒ"},{"phoneCode":"257","code":"BI","name":"Burundi","pattern":"257 XX XX XXXX","emoji":"๐Ÿ‡ง๐Ÿ‡ฎ"},{"phoneCode":"855","code":"KH","name":"Cambodia","pattern":"","emoji":"๐Ÿ‡ฐ๐Ÿ‡ญ"},{"phoneCode":"237","code":"CM","name":"Cameroon","pattern":"237 XXXX XXXX","emoji":"๐Ÿ‡จ๐Ÿ‡ฒ"},{"phoneCode":"1","code":"CA","name":"Canada","pattern":"1 XXX XXX XXXX","emoji":"๐Ÿ‡จ๐Ÿ‡ฆ"},{"phoneCode":"238","code":"CV","name":"Cape Verde","pattern":"238 XXX XXXX","emoji":"๐Ÿ‡จ๐Ÿ‡ป"},{"phoneCode":"1 345","code":"KY","name":"Cayman Islands","pattern":"1345 XXX XXXX","emoji":"๐Ÿ‡ฐ๐Ÿ‡พ"},{"phoneCode":"236","code":"CF","name":"Central African Republic","pattern":"236 XX XX XX XX","emoji":"๐Ÿ‡จ๐Ÿ‡ซ"},{"phoneCode":"235","code":"TD","name":"Chad","pattern":"235 XX XX XX XX","emoji":"๐Ÿ‡น๐Ÿ‡ฉ"},{"phoneCode":"56","code":"CL","name":"Chile","pattern":"56 X XXXX XXXX","emoji":"๐Ÿ‡จ๐Ÿ‡ฑ"},{"phoneCode":"86","code":"CN","name":"China","pattern":"86 XXX XXXX XXXX","emoji":"๐Ÿ‡จ๐Ÿ‡ณ"},{"phoneCode":"61","code":"CX","name":"Christmas Island","pattern":"","emoji":"๐Ÿ‡จ๐Ÿ‡ฝ"},{"phoneCode":"61","code":"CC","name":"Cocos (Keeling) Islands","pattern":"","emoji":"๐Ÿ‡จ๐Ÿ‡จ"},{"phoneCode":"57","code":"CO","name":"Colombia","pattern":"57 XXX XXX XXXX","emoji":"๐Ÿ‡จ๐Ÿ‡ด"},{"phoneCode":"269","code":"KM","name":"Comoros","pattern":"269 XXX XXXX","emoji":"๐Ÿ‡ฐ๐Ÿ‡ฒ"},{"phoneCode":"242","code":"CG","name":"Congo - Brazzaville","pattern":"242 XX XXX XXXX","emoji":"๐Ÿ‡จ๐Ÿ‡ฌ"},{"phoneCode":"243","code":"CD","name":"Congo - Kinshasa","pattern":"243 XX XXX XXXX","emoji":"๐Ÿ‡จ๐Ÿ‡ฉ"},{"phoneCode":"682","code":"CK","name":"Cook Islands","pattern":"","emoji":"๐Ÿ‡จ๐Ÿ‡ฐ"},{"phoneCode":"506","code":"CR","name":"Costa Rica","pattern":"","emoji":"๐Ÿ‡จ๐Ÿ‡ท"},{"phoneCode":"225","code":"CI","name":"Cote dโ€™Ivoire","pattern":"225 XX XXX XXX","emoji":"๐Ÿ‡จ๐Ÿ‡ฎ"},{"phoneCode":"385","code":"HR","name":"Croatia","pattern":"","emoji":"๐Ÿ‡ญ๐Ÿ‡ท"},{"phoneCode":"53","code":"CU","name":"Cuba","pattern":"53 XXXX XXXX","emoji":"๐Ÿ‡จ๐Ÿ‡บ"},{"phoneCode":"599 9","code":"CW","name":"Curacao","pattern":"","emoji":"๐Ÿ‡จ๐Ÿ‡ผ"},{"phoneCode":"357","code":"CY","name":"Cyprus","pattern":"357 XXXX XXXX","emoji":"๐Ÿ‡จ๐Ÿ‡พ"},{"phoneCode":"420","code":"CZ","name":"Czech Republic","pattern":"","emoji":"๐Ÿ‡จ๐Ÿ‡ฟ"},{"phoneCode":"45","code":"DK","name":"Denmark","pattern":"45 XXXX XXXX","emoji":"๐Ÿ‡ฉ๐Ÿ‡ฐ"},{"phoneCode":"246","code":"DG","name":"Diego Garcia","pattern":"","emoji":"๐Ÿ‡ฉ๐Ÿ‡ฌ"},{"phoneCode":"253","code":"DJ","name":"Djibouti","pattern":"253 XX XX XX XX","emoji":"๐Ÿ‡ฉ๐Ÿ‡ฏ"},{"phoneCode":"1 767","code":"DM","name":"Dominica","pattern":"1767 XXX XXXX","emoji":"๐Ÿ‡ฉ๐Ÿ‡ฒ"},{"phoneCode":"1 809 and 1 829","code":"DO","name":"Dominican Republic","pattern":"1 XXX XXX XXXX","emoji":"๐Ÿ‡ฉ๐Ÿ‡ด"},{"phoneCode":"670","code":"TL","name":"Timor-Leste","pattern":"","emoji":"๐Ÿ‡น๐Ÿ‡ฑ"},{"phoneCode":"593","code":"EC","name":"Ecuador","pattern":"","emoji":"๐Ÿ‡ช๐Ÿ‡จ"},{"phoneCode":"20","code":"EG","name":"Egypt","pattern":"20 XX XXX XXXX","emoji":"๐Ÿ‡ช๐Ÿ‡ฌ"},{"phoneCode":"503","code":"SV","name":"El Salvador","pattern":"503 XXXX XXXX","emoji":"๐Ÿ‡ธ๐Ÿ‡ป"},{"phoneCode":"240","code":"GQ","name":"Equatorial Guinea","pattern":"240 XXX XXX XXX","emoji":"๐Ÿ‡ฌ๐Ÿ‡ถ"},{"phoneCode":"291","code":"ER","name":"Eritrea","pattern":"291 X XXX XXX","emoji":"๐Ÿ‡ช๐Ÿ‡ท"},{"phoneCode":"372","code":"EE","name":"Estonia","pattern":"","emoji":"๐Ÿ‡ช๐Ÿ‡ช"},{"phoneCode":"251","code":"ET","name":"Ethiopia","pattern":"251 XX XXX XXXX","emoji":"๐Ÿ‡ช๐Ÿ‡น"},{"phoneCode":"500","code":"FK","name":"Falkland Islands","pattern":"","emoji":"๐Ÿ‡ซ๐Ÿ‡ฐ"},{"phoneCode":"298","code":"FO","name":"Faroe Islands","pattern":"298 XXX XXX","emoji":"๐Ÿ‡ซ๐Ÿ‡ด"},{"phoneCode":"679","code":"FJ","name":"Fiji","pattern":"","emoji":"๐Ÿ‡ซ๐Ÿ‡ฏ"},{"phoneCode":"358","code":"FI","name":"Finland","pattern":"","emoji":"๐Ÿ‡ซ๐Ÿ‡ฎ"},{"phoneCode":"33","code":"FR","name":"France","pattern":"33 X XX XX XX XX","emoji":"๐Ÿ‡ซ๐Ÿ‡ท"},{"phoneCode":"594","code":"GF","name":"French Guiana","pattern":"","emoji":"๐Ÿ‡ฌ๐Ÿ‡ซ"},{"phoneCode":"689","code":"PF","name":"French Polynesia","pattern":"","emoji":"๐Ÿ‡ต๐Ÿ‡ซ"},{"phoneCode":"241","code":"GA","name":"Gabon","pattern":"241 X XX XX XX","emoji":"๐Ÿ‡ฌ๐Ÿ‡ฆ"},{"phoneCode":"220","code":"GM","name":"Gambia","pattern":"220 XXX XXXX","emoji":"๐Ÿ‡ฌ๐Ÿ‡ฒ"},{"phoneCode":"995","code":"GE","name":"Georgia","pattern":"","emoji":"๐Ÿ‡ฌ๐Ÿ‡ช"},{"phoneCode":"49","code":"DE","name":"Germany","pattern":"49 XXX XXXXXXXX","emoji":"๐Ÿ‡ฉ๐Ÿ‡ช"},{"phoneCode":"233","code":"GH","name":"Ghana","pattern":"","emoji":"๐Ÿ‡ฌ๐Ÿ‡ญ"},{"phoneCode":"350","code":"GI","name":"Gibraltar","pattern":"350 XXXX XXXX","emoji":"๐Ÿ‡ฌ๐Ÿ‡ฎ"},{"phoneCode":"30","code":"GR","name":"Greece","pattern":"30 XX XXXX XXXX","emoji":"๐Ÿ‡ฌ๐Ÿ‡ท"},{"phoneCode":"299","code":"GL","name":"Greenland","pattern":"299 XXX XXX","emoji":"๐Ÿ‡ฌ๐Ÿ‡ฑ"},{"phoneCode":"1 473","code":"GD","name":"Grenada","pattern":"1473 XXX XXXX","emoji":"๐Ÿ‡ฌ๐Ÿ‡ฉ"},{"phoneCode":"590","code":"GP","name":"Guadeloupe","pattern":"","emoji":"๐Ÿ‡ฌ๐Ÿ‡ต"},{"phoneCode":"1 671","code":"GU","name":"Guam","pattern":"1671 XXX XXXX","emoji":"๐Ÿ‡ฌ๐Ÿ‡บ"},{"phoneCode":"502","code":"GT","name":"Guatemala","pattern":"502 X XXX XXXX","emoji":"๐Ÿ‡ฌ๐Ÿ‡น"},{"phoneCode":"44","code":"GG","name":"Guernsey","pattern":"","emoji":"๐Ÿ‡ฌ๐Ÿ‡ฌ"},{"phoneCode":"224","code":"GN","name":"Guinea","pattern":"224 XXX XXX XXX","emoji":"๐Ÿ‡ฌ๐Ÿ‡ณ"},{"phoneCode":"245","code":"GW","name":"Guinea-Bissau","pattern":"245 XXX XXXX","emoji":"๐Ÿ‡ฌ๐Ÿ‡ผ"},{"phoneCode":"592","code":"GY","name":"Guyana","pattern":"","emoji":"๐Ÿ‡ฌ๐Ÿ‡พ"},{"phoneCode":"509","code":"HT","name":"Haiti","pattern":"","emoji":"๐Ÿ‡ญ๐Ÿ‡น"},{"phoneCode":"504","code":"HN","name":"Honduras","pattern":"504 XXXX XXXX","emoji":"๐Ÿ‡ญ๐Ÿ‡ณ"},{"phoneCode":"852","code":"HK","name":"Hong Kong SAR China","pattern":"","emoji":"๐Ÿ‡ญ๐Ÿ‡ฐ"},{"phoneCode":"36","code":"HU","name":"Hungary","pattern":"36 XX XXX XXXX","emoji":"๐Ÿ‡ญ๐Ÿ‡บ"},{"phoneCode":"354","code":"IS","name":"Iceland","pattern":"354 XXX XXXX","emoji":"๐Ÿ‡ฎ๐Ÿ‡ธ"},{"phoneCode":"91","code":"IN","name":"India","pattern":"91 XXXXX XXXXX","emoji":"๐Ÿ‡ฎ๐Ÿ‡ณ"},{"phoneCode":"62","code":"ID","name":"Indonesia","pattern":"","emoji":"๐Ÿ‡ฎ๐Ÿ‡ฉ"},{"phoneCode":"98","code":"IR","name":"Iran","pattern":"98 XXX XXX XXXX","emoji":"๐Ÿ‡ฎ๐Ÿ‡ท"},{"phoneCode":"964","code":"IQ","name":"Iraq","pattern":"964 XXX XXX XXXX","emoji":"๐Ÿ‡ฎ๐Ÿ‡ถ"},{"phoneCode":"353","code":"IE","name":"Ireland","pattern":"353 XX XXX XXXX","emoji":"๐Ÿ‡ฎ๐Ÿ‡ช"},{"phoneCode":"972","code":"IL","name":"Israel","pattern":"972 XX XXX XXXX","emoji":"๐Ÿ‡ฎ๐Ÿ‡ฑ"},{"phoneCode":"39","code":"IT","name":"Italy","pattern":"39 XXX XXX XXXX","emoji":"๐Ÿ‡ฎ๐Ÿ‡น"},{"phoneCode":"1 876","code":"JM","name":"Jamaica","pattern":"1876 XXX XXXX","emoji":"๐Ÿ‡ฏ๐Ÿ‡ฒ"},{"phoneCode":"47 79","code":"SJ","name":"Svalbard & Jan Mayen","pattern":"","emoji":"๐Ÿ‡ธ๐Ÿ‡ฏ"},{"phoneCode":"81","code":"JP","name":"Japan","pattern":"81 XX XXXX XXXX","emoji":"๐Ÿ‡ฏ๐Ÿ‡ต"},{"phoneCode":"44","code":"JE","name":"Jersey","pattern":"","emoji":"๐Ÿ‡ฏ๐Ÿ‡ช"},{"phoneCode":"962","code":"JO","name":"Jordan","pattern":"962 X XXXX XXXX","emoji":"๐Ÿ‡ฏ๐Ÿ‡ด"},{"phoneCode":"7 7","code":"KZ","name":"Kazakhstan","pattern":"7 XXX XXX XX XX","emoji":"๐Ÿ‡ฐ๐Ÿ‡ฟ"},{"phoneCode":"254","code":"KE","name":"Kenya","pattern":"254 XXX XXX XXX","emoji":"๐Ÿ‡ฐ๐Ÿ‡ช"},{"phoneCode":"686","code":"KI","name":"Kiribati","pattern":"","emoji":"๐Ÿ‡ฐ๐Ÿ‡ฎ"},{"phoneCode":"850","code":"KP","name":"North Korea","pattern":"","emoji":"๐Ÿ‡ฐ๐Ÿ‡ต"},{"phoneCode":"82","code":"KR","name":"South Korea","pattern":"","emoji":"๐Ÿ‡ฐ๐Ÿ‡ท"},{"phoneCode":"965","code":"KW","name":"Kuwait","pattern":"965 XXXX XXXX","emoji":"๐Ÿ‡ฐ๐Ÿ‡ผ"},{"phoneCode":"996","code":"KG","name":"Kyrgyzstan","pattern":"","emoji":"๐Ÿ‡ฐ๐Ÿ‡ฌ"},{"phoneCode":"856","code":"LA","name":"Laos","pattern":"","emoji":"๐Ÿ‡ฑ๐Ÿ‡ฆ"},{"phoneCode":"371","code":"LV","name":"Latvia","pattern":"371 XXX XXXXX","emoji":"๐Ÿ‡ฑ๐Ÿ‡ป"},{"phoneCode":"961","code":"LB","name":"Lebanon","pattern":"","emoji":"๐Ÿ‡ฑ๐Ÿ‡ง"},{"phoneCode":"266","code":"LS","name":"Lesotho","pattern":"266 XX XXX XXX","emoji":"๐Ÿ‡ฑ๐Ÿ‡ธ"},{"phoneCode":"231","code":"LR","name":"Liberia","pattern":"","emoji":"๐Ÿ‡ฑ๐Ÿ‡ท"},{"phoneCode":"218","code":"LY","name":"Libya","pattern":"218 XX XXX XXXX","emoji":"๐Ÿ‡ฑ๐Ÿ‡พ"},{"phoneCode":"423","code":"LI","name":"Liechtenstein","pattern":"","emoji":"๐Ÿ‡ฑ๐Ÿ‡ฎ"},{"phoneCode":"370","code":"LT","name":"Lithuania","pattern":"370 XXX XXXXX","emoji":"๐Ÿ‡ฑ๐Ÿ‡น"},{"phoneCode":"352","code":"LU","name":"Luxembourg","pattern":"","emoji":"๐Ÿ‡ฑ๐Ÿ‡บ"},{"phoneCode":"853","code":"MO","name":"Macau SAR China","pattern":"","emoji":"๐Ÿ‡ฒ๐Ÿ‡ด"},{"phoneCode":"389","code":"MK","name":"Macedonia","pattern":"","emoji":"๐Ÿ‡ฒ๐Ÿ‡ฐ"},{"phoneCode":"261","code":"MG","name":"Madagascar","pattern":"261 XX XX XXX XX","emoji":"๐Ÿ‡ฒ๐Ÿ‡ฌ"},{"phoneCode":"265","code":"MW","name":"Malawi","pattern":"","emoji":"๐Ÿ‡ฒ๐Ÿ‡ผ"},{"phoneCode":"60","code":"MM","name":"Malaysia","pattern":"","emoji":"๐Ÿ‡ฒ๐Ÿ‡ฒ"},{"phoneCode":"960","code":"MV","name":"Maldives","pattern":"","emoji":"๐Ÿ‡ฒ๐Ÿ‡ป"},{"phoneCode":"223","code":"ML","name":"Mali","pattern":"223 XXXX XXXX","emoji":"๐Ÿ‡ฒ๐Ÿ‡ฑ"},{"phoneCode":"356","code":"MT","name":"Malta","pattern":"356 XX XX XX XX","emoji":"๐Ÿ‡ฒ๐Ÿ‡น"},{"phoneCode":"692","code":"MH","name":"Marshall Islands","pattern":"","emoji":"๐Ÿ‡ฒ๐Ÿ‡ญ"},{"phoneCode":"596","code":"MQ","name":"Martinique","pattern":"","emoji":"๐Ÿ‡ฒ๐Ÿ‡ถ"},{"phoneCode":"222","code":"MR","name":"Mauritania","pattern":"222 XXXX XXXX","emoji":"๐Ÿ‡ฒ๐Ÿ‡ท"},{"phoneCode":"230","code":"MU","name":"Mauritius","pattern":"","emoji":"๐Ÿ‡ฒ๐Ÿ‡บ"},{"phoneCode":"262","code":"YT","name":"Mayotte","pattern":"","emoji":"๐Ÿ‡พ๐Ÿ‡น"},{"phoneCode":"52","code":"MX","name":"Mexico","pattern":"","emoji":"๐Ÿ‡ฒ๐Ÿ‡ฝ"},{"phoneCode":"691","code":"FM","name":"Micronesia","pattern":"","emoji":"๐Ÿ‡ซ๐Ÿ‡ฒ"},{"phoneCode":"373","code":"MD","name":"Moldova","pattern":"373 XX XXX XXX","emoji":"๐Ÿ‡ฒ๐Ÿ‡ฉ"},{"phoneCode":"377","code":"MC","name":"Monaco","pattern":"377 XXXX XXXX","emoji":"๐Ÿ‡ฒ๐Ÿ‡จ"},{"phoneCode":"976","code":"MN","name":"Mongolia","pattern":"","emoji":"๐Ÿ‡ฒ๐Ÿ‡ณ"},{"phoneCode":"382","code":"ME","name":"Montenegro","pattern":"","emoji":"๐Ÿ‡ฒ๐Ÿ‡ช"},{"phoneCode":"1 664","code":"MS","name":"Montserrat","pattern":"1664 XXX XXXX","emoji":"๐Ÿ‡ฒ๐Ÿ‡ธ"},{"phoneCode":"212","code":"MA","name":"Morocco","pattern":"212 XX XXX XXXX","emoji":"๐Ÿ‡ฒ๐Ÿ‡ฆ"},{"phoneCode":"258","code":"MZ","name":"Mozambique","pattern":"258 XX XXX XXXX","emoji":"๐Ÿ‡ฒ๐Ÿ‡ฟ"},{"phoneCode":"264","code":"NA","name":"Namibia","pattern":"264 XX XXX XXXX","emoji":"๐Ÿ‡ณ๐Ÿ‡ฆ"},{"phoneCode":"674","code":"NR","name":"Nauru","pattern":"","emoji":"๐Ÿ‡ณ๐Ÿ‡ท"},{"phoneCode":"977","code":"NP","name":"Nepal","pattern":"","emoji":"๐Ÿ‡ณ๐Ÿ‡ต"},{"phoneCode":"31","code":"NL","name":"Netherlands","pattern":"31 X XX XX XX XX","emoji":"๐Ÿ‡ณ๐Ÿ‡ฑ"},{"phoneCode":"687","code":"NC","name":"New Caledonia","pattern":"","emoji":"๐Ÿ‡ณ๐Ÿ‡จ"},{"phoneCode":"64","code":"NZ","name":"New Zealand","pattern":"","emoji":"๐Ÿ‡ณ๐Ÿ‡ฟ"},{"phoneCode":"505","code":"NI","name":"Nicaragua","pattern":"505 XXXX XXXX","emoji":"๐Ÿ‡ณ๐Ÿ‡ฎ"},{"phoneCode":"227","code":"NE","name":"Niger","pattern":"227 XX XX XX XX","emoji":"๐Ÿ‡ณ๐Ÿ‡ช"},{"phoneCode":"234","code":"NG","name":"Nigeria","pattern":"","emoji":"๐Ÿ‡ณ๐Ÿ‡ฌ"},{"phoneCode":"683","code":"NU","name":"Niue","pattern":"","emoji":"๐Ÿ‡ณ๐Ÿ‡บ"},{"phoneCode":"672","code":"NF","name":"Norfolk Island","pattern":"","emoji":"๐Ÿ‡ณ๐Ÿ‡ซ"},{"phoneCode":"1 670","code":"MP","name":"Northern Mariana Islands","pattern":"1670 XXX XXXX","emoji":"๐Ÿ‡ฒ๐Ÿ‡ต"},{"phoneCode":"47","code":"NO","name":"Norway","pattern":"47 XXXX XXXX","emoji":"๐Ÿ‡ณ๐Ÿ‡ด"},{"phoneCode":"968","code":"OM","name":"Oman","pattern":"968 XXXX XXXX","emoji":"๐Ÿ‡ด๐Ÿ‡ฒ"},{"phoneCode":"92","code":"PK","name":"Pakistan","pattern":"92 XXX XXX XXXX","emoji":"๐Ÿ‡ต๐Ÿ‡ฐ"},{"phoneCode":"680","code":"PW","name":"Palau","pattern":"","emoji":"๐Ÿ‡ต๐Ÿ‡ผ"},{"phoneCode":"970","code":"PS","name":"Palestinian Territories","pattern":"970 XXX XX XXXX","emoji":"๐Ÿ‡ต๐Ÿ‡ธ"},{"phoneCode":"507","code":"PA","name":"Panama","pattern":"507 XXXX XXXX","emoji":"๐Ÿ‡ต๐Ÿ‡ฆ"},{"phoneCode":"675","code":"PG","name":"Papua New Guinea","pattern":"","emoji":"๐Ÿ‡ต๐Ÿ‡ฌ"},{"phoneCode":"595","code":"PY","name":"Paraguay","pattern":"595 XXX XXX XXX","emoji":"๐Ÿ‡ต๐Ÿ‡พ"},{"phoneCode":"51","code":"PE","name":"Peru","pattern":"51 XXX XXX XXX","emoji":"๐Ÿ‡ต๐Ÿ‡ช"},{"phoneCode":"63","code":"PH","name":"Philippines","pattern":"63 XXX XXX XXXX","emoji":"๐Ÿ‡ต๐Ÿ‡ญ"},{"phoneCode":"64","code":"PN","name":"Pitcairn Islands","pattern":"","emoji":"๐Ÿ‡ต๐Ÿ‡ณ"},{"phoneCode":"48","code":"PL","name":"Poland","pattern":"48 XXX XXX XXX","emoji":"๐Ÿ‡ต๐Ÿ‡ฑ"},{"phoneCode":"351","code":"PT","name":"Portugal","pattern":"351 X XXXX XXXX","emoji":"๐Ÿ‡ต๐Ÿ‡น"},{"phoneCode":"1 787 and 1 939","code":"PR","name":"Puerto Rico","pattern":"1 XXX XXX XXXX","emoji":"๐Ÿ‡ต๐Ÿ‡ท"},{"phoneCode":"974","code":"QA","name":"Qatar","pattern":"","emoji":"๐Ÿ‡ถ๐Ÿ‡ฆ"},{"phoneCode":"262","code":"RE","name":"Reunion","pattern":"262 XXX XXX XXX","emoji":"๐Ÿ‡ท๐Ÿ‡ช"},{"phoneCode":"40","code":"RO","name":"Romania","pattern":"40 XXX XXX XXX","emoji":"๐Ÿ‡ท๐Ÿ‡ด"},{"phoneCode":"7","code":"RU","name":"Russia","pattern":"7 XXX XXX XX XX","emoji":"๐Ÿ‡ท๐Ÿ‡บ"},{"phoneCode":"250","code":"RW","name":"Rwanda","pattern":"250 XXX XXX XXX","emoji":"๐Ÿ‡ท๐Ÿ‡ผ"},{"phoneCode":"590","code":"BL","name":"St. Barthelemy","pattern":"","emoji":"๐Ÿ‡ง๐Ÿ‡ฑ"},{"phoneCode":"290","code":"SH","name":"St. Helena","pattern":"290 XX XXX","emoji":"๐Ÿ‡ธ๐Ÿ‡ญ"},{"phoneCode":"1 869","code":"KN","name":"St. Kitts & Nevis","pattern":"1869 XXX XXXX","emoji":"๐Ÿ‡ฐ๐Ÿ‡ณ"},{"phoneCode":"1 758","code":"LC","name":"St. Lucia","pattern":"1758 XXX XXXX","emoji":"๐Ÿ‡ฑ๐Ÿ‡จ"},{"phoneCode":"590","code":"MF","name":"St. Martin (France)","pattern":"","emoji":"๐Ÿ‡ฒ๐Ÿ‡ซ"},{"phoneCode":"508","code":"PM","name":"St. Pierre and Miquelon","pattern":"","emoji":"๐Ÿ‡ต๐Ÿ‡ฒ"},{"phoneCode":"1 784","code":"VC","name":"St. Vincent and the Grenadines","pattern":"1784 XXX XXXX","emoji":"๐Ÿ‡ป๐Ÿ‡จ"},{"phoneCode":"685","code":"WS","name":"Samoa","pattern":"","emoji":"๐Ÿ‡ผ๐Ÿ‡ธ"},{"phoneCode":"378","code":"SM","name":"San Marino","pattern":"378 XXX XXX XXXX","emoji":"๐Ÿ‡ธ๐Ÿ‡ฒ"},{"phoneCode":"239","code":"ST","name":"Sรฃo Tome & Principe","pattern":"239 XX XXXXX","emoji":"๐Ÿ‡ธ๐Ÿ‡น"},{"phoneCode":"966","code":"SA","name":"Saudi Arabia","pattern":"","emoji":"๐Ÿ‡ธ๐Ÿ‡ฆ"},{"phoneCode":"221","code":"SN","name":"Senegal","pattern":"221 XX XXX XXXX","emoji":"๐Ÿ‡ธ๐Ÿ‡ณ"},{"phoneCode":"381","code":"RS","name":"Serbia","pattern":"381 XX XXX XXXX","emoji":"๐Ÿ‡ท๐Ÿ‡ธ"},{"phoneCode":"248","code":"SC","name":"Seychelles","pattern":"248 X XX XX XX","emoji":"๐Ÿ‡ธ๐Ÿ‡จ"},{"phoneCode":"232","code":"SL","name":"Sierra Leone","pattern":"232 XX XXX XXX","emoji":"๐Ÿ‡ธ๐Ÿ‡ฑ"},{"phoneCode":"65","code":"SG","name":"Singapore","pattern":"65 XXXX XXXX","emoji":"๐Ÿ‡ธ๐Ÿ‡ฌ"},{"phoneCode":"599 3","code":"BQ","name":"Sint Eustatius","pattern":"","emoji":"๐Ÿ‡ง๐Ÿ‡ถ"},{"phoneCode":"1 721","code":"SX","name":"Sint Maarten","pattern":"1721 XXX XXXX","emoji":"๐Ÿ‡ธ๐Ÿ‡ฝ"},{"phoneCode":"421","code":"SK","name":"Slovakia","pattern":"","emoji":"๐Ÿ‡ธ๐Ÿ‡ฐ"},{"phoneCode":"386","code":"SI","name":"Slovenia","pattern":"","emoji":"๐Ÿ‡ธ๐Ÿ‡ฎ"},{"phoneCode":"677","code":"SB","name":"Solomon Islands","pattern":"","emoji":"๐Ÿ‡ธ๐Ÿ‡ง"},{"phoneCode":"252","code":"SO","name":"Somalia","pattern":"252 XX XXX XXX","emoji":"๐Ÿ‡ธ๐Ÿ‡ด"},{"phoneCode":"27","code":"ZA","name":"South Africa","pattern":"27 XX XXX XXXX","emoji":"๐Ÿ‡ฟ๐Ÿ‡ฆ"},{"phoneCode":"500","code":"GS","name":"South Georgia & South Sandwich Islands","pattern":"","emoji":"๐Ÿ‡ฌ๐Ÿ‡ธ"},{"phoneCode":"995 34","code":"","name":"South Ossetia","pattern":"","emoji":""},{"phoneCode":"211","code":"SS","name":"South Sudan","pattern":"211 XX XXX XXXX","emoji":"๐Ÿ‡ธ๐Ÿ‡ธ"},{"phoneCode":"34","code":"ES","name":"Spain","pattern":"34 XXX XXX XXX","emoji":"๐Ÿ‡ช๐Ÿ‡ธ"},{"phoneCode":"94","code":"LK","name":"Sri Lanka","pattern":"94 XX XXX XXXX","emoji":"๐Ÿ‡ฑ๐Ÿ‡ฐ"},{"phoneCode":"249","code":"SD","name":"Sudan","pattern":"249 XX XXX XXXX","emoji":"๐Ÿ‡ธ๐Ÿ‡ฉ"},{"phoneCode":"597","code":"SR","name":"Suriname","pattern":"597 XXX XXXX","emoji":"๐Ÿ‡ธ๐Ÿ‡ท"},{"phoneCode":"47 79","code":"SJ","name":"Svalbard","pattern":"","emoji":"๐Ÿ‡ธ๐Ÿ‡ฏ"},{"phoneCode":"268","code":"SZ","name":"Swaziland","pattern":"268 XXXX XXXX","emoji":"๐Ÿ‡ธ๐Ÿ‡ฟ"},{"phoneCode":"46","code":"SE","name":"Sweden","pattern":"46 XX XXX XXXX","emoji":"๐Ÿ‡ธ๐Ÿ‡ช"},{"phoneCode":"41","code":"CH","name":"Switzerland","pattern":"41 XX XXX XXXX","emoji":"๐Ÿ‡จ๐Ÿ‡ญ"},{"phoneCode":"963","code":"SY","name":"Syria","pattern":"","emoji":"๐Ÿ‡ธ๐Ÿ‡พ"},{"phoneCode":"886","code":"TW","name":"Taiwan","pattern":"","emoji":"๐Ÿ‡น๐Ÿ‡ผ"},{"phoneCode":"992","code":"TJ","name":"Tajikistan","pattern":"","emoji":"๐Ÿ‡น๐Ÿ‡ฏ"},{"phoneCode":"255","code":"TZ","name":"Tanzania","pattern":"255 XX XXX XXXX","emoji":"๐Ÿ‡น๐Ÿ‡ฟ"},{"phoneCode":"66","code":"TH","name":"Thailand","pattern":"66 X XXXX XXXX","emoji":"๐Ÿ‡น๐Ÿ‡ญ"},{"phoneCode":"228","code":"TG","name":"Togo","pattern":"228 XX XXX XXX","emoji":"๐Ÿ‡น๐Ÿ‡ฌ"},{"phoneCode":"690","code":"TK","name":"Tokelau","pattern":"","emoji":"๐Ÿ‡น๐Ÿ‡ฐ"},{"phoneCode":"676","code":"TO","name":"Tonga","pattern":"","emoji":"๐Ÿ‡น๐Ÿ‡ด"},{"phoneCode":"1 868","code":"TT","name":"Trinidad & Tobago","pattern":"1868 XXX XXXX","emoji":"๐Ÿ‡น๐Ÿ‡น"},{"phoneCode":"216","code":"TN","name":"Tunisia","pattern":"216 XX XXX XXX","emoji":"๐Ÿ‡น๐Ÿ‡ณ"},{"phoneCode":"90","code":"TR","name":"Turkey","pattern":"90 XXX XXX XXXX","emoji":"๐Ÿ‡น๐Ÿ‡ท"},{"phoneCode":"993","code":"TM","name":"Turkmenistan","pattern":"993 XX XXXXXX","emoji":"๐Ÿ‡น๐Ÿ‡ฒ"},{"phoneCode":"1 649","code":"TC","name":"Turks & Caicos Islands","pattern":"1649 XXX XXXX","emoji":"๐Ÿ‡น๐Ÿ‡จ"},{"phoneCode":"688","code":"TV","name":"Tuvalu","pattern":"","emoji":"๐Ÿ‡น๐Ÿ‡ป"},{"phoneCode":"256","code":"UG","name":"Uganda","pattern":"256 XX XXX XXXX","emoji":"๐Ÿ‡บ๐Ÿ‡ฌ"},{"phoneCode":"380","code":"UA","name":"Ukraine","pattern":"380 XX XXX XX XX","emoji":"๐Ÿ‡บ๐Ÿ‡ฆ"},{"phoneCode":"971","code":"AE","name":"United Arab Emirates","pattern":"971 XX XXX XXXX","emoji":"๐Ÿ‡ฆ๐Ÿ‡ช"},{"phoneCode":"44","code":"GB","name":"United Kingdom","pattern":"44 XXXX XXXXXX","emoji":"๐Ÿ‡ฌ๐Ÿ‡ง"},{"phoneCode":"1","code":"US","name":"United States","pattern":"1 XXX XXX XXXX","emoji":"๐Ÿ‡บ๐Ÿ‡ธ"},{"phoneCode":"598","code":"UY","name":"Uruguay","pattern":"598 XXXX XXXX","emoji":"๐Ÿ‡บ๐Ÿ‡พ"},{"phoneCode":"1 340","code":"VI","name":"U.S. Virgin Islands","pattern":"1340 XXX XXXX","emoji":"๐Ÿ‡ป๐Ÿ‡ฎ"},{"phoneCode":"998","code":"UZ","name":"Uzbekistan","pattern":"998 XX XXXXXXX","emoji":"๐Ÿ‡บ๐Ÿ‡ฟ"},{"phoneCode":"678","code":"VU","name":"Vanuatu","pattern":"","emoji":"๐Ÿ‡ป๐Ÿ‡บ"},{"phoneCode":"58","code":"VE","name":"Venezuela","pattern":"58 XXX XXX XXXX","emoji":"๐Ÿ‡ป๐Ÿ‡ช"},{"phoneCode":"39 06 698","code":"VA","name":"Vatican City","pattern":"","emoji":"๐Ÿ‡ป๐Ÿ‡ฆ"},{"phoneCode":"84","code":"VN","name":"Vietnam","pattern":"","emoji":"๐Ÿ‡ป๐Ÿ‡ณ"},{"phoneCode":"681","code":"WF","name":"Wallis & Futuna","pattern":"","emoji":"๐Ÿ‡ผ๐Ÿ‡ซ"},{"phoneCode":"967","code":"YE","name":"Yemen","pattern":"967 XXX XXX XXX","emoji":"๐Ÿ‡พ๐Ÿ‡ช"},{"phoneCode":"260","code":"ZM","name":"Zambia","pattern":"260 XX XXX XXXX","emoji":"๐Ÿ‡ฟ๐Ÿ‡ฒ"},{"phoneCode":"255","code":"","name":"Zanzibar","pattern":"","emoji":""},{"phoneCode":"263","code":"ZW","name":"Zimbabwe","pattern":"263 XX XXX XXXX","emoji":"๐Ÿ‡ฟ๐Ÿ‡ผ"}]; +const Countries: Country[] = [{"phoneCode":"7 840","code":"AB","name":"Abkhazia","pattern":"","emoji":""},{"phoneCode":"93","code":"AF","name":"Afghanistan","pattern":"93 XXX XXX XXX","emoji":"๐Ÿ‡ฆ๐Ÿ‡ซ"},{"phoneCode":"358 18","code":"AX","name":"Aland Islands","pattern":"","emoji":"๐Ÿ‡ฆ๐Ÿ‡ฝ"},{"phoneCode":"355","code":"AL","name":"Albania","pattern":"355 XX XXX XXXX","emoji":"๐Ÿ‡ฆ๐Ÿ‡ฑ"},{"phoneCode":"213","code":"DZ","name":"Algeria","pattern":"213 XXX XX XX XX","emoji":"๐Ÿ‡ฉ๐Ÿ‡ฟ"},{"phoneCode":"1 684","code":"AS","name":"American Samoa","pattern":"1684 XXX XXXX","emoji":"๐Ÿ‡ฆ๐Ÿ‡ธ"},{"phoneCode":"376","code":"AD","name":"Andorra","pattern":"376 XX XX XX","emoji":"๐Ÿ‡ฆ๐Ÿ‡ฉ"},{"phoneCode":"244","code":"AO","name":"Angola","pattern":"244 XXX XXX XXX","emoji":"๐Ÿ‡ฆ๐Ÿ‡ด"},{"phoneCode":"1 264","code":"AI","name":"Anguilla","pattern":"1264 XXX XXXX","emoji":"๐Ÿ‡ฆ๐Ÿ‡ฎ"},{"phoneCode":"1 268","code":"AG","name":"Antigua & Barbuda","pattern":"1268 XXX XXXX","emoji":"๐Ÿ‡ฆ๐Ÿ‡ฌ"},{"phoneCode":"54","code":"AR","name":"Argentina","pattern":"","emoji":"๐Ÿ‡ฆ๐Ÿ‡ท"},{"phoneCode":"374","code":"AM","name":"Armenia","pattern":"374 XX XXX XXX","emoji":"๐Ÿ‡ฆ๐Ÿ‡ฒ"},{"phoneCode":"297","code":"AW","name":"Aruba","pattern":"297 XXX XXXX","emoji":"๐Ÿ‡ฆ๐Ÿ‡ผ"},{"phoneCode":"247","code":"SH","name":"Ascension","pattern":"290 XX XXX","emoji":"๐Ÿ‡ธ๐Ÿ‡ญ"},{"phoneCode":"61","code":"AU","name":"Australia","pattern":"61 XXX XXX XXX","emoji":"๐Ÿ‡ฆ๐Ÿ‡บ"},{"phoneCode":"672","code":"AU","name":"Australian External Territories","pattern":"61 XXX XXX XXX","emoji":"๐Ÿ‡ฆ๐Ÿ‡บ"},{"phoneCode":"43","code":"AT","name":"Austria","pattern":"","emoji":"๐Ÿ‡ฆ๐Ÿ‡น"},{"phoneCode":"994","code":"AZ","name":"Azerbaijan","pattern":"994 XX XXX XX XX","emoji":"๐Ÿ‡ฆ๐Ÿ‡ฟ"},{"phoneCode":"1 242","code":"BS","name":"Bahamas","pattern":"1242 XXX XXXX","emoji":"๐Ÿ‡ง๐Ÿ‡ธ"},{"phoneCode":"973","code":"BH","name":"Bahrain","pattern":"973 XXXX XXXX","emoji":"๐Ÿ‡ง๐Ÿ‡ญ"},{"phoneCode":"880","code":"BD","name":"Bangladesh","pattern":"","emoji":"๐Ÿ‡ง๐Ÿ‡ฉ"},{"phoneCode":"1 246","code":"BB","name":"Barbados","pattern":"1246 XXX XXXX","emoji":"๐Ÿ‡ง๐Ÿ‡ง"},{"phoneCode":"1 268","code":"AG","name":"Barbuda","pattern":"1268 XXX XXXX","emoji":"๐Ÿ‡ฆ๐Ÿ‡ฌ"},{"phoneCode":"375","code":"BY","name":"Belarus","pattern":"375 XX XXX XXXX","emoji":"๐Ÿ‡ง๐Ÿ‡พ"},{"phoneCode":"32","code":"BE","name":"Belgium","pattern":"32 XXX XX XX XX","emoji":"๐Ÿ‡ง๐Ÿ‡ช"},{"phoneCode":"501","code":"BZ","name":"Belize","pattern":"","emoji":"๐Ÿ‡ง๐Ÿ‡ฟ"},{"phoneCode":"229","code":"BJ","name":"Benin","pattern":"229 XX XXX XXX","emoji":"๐Ÿ‡ง๐Ÿ‡ฏ"},{"phoneCode":"1 441","code":"BM","name":"Bermuda","pattern":"1441 XXX XXXX","emoji":"๐Ÿ‡ง๐Ÿ‡ฒ"},{"phoneCode":"975","code":"BT","name":"Bhutan","pattern":"","emoji":"๐Ÿ‡ง๐Ÿ‡น"},{"phoneCode":"591","code":"BO","name":"Bolivia","pattern":"591 X XXX XXXX","emoji":"๐Ÿ‡ง๐Ÿ‡ด"},{"phoneCode":"599 7","code":"BQ","name":"Caribbean Netherlands","pattern":"","emoji":"๐Ÿ‡ง๐Ÿ‡ถ"},{"phoneCode":"387","code":"BA","name":"Bosnia & Herzegovina","pattern":"","emoji":"๐Ÿ‡ง๐Ÿ‡ฆ"},{"phoneCode":"267","code":"BW","name":"Botswana","pattern":"267 XX XXX XXX","emoji":"๐Ÿ‡ง๐Ÿ‡ผ"},{"phoneCode":"55","code":"BR","name":"Brazil","pattern":"55 XX XXXXX XXXX","emoji":"๐Ÿ‡ง๐Ÿ‡ท"},{"phoneCode":"246","code":"IO","name":"British Indian Ocean Territory","pattern":"246 XXX XXXX","emoji":"๐Ÿ‡ฎ๐Ÿ‡ด"},{"phoneCode":"1 284","code":"VG","name":"British Virgin Islands","pattern":"1284 XXX XXXX","emoji":"๐Ÿ‡ป๐Ÿ‡ฌ"},{"phoneCode":"673","code":"BN","name":"Brunei","pattern":"673 XXX XXXX","emoji":"๐Ÿ‡ง๐Ÿ‡ณ"},{"phoneCode":"359","code":"BG","name":"Bulgaria","pattern":"","emoji":"๐Ÿ‡ง๐Ÿ‡ฌ"},{"phoneCode":"226","code":"BF","name":"Burkina Faso","pattern":"226 XX XX XX XX","emoji":"๐Ÿ‡ง๐Ÿ‡ซ"},{"phoneCode":"95","code":"MM","name":"Myanmar (Burma)","pattern":"","emoji":"๐Ÿ‡ฒ๐Ÿ‡ฒ"},{"phoneCode":"257","code":"BI","name":"Burundi","pattern":"257 XX XX XXXX","emoji":"๐Ÿ‡ง๐Ÿ‡ฎ"},{"phoneCode":"855","code":"KH","name":"Cambodia","pattern":"","emoji":"๐Ÿ‡ฐ๐Ÿ‡ญ"},{"phoneCode":"237","code":"CM","name":"Cameroon","pattern":"237 XXXX XXXX","emoji":"๐Ÿ‡จ๐Ÿ‡ฒ"},{"phoneCode":"1","code":"CA","name":"Canada","pattern":"1 XXX XXX XXXX","emoji":"๐Ÿ‡จ๐Ÿ‡ฆ"},{"phoneCode":"238","code":"CV","name":"Cape Verde","pattern":"238 XXX XXXX","emoji":"๐Ÿ‡จ๐Ÿ‡ป"},{"phoneCode":"1 345","code":"KY","name":"Cayman Islands","pattern":"1345 XXX XXXX","emoji":"๐Ÿ‡ฐ๐Ÿ‡พ"},{"phoneCode":"236","code":"CF","name":"Central African Republic","pattern":"236 XX XX XX XX","emoji":"๐Ÿ‡จ๐Ÿ‡ซ"},{"phoneCode":"235","code":"TD","name":"Chad","pattern":"235 XX XX XX XX","emoji":"๐Ÿ‡น๐Ÿ‡ฉ"},{"phoneCode":"56","code":"CL","name":"Chile","pattern":"56 X XXXX XXXX","emoji":"๐Ÿ‡จ๐Ÿ‡ฑ"},{"phoneCode":"86","code":"CN","name":"China","pattern":"86 XXX XXXX XXXX","emoji":"๐Ÿ‡จ๐Ÿ‡ณ"},{"phoneCode":"61","code":"CX","name":"Christmas Island","pattern":"","emoji":"๐Ÿ‡จ๐Ÿ‡ฝ"},{"phoneCode":"61","code":"CC","name":"Cocos (Keeling) Islands","pattern":"","emoji":"๐Ÿ‡จ๐Ÿ‡จ"},{"phoneCode":"57","code":"CO","name":"Colombia","pattern":"57 XXX XXX XXXX","emoji":"๐Ÿ‡จ๐Ÿ‡ด"},{"phoneCode":"269","code":"KM","name":"Comoros","pattern":"269 XXX XXXX","emoji":"๐Ÿ‡ฐ๐Ÿ‡ฒ"},{"phoneCode":"242","code":"CG","name":"Congo - Brazzaville","pattern":"242 XX XXX XXXX","emoji":"๐Ÿ‡จ๐Ÿ‡ฌ"},{"phoneCode":"243","code":"CD","name":"Congo - Kinshasa","pattern":"243 XX XXX XXXX","emoji":"๐Ÿ‡จ๐Ÿ‡ฉ"},{"phoneCode":"682","code":"CK","name":"Cook Islands","pattern":"","emoji":"๐Ÿ‡จ๐Ÿ‡ฐ"},{"phoneCode":"506","code":"CR","name":"Costa Rica","pattern":"","emoji":"๐Ÿ‡จ๐Ÿ‡ท"},{"phoneCode":"225","code":"CI","name":"Cote dโ€™Ivoire","pattern":"225 XX XXX XXX","emoji":"๐Ÿ‡จ๐Ÿ‡ฎ"},{"phoneCode":"385","code":"HR","name":"Croatia","pattern":"","emoji":"๐Ÿ‡ญ๐Ÿ‡ท"},{"phoneCode":"53","code":"CU","name":"Cuba","pattern":"53 XXXX XXXX","emoji":"๐Ÿ‡จ๐Ÿ‡บ"},{"phoneCode":"599 9","code":"CW","name":"Curacao","pattern":"","emoji":"๐Ÿ‡จ๐Ÿ‡ผ"},{"phoneCode":"357","code":"CY","name":"Cyprus","pattern":"357 XXXX XXXX","emoji":"๐Ÿ‡จ๐Ÿ‡พ"},{"phoneCode":"420","code":"CZ","name":"Czech Republic","pattern":"","emoji":"๐Ÿ‡จ๐Ÿ‡ฟ"},{"phoneCode":"45","code":"DK","name":"Denmark","pattern":"45 XXXX XXXX","emoji":"๐Ÿ‡ฉ๐Ÿ‡ฐ"},{"phoneCode":"246","code":"DG","name":"Diego Garcia","pattern":"","emoji":"๐Ÿ‡ฉ๐Ÿ‡ฌ"},{"phoneCode":"253","code":"DJ","name":"Djibouti","pattern":"253 XX XX XX XX","emoji":"๐Ÿ‡ฉ๐Ÿ‡ฏ"},{"phoneCode":"1 767","code":"DM","name":"Dominica","pattern":"1767 XXX XXXX","emoji":"๐Ÿ‡ฉ๐Ÿ‡ฒ"},{"phoneCode":"1 809 and 1 829","code":"DO","name":"Dominican Republic","pattern":"1 XXX XXX XXXX","emoji":"๐Ÿ‡ฉ๐Ÿ‡ด"},{"phoneCode":"670","code":"TL","name":"Timor-Leste","pattern":"","emoji":"๐Ÿ‡น๐Ÿ‡ฑ"},{"phoneCode":"593","code":"EC","name":"Ecuador","pattern":"","emoji":"๐Ÿ‡ช๐Ÿ‡จ"},{"phoneCode":"20","code":"EG","name":"Egypt","pattern":"20 XX XXX XXXX","emoji":"๐Ÿ‡ช๐Ÿ‡ฌ"},{"phoneCode":"503","code":"SV","name":"El Salvador","pattern":"503 XXXX XXXX","emoji":"๐Ÿ‡ธ๐Ÿ‡ป"},{"phoneCode":"240","code":"GQ","name":"Equatorial Guinea","pattern":"240 XXX XXX XXX","emoji":"๐Ÿ‡ฌ๐Ÿ‡ถ"},{"phoneCode":"291","code":"ER","name":"Eritrea","pattern":"291 X XXX XXX","emoji":"๐Ÿ‡ช๐Ÿ‡ท"},{"phoneCode":"372","code":"EE","name":"Estonia","pattern":"","emoji":"๐Ÿ‡ช๐Ÿ‡ช"},{"phoneCode":"251","code":"ET","name":"Ethiopia","pattern":"251 XX XXX XXXX","emoji":"๐Ÿ‡ช๐Ÿ‡น"},{"phoneCode":"500","code":"FK","name":"Falkland Islands","pattern":"","emoji":"๐Ÿ‡ซ๐Ÿ‡ฐ"},{"phoneCode":"298","code":"FO","name":"Faroe Islands","pattern":"298 XXX XXX","emoji":"๐Ÿ‡ซ๐Ÿ‡ด"},{"phoneCode":"679","code":"FJ","name":"Fiji","pattern":"","emoji":"๐Ÿ‡ซ๐Ÿ‡ฏ"},{"phoneCode":"358","code":"FI","name":"Finland","pattern":"","emoji":"๐Ÿ‡ซ๐Ÿ‡ฎ"},{"phoneCode":"33","code":"FR","name":"France","pattern":"33 X XX XX XX XX","emoji":"๐Ÿ‡ซ๐Ÿ‡ท"},{"phoneCode":"594","code":"GF","name":"French Guiana","pattern":"","emoji":"๐Ÿ‡ฌ๐Ÿ‡ซ"},{"phoneCode":"689","code":"PF","name":"French Polynesia","pattern":"","emoji":"๐Ÿ‡ต๐Ÿ‡ซ"},{"phoneCode":"241","code":"GA","name":"Gabon","pattern":"241 X XX XX XX","emoji":"๐Ÿ‡ฌ๐Ÿ‡ฆ"},{"phoneCode":"220","code":"GM","name":"Gambia","pattern":"220 XXX XXXX","emoji":"๐Ÿ‡ฌ๐Ÿ‡ฒ"},{"phoneCode":"995","code":"GE","name":"Georgia","pattern":"","emoji":"๐Ÿ‡ฌ๐Ÿ‡ช"},{"phoneCode":"49","code":"DE","name":"Germany","pattern":"49 XXX XXXXXXXX","emoji":"๐Ÿ‡ฉ๐Ÿ‡ช"},{"phoneCode":"233","code":"GH","name":"Ghana","pattern":"","emoji":"๐Ÿ‡ฌ๐Ÿ‡ญ"},{"phoneCode":"350","code":"GI","name":"Gibraltar","pattern":"350 XXXX XXXX","emoji":"๐Ÿ‡ฌ๐Ÿ‡ฎ"},{"phoneCode":"30","code":"GR","name":"Greece","pattern":"30 XX XXXX XXXX","emoji":"๐Ÿ‡ฌ๐Ÿ‡ท"},{"phoneCode":"299","code":"GL","name":"Greenland","pattern":"299 XXX XXX","emoji":"๐Ÿ‡ฌ๐Ÿ‡ฑ"},{"phoneCode":"1 473","code":"GD","name":"Grenada","pattern":"1473 XXX XXXX","emoji":"๐Ÿ‡ฌ๐Ÿ‡ฉ"},{"phoneCode":"590","code":"GP","name":"Guadeloupe","pattern":"","emoji":"๐Ÿ‡ฌ๐Ÿ‡ต"},{"phoneCode":"1 671","code":"GU","name":"Guam","pattern":"1671 XXX XXXX","emoji":"๐Ÿ‡ฌ๐Ÿ‡บ"},{"phoneCode":"502","code":"GT","name":"Guatemala","pattern":"502 X XXX XXXX","emoji":"๐Ÿ‡ฌ๐Ÿ‡น"},{"phoneCode":"44","code":"GG","name":"Guernsey","pattern":"","emoji":"๐Ÿ‡ฌ๐Ÿ‡ฌ"},{"phoneCode":"224","code":"GN","name":"Guinea","pattern":"224 XXX XXX XXX","emoji":"๐Ÿ‡ฌ๐Ÿ‡ณ"},{"phoneCode":"245","code":"GW","name":"Guinea-Bissau","pattern":"245 XXX XXXX","emoji":"๐Ÿ‡ฌ๐Ÿ‡ผ"},{"phoneCode":"592","code":"GY","name":"Guyana","pattern":"","emoji":"๐Ÿ‡ฌ๐Ÿ‡พ"},{"phoneCode":"509","code":"HT","name":"Haiti","pattern":"","emoji":"๐Ÿ‡ญ๐Ÿ‡น"},{"phoneCode":"504","code":"HN","name":"Honduras","pattern":"504 XXXX XXXX","emoji":"๐Ÿ‡ญ๐Ÿ‡ณ"},{"phoneCode":"852","code":"HK","name":"Hong Kong SAR China","pattern":"","emoji":"๐Ÿ‡ญ๐Ÿ‡ฐ"},{"phoneCode":"36","code":"HU","name":"Hungary","pattern":"36 XX XXX XXXX","emoji":"๐Ÿ‡ญ๐Ÿ‡บ"},{"phoneCode":"354","code":"IS","name":"Iceland","pattern":"354 XXX XXXX","emoji":"๐Ÿ‡ฎ๐Ÿ‡ธ"},{"phoneCode":"91","code":"IN","name":"India","pattern":"91 XXXXX XXXXX","emoji":"๐Ÿ‡ฎ๐Ÿ‡ณ"},{"phoneCode":"62","code":"ID","name":"Indonesia","pattern":"","emoji":"๐Ÿ‡ฎ๐Ÿ‡ฉ"},{"phoneCode":"98","code":"IR","name":"Iran","pattern":"98 XXX XXX XXXX","emoji":"๐Ÿ‡ฎ๐Ÿ‡ท"},{"phoneCode":"964","code":"IQ","name":"Iraq","pattern":"964 XXX XXX XXXX","emoji":"๐Ÿ‡ฎ๐Ÿ‡ถ"},{"phoneCode":"353","code":"IE","name":"Ireland","pattern":"353 XX XXX XXXX","emoji":"๐Ÿ‡ฎ๐Ÿ‡ช"},{"phoneCode":"972","code":"IL","name":"Israel","pattern":"972 XX XXX XXXX","emoji":"๐Ÿ‡ฎ๐Ÿ‡ฑ"},{"phoneCode":"39","code":"IT","name":"Italy","pattern":"39 XXX XXX XXXX","emoji":"๐Ÿ‡ฎ๐Ÿ‡น"},{"phoneCode":"1 876","code":"JM","name":"Jamaica","pattern":"1876 XXX XXXX","emoji":"๐Ÿ‡ฏ๐Ÿ‡ฒ"},{"phoneCode":"47 79","code":"SJ","name":"Svalbard & Jan Mayen","pattern":"","emoji":"๐Ÿ‡ธ๐Ÿ‡ฏ"},{"phoneCode":"81","code":"JP","name":"Japan","pattern":"81 XX XXXX XXXX","emoji":"๐Ÿ‡ฏ๐Ÿ‡ต"},{"phoneCode":"44","code":"JE","name":"Jersey","pattern":"","emoji":"๐Ÿ‡ฏ๐Ÿ‡ช"},{"phoneCode":"962","code":"JO","name":"Jordan","pattern":"962 X XXXX XXXX","emoji":"๐Ÿ‡ฏ๐Ÿ‡ด"},{"phoneCode":"7 7","code":"KZ","name":"Kazakhstan","pattern":"7 XXX XXX XX XX","emoji":"๐Ÿ‡ฐ๐Ÿ‡ฟ"},{"phoneCode":"254","code":"KE","name":"Kenya","pattern":"254 XXX XXX XXX","emoji":"๐Ÿ‡ฐ๐Ÿ‡ช"},{"phoneCode":"686","code":"KI","name":"Kiribati","pattern":"","emoji":"๐Ÿ‡ฐ๐Ÿ‡ฎ"},{"phoneCode":"850","code":"KP","name":"North Korea","pattern":"","emoji":"๐Ÿ‡ฐ๐Ÿ‡ต"},{"phoneCode":"82","code":"KR","name":"South Korea","pattern":"","emoji":"๐Ÿ‡ฐ๐Ÿ‡ท"},{"phoneCode":"965","code":"KW","name":"Kuwait","pattern":"965 XXXX XXXX","emoji":"๐Ÿ‡ฐ๐Ÿ‡ผ"},{"phoneCode":"996","code":"KG","name":"Kyrgyzstan","pattern":"","emoji":"๐Ÿ‡ฐ๐Ÿ‡ฌ"},{"phoneCode":"856","code":"LA","name":"Laos","pattern":"","emoji":"๐Ÿ‡ฑ๐Ÿ‡ฆ"},{"phoneCode":"371","code":"LV","name":"Latvia","pattern":"371 XXX XXXXX","emoji":"๐Ÿ‡ฑ๐Ÿ‡ป"},{"phoneCode":"961","code":"LB","name":"Lebanon","pattern":"","emoji":"๐Ÿ‡ฑ๐Ÿ‡ง"},{"phoneCode":"266","code":"LS","name":"Lesotho","pattern":"266 XX XXX XXX","emoji":"๐Ÿ‡ฑ๐Ÿ‡ธ"},{"phoneCode":"231","code":"LR","name":"Liberia","pattern":"","emoji":"๐Ÿ‡ฑ๐Ÿ‡ท"},{"phoneCode":"218","code":"LY","name":"Libya","pattern":"218 XX XXX XXXX","emoji":"๐Ÿ‡ฑ๐Ÿ‡พ"},{"phoneCode":"423","code":"LI","name":"Liechtenstein","pattern":"","emoji":"๐Ÿ‡ฑ๐Ÿ‡ฎ"},{"phoneCode":"370","code":"LT","name":"Lithuania","pattern":"370 XXX XXXXX","emoji":"๐Ÿ‡ฑ๐Ÿ‡น"},{"phoneCode":"352","code":"LU","name":"Luxembourg","pattern":"","emoji":"๐Ÿ‡ฑ๐Ÿ‡บ"},{"phoneCode":"853","code":"MO","name":"Macau SAR China","pattern":"","emoji":"๐Ÿ‡ฒ๐Ÿ‡ด"},{"phoneCode":"389","code":"MK","name":"Macedonia","pattern":"","emoji":"๐Ÿ‡ฒ๐Ÿ‡ฐ"},{"phoneCode":"261","code":"MG","name":"Madagascar","pattern":"261 XX XX XXX XX","emoji":"๐Ÿ‡ฒ๐Ÿ‡ฌ"},{"phoneCode":"265","code":"MW","name":"Malawi","pattern":"","emoji":"๐Ÿ‡ฒ๐Ÿ‡ผ"},{"phoneCode":"60","code":"MY","name":"Malaysia","pattern":"","emoji":"๐Ÿ‡ฒ๐Ÿ‡พ"},{"phoneCode":"960","code":"MV","name":"Maldives","pattern":"","emoji":"๐Ÿ‡ฒ๐Ÿ‡ป"},{"phoneCode":"223","code":"ML","name":"Mali","pattern":"223 XXXX XXXX","emoji":"๐Ÿ‡ฒ๐Ÿ‡ฑ"},{"phoneCode":"356","code":"MT","name":"Malta","pattern":"356 XX XX XX XX","emoji":"๐Ÿ‡ฒ๐Ÿ‡น"},{"phoneCode":"692","code":"MH","name":"Marshall Islands","pattern":"","emoji":"๐Ÿ‡ฒ๐Ÿ‡ญ"},{"phoneCode":"596","code":"MQ","name":"Martinique","pattern":"","emoji":"๐Ÿ‡ฒ๐Ÿ‡ถ"},{"phoneCode":"222","code":"MR","name":"Mauritania","pattern":"222 XXXX XXXX","emoji":"๐Ÿ‡ฒ๐Ÿ‡ท"},{"phoneCode":"230","code":"MU","name":"Mauritius","pattern":"","emoji":"๐Ÿ‡ฒ๐Ÿ‡บ"},{"phoneCode":"262","code":"YT","name":"Mayotte","pattern":"","emoji":"๐Ÿ‡พ๐Ÿ‡น"},{"phoneCode":"52","code":"MX","name":"Mexico","pattern":"","emoji":"๐Ÿ‡ฒ๐Ÿ‡ฝ"},{"phoneCode":"691","code":"FM","name":"Micronesia","pattern":"","emoji":"๐Ÿ‡ซ๐Ÿ‡ฒ"},{"phoneCode":"373","code":"MD","name":"Moldova","pattern":"373 XX XXX XXX","emoji":"๐Ÿ‡ฒ๐Ÿ‡ฉ"},{"phoneCode":"377","code":"MC","name":"Monaco","pattern":"377 XXXX XXXX","emoji":"๐Ÿ‡ฒ๐Ÿ‡จ"},{"phoneCode":"976","code":"MN","name":"Mongolia","pattern":"","emoji":"๐Ÿ‡ฒ๐Ÿ‡ณ"},{"phoneCode":"382","code":"ME","name":"Montenegro","pattern":"","emoji":"๐Ÿ‡ฒ๐Ÿ‡ช"},{"phoneCode":"1 664","code":"MS","name":"Montserrat","pattern":"1664 XXX XXXX","emoji":"๐Ÿ‡ฒ๐Ÿ‡ธ"},{"phoneCode":"212","code":"MA","name":"Morocco","pattern":"212 XX XXX XXXX","emoji":"๐Ÿ‡ฒ๐Ÿ‡ฆ"},{"phoneCode":"258","code":"MZ","name":"Mozambique","pattern":"258 XX XXX XXXX","emoji":"๐Ÿ‡ฒ๐Ÿ‡ฟ"},{"phoneCode":"264","code":"NA","name":"Namibia","pattern":"264 XX XXX XXXX","emoji":"๐Ÿ‡ณ๐Ÿ‡ฆ"},{"phoneCode":"674","code":"NR","name":"Nauru","pattern":"","emoji":"๐Ÿ‡ณ๐Ÿ‡ท"},{"phoneCode":"977","code":"NP","name":"Nepal","pattern":"","emoji":"๐Ÿ‡ณ๐Ÿ‡ต"},{"phoneCode":"31","code":"NL","name":"Netherlands","pattern":"31 X XX XX XX XX","emoji":"๐Ÿ‡ณ๐Ÿ‡ฑ"},{"phoneCode":"687","code":"NC","name":"New Caledonia","pattern":"","emoji":"๐Ÿ‡ณ๐Ÿ‡จ"},{"phoneCode":"64","code":"NZ","name":"New Zealand","pattern":"","emoji":"๐Ÿ‡ณ๐Ÿ‡ฟ"},{"phoneCode":"505","code":"NI","name":"Nicaragua","pattern":"505 XXXX XXXX","emoji":"๐Ÿ‡ณ๐Ÿ‡ฎ"},{"phoneCode":"227","code":"NE","name":"Niger","pattern":"227 XX XX XX XX","emoji":"๐Ÿ‡ณ๐Ÿ‡ช"},{"phoneCode":"234","code":"NG","name":"Nigeria","pattern":"","emoji":"๐Ÿ‡ณ๐Ÿ‡ฌ"},{"phoneCode":"683","code":"NU","name":"Niue","pattern":"","emoji":"๐Ÿ‡ณ๐Ÿ‡บ"},{"phoneCode":"672","code":"NF","name":"Norfolk Island","pattern":"","emoji":"๐Ÿ‡ณ๐Ÿ‡ซ"},{"phoneCode":"1 670","code":"MP","name":"Northern Mariana Islands","pattern":"1670 XXX XXXX","emoji":"๐Ÿ‡ฒ๐Ÿ‡ต"},{"phoneCode":"47","code":"NO","name":"Norway","pattern":"47 XXXX XXXX","emoji":"๐Ÿ‡ณ๐Ÿ‡ด"},{"phoneCode":"968","code":"OM","name":"Oman","pattern":"968 XXXX XXXX","emoji":"๐Ÿ‡ด๐Ÿ‡ฒ"},{"phoneCode":"92","code":"PK","name":"Pakistan","pattern":"92 XXX XXX XXXX","emoji":"๐Ÿ‡ต๐Ÿ‡ฐ"},{"phoneCode":"680","code":"PW","name":"Palau","pattern":"","emoji":"๐Ÿ‡ต๐Ÿ‡ผ"},{"phoneCode":"970","code":"PS","name":"Palestinian Territories","pattern":"970 XXX XX XXXX","emoji":"๐Ÿ‡ต๐Ÿ‡ธ"},{"phoneCode":"507","code":"PA","name":"Panama","pattern":"507 XXXX XXXX","emoji":"๐Ÿ‡ต๐Ÿ‡ฆ"},{"phoneCode":"675","code":"PG","name":"Papua New Guinea","pattern":"","emoji":"๐Ÿ‡ต๐Ÿ‡ฌ"},{"phoneCode":"595","code":"PY","name":"Paraguay","pattern":"595 XXX XXX XXX","emoji":"๐Ÿ‡ต๐Ÿ‡พ"},{"phoneCode":"51","code":"PE","name":"Peru","pattern":"51 XXX XXX XXX","emoji":"๐Ÿ‡ต๐Ÿ‡ช"},{"phoneCode":"63","code":"PH","name":"Philippines","pattern":"63 XXX XXX XXXX","emoji":"๐Ÿ‡ต๐Ÿ‡ญ"},{"phoneCode":"64","code":"PN","name":"Pitcairn Islands","pattern":"","emoji":"๐Ÿ‡ต๐Ÿ‡ณ"},{"phoneCode":"48","code":"PL","name":"Poland","pattern":"48 XXX XXX XXX","emoji":"๐Ÿ‡ต๐Ÿ‡ฑ"},{"phoneCode":"351","code":"PT","name":"Portugal","pattern":"351 X XXXX XXXX","emoji":"๐Ÿ‡ต๐Ÿ‡น"},{"phoneCode":"1 787 and 1 939","code":"PR","name":"Puerto Rico","pattern":"1 XXX XXX XXXX","emoji":"๐Ÿ‡ต๐Ÿ‡ท"},{"phoneCode":"974","code":"QA","name":"Qatar","pattern":"","emoji":"๐Ÿ‡ถ๐Ÿ‡ฆ"},{"phoneCode":"262","code":"RE","name":"Reunion","pattern":"262 XXX XXX XXX","emoji":"๐Ÿ‡ท๐Ÿ‡ช"},{"phoneCode":"40","code":"RO","name":"Romania","pattern":"40 XXX XXX XXX","emoji":"๐Ÿ‡ท๐Ÿ‡ด"},{"phoneCode":"7","code":"RU","name":"Russia","pattern":"7 XXX XXX XX XX","emoji":"๐Ÿ‡ท๐Ÿ‡บ"},{"phoneCode":"250","code":"RW","name":"Rwanda","pattern":"250 XXX XXX XXX","emoji":"๐Ÿ‡ท๐Ÿ‡ผ"},{"phoneCode":"590","code":"BL","name":"St. Barthelemy","pattern":"","emoji":"๐Ÿ‡ง๐Ÿ‡ฑ"},{"phoneCode":"290","code":"SH","name":"St. Helena","pattern":"290 XX XXX","emoji":"๐Ÿ‡ธ๐Ÿ‡ญ"},{"phoneCode":"1 869","code":"KN","name":"St. Kitts & Nevis","pattern":"1869 XXX XXXX","emoji":"๐Ÿ‡ฐ๐Ÿ‡ณ"},{"phoneCode":"1 758","code":"LC","name":"St. Lucia","pattern":"1758 XXX XXXX","emoji":"๐Ÿ‡ฑ๐Ÿ‡จ"},{"phoneCode":"590","code":"MF","name":"St. Martin (France)","pattern":"","emoji":"๐Ÿ‡ฒ๐Ÿ‡ซ"},{"phoneCode":"508","code":"PM","name":"St. Pierre and Miquelon","pattern":"","emoji":"๐Ÿ‡ต๐Ÿ‡ฒ"},{"phoneCode":"1 784","code":"VC","name":"St. Vincent and the Grenadines","pattern":"1784 XXX XXXX","emoji":"๐Ÿ‡ป๐Ÿ‡จ"},{"phoneCode":"685","code":"WS","name":"Samoa","pattern":"","emoji":"๐Ÿ‡ผ๐Ÿ‡ธ"},{"phoneCode":"378","code":"SM","name":"San Marino","pattern":"378 XXX XXX XXXX","emoji":"๐Ÿ‡ธ๐Ÿ‡ฒ"},{"phoneCode":"239","code":"ST","name":"Sรฃo Tome & Principe","pattern":"239 XX XXXXX","emoji":"๐Ÿ‡ธ๐Ÿ‡น"},{"phoneCode":"966","code":"SA","name":"Saudi Arabia","pattern":"","emoji":"๐Ÿ‡ธ๐Ÿ‡ฆ"},{"phoneCode":"221","code":"SN","name":"Senegal","pattern":"221 XX XXX XXXX","emoji":"๐Ÿ‡ธ๐Ÿ‡ณ"},{"phoneCode":"381","code":"RS","name":"Serbia","pattern":"381 XX XXX XXXX","emoji":"๐Ÿ‡ท๐Ÿ‡ธ"},{"phoneCode":"248","code":"SC","name":"Seychelles","pattern":"248 X XX XX XX","emoji":"๐Ÿ‡ธ๐Ÿ‡จ"},{"phoneCode":"232","code":"SL","name":"Sierra Leone","pattern":"232 XX XXX XXX","emoji":"๐Ÿ‡ธ๐Ÿ‡ฑ"},{"phoneCode":"65","code":"SG","name":"Singapore","pattern":"65 XXXX XXXX","emoji":"๐Ÿ‡ธ๐Ÿ‡ฌ"},{"phoneCode":"599 3","code":"BQ","name":"Sint Eustatius","pattern":"","emoji":"๐Ÿ‡ง๐Ÿ‡ถ"},{"phoneCode":"1 721","code":"SX","name":"Sint Maarten","pattern":"1721 XXX XXXX","emoji":"๐Ÿ‡ธ๐Ÿ‡ฝ"},{"phoneCode":"421","code":"SK","name":"Slovakia","pattern":"","emoji":"๐Ÿ‡ธ๐Ÿ‡ฐ"},{"phoneCode":"386","code":"SI","name":"Slovenia","pattern":"","emoji":"๐Ÿ‡ธ๐Ÿ‡ฎ"},{"phoneCode":"677","code":"SB","name":"Solomon Islands","pattern":"","emoji":"๐Ÿ‡ธ๐Ÿ‡ง"},{"phoneCode":"252","code":"SO","name":"Somalia","pattern":"252 XX XXX XXX","emoji":"๐Ÿ‡ธ๐Ÿ‡ด"},{"phoneCode":"27","code":"ZA","name":"South Africa","pattern":"27 XX XXX XXXX","emoji":"๐Ÿ‡ฟ๐Ÿ‡ฆ"},{"phoneCode":"500","code":"GS","name":"South Georgia & South Sandwich Islands","pattern":"","emoji":"๐Ÿ‡ฌ๐Ÿ‡ธ"},{"phoneCode":"995 34","code":"","name":"South Ossetia","pattern":"","emoji":""},{"phoneCode":"211","code":"SS","name":"South Sudan","pattern":"211 XX XXX XXXX","emoji":"๐Ÿ‡ธ๐Ÿ‡ธ"},{"phoneCode":"34","code":"ES","name":"Spain","pattern":"34 XXX XXX XXX","emoji":"๐Ÿ‡ช๐Ÿ‡ธ"},{"phoneCode":"94","code":"LK","name":"Sri Lanka","pattern":"94 XX XXX XXXX","emoji":"๐Ÿ‡ฑ๐Ÿ‡ฐ"},{"phoneCode":"249","code":"SD","name":"Sudan","pattern":"249 XX XXX XXXX","emoji":"๐Ÿ‡ธ๐Ÿ‡ฉ"},{"phoneCode":"597","code":"SR","name":"Suriname","pattern":"597 XXX XXXX","emoji":"๐Ÿ‡ธ๐Ÿ‡ท"},{"phoneCode":"47 79","code":"SJ","name":"Svalbard","pattern":"","emoji":"๐Ÿ‡ธ๐Ÿ‡ฏ"},{"phoneCode":"268","code":"SZ","name":"Swaziland","pattern":"268 XXXX XXXX","emoji":"๐Ÿ‡ธ๐Ÿ‡ฟ"},{"phoneCode":"46","code":"SE","name":"Sweden","pattern":"46 XX XXX XXXX","emoji":"๐Ÿ‡ธ๐Ÿ‡ช"},{"phoneCode":"41","code":"CH","name":"Switzerland","pattern":"41 XX XXX XXXX","emoji":"๐Ÿ‡จ๐Ÿ‡ญ"},{"phoneCode":"963","code":"SY","name":"Syria","pattern":"","emoji":"๐Ÿ‡ธ๐Ÿ‡พ"},{"phoneCode":"886","code":"TW","name":"Taiwan","pattern":"","emoji":"๐Ÿ‡น๐Ÿ‡ผ"},{"phoneCode":"992","code":"TJ","name":"Tajikistan","pattern":"","emoji":"๐Ÿ‡น๐Ÿ‡ฏ"},{"phoneCode":"255","code":"TZ","name":"Tanzania","pattern":"255 XX XXX XXXX","emoji":"๐Ÿ‡น๐Ÿ‡ฟ"},{"phoneCode":"66","code":"TH","name":"Thailand","pattern":"66 X XXXX XXXX","emoji":"๐Ÿ‡น๐Ÿ‡ญ"},{"phoneCode":"228","code":"TG","name":"Togo","pattern":"228 XX XXX XXX","emoji":"๐Ÿ‡น๐Ÿ‡ฌ"},{"phoneCode":"690","code":"TK","name":"Tokelau","pattern":"","emoji":"๐Ÿ‡น๐Ÿ‡ฐ"},{"phoneCode":"676","code":"TO","name":"Tonga","pattern":"","emoji":"๐Ÿ‡น๐Ÿ‡ด"},{"phoneCode":"1 868","code":"TT","name":"Trinidad & Tobago","pattern":"1868 XXX XXXX","emoji":"๐Ÿ‡น๐Ÿ‡น"},{"phoneCode":"216","code":"TN","name":"Tunisia","pattern":"216 XX XXX XXX","emoji":"๐Ÿ‡น๐Ÿ‡ณ"},{"phoneCode":"90","code":"TR","name":"Turkey","pattern":"90 XXX XXX XXXX","emoji":"๐Ÿ‡น๐Ÿ‡ท"},{"phoneCode":"993","code":"TM","name":"Turkmenistan","pattern":"993 XX XXXXXX","emoji":"๐Ÿ‡น๐Ÿ‡ฒ"},{"phoneCode":"1 649","code":"TC","name":"Turks & Caicos Islands","pattern":"1649 XXX XXXX","emoji":"๐Ÿ‡น๐Ÿ‡จ"},{"phoneCode":"688","code":"TV","name":"Tuvalu","pattern":"","emoji":"๐Ÿ‡น๐Ÿ‡ป"},{"phoneCode":"256","code":"UG","name":"Uganda","pattern":"256 XX XXX XXXX","emoji":"๐Ÿ‡บ๐Ÿ‡ฌ"},{"phoneCode":"380","code":"UA","name":"Ukraine","pattern":"380 XX XXX XX XX","emoji":"๐Ÿ‡บ๐Ÿ‡ฆ"},{"phoneCode":"971","code":"AE","name":"United Arab Emirates","pattern":"971 XX XXX XXXX","emoji":"๐Ÿ‡ฆ๐Ÿ‡ช"},{"phoneCode":"44","code":"GB","name":"United Kingdom","pattern":"44 XXXX XXXXXX","emoji":"๐Ÿ‡ฌ๐Ÿ‡ง"},{"phoneCode":"1","code":"US","name":"United States","pattern":"1 XXX XXX XXXX","emoji":"๐Ÿ‡บ๐Ÿ‡ธ"},{"phoneCode":"598","code":"UY","name":"Uruguay","pattern":"598 XXXX XXXX","emoji":"๐Ÿ‡บ๐Ÿ‡พ"},{"phoneCode":"1 340","code":"VI","name":"U.S. Virgin Islands","pattern":"1340 XXX XXXX","emoji":"๐Ÿ‡ป๐Ÿ‡ฎ"},{"phoneCode":"998","code":"UZ","name":"Uzbekistan","pattern":"998 XX XXXXXXX","emoji":"๐Ÿ‡บ๐Ÿ‡ฟ"},{"phoneCode":"678","code":"VU","name":"Vanuatu","pattern":"","emoji":"๐Ÿ‡ป๐Ÿ‡บ"},{"phoneCode":"58","code":"VE","name":"Venezuela","pattern":"58 XXX XXX XXXX","emoji":"๐Ÿ‡ป๐Ÿ‡ช"},{"phoneCode":"39 06 698","code":"VA","name":"Vatican City","pattern":"","emoji":"๐Ÿ‡ป๐Ÿ‡ฆ"},{"phoneCode":"84","code":"VN","name":"Vietnam","pattern":"","emoji":"๐Ÿ‡ป๐Ÿ‡ณ"},{"phoneCode":"681","code":"WF","name":"Wallis & Futuna","pattern":"","emoji":"๐Ÿ‡ผ๐Ÿ‡ซ"},{"phoneCode":"967","code":"YE","name":"Yemen","pattern":"967 XXX XXX XXX","emoji":"๐Ÿ‡พ๐Ÿ‡ช"},{"phoneCode":"260","code":"ZM","name":"Zambia","pattern":"260 XX XXX XXXX","emoji":"๐Ÿ‡ฟ๐Ÿ‡ฒ"},{"phoneCode":"255","code":"","name":"Zanzibar","pattern":"","emoji":""},{"phoneCode":"263","code":"ZW","name":"Zimbabwe","pattern":"263 XX XXX XXXX","emoji":"๐Ÿ‡ฟ๐Ÿ‡ผ"}]; const PhoneCodesMain: {[phoneCode: string]: Country} = { '1': Countries.find(c => c.name === 'United States'), '44': Countries.find(c => c.name === 'United Kingdom'), diff --git a/src/helpers/object.ts b/src/helpers/object.ts index d1f7b38f..77661a5d 100644 --- a/src/helpers/object.ts +++ b/src/helpers/object.ts @@ -72,7 +72,7 @@ export function safeReplaceObject(wasObject: any, newObject: any) { } for(var key in wasObject) { - if(!newObject.hasOwnProperty(key) && key.charAt(0) !== '$') { + if(!newObject.hasOwnProperty(key)) { delete wasObject[key]; } } diff --git a/src/helpers/schedulers.ts b/src/helpers/schedulers.ts index 20accbec..9a0d0e83 100644 --- a/src/helpers/schedulers.ts +++ b/src/helpers/schedulers.ts @@ -50,16 +50,16 @@ export function throttle( isPending = true; args = _args; - if (!interval) { - if (shouldRunFirst) { + if(!interval) { + if(shouldRunFirst) { isPending = false; // @ts-ignore fn(...args); } - interval = window.setInterval(() => { + interval = setInterval(() => { if (!isPending) { - window.clearInterval(interval!); + clearInterval(interval!); interval = null; return; } @@ -67,7 +67,7 @@ export function throttle( isPending = false; // @ts-ignore fn(...args); - }, ms); + }, ms) as any; } }; } diff --git a/src/lib/appManagers/appChatsManager.ts b/src/lib/appManagers/appChatsManager.ts index 52944a5b..aea3d627 100644 --- a/src/lib/appManagers/appChatsManager.ts +++ b/src/lib/appManagers/appChatsManager.ts @@ -18,6 +18,7 @@ import apiManagerProxy from "../mtproto/mtprotoworker"; import apiManager from '../mtproto/mtprotoworker'; import { RichTextProcessor } from "../richtextprocessor"; import rootScope from "../rootScope"; +//import AppStorage from "../storage"; import apiUpdatesManager from "./apiUpdatesManager"; import appMessagesManager from "./appMessagesManager"; import appPeersManager from "./appPeersManager"; @@ -32,14 +33,18 @@ export type ChatRights = keyof ChatBannedRights['pFlags'] | keyof ChatAdminRight export type UserTyping = Partial<{userId: number, action: SendMessageAction, timeout: number}>; export class AppChatsManager { - public chats: {[id: number]: Chat.channel | Chat.chat | any} = {}; - //public usernames: any = {}; - //public channelAccess: any = {}; - //public megagroups: {[id: number]: true} = {}; + /* private storage = new AppStorage>({ + storeName: 'chats' + }); */ + + private chats: {[id: number]: Chat.channel | Chat.chat | any} = {}; + //private usernames: any = {}; + //private channelAccess: any = {}; + //private megagroups: {[id: number]: true} = {}; - public megagroupOnlines: {[id: number]: {timestamp: number, onlines: number}} = {}; + private megagroupOnlines: {[id: number]: {timestamp: number, onlines: number}} = {}; - public typingsInPeer: {[peerId: number]: UserTyping[]} = {}; + private typingsInPeer: {[peerId: number]: UserTyping[]} = {}; constructor() { rootScope.addMultipleEventsListeners({ @@ -57,9 +62,9 @@ export class AppChatsManager { updateChatDefaultBannedRights: (update) => { const chatId = -appPeersManager.getPeerId(update.peer); - const chat: Chat = this.getChat(chatId); - if(chat._ !== 'chatEmpty') { - (chat as Chat.chat).default_banned_rights = update.default_banned_rights; + const chat: Chat.chat = this.chats[chatId]; + if(chat) { + chat.default_banned_rights = update.default_banned_rights; rootScope.broadcast('chat_update', chatId); } }, @@ -142,31 +147,40 @@ export class AppChatsManager { } }; - public saveApiChats(apiChats: any[]) { - apiChats.forEach(chat => this.saveApiChat(chat)); + public getPeerTypings(peerId: number) { + return this.typingsInPeer[peerId]; + } + + public saveApiChats(apiChats: any[], override?: boolean) { + apiChats.forEach(chat => this.saveApiChat(chat, override)); } - public saveApiChat(chat: any) { + public saveApiChat(chat: any, override?: boolean) { + /* if(chat._ !== 'chat' && chat._ !== 'channel') { + return; + } */ + // * exclude from state // defineNotNumerableProperties(chat, ['rTitle', 'initials']); - - //chat.rTitle = chat.title || 'chat_title_deleted'; - chat.rTitle = RichTextProcessor.wrapRichText(chat.title, {noLinks: true, noLinebreaks: true}) || 'chat_title_deleted'; const oldChat = this.chats[chat.id]; - chat.initials = RichTextProcessor.getAbbreviation(chat.title); + /* if(oldChat && !override) { + return; + } */ if(chat.pFlags === undefined) { chat.pFlags = {}; } - if(chat.pFlags.min) { - if(oldChat !== undefined) { - return; - } + if(chat.pFlags.min && oldChat !== undefined) { + return; } + chat.initials = RichTextProcessor.getAbbreviation(chat.title); + + //console.log('im the weatherman', chat.id); + if(chat._ === 'channel' && chat.participants_count === undefined && oldChat !== undefined && @@ -204,6 +218,10 @@ export class AppChatsManager { if(changedTitle) { rootScope.broadcast('peer_title_edit', -chat.id); } + + /* this.storage.set({ + [chat.id]: chat + }); */ } public getChat(id: number) { @@ -335,10 +353,7 @@ export class AppChatsManager { public isChannel(id: number) { if(id < 0) id = -id; const chat = this.chats[id]; - if(chat && (chat._ === 'channel' || chat._ === 'channelForbidden')/* || this.channelAccess[id] */) { - return true; - } - return false; + return chat && (chat._ === 'channel' || chat._ === 'channelForbidden')/* || this.channelAccess[id] */; } public isMegagroup(id: number) { @@ -347,10 +362,7 @@ export class AppChatsManager { } */ const chat = this.chats[id]; - if(chat && chat._ === 'channel' && chat.pFlags.megagroup) { - return true; - } - return false; + return chat && chat._ === 'channel' && chat.pFlags.megagroup; } public isBroadcast(id: number) { @@ -430,7 +442,7 @@ export class AppChatsManager { return i18n(key, [numberThousandSplitter(count)]); } - public wrapForFull(id: number, fullChat: any) { + /* public wrapForFull(id: number, fullChat: any) { const chatFull = copy(fullChat); const chat = this.getChat(id); @@ -480,7 +492,7 @@ export class AppChatsManager { } return participants; - } + } */ public createChannel(title: string, about: string): Promise { return apiManager.invokeApi('channels.createChannel', { diff --git a/src/lib/appManagers/appImManager.ts b/src/lib/appManagers/appImManager.ts index 3db26806..0d2f7690 100644 --- a/src/lib/appManagers/appImManager.ts +++ b/src/lib/appManagers/appImManager.ts @@ -908,7 +908,7 @@ export class AppImManager { public getPeerTyping(peerId: number, container?: HTMLElement) { if(!appUsersManager.isBot(peerId)) { - const typings = appChatsManager.typingsInPeer[peerId]; + const typings = appChatsManager.getPeerTypings(peerId); if(!typings || !typings.length) { return; } diff --git a/src/lib/appManagers/appMessagesManager.ts b/src/lib/appManagers/appMessagesManager.ts index da00dd94..f6babe46 100644 --- a/src/lib/appManagers/appMessagesManager.ts +++ b/src/lib/appManagers/appMessagesManager.ts @@ -2331,7 +2331,8 @@ export class AppMessagesManager { public saveMessages(messages: any[], options: Partial<{ storage: MessagesStorage, isScheduled: true, - isOutgoing: true + isOutgoing: true, + //isNew: boolean, // * new - from update }> = {}) { //let groups: Set; messages.forEach((message) => { @@ -2503,6 +2504,12 @@ export class AppMessagesManager { break; case 'messageActionChatEditTitle': + /* if(options.isNew) { + const chat = appChatsManager.getChat(-peerId); + chat.title = message.action.title; + appChatsManager.saveApiChat(chat, true); + } */ + if(isBroadcast) { message.action._ = 'messageActionChannelEditTitle'; } diff --git a/src/lib/appManagers/appProfileManager.ts b/src/lib/appManagers/appProfileManager.ts index 46ec7473..e2568198 100644 --- a/src/lib/appManagers/appProfileManager.ts +++ b/src/lib/appManagers/appProfileManager.ts @@ -154,21 +154,10 @@ export class AppProfileManager { id: appUsersManager.getUserInput(id) }).then((userFull) => { const user = userFull.user as User; - /* if(override && isObject(override) && override.phone_number) { - user.phone = override.phone_number; - if(override.first_name || override.last_name) { - user.first_name = override.first_name; - user.last_name = override.last_name; - } - - appUsersManager.saveApiUser(user); - } else { */ - appUsersManager.saveApiUser(user, true); - //} + appUsersManager.saveApiUser(user, true); if(userFull.profile_photo) { userFull.profile_photo = appPhotosManager.savePhoto(userFull.profile_photo, {type: 'profilePhoto', peerId: id}); - /* appPhotosManager.savePhoto(userFull.profile_photo, {user_id: id}); */ } if(userFull.about !== undefined) { @@ -253,7 +242,7 @@ export class AppProfileManager { return this.fullPromises[peerId] = apiManager.invokeApi('messages.getFullChat', { chat_id: id }).then((result) => { - appChatsManager.saveApiChats(result.chats); + appChatsManager.saveApiChats(result.chats, true); appUsersManager.saveApiUsers(result.users); const fullChat = result.full_chat as ChatFull.chatFull; if(fullChat && fullChat.chat_photo && fullChat.chat_photo.id) { @@ -362,7 +351,7 @@ export class AppProfileManager { return this.fullPromises[peerId] = apiManager.invokeApi('channels.getFullChannel', { channel: appChatsManager.getChannelInput(id) }).then((result) => { - appChatsManager.saveApiChats(result.chats); + appChatsManager.saveApiChats(result.chats, true); appUsersManager.saveApiUsers(result.users); const fullChannel = result.full_chat as ChatFull.channelFull; if(fullChannel && fullChannel.chat_photo.id) { diff --git a/src/lib/appManagers/appUsersManager.ts b/src/lib/appManagers/appUsersManager.ts index 7dc71d5c..9c13d95e 100644 --- a/src/lib/appManagers/appUsersManager.ts +++ b/src/lib/appManagers/appUsersManager.ts @@ -47,6 +47,8 @@ export class AppUsersManager { private getTopPeersPromise: Promise; constructor() { + //this.users = this.storage.getCache(); + setInterval(this.updateUsersStatuses, 60000); rootScope.on('state_synchronized', this.updateUsersStatuses); @@ -67,7 +69,7 @@ export class AppUsersManager { } } - user.sortStatus = this.getUserStatusForSort(user.status); + //user.sortStatus = this.getUserStatusForSort(user.status); rootScope.broadcast('user_update', userId); } //////else console.warn('No user by id:', userId); }, @@ -99,7 +101,7 @@ export class AppUsersManager { first_name: update.first_name, last_name: update.last_name, username: update.username - })); + }), true); } } }); @@ -271,42 +273,28 @@ export class AppUsersManager { apiUsers.forEach((user) => this.saveApiUser(user)); } - public saveApiUser(_user: MTUser, noReplace?: boolean) { - if(_user._ === 'userEmpty') return; + public saveApiUser(user: MTUser, override?: boolean) { + if(user._ === 'userEmpty') return; + + const userId = user.id; + const oldUser = this.users[userId]; - const user = _user; - if(noReplace && isObject(this.users[user.id]) && this.users[user.id].first_name) { + if(oldUser && !override) { return; } - const userId = user.id; - if(user.pFlags === undefined) { user.pFlags = {}; } - if(user.pFlags.min) { - if(this.users[userId] !== undefined) { - return; - } + if(user.pFlags.min && oldUser !== undefined) { + return; } // * exclude from state // defineNotNumerableProperties(user, ['initials', 'num', 'rFirstName', 'rFullName', 'rPhone', 'sortName', 'sortStatus']); - if(user.phone) { - user.rPhone = '+' + formatPhoneNumber(user.phone).formatted; - } - const fullName = user.first_name + ' ' + (user.last_name || ''); - if(user.first_name) { - user.rFirstName = RichTextProcessor.wrapRichText(user.first_name, {noLinks: true, noLinebreaks: true}); - user.rFullName = user.last_name ? RichTextProcessor.wrapRichText(fullName, {noLinks: true, noLinebreaks: true}) : user.rFirstName; - } else { - user.rFirstName = RichTextProcessor.wrapRichText(user.last_name, {noLinks: true, noLinebreaks: true}) || user.rPhone || 'user_first_name_deleted'; - user.rFullName = RichTextProcessor.wrapRichText(user.last_name, {noLinks: true, noLinebreaks: true}) || user.rPhone || 'user_name_deleted'; - } - if(user.username) { const searchUsername = searchIndexManager.cleanUsername(user.username); this.usernames[searchUsername] = userId; @@ -318,22 +306,17 @@ export class AppUsersManager { if(user.status) { if((user.status as UserStatus.userStatusOnline).expires) { - (user.status as UserStatus.userStatusOnline).expires -= serverTimeManager.serverTimeOffset + (user.status as UserStatus.userStatusOnline).expires -= serverTimeManager.serverTimeOffset; } if((user.status as UserStatus.userStatusOffline).was_online) { - (user.status as UserStatus.userStatusOffline).was_online -= serverTimeManager.serverTimeOffset + (user.status as UserStatus.userStatusOffline).was_online -= serverTimeManager.serverTimeOffset; } } - if(user.pFlags.bot) { - user.sortStatus = -1; - } else { - user.sortStatus = this.getUserStatusForSort(user.status); - } + //user.sortStatus = user.pFlags.bot ? -1 : this.getUserStatusForSort(user.status); let changedTitle = false; - const oldUser = this.users[userId]; if(oldUser === undefined) { this.users[userId] = user; } else { @@ -347,11 +330,21 @@ export class AppUsersManager { rootScope.broadcast('user_update', userId); } + //console.log('we never give this up'); + + /* this.storage.set({ + [userId]: user + }); */ + if(changedTitle) { rootScope.broadcast('peer_title_edit', user.id); } } + public formatUserPhone(phone: string) { + return '+' + formatPhoneNumber(phone).formatted; + } + public getUserStatusForSort(status: User['status'] | number) { if(typeof(status) === 'number') { status = this.getUser(status).status; @@ -579,7 +572,7 @@ export class AppUsersManager { expires: timestamp + onlineTimeFor }; - user.sortStatus = this.getUserStatusForSort(user.status); + //user.sortStatus = this.getUserStatusForSort(user.status); rootScope.broadcast('user_update', id); } } @@ -781,7 +774,7 @@ export class AppUsersManager { }; user.status = status; - user.sortStatus = this.getUserStatusForSort(user.status); + //user.sortStatus = this.getUserStatusForSort(user.status); rootScope.broadcast('user_update', userId); } } diff --git a/src/lib/idb.ts b/src/lib/idb.ts index 2e5d4b61..3eb2c698 100644 --- a/src/lib/idb.ts +++ b/src/lib/idb.ts @@ -225,7 +225,7 @@ export default class IDBStorage { }); } - public save(entryName: string, value: any) { + public save(entryName: string | string[], value: any | any[]) { return this.openDatabase().then((db) => { //this.log('save:', entryName, value); @@ -240,44 +240,52 @@ export default class IDBStorage { } }; - try { - const transaction = db.transaction([this.storeName], 'readwrite'); - transaction.onerror = (e) => { - handleError(transaction.error); - }; - /* transaction.oncomplete = (e) => { - this.log('save: transaction complete:', entryName); - }; */ - - /* transaction.addEventListener('abort', (e) => { - //handleError(); - this.log.error('IndexedDB: save transaction abort!', transaction.error); - }); */ - - const objectStore = transaction.objectStore(this.storeName); - var request = objectStore.put(value, entryName); - } catch(error) { - handleError(error); - return Promise.reject(error); - - /* this.storageIsAvailable = false; - throw error; */ - } - return new Promise((resolve, reject) => { - const timeout = setTimeout(() => { - this.log.error('save: request not finished', entryName, request); - }, 10000); - - request.onsuccess = (event) => { - resolve(); - clearTimeout(timeout); - }; + try { + const transaction = db.transaction([this.storeName], 'readwrite'); - request.onerror = (error) => { + transaction.onerror = (e) => { + handleError(transaction.error); + reject(transaction.error); + clearTimeout(timeout); + }; + + transaction.oncomplete = (e) => { + //this.log('save: transaction complete:', entryName); + resolve(); + clearTimeout(timeout); + }; + + const timeout = setTimeout(() => { + this.log.error('save: transaction not finished', entryName, transaction); + }, 10000); + + /* transaction.addEventListener('abort', (e) => { + //handleError(); + this.log.error('IndexedDB: save transaction abort!', transaction.error); + }); */ + + const objectStore = transaction.objectStore(this.storeName); + + if(!Array.isArray(entryName)) { + entryName = [].concat(entryName); + value = [].concat(value); + } + + for(let i = 0, length = entryName.length; i < length; ++i) { + const request = objectStore.put(value[i], entryName[i]); + request.onerror = (error) => { + reject(transaction.error); + clearTimeout(timeout); + }; + } + } catch(error) { + handleError(error); reject(error); - clearTimeout(timeout); - }; + + /* this.storageIsAvailable = false; + throw error; */ + } }); }); } @@ -401,6 +409,51 @@ export default class IDBStorage { }); } + public getAll(): Promise { + return this.openDatabase().then((db) => { + //this.log('getAll pre:', fileName); + + try { + const transaction = db.transaction([this.storeName], 'readonly'); + /* transaction.onabort = (e) => { + this.log.error('getAll transaction onabort?', e); + }; */ + const objectStore = transaction.objectStore(this.storeName); + var request = objectStore.getAll(); + + //this.log.log('IDB getAll:', fileName, request); + } catch(err) { + this.log.error('getAll error:', err, request, request.error); + } + + return new Promise((resolve, reject) => { + const timeout = setTimeout(() => { + this.log.error('getAll request not finished!', request); + reject(); + }, 3000); + + request.onsuccess = function(event) { + const result = request.result; + if(result === undefined) { + reject('NO_ENTRY_FOUND'); + } /* else if(typeof result === 'string' && + result.substr(0, 5) === 'data:') { + resolve(dataUrlToBlob(result)); + } */else { + resolve(result); + } + + clearTimeout(timeout); + } + + request.onerror = () => { + clearTimeout(timeout); + reject(); + }; + }); + }); + } + /* public getAllKeys(): Promise> { console.time('getAllEntries'); return this.openDatabase().then((db) => { diff --git a/src/lib/storage.ts b/src/lib/storage.ts index e93dee71..7606338a 100644 --- a/src/lib/storage.ts +++ b/src/lib/storage.ts @@ -10,6 +10,7 @@ */ import { DatabaseStore, DatabaseStoreName } from "../config/database"; +import { throttle } from "../helpers/schedulers"; import IDBStorage, { IDBOptions } from "./idb"; export default class AppStorage/* Storage extends {[name: string]: any} *//* Storage extends Record */> { @@ -19,11 +20,29 @@ export default class AppStorage/* Storage ex //private cache: Partial<{[key: string]: Storage[typeof key]}> = {}; private cache: Partial = {}; private useStorage = true; + private updateKeys: Set = new Set(); + private saveThrottled: () => void; constructor(storageOptions: Omit & {stores?: DatabaseStore[], storeName: DatabaseStoreName}) { this.storage = new IDBStorage(storageOptions); AppStorage.STORAGES.push(this); + + this.saveThrottled = throttle(async() => { + const keys = Array.from(this.updateKeys.values()) as string[]; + this.updateKeys.clear(); + + try { + //console.log('setItem: will set', key/* , value */); + //await this.cacheStorage.delete(key); // * try to prevent memory leak in Chrome leading to 'Unexpected internal error.' + //await this.storage.save(key, new Response(value, {headers: {'Content-Type': 'application/json'}})); + await this.storage.save(keys, keys.map(key => this.cache[key])); + //console.log('setItem: have set', key/* , value */); + } catch(e) { + //this.useCS = false; + console.error('[AS]: set error:', e, keys/* , value */); + } + }, 50, false); } public getCache() { @@ -83,16 +102,8 @@ export default class AppStorage/* Storage ex console.log('LocalStorage set: stringify time by own stringify:', performance.now() - perf); */ if(this.useStorage && !onlyLocal) { - try { - //console.log('setItem: will set', key/* , value */); - //await this.cacheStorage.delete(key); // * try to prevent memory leak in Chrome leading to 'Unexpected internal error.' - //await this.storage.save(key, new Response(value, {headers: {'Content-Type': 'application/json'}})); - await this.storage.save(key, value); - //console.log('setItem: have set', key/* , value */); - } catch(e) { - //this.useCS = false; - console.error('[AS]: set error:', e, key/* , value */); - } + this.updateKeys.add(key); + this.saveThrottled(); } } } @@ -126,6 +137,7 @@ export default class AppStorage/* Storage ex storage.useStorage = enabled; if(!enabled) { + storage.updateKeys.clear(); return storage.clear(); } else { return storage.set(storage.cache); diff --git a/src/scripts/in/countries.dat b/src/scripts/in/countries.dat index 94cec601..e670a859 100644 --- a/src/scripts/in/countries.dat +++ b/src/scripts/in/countries.dat @@ -135,7 +135,7 @@ 389;MK;Macedonia;;0;๐Ÿ‡ฒ๐Ÿ‡ฐ 261;MG;Madagascar;261 XX XX XXX XX;12;๐Ÿ‡ฒ๐Ÿ‡ฌ 265;MW;Malawi;;0;๐Ÿ‡ฒ๐Ÿ‡ผ -60;MM;Malaysia;;0;๐Ÿ‡ฒ๐Ÿ‡ฒ +60;MY;Malaysia;;0;๐Ÿ‡ฒ๐Ÿ‡พ 960;MV;Maldives;;0;๐Ÿ‡ฒ๐Ÿ‡ป 223;ML;Mali;223 XXXX XXXX;11;๐Ÿ‡ฒ๐Ÿ‡ฑ 356;MT;Malta;356 XX XX XX XX;11;๐Ÿ‡ฒ๐Ÿ‡น diff --git a/src/scss/partials/_leftSidebar.scss b/src/scss/partials/_leftSidebar.scss index b810bcd2..f99678b2 100644 --- a/src/scss/partials/_leftSidebar.scss +++ b/src/scss/partials/_leftSidebar.scss @@ -365,14 +365,17 @@ z-index: 1; } - html:not(.no-touch) & { + /* html:not(.no-touch) & { + transform: translateZ(0); + } */ + &:not(.is-hidden) { transform: translateZ(0); } } - html.no-touch &:hover .btn-corner:not(.is-hidden) { + /* html.no-touch &:hover .btn-corner:not(.is-hidden) { transform: translateZ(0); - } + } */ } .connection-status { diff --git a/src/scss/partials/_rightSidebar.scss b/src/scss/partials/_rightSidebar.scss index 359090d5..d9bb8ea1 100644 --- a/src/scss/partials/_rightSidebar.scss +++ b/src/scss/partials/_rightSidebar.scss @@ -150,17 +150,17 @@ } &.can-add-members { - @include respond-to(handhelds) { + //@include respond-to(handhelds) { .btn-corner:not(.is-hidden) { transform: translateZ(0); } - } + //} - @include hover() { + /* @include hover() { .btn-corner:not(.is-hidden) { transform: translateZ(0); } - } + } */ } .search-super {