Skip to content

Commit

Permalink
Merge pull request #27257 from software-mansion-labs/ts-migration/kow…
Browse files Browse the repository at this point in the history
…czarz/login-utils

[TS migration] Migrate 'LoginUtils.js' lib to TypeScript
  • Loading branch information
AndrewGable authored Oct 3, 2023
2 parents be98ca2 + 8f4994e commit 66e3a29
Show file tree
Hide file tree
Showing 2 changed files with 109 additions and 25 deletions.
38 changes: 13 additions & 25 deletions src/libs/LoginUtils.js → src/libs/LoginUtils.ts
Original file line number Diff line number Diff line change
@@ -1,70 +1,58 @@
import _ from 'underscore';
import Str from 'expensify-common/lib/str';
import Onyx from 'react-native-onyx';
import {PUBLIC_DOMAINS} from 'expensify-common/lib/CONST';
import {parsePhoneNumber} from 'awesome-phonenumber';
import CONST from '../CONST';
import ONYXKEYS from '../ONYXKEYS';

let countryCodeByIP;
let countryCodeByIP: number;
Onyx.connect({
key: ONYXKEYS.COUNTRY_CODE,
callback: (val) => (countryCodeByIP = val || 1),
callback: (val) => (countryCodeByIP = val ?? 1),
});

/**
* Remove the special chars from the phone number
*
* @param {String} phone
* @return {String}
*/
function getPhoneNumberWithoutSpecialChars(phone) {
function getPhoneNumberWithoutSpecialChars(phone: string): string {
return phone.replace(CONST.REGEX.SPECIAL_CHARS_WITHOUT_NEWLINE, '');
}

/**
* Append user country code to the phone number
*
* @param {String} phone
* @return {String}
*/
function appendCountryCode(phone) {
function appendCountryCode(phone: string): string {
return phone.startsWith('+') ? phone : `+${countryCodeByIP}${phone}`;
}

/**
* Check email is public domain or not
*
* @param {String} email
* @return {Boolean}
*/
function isEmailPublicDomain(email) {
const emailDomain = Str.extractEmailDomain(email);
return _.includes(PUBLIC_DOMAINS, emailDomain.toLowerCase(), false);
function isEmailPublicDomain(email: string): boolean {
const emailDomain = Str.extractEmailDomain(email).toLowerCase();
return (PUBLIC_DOMAINS as readonly string[]).includes(emailDomain);
}

/**
* Check if number is valid
* @param {String} values
* @returns {String} - Returns valid phone number formatted
* @returns a valid phone number formatted
*/
function validateNumber(values) {
function validateNumber(values: string): string {
const parsedPhoneNumber = parsePhoneNumber(values);

if (parsedPhoneNumber.possible && Str.isValidPhone(values.slice(0))) {
return parsedPhoneNumber.number.e164 + CONST.SMS.DOMAIN;
return parsedPhoneNumber.number?.e164 + CONST.SMS.DOMAIN;
}

return '';
}

/**
* Check number is valid and attach country code
* @param {String} partnerUserID
* @returns {String} - Returns valid phone number with country code
* @returns a valid phone number with country code
*/
function getPhoneLogin(partnerUserID) {
if (_.isEmpty(partnerUserID)) {
function getPhoneLogin(partnerUserID: string): string {
if (partnerUserID.length === 0) {
return '';
}

Expand Down
96 changes: 96 additions & 0 deletions tests/unit/LoginUtilsTest.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
import Onyx from 'react-native-onyx';
import ONYXKEYS from '../../src/ONYXKEYS';
import waitForBatchedUpdates from '../utils/waitForBatchedUpdates';
import * as LoginUtils from '../../src/libs/LoginUtils';

describe('LoginUtils', () => {
beforeAll(() => {
Onyx.init({
keys: ONYXKEYS,
initialKeyStates: {
[ONYXKEYS.COUNTRY_CODE]: 1,
},
});
return waitForBatchedUpdates();
});

afterEach(() => {
jest.useRealTimers();
Onyx.clear();
});
describe('getPhoneNumberWithoutSpecialChars', () => {
it('Should return valid phone number', () => {
const givenPhone = '+12345678901';
const parsedPhone = LoginUtils.getPhoneNumberWithoutSpecialChars(givenPhone);
expect(parsedPhone).toBe('+12345678901');
});
it('Should return valid phone number even if received special chars', () => {
const givenPhone = '+1(234) 56-7\t8-9 01';
const parsedPhone = LoginUtils.getPhoneNumberWithoutSpecialChars(givenPhone);
expect(parsedPhone).toBe('+12345678901');
});
});
describe('appendCountryCode', () => {
it('Should return valid phone number with country code when received a phone with country code', () => {
const givenPhone = '+12345678901';
const parsedPhone = LoginUtils.appendCountryCode(givenPhone);
expect(parsedPhone).toBe('+12345678901');
});
it('Should return valid phone number with country code when received a phone without country code', () => {
const givenPhone = '2345678901';
const parsedPhone = LoginUtils.appendCountryCode(givenPhone);
expect(parsedPhone).toBe('+12345678901');
});
});
describe('isEmailPublicDomain', () => {
it('Should return true if email is from public domain', () => {
const givenEmail = 'test@gmail.com';
const parsedEmail = LoginUtils.isEmailPublicDomain(givenEmail);
expect(parsedEmail).toBe(true);
});
it('Should return false if email is not from public domain', () => {
const givenEmail = 'test@test.com';
const parsedEmail = LoginUtils.isEmailPublicDomain(givenEmail);
expect(parsedEmail).toBe(false);
});
it("Should return false if provided string isn't email", () => {
const givenEmail = 'test';
const parsedEmail = LoginUtils.isEmailPublicDomain(givenEmail);
expect(parsedEmail).toBe(false);
});
});
describe('validateNumber', () => {
it("Should return valid phone number with '@expensify.sms' suffix if provided phone number is valid", () => {
const givenPhone = '+12345678901';
const parsedPhone = LoginUtils.validateNumber(givenPhone);
expect(parsedPhone).toBe('+12345678901@expensify.sms');
});
it('Should return empty string if provided phone number is not valid', () => {
const givenPhone = '786';
const parsedPhone = LoginUtils.validateNumber(givenPhone);
expect(parsedPhone).toBe('');
});
it('Should return empty string if provided phone number is empty', () => {
const givenPhone = '';
const parsedPhone = LoginUtils.validateNumber(givenPhone);
expect(parsedPhone).toBe('');
});
});
describe('getPhoneLogin', () => {
it('Should return valid phone number with country code if provided phone number is valid and with country code', () => {
const givenPhone = '+12345678901';
const parsedPhone = LoginUtils.getPhoneLogin(givenPhone);
expect(parsedPhone).toBe('+12345678901');
});
it('Should return valid phone number with country code if provided phone number is valid and without country code', () => {
const givenPhone = '2345678901';
const parsedPhone = LoginUtils.getPhoneLogin(givenPhone);
expect(parsedPhone).toBe('+12345678901');
});
it('Should return empty string if provided phone number is empty', () => {
const givenPhone = '';
const parsedPhone = LoginUtils.getPhoneLogin(givenPhone);
expect(parsedPhone).toBe('');
});
});
});

0 comments on commit 66e3a29

Please sign in to comment.