Skip to content

Commit 6a29bdf

Browse files
authored
Merge pull request Expensify#63868 from callstack-internal/fix/is-action-of-type-perf
[NoQA] fix: refactor isActionOfType to strict equal/set checks
2 parents 94a93c5 + 703c3ae commit 6a29bdf

3 files changed

Lines changed: 40 additions & 69 deletions

File tree

src/libs/CardMessageUtils.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import type {OnyxValues} from '@src/ONYXKEYS';
55
import ONYXKEYS from '@src/ONYXKEYS';
66
import type {Card, ReportAction, WorkspaceCardsList} from '@src/types/onyx';
77
import {getPolicy, getWorkspaceAccountID, isPolicyAdmin} from './PolicyUtils';
8-
import {getOriginalMessage, isActionOfType} from './ReportActionsUtils';
8+
import {getOriginalMessage, isCardIssuedAction} from './ReportActionsUtils';
99

1010
let allUserCards: OnyxValues[typeof ONYXKEYS.CARD_LIST] = {};
1111
Onyx.connect({
@@ -29,15 +29,7 @@ Onyx.connect({
2929
});
3030

3131
function getExpensifyCardFromReportAction({reportAction, policyID}: {reportAction?: ReportAction; policyID?: string}): Card | undefined {
32-
const cardIssuedActionOriginalMessage = isActionOfType(
33-
reportAction,
34-
CONST.REPORT.ACTIONS.TYPE.CARD_ISSUED,
35-
CONST.REPORT.ACTIONS.TYPE.CARD_ISSUED_VIRTUAL,
36-
CONST.REPORT.ACTIONS.TYPE.CARD_ASSIGNED,
37-
CONST.REPORT.ACTIONS.TYPE.CARD_MISSING_ADDRESS,
38-
)
39-
? getOriginalMessage(reportAction)
40-
: undefined;
32+
const cardIssuedActionOriginalMessage = isCardIssuedAction(reportAction) ? getOriginalMessage(reportAction) : undefined;
4133

4234
const cardID = cardIssuedActionOriginalMessage?.cardID ?? CONST.DEFAULT_NUMBER_ID;
4335
const workspaceAccountID = getWorkspaceAccountID(policyID);

src/libs/ReportActionsUtils.ts

Lines changed: 36 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,17 @@ const SALESFORCE_EXPENSES_URL_PREFIX = 'https://login.salesforce.com/';
130130
*/
131131
const QBO_EXPENSES_URL = 'https://qbo.intuit.com/app/expenses';
132132

133-
const POLICY_CHANGE_LOG_ARRAY = Object.values(CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG);
133+
const POLICY_CHANGE_LOG_ARRAY = new Set<ReportActionName>(Object.values(CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG));
134+
135+
const ROOM_CHANGE_LOG_ARRAY = new Set<ReportActionName>(Object.values(CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG));
136+
137+
const MEMBER_CHANGE_ARRAY = new Set<ReportActionName>([
138+
CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.INVITE_TO_ROOM,
139+
CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.REMOVE_FROM_ROOM,
140+
CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.INVITE_TO_ROOM,
141+
CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.REMOVE_FROM_ROOM,
142+
CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.LEAVE_POLICY,
143+
]);
134144

135145
function isCreatedAction(reportAction: OnyxInputOrEntry<ReportAction>): boolean {
136146
return reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.CREATED;
@@ -221,7 +231,7 @@ function isModifiedExpenseAction(reportAction: OnyxInputOrEntry<ReportAction>):
221231
}
222232

223233
function isPolicyChangeLogAction(reportAction: OnyxInputOrEntry<ReportAction>): reportAction is ReportAction<ValueOf<typeof CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG>> {
224-
return isActionOfType(reportAction, ...POLICY_CHANGE_LOG_ARRAY);
234+
return reportAction?.actionName ? POLICY_CHANGE_LOG_ARRAY.has(reportAction.actionName) : false;
225235
}
226236

227237
function isChronosOOOListAction(reportAction: OnyxInputOrEntry<ReportAction>): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.CHRONOS_OOO_LIST> {
@@ -240,22 +250,8 @@ function isTripPreview(reportAction: OnyxInputOrEntry<ReportAction>): reportActi
240250
return isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.TRIP_PREVIEW);
241251
}
242252

243-
function isActionOfType<T extends ReportActionName[]>(
244-
action: OnyxInputOrEntry<ReportAction>,
245-
...actionNames: T
246-
): action is {
247-
[K in keyof T]: ReportAction<T[K]>;
248-
}[number] {
249-
const actionName = action?.actionName as T[number];
250-
251-
// This is purely a performance optimization to limit the 'includes()' calls on Hermes
252-
for (const i of actionNames) {
253-
if (i === actionName) {
254-
return true;
255-
}
256-
}
257-
258-
return false;
253+
function isActionOfType<T extends ReportActionName>(action: OnyxInputOrEntry<ReportAction>, actionName: T): action is ReportAction<T> {
254+
return action?.actionName === actionName;
259255
}
260256

261257
function getOriginalMessage<T extends ReportActionName>(reportAction: OnyxInputOrEntry<ReportAction<T>>): OriginalMessage<T> | undefined {
@@ -333,20 +329,13 @@ function isReimbursementQueuedAction(reportAction: OnyxInputOrEntry<ReportAction
333329
function isMemberChangeAction(
334330
reportAction: OnyxInputOrEntry<ReportAction>,
335331
): reportAction is ReportAction<ValueOf<typeof CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG | typeof CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG>> {
336-
return isActionOfType(
337-
reportAction,
338-
CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.INVITE_TO_ROOM,
339-
CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.REMOVE_FROM_ROOM,
340-
CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.INVITE_TO_ROOM,
341-
CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.REMOVE_FROM_ROOM,
342-
CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.LEAVE_POLICY,
343-
);
332+
return reportAction?.actionName ? MEMBER_CHANGE_ARRAY.has(reportAction.actionName) : false;
344333
}
345334

346335
function isInviteMemberAction(
347336
reportAction: OnyxEntry<ReportAction>,
348337
): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.INVITE_TO_ROOM | typeof CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.INVITE_TO_ROOM> {
349-
return isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.INVITE_TO_ROOM, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.INVITE_TO_ROOM);
338+
return isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.INVITE_TO_ROOM) || isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.INVITE_TO_ROOM);
350339
}
351340

352341
function isLeavePolicyAction(reportAction: OnyxEntry<ReportAction>): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.LEAVE_POLICY> {
@@ -380,18 +369,17 @@ function isReopenedAction(reportAction: OnyxEntry<ReportAction>): reportAction i
380369
}
381370

382371
function isRoomChangeLogAction(reportAction: OnyxEntry<ReportAction>): reportAction is ReportAction<ValueOf<typeof CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG>> {
383-
return isActionOfType(reportAction, ...Object.values(CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG));
372+
return reportAction?.actionName ? ROOM_CHANGE_LOG_ARRAY.has(reportAction.actionName) : false;
384373
}
385374

386375
function isInviteOrRemovedAction(
387376
reportAction: OnyxInputOrEntry<ReportAction>,
388377
): reportAction is ReportAction<ValueOf<typeof CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG | typeof CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG>> {
389-
return isActionOfType(
390-
reportAction,
391-
CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.INVITE_TO_ROOM,
392-
CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.REMOVE_FROM_ROOM,
393-
CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.INVITE_TO_ROOM,
394-
CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.REMOVE_FROM_ROOM,
378+
return (
379+
isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.INVITE_TO_ROOM) ||
380+
isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.REMOVE_FROM_ROOM) ||
381+
isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.INVITE_TO_ROOM) ||
382+
isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.REMOVE_FROM_ROOM)
395383
);
396384
}
397385

