diff --git a/src/CONST/index.ts b/src/CONST/index.ts index a13684b46d0a..771fc3f9a806 100644 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -6421,6 +6421,7 @@ const CONST = { DENIED_ACCESS_VARIANTS: { DELEGATE: 'delegate', SUBMITTER: 'submitter', + AGENT: 'agent', }, }, DELEGATE_ROLE_HELP_DOT_ARTICLE_LINK: 'https://help.expensify.com/expensify-classic/hubs/copilots-and-delegates/', diff --git a/src/components/DelegateNoAccessWrapper.tsx b/src/components/DelegateNoAccessWrapper.tsx index 8ba97901ca56..e2c6e65ee41b 100644 --- a/src/components/DelegateNoAccessWrapper.tsx +++ b/src/components/DelegateNoAccessWrapper.tsx @@ -4,18 +4,26 @@ import useOnyx from '@hooks/useOnyx'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; import AccountUtils from '@libs/AccountUtils'; import Navigation from '@libs/Navigation/Navigation'; +import {isAgentEmail} from '@libs/SessionUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import type {Account} from '@src/types/onyx'; +import type {Account, Session} from '@src/types/onyx'; import callOrReturn from '@src/types/utils/callOrReturn'; import FullPageNotFoundView from './BlockingViews/FullPageNotFoundView'; +type AccessContext = { + account: OnyxEntry; + session: OnyxEntry; +}; + const DENIED_ACCESS_VARIANTS = { // To Restrict All Delegates From Accessing The Page. - [CONST.DELEGATE.DENIED_ACCESS_VARIANTS.DELEGATE]: (account: OnyxEntry) => isDelegate(account), + [CONST.DELEGATE.DENIED_ACCESS_VARIANTS.DELEGATE]: ({account}: AccessContext) => isDelegate(account), // To Restrict Only Limited Access Delegates From Accessing The Page. - [CONST.DELEGATE.DENIED_ACCESS_VARIANTS.SUBMITTER]: (account: OnyxEntry) => isSubmitter(account), -} as const satisfies Record) => boolean>; + [CONST.DELEGATE.DENIED_ACCESS_VARIANTS.SUBMITTER]: ({account}: AccessContext) => isSubmitter(account), + // To Restrict Agent Accounts From Accessing The Page. + [CONST.DELEGATE.DENIED_ACCESS_VARIANTS.AGENT]: ({session}: AccessContext) => isAgentEmail(session?.email), +} as const satisfies Record boolean>; type AccessDeniedVariants = keyof typeof DENIED_ACCESS_VARIANTS; @@ -38,9 +46,10 @@ function isSubmitter(account: OnyxEntry) { function DelegateNoAccessWrapper({accessDeniedVariants = [], shouldForceFullScreen, onBackButtonPress, ...props}: DelegateNoAccessWrapperProps) { const [account] = useOnyx(ONYXKEYS.ACCOUNT); + const [session] = useOnyx(ONYXKEYS.SESSION); const isPageAccessDenied = accessDeniedVariants.reduce((acc, variant) => { const accessDeniedFunction = DENIED_ACCESS_VARIANTS[variant]; - return acc || accessDeniedFunction(account); + return acc || accessDeniedFunction({account, session}); }, false); const {shouldUseNarrowLayout} = useResponsiveLayout(); diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index 10c22d11c83e..09e892829868 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -3,6 +3,7 @@ import React, {useCallback} from 'react'; import {View} from 'react-native'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; import useThemeStyles from '@hooks/useThemeStyles'; +import withAgentAccessDenied from '@libs/Navigation/AppNavigator/withAgentAccessDenied'; import createPlatformStackNavigator from '@libs/Navigation/PlatformStackNavigation/createPlatformStackNavigator'; import Animations from '@libs/Navigation/PlatformStackNavigation/navigationOptions/animation'; import type {PlatformStackNavigationOptions} from '@libs/Navigation/PlatformStackNavigation/types'; @@ -401,88 +402,128 @@ const SettingsModalStackNavigator = createModalStackNavigator require('../../../../pages/settings/DynamicVerifyAccountPage').default, [SCREENS.SETTINGS.DYNAMIC_ADD_BANK_ACCOUNT_VERIFY_ACCOUNT]: () => require('../../../../pages/settings/Wallet/DynamicAddBankAccountVerifyAccountPage').default, [SCREENS.SETTINGS.SHARE_CODE]: () => require('../../../../pages/ShareCodePage').default, - [SCREENS.SETTINGS.PROFILE.PRONOUNS]: () => require('../../../../pages/settings/Profile/PronounsPage').default, + [SCREENS.SETTINGS.PROFILE.PRONOUNS]: withAgentAccessDenied(() => require('../../../../pages/settings/Profile/PronounsPage').default), [SCREENS.SETTINGS.PROFILE.DISPLAY_NAME]: () => require('../../../../pages/settings/Profile/DisplayNamePage').default, - [SCREENS.SETTINGS.PROFILE.TIMEZONE]: () => require('../../../../pages/settings/Profile/TimezoneInitialPage').default, - [SCREENS.SETTINGS.PROFILE.TIMEZONE_SELECT]: () => require('../../../../pages/settings/Profile/TimezoneSelectPage').default, + [SCREENS.SETTINGS.PROFILE.TIMEZONE]: withAgentAccessDenied(() => require('../../../../pages/settings/Profile/TimezoneInitialPage').default), + [SCREENS.SETTINGS.PROFILE.TIMEZONE_SELECT]: withAgentAccessDenied(() => require('../../../../pages/settings/Profile/TimezoneSelectPage').default), [SCREENS.SETTINGS.PROFILE.LEGAL_NAME]: () => require('../../../../pages/settings/Profile/PersonalDetails/LegalNamePage').default, - [SCREENS.SETTINGS.PROFILE.DATE_OF_BIRTH]: () => 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.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.DATE_OF_BIRTH]: withAgentAccessDenied(() => require('../../../../pages/settings/Profile/PersonalDetails/DateOfBirthPage').default), + [SCREENS.SETTINGS.PROFILE.PHONE_NUMBER]: withAgentAccessDenied(() => require('../../../../pages/settings/Profile/PersonalDetails/PhoneNumberPage').default), + [SCREENS.SETTINGS.PROFILE.ADDRESS]: withAgentAccessDenied(() => require('../../../../pages/settings/Profile/PersonalDetails/PersonalAddressPage').default), + [SCREENS.SETTINGS.PROFILE.DYNAMIC_ADDRESS_COUNTRY]: withAgentAccessDenied( + () => require('../../../../pages/settings/Profile/PersonalDetails/DynamicCountrySelectionPage').default, + ), + [SCREENS.SETTINGS.PROFILE.ADDRESS_STATE]: withAgentAccessDenied(() => require('../../../../pages/settings/Profile/PersonalDetails/StateSelectionPage').default), [SCREENS.SETTINGS.PROFILE.AVATAR]: () => require('../../../../pages/settings/Profile/Avatar/AvatarPage').default, - [SCREENS.SETTINGS.PROFILE.CONTACT_METHODS]: () => require('../../../../pages/settings/Profile/Contacts/ContactMethodsPage').default, - [SCREENS.SETTINGS.PROFILE.CONTACT_METHOD_DETAILS]: () => require('../../../../pages/settings/Profile/Contacts/ContactMethodDetailsPage').default, - [SCREENS.SETTINGS.PROFILE.NEW_CONTACT_METHOD]: () => require('../../../../pages/settings/Profile/Contacts/NewContactMethodPage').default, - [SCREENS.SETTINGS.PROFILE.NEW_CONTACT_METHOD_CONFIRM_MAGIC_CODE]: () => - require('../../../../pages/settings/Profile/Contacts/NewContactMethodConfirmMagicCodePage').default, - [SCREENS.SETTINGS.PROFILE.CONTACT_METHOD_SET_DEFAULT_CONFIRM]: () => - require('../../../../pages/settings/Profile/Contacts/SetDefaultContactMethodConfirmMagicCodePage').default, - [SCREENS.SETTINGS.PROFILE.CONTACT_METHOD_VERIFY_ACCOUNT]: () => require('../../../../pages/settings/Profile/Contacts/VerifyAccountPage').default, - [SCREENS.SETTINGS.PREFERENCES.PRIORITY_MODE]: () => require('../../../../pages/settings/Preferences/PriorityModePage').default, + [SCREENS.SETTINGS.PROFILE.CONTACT_METHODS]: withAgentAccessDenied(() => require('../../../../pages/settings/Profile/Contacts/ContactMethodsPage').default), + [SCREENS.SETTINGS.PROFILE.CONTACT_METHOD_DETAILS]: withAgentAccessDenied( + () => require('../../../../pages/settings/Profile/Contacts/ContactMethodDetailsPage').default, + ), + [SCREENS.SETTINGS.PROFILE.NEW_CONTACT_METHOD]: withAgentAccessDenied(() => require('../../../../pages/settings/Profile/Contacts/NewContactMethodPage').default), + [SCREENS.SETTINGS.PROFILE.NEW_CONTACT_METHOD_CONFIRM_MAGIC_CODE]: withAgentAccessDenied( + () => require('../../../../pages/settings/Profile/Contacts/NewContactMethodConfirmMagicCodePage').default, + ), + [SCREENS.SETTINGS.PROFILE.CONTACT_METHOD_SET_DEFAULT_CONFIRM]: withAgentAccessDenied( + () => require('../../../../pages/settings/Profile/Contacts/SetDefaultContactMethodConfirmMagicCodePage').default, + ), + [SCREENS.SETTINGS.PROFILE.CONTACT_METHOD_VERIFY_ACCOUNT]: withAgentAccessDenied( + () => require('../../../../pages/settings/Profile/Contacts/VerifyAccountPage').default, + ), + [SCREENS.SETTINGS.PREFERENCES.PRIORITY_MODE]: withAgentAccessDenied(() => require('../../../../pages/settings/Preferences/PriorityModePage').default), [SCREENS.WORKSPACE.ACCOUNTING.ROOT]: () => require('../../../../pages/workspace/accounting/PolicyAccountingPage').default, - [SCREENS.SETTINGS.PREFERENCES.LANGUAGE]: () => require('../../../../pages/settings/Preferences/LanguagePage').default, - [SCREENS.SETTINGS.PREFERENCES.THEME]: () => require('../../../../pages/settings/Preferences/ThemePage').default, - [SCREENS.SETTINGS.PREFERENCES.PAYMENT_CURRENCY]: () => require('../../../../pages/settings/Preferences/PaymentCurrencyPage').default, - [SCREENS.SETTINGS.DEVICE_MANAGEMENT]: () => require('../../../../pages/settings/Security/DeviceManagementPage').default, - [SCREENS.SETTINGS.CLOSE]: () => require('../../../../pages/settings/Security/CloseAccountPage').default, - [SCREENS.SETTINGS.APP_DOWNLOAD_LINKS]: () => require('../../../../pages/settings/AppDownloadLinks').default, - [SCREENS.SETTINGS.WALLET.CARDS_DIGITAL_DETAILS_UPDATE_ADDRESS]: () => require('../../../../pages/settings/Profile/PersonalDetails/PersonalAddressPage').default, - [SCREENS.SETTINGS.WALLET.DOMAIN_CARD]: () => require('../../../../pages/settings/Wallet/ExpensifyCardPage/index').default, - [SCREENS.SETTINGS.WALLET.EXPENSIFY_CARD_SPEND_RULES]: () => require('../../../../pages/settings/Wallet/WalletExpensifyCardSpendRulesPage').default, - [SCREENS.SETTINGS.WALLET.DOMAIN_CARD_CONFIRM_MAGIC_CODE]: () => - require('../../../../pages/settings/Wallet/ExpensifyCardPage/ExpensifyCardVerifyAccountPage').default, - [SCREENS.SETTINGS.WALLET.PERSONAL_CARD_DETAILS]: () => require('../../../../pages/settings/Wallet/PersonalCardDetailsPage').default, - [SCREENS.SETTINGS.WALLET.PERSONAL_CARD_EDIT_NAME]: () => require('../../../../pages/settings/Wallet/PersonalCardEditNamePage').default, - [SCREENS.SETTINGS.WALLET.PERSONAL_CARD_EDIT_TRANSACTION_START_DATE]: () => - require('../../../../pages/settings/Wallet/PersonalCardEditTransactionStartDatePage').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, - [SCREENS.SETTINGS.WALLET.REPORT_VIRTUAL_CARD_FRAUD_CONFIRMATION]: () => require('../../../../pages/settings/Wallet/ReportVirtualCardFraudConfirmationPage').default, - [SCREENS.SETTINGS.WALLET.CARD_ACTIVATE]: () => require('../../../../pages/settings/Wallet/ActivatePhysicalCardPage').default, - [SCREENS.SETTINGS.WALLET.CARD_CHANGE_PIN]: () => require('../../../../pages/settings/Wallet/ExpensifyCardPage/ChangePINPage').default, - [SCREENS.SETTINGS.WALLET.CARD_CHANGE_PIN_ATM]: () => require('../../../../pages/settings/Wallet/ExpensifyCardPage/ChangePINAtATMPage').default, - [SCREENS.SETTINGS.WALLET.TRANSFER_BALANCE]: () => require('../../../../pages/settings/Wallet/TransferBalancePage').default, - [SCREENS.SETTINGS.WALLET.CHOOSE_TRANSFER_ACCOUNT]: () => require('../../../../pages/settings/Wallet/ChooseTransferAccountPage').default, - [SCREENS.SETTINGS.WALLET.IMPORT_TRANSACTIONS]: () => require('../../../../pages/settings/Wallet/ImportTransactionsPage').default, - [SCREENS.SETTINGS.WALLET.IMPORT_TRANSACTIONS_CARD_NAME]: () => require('../../../../pages/settings/Wallet/ImportTransactionsCardNamePage').default, - [SCREENS.SETTINGS.WALLET.IMPORT_TRANSACTIONS_CURRENCY]: () => require('../../../../pages/settings/Wallet/ImportTransactionsCurrencyPage').default, - [SCREENS.SETTINGS.WALLET.IMPORT_TRANSACTIONS_SPREADSHEET]: () => require('../../../../pages/settings/Wallet/ImportTransactionsSpreadsheetPage').default, - [SCREENS.SETTINGS.WALLET.TRANSACTIONS_IMPORTED]: () => require('../../../../pages/settings/Wallet/TransactionsImportedPage').default, - [SCREENS.SETTINGS.WALLET.ENABLE_PAYMENTS]: () => require('../../../../pages/EnablePayments/EnablePayments').default, - [SCREENS.SETTINGS.WALLET.UNSHARE_BANK_ACCOUNT]: () => require('../../../../pages/settings/Wallet/UnshareBankAccount/UnshareBankAccount').default, - [SCREENS.SETTINGS.WALLET.ENABLE_GLOBAL_REIMBURSEMENTS_BUSINESS]: () => - require('../../../../pages/settings/Wallet/EnableGlobalReimbursements/EnableGlobalReimbursementsBusinessPage').default, - [SCREENS.SETTINGS.WALLET.ENABLE_GLOBAL_REIMBURSEMENTS_AGREEMENTS]: () => - require('../../../../pages/settings/Wallet/EnableGlobalReimbursements/EnableGlobalReimbursementsAgreementsPage').default, - [SCREENS.SETTINGS.WALLET.ENABLE_GLOBAL_REIMBURSEMENTS_SIGN]: () => - require('../../../../pages/settings/Wallet/EnableGlobalReimbursements/EnableGlobalReimbursementsSignPage').default, - [SCREENS.SETTINGS.WALLET.SHARE_BANK_ACCOUNT]: () => require('../../../../pages/settings/Wallet/ShareBankAccount/ShareBankAccount').default, - [SCREENS.SETTINGS.WALLET.TRAVEL_CVV]: () => require('../../../../pages/settings/Wallet/TravelCVVPage/TravelCVVPage').default, - [SCREENS.SETTINGS.WALLET.TRAVEL_CVV_VERIFY_ACCOUNT]: () => require('../../../../pages/settings/Wallet/TravelCVVPage/TravelCVVVerifyAccountPage').default, - [SCREENS.SETTINGS.WALLET.PERSONAL_CARD_BANK_CONNECTION]: () => require('@pages/settings/Wallet/PersonalCards/steps/BankConnection').default, - [SCREENS.SETTINGS.WALLET.PERSONAL_CARD_FIX_CONNECTION]: () => require('@pages/settings/Wallet/PersonalCards/FixPersonalCardConnectionPage').default, - [SCREENS.SETTINGS.WALLET.PERSONAL_CARD_ADD_NEW]: () => require('../../../../pages/settings/Wallet/PersonalCards/AddNewCardPage').default, - [SCREENS.SETTINGS.WALLET.PERSONAL_CARD_WARNING]: () => require('../../../../pages/settings/Wallet/PersonalCards/PersonalCardWarning').default, - [SCREENS.SETTINGS.WALLET.PERSONAL_CARD_UPGRADE]: () => require('../../../../pages/settings/Wallet/PersonalCards/upgrade/PersonalCardUpgradePage').default, - [SCREENS.SETTINGS.ADD_DEBIT_CARD]: () => require('../../../../pages/settings/Wallet/AddDebitCardPage').default, - [SCREENS.SETTINGS.ADD_BANK_ACCOUNT]: () => require('../../../../pages/settings/Wallet/InternationalDepositAccount').default, - [SCREENS.SETTINGS.ADD_US_BANK_ACCOUNT]: () => require('../../../../pages/AddPersonalBankAccountPage').default, - [SCREENS.SETTINGS.ADD_US_BANK_ACCOUNT_ENTRY_POINT]: () => - require('../../../../pages/settings/Wallet/InternationalDepositAccount/subPages/AccountFlowEntryPoint').default, - [SCREENS.SETTINGS.UPDATE_PERSONAL_BANK_ACCOUNT]: () => require('../../../../pages/settings/Wallet/UpdatePersonalBankAccountPage').default, - [SCREENS.SETTINGS.ADD_BANK_ACCOUNT_SELECT_COUNTRY_VERIFY_ACCOUNT]: () => - require('../../../../pages/settings/Wallet/InternationalDepositAccount/CountrySelectionVerifyAccountPage').default, - [SCREENS.SETTINGS.BANK_ACCOUNT_PURPOSE]: () => require('../../../../pages/settings/Wallet/BankAccountPurposePage').default, + [SCREENS.SETTINGS.PREFERENCES.LANGUAGE]: withAgentAccessDenied(() => require('../../../../pages/settings/Preferences/LanguagePage').default), + [SCREENS.SETTINGS.PREFERENCES.THEME]: withAgentAccessDenied(() => require('../../../../pages/settings/Preferences/ThemePage').default), + [SCREENS.SETTINGS.PREFERENCES.PAYMENT_CURRENCY]: withAgentAccessDenied(() => require('../../../../pages/settings/Preferences/PaymentCurrencyPage').default), + [SCREENS.SETTINGS.DEVICE_MANAGEMENT]: withAgentAccessDenied(() => require('../../../../pages/settings/Security/DeviceManagementPage').default), + [SCREENS.SETTINGS.CLOSE]: withAgentAccessDenied(() => require('../../../../pages/settings/Security/CloseAccountPage').default), + [SCREENS.SETTINGS.APP_DOWNLOAD_LINKS]: withAgentAccessDenied(() => require('../../../../pages/settings/AppDownloadLinks').default), + [SCREENS.SETTINGS.WALLET.CARDS_DIGITAL_DETAILS_UPDATE_ADDRESS]: withAgentAccessDenied( + () => require('../../../../pages/settings/Profile/PersonalDetails/PersonalAddressPage').default, + ), + [SCREENS.SETTINGS.WALLET.DOMAIN_CARD]: withAgentAccessDenied(() => require('../../../../pages/settings/Wallet/ExpensifyCardPage/index').default), + [SCREENS.SETTINGS.WALLET.EXPENSIFY_CARD_SPEND_RULES]: withAgentAccessDenied( + () => require('../../../../pages/settings/Wallet/WalletExpensifyCardSpendRulesPage').default, + ), + [SCREENS.SETTINGS.WALLET.DOMAIN_CARD_CONFIRM_MAGIC_CODE]: withAgentAccessDenied( + () => require('../../../../pages/settings/Wallet/ExpensifyCardPage/ExpensifyCardVerifyAccountPage').default, + ), + [SCREENS.SETTINGS.WALLET.PERSONAL_CARD_DETAILS]: withAgentAccessDenied(() => require('../../../../pages/settings/Wallet/PersonalCardDetailsPage').default), + [SCREENS.SETTINGS.WALLET.PERSONAL_CARD_EDIT_NAME]: withAgentAccessDenied(() => require('../../../../pages/settings/Wallet/PersonalCardEditNamePage').default), + [SCREENS.SETTINGS.WALLET.PERSONAL_CARD_EDIT_TRANSACTION_START_DATE]: withAgentAccessDenied( + () => require('../../../../pages/settings/Wallet/PersonalCardEditTransactionStartDatePage').default, + ), + [SCREENS.SETTINGS.WALLET.REPORT_VIRTUAL_CARD_FRAUD]: withAgentAccessDenied(() => require('../../../../pages/settings/Wallet/ReportVirtualCardFraudPage').default), + [SCREENS.SETTINGS.WALLET.REPORT_VIRTUAL_CARD_FRAUD_CONFIRM_MAGIC_CODE]: withAgentAccessDenied( + () => require('../../../../pages/settings/Wallet/ReportVirtualCardFraudVerifyAccountPage').default, + ), + [SCREENS.SETTINGS.WALLET.REPORT_VIRTUAL_CARD_FRAUD_CONFIRMATION]: withAgentAccessDenied( + () => require('../../../../pages/settings/Wallet/ReportVirtualCardFraudConfirmationPage').default, + ), + [SCREENS.SETTINGS.WALLET.CARD_ACTIVATE]: withAgentAccessDenied(() => require('../../../../pages/settings/Wallet/ActivatePhysicalCardPage').default), + [SCREENS.SETTINGS.WALLET.CARD_CHANGE_PIN]: withAgentAccessDenied(() => require('../../../../pages/settings/Wallet/ExpensifyCardPage/ChangePINPage').default), + [SCREENS.SETTINGS.WALLET.CARD_CHANGE_PIN_ATM]: withAgentAccessDenied( + () => require('../../../../pages/settings/Wallet/ExpensifyCardPage/ChangePINAtATMPage').default, + ), + [SCREENS.SETTINGS.WALLET.TRANSFER_BALANCE]: withAgentAccessDenied(() => require('../../../../pages/settings/Wallet/TransferBalancePage').default), + [SCREENS.SETTINGS.WALLET.CHOOSE_TRANSFER_ACCOUNT]: withAgentAccessDenied(() => require('../../../../pages/settings/Wallet/ChooseTransferAccountPage').default), + [SCREENS.SETTINGS.WALLET.IMPORT_TRANSACTIONS]: withAgentAccessDenied(() => require('../../../../pages/settings/Wallet/ImportTransactionsPage').default), + [SCREENS.SETTINGS.WALLET.IMPORT_TRANSACTIONS_CARD_NAME]: withAgentAccessDenied( + () => require('../../../../pages/settings/Wallet/ImportTransactionsCardNamePage').default, + ), + [SCREENS.SETTINGS.WALLET.IMPORT_TRANSACTIONS_CURRENCY]: withAgentAccessDenied( + () => require('../../../../pages/settings/Wallet/ImportTransactionsCurrencyPage').default, + ), + [SCREENS.SETTINGS.WALLET.IMPORT_TRANSACTIONS_SPREADSHEET]: withAgentAccessDenied( + () => require('../../../../pages/settings/Wallet/ImportTransactionsSpreadsheetPage').default, + ), + [SCREENS.SETTINGS.WALLET.TRANSACTIONS_IMPORTED]: withAgentAccessDenied(() => require('../../../../pages/settings/Wallet/TransactionsImportedPage').default), + [SCREENS.SETTINGS.WALLET.ENABLE_PAYMENTS]: withAgentAccessDenied(() => require('../../../../pages/EnablePayments/EnablePayments').default), + [SCREENS.SETTINGS.WALLET.UNSHARE_BANK_ACCOUNT]: withAgentAccessDenied( + () => require('../../../../pages/settings/Wallet/UnshareBankAccount/UnshareBankAccount').default, + ), + [SCREENS.SETTINGS.WALLET.ENABLE_GLOBAL_REIMBURSEMENTS_BUSINESS]: withAgentAccessDenied( + () => require('../../../../pages/settings/Wallet/EnableGlobalReimbursements/EnableGlobalReimbursementsBusinessPage').default, + ), + [SCREENS.SETTINGS.WALLET.ENABLE_GLOBAL_REIMBURSEMENTS_AGREEMENTS]: withAgentAccessDenied( + () => require('../../../../pages/settings/Wallet/EnableGlobalReimbursements/EnableGlobalReimbursementsAgreementsPage').default, + ), + [SCREENS.SETTINGS.WALLET.ENABLE_GLOBAL_REIMBURSEMENTS_SIGN]: withAgentAccessDenied( + () => require('../../../../pages/settings/Wallet/EnableGlobalReimbursements/EnableGlobalReimbursementsSignPage').default, + ), + [SCREENS.SETTINGS.WALLET.SHARE_BANK_ACCOUNT]: withAgentAccessDenied(() => require('../../../../pages/settings/Wallet/ShareBankAccount/ShareBankAccount').default), + [SCREENS.SETTINGS.WALLET.TRAVEL_CVV]: withAgentAccessDenied(() => require('../../../../pages/settings/Wallet/TravelCVVPage/TravelCVVPage').default), + [SCREENS.SETTINGS.WALLET.TRAVEL_CVV_VERIFY_ACCOUNT]: withAgentAccessDenied( + () => require('../../../../pages/settings/Wallet/TravelCVVPage/TravelCVVVerifyAccountPage').default, + ), + [SCREENS.SETTINGS.WALLET.PERSONAL_CARD_BANK_CONNECTION]: withAgentAccessDenied(() => require('@pages/settings/Wallet/PersonalCards/steps/BankConnection').default), + [SCREENS.SETTINGS.WALLET.PERSONAL_CARD_FIX_CONNECTION]: withAgentAccessDenied( + () => require('@pages/settings/Wallet/PersonalCards/FixPersonalCardConnectionPage').default, + ), + [SCREENS.SETTINGS.WALLET.PERSONAL_CARD_ADD_NEW]: withAgentAccessDenied(() => require('../../../../pages/settings/Wallet/PersonalCards/AddNewCardPage').default), + [SCREENS.SETTINGS.WALLET.PERSONAL_CARD_WARNING]: withAgentAccessDenied( + () => require('../../../../pages/settings/Wallet/PersonalCards/PersonalCardWarning').default, + ), + [SCREENS.SETTINGS.WALLET.PERSONAL_CARD_UPGRADE]: withAgentAccessDenied( + () => require('../../../../pages/settings/Wallet/PersonalCards/upgrade/PersonalCardUpgradePage').default, + ), + [SCREENS.SETTINGS.ADD_DEBIT_CARD]: withAgentAccessDenied(() => require('../../../../pages/settings/Wallet/AddDebitCardPage').default), + [SCREENS.SETTINGS.ADD_BANK_ACCOUNT]: withAgentAccessDenied(() => require('../../../../pages/settings/Wallet/InternationalDepositAccount').default), + [SCREENS.SETTINGS.ADD_US_BANK_ACCOUNT]: withAgentAccessDenied(() => require('../../../../pages/AddPersonalBankAccountPage').default), + [SCREENS.SETTINGS.ADD_US_BANK_ACCOUNT_ENTRY_POINT]: withAgentAccessDenied( + () => require('../../../../pages/settings/Wallet/InternationalDepositAccount/subPages/AccountFlowEntryPoint').default, + ), + [SCREENS.SETTINGS.UPDATE_PERSONAL_BANK_ACCOUNT]: withAgentAccessDenied(() => require('../../../../pages/settings/Wallet/UpdatePersonalBankAccountPage').default), + [SCREENS.SETTINGS.ADD_BANK_ACCOUNT_SELECT_COUNTRY_VERIFY_ACCOUNT]: withAgentAccessDenied( + () => require('../../../../pages/settings/Wallet/InternationalDepositAccount/CountrySelectionVerifyAccountPage').default, + ), + [SCREENS.SETTINGS.BANK_ACCOUNT_PURPOSE]: withAgentAccessDenied(() => require('../../../../pages/settings/Wallet/BankAccountPurposePage').default), [SCREENS.SETTINGS.RULES.ROOT]: () => require('../../../../pages/settings/Rules/ExpenseRulesPage').default, - [SCREENS.SETTINGS.AGENTS.ADD]: () => require('../../../../pages/settings/Agents/AddAgentPage').default, - [SCREENS.SETTINGS.AGENTS.ADD_AVATAR]: () => require('../../../../pages/settings/Agents/Fields/AddAgentAvatarPage').default, - [SCREENS.SETTINGS.AGENTS.EDIT]: () => require('../../../../pages/settings/Agents/EditAgentPage').default, - [SCREENS.SETTINGS.AGENTS.EDIT_NAME]: () => require('../../../../pages/settings/Agents/Fields/EditNamePage').default, - [SCREENS.SETTINGS.AGENTS.EDIT_PROMPT]: () => require('../../../../pages/settings/Agents/Fields/EditPromptPage').default, - [SCREENS.SETTINGS.AGENTS.EDIT_AVATAR]: () => require('../../../../pages/settings/Agents/Fields/EditAgentAvatarPage').default, + [SCREENS.SETTINGS.AGENTS.ADD]: withAgentAccessDenied(() => require('../../../../pages/settings/Agents/AddAgentPage').default), + [SCREENS.SETTINGS.AGENTS.ADD_AVATAR]: withAgentAccessDenied(() => require('../../../../pages/settings/Agents/Fields/AddAgentAvatarPage').default), + [SCREENS.SETTINGS.AGENTS.EDIT]: withAgentAccessDenied(() => require('../../../../pages/settings/Agents/EditAgentPage').default), + [SCREENS.SETTINGS.AGENTS.EDIT_NAME]: withAgentAccessDenied(() => require('../../../../pages/settings/Agents/Fields/EditNamePage').default), + [SCREENS.SETTINGS.AGENTS.EDIT_PROMPT]: withAgentAccessDenied(() => require('../../../../pages/settings/Agents/Fields/EditPromptPage').default), + [SCREENS.SETTINGS.AGENTS.EDIT_AVATAR]: withAgentAccessDenied(() => require('../../../../pages/settings/Agents/Fields/EditAgentAvatarPage').default), [SCREENS.SETTINGS.RULES.ADD]: () => require('../../../../pages/settings/Rules/AddRulePage').default, [SCREENS.SETTINGS.RULES.ADD_MERCHANT]: () => require('../../../../pages/settings/Rules/Fields/AddMerchantPage').default, [SCREENS.SETTINGS.RULES.ADD_RENAME_MERCHANT]: () => require('../../../../pages/settings/Rules/Fields/AddRenameMerchantPage').default, @@ -508,13 +549,16 @@ const SettingsModalStackNavigator = createModalStackNavigator require('../../../../pages/settings/Profile/CustomStatus/SetDatePage').default, [SCREENS.SETTINGS.PROFILE.STATUS_CLEAR_AFTER_TIME]: () => require('../../../../pages/settings/Profile/CustomStatus/SetTimePage').default, [SCREENS.SETTINGS.PROFILE.VACATION_DELEGATE]: () => require('../../../../pages/settings/Profile/CustomStatus/VacationDelegatePage').default, - [SCREENS.SETTINGS.SUBSCRIPTION.SIZE]: () => require('../../../../pages/settings/Subscription/SubscriptionSize').default, - [SCREENS.SETTINGS.SUBSCRIPTION.EXPENSIFY_CODE]: () => require('../../../../pages/settings/Subscription/ExpensifyCodePage').default, - [SCREENS.SETTINGS.SUBSCRIPTION.SETTINGS_DETAILS]: () => require('../../../../pages/settings/Subscription/SubscriptionSettings').default, - [SCREENS.SETTINGS.SUBSCRIPTION.DISABLE_AUTO_RENEW_SURVEY]: () => require('../../../../pages/settings/Subscription/DisableAutoRenewSurveyPage').default, - [SCREENS.SETTINGS.SUBSCRIPTION.CANCEL_SUBSCRIPTION]: () => require('../../../../pages/settings/Subscription/CancelSubscriptionPage').default, - [SCREENS.SETTINGS.SUBSCRIPTION.SUBSCRIPTION_DOWNGRADE_BLOCKED]: () => - require('../../../../pages/settings/Subscription/SubscriptionPlan/SubscriptionPlanDowngradeBlockedPage').default, + [SCREENS.SETTINGS.SUBSCRIPTION.SIZE]: withAgentAccessDenied(() => require('../../../../pages/settings/Subscription/SubscriptionSize').default), + [SCREENS.SETTINGS.SUBSCRIPTION.EXPENSIFY_CODE]: withAgentAccessDenied(() => require('../../../../pages/settings/Subscription/ExpensifyCodePage').default), + [SCREENS.SETTINGS.SUBSCRIPTION.SETTINGS_DETAILS]: withAgentAccessDenied(() => require('../../../../pages/settings/Subscription/SubscriptionSettings').default), + [SCREENS.SETTINGS.SUBSCRIPTION.DISABLE_AUTO_RENEW_SURVEY]: withAgentAccessDenied( + () => require('../../../../pages/settings/Subscription/DisableAutoRenewSurveyPage').default, + ), + [SCREENS.SETTINGS.SUBSCRIPTION.CANCEL_SUBSCRIPTION]: withAgentAccessDenied(() => require('../../../../pages/settings/Subscription/CancelSubscriptionPage').default), + [SCREENS.SETTINGS.SUBSCRIPTION.SUBSCRIPTION_DOWNGRADE_BLOCKED]: withAgentAccessDenied( + () => require('../../../../pages/settings/Subscription/SubscriptionPlan/SubscriptionPlanDowngradeBlockedPage').default, + ), [SCREENS.WORKSPACE.DYNAMIC_WORKSPACE_INVITE]: () => require('../../../../pages/workspace/DynamicWorkspaceInvitePage').default, [SCREENS.WORKSPACE.MEMBERS_IMPORT]: () => require('../../../../pages/workspace/members/ImportMembersPage').default, [SCREENS.WORKSPACE.MEMBERS_IMPORTED]: () => require('../../../../pages/workspace/members/ImportedMembersPage').default, @@ -678,12 +722,18 @@ const SettingsModalStackNavigator = createModalStackNavigator('../../../../pages/workspace/accounting/qbd/import/QuickbooksDesktopCustomersDisplayedAsPage').default, [SCREENS.WORKSPACE.ACCOUNTING.QUICKBOOKS_DESKTOP_ITEMS]: () => require('../../../../pages/workspace/accounting/qbd/import/QuickbooksDesktopItemsPage').default, [SCREENS.CONNECT_EXISTING_BUSINESS_BANK_ACCOUNT_ROOT]: () => require('@pages/workspace/ConnectExistingBusinessBankAccountPage').default, - [SCREENS.REIMBURSEMENT_ACCOUNT]: () => require('../../../../pages/ReimbursementAccount/ReimbursementAccountPage').default, - [SCREENS.REIMBURSEMENT_ACCOUNT_NON_USD]: () => require('../../../../pages/ReimbursementAccount/NonUSD/NonUSDVerifiedBankAccountFlowPage').default, - [SCREENS.REIMBURSEMENT_ACCOUNT_VERIFY_ACCOUNT]: () => require('../../../../pages/ReimbursementAccount/ReimbursementAccountVerifyAccountPage').default, - [SCREENS.REIMBURSEMENT_ACCOUNT_ENTER_SIGNER_INFO]: () => require('../../../../pages/ReimbursementAccount/EnterSignerInfo').default, - [SCREENS.SETTINGS.REPORT_CARD_LOST_OR_DAMAGED]: () => require('../../../../pages/settings/Wallet/ReportCardLostPage').default, - [SCREENS.SETTINGS.REPORT_CARD_LOST_OR_DAMAGED_CONFIRM_MAGIC_CODE]: () => require('../../../../pages/settings/Wallet/ReportCardLostConfirmMagicCodePage').default, + [SCREENS.REIMBURSEMENT_ACCOUNT]: withAgentAccessDenied(() => require('../../../../pages/ReimbursementAccount/ReimbursementAccountPage').default), + [SCREENS.REIMBURSEMENT_ACCOUNT_NON_USD]: withAgentAccessDenied( + () => require('../../../../pages/ReimbursementAccount/NonUSD/NonUSDVerifiedBankAccountFlowPage').default, + ), + [SCREENS.REIMBURSEMENT_ACCOUNT_VERIFY_ACCOUNT]: withAgentAccessDenied( + () => require('../../../../pages/ReimbursementAccount/ReimbursementAccountVerifyAccountPage').default, + ), + [SCREENS.REIMBURSEMENT_ACCOUNT_ENTER_SIGNER_INFO]: withAgentAccessDenied(() => require('../../../../pages/ReimbursementAccount/EnterSignerInfo').default), + [SCREENS.SETTINGS.REPORT_CARD_LOST_OR_DAMAGED]: withAgentAccessDenied(() => require('../../../../pages/settings/Wallet/ReportCardLostPage').default), + [SCREENS.SETTINGS.REPORT_CARD_LOST_OR_DAMAGED_CONFIRM_MAGIC_CODE]: withAgentAccessDenied( + () => require('../../../../pages/settings/Wallet/ReportCardLostConfirmMagicCodePage').default, + ), [SCREENS.SETTINGS.DYNAMIC_KEYBOARD_SHORTCUTS]: () => require('../../../../pages/settings/DynamicKeyboardShortcutsPage').default, [SCREENS.SETTINGS.DYNAMIC_EXIT_SURVEY_REASON]: () => require('../../../../pages/settings/ExitSurvey/DynamicExitSurveyReasonPage').default, [SCREENS.SETTINGS.DYNAMIC_EXIT_SURVEY_CONFIRM]: () => require('../../../../pages/settings/ExitSurvey/DynamicExitSurveyConfirmPage').default, @@ -896,9 +946,11 @@ const SettingsModalStackNavigator = createModalStackNavigator require('../../../../pages/workspace/companyCards/WorkspaceCompanyCardStatementCloseDatePage').default, [SCREENS.SETTINGS.SAVE_THE_WORLD]: () => require('../../../../pages/TeachersUnite/SaveTheWorldPage').default, - [SCREENS.SETTINGS.SUBSCRIPTION.CHANGE_PAYMENT_CURRENCY]: () => require('../../../../pages/settings/PaymentCard/ChangeCurrency').default, - [SCREENS.SETTINGS.SUBSCRIPTION.CHANGE_BILLING_CURRENCY]: () => require('../../../../pages/settings/Subscription/PaymentCard/ChangeBillingCurrency').default, - [SCREENS.SETTINGS.SUBSCRIPTION.ADD_PAYMENT_CARD]: () => require('../../../../pages/settings/Subscription/PaymentCard').default, + [SCREENS.SETTINGS.SUBSCRIPTION.CHANGE_PAYMENT_CURRENCY]: withAgentAccessDenied(() => require('../../../../pages/settings/PaymentCard/ChangeCurrency').default), + [SCREENS.SETTINGS.SUBSCRIPTION.CHANGE_BILLING_CURRENCY]: withAgentAccessDenied( + () => require('../../../../pages/settings/Subscription/PaymentCard/ChangeBillingCurrency').default, + ), + [SCREENS.SETTINGS.SUBSCRIPTION.ADD_PAYMENT_CARD]: withAgentAccessDenied(() => require('../../../../pages/settings/Subscription/PaymentCard').default), [SCREENS.SETTINGS.ADD_PAYMENT_CARD_CHANGE_CURRENCY]: () => require('../../../../pages/settings/PaymentCard/ChangeCurrency').default, [SCREENS.WORKSPACE.REPORT_FIELDS_CREATE]: () => require('../../../../pages/workspace/reports/CreateReportFieldsPage').default, [SCREENS.WORKSPACE.REPORT_FIELDS_SETTINGS]: () => require('../../../../pages/workspace/reports/ReportFieldsSettingsPage').default, @@ -922,21 +974,31 @@ const SettingsModalStackNavigator = createModalStackNavigator('../../../../pages/workspace/accounting/intacct/import/SageIntacctAddUserDimensionPage').default, [SCREENS.WORKSPACE.ACCOUNTING.SAGE_INTACCT_EDIT_USER_DIMENSION]: () => require('../../../../pages/workspace/accounting/intacct/import/SageIntacctEditUserDimensionsPage').default, - [SCREENS.SETTINGS.DELEGATE.VERIFY_ACCOUNT]: () => require('../../../../pages/settings/Security/AddDelegate/VerifyAccountPage').default, - [SCREENS.SETTINGS.DELEGATE.ADD_DELEGATE]: () => require('../../../../pages/settings/Security/AddDelegate/AddDelegatePage').default, - [SCREENS.SETTINGS.DELEGATE.DELEGATE_ROLE]: () => require('../../../../pages/settings/Security/AddDelegate/SelectDelegateRolePage').default, - [SCREENS.SETTINGS.DELEGATE.UPDATE_DELEGATE_ROLE]: () => - require('../../../../pages/settings/Security/AddDelegate/UpdateDelegateRole/UpdateDelegateRolePage').default, - [SCREENS.SETTINGS.DELEGATE.UPDATE_DELEGATE_ROLE_CONFIRM_MAGIC_CODE]: () => - require('../../../../pages/settings/Security/AddDelegate/UpdateDelegateRole/UpdateDelegateMagicCodePage').default, - [SCREENS.SETTINGS.DELEGATE.DELEGATE_CONFIRM]: () => require('../../../../pages/settings/Security/AddDelegate/ConfirmDelegatePage').default, - [SCREENS.SETTINGS.DELEGATE.DELEGATE_CONFIRM_MAGIC_CODE]: () => require('../../../../pages/settings/Security/AddDelegate/ConfirmDelegateMagicCodePage').default, - [SCREENS.SETTINGS.MERGE_ACCOUNTS.ACCOUNT_DETAILS]: () => require('../../../../pages/settings/Security/MergeAccounts/AccountDetailsPage').default, - [SCREENS.SETTINGS.MERGE_ACCOUNTS.ACCOUNT_VALIDATE]: () => require('../../../../pages/settings/Security/MergeAccounts/AccountValidatePage').default, - [SCREENS.SETTINGS.MERGE_ACCOUNTS.MERGE_RESULT]: () => require('../../../../pages/settings/Security/MergeAccounts/MergeResultPage').default, - [SCREENS.SETTINGS.LOCK.LOCK_ACCOUNT]: () => require('../../../../pages/settings/Security/LockAccount/LockAccountPage').default, - [SCREENS.SETTINGS.LOCK.UNLOCK_ACCOUNT]: () => require('../../../../pages/settings/Security/LockAccount/UnlockAccountPage').default, - [SCREENS.SETTINGS.LOCK.FAILED_TO_LOCK_ACCOUNT]: () => require('../../../../pages/settings/Security/LockAccount/FailedToLockAccountPage').default, + [SCREENS.SETTINGS.DELEGATE.VERIFY_ACCOUNT]: withAgentAccessDenied(() => require('../../../../pages/settings/Security/AddDelegate/VerifyAccountPage').default), + [SCREENS.SETTINGS.DELEGATE.ADD_DELEGATE]: withAgentAccessDenied(() => require('../../../../pages/settings/Security/AddDelegate/AddDelegatePage').default), + [SCREENS.SETTINGS.DELEGATE.DELEGATE_ROLE]: withAgentAccessDenied(() => require('../../../../pages/settings/Security/AddDelegate/SelectDelegateRolePage').default), + [SCREENS.SETTINGS.DELEGATE.UPDATE_DELEGATE_ROLE]: withAgentAccessDenied( + () => require('../../../../pages/settings/Security/AddDelegate/UpdateDelegateRole/UpdateDelegateRolePage').default, + ), + [SCREENS.SETTINGS.DELEGATE.UPDATE_DELEGATE_ROLE_CONFIRM_MAGIC_CODE]: withAgentAccessDenied( + () => require('../../../../pages/settings/Security/AddDelegate/UpdateDelegateRole/UpdateDelegateMagicCodePage').default, + ), + [SCREENS.SETTINGS.DELEGATE.DELEGATE_CONFIRM]: withAgentAccessDenied(() => require('../../../../pages/settings/Security/AddDelegate/ConfirmDelegatePage').default), + [SCREENS.SETTINGS.DELEGATE.DELEGATE_CONFIRM_MAGIC_CODE]: withAgentAccessDenied( + () => require('../../../../pages/settings/Security/AddDelegate/ConfirmDelegateMagicCodePage').default, + ), + [SCREENS.SETTINGS.MERGE_ACCOUNTS.ACCOUNT_DETAILS]: withAgentAccessDenied( + () => require('../../../../pages/settings/Security/MergeAccounts/AccountDetailsPage').default, + ), + [SCREENS.SETTINGS.MERGE_ACCOUNTS.ACCOUNT_VALIDATE]: withAgentAccessDenied( + () => require('../../../../pages/settings/Security/MergeAccounts/AccountValidatePage').default, + ), + [SCREENS.SETTINGS.MERGE_ACCOUNTS.MERGE_RESULT]: withAgentAccessDenied(() => require('../../../../pages/settings/Security/MergeAccounts/MergeResultPage').default), + [SCREENS.SETTINGS.LOCK.LOCK_ACCOUNT]: withAgentAccessDenied(() => require('../../../../pages/settings/Security/LockAccount/LockAccountPage').default), + [SCREENS.SETTINGS.LOCK.UNLOCK_ACCOUNT]: withAgentAccessDenied(() => require('../../../../pages/settings/Security/LockAccount/UnlockAccountPage').default), + [SCREENS.SETTINGS.LOCK.FAILED_TO_LOCK_ACCOUNT]: withAgentAccessDenied( + () => require('../../../../pages/settings/Security/LockAccount/FailedToLockAccountPage').default, + ), [SCREENS.WORKSPACE.HR_GUSTO_APPROVAL_MODE]: () => require('../../../../pages/workspace/hr/gusto/GustoApprovalModePage').default, [SCREENS.WORKSPACE.HR_GUSTO_FINAL_APPROVER]: () => require('../../../../pages/workspace/hr/gusto/GustoFinalApproverPage').default, [SCREENS.WORKSPACE.HR_ZENEFITS_APPROVAL_MODE]: () => require('../../../../pages/workspace/hr/zenefits/ZenefitsApprovalModePage').default, @@ -1011,14 +1073,18 @@ const SettingsModalStackNavigator = createModalStackNavigator({ - [SCREENS.TWO_FACTOR_AUTH.ROOT]: () => require('../../../../pages/settings/Security/TwoFactorAuth/TwoFactorAuthPage').default, - [SCREENS.TWO_FACTOR_AUTH.VERIFY]: () => require('../../../../pages/settings/Security/TwoFactorAuth/VerifyPage').default, - [SCREENS.TWO_FACTOR_AUTH.VERIFY_ACCOUNT]: () => require('../../../../pages/settings/Security/TwoFactorAuth/VerifyAccountPage').default, - [SCREENS.TWO_FACTOR_AUTH.DISABLED]: () => require('../../../../pages/settings/Security/TwoFactorAuth/DisabledPage').default, - [SCREENS.TWO_FACTOR_AUTH.DISABLE]: () => require('../../../../pages/settings/Security/TwoFactorAuth/DisablePage').default, - [SCREENS.TWO_FACTOR_AUTH.SUCCESS]: () => require('../../../../pages/settings/Security/TwoFactorAuth/SuccessPage').default, - [SCREENS.TWO_FACTOR_AUTH.REPLACE_VERIFY_OLD]: () => require('../../../../pages/settings/Security/TwoFactorAuth/ReplaceDeviceVerifyOldPage').default, - [SCREENS.TWO_FACTOR_AUTH.REPLACE_VERIFY_NEW]: () => require('../../../../pages/settings/Security/TwoFactorAuth/ReplaceDeviceVerifyNewPage').default, + [SCREENS.TWO_FACTOR_AUTH.ROOT]: withAgentAccessDenied(() => require('../../../../pages/settings/Security/TwoFactorAuth/TwoFactorAuthPage').default), + [SCREENS.TWO_FACTOR_AUTH.VERIFY]: withAgentAccessDenied(() => require('../../../../pages/settings/Security/TwoFactorAuth/VerifyPage').default), + [SCREENS.TWO_FACTOR_AUTH.VERIFY_ACCOUNT]: withAgentAccessDenied(() => require('../../../../pages/settings/Security/TwoFactorAuth/VerifyAccountPage').default), + [SCREENS.TWO_FACTOR_AUTH.DISABLED]: withAgentAccessDenied(() => require('../../../../pages/settings/Security/TwoFactorAuth/DisabledPage').default), + [SCREENS.TWO_FACTOR_AUTH.DISABLE]: withAgentAccessDenied(() => require('../../../../pages/settings/Security/TwoFactorAuth/DisablePage').default), + [SCREENS.TWO_FACTOR_AUTH.SUCCESS]: withAgentAccessDenied(() => require('../../../../pages/settings/Security/TwoFactorAuth/SuccessPage').default), + [SCREENS.TWO_FACTOR_AUTH.REPLACE_VERIFY_OLD]: withAgentAccessDenied( + () => require('../../../../pages/settings/Security/TwoFactorAuth/ReplaceDeviceVerifyOldPage').default, + ), + [SCREENS.TWO_FACTOR_AUTH.REPLACE_VERIFY_NEW]: withAgentAccessDenied( + () => require('../../../../pages/settings/Security/TwoFactorAuth/ReplaceDeviceVerifyNewPage').default, + ), }); const EnablePaymentsStackNavigator = createModalStackNavigator({ diff --git a/src/libs/Navigation/AppNavigator/Navigators/SettingsSplitNavigator.tsx b/src/libs/Navigation/AppNavigator/Navigators/SettingsSplitNavigator.tsx index 0a1e69484e13..54acdc253344 100644 --- a/src/libs/Navigation/AppNavigator/Navigators/SettingsSplitNavigator.tsx +++ b/src/libs/Navigation/AppNavigator/Navigators/SettingsSplitNavigator.tsx @@ -4,6 +4,7 @@ import {View} from 'react-native'; import FocusTrapForScreens from '@components/FocusTrap/FocusTrapForScreen'; import createSplitNavigator from '@libs/Navigation/AppNavigator/createSplitNavigator'; import useSplitNavigatorScreenOptions from '@libs/Navigation/AppNavigator/useSplitNavigatorScreenOptions'; +import withAgentAccessDenied from '@libs/Navigation/AppNavigator/withAgentAccessDenied'; import type {SettingsSplitNavigatorParamList} from '@libs/Navigation/types'; import SCREENS from '@src/SCREENS'; import type ReactComponentModule from '@src/types/utils/ReactComponentModule'; @@ -13,18 +14,18 @@ const loadInitialSettingsPage = () => require('../../../.. type Screens = Partial React.ComponentType>>; const CENTRAL_PANE_SETTINGS_SCREENS = { - [SCREENS.SETTINGS.PREFERENCES.ROOT]: () => require('../../../../pages/settings/Preferences/PreferencesPage').default, - [SCREENS.SETTINGS.SECURITY]: () => require('../../../../pages/settings/Security/SecuritySettingsPage').default, + [SCREENS.SETTINGS.PREFERENCES.ROOT]: withAgentAccessDenied(() => require('../../../../pages/settings/Preferences/PreferencesPage').default), + [SCREENS.SETTINGS.SECURITY]: withAgentAccessDenied(() => require('../../../../pages/settings/Security/SecuritySettingsPage').default), [SCREENS.SETTINGS.COPILOT]: () => require('../../../../pages/settings/Copilot/CopilotPage').default, [SCREENS.SETTINGS.PROFILE.ROOT]: () => require('../../../../pages/settings/Profile/ProfilePage').default, - [SCREENS.SETTINGS.WALLET.ROOT]: () => require('../../../../pages/settings/Wallet/WalletPage').default, - [SCREENS.SETTINGS.AGENTS.ROOT]: () => require('../../../../pages/settings/Agents/AgentsPage').default, + [SCREENS.SETTINGS.WALLET.ROOT]: withAgentAccessDenied(() => require('../../../../pages/settings/Wallet/WalletPage').default), + [SCREENS.SETTINGS.AGENTS.ROOT]: withAgentAccessDenied(() => require('../../../../pages/settings/Agents/AgentsPage').default), [SCREENS.SETTINGS.RULES.ROOT]: () => require('../../../../pages/settings/Rules/ExpenseRulesPage').default, [SCREENS.SETTINGS.HELP]: () => require('../../../../pages/settings/HelpPage/HelpPage').default, [SCREENS.SETTINGS.ABOUT]: () => require('../../../../pages/settings/AboutPage/AboutPage').default, [SCREENS.SETTINGS.TROUBLESHOOT]: () => require('../../../../pages/settings/Troubleshoot/TroubleshootPage').default, [SCREENS.SETTINGS.SAVE_THE_WORLD]: () => require('../../../../pages/TeachersUnite/SaveTheWorldPage').default, - [SCREENS.SETTINGS.SUBSCRIPTION.ROOT]: () => require('../../../../pages/settings/Subscription/SubscriptionSettingsPage').default, + [SCREENS.SETTINGS.SUBSCRIPTION.ROOT]: withAgentAccessDenied(() => require('../../../../pages/settings/Subscription/SubscriptionSettingsPage').default), } satisfies Screens; const Split = createSplitNavigator(); diff --git a/src/libs/Navigation/AppNavigator/withAgentAccessDenied.tsx b/src/libs/Navigation/AppNavigator/withAgentAccessDenied.tsx new file mode 100644 index 000000000000..f54d10747e81 --- /dev/null +++ b/src/libs/Navigation/AppNavigator/withAgentAccessDenied.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import DelegateNoAccessWrapper from '@components/DelegateNoAccessWrapper'; +import CONST from '@src/CONST'; + +function withAgentAccessDenied(getComponent: () => React.ComponentType): () => React.ComponentType { + let ProtectedComponent: React.ComponentType | undefined; + return () => { + if (!ProtectedComponent) { + const Component = getComponent(); + ProtectedComponent = (props) => ( + + + + ); + } + return ProtectedComponent; + }; +} + +export default withAgentAccessDenied; diff --git a/src/pages/settings/InitialSettingsPage.tsx b/src/pages/settings/InitialSettingsPage.tsx index 7d1e8fe47f08..f2dda79a6e64 100755 --- a/src/pages/settings/InitialSettingsPage.tsx +++ b/src/pages/settings/InitialSettingsPage.tsx @@ -44,6 +44,7 @@ import {hasPendingExpensifyCardAction} from '@libs/CardUtils'; import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute'; import useIsSidebarRouteActive from '@libs/Navigation/helpers/useIsSidebarRouteActive'; import Navigation from '@libs/Navigation/Navigation'; +import {useIsAgentAccount} from '@libs/SessionUtils'; import {getFreeTrialText, hasSubscriptionRedDotError} from '@libs/SubscriptionUtils'; import type {SkeletonSpanReasonAttributes} from '@libs/telemetry/useSkeletonSpan'; import {shouldHideOldAppRedirect} from '@libs/TryNewDotUtils'; @@ -170,6 +171,7 @@ function InitialSettingsPage({currentUserPersonalDetails}: InitialSettingsPagePr const [tryNewDot, tryNewDotMetadata] = useOnyx(ONYXKEYS.NVP_TRY_NEW_DOT); const isLoadingTryNewDot = isLoadingOnyxValue(tryNewDotMetadata); const {isBetaEnabled} = usePermissions(); + const isAgentAccount = useIsAgentAccount(); const freeTrialText = getFreeTrialText(currentUserPersonalDetails.accountID, translate, policies, introSelected, firstDayFreeTrial, lastDayFreeTrial); @@ -261,15 +263,19 @@ function InitialSettingsPage({currentUserPersonalDetails}: InitialSettingsPagePr sentryLabel: CONST.SENTRY_LABEL.ACCOUNT.PROFILE, action: () => Navigation.navigate(ROUTES.SETTINGS_PROFILE.getRoute()), }, - { - translationKey: 'common.wallet', - icon: icons.Wallet, - screenName: SCREENS.SETTINGS.WALLET.ROOT, - brickRoadIndicator: walletBrickRoadIndicator, - sentryLabel: CONST.SENTRY_LABEL.ACCOUNT.WALLET, - action: () => Navigation.navigate(ROUTES.SETTINGS_WALLET), - badgeText: hasActivatedWallet ? convertToDisplayString(userWallet?.currentBalance, CONST.CURRENCY.USD) : undefined, - }, + ...(!isAgentAccount + ? [ + { + translationKey: 'common.wallet' as const, + icon: icons.Wallet, + screenName: SCREENS.SETTINGS.WALLET.ROOT, + brickRoadIndicator: walletBrickRoadIndicator, + sentryLabel: CONST.SENTRY_LABEL.ACCOUNT.WALLET, + action: () => Navigation.navigate(ROUTES.SETTINGS_WALLET), + badgeText: hasActivatedWallet ? convertToDisplayString(userWallet?.currentBalance, CONST.CURRENCY.USD) : undefined, + }, + ] + : []), { translationKey: 'expenseRulesPage.title', icon: icons.Bolt, @@ -277,13 +283,17 @@ function InitialSettingsPage({currentUserPersonalDetails}: InitialSettingsPagePr sentryLabel: CONST.SENTRY_LABEL.ACCOUNT.RULES, action: () => Navigation.navigate(ROUTES.SETTINGS_RULES), }, - { - translationKey: 'common.preferences', - icon: icons.Gear, - screenName: SCREENS.SETTINGS.PREFERENCES.ROOT, - sentryLabel: CONST.SENTRY_LABEL.ACCOUNT.PREFERENCES, - action: () => Navigation.navigate(ROUTES.SETTINGS_PREFERENCES), - }, + ...(!isAgentAccount + ? [ + { + translationKey: 'common.preferences' as const, + icon: icons.Gear, + screenName: SCREENS.SETTINGS.PREFERENCES.ROOT, + sentryLabel: CONST.SENTRY_LABEL.ACCOUNT.PREFERENCES, + action: () => Navigation.navigate(ROUTES.SETTINGS_PREFERENCES), + }, + ] + : []), { translationKey: 'delegate.copilot', icon: icons.Users, @@ -291,17 +301,21 @@ function InitialSettingsPage({currentUserPersonalDetails}: InitialSettingsPagePr sentryLabel: CONST.SENTRY_LABEL.ACCOUNT.COPILOT, action: () => Navigation.navigate(ROUTES.SETTINGS_COPILOT), }, - { - translationKey: 'initialSettingsPage.security', - icon: icons.Lock, - screenName: SCREENS.SETTINGS.SECURITY, - brickRoadIndicator: securityBrickRoadIndicator, - sentryLabel: CONST.SENTRY_LABEL.ACCOUNT.SECURITY, - action: () => Navigation.navigate(ROUTES.SETTINGS_SECURITY), - }, + ...(!isAgentAccount + ? [ + { + translationKey: 'initialSettingsPage.security' as const, + icon: icons.Lock, + screenName: SCREENS.SETTINGS.SECURITY, + brickRoadIndicator: securityBrickRoadIndicator, + sentryLabel: CONST.SENTRY_LABEL.ACCOUNT.SECURITY, + action: () => Navigation.navigate(ROUTES.SETTINGS_SECURITY), + }, + ] + : []), ]; - if (isBetaEnabled(CONST.BETAS.CUSTOM_AGENT)) { + if (!isAgentAccount && isBetaEnabled(CONST.BETAS.CUSTOM_AGENT)) { const rulesIndex = accountItems.findIndex((item) => item.screenName === SCREENS.SETTINGS.RULES.ROOT); accountItems.splice(rulesIndex + 1, 0, { translationKey: 'agentsPage.title', @@ -314,7 +328,7 @@ function InitialSettingsPage({currentUserPersonalDetails}: InitialSettingsPagePr }); } - if (subscriptionPlan || (amountOwed ?? 0) > 0) { + if (!isAgentAccount && (subscriptionPlan || (amountOwed ?? 0) > 0)) { accountItems.splice(1, 0, { translationKey: 'allSettingsScreen.subscription', icon: icons.CreditCard, diff --git a/tests/ui/InitialSettingsPageTest.tsx b/tests/ui/InitialSettingsPageTest.tsx new file mode 100644 index 000000000000..ecc84addf717 --- /dev/null +++ b/tests/ui/InitialSettingsPageTest.tsx @@ -0,0 +1,245 @@ +import {PortalProvider} from '@gorhom/portal'; +import {NavigationContainer} from '@react-navigation/native'; +import type * as ReactNavigation from '@react-navigation/native'; +import {act, render, screen, waitFor} from '@testing-library/react-native'; +import React from 'react'; +import Onyx from 'react-native-onyx'; +import ComposeProviders from '@components/ComposeProviders'; +import {LocaleContextProvider} from '@components/LocaleContextProvider'; +import OnyxListItemProvider from '@components/OnyxListItemProvider'; +import {CurrentReportIDContextProvider} from '@hooks/useCurrentReportID'; +import usePermissions from '@hooks/usePermissions'; +import useSubscriptionPlan from '@hooks/useSubscriptionPlan'; +import {navigationRef} from '@libs/Navigation/Navigation'; +import createPlatformStackNavigator from '@libs/Navigation/PlatformStackNavigation/createPlatformStackNavigator'; +import type {SettingsSplitNavigatorParamList} from '@libs/Navigation/types'; +import InitialSettingsPage from '@pages/settings/InitialSettingsPage'; +import CONST from '@src/CONST'; +import ONYXKEYS from '@src/ONYXKEYS'; +import SCREENS from '@src/SCREENS'; +import type {PersonalDetails, PersonalDetailsList} from '@src/types/onyx'; +import * as TestHelper from '../utils/TestHelper'; +import waitForBatchedUpdatesWithAct from '../utils/waitForBatchedUpdatesWithAct'; + +jest.mock('@libs/Navigation/Navigation', () => ({ + navigate: jest.fn(), + goBack: jest.fn(), + getActiveRoute: jest.fn(() => ''), + getActiveRouteWithoutParams: jest.fn(() => ''), + isNavigationReady: jest.fn(() => Promise.resolve()), + clearPreloadedRoutes: jest.fn(), +})); + +jest.mock('@react-navigation/native', () => { + const actualNav = jest.requireActual('@react-navigation/native'); + return { + ...actualNav, + useRoute: jest.fn(() => ({params: {}})), + createNavigationContainerRef: () => ({ + getState: () => jest.fn(), + }), + usePreventRemove: jest.fn(), + }; +}); + +jest.mock('@userActions/Wallet', () => ({ + openInitialSettingsPage: jest.fn(), +})); + +jest.mock('@userActions/App', () => ({ + confirmReadyToOpenApp: jest.fn(), + setLocale: jest.fn(), +})); + +jest.mock('@libs/Navigation/helpers/useIsSidebarRouteActive', () => jest.fn(() => false)); + +jest.mock('@hooks/useSubscriptionPlan', () => jest.fn(() => null)); + +jest.mock('@hooks/usePermissions', () => jest.fn(() => ({isBetaEnabled: () => false}))); + +jest.mock('@components/AccountSwitcher', () => { + function MockAccountSwitcher() { + return null; + } + MockAccountSwitcher.displayName = 'AccountSwitcher'; + return MockAccountSwitcher; +}); + +jest.mock('@components/AccountSwitcherSkeletonView', () => { + function MockAccountSwitcherSkeletonView() { + return null; + } + MockAccountSwitcherSkeletonView.displayName = 'AccountSwitcherSkeletonView'; + return MockAccountSwitcherSkeletonView; +}); + +jest.mock('@components/Navigation/TabBarBottomContent', () => { + function MockTabBarBottomContent() { + return null; + } + MockTabBarBottomContent.displayName = 'TabBarBottomContent'; + return MockTabBarBottomContent; +}); + +jest.mock('@components/Navigation/TopBarWithLoadingBar', () => { + function MockTopBarWithLoadingBar() { + return null; + } + MockTopBarWithLoadingBar.displayName = 'TopBarWithLoadingBar'; + return MockTopBarWithLoadingBar; +}); + +jest.mock('@components/MenuItem', () => { + const ReactMock = require('react') as typeof React; + const {Text} = require('react-native') as {Text: React.ComponentType<{testID: string; children?: React.ReactNode}>}; + return ({title}: {title: string}) => ReactMock.createElement(Text, {testID: `menu-item-${String(title)}`}, title); +}); + +const mockUsePermissions = jest.mocked(usePermissions); +const mockUseSubscriptionPlan = jest.mocked(useSubscriptionPlan); + +const Stack = createPlatformStackNavigator(); + +function renderPage() { + return render( + + + + + + + + + , + ); +} + +describe('InitialSettingsPage - agent account', () => { + const accountID = 123; + + beforeAll(async () => { + Onyx.init({keys: ONYXKEYS}); + + await act(async () => { + await Onyx.set(ONYXKEYS.NVP_PREFERRED_LOCALE, 'en' as const); + }); + await waitForBatchedUpdatesWithAct(); + }); + + afterEach(async () => { + await Onyx.clear(); + await waitForBatchedUpdatesWithAct(); + jest.clearAllMocks(); + mockUsePermissions.mockImplementation(() => ({isBetaEnabled: () => false})); + mockUseSubscriptionPlan.mockImplementation(() => null); + }); + + async function setupUser(email: string) { + await TestHelper.signInWithTestUser(accountID, email); + + const personalDetails: PersonalDetailsList = { + [accountID]: { + accountID, + login: email, + displayName: email, + avatar: 'https://example.com/avatar.png', + avatarThumbnail: 'https://example.com/avatar.png', + } as PersonalDetails, + }; + + await act(async () => { + await Onyx.merge(ONYXKEYS.PERSONAL_DETAILS_LIST, personalDetails); + await Onyx.merge(ONYXKEYS.IS_LOADING_APP, false); + }); + + await waitForBatchedUpdatesWithAct(); + } + + it('hides Wallet, Preferences and Security for agent account', async () => { + await setupUser('agent_123@expensify.ai'); + + renderPage(); + await waitForBatchedUpdatesWithAct(); + + await waitFor(() => { + expect(screen.queryByTestId('menu-item-Wallet')).toBeNull(); + expect(screen.queryByTestId('menu-item-Preferences')).toBeNull(); + expect(screen.queryByTestId('menu-item-Security')).toBeNull(); + }); + }); + + it('shows Copilot for agent account', async () => { + await setupUser('agent_123@expensify.ai'); + + renderPage(); + await waitForBatchedUpdatesWithAct(); + + await waitFor(() => { + expect(screen.getByTestId('menu-item-Copilot')).toBeDefined(); + }); + }); + + it('shows Wallet, Preferences and Security for non-agent account', async () => { + await setupUser('user@expensify.com'); + + renderPage(); + await waitForBatchedUpdatesWithAct(); + + await waitFor(() => { + expect(screen.getByTestId('menu-item-Wallet')).toBeDefined(); + expect(screen.getByTestId('menu-item-Preferences')).toBeDefined(); + expect(screen.getByTestId('menu-item-Security')).toBeDefined(); + }); + }); + + it('hides Subscription for agent account', async () => { + mockUseSubscriptionPlan.mockReturnValue(CONST.POLICY.TYPE.TEAM); + await setupUser('agent_123@expensify.ai'); + + renderPage(); + await waitForBatchedUpdatesWithAct(); + + await waitFor(() => { + expect(screen.queryByTestId('menu-item-Subscription')).toBeNull(); + }); + }); + + it('shows Subscription for non-agent account', async () => { + mockUseSubscriptionPlan.mockReturnValue(CONST.POLICY.TYPE.TEAM); + await setupUser('user@expensify.com'); + + renderPage(); + await waitForBatchedUpdatesWithAct(); + + await waitFor(() => { + expect(screen.getByTestId('menu-item-Subscription')).toBeDefined(); + }); + }); + + it('hides Agents for agent account when CUSTOM_AGENT beta is enabled', async () => { + mockUsePermissions.mockReturnValue({isBetaEnabled: (beta: string) => beta === CONST.BETAS.CUSTOM_AGENT}); + await setupUser('agent_123@expensify.ai'); + + renderPage(); + await waitForBatchedUpdatesWithAct(); + + await waitFor(() => { + expect(screen.queryByTestId('menu-item-Agents')).toBeNull(); + }); + }); + + it('shows Agents for non-agent account when CUSTOM_AGENT beta is enabled', async () => { + mockUsePermissions.mockReturnValue({isBetaEnabled: (beta: string) => beta === CONST.BETAS.CUSTOM_AGENT}); + await setupUser('user@expensify.com'); + + renderPage(); + await waitForBatchedUpdatesWithAct(); + + await waitFor(() => { + expect(screen.getByTestId('menu-item-Agents')).toBeDefined(); + }); + }); +}); diff --git a/tests/unit/withAgentAccessDenied.test.tsx b/tests/unit/withAgentAccessDenied.test.tsx new file mode 100644 index 000000000000..40223647d78c --- /dev/null +++ b/tests/unit/withAgentAccessDenied.test.tsx @@ -0,0 +1,74 @@ +import {act, render, screen, waitFor} from '@testing-library/react-native'; +import React from 'react'; +import Onyx from 'react-native-onyx'; +import ComposeProviders from '@components/ComposeProviders'; +import {LocaleContextProvider} from '@components/LocaleContextProvider'; +import Text from '@components/Text'; +import withAgentAccessDenied from '@libs/Navigation/AppNavigator/withAgentAccessDenied'; +import ONYXKEYS from '@src/ONYXKEYS'; +import * as TestHelper from '../utils/TestHelper'; +import waitForBatchedUpdatesWithAct from '../utils/waitForBatchedUpdatesWithAct'; + +jest.mock('@libs/Navigation/Navigation', () => ({ + goBack: jest.fn(), + dismissModal: jest.fn(), + getActiveRoute: jest.fn(() => ''), +})); + +jest.mock('@hooks/useResponsiveLayout', () => () => ({shouldUseNarrowLayout: false})); + +function ProtectedContent() { + return Protected Content; +} + +const getProtectedComponent = withAgentAccessDenied(() => ProtectedContent); + +function renderComponent() { + const Component = getProtectedComponent(); + return render( + + + , + ); +} + +describe('withAgentAccessDenied', () => { + beforeAll(async () => { + Onyx.init({keys: ONYXKEYS}); + await act(async () => { + await Onyx.set(ONYXKEYS.NVP_PREFERRED_LOCALE, 'en' as const); + }); + await waitForBatchedUpdatesWithAct(); + }); + + afterEach(async () => { + await Onyx.clear(); + await waitForBatchedUpdatesWithAct(); + }); + + it('shows access denied view for agent account', async () => { + await TestHelper.signInWithTestUser(1, 'agent_123@expensify.ai'); + await waitForBatchedUpdatesWithAct(); + + renderComponent(); + await waitForBatchedUpdatesWithAct(); + + await waitFor(() => { + expect(screen.queryByTestId('protected-content')).toBeNull(); + expect(screen.getByText('Not so fast...')).toBeDefined(); + }); + }); + + it('renders wrapped component for non-agent account', async () => { + await TestHelper.signInWithTestUser(1, 'user@expensify.com'); + await waitForBatchedUpdatesWithAct(); + + renderComponent(); + await waitForBatchedUpdatesWithAct(); + + await waitFor(() => { + expect(screen.getByTestId('protected-content')).toBeDefined(); + expect(screen.queryByText('Not so fast...')).toBeNull(); + }); + }); +});