diff --git a/src/components/ConnectToNetSuiteFlow/index.tsx b/src/components/ConnectToNetSuiteFlow/index.tsx index e0c48c442c9d..89d212a3e582 100644 --- a/src/components/ConnectToNetSuiteFlow/index.tsx +++ b/src/components/ConnectToNetSuiteFlow/index.tsx @@ -5,7 +5,6 @@ import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; import {isAuthenticationError} from '@libs/actions/connections'; -import {getAdminPoliciesConnectedToNetSuite} from '@libs/actions/Policy/Policy'; import Navigation from '@libs/Navigation/Navigation'; import {useAccountingState} from '@pages/workspace/accounting/AccountingContext'; import {getInitialSubPageForNetsuiteTokenInput} from '@pages/workspace/accounting/netsuite/utils'; @@ -13,12 +12,13 @@ import type {AnchorPosition} from '@styles/index'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; +import {hasPoliciesConnectedToNetSuiteSelector} from '@src/selectors/Policy'; import type {ConnectToNetSuiteFlowProps} from './types'; function ConnectToNetSuiteFlow({policyID}: ConnectToNetSuiteFlowProps) { const {translate} = useLocalize(); - const hasPoliciesConnectedToNetSuite = !!getAdminPoliciesConnectedToNetSuite()?.length; + const [hasPoliciesConnectedToNetSuite] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {selector: hasPoliciesConnectedToNetSuiteSelector}); // We need to use isSmallScreenWidth instead of shouldUseNarrowLayout to use the correct modal type // eslint-disable-next-line rulesdir/prefer-shouldUseNarrowLayout-instead-of-isSmallScreenWidth diff --git a/src/components/ConnectToSageIntacctFlow/index.tsx b/src/components/ConnectToSageIntacctFlow/index.tsx index ef68e503d37e..12cef7523087 100644 --- a/src/components/ConnectToSageIntacctFlow/index.tsx +++ b/src/components/ConnectToSageIntacctFlow/index.tsx @@ -1,7 +1,7 @@ import {useEffect} from 'react'; +import useHasPoliciesConnectedToSageIntacct from '@hooks/useHasPoliciesConnectedToSageIntacct'; import useOnyx from '@hooks/useOnyx'; import {isAuthenticationError} from '@libs/actions/connections'; -import {getAdminPoliciesConnectedToSageIntacct} from '@libs/actions/Policy/Policy'; import Navigation from '@libs/Navigation/Navigation'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; @@ -12,7 +12,7 @@ type ConnectToSageIntacctFlowProps = { }; function ConnectToSageIntacctFlow({policyID}: ConnectToSageIntacctFlowProps) { - const hasPoliciesConnectedToSageIntacct = !!getAdminPoliciesConnectedToSageIntacct().length; + const hasPoliciesConnectedToSageIntacct = useHasPoliciesConnectedToSageIntacct(); const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`); const shouldGoToEnterCredentials = isAuthenticationError(policy, CONST.POLICY.CONNECTIONS.NAME.SAGE_INTACCT); diff --git a/src/hooks/useAdminPoliciesConnectedToNetSuite.ts b/src/hooks/useAdminPoliciesConnectedToNetSuite.ts new file mode 100644 index 000000000000..c4ad30785f6b --- /dev/null +++ b/src/hooks/useAdminPoliciesConnectedToNetSuite.ts @@ -0,0 +1,10 @@ +import ONYXKEYS from '@src/ONYXKEYS'; +import {adminPoliciesConnectedToNetSuiteSelector} from '@src/selectors/Policy'; +import useOnyx from './useOnyx'; + +function useAdminPoliciesConnectedToNetSuite() { + const [policies] = useOnyx(ONYXKEYS.COLLECTION.POLICY); + return adminPoliciesConnectedToNetSuiteSelector(policies); +} + +export default useAdminPoliciesConnectedToNetSuite; diff --git a/src/hooks/useAdminPoliciesConnectedToSageIntacct.ts b/src/hooks/useAdminPoliciesConnectedToSageIntacct.ts new file mode 100644 index 000000000000..ec85c2271293 --- /dev/null +++ b/src/hooks/useAdminPoliciesConnectedToSageIntacct.ts @@ -0,0 +1,10 @@ +import ONYXKEYS from '@src/ONYXKEYS'; +import {adminPoliciesConnectedToSageIntacctSelector} from '@src/selectors/Policy'; +import useOnyx from './useOnyx'; + +function useAdminPoliciesConnectedToSageIntacct() { + const [policies] = useOnyx(ONYXKEYS.COLLECTION.POLICY); + return adminPoliciesConnectedToSageIntacctSelector(policies); +} + +export default useAdminPoliciesConnectedToSageIntacct; diff --git a/src/hooks/useHasPoliciesConnectedToSageIntacct.ts b/src/hooks/useHasPoliciesConnectedToSageIntacct.ts new file mode 100644 index 000000000000..c5b01ef951ef --- /dev/null +++ b/src/hooks/useHasPoliciesConnectedToSageIntacct.ts @@ -0,0 +1,10 @@ +import ONYXKEYS from '@src/ONYXKEYS'; +import {hasPoliciesConnectedToSageIntacctSelector} from '@src/selectors/Policy'; +import useOnyx from './useOnyx'; + +function useHasPoliciesConnectedToSageIntacct() { + const [hasPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {selector: hasPoliciesConnectedToSageIntacctSelector}); + return hasPolicies ?? false; +} + +export default useHasPoliciesConnectedToSageIntacct; diff --git a/src/libs/actions/Policy/Policy.ts b/src/libs/actions/Policy/Policy.ts index 87a02f757be2..eac7e7cfee3e 100644 --- a/src/libs/actions/Policy/Policy.ts +++ b/src/libs/actions/Policy/Policy.ts @@ -6225,14 +6225,6 @@ function getAdminPolicies(): Policy[] { ); } -function getAdminPoliciesConnectedToSageIntacct(): Policy[] { - return Object.values(deprecatedAllPolicies ?? {}).filter((policy): policy is Policy => !!policy && policy.role === CONST.POLICY.ROLE.ADMIN && !!policy?.connections?.intacct); -} - -function getAdminPoliciesConnectedToNetSuite(): Policy[] { - return Object.values(deprecatedAllPolicies ?? {}).filter((policy): policy is Policy => !!policy && policy.role === CONST.POLICY.ROLE.ADMIN && !!policy?.connections?.netsuite); -} - /** * Call the API to set default report title pattern for the given policy * @param policyID - id of the policy to apply the naming pattern to @@ -7170,8 +7162,6 @@ export { openPolicyEditCardLimitTypePage, requestExpensifyCardLimitIncrease, getAdminPolicies, - getAdminPoliciesConnectedToNetSuite, - getAdminPoliciesConnectedToSageIntacct, hasInvoicingDetails, clearAllPolicies, enablePolicyRules, diff --git a/src/pages/workspace/accounting/AccountingContext/index.tsx b/src/pages/workspace/accounting/AccountingContext/index.tsx index a02fd0b38a0c..e41e0d48c618 100644 --- a/src/pages/workspace/accounting/AccountingContext/index.tsx +++ b/src/pages/workspace/accounting/AccountingContext/index.tsx @@ -3,6 +3,7 @@ import type {RefObject} from 'react'; import type {View} from 'react-native'; import type {OnyxEntry} from 'react-native-onyx'; import AccountingConnectionConfirmationModal from '@components/AccountingConnectionConfirmationModal'; +import useHasPoliciesConnectedToSageIntacct from '@hooks/useHasPoliciesConnectedToSageIntacct'; import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; import {removePolicyConnection} from '@libs/actions/connections'; @@ -28,6 +29,7 @@ function AccountingContextProvider({children, policy}: AccountingContextProvider const {translate} = useLocalize(); const policyID = policy?.id; const accountingIcons = useMemoizedLazyExpensifyIcons(['IntacctSquare', 'QBOSquare', 'XeroSquare', 'NetSuiteSquare', 'QBDSquare']); + const hasPoliciesConnectedToSageIntacct = useHasPoliciesConnectedToSageIntacct(); const startIntegrationFlow = useCallback( (newActiveIntegration: ActiveIntegration) => { @@ -39,6 +41,7 @@ function AccountingContextProvider({children, policy}: AccountingContextProvider newActiveIntegration.name, policyID, translate, + hasPoliciesConnectedToSageIntacct, undefined, undefined, newActiveIntegration.integrationToDisconnect, @@ -58,7 +61,7 @@ function AccountingContextProvider({children, policy}: AccountingContextProvider key: Math.random(), }); }, - [policy, policyID, translate, accountingIcons], + [policy, policyID, translate, hasPoliciesConnectedToSageIntacct, accountingIcons], ); const closeConfirmationModal = () => { @@ -94,8 +97,18 @@ function AccountingContextProvider({children, policy}: AccountingContextProvider return null; } - return getAccountingIntegrationData(activeIntegration.name, policyID, translate, policy, activeIntegration.key, undefined, undefined, undefined, accountingIcons) - ?.setupConnectionFlow; + return getAccountingIntegrationData( + activeIntegration.name, + policyID, + translate, + hasPoliciesConnectedToSageIntacct, + policy, + activeIntegration.key, + undefined, + undefined, + undefined, + accountingIcons, + )?.setupConnectionFlow; }; const shouldShowConfirmationModal = !!activeIntegration?.shouldDisconnectIntegrationBeforeConnecting && !!activeIntegration?.integrationToDisconnect; diff --git a/src/pages/workspace/accounting/PolicyAccountingPage.tsx b/src/pages/workspace/accounting/PolicyAccountingPage.tsx index 1d88894ba81f..293942cb4a7d 100644 --- a/src/pages/workspace/accounting/PolicyAccountingPage.tsx +++ b/src/pages/workspace/accounting/PolicyAccountingPage.tsx @@ -21,6 +21,7 @@ import ThreeDotsMenu from '@components/ThreeDotsMenu'; import type ThreeDotsMenuProps from '@components/ThreeDotsMenu/types'; import useEnvironment from '@hooks/useEnvironment'; import useExpensifyCardFeeds from '@hooks/useExpensifyCardFeeds'; +import useHasPoliciesConnectedToSageIntacct from '@hooks/useHasPoliciesConnectedToSageIntacct'; import {useMemoizedLazyExpensifyIcons, useMemoizedLazyIllustrations} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; @@ -70,6 +71,7 @@ type RouteParams = { function PolicyAccountingPage({policy}: PolicyAccountingPageProps) { useWorkspaceDocumentTitle(policy?.name, 'workspace.common.accounting'); + const hasPoliciesConnectedToSageIntacct = useHasPoliciesConnectedToSageIntacct(); const [connectionSyncProgress] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CONNECTION_SYNC_PROGRESS}${policy?.id}`); const [conciergeReportID] = useOnyx(ONYXKEYS.CONCIERGE_REPORT_ID); const theme = useTheme(); @@ -297,7 +299,18 @@ function PolicyAccountingPage({policy}: PolicyAccountingPageProps) { if (isEmptyObject(policy?.connections) && !isSyncInProgress && policyID) { return accountingIntegrations .map((integration) => { - const integrationData = getAccountingIntegrationData(integration, policyID, translate, undefined, undefined, undefined, undefined, undefined, accountingIcons); + const integrationData = getAccountingIntegrationData( + integration, + policyID, + translate, + hasPoliciesConnectedToSageIntacct, + undefined, + undefined, + undefined, + undefined, + undefined, + accountingIcons, + ); if (!integrationData) { return undefined; } @@ -354,6 +367,7 @@ function PolicyAccountingPage({policy}: PolicyAccountingPageProps) { connectedIntegration, policyID, translate, + hasPoliciesConnectedToSageIntacct, policy, undefined, undefined, @@ -486,6 +500,7 @@ function PolicyAccountingPage({policy}: PolicyAccountingPageProps) { startIntegrationFlow, popoverAnchorRefs, datetimeToRelative, + hasPoliciesConnectedToSageIntacct, ]); const otherIntegrationsItems = useMemo(() => { @@ -497,7 +512,18 @@ function PolicyAccountingPage({policy}: PolicyAccountingPageProps) { ); return otherIntegrations .map((integration) => { - const integrationData = getAccountingIntegrationData(integration, policyID, translate, undefined, undefined, undefined, undefined, undefined, accountingIcons); + const integrationData = getAccountingIntegrationData( + integration, + policyID, + translate, + hasPoliciesConnectedToSageIntacct, + undefined, + undefined, + undefined, + undefined, + undefined, + accountingIcons, + ); if (!integrationData) { return undefined; } @@ -543,6 +569,7 @@ function PolicyAccountingPage({policy}: PolicyAccountingPageProps) { connectedIntegration, policyID, translate, + hasPoliciesConnectedToSageIntacct, styles.justifyContentCenter, styles.sectionMenuItemTopDescription, isOffline, diff --git a/src/pages/workspace/accounting/intacct/ExistingConnectionsPage.tsx b/src/pages/workspace/accounting/intacct/ExistingConnectionsPage.tsx index de34f29eb451..8a863fe133e5 100644 --- a/src/pages/workspace/accounting/intacct/ExistingConnectionsPage.tsx +++ b/src/pages/workspace/accounting/intacct/ExistingConnectionsPage.tsx @@ -5,11 +5,11 @@ import MenuItemList from '@components/MenuItemList'; import ScreenWrapper from '@components/ScreenWrapper'; import ScrollView from '@components/ScrollView'; import Text from '@components/Text'; +import useAdminPoliciesConnectedToSageIntacct from '@hooks/useAdminPoliciesConnectedToSageIntacct'; import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; import {copyExistingPolicyConnection} from '@libs/actions/connections'; -import {getAdminPoliciesConnectedToSageIntacct} from '@libs/actions/Policy/Policy'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {SettingsNavigatorParamList} from '@libs/Navigation/types'; @@ -25,7 +25,7 @@ function ExistingConnectionsPage({route}: ExistingConnectionsPageProps) { const {translate, datetimeToRelative} = useLocalize(); const styles = useThemeStyles(); const icons = useMemoizedLazyExpensifyIcons(['LinkCopy'] as const); - const policiesConnectedToSageIntacct = getAdminPoliciesConnectedToSageIntacct(); + const policiesConnectedToSageIntacct = useAdminPoliciesConnectedToSageIntacct(); const policyID: string = route.params.policyID; const menuItems = policiesConnectedToSageIntacct.map((policy) => { diff --git a/src/pages/workspace/accounting/netsuite/NetSuiteTokenInput/NetSuiteExistingConnectionsPage.tsx b/src/pages/workspace/accounting/netsuite/NetSuiteTokenInput/NetSuiteExistingConnectionsPage.tsx index 898e2483763d..0233b60542c6 100644 --- a/src/pages/workspace/accounting/netsuite/NetSuiteTokenInput/NetSuiteExistingConnectionsPage.tsx +++ b/src/pages/workspace/accounting/netsuite/NetSuiteTokenInput/NetSuiteExistingConnectionsPage.tsx @@ -2,10 +2,10 @@ import React from 'react'; import {View} from 'react-native'; import ConnectionLayout from '@components/ConnectionLayout'; import MenuItemList from '@components/MenuItemList'; +import useAdminPoliciesConnectedToNetSuite from '@hooks/useAdminPoliciesConnectedToNetSuite'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; import {copyExistingPolicyConnection} from '@libs/actions/connections'; -import {getAdminPoliciesConnectedToNetSuite} from '@libs/actions/Policy/Policy'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {SettingsNavigatorParamList} from '@libs/Navigation/types'; @@ -19,10 +19,10 @@ type ExistingConnectionsPageProps = PlatformStackScreenProps { + const menuItems = policiesConnectedToNetSuite.map((policy) => { const lastSuccessfulSyncDate = policy.connections?.netsuite.lastSyncDate; const date = lastSuccessfulSyncDate ? datetimeToRelative(lastSuccessfulSyncDate) : undefined; return { diff --git a/src/pages/workspace/accounting/utils.tsx b/src/pages/workspace/accounting/utils.tsx index 5ecbca537078..11694f542a63 100644 --- a/src/pages/workspace/accounting/utils.tsx +++ b/src/pages/workspace/accounting/utils.tsx @@ -9,7 +9,6 @@ import type {LocaleContextProps} from '@components/LocaleContextProvider'; import Text from '@components/Text'; import TextLink from '@components/TextLink'; import {isAuthenticationError} from '@libs/actions/connections'; -import {getAdminPoliciesConnectedToSageIntacct} from '@libs/actions/Policy/Policy'; import getPlatform from '@libs/getPlatform'; import {canUseTaxNetSuite} from '@libs/PolicyUtils'; import Navigation from '@navigation/Navigation'; @@ -47,6 +46,7 @@ function getAccountingIntegrationData( connectionName: PolicyConnectionName, policyID: string, translate: LocaleContextProps['translate'], + hasPoliciesConnectedToSageIntacct: boolean, policy?: Policy, key?: number, integrationToDisconnect?: ConnectionName, @@ -57,7 +57,6 @@ function getAccountingIntegrationData( const qboConfig = policy?.connections?.quickbooksOnline?.config; const netsuiteConfig = policy?.connections?.netsuite?.options?.config; const netsuiteSelectedSubsidiary = (policy?.connections?.netsuite?.options?.data?.subsidiaryList ?? []).find((subsidiary) => subsidiary.internalID === netsuiteConfig?.subsidiaryID); - const hasPoliciesConnectedToSageIntacct = !!getAdminPoliciesConnectedToSageIntacct().length; const getBackToAfterWorkspaceUpgradeRouteForIntacct = () => { if (integrationToDisconnect) { return ROUTES.POLICY_ACCOUNTING.getRoute(policyID, connectionName, integrationToDisconnect, shouldDisconnectIntegrationBeforeConnecting); diff --git a/src/selectors/Policy.ts b/src/selectors/Policy.ts index 5a7aabe7985a..e5a606c68860 100644 --- a/src/selectors/Policy.ts +++ b/src/selectors/Policy.ts @@ -122,6 +122,16 @@ const iouRequestPolicyCollectionSelector = (policies: OnyxCollection): O return result; }; +const adminPoliciesConnectedToSageIntacctSelector = (policies: OnyxCollection) => + Object.values(policies ?? {}).filter((policy): policy is Policy => !!policy && policy.role === CONST.POLICY.ROLE.ADMIN && !!policy?.connections?.intacct); + +const adminPoliciesConnectedToNetSuiteSelector = (policies: OnyxCollection) => + Object.values(policies ?? {}).filter((policy): policy is Policy => !!policy && policy.role === CONST.POLICY.ROLE.ADMIN && !!policy?.connections?.netsuite); + +const hasPoliciesConnectedToSageIntacctSelector = (policies: OnyxCollection) => !!adminPoliciesConnectedToSageIntacctSelector(policies).length; + +const hasPoliciesConnectedToNetSuiteSelector = (policies: OnyxCollection) => !!adminPoliciesConnectedToNetSuiteSelector(policies).length; + export { activePolicySelector, createAllPolicyReportFieldsSelector, @@ -133,4 +143,8 @@ export { groupPaidPoliciesWithExpenseChatEnabledSelector, iouRequestPolicyCollectionSelector, shouldRedirectToExpensifyClassicSelector, + adminPoliciesConnectedToSageIntacctSelector, + adminPoliciesConnectedToNetSuiteSelector, + hasPoliciesConnectedToSageIntacctSelector, + hasPoliciesConnectedToNetSuiteSelector, };