@@ -2795,13 +2783,19 @@ function getUpdatedManualApprovalThresholdMessage(reportAction: OnyxEntry<Report
27952783
return translateLocal('workspaceActions.updatedManualApprovalThreshold', {oldLimit: convertToDisplayString(oldLimit, currency), newLimit: convertToDisplayString(newLimit, currency)});
27962784
}
27972785

2798-
function isCardIssuedAction(reportAction: OnyxEntry<ReportAction>) {
2799-
return isActionOfType(
2800-
reportAction,
2801-
CONST.REPORT.ACTIONS.TYPE.CARD_ISSUED,
2802-
CONST.REPORT.ACTIONS.TYPE.CARD_ISSUED_VIRTUAL,
2803-
CONST.REPORT.ACTIONS.TYPE.CARD_MISSING_ADDRESS,
2804-
CONST.REPORT.ACTIONS.TYPE.CARD_ASSIGNED,
2786+
function isCardIssuedAction(
2787+
reportAction: OnyxEntry<ReportAction>,
2788+
): reportAction is ReportAction<
2789+
| typeof CONST.REPORT.ACTIONS.TYPE.CARD_ISSUED
2790+
| typeof CONST.REPORT.ACTIONS.TYPE.CARD_ISSUED_VIRTUAL
2791+
| typeof CONST.REPORT.ACTIONS.TYPE.CARD_MISSING_ADDRESS
2792+
| typeof CONST.REPORT.ACTIONS.TYPE.CARD_ASSIGNED
2793+
> {
2794+
return (
2795+
isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.CARD_ISSUED) ||
2796+
isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.CARD_ISSUED_VIRTUAL) ||
2797+
isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.CARD_MISSING_ADDRESS) ||
2798+
isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.CARD_ASSIGNED)
28052799
);
28062800
}
28072801

