UNPKG

@fto-consult/expo-ui

Version:

Bibliothèque de composants UI Expo,react-native

125 lines (105 loc) • 4.2 kB
import _ from 'lodash'; import libPhoneNumber from 'google-libphonenumber'; import {isNonNullString,defaultStr} from "$cutils"; import Country from './country'; import numberType from './numberType.json'; // eslint-disable-line @typescript-eslint/no-unused-vars const phoneUtil = libPhoneNumber.PhoneNumberUtil.getInstance(); const asYouTypeFormatter = libPhoneNumber.AsYouTypeFormatter; export {phoneUtil}; export const parse = (number,iso2)=>{ try { return phoneUtil.parse(number, defaultStr(iso2).toLowerCase()); } catch (err) { console.log(`Exception was thrown on parsing phone number : ${err.toString()}`,number," country : ",iso2); return null; } } export const isValidNumber = (number,iso2)=>{ const phoneInfo = parse(number, defaultStr(iso2).toLowerCase()); if (phoneInfo) { return phoneUtil.isValidNumber(phoneInfo); } return false; } export const isValidPhoneNumber = isValidNumber; class PhoneNumber { // eslint-disable-next-line class-methods-use-this getAllCountries() { return Country.getAll(); } getDialCode(number) { let dialCode = ''; // only interested in international numbers (starting with a plus) if (number.charAt(0) === '+') { let numericChars = ''; // iterate over chars for (let i = 0; i < number.length; i++) { const c = number.charAt(i); // if char is number if (this.isNumeric(c)) { numericChars += c; // if current numericChars make a valid dial code // if (this.countryCodes[numericChars]) { if (Country.getCountryCodes()[numericChars]) { // store the actual raw string (useful for matching later) dialCode = number.substr(0, i + 1); } // longest dial code is 4 chars if (numericChars.length === 4) { break; } } } } return dialCode; } // eslint-disable-next-line class-methods-use-this getNumeric(str) { return str.replace(/\D/g, ''); } // eslint-disable-next-line class-methods-use-this isNumeric(n) { return !Number.isNaN(parseFloat(n)) && Number.isFinite(Number(n)); } getCountryCodeOfNumber(number) { const dialCode = this.getDialCode(number); const numeric = this.getNumeric(dialCode); const countryCode = Country.getCountryCodes()[numeric]; // countryCode[0] can be null -> get first element that is not null if (countryCode) { return _.first(countryCode.filter((iso2) => iso2)); } return ''; } // eslint-disable-next-line class-methods-use-this parse(number, iso2) { return parse(number,defaultStr(iso2).toLowerCase()); } isValidNumber(number, iso2) { return this.isValidNumber(number,defaultStr(iso2).toLowerCase()); } // eslint-disable-next-line class-methods-use-this format(number, iso2) { const formatter = new asYouTypeFormatter(defaultStr(iso2).toLowerCase()); // eslint-disable-line new-cap let formatted; number.replace(/-/g, '') .replace(/ /g, '') .replace(/\(/g, '') .replace(/\)/g, '') .split('') .forEach((n) => { formatted = formatter.inputDigit(n); }); return formatted; } getNumberType(number, iso2) { const phoneInfo = this.parse(number, defaultStr(iso2).toLowerCase()); const typeIndex = phoneInfo ? phoneUtil.getNumberType(phoneInfo) : -1; return _.findKey(numberType, (noType) => noType === typeIndex); } // eslint-disable-next-line class-methods-use-this getCountryDataByCode(iso2) { return Country.getCountryDataByCode(defaultStr(iso2).toLowerCase()); } } export default new PhoneNumber();