react-phone-number-input
Version:
Telephone number input React component
1,327 lines (1,217 loc) • 48 kB
JavaScript
"use strict";
var _phoneInputHelpers = require("./phoneInputHelpers.js");
var _metadata = _interopRequireDefault(require("libphonenumber-js/min/metadata"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
describe('phoneInputHelpers', function () {
it('should get pre-selected country', function () {
// Can't return "International". Return the first country available.
(0, _phoneInputHelpers.getPreSelectedCountry)({
value: '+11111111111',
phoneNumber: {},
countries: ['US', 'RU'],
getAnyCountry: function getAnyCountry() {
return 'US';
},
required: true,
metadata: _metadata["default"]
}).should.equal('US');
// Can return "International".
// Country can't be derived from the phone number.
// https://github.com/catamphetamine/react-phone-number-input/issues/378
expect((0, _phoneInputHelpers.getPreSelectedCountry)({
value: '+11111111111',
phoneNumber: {},
countries: ['US', 'RU'],
getAnyCountry: function getAnyCountry() {
return 'US';
},
required: false,
metadata: _metadata["default"]
})).to.be.undefined;
// Can return "International".
// Country can't be derived from the phone number.
// Has `defaultCountry`.
// Has `value`.
// https://github.com/catamphetamine/react-phone-number-input/issues/378
expect((0, _phoneInputHelpers.getPreSelectedCountry)({
value: '+11111111111',
phoneNumber: {},
defaultCountry: 'RU',
countries: ['RU', 'FR'],
required: false,
metadata: _metadata["default"]
})).to.be.undefined;
// Can return "International".
// Country can be derived from the phone number.
// Has `defaultCountry`.
// Has a valid partial `value`.
// https://github.com/catamphetamine/react-phone-number-input/issues/378
expect((0, _phoneInputHelpers.getPreSelectedCountry)({
value: '+7800',
defaultCountry: 'RU',
countries: ['RU', 'FR'],
required: false,
metadata: _metadata["default"]
})).to.equal('RU');
// Derive country from the phone number.
(0, _phoneInputHelpers.getPreSelectedCountry)({
value: '+78005553535',
phoneNumber: {
country: 'RU',
phone: '8005553535'
},
countries: ['US', 'RU'],
getAnyCountry: function getAnyCountry() {
return 'US';
},
required: true,
metadata: _metadata["default"]
}).should.equal('RU');
// Country derived from the phone number overrides the supplied one.
(0, _phoneInputHelpers.getPreSelectedCountry)({
value: '+78005553535',
phoneNumber: {
country: 'RU',
phone: '8005553535'
},
defaultCountry: 'US',
countries: ['US', 'RU'],
required: true,
metadata: _metadata["default"]
}).should.equal('RU');
// Only pre-select a country if it's in the available `countries` list.
(0, _phoneInputHelpers.getPreSelectedCountry)({
value: '+78005553535',
phoneNumber: {
country: 'RU',
phone: '8005553535'
},
countries: ['US', 'DE'],
getAnyCountry: function getAnyCountry() {
return 'US';
},
required: true,
metadata: _metadata["default"]
}).should.equal('US');
expect((0, _phoneInputHelpers.getPreSelectedCountry)({
value: '+78005553535',
phoneNumber: {
country: 'RU',
phone: '8005553535'
},
defaultCountry: 'US',
countries: ['US', 'DE'],
required: false,
metadata: _metadata["default"]
})).to.be.undefined;
});
it('should generate country select options', function () {
var defaultLabels = {
'RU': 'Russia (Россия)',
'US': 'United States',
'ZZ': 'International'
};
// Without custom country names.
(0, _phoneInputHelpers.getCountrySelectOptions)({
countries: ['US', 'RU'],
countryNames: defaultLabels
}).should.deep.equal([{
value: 'RU',
label: 'Russia (Россия)'
}, {
value: 'US',
label: 'United States'
}]);
// With custom country names.
(0, _phoneInputHelpers.getCountrySelectOptions)({
countries: ['US', 'RU'],
countryNames: _objectSpread(_objectSpread({}, defaultLabels), {}, {
'RU': 'Russia'
})
}).should.deep.equal([{
value: 'RU',
label: 'Russia'
}, {
value: 'US',
label: 'United States'
}]);
// Should substitute missing country names with country codes.
(0, _phoneInputHelpers.getCountrySelectOptions)({
countries: ['US', 'RU'],
countryNames: _objectSpread(_objectSpread({}, defaultLabels), {}, {
'RU': undefined
})
}).should.deep.equal([{
value: 'RU',
label: 'RU'
}, {
value: 'US',
label: 'United States'
}]);
// With "International" (without custom country names).
(0, _phoneInputHelpers.getCountrySelectOptions)({
countries: ['US', 'RU'],
countryNames: defaultLabels,
addInternationalOption: true
}).should.deep.equal([{
label: 'International'
}, {
value: 'RU',
label: 'Russia (Россия)'
}, {
value: 'US',
label: 'United States'
}]);
// With "International" (with custom country names).
(0, _phoneInputHelpers.getCountrySelectOptions)({
countries: ['US', 'RU'],
countryNames: _objectSpread(_objectSpread({}, defaultLabels), {}, {
'RU': 'Russia',
ZZ: 'Intl'
}),
addInternationalOption: true
}).should.deep.equal([{
label: 'Intl'
}, {
value: 'RU',
label: 'Russia'
}, {
value: 'US',
label: 'United States'
}]);
});
it('should generate country select options (custom `compareStrings`)', function () {
var defaultLabels = {
'RU': 'Russia (Россия)',
'US': 'United States',
'ZZ': 'International'
};
// Without custom country names.
(0, _phoneInputHelpers.getCountrySelectOptions)({
countries: ['US', 'RU'],
countryNames: defaultLabels,
// Reverse order.
compareStrings: function compareStrings(a, b) {
return a < b ? 1 : a > b ? -1 : 0;
}
}).should.deep.equal([{
value: 'US',
label: 'United States'
}, {
value: 'RU',
label: 'Russia (Россия)'
}]);
});
// it('should generate country select options (Chinese locale)', () => {
// // https://gitlab.com/catamphetamine/react-phone-number-input/-/issues/20
//
// const defaultLabels = {
// 'RU': 'Russia (Россия)',
// 'US': 'United States',
// 'ZZ': 'International'
// }
//
// // Without custom country names.
// getCountrySelectOptions({
// countries: ['US', 'RU'],
// countryNames: defaultLabels,
// compareStringsLocales: 'zh-CN-u-co-pinyin'
// }).should.deep.equal([{
// value: 'US',
// label: 'United States'
// }, {
// value: 'RU',
// label: 'Russia (Россия)'
// }])
// })
it('should parse phone numbers', function () {
var phoneNumber = (0, _phoneInputHelpers.parsePhoneNumber)('+78005553535', _metadata["default"]);
phoneNumber.country.should.equal('RU');
phoneNumber.nationalNumber.should.equal('8005553535');
// No `value` passed.
expect((0, _phoneInputHelpers.parsePhoneNumber)(null, _metadata["default"])).to.be.undefined;
});
it('should generate national number digits', function () {
var phoneNumber = (0, _phoneInputHelpers.parsePhoneNumber)('+33509758351', _metadata["default"]);
(0, _phoneInputHelpers.generateNationalNumberDigits)(phoneNumber).should.equal('0509758351');
});
it('should migrate parsed input for new country', function () {
// Country didn't change. Return the same digits.
(0, _phoneInputHelpers.getPhoneDigitsForNewCountry)('', {
prevCountry: 'US',
newCountry: 'US',
metadata: _metadata["default"],
useNationalFormat: true
}).should.equal('');
// Country didn't change. Return the same digits.
(0, _phoneInputHelpers.getPhoneDigitsForNewCountry)('123', {
prevCountry: 'US',
newCountry: 'US',
metadata: _metadata["default"],
useNationalFormat: true
}).should.equal('123');
// Country didn't change. Return the same digits.
(0, _phoneInputHelpers.getPhoneDigitsForNewCountry)('+123', {
prevCountry: 'US',
newCountry: 'US',
metadata: _metadata["default"]
}).should.equal('+123');
// No input. Returns `undefined`.
(0, _phoneInputHelpers.getPhoneDigitsForNewCountry)('', {
prevCountry: 'RU',
newCountry: 'US',
metadata: _metadata["default"],
useNationalFormat: true
}).should.equal('');
// Switching from "International" to a country
// to which the phone number already belongs to.
// No changes. Returns `undefined`.
(0, _phoneInputHelpers.getPhoneDigitsForNewCountry)('+18005553535', {
newCountry: 'US',
metadata: _metadata["default"]
}).should.equal('+18005553535');
// Switching between countries. National number. No changes.
(0, _phoneInputHelpers.getPhoneDigitsForNewCountry)('8005553535', {
prevCountry: 'RU',
newCountry: 'US',
metadata: _metadata["default"]
}).should.equal('8005553535');
// Switching from "International" to a country. Calling code not matches. Resets parsed input.
(0, _phoneInputHelpers.getPhoneDigitsForNewCountry)('+78005553535', {
newCountry: 'US',
metadata: _metadata["default"]
}).should.equal('+1');
// Switching from "International" to a country. Calling code matches. Doesn't reset parsed input.
(0, _phoneInputHelpers.getPhoneDigitsForNewCountry)('+12223333333', {
newCountry: 'US',
metadata: _metadata["default"]
}).should.equal('+12223333333');
// Switching countries. International number. Calling code doesn't match.
(0, _phoneInputHelpers.getPhoneDigitsForNewCountry)('+78005553535', {
prevCountry: 'RU',
newCountry: 'US',
metadata: _metadata["default"]
}).should.equal('+1');
// Switching countries. International number. Calling code matches.
(0, _phoneInputHelpers.getPhoneDigitsForNewCountry)('+18005553535', {
prevCountry: 'CA',
newCountry: 'US',
metadata: _metadata["default"]
}).should.equal('+18005553535');
// Switching countries. International number.
// Country calling code is longer than the amount of digits available.
(0, _phoneInputHelpers.getPhoneDigitsForNewCountry)('+99', {
prevCountry: 'KG',
newCountry: 'US',
metadata: _metadata["default"]
}).should.equal('+1');
// Switching countries. International number. No such country code.
(0, _phoneInputHelpers.getPhoneDigitsForNewCountry)('+99', {
prevCountry: 'KG',
newCountry: 'US',
metadata: _metadata["default"]
}).should.equal('+1');
// Switching to "International". National number.
(0, _phoneInputHelpers.getPhoneDigitsForNewCountry)('8800555', {
prevCountry: 'RU',
metadata: _metadata["default"]
}).should.equal('+7800555');
// Switching to "International". No national (significant) number digits entered.
(0, _phoneInputHelpers.getPhoneDigitsForNewCountry)('8', {
prevCountry: 'RU',
metadata: _metadata["default"]
// }).should.equal('')
}).should.equal('+7');
// Switching to "International". International number. No changes.
(0, _phoneInputHelpers.getPhoneDigitsForNewCountry)('+78005553535', {
prevCountry: 'RU',
metadata: _metadata["default"]
}).should.equal('+78005553535');
// Prefer national format. Country matches. Leaves the "national (significant) number".
(0, _phoneInputHelpers.getPhoneDigitsForNewCountry)('+78005553535', {
newCountry: 'RU',
metadata: _metadata["default"],
useNationalFormat: true
}).should.equal('8005553535');
// Prefer national format. Country doesn't match, but country calling code does. Leaves the "national (significant) number".
(0, _phoneInputHelpers.getPhoneDigitsForNewCountry)('+12133734253', {
newCountry: 'CA',
metadata: _metadata["default"],
useNationalFormat: true
}).should.equal('2133734253');
// Prefer national format. Country doesn't match, neither does country calling code. Clears the value.
(0, _phoneInputHelpers.getPhoneDigitsForNewCountry)('+78005553535', {
newCountry: 'US',
metadata: _metadata["default"],
useNationalFormat: true
}).should.equal('');
// Force international format. `phoneDigits` is empty. From no country to a country.
(0, _phoneInputHelpers.getPhoneDigitsForNewCountry)(null, {
newCountry: 'US',
metadata: _metadata["default"],
useNationalFormat: false
}).should.equal('+1');
// Force international format. `phoneDigits` is not empty. From a country to a country with the same calling code.
(0, _phoneInputHelpers.getPhoneDigitsForNewCountry)('+1222', {
prevCountry: 'CA',
newCountry: 'US',
metadata: _metadata["default"]
}).should.equal('+1222');
// Force international format. `phoneDigits` is not empty. From a country to a country with another calling code.
(0, _phoneInputHelpers.getPhoneDigitsForNewCountry)('+1222', {
prevCountry: 'CA',
newCountry: 'RU',
metadata: _metadata["default"]
}).should.equal('+7');
// Force international format. `phoneDigits` is not empty. From no country to a country.
(0, _phoneInputHelpers.getPhoneDigitsForNewCountry)('+1222', {
newCountry: 'US',
metadata: _metadata["default"]
}).should.equal('+1222');
// `newCountry` is `undefined`.
// `phoneDigits` are `undefined`.
// `useNationalFormat` is `undefined`.
(0, _phoneInputHelpers.getPhoneDigitsForNewCountry)(undefined, {
prevCountry: 'US',
metadata: _metadata["default"]
}).should.equal('');
});
it('should format phone number in e164', function () {
// No number.
expect((0, _phoneInputHelpers.e164)()).to.be.undefined;
// International number. Just a '+' sign.
expect((0, _phoneInputHelpers.e164)('+')).to.be.undefined;
// International number.
(0, _phoneInputHelpers.e164)('+7800', null, _metadata["default"]).should.equal('+7800');
// National number. Without country.
expect((0, _phoneInputHelpers.e164)('8800', null, _metadata["default"])).to.be.undefined;
// National number. With country. Just national prefix.
// expect(e164('8', 'RU', metadata)).to.be.undefined
(0, _phoneInputHelpers.e164)('8', 'RU', _metadata["default"]).should.equal('+7');
// National number. With country.
(0, _phoneInputHelpers.e164)('8800', 'RU', _metadata["default"]).should.equal('+7800');
});
it('should trim the phone number if it exceeds the maximum length', function () {
// // No number.
// expect(trimNumber()).to.be.undefined
// Empty number.
expect((0, _phoneInputHelpers.trimNumber)('', 'RU', _metadata["default"])).to.equal('');
// // International number. Without country.
// trimNumber('+780055535351').should.equal('+780055535351')
// // National number. Without country.
// trimNumber('880055535351', null).should.equal('880055535351')
// National number. Doesn't exceed the maximum length.
(0, _phoneInputHelpers.trimNumber)('2135553535', 'US', _metadata["default"]).should.equal('2135553535');
// National number. Exceeds the maximum length.
(0, _phoneInputHelpers.trimNumber)('21355535351', 'US', _metadata["default"]).should.equal('2135553535');
// International number. Doesn't exceed the maximum length.
(0, _phoneInputHelpers.trimNumber)('+12135553535', 'US', _metadata["default"]).should.equal('+12135553535');
// International number. Exceeds the maximum length.
(0, _phoneInputHelpers.trimNumber)('+121355535351', 'US', _metadata["default"]).should.equal('+12135553535');
});
it('should get country when inputting a national phone number for +1 calling code (`defaultCountry`)', function () {
// Issue:
// https://gitlab.com/catamphetamine/react-phone-number-input/-/issues/228#note_1888308944
// Starts inputting a phone number for default country `US`,
// but then input value becomes `3107385` which is considered valid for `CA` country,
// as per Google's metadata.
(0, _phoneInputHelpers.onPhoneDigitsChange)('3107385', {
prevPhoneDigits: '310738',
country: 'US',
defaultCountry: 'US',
latestCountrySelectedByUser: undefined,
countryRequired: false,
getAnyCountry: function getAnyCountry() {
return 'RU';
},
international: undefined,
metadata: _metadata["default"]
}).should.deep.equal({
phoneDigits: '3107385',
country: 'CA',
value: '+13107385'
});
// Continues inputting the phone number for default country `US`,
// and the input value becomes `31073850` which is no longer considered valid for `CA` country,
// so it should switch the country back to `US`.
(0, _phoneInputHelpers.onPhoneDigitsChange)('31073850', {
prevPhoneDigits: '3107385',
country: 'CA',
defaultCountry: 'US',
latestCountrySelectedByUser: undefined,
countryRequired: false,
getAnyCountry: function getAnyCountry() {
return 'RU';
},
international: undefined,
metadata: _metadata["default"]
}).should.deep.equal({
phoneDigits: '31073850',
country: 'US',
value: '+131073850'
});
});
it('should get country when inputting a national phone number for +1 calling code (`latestCountrySelectedByUser`)', function () {
// Issue:
// https://gitlab.com/catamphetamine/react-phone-number-input/-/issues/228#note_1888308944
// Starts inputting a phone number for default country `US`,
// but then input value becomes `3107385` which is considered valid for `CA` country,
// as per Google's metadata.
(0, _phoneInputHelpers.onPhoneDigitsChange)('3107385', {
prevPhoneDigits: '310738',
country: 'US',
defaultCountry: undefined,
latestCountrySelectedByUser: 'US',
countryRequired: false,
getAnyCountry: function getAnyCountry() {
return 'RU';
},
international: undefined,
metadata: _metadata["default"]
}).should.deep.equal({
phoneDigits: '3107385',
country: 'CA',
value: '+13107385'
});
// Continues inputting the phone number for default country `US`,
// and the input value becomes `31073850` which is no longer considered valid for `CA` country,
// so it should switch the country back to `US`.
(0, _phoneInputHelpers.onPhoneDigitsChange)('31073850', {
prevPhoneDigits: '3107385',
country: 'CA',
defaultCountry: undefined,
latestCountrySelectedByUser: 'US',
countryRequired: false,
getAnyCountry: function getAnyCountry() {
return 'RU';
},
international: undefined,
metadata: _metadata["default"]
}).should.deep.equal({
phoneDigits: '31073850',
country: 'US',
value: '+131073850'
});
});
it('should get country for partial E.164 number', function () {
// Just a '+' sign.
// Early return.
(0, _phoneInputHelpers.getCountryForPartialE164Number)('+', {
country: 'RU',
countries: ['US', 'RU'],
metadata: _metadata["default"]
}).should.equal('RU');
// Just a '+' sign.
// Early return.
expect((0, _phoneInputHelpers.getCountryForPartialE164Number)('+', {
countries: ['US', 'RU'],
metadata: _metadata["default"]
})).to.be.undefined;
// A country can be derived.
(0, _phoneInputHelpers.getCountryForPartialE164Number)('+78005553535', {
countries: ['US', 'RU'],
metadata: _metadata["default"]
}).should.equal('RU');
// A country can be derived.
// But that country is not allowed.
expect((0, _phoneInputHelpers.getCountryForPartialE164Number)('+78005553535', {
countries: ['US'],
metadata: _metadata["default"]
})).to.be.undefined;
// A country can't be derived yet.
// And the currently selected country does fit the number.
// And the country is not ambiguous.
(0, _phoneInputHelpers.getCountryForPartialE164Number)('+33', {
country: 'FR',
countries: ['FR', 'RU'],
metadata: _metadata["default"]
}).should.equal('FR');
// A country can't be derived yet.
// And the currently selected country does fit the number.
// And the country is ambiguous.
expect((0, _phoneInputHelpers.getCountryForPartialE164Number)('+7', {
country: 'RU',
countries: ['RU'],
metadata: _metadata["default"]
})).to.be.undefined;
// A country can't be derived yet.
// And the currently selected country does fit the number.
// And the country is ambiguous.
// But some country is required to be selected.
(0, _phoneInputHelpers.getCountryForPartialE164Number)('+7', {
country: 'RU',
countries: ['RU'],
required: true,
metadata: _metadata["default"]
}).should.equal('RU');
// A country can't be derived yet.
// And the currently selected country does fit the number.
// And the country is ambiguous.
// And the user has manually selected that country.
(0, _phoneInputHelpers.getCountryForPartialE164Number)('+7', {
country: 'RU',
countries: ['RU'],
latestCountrySelectedByUser: 'RU',
metadata: _metadata["default"]
}).should.equal('RU');
// A country can't be derived yet.
// And the currently selected country does fit the number.
// And the country is ambiguous.
// And the user has manually selected some country
// but that country doesn't fit the number.
expect((0, _phoneInputHelpers.getCountryForPartialE164Number)('+7', {
country: 'RU',
countries: ['RU'],
latestCountrySelectedByUser: 'FR',
metadata: _metadata["default"]
})).to.be.undefined;
// A country can't be derived yet.
// But the currently selected country does fit the number.
// And the country is ambiguous.
// And the country is a default one.
(0, _phoneInputHelpers.getCountryForPartialE164Number)('+7', {
country: 'RU',
countries: ['RU'],
defaultCountry: 'RU',
metadata: _metadata["default"]
}).should.equal('RU');
// A country can't be derived yet.
// And the currently selected country does fit the number.
// And the country is ambiguous.
// And there is some default country
// but that country doesn't fit the number.
expect((0, _phoneInputHelpers.getCountryForPartialE164Number)('+7', {
country: 'RU',
countries: ['RU'],
defaultCountry: 'FR',
metadata: _metadata["default"]
})).to.be.undefined;
// A country can't be derived yet.
// And the currently selected country doesn't fit the number.
expect((0, _phoneInputHelpers.getCountryForPartialE164Number)('+7', {
country: 'FR',
countries: ['FR', 'RU'],
metadata: _metadata["default"]
})).to.be.undefined;
// A country can't be derived yet.
// And the currently selected country doesn't fit the number.
expect((0, _phoneInputHelpers.getCountryForPartialE164Number)('+12', {
country: 'FR',
countries: ['FR', 'US'],
metadata: _metadata["default"]
})).to.be.undefined;
// A country can't be derived yet.
// And the currently selected country doesn't fit the number.
// Bit "International" option is not available
// so some country is required to be selected.
(0, _phoneInputHelpers.getCountryForPartialE164Number)('+7', {
country: 'FR',
countries: ['FR', 'RU'],
required: true,
metadata: _metadata["default"]
}).should.equal('FR');
// A country can't be derived yet.
// And the currently selected country doesn't fit the number.
// Bit "International" option is not available
// so some country is required to be selected.
(0, _phoneInputHelpers.getCountryForPartialE164Number)('+12', {
country: 'FR',
countries: ['FR', 'US'],
required: true,
metadata: _metadata["default"]
}).should.equal('FR');
});
it('should get country from possibly incomplete international phone number', function () {
// // `001` country calling code.
// // Non-geographic numbering plan.
// expect(getCountryFromPossiblyIncompleteInternationalPhoneNumber('+800', metadata)).to.be.undefined
// Country can be derived.
(0, _phoneInputHelpers.getCountryFromPossiblyIncompleteInternationalPhoneNumber)('+33', _metadata["default"]).should.equal('FR');
// Country can't be derived yet.
expect((0, _phoneInputHelpers.getCountryFromPossiblyIncompleteInternationalPhoneNumber)('+12', _metadata["default"])).to.be.undefined;
});
it('should compare strings', function () {
(0, _phoneInputHelpers.compareStrings)('aa', 'ab').should.equal(-1);
(0, _phoneInputHelpers.compareStrings)('aa', 'aa').should.equal(0);
(0, _phoneInputHelpers.compareStrings)('aac', 'aab').should.equal(1);
});
it('should strip country calling code from a number', function () {
// Number is longer than country calling code prefix.
(0, _phoneInputHelpers.stripCountryCallingCode)('+7800', 'RU', _metadata["default"]).should.equal('800');
// Number is shorter than (or equal to) country calling code prefix.
(0, _phoneInputHelpers.stripCountryCallingCode)('+3', 'FR', _metadata["default"]).should.equal('');
(0, _phoneInputHelpers.stripCountryCallingCode)('+7', 'FR', _metadata["default"]).should.equal('');
// `country` doesn't fit the actual `number`.
// Iterates through all available country calling codes.
(0, _phoneInputHelpers.stripCountryCallingCode)('+7800', 'FR', _metadata["default"]).should.equal('800');
// No `country`.
// And the calling code doesn't belong to any country.
(0, _phoneInputHelpers.stripCountryCallingCode)('+999', null, _metadata["default"]).should.equal('');
});
it('should get national significant number part', function () {
// International number.
(0, _phoneInputHelpers.getNationalSignificantNumberDigits)('+7800555', null, _metadata["default"]).should.equal('800555');
// International number.
// No national (significant) number digits.
expect((0, _phoneInputHelpers.getNationalSignificantNumberDigits)('+', null, _metadata["default"])).to.be.undefined;
expect((0, _phoneInputHelpers.getNationalSignificantNumberDigits)('+7', null, _metadata["default"])).to.be.undefined;
// National number.
(0, _phoneInputHelpers.getNationalSignificantNumberDigits)('8800555', 'RU', _metadata["default"]).should.equal('800555');
// National number.
// No national (significant) number digits.
expect((0, _phoneInputHelpers.getNationalSignificantNumberDigits)('8', 'RU', _metadata["default"])).to.be.undefined;
expect((0, _phoneInputHelpers.getNationalSignificantNumberDigits)('', 'RU', _metadata["default"])).to.be.undefined;
});
it('should determine of a number could belong to a country', function () {
// Matching.
(0, _phoneInputHelpers.couldNumberBelongToCountry)('+7800', 'RU', _metadata["default"]).should.equal(true);
// First digit already not matching.
(0, _phoneInputHelpers.couldNumberBelongToCountry)('+7800', 'FR', _metadata["default"]).should.equal(false);
// First digit matching, second - not matching.
(0, _phoneInputHelpers.couldNumberBelongToCountry)('+33', 'AM', _metadata["default"]).should.equal(false);
// Number is shorter than country calling code.
(0, _phoneInputHelpers.couldNumberBelongToCountry)('+99', 'KG', _metadata["default"]).should.equal(true);
});
it('should handle phone digits change (should choose new "value" based on phone digits)', function () {
(0, _phoneInputHelpers.onPhoneDigitsChange)('+', {
metadata: _metadata["default"]
}).should.deep.equal({
phoneDigits: '+',
country: undefined,
value: undefined
});
(0, _phoneInputHelpers.onPhoneDigitsChange)('+', {
metadata: _metadata["default"],
countryRequired: true,
getAnyCountry: function getAnyCountry() {
return 'US';
}
}).should.deep.equal({
phoneDigits: '+',
country: 'US',
value: undefined
});
(0, _phoneInputHelpers.onPhoneDigitsChange)('+7', {
metadata: _metadata["default"]
}).should.deep.equal({
phoneDigits: '+7',
country: undefined,
value: '+7'
});
(0, _phoneInputHelpers.onPhoneDigitsChange)('+7', {
metadata: _metadata["default"],
country: 'RU'
}).should.deep.equal({
phoneDigits: '+7',
country: 'RU',
value: undefined
});
(0, _phoneInputHelpers.onPhoneDigitsChange)('+78', {
metadata: _metadata["default"],
country: 'RU'
}).should.deep.equal({
phoneDigits: '+78',
country: 'RU',
value: '+78'
});
});
it('should handle phone digits change', function () {
// Doesn't really support passing an `undefined` value.
// I dunno why doesn't it throw an error here.
// Anyway, since this test already existed, I didn't remove it.
(0, _phoneInputHelpers.onPhoneDigitsChange)(undefined, {
country: 'RU',
metadata: _metadata["default"]
}).should.deep.equal({
phoneDigits: undefined,
country: 'RU',
value: undefined
});
(0, _phoneInputHelpers.onPhoneDigitsChange)('', {
metadata: _metadata["default"]
}).should.deep.equal({
phoneDigits: '',
country: undefined,
value: undefined
});
(0, _phoneInputHelpers.onPhoneDigitsChange)('1213', {
metadata: _metadata["default"]
}).should.deep.equal({
phoneDigits: '+1213',
country: undefined,
value: '+1213'
});
(0, _phoneInputHelpers.onPhoneDigitsChange)('+1213', {
metadata: _metadata["default"]
}).should.deep.equal({
phoneDigits: '+1213',
country: undefined,
value: '+1213'
});
// Will reset an automatically selected country when it's ambiguous.
(0, _phoneInputHelpers.onPhoneDigitsChange)('213', {
country: 'US',
metadata: _metadata["default"]
}).should.deep.equal({
phoneDigits: '213',
country: undefined,
value: '+1213'
});
// Won't reset a default selected country when it's ambiguous.
(0, _phoneInputHelpers.onPhoneDigitsChange)('213', {
country: 'US',
defaultCountry: 'US',
metadata: _metadata["default"]
}).should.deep.equal({
phoneDigits: '213',
country: 'US',
value: '+1213'
});
// Won't reset a manually selected country when it's ambiguous.
(0, _phoneInputHelpers.onPhoneDigitsChange)('213', {
country: 'US',
latestCountrySelectedByUser: 'US',
metadata: _metadata["default"]
}).should.deep.equal({
phoneDigits: '213',
country: 'US',
value: '+1213'
});
// When inputting a valid number for another country
// it should switch to that other country.
(0, _phoneInputHelpers.onPhoneDigitsChange)('+78005553535', {
country: 'US',
defaultCountry: 'US',
metadata: _metadata["default"]
}).should.deep.equal({
phoneDigits: '+78005553535',
country: 'RU',
value: '+78005553535'
});
// Won't reset an already selected default country when it is ambiguous.
// Full number entered.
(0, _phoneInputHelpers.onPhoneDigitsChange)('+15555555555', {
country: 'US',
defaultCountry: 'US',
metadata: _metadata["default"]
}).should.deep.equal({
phoneDigits: '+15555555555',
country: 'US',
value: '+15555555555'
});
// Won't reset an already manually selected country when it is ambiguous.
// Full number entered.
(0, _phoneInputHelpers.onPhoneDigitsChange)('+15555555555', {
country: 'US',
latestCountrySelectedByUser: 'US',
metadata: _metadata["default"]
}).should.deep.equal({
phoneDigits: '+15555555555',
country: 'US',
value: '+15555555555'
});
// Will reset an automatically selected country when it is ambiguous.
// Full number entered.
(0, _phoneInputHelpers.onPhoneDigitsChange)('+15555555555', {
country: 'US',
metadata: _metadata["default"]
}).should.deep.equal({
phoneDigits: '+15555555555',
country: undefined,
value: '+15555555555'
});
// Should reset the country if it has likely been automatically
// selected based on international phone number input,
// and the user decides to erase all input,
// and the country neither was selected manually by either not it is a default one.
(0, _phoneInputHelpers.onPhoneDigitsChange)('', {
prevPhoneDigits: '+78005553535',
country: 'RU',
metadata: _metadata["default"]
}).should.deep.equal({
phoneDigits: '',
country: undefined,
value: undefined
});
// Should reset the country if it has likely been automatically
// selected based on international phone number input,
// and the user decides to erase all input,
// and the country neither was selected manually by either not it is a default one.
// Should reset the country to the default one.
(0, _phoneInputHelpers.onPhoneDigitsChange)('', {
prevPhoneDigits: '+78005553535',
country: 'RU',
defaultCountry: 'US',
metadata: _metadata["default"]
}).should.deep.equal({
phoneDigits: '',
country: 'US',
value: undefined
});
// Should reset the country if it has likely been automatically
// selected based on international phone number input
// and the user decides to erase all input up to the `+` sign.
(0, _phoneInputHelpers.onPhoneDigitsChange)('+', {
prevPhoneDigits: '+78005553535',
country: 'RU',
metadata: _metadata["default"]
}).should.deep.equal({
phoneDigits: '+',
country: undefined,
value: undefined
});
});
it('should handle phone digits change (limitMaxLength: true)', function () {
(0, _phoneInputHelpers.onPhoneDigitsChange)('21337342530', {
country: 'US',
limitMaxLength: true,
metadata: _metadata["default"]
}).should.deep.equal({
phoneDigits: '2133734253',
country: 'US',
value: '+12133734253'
});
(0, _phoneInputHelpers.onPhoneDigitsChange)('+121337342530', {
country: 'US',
limitMaxLength: true,
metadata: _metadata["default"]
}).should.deep.equal({
phoneDigits: '+12133734253',
country: 'US',
value: '+12133734253'
});
// This case is intentionally ignored to simplify the code.
(0, _phoneInputHelpers.onPhoneDigitsChange)('+121337342530', {
limitMaxLength: true,
metadata: _metadata["default"]
}).should.deep.equal({
// phoneDigits: '+12133734253',
// country: 'US',
// value: '+12133734253'
phoneDigits: '+121337342530',
country: undefined,
value: '+121337342530'
});
});
it('should handle phone digits change (`international: true`)', function () {
// Shouldn't set `country` to `defaultCountry`
// when erasing parsed input starting with a `+`
// when `international` is `true`.
(0, _phoneInputHelpers.onPhoneDigitsChange)('', {
prevPhoneDigits: '+78005553535',
country: 'RU',
defaultCountry: 'US',
international: true,
metadata: _metadata["default"]
}).should.deep.equal({
phoneDigits: '',
country: undefined,
value: undefined
});
// Should support forcing international phone number input format.
(0, _phoneInputHelpers.onPhoneDigitsChange)('2', {
prevPhoneDigits: '+78005553535',
country: 'RU',
international: true,
metadata: _metadata["default"]
}).should.deep.equal({
phoneDigits: '+2',
country: undefined,
value: '+2'
});
});
it('should handle phone digits change (`international: true` and `countryCallingCodeEditable: false`) (reset incompatible international input)', function () {
// With `country`.
(0, _phoneInputHelpers.onPhoneDigitsChange)('+1', {
prevPhoneDigits: '+78005553535',
country: 'RU',
international: true,
countryCallingCodeEditable: false,
metadata: _metadata["default"]
}).should.deep.equal({
phoneDigits: '+7',
country: 'RU',
value: undefined
});
// Without `country`.
// Not possible because passing `countryCallingCodeEditable: false` flag
// automatically means that some country calling code is specified
// meaning that there is a `country`.
// Still, test coverage requires the "else path" to be covered.
(0, _phoneInputHelpers.onPhoneDigitsChange)('+1', {
prevPhoneDigits: '+78005553535',
country: undefined,
international: true,
countryCallingCodeEditable: false,
metadata: _metadata["default"]
}).should.deep.equal({
phoneDigits: '+1',
country: undefined,
value: '+1'
});
});
it('should handle phone digits change (`international: true` and `countryCallingCodeEditable: false`) (append national input)', function () {
(0, _phoneInputHelpers.onPhoneDigitsChange)('8', {
prevPhoneDigits: '+78005553535',
country: 'RU',
international: true,
countryCallingCodeEditable: false,
metadata: _metadata["default"]
}).should.deep.equal({
phoneDigits: '+78',
country: 'RU',
value: '+78'
});
});
it('should handle phone digits change (`international: true` and `countryCallingCodeEditable: false`) (compatible input)', function () {
(0, _phoneInputHelpers.onPhoneDigitsChange)('+7', {
prevPhoneDigits: '+78005553535',
country: 'RU',
international: true,
countryCallingCodeEditable: false,
metadata: _metadata["default"]
}).should.deep.equal({
phoneDigits: '+7',
country: 'RU',
value: undefined
});
});
it('should handle phone digits change (`international: false`)', function () {
var onChange = function onChange(phoneDigits, prevPhoneDigits, country, rest) {
return (0, _phoneInputHelpers.onPhoneDigitsChange)(phoneDigits, _objectSpread(_objectSpread({}, rest), {}, {
prevPhoneDigits: prevPhoneDigits,
country: country,
international: false,
metadata: _metadata["default"]
}));
};
// `phoneDigits` in international format.
// Just country calling code.
onChange('+7', '', 'RU').should.deep.equal({
phoneDigits: '',
country: 'RU',
value: undefined
});
// `phoneDigits` in international format.
// Country calling code and first digit.
// (which is assumed a "national prefix").
// Reset an automatically selected country.
onChange('+78', '', 'RU').should.deep.equal({
phoneDigits: '8',
country: undefined,
// value: undefined
value: '+7'
});
// `phoneDigits` in international format.
// Country calling code and first digit.
// (which is assumed a "national prefix").
// Won't reset a manually selected country.
onChange('+78', '', 'RU', {
latestCountrySelectedByUser: 'RU'
}).should.deep.equal({
phoneDigits: '8',
country: 'RU',
// value: undefined
value: '+7'
});
// `phoneDigits` in international format.
// Country calling code and first digit.
// (which is assumed a "national prefix").
// Won't reset an automatically selected default country.
onChange('+78', '', 'RU', {
defaultCountry: 'RU'
}).should.deep.equal({
phoneDigits: '8',
country: 'RU',
// value: undefined
value: '+7'
});
// `phoneDigits` in international format.
// Country calling code and first two digits.
// Reset an automatically selected country.
onChange('+121', '', 'US').should.deep.equal({
phoneDigits: '21',
country: undefined,
value: '+121'
});
// `phoneDigits` in international format.
// Country calling code and first two digits.
// Won't reset a manually selected country.
onChange('+121', '', 'US', {
latestCountrySelectedByUser: 'US'
}).should.deep.equal({
phoneDigits: '21',
country: 'US',
value: '+121'
});
// `phoneDigits` in international format.
// Country calling code and first two digits.
// Won't reset an automatically selected default country.
onChange('+121', '', 'US', {
defaultCountry: 'US'
}).should.deep.equal({
phoneDigits: '21',
country: 'US',
value: '+121'
});
// `phoneDigits` in international format.
onChange('+78005553535', '', 'RU').should.deep.equal({
phoneDigits: '88005553535',
country: 'RU',
value: '+78005553535'
});
// `phoneDigits` in international format.
// Another country: just trims the `+`.
// Reset an automatically selected country.
onChange('+78005553535', '', 'US').should.deep.equal({
phoneDigits: '78005553535',
country: undefined,
value: '+178005553535'
});
// `phoneDigits` in international format.
// Another country: just trims the `+`.
// Won't reset a manually selected country.
onChange('+78005553535', '', 'US', {
latestCountrySelectedByUser: 'US'
}).should.deep.equal({
phoneDigits: '78005553535',
country: 'US',
value: '+178005553535'
});
// `phoneDigits` in international format.
// Another country: just trims the `+`.
// Won't reset an automatically selected default country.
onChange('+78005553535', '', 'US', {
defaultCountry: 'US'
}).should.deep.equal({
phoneDigits: '78005553535',
country: 'US',
value: '+178005553535'
});
// `phoneDigits` in national format.
onChange('88005553535', '', 'RU').should.deep.equal({
phoneDigits: '88005553535',
country: 'RU',
value: '+78005553535'
});
// `phoneDigits` in national format.
onChange('88005553535', '8800555353', 'RU').should.deep.equal({
phoneDigits: '88005553535',
country: 'RU',
value: '+78005553535'
});
// Empty `phoneDigits`.
onChange('', '88005553535', 'RU').should.deep.equal({
phoneDigits: '',
country: 'RU',
value: undefined
});
});
it('should handle phone digits change (`international: false` and no country selected)', function () {
// If `international` is `false` then it means that
// "International" option should not be available,
// so it doesn't handle the cases when it is available.
var onChange = function onChange(phoneDigits) {
return (0, _phoneInputHelpers.onPhoneDigitsChange)(phoneDigits, {
prevPhoneDigits: '',
international: false,
metadata: _metadata["default"]
});
};
// `phoneDigits` in international format.
// No country calling code.
onChange('+').should.deep.equal({
phoneDigits: '+',
country: undefined,
value: undefined
});
// `phoneDigits` in international format.
// Just country calling code.
onChange('+7').should.deep.equal({
phoneDigits: '+7',
country: undefined,
value: '+7'
});
// `phoneDigits` in international format.
// Country calling code and first digit.
// (which is assumed a "national prefix").
onChange('+78').should.deep.equal({
phoneDigits: '8',
country: 'RU',
// value: undefined
value: '+7'
});
// `phoneDigits` in international format.
// Country calling code and first two digits.
onChange('+3311').should.deep.equal({
phoneDigits: '11',
country: 'FR',
value: '+3311'
});
// `phoneDigits` in international format.
// Full number.
onChange('+78005553535').should.deep.equal({
phoneDigits: '88005553535',
country: 'RU',
value: '+78005553535'
});
});
it('should get initial parsed input', function () {
(0, _phoneInputHelpers.getInitialPhoneDigits)({
value: '+78005553535',
defaultCountry: 'RU',
international: false,
metadata: _metadata["default"]
}).should.equal('+78005553535');
(0, _phoneInputHelpers.getInitialPhoneDigits)({
value: '+78005553535',
defaultCountry: 'RU',
international: true,
metadata: _metadata["default"]
}).should.equal('+78005553535');
(0, _phoneInputHelpers.getInitialPhoneDigits)({
value: undefined,
defaultCountry: 'RU',
international: true,
metadata: _metadata["default"]
}).should.equal('+7');
expect((0, _phoneInputHelpers.getInitialPhoneDigits)({
value: undefined,
defaultCountry: 'RU',
international: false,
metadata: _metadata["default"]
})).to.be.undefined;
expect((0, _phoneInputHelpers.getInitialPhoneDigits)({
value: undefined,
international: false,
metadata: _metadata["default"]
})).to.be.undefined;
});
it('should get initial parsed input (has `phoneNumber` that has `country`)', function () {
var phoneNumber = (0, _phoneInputHelpers.parsePhoneNumber)('+78005553535', _metadata["default"]);
(0, _phoneInputHelpers.getInitialPhoneDigits)({
value: phoneNumber.number,
defaultCountry: 'RU',
useNationalFormat: true,
phoneNumber: phoneNumber,
metadata: _metadata["default"]
}).should.equal('88005553535');
});
it('should get initial parsed input (has `phoneNumber` that has no `country`)', function () {
var phoneNumber = (0, _phoneInputHelpers.parsePhoneNumber)('+870773111632', _metadata["default"]);
(0, _phoneInputHelpers.getInitialPhoneDigits)({
value: phoneNumber.number,
defaultCountry: 'RU',
useNationalFormat: true,
phoneNumber: phoneNumber,
metadata: _metadata["default"]
}).should.equal('+870773111632');
});
});
//# sourceMappingURL=phoneInputHelpers.test.js.map