import { isNil, trim } from 'lodash' import { countryByCode } from './country-by-code' import { countries } from './countries' import { CountryCode } from './country-code.type' import { countryCodes } from './country-codes' import { countryNames } from './country-names' import { flagByCode } from './flag-by-code' import { CountryCallingCodes } from './country-calling-codes.enum' import { LanguageCountryCode } from './language-country-code.enum' import { CountryName } from './country-name.type' import { Timezone } from './timezones' export const COUNTRY_CODE_MAP = { es: 'es_MX', pt: 'pt_BR', eq: 'es_EC', } export const CountryHelper = { countries, codes: countryCodes, names: countryNames, flags: flagByCode, nameByCode: countryByCode, findMatchCode: (value: string): CountryCode => countryCodes.find(code => code.toUpperCase() === trim(value).toUpperCase()), parseCode: (value: string, alt?: string): CountryCode => { const countryCode = CountryHelper.findMatchCode(value) if (isNil(countryCode) && !isNil(alt)) return CountryHelper.parseCode(alt) return countryCode || null }, parseLanguageCode: (value: CountryCode): LanguageCountryCode => { const countryCode = CountryHelper.findMatchCode(value) return Object.values(LanguageCountryCode).find(language => language === countryCode) }, isCode: (value: string, other: CountryCode): boolean => { if (isNil(other)) return false return CountryHelper.parseCode(value) === other }, extractOnlyCountryCode: (value: CountryCode): string => value.split('_').pop(), extractOnlyLanguage: (value: CountryCode): string => value.split('_').shift(), getLanguageCountryCodeByCountry: (value: string): LanguageCountryCode => Object.values(LanguageCountryCode).find(key => key.match(`_${value.toLocaleUpperCase()}`)), getLanguageCountryCodeByLanguage: (value: string): LanguageCountryCode => Object.values(LanguageCountryCode).find(key => key.match(`${value.toLocaleLowerCase()}_`)), getCallingCode: (value: CountryCode): string => CountryCallingCodes[CountryHelper.extractOnlyCountryCode(value)], getLanguagueContryCodeByLocation: (value: CountryName): LanguageCountryCode => countries.find(country => country.name === value)?.code as LanguageCountryCode, getTimezoneByCountry: (value: CountryCode): Timezone => { switch (value) { case 'pt_BR': return 'America/Sao_Paulo' case 'es_MX': return 'America/Mexico_City' default: return null } }, }