From ea784b5259482df9500db6759a47b5547faef374 Mon Sep 17 00:00:00 2001 From: NJ-2020 Date: Fri, 31 Jan 2025 15:58:55 +0700 Subject: [PATCH 1/2] fix: inconsistent behavior of phone number validation --- src/libs/GetPhysicalCardUtils.ts | 6 +++++- .../settings/Wallet/Card/GetPhysicalCardPhone.tsx | 14 +++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/libs/GetPhysicalCardUtils.ts b/src/libs/GetPhysicalCardUtils.ts index 8dc46204db3c..9ed192b09233 100644 --- a/src/libs/GetPhysicalCardUtils.ts +++ b/src/libs/GetPhysicalCardUtils.ts @@ -1,3 +1,4 @@ +import {Str} from 'expensify-common'; import type {OnyxEntry} from 'react-native-onyx'; import ROUTES from '@src/ROUTES'; import type {Route} from '@src/ROUTES'; @@ -6,16 +7,19 @@ import type {LoginList, PrivatePersonalDetails} from '@src/types/onyx'; import * as LoginUtils from './LoginUtils'; import Navigation from './Navigation/Navigation'; import * as PersonalDetailsUtils from './PersonalDetailsUtils'; +import * as PhoneNumberUtils from './PhoneNumber'; import * as UserUtils from './UserUtils'; function getCurrentRoute(domain: string, privatePersonalDetails: OnyxEntry): Route { const {legalFirstName, legalLastName, phoneNumber} = privatePersonalDetails ?? {}; const address = PersonalDetailsUtils.getCurrentAddress(privatePersonalDetails); + const phoneNumberWithCountryCode = LoginUtils.appendCountryCode(phoneNumber ?? ''); + const parsedPhoneNumber = PhoneNumberUtils.parsePhoneNumber(phoneNumberWithCountryCode); if (!legalFirstName && !legalLastName) { return ROUTES.SETTINGS_WALLET_CARD_GET_PHYSICAL_NAME.getRoute(domain); } - if (!phoneNumber || !LoginUtils.validateNumber(phoneNumber)) { + if (!phoneNumber || !parsedPhoneNumber.possible || !Str.isValidE164Phone(phoneNumberWithCountryCode.slice(0))) { return ROUTES.SETTINGS_WALLET_CARD_GET_PHYSICAL_PHONE.getRoute(domain); } if (!(address?.street && address?.city && address?.state && address?.country && address?.zip)) { diff --git a/src/pages/settings/Wallet/Card/GetPhysicalCardPhone.tsx b/src/pages/settings/Wallet/Card/GetPhysicalCardPhone.tsx index bcb3fe646fff..075bc4a3ff5c 100644 --- a/src/pages/settings/Wallet/Card/GetPhysicalCardPhone.tsx +++ b/src/pages/settings/Wallet/Card/GetPhysicalCardPhone.tsx @@ -1,3 +1,4 @@ +import {Str} from 'expensify-common'; import React from 'react'; import {View} from 'react-native'; import {useOnyx} from 'react-native-onyx'; @@ -8,6 +9,8 @@ import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; import * as LoginUtils from '@libs/LoginUtils'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; +import * as PhoneNumberUtils from '@libs/PhoneNumber'; +import * as ValidationUtils from '@libs/ValidationUtils'; import type {SettingsNavigatorParamList} from '@navigation/types'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; @@ -40,12 +43,17 @@ function GetPhysicalCardPhone({ const errors: OnValidateResult = {}; - if (!LoginUtils.validateNumber(phoneNumberToValidate)) { - errors.phoneNumber = translate('common.error.phoneNumber'); - } else if (!phoneNumberToValidate) { + if (!ValidationUtils.isRequiredFulfilled(phoneNumberToValidate)) { errors.phoneNumber = translate('common.error.fieldRequired'); } + const phoneNumberWithCountryCode = LoginUtils.appendCountryCode(phoneNumberToValidate); + const parsedPhoneNumber = PhoneNumberUtils.parsePhoneNumber(phoneNumberWithCountryCode); + + if (!parsedPhoneNumber.possible || !Str.isValidE164Phone(phoneNumberWithCountryCode.slice(0))) { + errors.phoneNumber = translate('bankAccount.error.phoneNumber'); + } + return errors; }; From 74f19cb394e0d2e9ae37e6e6130971fb6f016dfb Mon Sep 17 00:00:00 2001 From: NJ-2020 Date: Sun, 2 Feb 2025 16:24:33 +0700 Subject: [PATCH 2/2] fix eslint errors --- src/libs/GetPhysicalCardUtils.ts | 20 +++++++++---------- .../Wallet/Card/GetPhysicalCardPhone.tsx | 12 +++++------ 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/libs/GetPhysicalCardUtils.ts b/src/libs/GetPhysicalCardUtils.ts index 9ed192b09233..371077128ff9 100644 --- a/src/libs/GetPhysicalCardUtils.ts +++ b/src/libs/GetPhysicalCardUtils.ts @@ -4,17 +4,17 @@ import ROUTES from '@src/ROUTES'; import type {Route} from '@src/ROUTES'; import type {GetPhysicalCardForm} from '@src/types/form'; import type {LoginList, PrivatePersonalDetails} from '@src/types/onyx'; -import * as LoginUtils from './LoginUtils'; +import {appendCountryCode} from './LoginUtils'; import Navigation from './Navigation/Navigation'; -import * as PersonalDetailsUtils from './PersonalDetailsUtils'; -import * as PhoneNumberUtils from './PhoneNumber'; -import * as UserUtils from './UserUtils'; +import {getCurrentAddress, getFormattedStreet} from './PersonalDetailsUtils'; +import {parsePhoneNumber} from './PhoneNumber'; +import {getSecondaryPhoneLogin} from './UserUtils'; function getCurrentRoute(domain: string, privatePersonalDetails: OnyxEntry): Route { const {legalFirstName, legalLastName, phoneNumber} = privatePersonalDetails ?? {}; - const address = PersonalDetailsUtils.getCurrentAddress(privatePersonalDetails); - const phoneNumberWithCountryCode = LoginUtils.appendCountryCode(phoneNumber ?? ''); - const parsedPhoneNumber = PhoneNumberUtils.parsePhoneNumber(phoneNumberWithCountryCode); + const address = getCurrentAddress(privatePersonalDetails); + const phoneNumberWithCountryCode = appendCountryCode(phoneNumber ?? ''); + const parsedPhoneNumber = parsePhoneNumber(phoneNumberWithCountryCode); if (!legalFirstName && !legalLastName) { return ROUTES.SETTINGS_WALLET_CARD_GET_PHYSICAL_NAME.getRoute(domain); @@ -61,7 +61,7 @@ function setCurrentRoute(currentRoute: string, domain: string, privatePersonalDe */ function getUpdatedDraftValues(draftValues: OnyxEntry, privatePersonalDetails: OnyxEntry, loginList: OnyxEntry): GetPhysicalCardForm { const {legalFirstName, legalLastName, phoneNumber} = privatePersonalDetails ?? {}; - const address = PersonalDetailsUtils.getCurrentAddress(privatePersonalDetails); + const address = getCurrentAddress(privatePersonalDetails); return { /* eslint-disable @typescript-eslint/prefer-nullish-coalescing */ @@ -72,7 +72,7 @@ function getUpdatedDraftValues(draftValues: OnyxEntry, priv addressLine2: draftValues?.addressLine2 || address?.street.split('\n')[1] || '', city: draftValues?.city || address?.city || '', country: draftValues?.country || address?.country || '', - phoneNumber: draftValues?.phoneNumber || phoneNumber || UserUtils.getSecondaryPhoneLogin(loginList) || '', + phoneNumber: draftValues?.phoneNumber || phoneNumber || getSecondaryPhoneLogin(loginList) || '', state: draftValues?.state || address?.state || '', zipPostCode: draftValues?.zipPostCode || address?.zip || '', /* eslint-enable @typescript-eslint/prefer-nullish-coalescing */ @@ -90,7 +90,7 @@ function getUpdatedPrivatePersonalDetails(draftValues: OnyxEntry