@@ -2837,15 +2831,7 @@ function getCardIssuedMessage({
28372831
policyID?: string;
28382832
card?: Card;
28392833
}) {
2840-
const cardIssuedActionOriginalMessage = isActionOfType(
2841-
reportAction,
2842-
CONST.REPORT.ACTIONS.TYPE.CARD_ISSUED,
2843-
CONST.REPORT.ACTIONS.TYPE.CARD_ISSUED_VIRTUAL,
2844-
CONST.REPORT.ACTIONS.TYPE.CARD_ASSIGNED,
2845-
CONST.REPORT.ACTIONS.TYPE.CARD_MISSING_ADDRESS,
2846-
)
2847-
? getOriginalMessage(reportAction)
2848-
: undefined;
2834+
const cardIssuedActionOriginalMessage = isCardIssuedAction(reportAction) ? getOriginalMessage(reportAction) : undefined;
28492835

28502836
const assigneeAccountID = cardIssuedActionOriginalMessage?.assigneeAccountID ?? CONST.DEFAULT_NUMBER_ID;
28512837
const cardID = cardIssuedActionOriginalMessage?.cardID ?? CONST.DEFAULT_NUMBER_ID;

src/pages/home/report/PureReportActionItem.tsx

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ import {
104104
isActionableReportMentionWhisper,
105105
isActionableTrackExpense,
106106
isActionOfType,
107+
isCardIssuedAction,
107108
isChronosOOOListAction,
108109
isConciergeCategoryOptions,
109110
isCreatedTaskReportAction,
@@ -1157,15 +1158,7 @@ function PureReportActionItem({
11571158
);
11581159
} else if (isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.DEMOTED_FROM_WORKSPACE)) {
11591160
children = <ReportActionItemBasicMessage message={getDemotedFromWorkspaceMessage(action)} />;
1160-
} else if (
1161-
isActionOfType(
1162-
action,
1163-
CONST.REPORT.ACTIONS.TYPE.CARD_ISSUED,
1164-
CONST.REPORT.ACTIONS.TYPE.CARD_ISSUED_VIRTUAL,
1165-
CONST.REPORT.ACTIONS.TYPE.CARD_MISSING_ADDRESS,
1166-
CONST.REPORT.ACTIONS.TYPE.CARD_ASSIGNED,
1167-
)
1168-
) {
1161+
} else if (isCardIssuedAction(action)) {
11691162
children = (
11701163
<IssueCardMessage
11711164
action={action}

0 commit comments

Comments
 (0)