Skip to content

Commit a5c249d

Browse files
authored
Merge pull request Expensify#70782 from paulnjs/paulnjs-fix/70401
remove inline selector bundle A
2 parents 20eee1c + c836844 commit a5c249d

19 files changed

+122
-38
lines changed

src/components/MoneyRequestConfirmationList.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,8 @@ type MoneyRequestConfirmationListProps = {
198198

199199
type MoneyRequestConfirmationListItem = Participant | OptionData;
200200

201+
const mileageRateSelector = (policy: OnyxEntry<OnyxTypes.Policy>) => DistanceRequestUtils.getDefaultMileageRate(policy);
202+
201203
function MoneyRequestConfirmationList({
202204
transaction,
203205
onSendMoney,
@@ -244,11 +246,11 @@ function MoneyRequestConfirmationList({
244246
const [policyReal] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {canBeMissing: true});
245247
const [policyDraft] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_DRAFTS}${policyID}`, {canBeMissing: true});
246248
const [defaultMileageRateDraft] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_DRAFTS}${policyID}`, {
247-
selector: (selectedPolicy) => DistanceRequestUtils.getDefaultMileageRate(selectedPolicy),
249+
selector: mileageRateSelector,
248250
canBeMissing: true,
249251
});
250252
const [defaultMileageRateReal] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {
251-
selector: (selectedPolicy) => DistanceRequestUtils.getDefaultMileageRate(selectedPolicy),
253+
selector: mileageRateSelector,
252254
canBeMissing: true,
253255
});
254256
const [policyCategoriesDraft] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES_DRAFT}${policyID}`, {canBeMissing: true});

src/components/PriorityModeController.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import {useNavigation} from '@react-navigation/native';
22
import {accountIDSelector} from '@selectors/Session';
33
import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react';
4+
import type {OnyxEntry} from 'react-native-onyx';
5+
import type {ValueOf} from 'type-fest';
46
import useOnyx from '@hooks/useOnyx';
57
import {updateChatPriorityMode} from '@libs/actions/User';
68
import getIsNarrowLayout from '@libs/getIsNarrowLayout';
@@ -13,6 +15,8 @@ import SCREENS from '@src/SCREENS';
1315
import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue';
1416
import FocusModeNotification from './FocusModeNotification';
1517

18+
const isInFocusModeSelector = (priorityMode: OnyxEntry<ValueOf<typeof CONST.PRIORITY_MODE>>) => priorityMode === CONST.PRIORITY_MODE.GSD;
19+
1620
/**
1721
* This component is used to automatically switch a user into #focus mode when they exceed a certain number of reports.
1822
* We do this primarily for performance reasons. Similar to the "Welcome action" we must wait for a number of things to
@@ -27,7 +31,7 @@ import FocusModeNotification from './FocusModeNotification';
2731
export default function PriorityModeController() {
2832
const [accountID] = useOnyx(ONYXKEYS.SESSION, {selector: accountIDSelector, canBeMissing: true});
2933
const [isLoadingReportData] = useOnyx(ONYXKEYS.IS_LOADING_REPORT_DATA, {canBeMissing: true});
30-
const [isInFocusMode, isInFocusModeMetadata] = useOnyx(ONYXKEYS.NVP_PRIORITY_MODE, {selector: (priorityMode) => priorityMode === CONST.PRIORITY_MODE.GSD, canBeMissing: true});
34+
const [isInFocusMode, isInFocusModeMetadata] = useOnyx(ONYXKEYS.NVP_PRIORITY_MODE, {selector: isInFocusModeSelector, canBeMissing: true});
3135
const [hasTriedFocusMode, hasTriedFocusModeMetadata] = useOnyx(ONYXKEYS.NVP_TRY_FOCUS_MODE, {canBeMissing: true});
3236
const [allReports] = useOnyx(ONYXKEYS.COLLECTION.REPORT, {canBeMissing: true});
3337
const currentRouteName = useCurrentRouteName();

src/components/ReportActionItem/MoneyRequestView.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import {activePolicySelector} from '@selectors/Policy';
12
import {Str} from 'expensify-common';
23
import React, {useCallback, useEffect, useMemo, useState} from 'react';
34
import {View} from 'react-native';
@@ -146,7 +147,7 @@ function MoneyRequestView({
146147
const [activePolicyID] = useOnyx(ONYXKEYS.NVP_ACTIVE_POLICY_ID, {canBeMissing: true});
147148
const [activePolicy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${activePolicyID}`, {
148149
canBeMissing: true,
149-
selector: (policy) => (policy?.type !== CONST.POLICY.TYPE.PERSONAL ? policy : undefined),
150+
selector: activePolicySelector,
150151
});
151152
// If the expense is unreported the policy should be the user's default policy, otherwise it should be the policy the expense was made for
152153
const policy = isExpenseUnreported ? activePolicy : expensePolicy;

