import { COUNTRIES } from './countries'; // Comprehensive mapping of country codes to dial codes // Based on ITU-T E.164 standard export const DIAL_CODES: Record = { '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) ); };