diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 05935c86ada0..38abfd9f4feb 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -337,7 +337,6 @@ const DYNAMIC_ROUTES = { path: 'country', entryScreens: [ SCREENS.SETTINGS.PROFILE.ADDRESS, - SCREENS.SETTINGS.PROFILE.PRIVATE_PERSONAL_DETAILS, SCREENS.WORKSPACE.DYNAMIC_WORKSPACE_OVERVIEW_ADDRESS, SCREENS.SETTINGS.WALLET.CARDS_DIGITAL_DETAILS_UPDATE_ADDRESS, SCREENS.DOMAIN_CARD.DOMAIN_CARD_UPDATE_ADDRESS, @@ -1097,11 +1096,6 @@ const ROUTES = { SETTINGS_DATE_OF_BIRTH: 'settings/profile/date-of-birth', SETTINGS_PHONE_NUMBER: 'settings/profile/phone', SETTINGS_ADDRESS: 'settings/profile/address', - SETTINGS_PRIVATE_PERSONAL_DETAILS: { - route: 'settings/profile/private-personal-details', - getRoute: (fieldToFocus?: string) => `settings/profile/private-personal-details${fieldToFocus ? `?fieldToFocus=${encodeURIComponent(fieldToFocus)}` : ''}` as const, - }, - SETTINGS_PRIVATE_PERSONAL_DETAILS_CONFIRM_MAGIC_CODE: 'settings/profile/private-personal-details/confirm', SETTINGS_ADDRESS_STATE: { route: 'settings/profile/address/state', diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 1a79cddc194a..c69f1d43e5e2 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -162,8 +162,6 @@ const SCREENS = { DATE_OF_BIRTH: 'Settings_DateOfBirth', PHONE_NUMBER: 'Settings_PhoneNumber', ADDRESS: 'Settings_Address', - PRIVATE_PERSONAL_DETAILS: 'Settings_PrivatePersonalDetails', - PRIVATE_PERSONAL_DETAILS_CONFIRM_MAGIC_CODE: 'Settings_PrivatePersonalDetails_ConfirmMagicCode', AVATAR: 'Settings_Avatar', DYNAMIC_ADDRESS_COUNTRY: 'Dynamic_Address_Country', ADDRESS_STATE: 'Settings_Address_State', diff --git a/src/languages/de.ts b/src/languages/de.ts index c6f8c5465889..15267c184690 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -3307,7 +3307,6 @@ ${amount} für ${merchant} – ${date}`, enterPhoneNumber: 'Wie lautet deine Telefonnummer?', personalDetails: 'Persönliche Angaben', privateDataMessage: 'Diese Angaben werden für Reisen und Zahlungen verwendet. Sie werden niemals in deinem öffentlichen Profil angezeigt.', - basicDetails: 'Grundlegende Angaben', legalName: 'Rechtlicher Name', legalFirstName: 'Rechtlicher Vorname', legalLastName: 'Rechtlicher Nachname', diff --git a/src/languages/en.ts b/src/languages/en.ts index 6c83eabded82..a9d6b6dec137 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -3381,7 +3381,6 @@ const translations = { enterPhoneNumber: "What's your phone number?", personalDetails: 'Personal details', privateDataMessage: 'These details are used for travel and payments. They are never shown on your public profile.', - basicDetails: 'Basic details', legalName: 'Legal name', legalFirstName: 'Legal first name', legalLastName: 'Legal last name', diff --git a/src/languages/es.ts b/src/languages/es.ts index 12562a5380fd..ce013eef9e8e 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -3184,7 +3184,6 @@ ${amount} para ${merchant} - ${date}`, enterPhoneNumber: '¿Cuál es tu número de teléfono?', personalDetails: 'Datos personales', privateDataMessage: 'Estos detalles se utilizan para viajes y pagos. Nunca se mostrarán en tu perfil público.', - basicDetails: 'Datos básicos', legalName: 'Nombre completo', legalFirstName: 'Nombre legal', legalLastName: 'Apellidos legales', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index c13632b0d06e..b088ec0e078b 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -3313,7 +3313,6 @@ ${amount} pour ${merchant} - ${date}`, enterPhoneNumber: 'Quel est votre numéro de téléphone ?', personalDetails: 'Informations personnelles', privateDataMessage: 'Ces informations sont utilisées pour les déplacements et les paiements. Elles ne s’affichent jamais sur votre profil public.', - basicDetails: 'Détails de base', legalName: 'Nom légal', legalFirstName: 'Prénom légal', legalLastName: 'Nom de famille légal', diff --git a/src/languages/it.ts b/src/languages/it.ts index 13046f1433a4..9e855aaf8b09 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -3300,7 +3300,6 @@ ${amount} per ${merchant} - ${date}`, enterPhoneNumber: 'Qual è il tuo numero di telefono?', personalDetails: 'Dati personali', privateDataMessage: 'Questi dettagli vengono utilizzati per viaggi e pagamenti. Non vengono mai mostrati sul tuo profilo pubblico.', - basicDetails: 'Dettagli di base', legalName: 'Nome legale', legalFirstName: 'Nome legale di battesimo', legalLastName: 'Cognome legale', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 0d3245d0ee91..0581b7bced4f 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -3272,7 +3272,6 @@ ${integrationName === CONST.ONBOARDING_ACCOUNTING_MAPPING.other ? 'あなたの' enterPhoneNumber: '電話番号は何ですか?', personalDetails: '個人情報', privateDataMessage: 'これらの詳細は出張と支払いに使用されます。公開プロフィールに表示されることは決してありません。', - basicDetails: '基本情報', legalName: '法的氏名', legalFirstName: '法的な名', legalLastName: '法的な姓', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 7c2ac0a9ca81..452828ad9d8d 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -3295,7 +3295,6 @@ ${amount} voor ${merchant} - ${date}`, enterPhoneNumber: 'Wat is je telefoonnummer?', personalDetails: 'Persoonlijke gegevens', privateDataMessage: 'Deze gegevens worden gebruikt voor reizen en betalingen. Ze worden nooit weergegeven op je openbare profiel.', - basicDetails: 'Basisgegevens', legalName: 'Wettelijke naam', legalFirstName: 'Juridische voornaam', legalLastName: 'Wettelijke achternaam', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index f861635dd27f..512c68f6b0e0 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -3289,7 +3289,6 @@ ${amount} dla ${merchant} - ${date}`, enterPhoneNumber: 'Jaki jest Twój numer telefonu?', personalDetails: 'Dane osobiste', privateDataMessage: 'Te dane są używane do podróży i płatności. Nigdy nie są wyświetlane w Twoim publicznym profilu.', - basicDetails: 'Podstawowe dane', legalName: 'Imię i nazwisko (pełne)', legalFirstName: 'Imię (zgodnie z dokumentem tożsamości)', legalLastName: 'Nazwisko zgodne z dokumentami', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 7e5b159f3d84..a318d25ca7cf 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -3290,7 +3290,6 @@ ${amount} para ${merchant} - ${date}`, enterPhoneNumber: 'Qual é o seu número de telefone?', personalDetails: 'Dados pessoais', privateDataMessage: 'Esses dados são usados para viagens e pagamentos. Eles nunca são exibidos no seu perfil público.', - basicDetails: 'Detalhes básicos', legalName: 'Nome legal', legalFirstName: 'Primeiro nome legal', legalLastName: 'Sobrenome legal', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 151bb18cf5b7..3635b52d2046 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -3220,7 +3220,6 @@ ${amount},商户:${merchant} - 日期:${date}`, enterPhoneNumber: '你的电话号码是多少?', personalDetails: '个人信息', privateDataMessage: '这些详细信息将用于出行和付款,绝不会显示在你的公开个人资料中。', - basicDetails: '基本信息', legalName: '法定姓名', legalFirstName: '法定名(名)', legalLastName: '法定姓氏', diff --git a/src/libs/API/parameters/UpdatePrivatePersonalDetailsParams.ts b/src/libs/API/parameters/UpdatePrivatePersonalDetailsParams.ts deleted file mode 100644 index 177a5dfacfc6..000000000000 --- a/src/libs/API/parameters/UpdatePrivatePersonalDetailsParams.ts +++ /dev/null @@ -1,16 +0,0 @@ -type UpdatePrivatePersonalDetailsParams = { - legalFirstName: string; - legalLastName: string; - phoneNumber: string; - addressCity: string; - addressStreet: string; - addressStreet2: string; - addressZip: string; - addressCountry: string; - dob: string; - validateCode: string; - addressState: string; - addressProvince: string; -}; - -export default UpdatePrivatePersonalDetailsParams; diff --git a/src/libs/API/parameters/index.ts b/src/libs/API/parameters/index.ts index be3820f68cc8..3f4d14b75143 100644 --- a/src/libs/API/parameters/index.ts +++ b/src/libs/API/parameters/index.ts @@ -108,7 +108,6 @@ export type {default as UpdateHomeAddressParams} from './UpdateHomeAddressParams export type {default as UpdatePolicyAddressParams} from './UpdatePolicyAddressParams'; export type {default as UpdateLegalNameParams} from './UpdateLegalNameParams'; export type {default as UpdatePhoneNumberParams} from './UpdatePhoneNumberParams'; -export type {default as UpdatePrivatePersonalDetailsParams} from './UpdatePrivatePersonalDetailsParams'; export type {default as UpdateNewsletterSubscriptionParams} from './UpdateNewsletterSubscriptionParams'; export type {default as UpdatePersonalInformationForBankAccountParams} from './UpdatePersonalInformationForBankAccountParams'; export type {default as UpdatePreferredEmojiSkinToneParams} from './UpdatePreferredEmojiSkinToneParams'; diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index 1f8343f71381..62d5656211fa 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -73,7 +73,6 @@ const WRITE_COMMANDS = { UPDATE_DATE_OF_BIRTH: 'UpdateDateOfBirth', UPDATE_PHONE_NUMBER: 'UpdatePhoneNumber', UPDATE_HOME_ADDRESS: 'UpdateHomeAddress', - UPDATE_PRIVATE_PERSONAL_DETAILS: 'UpdatePrivatePersonalDetails', UPDATE_POLICY_ADDRESS: 'SetPolicyAddress', UPDATE_AUTOMATIC_TIMEZONE: 'UpdateAutomaticTimezone', UPDATE_SELECTED_TIMEZONE: 'UpdateSelectedTimezone', @@ -662,7 +661,6 @@ type WriteCommandParameters = { [WRITE_COMMANDS.UPDATE_PHONE_NUMBER]: Parameters.UpdatePhoneNumberParams; [WRITE_COMMANDS.UPDATE_POLICY_ADDRESS]: Parameters.UpdatePolicyAddressParams; [WRITE_COMMANDS.UPDATE_HOME_ADDRESS]: Parameters.UpdateHomeAddressParams; - [WRITE_COMMANDS.UPDATE_PRIVATE_PERSONAL_DETAILS]: Parameters.UpdatePrivatePersonalDetailsParams; [WRITE_COMMANDS.UPDATE_AUTOMATIC_TIMEZONE]: Parameters.UpdateAutomaticTimezoneParams; [WRITE_COMMANDS.UPDATE_SELECTED_TIMEZONE]: Parameters.UpdateSelectedTimezoneParams; [WRITE_COMMANDS.UPDATE_USER_AVATAR]: Parameters.UpdateUserAvatarParams; diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index 1baede349d56..21723ba7ae0b 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -409,9 +409,6 @@ const SettingsModalStackNavigator = createModalStackNavigator require('../../../../pages/settings/Profile/PersonalDetails/DateOfBirthPage').default, [SCREENS.SETTINGS.PROFILE.PHONE_NUMBER]: () => require('../../../../pages/settings/Profile/PersonalDetails/PhoneNumberPage').default, [SCREENS.SETTINGS.PROFILE.ADDRESS]: () => require('../../../../pages/settings/Profile/PersonalDetails/PersonalAddressPage').default, - [SCREENS.SETTINGS.PROFILE.PRIVATE_PERSONAL_DETAILS]: () => require('../../../../pages/settings/Profile/PersonalDetails/PrivatePersonalDetailsPage').default, - [SCREENS.SETTINGS.PROFILE.PRIVATE_PERSONAL_DETAILS_CONFIRM_MAGIC_CODE]: () => - require('../../../../pages/settings/Profile/PersonalDetails/PrivatePersonalDetailsConfirmMagicCodePage').default, [SCREENS.SETTINGS.PROFILE.DYNAMIC_ADDRESS_COUNTRY]: () => require('../../../../pages/settings/Profile/PersonalDetails/DynamicCountrySelectionPage').default, [SCREENS.SETTINGS.PROFILE.ADDRESS_STATE]: () => require('../../../../pages/settings/Profile/PersonalDetails/StateSelectionPage').default, [SCREENS.SETTINGS.PROFILE.AVATAR]: () => require('../../../../pages/settings/Profile/Avatar/AvatarPage').default, diff --git a/src/libs/Navigation/linkingConfig/RELATIONS/SETTINGS_TO_RHP.ts b/src/libs/Navigation/linkingConfig/RELATIONS/SETTINGS_TO_RHP.ts index 1c80af17f30e..bd4b95724c4e 100755 --- a/src/libs/Navigation/linkingConfig/RELATIONS/SETTINGS_TO_RHP.ts +++ b/src/libs/Navigation/linkingConfig/RELATIONS/SETTINGS_TO_RHP.ts @@ -23,8 +23,6 @@ const SETTINGS_TO_RHP: Partial['config'] = { path: ROUTES.SETTINGS_ADDRESS, exact: true, }, - [SCREENS.SETTINGS.PROFILE.PRIVATE_PERSONAL_DETAILS]: { - path: ROUTES.SETTINGS_PRIVATE_PERSONAL_DETAILS.route, - exact: true, - }, - [SCREENS.SETTINGS.PROFILE.PRIVATE_PERSONAL_DETAILS_CONFIRM_MAGIC_CODE]: { - path: ROUTES.SETTINGS_PRIVATE_PERSONAL_DETAILS_CONFIRM_MAGIC_CODE, - exact: true, - }, [SCREENS.SETTINGS.PROFILE.DYNAMIC_ADDRESS_COUNTRY]: DYNAMIC_ROUTES.ADDRESS_COUNTRY.path, [SCREENS.SETTINGS.PROFILE.ADDRESS_STATE]: { path: ROUTES.SETTINGS_ADDRESS_STATE.route, diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index a4ce3b1c00dd..d8012d8938d5 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -81,10 +81,6 @@ type SettingsNavigatorParamList = { [SCREENS.SETTINGS.PROFILE.TIMEZONE_SELECT]: undefined; [SCREENS.SETTINGS.PROFILE.LEGAL_NAME]: undefined; [SCREENS.SETTINGS.PROFILE.DATE_OF_BIRTH]: undefined; - [SCREENS.SETTINGS.PROFILE.PRIVATE_PERSONAL_DETAILS]: { - fieldToFocus?: string; - }; - [SCREENS.SETTINGS.PROFILE.PRIVATE_PERSONAL_DETAILS_CONFIRM_MAGIC_CODE]: undefined; [SCREENS.SETTINGS.PROFILE.ADDRESS]: { country?: Country | ''; }; diff --git a/src/libs/PersonalDetailsUtils.ts b/src/libs/PersonalDetailsUtils.ts index 393fad87853e..81ed9e4a5909 100644 --- a/src/libs/PersonalDetailsUtils.ts +++ b/src/libs/PersonalDetailsUtils.ts @@ -4,8 +4,6 @@ import Onyx from 'react-native-onyx'; import type {LocaleContextProps} from '@components/LocaleContextProvider'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import type {PersonalDetailsForm} from '@src/types/form'; -import INPUT_IDS from '@src/types/form/PersonalDetailsForm'; import type {OnyxInputOrEntry, PersonalDetails, PersonalDetailsList, PrivatePersonalDetails} from '@src/types/onyx'; import type {Address} from '@src/types/onyx/PrivatePersonalDetails'; import type {OnyxData} from '@src/types/onyx/Request'; @@ -300,27 +298,6 @@ function getCurrentAddress(privatePersonalDetails: OnyxEntry, draftValues?: PersonalDetailsForm | null): PersonalDetailsForm { - const address = getCurrentAddress(privatePersonalDetails); - const [street1, street2] = getStreetLines(address?.street); - return { - [INPUT_IDS.LEGAL_FIRST_NAME]: draftValues?.[INPUT_IDS.LEGAL_FIRST_NAME] ?? privatePersonalDetails?.legalFirstName ?? '', - [INPUT_IDS.LEGAL_LAST_NAME]: draftValues?.[INPUT_IDS.LEGAL_LAST_NAME] ?? privatePersonalDetails?.legalLastName ?? '', - [INPUT_IDS.DATE_OF_BIRTH]: draftValues?.[INPUT_IDS.DATE_OF_BIRTH] ?? privatePersonalDetails?.dob ?? '', - [INPUT_IDS.PHONE_NUMBER]: draftValues?.[INPUT_IDS.PHONE_NUMBER] ?? privatePersonalDetails?.phoneNumber ?? '', - [INPUT_IDS.ADDRESS_LINE_1]: draftValues?.[INPUT_IDS.ADDRESS_LINE_1] ?? street1 ?? '', - [INPUT_IDS.ADDRESS_LINE_2]: draftValues?.[INPUT_IDS.ADDRESS_LINE_2] ?? street2 ?? '', - [INPUT_IDS.CITY]: draftValues?.[INPUT_IDS.CITY] ?? address?.city ?? '', - [INPUT_IDS.STATE]: draftValues?.[INPUT_IDS.STATE] ?? address?.state ?? '', - [INPUT_IDS.ZIP_POST_CODE]: draftValues?.[INPUT_IDS.ZIP_POST_CODE] ?? address?.zip ?? '', - [INPUT_IDS.COUNTRY]: draftValues?.[INPUT_IDS.COUNTRY] ?? address?.country ?? '', - }; -} - /** * Formats an address object into an easily readable string * @@ -488,7 +465,6 @@ export { getCurrentAddress, getFormattedAddress, getFormattedStreet, - getPrivatePersonalDetailsFormValues, getStreetLines, getEffectiveDisplayName, createDisplayName, diff --git a/src/libs/actions/PersonalDetails.ts b/src/libs/actions/PersonalDetails.ts index ff2c09fa89d8..b5b721145641 100644 --- a/src/libs/actions/PersonalDetails.ts +++ b/src/libs/actions/PersonalDetails.ts @@ -12,7 +12,6 @@ import type { UpdateHomeAddressParams, UpdateLegalNameParams, UpdatePhoneNumberParams, - UpdatePrivatePersonalDetailsParams, UpdatePronounsParams, UpdateSelectedTimezoneParams, UpdateUserAvatarParams, @@ -512,57 +511,6 @@ function deleteAvatar(currentUserPersonalDetails: Pick, validateCode: string, countryCode: number) { - const stateValue = (values.state ?? '').trim(); - const parameters: UpdatePrivatePersonalDetailsParams = { - legalFirstName: values.legalFirstName?.trim() ?? '', - legalLastName: values.legalLastName?.trim() ?? '', - phoneNumber: LoginUtils.appendCountryCode(values.phoneNumber?.trim() ?? '', countryCode), - addressCity: (values.city ?? '').trim(), - addressStreet: values.addressLine1?.trim() ?? '', - addressStreet2: values.addressLine2?.trim() ?? '', - addressZip: values.zipPostCode?.trim().toUpperCase() ?? '', - addressCountry: values.country ?? '', - addressState: stateValue, - addressProvince: values.country !== CONST.COUNTRY.US ? stateValue : '', - dob: values.dob ?? '', - validateCode, - }; - - API.write(WRITE_COMMANDS.UPDATE_PRIVATE_PERSONAL_DETAILS, parameters, { - optimisticData: [ - { - onyxMethod: Onyx.METHOD.MERGE, - key: ONYXKEYS.PRIVATE_PERSONAL_DETAILS, - value: { - isLoading: true, - errorFields: {personalDetails: null}, - }, - }, - ], - successData: [ - { - onyxMethod: Onyx.METHOD.MERGE, - key: ONYXKEYS.PRIVATE_PERSONAL_DETAILS, - value: { - isLoading: false, - }, - }, - ], - failureData: [ - { - onyxMethod: Onyx.METHOD.MERGE, - key: ONYXKEYS.PRIVATE_PERSONAL_DETAILS, - value: { - isLoading: false, - errorFields: {personalDetails: ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('common.genericErrorMessage')}, - }, - }, - ], }); } @@ -608,7 +556,6 @@ export { clearPhoneNumberError, updatePronouns, updateSelectedTimezone, - updatePrivatePersonalDetails, updatePersonalDetailsAndShipExpensifyCards, clearPersonalDetailsErrors, buildSetPersonalDetailsAndShipExpensifyCardsParams, diff --git a/src/pages/settings/Profile/PersonalDetails/PrivatePersonalDetailsConfirmMagicCodePage.tsx b/src/pages/settings/Profile/PersonalDetails/PrivatePersonalDetailsConfirmMagicCodePage.tsx deleted file mode 100644 index bac67536154e..000000000000 --- a/src/pages/settings/Profile/PersonalDetails/PrivatePersonalDetailsConfirmMagicCodePage.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import React, {useEffect, useRef} from 'react'; -import ValidateCodeActionContent from '@components/ValidateCodeActionModal/ValidateCodeActionContent'; -import useLocalize from '@hooks/useLocalize'; -import useOnyx from '@hooks/useOnyx'; -import usePrimaryContactMethod from '@hooks/usePrimaryContactMethod'; -import {clearPersonalDetailsErrors, updatePrivatePersonalDetails} from '@libs/actions/PersonalDetails'; -import {requestValidateCodeAction, resetValidateActionCodeSent} from '@libs/actions/User'; -import {normalizeCountryCode} from '@libs/CountryUtils'; -import {getLatestErrorField, getLatestErrorMessageField} from '@libs/ErrorUtils'; -import Navigation from '@libs/Navigation/Navigation'; -import {getPrivatePersonalDetailsFormValues} from '@libs/PersonalDetailsUtils'; -import CONST from '@src/CONST'; -import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES from '@src/ROUTES'; -import type {PersonalDetailsForm} from '@src/types/form'; -import {isEmptyObject} from '@src/types/utils/EmptyObject'; - -function PrivatePersonalDetailsConfirmMagicCodePage() { - const {translate} = useLocalize(); - const [privatePersonalDetails] = useOnyx(ONYXKEYS.PRIVATE_PERSONAL_DETAILS); - const [draftValues] = useOnyx(ONYXKEYS.FORMS.PERSONAL_DETAILS_FORM_DRAFT); - const [countryCode = CONST.DEFAULT_COUNTRY_CODE] = useOnyx(ONYXKEYS.COUNTRY_CODE); - const primaryLogin = usePrimaryContactMethod(); - - const [validateCodeAction] = useOnyx(ONYXKEYS.VALIDATE_ACTION_CODE); - - // Errors may be written to either errorFields (preferred) or errors depending on - // how the backend reports the failure, so check both. - const personalDetailsErrorField = getLatestErrorField(privatePersonalDetails, 'personalDetails'); - const personalDetailsError = getLatestErrorMessageField(privatePersonalDetails); - const submitError = !isEmptyObject(personalDetailsErrorField) ? personalDetailsErrorField : personalDetailsError; - const hasErrors = !isEmptyObject(submitError) || !isEmptyObject(validateCodeAction?.errorFields); - - const clearError = () => { - if (!hasErrors) { - return; - } - clearPersonalDetailsErrors(); - }; - - const wasLoading = useRef(false); - useEffect(() => { - if (privatePersonalDetails?.isLoading) { - wasLoading.current = true; - return; - } - if (wasLoading.current && !hasErrors) { - wasLoading.current = false; - resetValidateActionCodeSent(); - Navigation.goBack(ROUTES.SETTINGS_PROFILE.route); - } - wasLoading.current = false; - }, [privatePersonalDetails?.isLoading, hasErrors]); - - const values = normalizeCountryCode(getPrivatePersonalDetailsFormValues(privatePersonalDetails, draftValues)) as PersonalDetailsForm; - - const handleSubmitForm = (validateCode: string) => { - updatePrivatePersonalDetails(values, validateCode, countryCode); - }; - - return ( - requestValidateCodeAction()} - validateCodeActionErrorField="personalDetails" - handleSubmitForm={handleSubmitForm} - validateError={submitError} - clearError={clearError} - onClose={() => { - resetValidateActionCodeSent(); - Navigation.goBack(ROUTES.SETTINGS_PRIVATE_PERSONAL_DETAILS.route); - }} - isLoading={privatePersonalDetails?.isLoading} - /> - ); -} - -PrivatePersonalDetailsConfirmMagicCodePage.displayName = 'PrivatePersonalDetailsConfirmMagicCodePage'; - -export default PrivatePersonalDetailsConfirmMagicCodePage; diff --git a/src/pages/settings/Profile/PersonalDetails/PrivatePersonalDetailsPage.tsx b/src/pages/settings/Profile/PersonalDetails/PrivatePersonalDetailsPage.tsx deleted file mode 100644 index eae8cdb4172f..000000000000 --- a/src/pages/settings/Profile/PersonalDetails/PrivatePersonalDetailsPage.tsx +++ /dev/null @@ -1,396 +0,0 @@ -import {useRoute} from '@react-navigation/native'; -import {subYears} from 'date-fns'; -import {CONST as COMMON_CONST} from 'expensify-common'; -import React, {useEffect, useState} from 'react'; -import {View} from 'react-native'; -import CountrySelector from '@components/CountrySelector'; -import DatePicker from '@components/DatePicker'; -import DelegateNoAccessWrapper from '@components/DelegateNoAccessWrapper'; -import FormProvider from '@components/Form/FormProvider'; -import InputWrapper from '@components/Form/InputWrapper'; -import type {FormInputErrors, FormOnyxValues} from '@components/Form/types'; -import FullScreenLoadingIndicator from '@components/FullscreenLoadingIndicator'; -import HeaderWithBackButton from '@components/HeaderWithBackButton'; -import ScreenWrapper from '@components/ScreenWrapper'; -import type {State} from '@components/StateSelector'; -import StateSelector from '@components/StateSelector'; -import Text from '@components/Text'; -import TextInput from '@components/TextInput'; -import useLocalize from '@hooks/useLocalize'; -import useOnyx from '@hooks/useOnyx'; -import useThemeStyles from '@hooks/useThemeStyles'; -import {clearDraftValues} from '@libs/actions/FormActions'; -import {normalizeCountryCode} from '@libs/CountryUtils'; -import {appendCountryCode} from '@libs/LoginUtils'; -import Navigation from '@libs/Navigation/Navigation'; -import type {PlatformStackRouteProp} from '@libs/Navigation/PlatformStackNavigation/types'; -import type {SettingsNavigatorParamList} from '@libs/Navigation/types'; -import {getCurrentAddress, getStreetLines} from '@libs/PersonalDetailsUtils'; -import type {SkeletonSpanReasonAttributes} from '@libs/telemetry/useSkeletonSpan'; -import {doesContainReservedWord, getAgeRequirementError, isRequiredFulfilled, isValidDisplayName, isValidPhoneNumber} from '@libs/ValidationUtils'; -import CONST from '@src/CONST'; -import type {Country} from '@src/CONST'; -import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES from '@src/ROUTES'; -import type SCREENS from '@src/SCREENS'; -import INPUT_IDS from '@src/types/form/PersonalDetailsForm'; -import type {Address} from '@src/types/onyx/PrivatePersonalDetails'; - -function PrivatePersonalDetailsPage() { - const route = useRoute>(); - const fieldToFocus = route.params?.fieldToFocus; - const [privatePersonalDetails] = useOnyx(ONYXKEYS.PRIVATE_PERSONAL_DETAILS); - const [isLoadingApp = true] = useOnyx(ONYXKEYS.IS_LOADING_APP); - const [countryCode = CONST.DEFAULT_COUNTRY_CODE] = useOnyx(ONYXKEYS.COUNTRY_CODE); - const styles = useThemeStyles(); - const {translate} = useLocalize(); - - const legalFirstName = privatePersonalDetails?.legalFirstName ?? ''; - const legalLastName = privatePersonalDetails?.legalLastName ?? ''; - const phoneNumber = privatePersonalDetails?.phoneNumber ?? ''; - const dob = privatePersonalDetails?.dob ?? ''; - const address = normalizeCountryCode(getCurrentAddress(privatePersonalDetails)) as Address | undefined; - const [street1, street2Fallback] = getStreetLines(address?.street); - const initialStreet1 = street1 ?? ''; - const initialStreet2 = address?.street2 ?? street2Fallback ?? ''; - const city = address?.city ?? ''; - const state = address?.state ?? ''; - const zip = address?.zip ?? ''; - const country = address?.country ?? ''; - - const [selectedCountry, setSelectedCountry] = useState(country); - const [selectedState, setSelectedState] = useState(() => { - // If the stored state value is a full name (e.g. "California"), resolve it to a 2-letter code - // so the StateSelector dropdown can display it correctly. - if (state && !(state in COMMON_CONST.STATES)) { - const match = Object.entries(COMMON_CONST.STATES).find(([, v]) => v.stateName.toLowerCase() === state.toLowerCase()); - return match ? match[0] : state; - } - return state; - }); - - useEffect( - () => () => { - clearDraftValues(ONYXKEYS.FORMS.PERSONAL_DETAILS_FORM); - }, - [], - ); - - const validate = (values: FormOnyxValues): FormInputErrors => { - const errors: FormInputErrors = {}; - - const firstNameValue = values[INPUT_IDS.LEGAL_FIRST_NAME] ?? ''; - if (!firstNameValue.trim()) { - errors[INPUT_IDS.LEGAL_FIRST_NAME] = translate('common.error.fieldRequired'); - } else if (!isValidDisplayName(firstNameValue)) { - errors[INPUT_IDS.LEGAL_FIRST_NAME] = translate('privatePersonalDetails.error.cannotIncludeCommaOrSemicolon'); - } else if (firstNameValue.length > CONST.LEGAL_NAME.MAX_LENGTH) { - errors[INPUT_IDS.LEGAL_FIRST_NAME] = translate('common.error.characterLimitExceedCounter', firstNameValue.length, CONST.LEGAL_NAME.MAX_LENGTH); - } else if (doesContainReservedWord(firstNameValue, CONST.DISPLAY_NAME.RESERVED_NAMES)) { - errors[INPUT_IDS.LEGAL_FIRST_NAME] = translate('personalDetails.error.containsReservedWord'); - } - - const lastNameValue = values[INPUT_IDS.LEGAL_LAST_NAME] ?? ''; - if (!lastNameValue.trim()) { - errors[INPUT_IDS.LEGAL_LAST_NAME] = translate('common.error.fieldRequired'); - } else if (!isValidDisplayName(lastNameValue)) { - errors[INPUT_IDS.LEGAL_LAST_NAME] = translate('privatePersonalDetails.error.cannotIncludeCommaOrSemicolon'); - } else if (lastNameValue.length > CONST.LEGAL_NAME.MAX_LENGTH) { - errors[INPUT_IDS.LEGAL_LAST_NAME] = translate('common.error.characterLimitExceedCounter', lastNameValue.length, CONST.LEGAL_NAME.MAX_LENGTH); - } else if (doesContainReservedWord(lastNameValue, CONST.DISPLAY_NAME.RESERVED_NAMES)) { - errors[INPUT_IDS.LEGAL_LAST_NAME] = translate('personalDetails.error.containsReservedWord'); - } - - const dobValue = values[INPUT_IDS.DATE_OF_BIRTH] ?? ''; - if (!dobValue) { - errors[INPUT_IDS.DATE_OF_BIRTH] = translate('common.error.fieldRequired'); - } else { - const dateError = getAgeRequirementError(translate, dobValue, CONST.DATE_BIRTH.MIN_AGE_FOR_PAYMENT, CONST.DATE_BIRTH.MAX_AGE); - if (dateError) { - errors[INPUT_IDS.DATE_OF_BIRTH] = dateError; - } - } - - const phoneValue = values[INPUT_IDS.PHONE_NUMBER] ?? ''; - if (!isRequiredFulfilled(phoneValue)) { - errors[INPUT_IDS.PHONE_NUMBER] = translate('common.error.fieldRequired'); - } else { - const phoneWithCountryCode = appendCountryCode(phoneValue, countryCode); - if (!isValidPhoneNumber(phoneWithCountryCode)) { - errors[INPUT_IDS.PHONE_NUMBER] = translate('common.error.phoneNumber'); - } - } - - const streetValue = values[INPUT_IDS.ADDRESS_LINE_1] ?? ''; - if (!streetValue.trim()) { - errors[INPUT_IDS.ADDRESS_LINE_1] = translate('common.error.fieldRequired'); - } - - const cityValue = values[INPUT_IDS.CITY] ?? ''; - if (!cityValue.trim()) { - errors[INPUT_IDS.CITY] = translate('common.error.fieldRequired'); - } - - const stateValue = values[INPUT_IDS.STATE] || selectedState || ''; - const effectiveCountry = (values[INPUT_IDS.COUNTRY] || selectedCountry) ?? ''; - if (!stateValue.trim()) { - errors[INPUT_IDS.STATE] = translate('common.error.fieldRequired'); - } - - const zipValue = values[INPUT_IDS.ZIP_POST_CODE] ?? ''; - const countryRegexDetails = effectiveCountry ? (CONST.COUNTRY_ZIP_REGEX_DATA?.[effectiveCountry] as {regex?: RegExp; samples?: string}) : undefined; - const countrySpecificZipRegex = countryRegexDetails?.regex; - if (countrySpecificZipRegex) { - if (!countrySpecificZipRegex.test(zipValue.trim().toUpperCase())) { - if (isRequiredFulfilled(zipValue.trim())) { - errors[INPUT_IDS.ZIP_POST_CODE] = translate('privatePersonalDetails.error.incorrectZipFormat', countryRegexDetails?.samples ?? ''); - } else { - errors[INPUT_IDS.ZIP_POST_CODE] = translate('common.error.fieldRequired'); - } - } - } else if (!CONST.GENERIC_ZIP_CODE_REGEX.test(zipValue.trim().toUpperCase())) { - errors[INPUT_IDS.ZIP_POST_CODE] = translate('privatePersonalDetails.error.incorrectZipFormat'); - } - - if (!effectiveCountry) { - errors[INPUT_IDS.COUNTRY] = translate('common.error.fieldRequired'); - } - - return errors; - }; - - const hasChanges = (values: FormOnyxValues): boolean => { - if ((values[INPUT_IDS.LEGAL_FIRST_NAME] ?? '') !== legalFirstName) { - return true; - } - if ((values[INPUT_IDS.LEGAL_LAST_NAME] ?? '') !== legalLastName) { - return true; - } - if ((values[INPUT_IDS.DATE_OF_BIRTH] ?? '') !== dob) { - return true; - } - if ((values[INPUT_IDS.PHONE_NUMBER] ?? '') !== phoneNumber) { - return true; - } - if ((values[INPUT_IDS.ADDRESS_LINE_1] ?? '') !== initialStreet1) { - return true; - } - if ((values[INPUT_IDS.ADDRESS_LINE_2] ?? '') !== initialStreet2) { - return true; - } - if ((values[INPUT_IDS.CITY] ?? '') !== city) { - return true; - } - if ((values[INPUT_IDS.STATE] ?? '') !== state) { - return true; - } - if ((values[INPUT_IDS.ZIP_POST_CODE] ?? '') !== zip) { - return true; - } - if ((values[INPUT_IDS.COUNTRY] ?? '') !== country) { - return true; - } - return false; - }; - - const onSubmit = (values: FormOnyxValues) => { - if (!hasChanges(values)) { - Navigation.goBack(); - return; - } - Navigation.navigate(ROUTES.SETTINGS_PRIVATE_PERSONAL_DETAILS_CONFIRM_MAGIC_CODE); - }; - - const reasonAttributes: SkeletonSpanReasonAttributes = {context: 'PrivatePersonalDetailsPage', isLoadingApp}; - - if (isLoadingApp) { - return ( - - ); - } - - return ( - - - Navigation.goBack()} - /> - - {translate('privatePersonalDetails.basicDetails')} - - - - - - - - - - - - - {translate('privatePersonalDetails.address')} - - - - - - - - - - {selectedCountry === CONST.COUNTRY.US ? ( - - setSelectedState((value ?? '') as string)} - shouldSaveDraft - /> - - ) : ( - - - - )} - - - - - { - const newCountry = (value ?? '') as Country | ''; - setSelectedCountry(newCountry); - if (newCountry === CONST.COUNTRY.US && selectedState && !(selectedState in COMMON_CONST.STATES)) { - const match = Object.entries(COMMON_CONST.STATES).find(([, v]) => v.stateName.toLowerCase() === selectedState.toLowerCase()); - if (match) { - setSelectedState(match[0]); - } - } - }} - shouldSaveDraft - /> - - - - - ); -} - -PrivatePersonalDetailsPage.displayName = 'PrivatePersonalDetailsPage'; - -export default PrivatePersonalDetailsPage; diff --git a/src/pages/settings/Profile/ProfilePage.tsx b/src/pages/settings/Profile/ProfilePage.tsx index 57e78733fd8f..7c3f8e7cf52c 100755 --- a/src/pages/settings/Profile/ProfilePage.tsx +++ b/src/pages/settings/Profile/ProfilePage.tsx @@ -41,7 +41,6 @@ import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type {Route} from '@src/ROUTES'; import type SCREENS from '@src/SCREENS'; -import INPUT_IDS from '@src/types/form/PersonalDetailsForm'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; function ProfilePage() { @@ -133,39 +132,55 @@ function ProfilePage() { : []), ]; - const navigateToPrivateDetails = (fieldToFocus?: string) => { - if (isActingAsDelegate) { - showDelegateNoAccessModal(); - return; - } - Navigation.navigate(ROUTES.SETTINGS_PRIVATE_PERSONAL_DETAILS.getRoute(fieldToFocus)); - }; - const privateOptions = [ { description: translate('privatePersonalDetails.legalName'), title: legalName, sentryLabel: CONST.SENTRY_LABEL.SETTINGS_PROFILE.LEGAL_NAME, - action: () => navigateToPrivateDetails(INPUT_IDS.LEGAL_FIRST_NAME), + action: () => { + if (isActingAsDelegate) { + showDelegateNoAccessModal(); + return; + } + Navigation.navigate(ROUTES.SETTINGS_LEGAL_NAME); + }, }, { description: translate('common.dob'), title: privateDetails.dob ?? '', sentryLabel: CONST.SENTRY_LABEL.SETTINGS_PROFILE.DATE_OF_BIRTH, - action: () => navigateToPrivateDetails(INPUT_IDS.DATE_OF_BIRTH), + action: () => { + if (isActingAsDelegate) { + showDelegateNoAccessModal(); + return; + } + Navigation.navigate(ROUTES.SETTINGS_DATE_OF_BIRTH); + }, }, { description: translate('common.phoneNumber'), title: privateDetails.phoneNumber ?? '', sentryLabel: CONST.SENTRY_LABEL.SETTINGS_PROFILE.PHONE_NUMBER, - action: () => navigateToPrivateDetails(INPUT_IDS.PHONE_NUMBER), + action: () => { + if (isActingAsDelegate) { + showDelegateNoAccessModal(); + return; + } + Navigation.navigate(ROUTES.SETTINGS_PHONE_NUMBER); + }, brickRoadIndicator: privatePersonalDetails?.errorFields?.phoneNumber ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined, }, { description: translate('privatePersonalDetails.address'), title: getFormattedAddress(privateDetails), sentryLabel: CONST.SENTRY_LABEL.SETTINGS_PROFILE.ADDRESS, - action: () => navigateToPrivateDetails(INPUT_IDS.ADDRESS_LINE_1), + action: () => { + if (isActingAsDelegate) { + showDelegateNoAccessModal(); + return; + } + Navigation.navigate(ROUTES.SETTINGS_ADDRESS); + }, }, ];