src/hooks/useDefaultFundID.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1+
import {useCallback} from 'react';
2+
import type {OnyxCollection} from 'react-native-onyx';
13
import {getFundIdFromSettingsKey} from '@libs/CardUtils';
24
import CONST from '@src/CONST';
35
import ONYXKEYS from '@src/ONYXKEYS';
6+
import type {ExpensifyCardSettings} from '@src/types/onyx';
47
import useOnyx from './useOnyx';
58
import useWorkspaceAccountID from './useWorkspaceAccountID';
69

@@ -13,17 +16,26 @@ function useDefaultFundID(policyID: string | undefined) {
1316
const [lastSelectedExpensifyCardFeed] = useOnyx(`${ONYXKEYS.COLLECTION.LAST_SELECTED_EXPENSIFY_CARD_FEED}${policyID}`, {canBeMissing: true});
1417
const [lastSelectedCardSettings] = useOnyx(`${ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS}${lastSelectedExpensifyCardFeed}`, {canBeMissing: true});
1518

16-
const [domainFundID] = useOnyx(ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS, {
17-
selector: (cardSettings) => {
19+
const getDomainFundID = useCallback(
20+
(cardSettings: OnyxCollection<ExpensifyCardSettings>) => {
1821
const matchingKey = Object.entries(cardSettings ?? {}).find(
1922
// eslint-disable-next-line @typescript-eslint/no-unused-vars
2023
([key, settings]) => settings?.preferredPolicy && settings.preferredPolicy === policyID && !key.includes(workspaceAccountID.toString()),
2124
);
2225

2326
return getFundIdFromSettingsKey(matchingKey?.[0] ?? '');
2427
},
25-
canBeMissing: true,
26-
});
28+
[policyID, workspaceAccountID],
29+
);
30+
31+
const [domainFundID] = useOnyx(
32+
ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS,
33+
{
34+
selector: getDomainFundID,
35+
canBeMissing: true,
36+
},
37+
[getDomainFundID],
38+
);
2739

2840
if (lastSelectedExpensifyCardFeed && lastSelectedCardSettings?.paymentBankAccountID) {
2941
return lastSelectedExpensifyCardFeed;

src/hooks/useExpensifyCardFeeds.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1+
import {useCallback} from 'react';
2+
import type {OnyxCollection} from 'react-native-onyx';
13
import ONYXKEYS from '@src/ONYXKEYS';
4+
import type {ExpensifyCardSettings} from '@src/types/onyx';
25
import useOnyx from './useOnyx';
36
import useWorkspaceAccountID from './useWorkspaceAccountID';
47

58
function useExpensifyCardFeeds(policyID: string | undefined) {
69
const workspaceAccountID = useWorkspaceAccountID(policyID);
7-
const [allExpensifyCardFeeds] = useOnyx(ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS, {
8-
selector: (cardSettings) => {
10+
11+
const getAllExpensifyCardFeeds = useCallback(
12+
(cardSettings: OnyxCollection<ExpensifyCardSettings>) => {
913
const matchingEntries = Object.entries(cardSettings ?? {}).filter(([key, settings]) => {
1014
const isDomainFeed = !!(settings?.preferredPolicy && settings.preferredPolicy === policyID);
1115
const isWorkspaceFeed = key.includes(workspaceAccountID.toString()) && settings && Object.keys(settings).length > 1;
@@ -14,8 +18,17 @@ function useExpensifyCardFeeds(policyID: string | undefined) {
1418

1519
return Object.fromEntries(matchingEntries);
1620
},
17-
canBeMissing: true,
18-
});
21+
[policyID, workspaceAccountID],
22+
);
23+
24+
const [allExpensifyCardFeeds] = useOnyx(
25+
ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS,
26+
{
27+
selector: getAllExpensifyCardFeeds,
28+
canBeMissing: true,
29+
},
30+
[getAllExpensifyCardFeeds],
31+
);
1932

2033
return allExpensifyCardFeeds;
2134
}

src/hooks/useSearchTypeMenuSections.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1+
import {createPoliciesSelector} from '@selectors/Policy';
12
import {useMemo} from 'react';
2-
import type {OnyxEntry} from 'react-native-onyx';
3+
import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
34
import {createTypeMenuSections} from '@libs/SearchUIUtils';
45
import ONYXKEYS from '@src/ONYXKEYS';
56
import type {Policy, Session} from '@src/types/onyx';
6-
import mapOnyxCollectionItems from '@src/utils/mapOnyxCollectionItems';
77
import useCardFeedsForDisplay from './useCardFeedsForDisplay';
88
import useNetwork from './useNetwork';
99
import useOnyx from './useOnyx';
@@ -28,6 +28,8 @@ const policySelector = (policy: OnyxEntry<Policy>): OnyxEntry<Policy> =>
2828
achAccount: policy.achAccount,
2929
};
3030

31+
const policiesSelector = (policies: OnyxCollection<Policy>) => createPoliciesSelector(policies, policySelector);
32+
3133
const currentUserLoginAndAccountIDSelector = (session: OnyxEntry<Session>) => ({
3234
email: session?.email,
3335
accountID: session?.accountID,
@@ -40,7 +42,7 @@ const useSearchTypeMenuSections = () => {
4042
const {defaultCardFeed, cardFeedsByPolicy} = useCardFeedsForDisplay();
4143

4244
const {isOffline} = useNetwork();
43-
const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {selector: (policies) => mapOnyxCollectionItems(policies, policySelector), canBeMissing: true});
45+
const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {selector: policiesSelector, canBeMissing: true});
4446
const [currentUserLoginAndAccountID] = useOnyx(ONYXKEYS.SESSION, {selector: currentUserLoginAndAccountIDSelector, canBeMissing: false});
4547
const [activePolicyID] = useOnyx(ONYXKEYS.NVP_ACTIVE_POLICY_ID, {canBeMissing: true});
4648
const [savedSearches] = useOnyx(ONYXKEYS.SAVED_SEARCHES, {canBeMissing: true});

src/hooks/useSidebarOrderedReports.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import reportsSelector from '@selectors/Attributes';
2+
import {createPoliciesSelector} from '@selectors/Policy';
23
import {deepEqual} from 'fast-equals';
34
import React, {createContext, useCallback, useContext, useEffect, useMemo, useRef, useState} from 'react';
45
import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
@@ -8,7 +9,6 @@ import SidebarUtils from '@libs/SidebarUtils';
89
import CONST from '@src/CONST';
910
import ONYXKEYS from '@src/ONYXKEYS';
1011
import type * as OnyxTypes from '@src/types/onyx';
11-
import mapOnyxCollectionItems from '@src/utils/mapOnyxCollectionItems';
1212
import useCurrentReportID from './useCurrentReportID';
1313
import useCurrentUserPersonalDetails from './useCurrentUserPersonalDetails';
1414
import useDeepCompareRef from './useDeepCompareRef';
@@ -50,7 +50,7 @@ const policySelector = (policy: OnyxEntry<OnyxTypes.Policy>): PartialPolicyForSi
5050
employeeList: policy.employeeList,
5151
}) as PartialPolicyForSidebar;
5252

53-
const policiesSelector = (policies: OnyxCollection<OnyxTypes.Policy>) => mapOnyxCollectionItems(policies, policySelector);
53+
const policiesSelector = (policies: OnyxCollection<OnyxTypes.Policy>) => createPoliciesSelector(policies, policySelector);
5454

5555
function SidebarOrderedReportsContextProvider({
5656
children,

src/hooks/useWorkspaceAccountID.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
1+
import type {OnyxEntry} from 'react-native-onyx';
12
import CONST from '@src/CONST';
23
import ONYXKEYS from '@src/ONYXKEYS';
4+
import type {Policy} from '@src/types/onyx';
35
import useOnyx from './useOnyx';
46

7+
const policyWorkspaceAccountIDSelector = (policy: OnyxEntry<Policy>) => policy?.workspaceAccountID;
8+
59
function useWorkspaceAccountID(policyID: string | undefined) {
6-
const [workspaceAccountID = CONST.DEFAULT_NUMBER_ID] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {selector: (policy) => policy?.workspaceAccountID});
10+
const [workspaceAccountID = CONST.DEFAULT_NUMBER_ID] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {selector: policyWorkspaceAccountIDSelector, canBeMissing: true});
711

812
return workspaceAccountID;
913
}

src/pages/Debug/DebugTagPicker.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React, {useCallback, useMemo, useState} from 'react';
22
import {View} from 'react-native';
3+
import type {OnyxEntry} from 'react-native-onyx';
34
import Button from '@components/Button';
45
import type {ListItem} from '@components/SelectionList/types';
56
import TagPicker from '@components/TagPicker';
@@ -11,6 +12,7 @@ import {insertTagIntoTransactionTagsString} from '@libs/IOUUtils';
1112
import {getTagLists} from '@libs/PolicyUtils';
1213
import {getTagArrayFromName} from '@libs/TransactionUtils';
1314
import ONYXKEYS from '@src/ONYXKEYS';
15+
import type {Policy} from '@src/types/onyx';
1416

1517
type DebugTagPickerProps = {
1618
/** The policyID we are getting tags for */
@@ -23,6 +25,8 @@ type DebugTagPickerProps = {
2325
onSubmit: (item: ListItem) => void;
2426
};
2527

28+
const policyHasMultipleTagListsSelector = (policy: OnyxEntry<Policy>) => policy?.hasMultipleTagLists;
29+
2630
function DebugTagPicker({policyID, tagName = '', onSubmit}: DebugTagPickerProps) {
2731
const styles = useThemeStyles();
2832
const {translate} = useLocalize();
@@ -31,7 +35,7 @@ function DebugTagPicker({policyID, tagName = '', onSubmit}: DebugTagPickerProps)
3135
const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`, {canBeMissing: true});
3236
const policyTagLists = useMemo(() => getTagLists(policyTags), [policyTags]);
3337

34-
const [hasMultipleTagLists] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {canBeMissing: true, selector: (policy) => policy?.hasMultipleTagLists});
38+
const [hasMultipleTagLists] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {canBeMissing: true, selector: policyHasMultipleTagListsSelector});
3539
const updateTagName = useCallback(
3640
(index: number) =>
3741
({text}: ListItem) => {

src/pages/Search/EmptySearchView.tsx

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, {useMemo, useRef, useState} from 'react';
1+
import React, {useCallback, useMemo, useRef, useState} from 'react';
22
// eslint-disable-next-line no-restricted-imports
33
import type {GestureResponderEvent, ImageStyle, Text as RNText, TextStyle, ViewStyle} from 'react-native';
44
import {Linking, View} from 'react-native';
@@ -93,10 +93,7 @@ function EmptySearchView({similarSearchHash, type, groupBy, hasResults}: EmptySe
9393
const {typeMenuSections} = useSearchTypeMenuSections();
9494

9595
const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: false});
96-
const [isUserPaidPolicyMember = false] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {
97-
canBeMissing: true,
98-
selector: (policies) => Object.values(policies ?? {}).some((policy) => isPaidGroupPolicy(policy) && isPolicyMember(policy, currentUserPersonalDetails.login)),
99-
});
96+
10097
const [activePolicyID] = useOnyx(ONYXKEYS.NVP_ACTIVE_POLICY_ID, {canBeMissing: true});
10198
const [activePolicy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${activePolicyID}`, {canBeMissing: true});
10299

@@ -108,6 +105,22 @@ function EmptySearchView({similarSearchHash, type, groupBy, hasResults}: EmptySe
108105
canBeMissing: true,
109106
});
110107

108+
const isUserPaidPolicyMemberSelector = useCallback(
109+
(policies: OnyxCollection<Policy>) => {
110+
return Object.values(policies ?? {}).some((policy) => isPaidGroupPolicy(policy) && isPolicyMember(policy, currentUserPersonalDetails.login));
111+
},
112+
[currentUserPersonalDetails.login],
113+
);
114+
115+
const [isUserPaidPolicyMember = false] = useOnyx(
116+
ONYXKEYS.COLLECTION.POLICY,
117+
{
118+
canBeMissing: true,
119+
selector: isUserPaidPolicyMemberSelector,
120+
},
121+
[isUserPaidPolicyMemberSelector],
122+
);
123+
111124
return (
112125
<SearchScopeProvider>
113126
<EmptySearchViewContent

0 commit comments

Comments
 (0)