@artmajeur/react-native-paper-phone-number-input
Version:
A performant phone number input component for react-native-paper with country picker
53 lines (52 loc) • 2.08 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useCountrySearch = void 0;
var _react = require("react");
var _translatedCountries = _interopRequireDefault(require("../data/translatedCountries"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const removeAccents = str => str.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
const useCountrySearch = ({
searchQuery,
countriesList,
lang
}) => {
return (0, _react.useMemo)(() => {
if (!searchQuery) {
return countriesList;
}
const lowerCaseQuery = removeAccents(searchQuery.toLowerCase());
const filteredAndSorted = countriesList.map(country => {
const translatedName = removeAccents(_translatedCountries.default.getName(country.code, lang)?.toLowerCase() || country.name.toLowerCase());
const lowerCaseCode = country.code.toLowerCase();
const dialCode = country.dialCode;
let score = 0;
if (lowerCaseCode === lowerCaseQuery) {
score = 5; // Exact code match
} else if (dialCode.includes(lowerCaseQuery)) {
score = 4; // Dial code match
} else if (translatedName.startsWith(lowerCaseQuery)) {
score = 3; // Translated name prefix match
} else if (lowerCaseCode.startsWith(lowerCaseQuery)) {
score = 2; // Code prefix match
} else if (translatedName.includes(lowerCaseQuery)) {
score = 1; // Translated name inclusion match
}
return {
...country,
score
};
}).filter(country => country.score > 0).sort((a, b) => {
if (a.score !== b.score) {
return b.score - a.score;
}
const translatedA = _translatedCountries.default.getName(a.code, lang) || a.name;
const translatedB = _translatedCountries.default.getName(b.code, lang) || b.name;
return translatedA.localeCompare(translatedB);
});
return filteredAndSorted;
}, [searchQuery, countriesList, lang]);
};
exports.useCountrySearch = useCountrySearch;
//# sourceMappingURL=useCountrySearch.js.map
;