diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 9f4555bb4c56..a52ca15ac597 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -3365,11 +3365,12 @@ const ROUTES = { }, WORKSPACE_RULES: { route: 'workspaces/:policyID/rules', - getRoute: (policyID: string | undefined) => { + /** @param tab preselects a Rules tab. The page otherwise restores the last one used. */ + getRoute: (policyID: string | undefined, tab?: string) => { if (!policyID) { Log.warn('Invalid policyID is used to build the WORKSPACE_RULES route'); } - return `workspaces/${policyID}/rules` as const; + return `workspaces/${policyID}/rules${tab ? `?tab=${tab}` : ''}` as const; }, }, WORKSPACE_DISTANCE_RATES: { diff --git a/src/components/Rule/RuleCategoriesDisabledEmptyState.tsx b/src/components/Rule/RuleCategoriesDisabledEmptyState.tsx index b04946666cff..52f88456bcb0 100644 --- a/src/components/Rule/RuleCategoriesDisabledEmptyState.tsx +++ b/src/components/Rule/RuleCategoriesDisabledEmptyState.tsx @@ -1,15 +1,21 @@ import Button from '@components/ButtonComposed'; import FixedFooter from '@components/FixedFooter'; +import {ModalActions} from '@components/Modal/Global/ModalContext'; +import ScrollView from '@components/ScrollView'; import WorkspaceEmptyStateSection from '@components/WorkspaceEmptyStateSection'; +import useConfirmModal from '@hooks/useConfirmModal'; import {useMemoizedLazyIllustrations} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; import usePolicyData from '@hooks/usePolicyData'; import useThemeStyles from '@hooks/useThemeStyles'; import {enablePolicyCategories, openPolicyCategoriesPage} from '@libs/actions/Policy/Category'; +import Navigation from '@libs/Navigation/Navigation'; +import {hasAccountingConnections} from '@libs/PolicyUtils'; import CONST from '@src/CONST'; +import ROUTES from '@src/ROUTES'; import React from 'react'; import {View} from 'react-native'; @@ -24,8 +30,25 @@ function RuleCategoriesDisabledEmptyState({policyID}: RuleCategoriesDisabledEmpt const {translate} = useLocalize(); const illustrations = useMemoizedLazyIllustrations(['FolderOpen']); const policyData = usePolicyData(policyID); + const {showConfirmModal} = useConfirmModal(); + const isConnectedToAccounting = hasAccountingConnections(policyData.policy); + + const enableCategories = async () => { + // Accounting owns Categories while a connection is active, same as the Categories toggle on More features. + if (isConnectedToAccounting) { + const {action} = await showConfirmModal({ + title: translate('workspace.moreFeatures.connectionsWarningModal.featureEnabledTitle'), + prompt: translate('workspace.moreFeatures.connectionsWarningModal.featureEnabledText'), + confirmText: translate('workspace.moreFeatures.connectionsWarningModal.manageSettings'), + cancelText: translate('common.cancel'), + }); + if (action !== ModalActions.CONFIRM) { + return; + } + Navigation.navigate(ROUTES.POLICY_ACCOUNTING.getRoute(policyID)); + return; + } - const enableCategories = () => { enablePolicyCategories(policyData, true, false); // The categories collection is empty while the feature is disabled, and enabling it only merges the @@ -35,14 +58,15 @@ function RuleCategoriesDisabledEmptyState({policyID}: RuleCategoriesDisabledEmpt return ( - - + + + +