updates to database schema
All checks were successful
Build And Push Image / docker (push) Successful in 2m50s
All checks were successful
Build And Push Image / docker (push) Successful in 2m50s
This commit is contained in:
345
utils/phone-countries.ts
Normal file
345
utils/phone-countries.ts
Normal file
@@ -0,0 +1,345 @@
|
||||
import { COUNTRIES } from './countries';
|
||||
|
||||
// Comprehensive mapping of country codes to dial codes
|
||||
// Based on ITU-T E.164 standard
|
||||
export const DIAL_CODES: Record<string, string> = {
|
||||
'AD': '+376', // Andorra
|
||||
'AE': '+971', // United Arab Emirates
|
||||
'AF': '+93', // Afghanistan
|
||||
'AG': '+1', // Antigua and Barbuda
|
||||
'AI': '+1', // Anguilla
|
||||
'AL': '+355', // Albania
|
||||
'AM': '+374', // Armenia
|
||||
'AO': '+244', // Angola
|
||||
'AQ': '+672', // Antarctica
|
||||
'AR': '+54', // Argentina
|
||||
'AS': '+1', // American Samoa
|
||||
'AT': '+43', // Austria
|
||||
'AU': '+61', // Australia
|
||||
'AW': '+297', // Aruba
|
||||
'AX': '+358', // Åland Islands
|
||||
'AZ': '+994', // Azerbaijan
|
||||
'BA': '+387', // Bosnia and Herzegovina
|
||||
'BB': '+1', // Barbados
|
||||
'BD': '+880', // Bangladesh
|
||||
'BE': '+32', // Belgium
|
||||
'BF': '+226', // Burkina Faso
|
||||
'BG': '+359', // Bulgaria
|
||||
'BH': '+973', // Bahrain
|
||||
'BI': '+257', // Burundi
|
||||
'BJ': '+229', // Benin
|
||||
'BL': '+590', // Saint Barthélemy
|
||||
'BM': '+1', // Bermuda
|
||||
'BN': '+673', // Brunei
|
||||
'BO': '+591', // Bolivia
|
||||
'BQ': '+599', // Bonaire, Sint Eustatius and Saba
|
||||
'BR': '+55', // Brazil
|
||||
'BS': '+1', // Bahamas
|
||||
'BT': '+975', // Bhutan
|
||||
'BV': '+47', // Bouvet Island
|
||||
'BW': '+267', // Botswana
|
||||
'BY': '+375', // Belarus
|
||||
'BZ': '+501', // Belize
|
||||
'CA': '+1', // Canada
|
||||
'CC': '+61', // Cocos (Keeling) Islands
|
||||
'CD': '+243', // Congo - Kinshasa
|
||||
'CF': '+236', // Central African Republic
|
||||
'CG': '+242', // Congo - Brazzaville
|
||||
'CH': '+41', // Switzerland
|
||||
'CI': '+225', // Côte d'Ivoire
|
||||
'CK': '+682', // Cook Islands
|
||||
'CL': '+56', // Chile
|
||||
'CM': '+237', // Cameroon
|
||||
'CN': '+86', // China
|
||||
'CO': '+57', // Colombia
|
||||
'CR': '+506', // Costa Rica
|
||||
'CU': '+53', // Cuba
|
||||
'CV': '+238', // Cape Verde
|
||||
'CW': '+599', // Curaçao
|
||||
'CX': '+61', // Christmas Island
|
||||
'CY': '+357', // Cyprus
|
||||
'CZ': '+420', // Czech Republic
|
||||
'DE': '+49', // Germany
|
||||
'DJ': '+253', // Djibouti
|
||||
'DK': '+45', // Denmark
|
||||
'DM': '+1', // Dominica
|
||||
'DO': '+1', // Dominican Republic
|
||||
'DZ': '+213', // Algeria
|
||||
'EC': '+593', // Ecuador
|
||||
'EE': '+372', // Estonia
|
||||
'EG': '+20', // Egypt
|
||||
'EH': '+212', // Western Sahara
|
||||
'ER': '+291', // Eritrea
|
||||
'ES': '+34', // Spain
|
||||
'ET': '+251', // Ethiopia
|
||||
'FI': '+358', // Finland
|
||||
'FJ': '+679', // Fiji
|
||||
'FK': '+500', // Falkland Islands
|
||||
'FM': '+691', // Micronesia
|
||||
'FO': '+298', // Faroe Islands
|
||||
'FR': '+33', // France
|
||||
'GA': '+241', // Gabon
|
||||
'GB': '+44', // United Kingdom
|
||||
'GD': '+1', // Grenada
|
||||
'GE': '+995', // Georgia
|
||||
'GF': '+594', // French Guiana
|
||||
'GG': '+44', // Guernsey
|
||||
'GH': '+233', // Ghana
|
||||
'GI': '+350', // Gibraltar
|
||||
'GL': '+299', // Greenland
|
||||
'GM': '+220', // Gambia
|
||||
'GN': '+224', // Guinea
|
||||
'GP': '+590', // Guadeloupe
|
||||
'GQ': '+240', // Equatorial Guinea
|
||||
'GR': '+30', // Greece
|
||||
'GS': '+500', // South Georgia and the South Sandwich Islands
|
||||
'GT': '+502', // Guatemala
|
||||
'GU': '+1', // Guam
|
||||
'GW': '+245', // Guinea-Bissau
|
||||
'GY': '+592', // Guyana
|
||||
'HK': '+852', // Hong Kong SAR China
|
||||
'HM': '+672', // Heard & McDonald Islands
|
||||
'HN': '+504', // Honduras
|
||||
'HR': '+385', // Croatia
|
||||
'HT': '+509', // Haiti
|
||||
'HU': '+36', // Hungary
|
||||
'ID': '+62', // Indonesia
|
||||
'IE': '+353', // Ireland
|
||||
'IL': '+972', // Israel
|
||||
'IM': '+44', // Isle of Man
|
||||
'IN': '+91', // India
|
||||
'IO': '+246', // British Indian Ocean Territory
|
||||
'IQ': '+964', // Iraq
|
||||
'IR': '+98', // Iran
|
||||
'IS': '+354', // Iceland
|
||||
'IT': '+39', // Italy
|
||||
'JE': '+44', // Jersey
|
||||
'JM': '+1', // Jamaica
|
||||
'JO': '+962', // Jordan
|
||||
'JP': '+81', // Japan
|
||||
'KE': '+254', // Kenya
|
||||
'KG': '+996', // Kyrgyzstan
|
||||
'KH': '+855', // Cambodia
|
||||
'KI': '+686', // Kiribati
|
||||
'KM': '+269', // Comoros
|
||||
'KN': '+1', // Saint Kitts and Nevis
|
||||
'KP': '+850', // North Korea
|
||||
'KR': '+82', // South Korea
|
||||
'KW': '+965', // Kuwait
|
||||
'KY': '+1', // Cayman Islands
|
||||
'KZ': '+7', // Kazakhstan
|
||||
'LA': '+856', // Laos
|
||||
'LB': '+961', // Lebanon
|
||||
'LC': '+1', // Saint Lucia
|
||||
'LI': '+423', // Liechtenstein
|
||||
'LK': '+94', // Sri Lanka
|
||||
'LR': '+231', // Liberia
|
||||
'LS': '+266', // Lesotho
|
||||
'LT': '+370', // Lithuania
|
||||
'LU': '+352', // Luxembourg
|
||||
'LV': '+371', // Latvia
|
||||
'LY': '+218', // Libya
|
||||
'MA': '+212', // Morocco
|
||||
'MC': '+377', // Monaco
|
||||
'MD': '+373', // Moldova
|
||||
'ME': '+382', // Montenegro
|
||||
'MF': '+590', // Saint Martin
|
||||
'MG': '+261', // Madagascar
|
||||
'MH': '+692', // Marshall Islands
|
||||
'MK': '+389', // North Macedonia
|
||||
'ML': '+223', // Mali
|
||||
'MM': '+95', // Myanmar (Burma)
|
||||
'MN': '+976', // Mongolia
|
||||
'MO': '+853', // Macao SAR China
|
||||
'MP': '+1', // Northern Mariana Islands
|
||||
'MQ': '+596', // Martinique
|
||||
'MR': '+222', // Mauritania
|
||||
'MS': '+1', // Montserrat
|
||||
'MT': '+356', // Malta
|
||||
'MU': '+230', // Mauritius
|
||||
'MV': '+960', // Maldives
|
||||
'MW': '+265', // Malawi
|
||||
'MX': '+52', // Mexico
|
||||
'MY': '+60', // Malaysia
|
||||
'MZ': '+258', // Mozambique
|
||||
'NA': '+264', // Namibia
|
||||
'NC': '+687', // New Caledonia
|
||||
'NE': '+227', // Niger
|
||||
'NF': '+672', // Norfolk Island
|
||||
'NG': '+234', // Nigeria
|
||||
'NI': '+505', // Nicaragua
|
||||
'NL': '+31', // Netherlands
|
||||
'NO': '+47', // Norway
|
||||
'NP': '+977', // Nepal
|
||||
'NR': '+674', // Nauru
|
||||
'NU': '+683', // Niue
|
||||
'NZ': '+64', // New Zealand
|
||||
'OM': '+968', // Oman
|
||||
'PA': '+507', // Panama
|
||||
'PE': '+51', // Peru
|
||||
'PF': '+689', // French Polynesia
|
||||
'PG': '+675', // Papua New Guinea
|
||||
'PH': '+63', // Philippines
|
||||
'PK': '+92', // Pakistan
|
||||
'PL': '+48', // Poland
|
||||
'PM': '+508', // Saint Pierre and Miquelon
|
||||
'PN': '+64', // Pitcairn Islands
|
||||
'PR': '+1', // Puerto Rico
|
||||
'PS': '+970', // Palestinian Territories
|
||||
'PT': '+351', // Portugal
|
||||
'PW': '+680', // Palau
|
||||
'PY': '+595', // Paraguay
|
||||
'QA': '+974', // Qatar
|
||||
'RE': '+262', // Réunion
|
||||
'RO': '+40', // Romania
|
||||
'RS': '+381', // Serbia
|
||||
'RU': '+7', // Russia
|
||||
'RW': '+250', // Rwanda
|
||||
'SA': '+966', // Saudi Arabia
|
||||
'SB': '+677', // Solomon Islands
|
||||
'SC': '+248', // Seychelles
|
||||
'SD': '+249', // Sudan
|
||||
'SE': '+46', // Sweden
|
||||
'SG': '+65', // Singapore
|
||||
'SH': '+290', // Saint Helena
|
||||
'SI': '+386', // Slovenia
|
||||
'SJ': '+47', // Svalbard and Jan Mayen
|
||||
'SK': '+421', // Slovakia
|
||||
'SL': '+232', // Sierra Leone
|
||||
'SM': '+378', // San Marino
|
||||
'SN': '+221', // Senegal
|
||||
'SO': '+252', // Somalia
|
||||
'SR': '+597', // Suriname
|
||||
'SS': '+211', // South Sudan
|
||||
'ST': '+239', // São Tomé and Príncipe
|
||||
'SV': '+503', // El Salvador
|
||||
'SX': '+1', // Sint Maarten
|
||||
'SY': '+963', // Syria
|
||||
'SZ': '+268', // Eswatini
|
||||
'TC': '+1', // Turks and Caicos Islands
|
||||
'TD': '+235', // Chad
|
||||
'TF': '+262', // French Southern Territories
|
||||
'TG': '+228', // Togo
|
||||
'TH': '+66', // Thailand
|
||||
'TJ': '+992', // Tajikistan
|
||||
'TK': '+690', // Tokelau
|
||||
'TL': '+670', // Timor-Leste
|
||||
'TM': '+993', // Turkmenistan
|
||||
'TN': '+216', // Tunisia
|
||||
'TO': '+676', // Tonga
|
||||
'TR': '+90', // Turkey
|
||||
'TT': '+1', // Trinidad and Tobago
|
||||
'TV': '+688', // Tuvalu
|
||||
'TW': '+886', // Taiwan
|
||||
'TZ': '+255', // Tanzania
|
||||
'UA': '+380', // Ukraine
|
||||
'UG': '+256', // Uganda
|
||||
'UM': '+1', // U.S. Outlying Islands
|
||||
'US': '+1', // United States
|
||||
'UY': '+598', // Uruguay
|
||||
'UZ': '+998', // Uzbekistan
|
||||
'VA': '+39', // Vatican City
|
||||
'VC': '+1', // Saint Vincent and the Grenadines
|
||||
'VE': '+58', // Venezuela
|
||||
'VG': '+1', // British Virgin Islands
|
||||
'VI': '+1', // U.S. Virgin Islands
|
||||
'VN': '+84', // Vietnam
|
||||
'VU': '+678', // Vanuatu
|
||||
'WF': '+681', // Wallis and Futuna
|
||||
'WS': '+685', // Samoa
|
||||
'XK': '+383', // Kosovo
|
||||
'YE': '+967', // Yemen
|
||||
'YT': '+262', // Mayotte
|
||||
'ZA': '+27', // South Africa
|
||||
'ZM': '+260', // Zambia
|
||||
'ZW': '+263' // Zimbabwe
|
||||
};
|
||||
|
||||
// Interface for phone country data
|
||||
export interface PhoneCountry {
|
||||
name: string;
|
||||
iso2: string;
|
||||
dialCode: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all countries with dial codes for phone input
|
||||
*/
|
||||
export const getAllPhoneCountries = (): PhoneCountry[] => {
|
||||
return COUNTRIES.map(country => ({
|
||||
name: country.name,
|
||||
iso2: country.code,
|
||||
dialCode: DIAL_CODES[country.code] || '+1'
|
||||
}));
|
||||
};
|
||||
|
||||
/**
|
||||
* Get preferred countries first, then alphabetical
|
||||
*/
|
||||
export const getPhoneCountriesWithPreferred = (preferredCountries: string[] = ['MC', 'FR', 'US', 'IT', 'CH']): PhoneCountry[] => {
|
||||
const allCountries = getAllPhoneCountries();
|
||||
|
||||
// Separate preferred and non-preferred countries
|
||||
const preferred = allCountries.filter(c => preferredCountries.includes(c.iso2));
|
||||
const others = allCountries.filter(c => !preferredCountries.includes(c.iso2));
|
||||
|
||||
// Sort each group alphabetically
|
||||
preferred.sort((a, b) => a.name.localeCompare(b.name));
|
||||
others.sort((a, b) => a.name.localeCompare(b.name));
|
||||
|
||||
return [...preferred, ...others];
|
||||
};
|
||||
|
||||
/**
|
||||
* Find country by dial code
|
||||
*/
|
||||
export const findCountryByDialCode = (dialCode: string): PhoneCountry | null => {
|
||||
const cleanDialCode = dialCode.startsWith('+') ? dialCode : `+${dialCode}`;
|
||||
const countryCode = Object.entries(DIAL_CODES).find(([_, code]) => code === cleanDialCode)?.[0];
|
||||
|
||||
if (countryCode) {
|
||||
const country = COUNTRIES.find(c => c.code === countryCode);
|
||||
if (country) {
|
||||
return {
|
||||
name: country.name,
|
||||
iso2: country.code,
|
||||
dialCode: cleanDialCode
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
|
||||
/**
|
||||
* Get country by ISO2 code
|
||||
*/
|
||||
export const getPhoneCountryByCode = (iso2: string): PhoneCountry | null => {
|
||||
const country = COUNTRIES.find(c => c.code === iso2.toUpperCase());
|
||||
if (country) {
|
||||
return {
|
||||
name: country.name,
|
||||
iso2: country.code,
|
||||
dialCode: DIAL_CODES[country.code] || '+1'
|
||||
};
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
/**
|
||||
* Search countries for phone input
|
||||
*/
|
||||
export const searchPhoneCountries = (query: string, preferredCountries: string[] = []): PhoneCountry[] => {
|
||||
if (!query) {
|
||||
return getPhoneCountriesWithPreferred(preferredCountries);
|
||||
}
|
||||
|
||||
const lowerQuery = query.toLowerCase();
|
||||
const allCountries = getAllPhoneCountries();
|
||||
|
||||
return allCountries.filter(country =>
|
||||
country.name.toLowerCase().includes(lowerQuery) ||
|
||||
country.dialCode.includes(query) ||
|
||||
country.iso2.toLowerCase().includes(lowerQuery)
|
||||
);
|
||||
};
|
||||
Reference in New Issue
Block a user