Skip to content

Commit ececec8

Browse files
authored
Merge pull request #98299 from callstack-internal/perf/onyx-deepequal-probe
Hoist the active policy subscription out of Search rows
2 parents 3154ca2 + 5cad21f commit ececec8

4 files changed

Lines changed: 39 additions & 9 deletions

File tree

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import useOnyx from '@hooks/useOnyx';
2+
3+
import CONST from '@src/CONST';
4+
import ONYXKEYS from '@src/ONYXKEYS';
5+
import type {Policy} from '@src/types/onyx';
6+
import type ChildrenProps from '@src/types/utils/ChildrenProps';
7+
8+
import type {OnyxEntry} from 'react-native-onyx';
9+
10+
import React, {createContext, useContext} from 'react';
11+
12+
type ActivePolicyContextValue = {
13+
activePolicyID: string | undefined;
14+
activePolicy: OnyxEntry<Policy>;
15+
};
16+
17+
const ActivePolicyContext = createContext<ActivePolicyContextValue>({activePolicyID: undefined, activePolicy: undefined});
18+
19+
const activePolicySelector = (policy: OnyxEntry<Policy>) => (policy?.type !== CONST.POLICY.TYPE.PERSONAL ? policy : undefined);
20+
21+
function ActivePolicyProvider({children}: ChildrenProps) {
22+
const [activePolicyID] = useOnyx(ONYXKEYS.NVP_ACTIVE_POLICY_ID);
23+
const [activePolicy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${activePolicyID}`, {
24+
selector: activePolicySelector,
25+
});
26+
27+
return <ActivePolicyContext.Provider value={{activePolicyID, activePolicy}}>{children}</ActivePolicyContext.Provider>;
28+
}
29+
30+
function useActivePolicyContext() {
31+
return useContext(ActivePolicyContext);
32+
}
33+
34+
export default ActivePolicyProvider;
35+
export {useActivePolicyContext};

src/components/OnyxListItemProvider.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import ONYXKEYS from '@src/ONYXKEYS';
22

33
import React from 'react';
44

5+
import ActivePolicyProvider from './ActivePolicyProvider';
56
import ComposeProviders from './ComposeProviders';
67
import createOnyxContext from './createOnyxContext';
78

@@ -42,6 +43,7 @@ function OnyxListItemProvider(props: OnyxListItemProviderProps) {
4243
CardListProvider,
4344
WorkspaceCardListProvider,
4445
OnboardingValuesProvider,
46+
ActivePolicyProvider,
4547
]}
4648
>
4749
{props.children}

src/hooks/usePolicyForMovingExpenses.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import {useActivePolicyContext} from '@components/ActivePolicyProvider';
12
import {useSession} from '@components/OnyxListItemProvider';
23

34
import {canSubmitPerDiemExpenseFromWorkspace, isGroupPolicy, isPolicyMemberWithoutPendingDelete, isTimeTrackingEnabled} from '@libs/PolicyUtils';
@@ -9,8 +10,6 @@ import {isEmptyObject} from '@src/types/utils/EmptyObject';
910

1011
import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
1112

12-
import {activePolicySelector} from '@selectors/Policy';
13-
1413
import useOnyx from './useOnyx';
1514

1615
// TODO: temporary util - if we don't have employeeList object we don't check for the pending delete
@@ -90,10 +89,7 @@ type PolicyForMovingExpenses = {
9089
};
9190

9291
function usePolicyForMovingExpenses(isPerDiemRequest?: boolean, isTimeRequest?: boolean, expensePolicyID?: string, isUnreportedManagedCardTransaction?: boolean): PolicyForMovingExpenses {
93-
const [activePolicyID] = useOnyx(ONYXKEYS.NVP_ACTIVE_POLICY_ID);
94-
const [activePolicy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${activePolicyID}`, {
95-
selector: activePolicySelector,
96-
});
92+
const {activePolicyID, activePolicy} = useActivePolicyContext();
9793

9894
const session = useSession();
9995
const login = session?.email ?? '';

src/selectors/Policy.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ type ReusablePolicyConnectionName =
3030
| typeof CONST.POLICY.CONNECTIONS.NAME.RILLET
3131
| typeof CONST.POLICY.CONNECTIONS.NAME.DUALENTRY;
3232

33-
const activePolicySelector = (policy: OnyxEntry<Policy>) => (policy?.type !== CONST.POLICY.TYPE.PERSONAL ? policy : undefined);
34-
3533
const ownerPoliciesSelector = (policies: OnyxCollection<Policy>, currentUserAccountID: number) => getOwnedPaidPolicies(policies, currentUserAccountID);
3634

3735
type OwnedPaidPoliciesCounts = {
@@ -393,7 +391,6 @@ const createAdminPoliciesSelector =
393391

394392
export type {PolicySelector};
395393
export {
396-
activePolicySelector,
397394
createAllPolicyReportFieldsSelector,
398395
ownerPoliciesSelector,
399396
createOwnedPaidPoliciesCountsSelector,

0 commit comments

Comments
 (0)