From fe7598f4c90f22759436de8a235d989c8875db52 Mon Sep 17 00:00:00 2001 From: Adam Horodyski Date: Tue, 10 Jun 2025 17:47:12 +0200 Subject: [PATCH 1/4] fix: refactor isActionOfType to strict equal/set checks --- src/libs/CardMessageUtils.ts | 12 +-- src/libs/ReportActionsUtils.ts | 82 ++++++++----------- .../home/report/PureReportActionItem.tsx | 11 +-- 3 files changed, 37 insertions(+), 68 deletions(-) diff --git a/src/libs/CardMessageUtils.ts b/src/libs/CardMessageUtils.ts index 168db4545c28..801179a7612e 100644 --- a/src/libs/CardMessageUtils.ts +++ b/src/libs/CardMessageUtils.ts @@ -5,7 +5,7 @@ import type {OnyxValues} from '@src/ONYXKEYS'; import ONYXKEYS from '@src/ONYXKEYS'; import type {Card, ReportAction, WorkspaceCardsList} from '@src/types/onyx'; import {getPolicy, getWorkspaceAccountID, isPolicyAdmin} from './PolicyUtils'; -import {getOriginalMessage, isActionOfType} from './ReportActionsUtils'; +import {getOriginalMessage, isActionOfType, isCardIssuedAction} from './ReportActionsUtils'; let allUserCards: OnyxValues[typeof ONYXKEYS.CARD_LIST] = {}; Onyx.connect({ @@ -29,15 +29,7 @@ Onyx.connect({ }); function getExpensifyCardFromReportAction({reportAction, policyID}: {reportAction?: ReportAction; policyID?: string}): Card | undefined { - const cardIssuedActionOriginalMessage = isActionOfType( - reportAction, - CONST.REPORT.ACTIONS.TYPE.CARD_ISSUED, - CONST.REPORT.ACTIONS.TYPE.CARD_ISSUED_VIRTUAL, - CONST.REPORT.ACTIONS.TYPE.CARD_ASSIGNED, - CONST.REPORT.ACTIONS.TYPE.CARD_MISSING_ADDRESS, - ) - ? getOriginalMessage(reportAction) - : undefined; + const cardIssuedActionOriginalMessage = isCardIssuedAction(reportAction) ? getOriginalMessage(reportAction) : undefined; const cardID = cardIssuedActionOriginalMessage?.cardID ?? CONST.DEFAULT_NUMBER_ID; const workspaceAccountID = getWorkspaceAccountID(policyID); diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index 63b8762febf3..5859baeea9c3 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -129,7 +129,7 @@ const SALESFORCE_EXPENSES_URL_PREFIX = 'https://login.salesforce.com/'; */ const QBO_EXPENSES_URL = 'https://qbo.intuit.com/app/expenses'; -const POLICY_CHANGE_LOG_ARRAY = Object.values(CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG); +const POLICY_CHANGE_LOG_ARRAY = new Set(Object.values(CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG)); function isCreatedAction(reportAction: OnyxInputOrEntry): boolean { return reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.CREATED; @@ -220,7 +220,7 @@ function isModifiedExpenseAction(reportAction: OnyxInputOrEntry): } function isPolicyChangeLogAction(reportAction: OnyxInputOrEntry): reportAction is ReportAction> { - return isActionOfType(reportAction, ...POLICY_CHANGE_LOG_ARRAY); + return reportAction?.actionName ? POLICY_CHANGE_LOG_ARRAY.has(reportAction.actionName) : false; } function isChronosOOOListAction(reportAction: OnyxInputOrEntry): reportAction is ReportAction { @@ -239,22 +239,8 @@ function isTripPreview(reportAction: OnyxInputOrEntry): reportActi return isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.TRIP_PREVIEW); } -function isActionOfType( - action: OnyxInputOrEntry, - ...actionNames: T -): action is { - [K in keyof T]: ReportAction; -}[number] { - const actionName = action?.actionName as T[number]; - - // This is purely a performance optimization to limit the 'includes()' calls on Hermes - for (const i of actionNames) { - if (i === actionName) { - return true; - } - } - - return false; +function isActionOfType(action: OnyxInputOrEntry, actionName: T): action is ReportAction { + return action?.actionName === actionName; } function getOriginalMessage(reportAction: OnyxInputOrEntry>): OriginalMessage | undefined { @@ -328,20 +314,19 @@ function isReimbursementQueuedAction(reportAction: OnyxInputOrEntry, ): reportAction is ReportAction> { - return isActionOfType( - reportAction, - CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.INVITE_TO_ROOM, - CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.REMOVE_FROM_ROOM, - CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.INVITE_TO_ROOM, - CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.REMOVE_FROM_ROOM, - CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.LEAVE_POLICY, + return ( + isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.INVITE_TO_ROOM) || + isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.REMOVE_FROM_ROOM) || + isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.INVITE_TO_ROOM) || + isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.REMOVE_FROM_ROOM) || + isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.LEAVE_POLICY) ); } function isInviteMemberAction( reportAction: OnyxEntry, ): reportAction is ReportAction { - return isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.INVITE_TO_ROOM, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.INVITE_TO_ROOM); + 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); } function isLeavePolicyAction(reportAction: OnyxEntry): reportAction is ReportAction { @@ -374,19 +359,20 @@ function isReopenedAction(reportAction: OnyxEntry): reportAction i return isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.REOPENED); } +const isRoomChangeLogActionSet = new Set(Object.values(CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG)); + function isRoomChangeLogAction(reportAction: OnyxEntry): reportAction is ReportAction> { - return isActionOfType(reportAction, ...Object.values(CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG)); + return reportAction?.actionName ? isRoomChangeLogActionSet.has(reportAction.actionName) : false; } function isInviteOrRemovedAction( reportAction: OnyxInputOrEntry, ): reportAction is ReportAction> { - return isActionOfType( - reportAction, - CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.INVITE_TO_ROOM, - CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.REMOVE_FROM_ROOM, - CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.INVITE_TO_ROOM, - CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.REMOVE_FROM_ROOM, + return ( + isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.INVITE_TO_ROOM) || + isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.REMOVE_FROM_ROOM) || + isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.INVITE_TO_ROOM) || + isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.REMOVE_FROM_ROOM) ); } @@ -2359,13 +2345,19 @@ function getDemotedFromWorkspaceMessage(reportAction: OnyxEntry) { - return isActionOfType( - reportAction, - CONST.REPORT.ACTIONS.TYPE.CARD_ISSUED, - CONST.REPORT.ACTIONS.TYPE.CARD_ISSUED_VIRTUAL, - CONST.REPORT.ACTIONS.TYPE.CARD_MISSING_ADDRESS, - CONST.REPORT.ACTIONS.TYPE.CARD_ASSIGNED, +function isCardIssuedAction( + reportAction: OnyxEntry, +): reportAction is ReportAction< + | typeof CONST.REPORT.ACTIONS.TYPE.CARD_ISSUED + | typeof CONST.REPORT.ACTIONS.TYPE.CARD_ISSUED_VIRTUAL + | typeof CONST.REPORT.ACTIONS.TYPE.CARD_MISSING_ADDRESS + | typeof CONST.REPORT.ACTIONS.TYPE.CARD_ASSIGNED +> { + return ( + isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.CARD_ISSUED) || + isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.CARD_ISSUED_VIRTUAL) || + isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.CARD_MISSING_ADDRESS) || + isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.CARD_ASSIGNED) ); } @@ -2399,15 +2391,7 @@ function getCardIssuedMessage({ policyID?: string; card?: Card; }) { - const cardIssuedActionOriginalMessage = isActionOfType( - reportAction, - CONST.REPORT.ACTIONS.TYPE.CARD_ISSUED, - CONST.REPORT.ACTIONS.TYPE.CARD_ISSUED_VIRTUAL, - CONST.REPORT.ACTIONS.TYPE.CARD_ASSIGNED, - CONST.REPORT.ACTIONS.TYPE.CARD_MISSING_ADDRESS, - ) - ? getOriginalMessage(reportAction) - : undefined; + const cardIssuedActionOriginalMessage = isCardIssuedAction(reportAction) ? getOriginalMessage(reportAction) : undefined; const assigneeAccountID = cardIssuedActionOriginalMessage?.assigneeAccountID ?? CONST.DEFAULT_NUMBER_ID; const cardID = cardIssuedActionOriginalMessage?.cardID ?? CONST.DEFAULT_NUMBER_ID; diff --git a/src/pages/home/report/PureReportActionItem.tsx b/src/pages/home/report/PureReportActionItem.tsx index 1636e69a2b3d..c685db07164d 100644 --- a/src/pages/home/report/PureReportActionItem.tsx +++ b/src/pages/home/report/PureReportActionItem.tsx @@ -93,6 +93,7 @@ import { isActionableReportMentionWhisper, isActionableTrackExpense, isActionOfType, + isCardIssuedAction, isChronosOOOListAction, isConciergeCategoryOptions, isCreatedTaskReportAction, @@ -1120,15 +1121,7 @@ function PureReportActionItem({ ); } else if (isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.DEMOTED_FROM_WORKSPACE)) { children = ; - } else if ( - isActionOfType( - action, - CONST.REPORT.ACTIONS.TYPE.CARD_ISSUED, - CONST.REPORT.ACTIONS.TYPE.CARD_ISSUED_VIRTUAL, - CONST.REPORT.ACTIONS.TYPE.CARD_MISSING_ADDRESS, - CONST.REPORT.ACTIONS.TYPE.CARD_ASSIGNED, - ) - ) { + } else if (isCardIssuedAction(action)) { children = ( Date: Wed, 11 Jun 2025 18:47:16 +0200 Subject: [PATCH 2/4] fix: linter errors --- src/libs/CardMessageUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/CardMessageUtils.ts b/src/libs/CardMessageUtils.ts index b1c18a7d790c..d1931062ba00 100644 --- a/src/libs/CardMessageUtils.ts +++ b/src/libs/CardMessageUtils.ts @@ -5,7 +5,7 @@ import type {OnyxValues} from '@src/ONYXKEYS'; import ONYXKEYS from '@src/ONYXKEYS'; import type {Card, ReportAction, WorkspaceCardsList} from '@src/types/onyx'; import {getPolicy, getWorkspaceAccountID, isPolicyAdmin} from './PolicyUtils'; -import {getOriginalMessage, isActionOfType, isCardIssuedAction} from './ReportActionsUtils'; +import {getOriginalMessage, isCardIssuedAction} from './ReportActionsUtils'; let allUserCards: OnyxValues[typeof ONYXKEYS.CARD_LIST] = {}; Onyx.connect({ From e8d0321aa41282bcd2fa7e3e3628d3afe989e98a Mon Sep 17 00:00:00 2001 From: Adam Horodyski Date: Thu, 12 Jun 2025 11:42:38 +0200 Subject: [PATCH 3/4] chore: code review amends --- src/libs/ReportActionsUtils.ts | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index 72c95a5881f9..f5a025ba693c 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -132,6 +132,16 @@ const QBO_EXPENSES_URL = 'https://qbo.intuit.com/app/expenses'; const POLICY_CHANGE_LOG_ARRAY = new Set(Object.values(CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG)); +const ROOM_CHANGE_LOG_ARRAY = new Set(Object.values(CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG)); + +const MEMBER_CHANGE_ARRAY = new Set([ + CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.INVITE_TO_ROOM, + CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.REMOVE_FROM_ROOM, + CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.INVITE_TO_ROOM, + CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.REMOVE_FROM_ROOM, + CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.LEAVE_POLICY +]); + function isCreatedAction(reportAction: OnyxInputOrEntry): boolean { return reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.CREATED; } @@ -323,13 +333,7 @@ function isReimbursementQueuedAction(reportAction: OnyxInputOrEntry, ): reportAction is ReportAction> { - return ( - isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.INVITE_TO_ROOM) || - isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.REMOVE_FROM_ROOM) || - isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.INVITE_TO_ROOM) || - isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.REMOVE_FROM_ROOM) || - isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.LEAVE_POLICY) - ); + return reportAction?.actionName ? MEMBER_CHANGE_ARRAY.has(reportAction.actionName) : false; } function isInviteMemberAction( @@ -368,10 +372,8 @@ function isReopenedAction(reportAction: OnyxEntry): reportAction i return isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.REOPENED); } -const isRoomChangeLogActionSet = new Set(Object.values(CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG)); - function isRoomChangeLogAction(reportAction: OnyxEntry): reportAction is ReportAction> { - return reportAction?.actionName ? isRoomChangeLogActionSet.has(reportAction.actionName) : false; + return reportAction?.actionName ? ROOM_CHANGE_LOG_ARRAY.has(reportAction.actionName) : false; } function isInviteOrRemovedAction( From 6279a3cc0d8002ee58fbba52537c20b98669c1a5 Mon Sep 17 00:00:00 2001 From: Adam Horodyski Date: Thu, 12 Jun 2025 11:45:00 +0200 Subject: [PATCH 4/4] fix: prettier --- src/libs/ReportActionsUtils.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index f5a025ba693c..e39fd45dcbcb 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -135,11 +135,11 @@ const POLICY_CHANGE_LOG_ARRAY = new Set(Object.values(CONST.RE const ROOM_CHANGE_LOG_ARRAY = new Set(Object.values(CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG)); const MEMBER_CHANGE_ARRAY = new Set([ - CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.INVITE_TO_ROOM, - CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.REMOVE_FROM_ROOM, - CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.INVITE_TO_ROOM, - CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.REMOVE_FROM_ROOM, - CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.LEAVE_POLICY + CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.INVITE_TO_ROOM, + CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.REMOVE_FROM_ROOM, + CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.INVITE_TO_ROOM, + CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.REMOVE_FROM_ROOM, + CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.LEAVE_POLICY, ]); function isCreatedAction(reportAction: OnyxInputOrEntry): boolean { @@ -333,7 +333,7 @@ function isReimbursementQueuedAction(reportAction: OnyxInputOrEntry, ): reportAction is ReportAction> { - return reportAction?.actionName ? MEMBER_CHANGE_ARRAY.has(reportAction.actionName) : false; + return reportAction?.actionName ? MEMBER_CHANGE_ARRAY.has(reportAction.actionName) : false; } function isInviteMemberAction(