@blocklet/payment-react
Version:
Reusable react components for payment kit v2
114 lines (113 loc) • 2.96 kB
JavaScript
let phoneUtil = null;
export const getPhoneUtil = async () => {
if (!phoneUtil) {
const result = await import(
/* webpackChunkName: "phone-util" */
"google-libphonenumber"
);
const PhoneNumberUtil = (result.default || result)?.PhoneNumberUtil;
if (!PhoneNumberUtil) {
throw new Error("PhoneNumberUtil not found");
}
phoneUtil = PhoneNumberUtil.getInstance();
}
return phoneUtil;
};
export const validatePhoneNumber = async (phoneNumber) => {
if (!phoneNumber) return true;
try {
let util = null;
try {
util = await getPhoneUtil();
} catch (err) {
const pattern = /^[+]?[(]?[0-9]{3}[)]?[-\s.]?[0-9]{3}[-\s.]?[0-9]{4,6}$/im;
return pattern.test(phoneNumber);
}
const parsed = util.parseAndKeepRawInput(phoneNumber);
return util.isValidNumber(parsed);
} catch (err) {
console.error("Phone validation error:", err);
return false;
}
};
export const formatPhone = (phoneNumber, defaultCountry = "US") => {
if (!phoneNumber || phoneNumber.trim() === "") {
return "";
}
const cleanedNumber = phoneNumber.replace(/[^\d+]/g, "");
if (cleanedNumber.startsWith("+")) {
return cleanedNumber;
}
const COUNTRY_CODES = {
US: "1",
// United States
CA: "1",
// Canada
CN: "86",
// China
HK: "852",
// Hong Kong
IN: "91",
// India
UK: "44",
// United Kingdom
GB: "44",
// United Kingdom
JP: "81",
// Japan
KR: "82",
// South Korea
AU: "61",
// Australia
DE: "49",
// Germany
FR: "33",
// France
IT: "39",
// Italy
ES: "34",
// Spain
BR: "55",
// Brazil
RU: "7",
// Russia
MX: "52",
// Mexico
SG: "65",
// Singapore
AE: "971"
// UAE
};
const COUNTRY_PATTERNS = [
[/^1[3-9]\d{9}$/, "86"],
// China mobile: 11 digits, starts with 1
[/^\d{10}$/, "1"],
// US/Canada: 10 digits
[/^[6-9]\d{9}$/, "91"],
// India: 10 digits, starts with 6-9
[/^0[1-9]\d{8,9}$/, "81"],
// Japan: 10-11 digits, starts with 0
[/^07\d{9}$/, "44"],
// UK mobile: 11 digits, starts with 07
[/^04\d{8}$/, "61"],
// Australia mobile: 10 digits, starts with 04
[/^01[0-9]\d{7,8}$/, "82"],
// Korea mobile: 10-11 digits, starts with 01
[/^[0-9]\d{8}$/, "86"]
// China landline: 9 digits
];
let numberToFormat = cleanedNumber;
if (numberToFormat.startsWith("0")) {
numberToFormat = numberToFormat.substring(1);
}
for (const [pattern, countryCode2] of COUNTRY_PATTERNS) {
if (pattern.test(cleanedNumber)) {
if (cleanedNumber.startsWith("0") && !["1", "86"].includes(countryCode2)) {
return `+${countryCode2}${cleanedNumber.substring(1)}`;
}
return `+${countryCode2}${cleanedNumber}`;
}
}
const countryCode = COUNTRY_CODES[defaultCountry.toUpperCase()] || defaultCountry;
return `+${countryCode}${numberToFormat}`;
};