/* Copyright 2024 New Vector Ltd. Copyright 2017 Vector Creations Ltd SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ const PHONE_NUMBER_REGEXP = /^[0-9 -.]+$/; /* * Do basic validation to determine if the given input could be * a valid phone number. * * @param {String} phoneNumber The string to validate. This could be * either an international format number (MSISDN or e.164) or * a national-format number. * @return True if the number could be a valid phone number, otherwise false. */ export function looksValid(phoneNumber: string): boolean { return PHONE_NUMBER_REGEXP.test(phoneNumber); } // Regional Indicator Symbol Letter A const UNICODE_BASE = 127462 - "A".charCodeAt(0); // Country code should be exactly 2 uppercase characters const COUNTRY_CODE_REGEX = /^[A-Z]{2}$/; export const getEmojiFlag = (countryCode: string): string => { if (!COUNTRY_CODE_REGEX.test(countryCode)) return ""; // Rip the country code out of the emoji and use that return String.fromCodePoint(...countryCode.split("").map((l) => UNICODE_BASE + l.charCodeAt(0))); }; // Use https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DisplayNames to get name export interface PhoneNumberCountryDefinition { iso2: string; prefix: string; } export const COUNTRIES: PhoneNumberCountryDefinition[] = [ { iso2: "GB", prefix: "44", }, { iso2: "US", prefix: "1", }, { iso2: "AF", prefix: "93", }, { iso2: "AX", prefix: "358", }, { iso2: "AL", prefix: "355", }, { iso2: "DZ", prefix: "213", }, { iso2: "AS", prefix: "1", }, { iso2: "AD", prefix: "376", }, { iso2: "AO", prefix: "244", }, { iso2: "AI", prefix: "1", }, { iso2: "AQ", prefix: "672", }, { iso2: "AG", prefix: "1", }, { iso2: "AR", prefix: "54", }, { iso2: "AM", prefix: "374", }, { iso2: "AW", prefix: "297", }, { iso2: "AU", prefix: "61", }, { iso2: "AT", prefix: "43", }, { iso2: "AZ", prefix: "994", }, { iso2: "BS", prefix: "1", }, { iso2: "BH", prefix: "973", }, { iso2: "BD", prefix: "880", }, { iso2: "BB", prefix: "1", }, { iso2: "BY", prefix: "375", }, { iso2: "BE", prefix: "32", }, { iso2: "BZ", prefix: "501", }, { iso2: "BJ", prefix: "229", }, { iso2: "BM", prefix: "1", }, { iso2: "BT", prefix: "975", }, { iso2: "BO", prefix: "591", }, { iso2: "BA", prefix: "387", }, { iso2: "BW", prefix: "267", }, { iso2: "BV", prefix: "47", }, { iso2: "BR", prefix: "55", }, { iso2: "IO", prefix: "246", }, { iso2: "VG", prefix: "1", }, { iso2: "BN", prefix: "673", }, { iso2: "BG", prefix: "359", }, { iso2: "BF", prefix: "226", }, { iso2: "BI", prefix: "257", }, { iso2: "KH", prefix: "855", }, { iso2: "CM", prefix: "237", }, { iso2: "CA", prefix: "1", }, { iso2: "CV", prefix: "238", }, { iso2: "BQ", prefix: "599", }, { iso2: "KY", prefix: "1", }, { iso2: "CF", prefix: "236", }, { iso2: "TD", prefix: "235", }, { iso2: "CL", prefix: "56", }, { iso2: "CN", prefix: "86", }, { iso2: "CX", prefix: "61", }, { iso2: "CC", prefix: "61", }, { iso2: "CO", prefix: "57", }, { iso2: "KM", prefix: "269", }, { iso2: "CG", prefix: "242", }, { iso2: "CD", prefix: "243", }, { iso2: "CK", prefix: "682", }, { iso2: "CR", prefix: "506", }, { iso2: "HR", prefix: "385", }, { iso2: "CU", prefix: "53", }, { iso2: "CW", prefix: "599", }, { iso2: "CY", prefix: "357", }, { iso2: "CZ", prefix: "420", }, { iso2: "CI", prefix: "225", }, { iso2: "DK", prefix: "45", }, { iso2: "DJ", prefix: "253", }, { iso2: "DM", prefix: "1", }, { iso2: "DO", prefix: "1", }, { iso2: "EC", prefix: "593", }, { iso2: "EG", prefix: "20", }, { iso2: "SV", prefix: "503", }, { iso2: "GQ", prefix: "240", }, { iso2: "ER", prefix: "291", }, { iso2: "EE", prefix: "372", }, { iso2: "ET", prefix: "251", }, { iso2: "FK", prefix: "500", }, { iso2: "FO", prefix: "298", }, { iso2: "FJ", prefix: "679", }, { iso2: "FI", prefix: "358", }, { iso2: "FR", prefix: "33", }, { iso2: "GF", prefix: "594", }, { iso2: "PF", prefix: "689", }, { iso2: "TF", prefix: "262", }, { iso2: "GA", prefix: "241", }, { iso2: "GM", prefix: "220", }, { iso2: "GE", prefix: "995", }, { iso2: "DE", prefix: "49", }, { iso2: "GH", prefix: "233", }, { iso2: "GI", prefix: "350", }, { iso2: "GR", prefix: "30", }, { iso2: "GL", prefix: "299", }, { iso2: "GD", prefix: "1", }, { iso2: "GP", prefix: "590", }, { iso2: "GU", prefix: "1", }, { iso2: "GT", prefix: "502", }, { iso2: "GG", prefix: "44", }, { iso2: "GN", prefix: "224", }, { iso2: "GW", prefix: "245", }, { iso2: "GY", prefix: "592", }, { iso2: "HT", prefix: "509", }, { iso2: "HM", prefix: "672", }, { iso2: "HN", prefix: "504", }, { iso2: "HK", prefix: "852", }, { iso2: "HU", prefix: "36", }, { iso2: "IS", prefix: "354", }, { iso2: "IN", prefix: "91", }, { iso2: "ID", prefix: "62", }, { iso2: "IR", prefix: "98", }, { iso2: "IQ", prefix: "964", }, { iso2: "IE", prefix: "353", }, { iso2: "IM", prefix: "44", }, { iso2: "IL", prefix: "972", }, { iso2: "IT", prefix: "39", }, { iso2: "JM", prefix: "1", }, { iso2: "JP", prefix: "81", }, { iso2: "JE", prefix: "44", }, { iso2: "JO", prefix: "962", }, { iso2: "KZ", prefix: "7", }, { iso2: "KE", prefix: "254", }, { iso2: "KI", prefix: "686", }, { iso2: "XK", prefix: "383", }, { iso2: "KW", prefix: "965", }, { iso2: "KG", prefix: "996", }, { iso2: "LA", prefix: "856", }, { iso2: "LV", prefix: "371", }, { iso2: "LB", prefix: "961", }, { iso2: "LS", prefix: "266", }, { iso2: "LR", prefix: "231", }, { iso2: "LY", prefix: "218", }, { iso2: "LI", prefix: "423", }, { iso2: "LT", prefix: "370", }, { iso2: "LU", prefix: "352", }, { iso2: "MO", prefix: "853", }, { iso2: "MK", prefix: "389", }, { iso2: "MG", prefix: "261", }, { iso2: "MW", prefix: "265", }, { iso2: "MY", prefix: "60", }, { iso2: "MV", prefix: "960", }, { iso2: "ML", prefix: "223", }, { iso2: "MT", prefix: "356", }, { iso2: "MH", prefix: "692", }, { iso2: "MQ", prefix: "596", }, { iso2: "MR", prefix: "222", }, { iso2: "MU", prefix: "230", }, { iso2: "YT", prefix: "262", }, { iso2: "MX", prefix: "52", }, { iso2: "FM", prefix: "691", }, { iso2: "MD", prefix: "373", }, { iso2: "MC", prefix: "377", }, { iso2: "MN", prefix: "976", }, { iso2: "ME", prefix: "382", }, { iso2: "MS", prefix: "1", }, { iso2: "MA", prefix: "212", }, { iso2: "MZ", prefix: "258", }, { iso2: "MM", prefix: "95", }, { iso2: "NA", prefix: "264", }, { iso2: "NR", prefix: "674", }, { iso2: "NP", prefix: "977", }, { iso2: "NL", prefix: "31", }, { iso2: "NC", prefix: "687", }, { iso2: "NZ", prefix: "64", }, { iso2: "NI", prefix: "505", }, { iso2: "NE", prefix: "227", }, { iso2: "NG", prefix: "234", }, { iso2: "NU", prefix: "683", }, { iso2: "NF", prefix: "672", }, { iso2: "KP", prefix: "850", }, { iso2: "MP", prefix: "1", }, { iso2: "NO", prefix: "47", }, { iso2: "OM", prefix: "968", }, { iso2: "PK", prefix: "92", }, { iso2: "PW", prefix: "680", }, { iso2: "PS", prefix: "970", }, { iso2: "PA", prefix: "507", }, { iso2: "PG", prefix: "675", }, { iso2: "PY", prefix: "595", }, { iso2: "PE", prefix: "51", }, { iso2: "PH", prefix: "63", }, { iso2: "PN", prefix: "870", }, { iso2: "PL", prefix: "48", }, { iso2: "PT", prefix: "351", }, { iso2: "PR", prefix: "1", }, { iso2: "QA", prefix: "974", }, { iso2: "RO", prefix: "40", }, { iso2: "RU", prefix: "7", }, { iso2: "RW", prefix: "250", }, { iso2: "RE", prefix: "262", }, { iso2: "WS", prefix: "685", }, { iso2: "SM", prefix: "378", }, { iso2: "SA", prefix: "966", }, { iso2: "SN", prefix: "221", }, { iso2: "RS", prefix: "381 p", }, { iso2: "SC", prefix: "248", }, { iso2: "SL", prefix: "232", }, { iso2: "SG", prefix: "65", }, { iso2: "SX", prefix: "1", }, { iso2: "SK", prefix: "421", }, { iso2: "SI", prefix: "386", }, { iso2: "SB", prefix: "677", }, { iso2: "SO", prefix: "252", }, { iso2: "ZA", prefix: "27", }, { iso2: "GS", prefix: "500", }, { iso2: "KR", prefix: "82", }, { iso2: "SS", prefix: "211", }, { iso2: "ES", prefix: "34", }, { iso2: "LK", prefix: "94", }, { iso2: "BL", prefix: "590", }, { iso2: "SH", prefix: "290 n", }, { iso2: "KN", prefix: "1", }, { iso2: "LC", prefix: "1", }, { iso2: "MF", prefix: "590", }, { iso2: "PM", prefix: "508", }, { iso2: "VC", prefix: "1", }, { iso2: "SD", prefix: "249", }, { iso2: "SR", prefix: "597", }, { iso2: "SJ", prefix: "47", }, { iso2: "SZ", prefix: "268", }, { iso2: "SE", prefix: "46", }, { iso2: "CH", prefix: "41", }, { iso2: "SY", prefix: "963", }, { iso2: "ST", prefix: "239", }, { iso2: "TW", prefix: "886", }, { iso2: "TJ", prefix: "992", }, { iso2: "TZ", prefix: "255", }, { iso2: "TH", prefix: "66", }, { iso2: "TL", prefix: "670", }, { iso2: "TG", prefix: "228", }, { iso2: "TK", prefix: "690", }, { iso2: "TO", prefix: "676", }, { iso2: "TT", prefix: "1", }, { iso2: "TN", prefix: "216", }, { iso2: "TR", prefix: "90", }, { iso2: "TM", prefix: "993", }, { iso2: "TC", prefix: "1", }, { iso2: "TV", prefix: "688", }, { iso2: "VI", prefix: "1", }, { iso2: "UG", prefix: "256", }, { iso2: "UA", prefix: "380", }, { iso2: "AE", prefix: "971", }, { iso2: "UY", prefix: "598", }, { iso2: "UZ", prefix: "998", }, { iso2: "VU", prefix: "678", }, { iso2: "VA", prefix: "39", }, { iso2: "VE", prefix: "58", }, { iso2: "VN", prefix: "84", }, { iso2: "WF", prefix: "681", }, { iso2: "EH", prefix: "212", }, { iso2: "YE", prefix: "967", }, { iso2: "ZM", prefix: "260", }, { iso2: "ZW", prefix: "263", }, ];