Skip to content

Commit c54b47a

Browse files
authored
Merge pull request Expensify#75809 from shubham1206agra/refactor-hasOtherControlWorkspaces
Refactor: isolate hasOtherControlWorkspaces from ONYXKEYS.COLLECTION.POLICY Onyx.connect data
2 parents 869b4b3 + fcea9c8 commit c54b47a

4 files changed

Lines changed: 56 additions & 7 deletions

File tree

src/libs/PolicyUtils.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1465,9 +1465,9 @@ function getDefaultChatEnabledPolicy(groupPoliciesWithChatEnabled: Array<OnyxInp
14651465
return undefined;
14661466
}
14671467

1468-
function hasOtherControlWorkspaces(currentPolicyID: string) {
1469-
const otherControlWorkspaces = Object.values(allPolicies ?? {}).filter((policy) => policy?.id !== currentPolicyID && isPolicyAdmin(policy) && isControlPolicy(policy));
1470-
return otherControlWorkspaces.length > 0;
1468+
function hasOtherControlWorkspaces(adminPolicies: Policy[] | undefined, currentPolicyID: string) {
1469+
const otherControlWorkspaces = adminPolicies?.filter((policy) => policy?.id !== currentPolicyID && isControlPolicy(policy));
1470+
return (otherControlWorkspaces?.length ?? 0) > 0;
14711471
}
14721472

14731473
// If no policyID is provided, it indicates the workspace upgrade/downgrade URL

src/pages/workspace/downgrade/DowngradeConfirmation.tsx

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
1-
import React from 'react';
1+
import {activeAdminPoliciesSelector} from '@selectors/Policy';
2+
import React, {useCallback} from 'react';
3+
import type {OnyxCollection} from 'react-native-onyx';
24
import ConfirmationPage from '@components/ConfirmationPage';
5+
import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
36
import {useMemoizedLazyIllustrations} from '@hooks/useLazyAsset';
47
import useLocalize from '@hooks/useLocalize';
8+
import useOnyx from '@hooks/useOnyx';
59
import useThemeStyles from '@hooks/useThemeStyles';
610
import {hasOtherControlWorkspaces as hasOtherControlWorkspacesPolicyUtils} from '@libs/PolicyUtils';
11+
import ONYXKEYS from '@src/ONYXKEYS';
12+
import type {Policy} from '@src/types/onyx';
713

814
type Props = {
915
onConfirmDowngrade: () => void;
@@ -14,7 +20,15 @@ function DowngradeConfirmation({onConfirmDowngrade, policyID}: Props) {
1420
const {translate} = useLocalize();
1521
const styles = useThemeStyles();
1622
const illustrations = useMemoizedLazyIllustrations(['MushroomTopHat'] as const);
17-
const hasOtherControlWorkspaces = hasOtherControlWorkspacesPolicyUtils(policyID);
23+
const {login} = useCurrentUserPersonalDetails();
24+
const selector = useCallback(
25+
(policies: OnyxCollection<Policy>) => {
26+
return activeAdminPoliciesSelector(policies, login ?? '');
27+
},
28+
[login],
29+
);
30+
const [adminPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: true, selector});
31+
const hasOtherControlWorkspaces = hasOtherControlWorkspacesPolicyUtils(adminPolicies, policyID);
1832

1933
return (
2034
<ConfirmationPage

src/selectors/Policy.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
2-
import {getOwnedPaidPolicies} from '@libs/PolicyUtils';
2+
import {getOwnedPaidPolicies, isPolicyAdmin} from '@libs/PolicyUtils';
33
import CONST from '@src/CONST';
44
import type {Policy, PolicyReportField} from '@src/types/onyx';
55
import mapOnyxCollectionItems from '@src/utils/mapOnyxCollectionItems';
@@ -12,6 +12,13 @@ const activePolicySelector = (policy: OnyxEntry<Policy>) => (policy?.type !== CO
1212

1313
const ownerPoliciesSelector = (policies: OnyxCollection<Policy>, currentUserAccountID: number) => getOwnedPaidPolicies(policies, currentUserAccountID);
1414

15+
const activeAdminPoliciesSelector = (policies: OnyxCollection<Policy>, currentUserAccountLogin: string) => {
16+
const adminPolicies = Object.values(policies ?? {}).filter(
17+
(policy): policy is Policy => policy?.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE && isPolicyAdmin(policy, currentUserAccountLogin),
18+
);
19+
return adminPolicies;
20+
};
21+
1522
/**
1623
* Creates a selector that aggregates all non-formula policy report fields from all policies,
1724
* sorted alphabetically by field key using the provided locale compare function
@@ -30,4 +37,4 @@ const createAllPolicyReportFieldsSelector = (policies: OnyxCollection<Policy>, l
3037
return Object.fromEntries(nonFormulaReportFields);
3138
};
3239

33-
export {activePolicySelector, createPoliciesSelector, createAllPolicyReportFieldsSelector, ownerPoliciesSelector};
40+
export {activePolicySelector, createPoliciesSelector, createAllPolicyReportFieldsSelector, ownerPoliciesSelector, activeAdminPoliciesSelector};

tests/unit/PolicyUtilsTest.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {
1818
getUnitRateValue,
1919
hasDynamicExternalWorkflow,
2020
hasOnlyPersonalPolicies,
21+
hasOtherControlWorkspaces,
2122
isCurrentUserMemberOfAnyPolicy,
2223
isPolicyMemberWithoutPendingDelete,
2324
shouldShowPolicy,
@@ -1306,4 +1307,31 @@ describe('PolicyUtils', () => {
13061307
expect(result).toBe(true);
13071308
});
13081309
});
1310+
1311+
describe('hasOtherControlWorkspaces', () => {
1312+
it('should return false when policies is empty', () => {
1313+
const result = hasOtherControlWorkspaces([], '1');
1314+
expect(result).toBe(false);
1315+
});
1316+
1317+
it('should return false when there are no control workspaces other than the current one', () => {
1318+
const policies = [
1319+
{...createRandomPolicy(1, CONST.POLICY.TYPE.CORPORATE), pendingAction: undefined},
1320+
{...createRandomPolicy(2, CONST.POLICY.TYPE.PERSONAL), pendingAction: undefined},
1321+
{...createRandomPolicy(3, CONST.POLICY.TYPE.TEAM), pendingAction: undefined},
1322+
];
1323+
const result = hasOtherControlWorkspaces(policies, '1');
1324+
expect(result).toBe(false);
1325+
});
1326+
1327+
it('should return true when there are other control workspaces', () => {
1328+
const policies = [
1329+
{...createRandomPolicy(1, CONST.POLICY.TYPE.CORPORATE), pendingAction: undefined},
1330+
{...createRandomPolicy(2, CONST.POLICY.TYPE.CORPORATE), pendingAction: undefined},
1331+
{...createRandomPolicy(3, CONST.POLICY.TYPE.PERSONAL), pendingAction: undefined},
1332+
];
1333+
const result = hasOtherControlWorkspaces(policies, '1');
1334+
expect(result).toBe(true);
1335+
});
1336+
});
13091337
});

0 commit comments

Comments
 (0)