From 8865fff063687d8a973cd41da20f6394cac973f7 Mon Sep 17 00:00:00 2001 From: DylanDylann Date: Tue, 17 Mar 2026 17:12:41 +0700 Subject: [PATCH 1/3] remove-missing-personal-details-in-reveal-card-action --- src/ROUTES.ts | 8 -- src/SCREENS.ts | 2 - src/languages/de.ts | 2 - src/languages/en.ts | 1 - src/languages/es.ts | 1 - src/languages/fr.ts | 1 - src/languages/it.ts | 1 - src/languages/ja.ts | 1 - src/languages/nl.ts | 1 - src/languages/pl.ts | 1 - src/languages/pt-BR.ts | 1 - src/languages/zh-hans.ts | 1 - ...onalDetailsAndRevealExpensifyCardParams.ts | 16 --- src/libs/API/parameters/index.ts | 1 - src/libs/API/types.ts | 2 - .../ModalStackNavigators/index.tsx | 3 - src/libs/Navigation/linkingConfig/config.ts | 8 -- src/libs/Navigation/types.ts | 8 -- src/libs/PersonalDetailsUtils.ts | 12 --- src/libs/actions/Card.ts | 6 -- src/libs/actions/PersonalDetails.ts | 94 +----------------- .../MissingPersonalDetailsContent.tsx | 16 +-- src/pages/MissingPersonalDetails/index.tsx | 1 - ...pensifyCardMissingDetailsMagicCodePage.tsx | 98 ------------------- .../ExpensifyCardMissingDetailsPage.tsx | 38 ------- .../ExpensifyCardVerifyAccountPage.tsx | 8 -- .../Wallet/ExpensifyCardPage/index.tsx | 32 +----- .../Wallet/TravelCVVPage/TravelCVVPage.tsx | 13 +-- 28 files changed, 16 insertions(+), 361 deletions(-) delete mode 100644 src/libs/API/parameters/SetPersonalDetailsAndRevealExpensifyCardParams.ts delete mode 100644 src/pages/settings/Wallet/ExpensifyCardPage/ExpensifyCardMissingDetailsMagicCodePage.tsx delete mode 100644 src/pages/settings/Wallet/ExpensifyCardPage/ExpensifyCardMissingDetailsPage.tsx diff --git a/src/ROUTES.ts b/src/ROUTES.ts index c1cd30528c31e..a00c6cec4e7c7 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -413,14 +413,6 @@ const ROUTES = { route: 'settings/wallet/card/:cardID/confirm-magic-code', getRoute: (cardID: string) => `settings/wallet/card/${cardID}/confirm-magic-code` as const, }, - SETTINGS_WALLET_CARD_MISSING_DETAILS: { - route: 'settings/wallet/card/:cardID/missing-details', - getRoute: (cardID: string) => `settings/wallet/card/${cardID}/missing-details` as const, - }, - SETTINGS_WALLET_CARD_MISSING_DETAILS_CONFIRM_MAGIC_CODE: { - route: 'settings/wallet/card/:cardID/missing-details/confirm-magic-code', - getRoute: (cardID: string) => `settings/wallet/card/${cardID}/missing-details/confirm-magic-code` as const, - }, SETTINGS_DOMAIN_CARD_DETAIL: { route: 'settings/card/:cardID?', getRoute: (cardID: string) => `settings/card/${cardID}` as const, diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 6c2599a91dc50..258e2a2ece74f 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -182,8 +182,6 @@ const SCREENS = { ROOT: 'Settings_Wallet', DOMAIN_CARD: 'Settings_Wallet_DomainCard', DOMAIN_CARD_CONFIRM_MAGIC_CODE: 'Settings_Wallet_DomainCard_ConfirmMagicCode', - CARD_MISSING_DETAILS: 'Settings_Wallet_Card_MissingDetails', - CARD_MISSING_DETAILS_CONFIRM_MAGIC_CODE: 'Settings_Wallet_Card_MissingDetails_ConfirmMagicCode', TRANSFER_BALANCE: 'Settings_Wallet_Transfer_Balance', CHOOSE_TRANSFER_ACCOUNT: 'Settings_Wallet_Choose_Transfer_Account', IMPORT_TRANSACTIONS: 'Settings_Wallet_Import_Transactions', diff --git a/src/languages/de.ts b/src/languages/de.ts index 56eef0b683adf..9d23c09c23a7a 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -2310,8 +2310,6 @@ const translations: TranslationDeepObject = { validateCardTitle: 'Stellen wir sicher, dass du es bist', enterMagicCode: (contactMethod: string) => `Bitte gib den magischen Code ein, der an ${contactMethod} gesendet wurde, um deine Kartendetails anzusehen. Er sollte innerhalb ein bis zwei Minuten ankommen.`, - missingPrivateDetails: ({missingDetailsLink}: {missingDetailsLink: string}) => - `Bitte füge deine persönlichen Daten hinzu und versuche es dann erneut.`, unexpectedError: 'Beim Abrufen deiner Expensify-Kartendaten ist ein Fehler aufgetreten. Bitte versuche es erneut.', cardFraudAlert: { confirmButtonText: 'Ja, das tue ich', diff --git a/src/languages/en.ts b/src/languages/en.ts index 9e1b3c985c71b..71e1589800245 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -2364,7 +2364,6 @@ const translations = { cardDetailsLoadingFailure: 'An error occurred while loading the card details. Please check your internet connection and try again.', validateCardTitle: "Let's make sure it's you", enterMagicCode: (contactMethod: string) => `Please enter the magic code sent to ${contactMethod} to view your card details. It should arrive within a minute or two.`, - missingPrivateDetails: ({missingDetailsLink}: {missingDetailsLink: string}) => `Please add your personal details, then try again.`, unexpectedError: 'There was an error trying to get your Expensify card details. Please try again.', cardFraudAlert: { confirmButtonText: 'Yes, I do', diff --git a/src/languages/es.ts b/src/languages/es.ts index 28c768351a01a..416d81c35a08c 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -2224,7 +2224,6 @@ const translations: TranslationDeepObject = { cardDetailsLoadingFailure: 'Se ha producido un error al cargar los datos de la tarjeta. Comprueba tu conexión a Internet e inténtalo de nuevo.', validateCardTitle: 'Asegurémonos de que eres tú', enterMagicCode: (contactMethod) => `Introduzca el código mágico enviado a ${contactMethod} para ver los datos de su tarjeta. Debería llegar en un par de minutos.`, - missingPrivateDetails: ({missingDetailsLink}: {missingDetailsLink: string}) => `Por favor, agrega tus datos personales y vuelve a intentarlo.`, unexpectedError: 'Se produjo un error al intentar obtener los detalles de tu tarjeta Expensify. Vuelve a intentarlo.', cardFraudAlert: { confirmButtonText: 'Sí, lo hago', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index e3141cb9aa261..fb463aa1b61c6 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -2317,7 +2317,6 @@ const translations: TranslationDeepObject = { validateCardTitle: 'Vérifions que c’est bien vous', enterMagicCode: (contactMethod: string) => `Veuillez saisir le code magique envoyé à ${contactMethod} pour afficher les détails de votre carte. Il devrait arriver d’ici une à deux minutes.`, - missingPrivateDetails: ({missingDetailsLink}: {missingDetailsLink: string}) => `Veuillez ajouter vos informations personnelles, puis réessayer.`, unexpectedError: 'Une erreur s’est produite lors de la récupération des détails de votre carte Expensify. Veuillez réessayer.', cardFraudAlert: { confirmButtonText: 'Oui, je veux bien', diff --git a/src/languages/it.ts b/src/languages/it.ts index 2814a3f55957f..22f9fae739c0d 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -2307,7 +2307,6 @@ const translations: TranslationDeepObject = { validateCardTitle: 'Verifichiamo che sia davvero tu', enterMagicCode: (contactMethod: string) => `Inserisci il codice magico inviato a ${contactMethod} per visualizzare i dettagli della tua carta. Dovrebbe arrivare entro uno o due minuti.`, - missingPrivateDetails: ({missingDetailsLink}: {missingDetailsLink: string}) => `Per favore aggiungi i tuoi dati personali, quindi riprova.`, unexpectedError: 'Si è verificato un errore durante il recupero dei dettagli della tua carta Expensify. Riprova.', cardFraudAlert: { confirmButtonText: 'Sì, lo voglio', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 1fb0fb5313e16..02eaef657b5ca 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -2292,7 +2292,6 @@ const translations: TranslationDeepObject = { cardDetailsLoadingFailure: 'カード詳細の読み込み中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。', validateCardTitle: 'ご本人確認を行います', enterMagicCode: (contactMethod: string) => `カード情報を表示するには、${contactMethod} に送信されたマジックコードを入力してください。1~2分以内に届きます。`, - missingPrivateDetails: ({missingDetailsLink}: {missingDetailsLink: string}) => `個人情報を追加してから、もう一度お試しください。`, unexpectedError: 'Expensifyカードの詳細を取得中にエラーが発生しました。もう一度お試しください。', cardFraudAlert: { confirmButtonText: 'はい、そうです', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 5bee400ffe6f5..d1bca7c07975e 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -2305,7 +2305,6 @@ const translations: TranslationDeepObject = { validateCardTitle: 'We willen zeker weten dat jij het bent', enterMagicCode: (contactMethod: string) => `Voer de magische code in die naar ${contactMethod} is gestuurd om je kaartgegevens te bekijken. Deze zou binnen één à twee minuten moeten aankomen.`, - missingPrivateDetails: ({missingDetailsLink}: {missingDetailsLink: string}) => `Voeg je persoonlijke gegevens toe en probeer het daarna opnieuw.`, unexpectedError: 'Er is een fout opgetreden bij het ophalen van de gegevens van je Expensify-kaart. Probeer het opnieuw.', cardFraudAlert: { confirmButtonText: 'Ja, dat doe ik', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 3bea0ab6b5ffd..426c5240244da 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -2302,7 +2302,6 @@ const translations: TranslationDeepObject = { cardDetailsLoadingFailure: 'Wystąpił błąd podczas wczytywania szczegółów karty. Sprawdź swoje połączenie internetowe i spróbuj ponownie.', validateCardTitle: 'Upewnijmy się, że to Ty', enterMagicCode: (contactMethod: string) => `Wprowadź magiczny kod wysłany na ${contactMethod}, aby wyświetlić szczegóły karty. Powinien dotrzeć w ciągu minuty lub dwóch.`, - missingPrivateDetails: ({missingDetailsLink}: {missingDetailsLink: string}) => `Dodaj proszę swoje dane osobowe, a następnie spróbuj ponownie.`, unexpectedError: 'Wystąpił błąd podczas pobierania szczegółów Twojej karty Expensify. Spróbuj ponownie.', cardFraudAlert: { confirmButtonText: 'Tak, robię', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index e2c3fb53a3f5f..c630d591d707e 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -2299,7 +2299,6 @@ const translations: TranslationDeepObject = { cardDetailsLoadingFailure: 'Ocorreu um erro ao carregar os detalhes do cartão. Verifique sua conexão com a internet e tente novamente.', validateCardTitle: 'Vamos garantir que é você', enterMagicCode: (contactMethod: string) => `Insira o código mágico enviado para ${contactMethod} para visualizar os detalhes do seu cartão. Ele deve chegar em um ou dois minutos.`, - missingPrivateDetails: ({missingDetailsLink}: {missingDetailsLink: string}) => `Por favor, adicione seus dados pessoais e tente novamente.`, unexpectedError: 'Ocorreu um erro ao tentar obter os detalhes do seu cartão Expensify. Tente novamente.', cardFraudAlert: { confirmButtonText: 'Sim, eu quero', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 96415f4fa273d..998811d1bb05a 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -2255,7 +2255,6 @@ const translations: TranslationDeepObject = { cardDetailsLoadingFailure: '加载卡片详情时出错。请检查您的网络连接,然后重试。', validateCardTitle: '让我们确认一下是你本人', enterMagicCode: (contactMethod: string) => `请输入发送到 ${contactMethod} 的魔法验证码以查看您的卡片详情。验证码应会在一两分钟内送达。`, - missingPrivateDetails: ({missingDetailsLink}: {missingDetailsLink: string}) => `请添加您的个人信息,然后重试。`, unexpectedError: '尝试获取您的 Expensify 卡片详情时出错。请重试。', cardFraudAlert: { confirmButtonText: '是的,我愿意', diff --git a/src/libs/API/parameters/SetPersonalDetailsAndRevealExpensifyCardParams.ts b/src/libs/API/parameters/SetPersonalDetailsAndRevealExpensifyCardParams.ts deleted file mode 100644 index a10bb96bc3059..0000000000000 --- a/src/libs/API/parameters/SetPersonalDetailsAndRevealExpensifyCardParams.ts +++ /dev/null @@ -1,16 +0,0 @@ -type SetPersonalDetailsAndRevealExpensifyCardParams = { - legalFirstName: string; - legalLastName: string; - phoneNumber: string; - addressCity: string; - addressStreet: string; - addressStreet2: string; - addressZip: string; - addressCountry: string; - addressState: string; - dob: string; - validateCode: string; - cardID: number; -}; - -export default SetPersonalDetailsAndRevealExpensifyCardParams; diff --git a/src/libs/API/parameters/index.ts b/src/libs/API/parameters/index.ts index f18688d3cee34..33b54dbe3e73b 100644 --- a/src/libs/API/parameters/index.ts +++ b/src/libs/API/parameters/index.ts @@ -406,7 +406,6 @@ export type {default as SetPersonalCardReimbursableParams} from './SetPersonalCa export type {default as SetCompanyCardExportAccountParams} from './SetCompanyCardExportAccountParams'; export type {default as SetPersonalDetailsAndShipExpensifyCardsParams} from './SetPersonalDetailsAndShipExpensifyCardsParams'; export type {default as SetPersonalDetailsAndShipExpensifyCardsWithPINParams} from './SetPersonalDetailsAndShipExpensifyCardsWithPINParams'; -export type {default as SetPersonalDetailsAndRevealExpensifyCardParams} from './SetPersonalDetailsAndRevealExpensifyCardParams'; export type {default as RequestFeedSetupParams} from './RequestFeedSetupParams'; export type {default as SetInvoicingTransferBankAccountParams} from './SetInvoicingTransferBankAccountParams'; export type {default as ConnectPolicyToQuickBooksDesktopParams} from './ConnectPolicyToQuickBooksDesktopParams'; diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index 536a0c074a276..fe2f74f11cdc1 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -1338,7 +1338,6 @@ const SIDE_EFFECT_REQUEST_COMMANDS = { OPEN_OLD_DOT_LINK: 'OpenOldDotLink', RECONNECT_APP: 'ReconnectApp', REVEAL_EXPENSIFY_CARD_DETAILS: 'RevealExpensifyCardDetails', - SET_PERSONAL_DETAILS_AND_REVEAL_EXPENSIFY_CARD: 'SetPersonalDetailsAndRevealExpensifyCard', TWO_FACTOR_AUTH_VALIDATE: 'TwoFactorAuth_Validate', CONNECT_AS_DELEGATE: 'ConnectAsDelegate', DISCONNECT_AS_DELEGATE: 'DisconnectAsDelegate', @@ -1377,7 +1376,6 @@ type SideEffectRequestCommandParameters = { [SIDE_EFFECT_REQUEST_COMMANDS.AUTHENTICATE_PUSHER]: Parameters.AuthenticatePusherParams; [SIDE_EFFECT_REQUEST_COMMANDS.OPEN_OLD_DOT_LINK]: Parameters.OpenOldDotLinkParams; [SIDE_EFFECT_REQUEST_COMMANDS.REVEAL_EXPENSIFY_CARD_DETAILS]: Parameters.RevealExpensifyCardDetailsParams; - [SIDE_EFFECT_REQUEST_COMMANDS.SET_PERSONAL_DETAILS_AND_REVEAL_EXPENSIFY_CARD]: Parameters.SetPersonalDetailsAndRevealExpensifyCardParams; [SIDE_EFFECT_REQUEST_COMMANDS.GET_MISSING_ONYX_MESSAGES]: Parameters.GetMissingOnyxMessagesParams; [SIDE_EFFECT_REQUEST_COMMANDS.RECONNECT_APP]: Parameters.ReconnectAppParams; [SIDE_EFFECT_REQUEST_COMMANDS.GENERATE_SPOTNANA_TOKEN]: Parameters.GenerateSpotnanaTokenParams; diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index 30d5ba47887e8..d6f991e95f23f 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -421,9 +421,6 @@ const SettingsModalStackNavigator = createModalStackNavigator require('../../../../pages/settings/Wallet/PersonalCardEditNamePage').default, [SCREENS.SETTINGS.WALLET.PERSONAL_CARD_EDIT_TRANSACTION_START_DATE]: () => require('../../../../pages/settings/Wallet/PersonalCardEditTransactionStartDatePage').default, - [SCREENS.SETTINGS.WALLET.CARD_MISSING_DETAILS]: () => require('../../../../pages/settings/Wallet/ExpensifyCardPage/ExpensifyCardMissingDetailsPage').default, - [SCREENS.SETTINGS.WALLET.CARD_MISSING_DETAILS_CONFIRM_MAGIC_CODE]: () => - require('../../../../pages/settings/Wallet/ExpensifyCardPage/ExpensifyCardMissingDetailsMagicCodePage').default, [SCREENS.SETTINGS.WALLET.REPORT_VIRTUAL_CARD_FRAUD]: () => require('../../../../pages/settings/Wallet/ReportVirtualCardFraudPage').default, [SCREENS.SETTINGS.WALLET.REPORT_VIRTUAL_CARD_FRAUD_CONFIRM_MAGIC_CODE]: () => require('../../../../pages/settings/Wallet/ReportVirtualCardFraudVerifyAccountPage').default, diff --git a/src/libs/Navigation/linkingConfig/config.ts b/src/libs/Navigation/linkingConfig/config.ts index b533a716fbef8..2c2287a8f4d4b 100644 --- a/src/libs/Navigation/linkingConfig/config.ts +++ b/src/libs/Navigation/linkingConfig/config.ts @@ -234,14 +234,6 @@ const config: LinkingOptions['config'] = { path: ROUTES.SETTINGS_WALLET_DOMAIN_CARD_CONFIRM_MAGIC_CODE.route, exact: true, }, - [SCREENS.SETTINGS.WALLET.CARD_MISSING_DETAILS]: { - path: ROUTES.SETTINGS_WALLET_CARD_MISSING_DETAILS.route, - exact: true, - }, - [SCREENS.SETTINGS.WALLET.CARD_MISSING_DETAILS_CONFIRM_MAGIC_CODE]: { - path: ROUTES.SETTINGS_WALLET_CARD_MISSING_DETAILS_CONFIRM_MAGIC_CODE.route, - exact: true, - }, [SCREENS.SETTINGS.WALLET.REPORT_VIRTUAL_CARD_FRAUD]: { path: ROUTES.SETTINGS_REPORT_FRAUD.route, exact: true, diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index b37080736f7dc..0528c1ba259bb 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -171,14 +171,6 @@ type SettingsNavigatorParamList = { /** cardID of selected card */ cardID: string; }; - [SCREENS.SETTINGS.WALLET.CARD_MISSING_DETAILS]: { - /** cardID of selected card */ - cardID: string; - }; - [SCREENS.SETTINGS.WALLET.CARD_MISSING_DETAILS_CONFIRM_MAGIC_CODE]: { - /** cardID of selected card */ - cardID: string; - }; [SCREENS.SETTINGS.WALLET.REPORT_VIRTUAL_CARD_FRAUD]: { /** cardID of selected card */ cardID: string; diff --git a/src/libs/PersonalDetailsUtils.ts b/src/libs/PersonalDetailsUtils.ts index 11bfaf777afeb..91a0544b6afea 100644 --- a/src/libs/PersonalDetailsUtils.ts +++ b/src/libs/PersonalDetailsUtils.ts @@ -456,17 +456,6 @@ function areTravelPersonalDetailsMissing(privatePersonalDetails: OnyxEntry): boolean { - const isUKOrEUCard = card?.nameValuePairs?.feedCountry === CONST.COUNTRY.GB; - const hasMissingDetails = arePersonalDetailsMissing(privatePersonalDetails); - - return hasMissingDetails && isUKOrEUCard; -} - export { getDisplayNameOrDefault, getPersonalDetailsByIDs, @@ -488,6 +477,5 @@ export { getPhoneNumber, arePersonalDetailsMissing, areTravelPersonalDetailsMissing, - shouldShowMissingDetailsPage, createPersonalDetailsLookupByAccountID, }; diff --git a/src/libs/actions/Card.ts b/src/libs/actions/Card.ts index 257414b57eb23..62614817e96af 100644 --- a/src/libs/actions/Card.ts +++ b/src/libs/actions/Card.ts @@ -622,12 +622,6 @@ function revealVirtualCardDetails(cardID: number, validateCode: string): Promise return; } - if (response?.jsonCode === 404) { - // eslint-disable-next-line prefer-promise-reject-errors - reject('cardPage.missingPrivateDetails'); - return; - } - if (response?.jsonCode === 500) { // eslint-disable-next-line prefer-promise-reject-errors reject('cardPage.unexpectedError'); diff --git a/src/libs/actions/PersonalDetails.ts b/src/libs/actions/PersonalDetails.ts index c2878ee93e279..f37dbf03c6c59 100644 --- a/src/libs/actions/PersonalDetails.ts +++ b/src/libs/actions/PersonalDetails.ts @@ -5,7 +5,6 @@ import type {LocaleContextProps} from '@components/LocaleContextProvider'; import * as API from '@libs/API'; import type { OpenPublicProfilePageParams, - SetPersonalDetailsAndRevealExpensifyCardParams, SetPersonalDetailsAndShipExpensifyCardsParams, UpdateAutomaticTimezoneParams, UpdateDateOfBirthParams, @@ -17,7 +16,7 @@ import type { UpdateSelectedTimezoneParams, UpdateUserAvatarParams, } from '@libs/API/parameters'; -import {READ_COMMANDS, SIDE_EFFECT_REQUEST_COMMANDS, WRITE_COMMANDS} from '@libs/API/types'; +import {READ_COMMANDS, WRITE_COMMANDS} from '@libs/API/types'; import type {CustomRNImageManipulatorResult} from '@libs/cropOrRotateImage/types'; import DateUtils from '@libs/DateUtils'; import * as ErrorUtils from '@libs/ErrorUtils'; @@ -561,96 +560,6 @@ function updatePersonalDetailsAndShipExpensifyCards(values: FormOnyxValues, - validateCode: string, - countryCode: number, - cardID: number, -): Promise<{pan: string; expiration: string; cvv: string}> { - return new Promise((resolve, reject) => { - const parameters: SetPersonalDetailsAndRevealExpensifyCardParams = { - ...buildSetPersonalDetailsAndShipExpensifyCardsParams(values, countryCode), - validateCode, - cardID, - }; - - const optimisticData: Array> = [ - { - onyxMethod: Onyx.METHOD.MERGE, - key: ONYXKEYS.PRIVATE_PERSONAL_DETAILS, - value: { - isLoading: true, - }, - }, - { - onyxMethod: Onyx.METHOD.MERGE, - key: ONYXKEYS.ACCOUNT, - value: {isLoading: true}, - }, - ]; - - const successData: Array> = [ - { - onyxMethod: Onyx.METHOD.MERGE, - key: ONYXKEYS.PRIVATE_PERSONAL_DETAILS, - value: { - isLoading: false, - }, - }, - { - onyxMethod: Onyx.METHOD.MERGE, - key: ONYXKEYS.ACCOUNT, - value: {isLoading: false}, - }, - { - onyxMethod: Onyx.METHOD.MERGE, - key: ONYXKEYS.CARD_LIST, - value: {[cardID]: {errors: null}}, - }, - ]; - - const failureData: Array> = [ - { - onyxMethod: Onyx.METHOD.MERGE, - key: ONYXKEYS.PRIVATE_PERSONAL_DETAILS, - value: { - isLoading: false, - }, - }, - { - onyxMethod: Onyx.METHOD.MERGE, - key: ONYXKEYS.ACCOUNT, - value: {isLoading: false}, - }, - ]; - - // eslint-disable-next-line rulesdir/no-api-side-effects-method - API.makeRequestWithSideEffects(SIDE_EFFECT_REQUEST_COMMANDS.SET_PERSONAL_DETAILS_AND_REVEAL_EXPENSIFY_CARD, parameters, { - optimisticData, - successData, - failureData, - }) - .then((response) => { - if (response?.jsonCode !== CONST.JSON_CODE.SUCCESS) { - if (response?.jsonCode === CONST.JSON_CODE.INCORRECT_MAGIC_CODE) { - // eslint-disable-next-line prefer-promise-reject-errors - reject('validateCodeForm.error.incorrectMagicCode'); - return; - } - - // eslint-disable-next-line prefer-promise-reject-errors - reject('cardPage.unexpectedError'); - return; - } - resolve(response as {pan: string; expiration: string; cvv: string}); - }) - .catch(() => { - // eslint-disable-next-line prefer-promise-reject-errors - reject('cardPage.cardDetailsLoadingFailure'); - }); - }); -} - export { clearAvatarErrors, deleteAvatar, @@ -667,7 +576,6 @@ export { updatePronouns, updateSelectedTimezone, updatePersonalDetailsAndShipExpensifyCards, - setPersonalDetailsAndRevealExpensifyCard, clearPersonalDetailsErrors, buildSetPersonalDetailsAndShipExpensifyCardsParams, }; diff --git a/src/pages/MissingPersonalDetails/MissingPersonalDetailsContent.tsx b/src/pages/MissingPersonalDetails/MissingPersonalDetailsContent.tsx index 1a85e5e7ccf32..48d9b361b6af8 100644 --- a/src/pages/MissingPersonalDetails/MissingPersonalDetailsContent.tsx +++ b/src/pages/MissingPersonalDetails/MissingPersonalDetailsContent.tsx @@ -46,9 +46,6 @@ type MissingPersonalDetailsContentProps = { /** Card ID for the card that the user is adding personal details to */ cardID: string; - - /** Whether this is the card-ordering flow */ - isCardOrderFlow?: boolean; }; const baseFormPages = [ @@ -61,17 +58,22 @@ const baseFormPages = [ const PINPage = {pageName: CONST.MISSING_PERSONAL_DETAILS.PAGE_NAME.PIN, component: PINStep}; const confirmPage = {pageName: CONST.MISSING_PERSONAL_DETAILS.PAGE_NAME.CONFIRM, component: Confirmation}; -function MissingPersonalDetailsContent({privatePersonalDetails, draftValues, headerTitle, onComplete, cardID, isCardOrderFlow = false}: MissingPersonalDetailsContentProps) { +function MissingPersonalDetailsContent({privatePersonalDetails, draftValues, headerTitle, onComplete, cardID}: MissingPersonalDetailsContentProps) { const styles = useThemeStyles(); const {isOffline} = useNetwork(); const {executeScenario} = useMultifactorAuthentication(); const {translate} = useLocalize(); - const isUKEUCardSelector = useCallback((cardList: OnyxEntry) => isExpensifyCardUkEuSupportedSelector(cardList, cardID), [cardID]); - const [isUKEUCard] = useOnyx(ONYXKEYS.CARD_LIST, {selector: isUKEUCardSelector}); + const shouldCollectPINSelector = useCallback( + (cardList: OnyxEntry) => + !!cardID && + isExpensifyCardUkEuSupportedSelector(cardList, cardID) && + Object.values(cardList ?? {}).some((card) => card?.cardID === Number(cardID) && !card?.nameValuePairs?.isVirtual), + [cardID], + ); + const [shouldCollectPIN] = useOnyx(ONYXKEYS.CARD_LIST, {selector: shouldCollectPINSelector}); const [countryCode = CONST.DEFAULT_COUNTRY_CODE] = useOnyx(ONYXKEYS.COUNTRY_CODE); const {PIN, isConfirmStep} = usePINState(); const {setIsConfirmStep} = usePINActions(); - const shouldCollectPIN = isCardOrderFlow && !!isUKEUCard; // Build form pages dynamically based on whether this is a UK/EU card const formPages = useMemo(() => { diff --git a/src/pages/MissingPersonalDetails/index.tsx b/src/pages/MissingPersonalDetails/index.tsx index 0276b95625a7e..15a51c55554f6 100644 --- a/src/pages/MissingPersonalDetails/index.tsx +++ b/src/pages/MissingPersonalDetails/index.tsx @@ -29,7 +29,6 @@ function MissingPersonalDetails({route: {params: {cardID = ''} = {}}}) { draftValues={draftValues} onComplete={handleComplete} cardID={cardID} - isCardOrderFlow /> ); } diff --git a/src/pages/settings/Wallet/ExpensifyCardPage/ExpensifyCardMissingDetailsMagicCodePage.tsx b/src/pages/settings/Wallet/ExpensifyCardPage/ExpensifyCardMissingDetailsMagicCodePage.tsx deleted file mode 100644 index 42640b5fab6a1..0000000000000 --- a/src/pages/settings/Wallet/ExpensifyCardPage/ExpensifyCardMissingDetailsMagicCodePage.tsx +++ /dev/null @@ -1,98 +0,0 @@ -import React, {useCallback, useMemo} from 'react'; -import ValidateCodeActionContent from '@components/ValidateCodeActionModal/ValidateCodeActionContent'; -import useLocalize from '@hooks/useLocalize'; -import useOnyx from '@hooks/useOnyx'; -import {clearPersonalDetailsErrors, setPersonalDetailsAndRevealExpensifyCard} from '@libs/actions/PersonalDetails'; -import {requestValidateCodeAction, resetValidateActionCodeSent} from '@libs/actions/User'; -import {normalizeCountryCode} from '@libs/CountryUtils'; -import {getLatestError} from '@libs/ErrorUtils'; -import Navigation from '@libs/Navigation/Navigation'; -import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; -import type {SettingsNavigatorParamList} from '@libs/Navigation/types'; -import {getSubPageValues} from '@pages/MissingPersonalDetails/utils'; -import CONST from '@src/CONST'; -import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES from '@src/ROUTES'; -import type SCREENS from '@src/SCREENS'; -import type {PersonalDetailsForm} from '@src/types/form'; -import {isEmptyObject} from '@src/types/utils/EmptyObject'; -import {useExpensifyCardActions} from './ExpensifyCardContextProvider'; - -type ExpensifyCardMissingDetailsMagicCodePageProps = PlatformStackScreenProps; - -function ExpensifyCardMissingDetailsMagicCodePage({ - route: { - params: {cardID = ''}, - }, -}: ExpensifyCardMissingDetailsMagicCodePageProps) { - const {translate} = useLocalize(); - const [privatePersonalDetails] = useOnyx(ONYXKEYS.PRIVATE_PERSONAL_DETAILS); - const [draftValues] = useOnyx(ONYXKEYS.FORMS.PERSONAL_DETAILS_FORM_DRAFT); - - const [account] = useOnyx(ONYXKEYS.ACCOUNT); - const [validateCodeAction] = useOnyx(ONYXKEYS.VALIDATE_ACTION_CODE); - const privateDetailsErrors = privatePersonalDetails?.errors ?? undefined; - const [countryCode = CONST.DEFAULT_COUNTRY_CODE] = useOnyx(ONYXKEYS.COUNTRY_CODE); - - const validateLoginError = getLatestError(privateDetailsErrors); - const primaryLogin = account?.primaryLogin ?? ''; - const {setIsCardDetailsLoading, setCardsDetails, setCardsDetailsErrors} = useExpensifyCardActions(); - - const clearError = useCallback(() => { - if (isEmptyObject(validateLoginError) && isEmptyObject(validateCodeAction?.errorFields)) { - return; - } - clearPersonalDetailsErrors(); - }, [validateCodeAction?.errorFields, validateLoginError]); - - const values = useMemo(() => normalizeCountryCode(getSubPageValues(privatePersonalDetails, draftValues)) as PersonalDetailsForm, [privatePersonalDetails, draftValues]); - - const handleSubmitForm = useCallback( - (validateCode: string) => { - setIsCardDetailsLoading((prevState: Record) => ({ - ...prevState, - [cardID]: true, - })); - - setPersonalDetailsAndRevealExpensifyCard(values, validateCode, countryCode, Number.parseInt(cardID, 10)) - .then((value) => { - setCardsDetails((prevState) => ({...prevState, [cardID]: value})); - setCardsDetailsErrors((prevState) => ({ - ...prevState, - [cardID]: '', - })); - Navigation.goBack(ROUTES.SETTINGS_WALLET_DOMAIN_CARD.getRoute(cardID)); - }) - .catch((error: string) => { - setCardsDetailsErrors((prevState) => ({ - ...prevState, - [cardID]: error, - })); - Navigation.goBack(ROUTES.SETTINGS_WALLET_DOMAIN_CARD.getRoute(cardID)); - }) - .finally(() => { - setIsCardDetailsLoading((prevState: Record) => ({...prevState, [cardID]: false})); - }); - }, - [cardID, countryCode, setCardsDetails, setCardsDetailsErrors, setIsCardDetailsLoading, values], - ); - - return ( - requestValidateCodeAction()} - validateCodeActionErrorField="personalDetails" - handleSubmitForm={handleSubmitForm} - validateError={validateLoginError} - clearError={clearError} - onClose={() => { - resetValidateActionCodeSent(); - Navigation.goBack(ROUTES.SETTINGS_WALLET_CARD_MISSING_DETAILS.getRoute(cardID)); - }} - isLoading={privatePersonalDetails?.isLoading} - /> - ); -} - -export default ExpensifyCardMissingDetailsMagicCodePage; diff --git a/src/pages/settings/Wallet/ExpensifyCardPage/ExpensifyCardMissingDetailsPage.tsx b/src/pages/settings/Wallet/ExpensifyCardPage/ExpensifyCardMissingDetailsPage.tsx deleted file mode 100644 index dc6eddf653c14..0000000000000 --- a/src/pages/settings/Wallet/ExpensifyCardPage/ExpensifyCardMissingDetailsPage.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import React, {useCallback} from 'react'; -import useLocalize from '@hooks/useLocalize'; -import useOnyx from '@hooks/useOnyx'; -import Navigation from '@libs/Navigation/Navigation'; -import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; -import type {SettingsNavigatorParamList} from '@libs/Navigation/types'; -import MissingPersonalDetailsContent from '@pages/MissingPersonalDetails/MissingPersonalDetailsContent'; -import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES from '@src/ROUTES'; -import type SCREENS from '@src/SCREENS'; - -type ExpensifyCardMissingDetailsPageProps = PlatformStackScreenProps; - -function ExpensifyCardMissingDetailsPage({ - route: { - params: {cardID = ''}, - }, -}: ExpensifyCardMissingDetailsPageProps) { - const {translate} = useLocalize(); - const [privatePersonalDetails] = useOnyx(ONYXKEYS.PRIVATE_PERSONAL_DETAILS); - const [draftValues] = useOnyx(ONYXKEYS.FORMS.PERSONAL_DETAILS_FORM_DRAFT); - - const handleComplete = useCallback(() => { - Navigation.navigate(ROUTES.SETTINGS_WALLET_CARD_MISSING_DETAILS_CONFIRM_MAGIC_CODE.getRoute(cardID)); - }, [cardID]); - - return ( - - ); -} - -export default ExpensifyCardMissingDetailsPage; diff --git a/src/pages/settings/Wallet/ExpensifyCardPage/ExpensifyCardVerifyAccountPage.tsx b/src/pages/settings/Wallet/ExpensifyCardPage/ExpensifyCardVerifyAccountPage.tsx index c77980c43e010..40eff1670292e 100644 --- a/src/pages/settings/Wallet/ExpensifyCardPage/ExpensifyCardVerifyAccountPage.tsx +++ b/src/pages/settings/Wallet/ExpensifyCardPage/ExpensifyCardVerifyAccountPage.tsx @@ -55,14 +55,6 @@ function ExpensifyCardVerifyAccountPage({route}: ExpensifyCardVerifyAccountPageP navigateBack(); }) .catch((error: TranslationPaths) => { - if (error === 'cardPage.missingPrivateDetails') { - setCardsDetailsErrors((prevState) => ({ - ...prevState, - [cardID]: error, - })); - navigateBack(); - return; - } setValidateError(getMicroSecondOnyxErrorWithTranslationKey(error)); }) .finally(() => { diff --git a/src/pages/settings/Wallet/ExpensifyCardPage/index.tsx b/src/pages/settings/Wallet/ExpensifyCardPage/index.tsx index 10c2a3a0973fc..c2085b90317ad 100644 --- a/src/pages/settings/Wallet/ExpensifyCardPage/index.tsx +++ b/src/pages/settings/Wallet/ExpensifyCardPage/index.tsx @@ -9,7 +9,6 @@ import Button from '@components/Button'; import CardPreview from '@components/CardPreview'; import ConfirmModal from '@components/ConfirmModal'; import DotIndicatorMessage from '@components/DotIndicatorMessage'; -import FormHelpMessage from '@components/FormHelpMessage'; import FrozenCardHeader from '@components/FrozenCardHeader'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import type {LocalizedTranslate} from '@components/LocaleContextProvider'; @@ -20,7 +19,6 @@ import {usePersonalDetails, useSession} from '@components/OnyxListItemProvider'; import ScreenWrapper from '@components/ScreenWrapper'; import ScrollView from '@components/ScrollView'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; -import useEnvironment from '@hooks/useEnvironment'; import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; @@ -36,7 +34,6 @@ import DateUtils from '@libs/DateUtils'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {DomainCardNavigatorParamList, SettingsNavigatorParamList} from '@libs/Navigation/types'; -import {shouldShowMissingDetailsPage} from '@libs/PersonalDetailsUtils'; import {buildCannedSearchQuery} from '@libs/SearchQueryUtils'; import NotFoundPage from '@pages/ErrorPage/NotFoundPage'; import RedDotCardSection from '@pages/settings/Wallet/RedDotCardSection'; @@ -95,12 +92,10 @@ function ExpensifyCardPage({route}: ExpensifyCardPageProps) { const {cardID} = route.params; const [account] = useOnyx(ONYXKEYS.ACCOUNT); const cardList = useNonPersonalCardList(); - const [privatePersonalDetails] = useOnyx(ONYXKEYS.PRIVATE_PERSONAL_DETAILS); const [cardSettings] = useOnyx(`${ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS}${cardList?.[cardID]?.fundID}`); const styles = useThemeStyles(); const {isOffline} = useNetwork(); const {translate} = useLocalize(); - const {environmentURL} = useEnvironment(); const isTravelCard = cardList?.[cardID]?.nameValuePairs?.isTravelCard; const shouldDisplayCardDomain = !isTravelCard && (!cardList?.[cardID]?.nameValuePairs?.issuedBy || !cardList?.[cardID]?.nameValuePairs?.isVirtual); const domain = cardList?.[cardID]?.domainName ?? ''; @@ -315,11 +310,6 @@ function ExpensifyCardPage({route}: ExpensifyCardPageProps) { return; } - // Check if user needs to add personal details first (UK/EU cards only) - if (shouldShowMissingDetailsPage(card, privatePersonalDetails)) { - Navigation.navigate(ROUTES.SETTINGS_WALLET_CARD_MISSING_DETAILS.getRoute(String(card.cardID))); - return; - } resetValidateActionCodeSent(); if (route.name === SCREENS.DOMAIN_CARD.DOMAIN_CARD_DETAIL) { Navigation.navigate(ROUTES.SETTINGS_DOMAIN_CARD_CONFIRM_MAGIC_CODE.getRoute(String(card.cardID))); @@ -346,23 +336,11 @@ function ExpensifyCardPage({route}: ExpensifyCardPageProps) { )} /> - {cardsDetailsErrors[card.cardID] === 'cardPage.missingPrivateDetails' ? ( - - ) : ( - - )} + )} {!isSignedInAsDelegate && ( diff --git a/src/pages/settings/Wallet/TravelCVVPage/TravelCVVPage.tsx b/src/pages/settings/Wallet/TravelCVVPage/TravelCVVPage.tsx index 827052a7a2904..3c55dd3c63494 100644 --- a/src/pages/settings/Wallet/TravelCVVPage/TravelCVVPage.tsx +++ b/src/pages/settings/Wallet/TravelCVVPage/TravelCVVPage.tsx @@ -17,8 +17,6 @@ import useOnyx from '@hooks/useOnyx'; import useThemeStyles from '@hooks/useThemeStyles'; import {resetValidateActionCodeSent} from '@libs/actions/User'; import Navigation from '@libs/Navigation/Navigation'; -import {shouldShowMissingDetailsPage} from '@libs/PersonalDetailsUtils'; -import {getTravelInvoicingCard} from '@libs/TravelInvoicingUtils'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import {useTravelCVVActions, useTravelCVVState} from './TravelCVVContextProvider'; @@ -35,8 +33,6 @@ function TravelCVVPage() { const illustrations = useMemoizedLazyIllustrations(['TravelCVV']); const [account] = useOnyx(ONYXKEYS.ACCOUNT); - const [privatePersonalDetails] = useOnyx(ONYXKEYS.PRIVATE_PERSONAL_DETAILS); - const [cardList] = useOnyx(ONYXKEYS.CARD_LIST); const {isAccountLocked} = useLockedAccountState(); const {showLockedAccountModal} = useLockedAccountActions(); @@ -48,7 +44,6 @@ function TravelCVVPage() { // remain visible the next time the page is opened useEffect(() => () => setCvv(null), [setCvv]); - const travelCard = getTravelInvoicingCard(cardList); const isSignedInAsDelegate = !!account?.delegatedAccess?.delegate || false; const handleRevealDetailsPress = useCallback(() => { @@ -57,18 +52,12 @@ function TravelCVVPage() { return; } - // Check if user needs to add personal details first (UK/EU cards only) - if (shouldShowMissingDetailsPage(travelCard, privatePersonalDetails)) { - Navigation.navigate(ROUTES.SETTINGS_WALLET_CARD_MISSING_DETAILS.getRoute(String(travelCard?.cardID))); - return; - } - // ValidateCodeActionContent only sends a magic code when validateCodeSent is false // so we need to reset it to ensure a code is always sent resetValidateActionCodeSent(); // Navigate to the verify account page Navigation.navigate(ROUTES.SETTINGS_WALLET_TRAVEL_CVV_VERIFY_ACCOUNT); - }, [isAccountLocked, showLockedAccountModal, travelCard, privatePersonalDetails]); + }, [isAccountLocked, showLockedAccountModal]); return ( Date: Tue, 17 Mar 2026 17:29:26 +0700 Subject: [PATCH 2/3] chore --- .../MissingPersonalDetails/MissingPersonalDetailsContent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/MissingPersonalDetails/MissingPersonalDetailsContent.tsx b/src/pages/MissingPersonalDetails/MissingPersonalDetailsContent.tsx index 48d9b361b6af8..4209ce40dc67a 100644 --- a/src/pages/MissingPersonalDetails/MissingPersonalDetailsContent.tsx +++ b/src/pages/MissingPersonalDetails/MissingPersonalDetailsContent.tsx @@ -170,7 +170,7 @@ function MissingPersonalDetailsContent({privatePersonalDetails, draftValues, hea onMove={moveTo} currentPageName={currentPageName} personalDetailsValues={values} - shouldCollectPin={shouldCollectPIN} + shouldCollectPin={!!shouldCollectPIN} /> ); From b15afd1606377f2f3b4bb55eb6d46db210826139 Mon Sep 17 00:00:00 2001 From: DylanDylann Date: Tue, 17 Mar 2026 17:31:19 +0700 Subject: [PATCH 3/3] remove usecallback --- .../MissingPersonalDetailsContent.tsx | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/pages/MissingPersonalDetails/MissingPersonalDetailsContent.tsx b/src/pages/MissingPersonalDetails/MissingPersonalDetailsContent.tsx index 4209ce40dc67a..fd35b8d25569e 100644 --- a/src/pages/MissingPersonalDetails/MissingPersonalDetailsContent.tsx +++ b/src/pages/MissingPersonalDetails/MissingPersonalDetailsContent.tsx @@ -1,4 +1,4 @@ -import React, {useCallback, useMemo} from 'react'; +import React, {useMemo} from 'react'; import {View} from 'react-native'; import type {OnyxEntry} from 'react-native-onyx'; import FullScreenLoadingIndicator from '@components/FullscreenLoadingIndicator'; @@ -63,13 +63,10 @@ function MissingPersonalDetailsContent({privatePersonalDetails, draftValues, hea const {isOffline} = useNetwork(); const {executeScenario} = useMultifactorAuthentication(); const {translate} = useLocalize(); - const shouldCollectPINSelector = useCallback( - (cardList: OnyxEntry) => - !!cardID && - isExpensifyCardUkEuSupportedSelector(cardList, cardID) && - Object.values(cardList ?? {}).some((card) => card?.cardID === Number(cardID) && !card?.nameValuePairs?.isVirtual), - [cardID], - ); + const shouldCollectPINSelector = (cardList: OnyxEntry) => + !!cardID && + isExpensifyCardUkEuSupportedSelector(cardList, cardID) && + Object.values(cardList ?? {}).some((card) => card?.cardID === Number(cardID) && !card?.nameValuePairs?.isVirtual); const [shouldCollectPIN] = useOnyx(ONYXKEYS.CARD_LIST, {selector: shouldCollectPINSelector}); const [countryCode = CONST.DEFAULT_COUNTRY_CODE] = useOnyx(ONYXKEYS.COUNTRY_CODE); const {PIN, isConfirmStep} = usePINState();