diff --git a/src/components/MoneyRequestConfirmationList/sections/ReportField.tsx b/src/components/MoneyRequestConfirmationList/sections/ReportField.tsx index 5a758f527e72..15eefc19dd85 100644 --- a/src/components/MoneyRequestConfirmationList/sections/ReportField.tsx +++ b/src/components/MoneyRequestConfirmationList/sections/ReportField.tsx @@ -1,6 +1,7 @@ import React from 'react'; import type {OnyxEntry} from 'react-native-onyx'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; +import useArchivedReportsIDSet from '@hooks/useArchivedReportsIDSet'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import useOutstandingReports from '@hooks/useOutstandingReports'; @@ -15,7 +16,7 @@ import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type * as OnyxTypes from '@src/types/onyx'; import type {Participant} from '@src/types/onyx/IOU'; -import {createOutstandingReportsForPolicySelector, createOutstandingReportsNVPsSelector, reportFieldTransactionStateSelector} from './selectors'; +import {createOutstandingReportsForPolicySelector, reportFieldTransactionStateSelector} from './selectors'; import useTransactionSelector from './useTransactionSelector'; type ReportFieldProps = { @@ -51,9 +52,7 @@ function ReportField({selectedParticipants, iouType, reportID, reportActionID, a const reportAttributes = useReportAttributes(); const policyID = selectedParticipants?.at(0)?.policyID; const [outstandingReportsForPolicy] = useOnyx(ONYXKEYS.DERIVED.OUTSTANDING_REPORTS_BY_POLICY_ID, {selector: createOutstandingReportsForPolicySelector(policyID)}, [policyID]); - const [reportNameValuePairs] = useOnyx(ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS, {selector: createOutstandingReportsNVPsSelector(outstandingReportsForPolicy)}, [ - outstandingReportsForPolicy, - ]); + const archivedReportsIDSet = useArchivedReportsIDSet(); // Self-resolved narrow slice of the transaction; replaces the previously prop-drilled `transaction` object. const transactionState = useTransactionSelector(transactionID, reportFieldTransactionStateSelector); @@ -73,11 +72,11 @@ function ReportField({selectedParticipants, iouType, reportID, reportActionID, a * We need to check if the transaction report exists first in order to prevent the outstanding reports from being used. * Also we need to check if transaction report exists in outstanding reports in order to show a correct report name. */ - const shouldUseTransactionReport = (!!transactionReportEntry && isReportOutstanding(transactionReportEntry, policyID, undefined, false)) || isUnreported; + const shouldUseTransactionReport = (!!transactionReportEntry && isReportOutstanding(transactionReportEntry, policyID, archivedReportsIDSet, false)) || isUnreported; const ownerAccountID = selectedParticipants?.at(0)?.ownerAccountID; - const availableOutstandingReports = getOutstandingReportsForUser(policyID, ownerAccountID, outstandingReportsForPolicy ?? {}, reportNameValuePairs, false).sort((a, b) => + const availableOutstandingReports = getOutstandingReportsForUser(policyID, ownerAccountID, archivedReportsIDSet, outstandingReportsForPolicy ?? {}, false).sort((a, b) => localeCompare(a?.reportName?.toLowerCase() ?? '', b?.reportName?.toLowerCase() ?? ''), ); diff --git a/src/components/MoneyRequestConfirmationList/sections/selectors.ts b/src/components/MoneyRequestConfirmationList/sections/selectors.ts index 668ceb6495d1..59c87b93f858 100644 --- a/src/components/MoneyRequestConfirmationList/sections/selectors.ts +++ b/src/components/MoneyRequestConfirmationList/sections/selectors.ts @@ -1,7 +1,6 @@ /** Onyx selectors used by the confirmation field leaves. */ import type {OnyxCollection, OnyxEntry} from 'react-native-onyx'; import {canSendInvoice} from '@libs/PolicyUtils'; -import getReportNameValuePairsForReports from '@libs/ReportNameValuePairsUtils'; import { getCategory, getCreated, @@ -302,7 +301,6 @@ type ReportFieldTransactionState = { isFromGlobalCreate: boolean; participantReportID: string | undefined; }; -type OutstandingReportsForPolicy = OnyxTypes.OutstandingReportsByPolicyIDDerivedValue[string]; const reportFieldTransactionStateSelector = (t: OnyxEntry): ReportFieldTransactionState | undefined => { if (!t) { @@ -318,15 +316,6 @@ const reportFieldTransactionStateSelector = (t: OnyxEntry): ReportF const createOutstandingReportsForPolicySelector = (policyID: string | undefined) => (derived: OnyxEntry) => derived?.[policyID ?? CONST.DEFAULT_NUMBER_ID]; -const createOutstandingReportsNVPsSelector = - (outstandingReports: OutstandingReportsForPolicy | undefined) => - (allNVPs: OnyxCollection): OnyxCollection | undefined => { - if (!outstandingReports || !allNVPs) { - return undefined; - } - return getReportNameValuePairsForReports(outstandingReports, allNVPs); - }; - // --- InvoiceSenderField --- type InvoiceSenderWorkspace = {id: string | undefined; name: string | undefined; avatarURL: string | undefined} | undefined; @@ -350,7 +339,6 @@ export { attendeeSliceSelector, categoryStateSelector, createCanUpdateSenderWorkspaceSelector, - createOutstandingReportsNVPsSelector, createOutstandingReportsForPolicySelector, createTagDisplaySelector, dateStateSelector, diff --git a/src/components/Search/index.tsx b/src/components/Search/index.tsx index 56a7b28277e4..574136cbfea0 100644 --- a/src/components/Search/index.tsx +++ b/src/components/Search/index.tsx @@ -12,7 +12,7 @@ import type {SelectionListHandle} from '@components/SelectionList/types'; import SearchRowSkeleton from '@components/Skeletons/SearchRowSkeleton'; import {useWideRHPActions} from '@components/WideRHPContextProvider'; import useActionLoadingReportIDs from '@hooks/useActionLoadingReportIDs'; -import useArchivedReportsIdSet from '@hooks/useArchivedReportsIdSet'; +import useArchivedReportsIDSet from '@hooks/useArchivedReportsIDSet'; import {useCurrencyListActions} from '@hooks/useCurrencyList'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; import useEnvironment from '@hooks/useEnvironment'; @@ -66,6 +66,7 @@ import { shouldShowEmptyState, shouldShowYear as shouldShowYearUtil, } from '@libs/SearchUIUtils'; +import type {ArchivedReportsIDSet} from '@libs/SearchUIUtils'; import {cancelSpan, endSpanWithAttributes, getSpan, startSpan} from '@libs/telemetry/activeSpans'; import { cancelNavigateToReportsSpans, @@ -125,18 +126,33 @@ type HoldMenuCallback = (item: TransactionReportGroupListItemType, requestType: const hashToString = (queryHash?: number) => (queryHash || queryHash === 0 ? String(queryHash) : undefined); -function mapTransactionItemToSelectedEntry( - item: TransactionListItemType, - itemTransaction: OnyxEntry, - originalItemTransaction: OnyxEntry, - currentUserLogin: string, - currentUserAccountID: number, - outstandingReportsByPolicyID: OutstandingReportsByPolicyIDDerivedValue | undefined, - allowNegativeAmount: boolean, - parentReport: OnyxEntry | undefined, - selfDMReport: OnyxEntry | undefined, - isProduction: boolean, -): [string, SelectedTransactionInfo] { +type MapTransactionItemToSelectedEntryParams = { + item: TransactionListItemType; + itemTransaction: OnyxEntry; + originalItemTransaction: OnyxEntry; + currentUserLogin: string; + currentUserAccountID: number; + archivedReportsIDSet: ArchivedReportsIDSet; + outstandingReportsByPolicyID: OutstandingReportsByPolicyIDDerivedValue | undefined; + selfDMReport: OnyxEntry; + isProduction: boolean; + allowNegativeAmount: boolean; + parentReport: OnyxEntry | undefined; +}; + +function mapTransactionItemToSelectedEntry({ + item, + itemTransaction, + originalItemTransaction, + currentUserLogin, + currentUserAccountID, + archivedReportsIDSet, + outstandingReportsByPolicyID, + selfDMReport, + isProduction, + allowNegativeAmount, + parentReport, +}: MapTransactionItemToSelectedEntryParams): [string, SelectedTransactionInfo] { const {canHoldRequest, canUnholdRequest} = canHoldUnholdReportAction(item.report, item.reportAction, item.holdReportAction, item, item.policy, currentUserAccountID); const canRejectRequest = item.report ? canRejectReportAction(currentUserLogin, item.report) : false; const amount = hasValidModifiedAmount(item) ? Number(item.modifiedAmount) : item.amount; @@ -161,6 +177,7 @@ function mapTransactionItemToSelectedEntry( transaction: item, report: item.report, policy: item.policy, + archivedReportsIDSet, }), action: item.action, groupCurrency: item.groupCurrency, @@ -228,36 +245,52 @@ function mapEmptyReportToSelectedEntry(item: TransactionReportGroupListItemType ]; } -function prepareTransactionsList( - item: TransactionListItemType, - itemTransaction: OnyxEntry, - originalItemTransaction: OnyxEntry, - selectedTransactions: SelectedTransactions, - currentUserLogin: string, - currentUserAccountID: number, - outstandingReportsByPolicyID: OutstandingReportsByPolicyIDDerivedValue | undefined, - parentReport: OnyxEntry | undefined, - selfDMReport: OnyxEntry | undefined, - isProduction: boolean, -) { +type PrepareTransactionsListParams = { + item: TransactionListItemType; + itemTransaction: OnyxEntry; + originalItemTransaction: OnyxEntry; + selectedTransactions: SelectedTransactions; + currentUserLogin: string; + currentUserAccountID: number; + archivedReportsIDSet: ArchivedReportsIDSet; + outstandingReportsByPolicyID: OutstandingReportsByPolicyIDDerivedValue | undefined; + selfDMReport: OnyxEntry; + isProduction: boolean; + parentReport: OnyxEntry | undefined; +}; + +function prepareTransactionsList({ + item, + itemTransaction, + originalItemTransaction, + selectedTransactions, + currentUserLogin, + currentUserAccountID, + archivedReportsIDSet, + outstandingReportsByPolicyID, + selfDMReport, + isProduction, + parentReport, +}: PrepareTransactionsListParams) { if (selectedTransactions[item.keyForList]?.isSelected) { const {[item.keyForList]: omittedTransaction, ...transactions} = selectedTransactions; return transactions; } - const [key, selectedInfo] = mapTransactionItemToSelectedEntry( + const [key, selectedInfo] = mapTransactionItemToSelectedEntry({ item, itemTransaction, originalItemTransaction, currentUserLogin, currentUserAccountID, + archivedReportsIDSet, outstandingReportsByPolicyID, - false, - parentReport, selfDMReport, isProduction, - ); + allowNegativeAmount: false, + parentReport, + }); return { ...selectedTransactions, @@ -331,7 +364,7 @@ function Search({ const isExpenseReportType = type === CONST.SEARCH.DATA_TYPES.EXPENSE_REPORT; - const archivedReportsIdSet = useArchivedReportsIdSet(); + const archivedReportsIDSet = useArchivedReportsIDSet(); const [exportReportActions] = useOnyx | undefined>(ONYXKEYS.COLLECTION.REPORT_ACTIONS, { selector: selectFilteredReportActions, @@ -564,7 +597,7 @@ function Search({ groupBy: validGroupBy, reportActions: exportReportActions, currentSearch: currentSearchKey, - archivedReportsIDList: archivedReportsIdSet, + archivedReportsIDList: archivedReportsIDSet, queryJSON, isActionLoadingSet, cardFeeds, @@ -594,7 +627,7 @@ function Search({ searchDataWithOptimisticTransaction, searchResults, type, - archivedReportsIdSet, + archivedReportsIDSet, translate, formatPhoneNumber, accountID, @@ -1058,18 +1091,19 @@ function Search({ const itemTransaction = transactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${item.transactionID}`] as OnyxEntry; const originalItemTransaction = transactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${itemTransaction?.comment?.originalTransactionID}`]; const itemParentReport = searchResults?.data?.[`${ONYXKEYS.COLLECTION.REPORT}${item.report?.parentReportID}`] as OnyxEntry; - const updatedTransactions = prepareTransactionsList( + const updatedTransactions = prepareTransactionsList({ item, itemTransaction, originalItemTransaction, selectedTransactions, - email ?? '', - accountID, + currentUserLogin: email ?? '', + currentUserAccountID: accountID, + archivedReportsIDSet, outstandingReportsByPolicyID, - itemParentReport, selfDMReport, isProduction, - ); + parentReport: itemParentReport, + }); // Tag individual transactions with their parent group key so export filtering can derive the group when needed. if (areItemsGrouped) { @@ -1141,18 +1175,19 @@ function Search({ searchResults?.data?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${itemTransaction?.comment?.originalTransactionID}`] ?? transactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${itemTransaction?.comment?.originalTransactionID}`]; const itemParentReport = searchResults?.data?.[`${ONYXKEYS.COLLECTION.REPORT}${transactionItem.report?.parentReportID}`] as OnyxEntry; - const [key, entry] = mapTransactionItemToSelectedEntry( - transactionItem, + const [key, entry] = mapTransactionItemToSelectedEntry({ + item: transactionItem, itemTransaction, originalItemTransaction, - email ?? '', - accountID, + currentUserLogin: email ?? '', + currentUserAccountID: accountID, + archivedReportsIDSet, outstandingReportsByPolicyID, - true, - itemParentReport, selfDMReport, isProduction, - ); + allowNegativeAmount: true, + parentReport: itemParentReport, + }); return [key, {...entry, groupKey: item.keyForList}]; }), ), @@ -1168,6 +1203,7 @@ function Search({ searchResults?.data, email, accountID, + archivedReportsIDSet, outstandingReportsByPolicyID, selfDMReport, isProduction, @@ -1488,18 +1524,19 @@ function Search({ const itemTransaction = transactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionItem.transactionID}`] as OnyxEntry; const originalItemTransaction = transactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${itemTransaction?.comment?.originalTransactionID}`]; const itemParentReport = searchResults?.data?.[`${ONYXKEYS.COLLECTION.REPORT}${transactionItem.report?.parentReportID}`] as OnyxEntry; - const [key, entry] = mapTransactionItemToSelectedEntry( - transactionItem, + const [key, entry] = mapTransactionItemToSelectedEntry({ + item: transactionItem, itemTransaction, originalItemTransaction, - email ?? '', - accountID, + currentUserLogin: email ?? '', + currentUserAccountID: accountID, + archivedReportsIDSet, outstandingReportsByPolicyID, - true, - itemParentReport, selfDMReport, isProduction, - ); + allowNegativeAmount: true, + parentReport: itemParentReport, + }); return [key, {...entry, groupKey: item.keyForList}] as [string, SelectedTransactionInfo]; }); }); @@ -1513,18 +1550,19 @@ function Search({ const itemTransaction = searchResults?.data?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionItem.transactionID}`] as OnyxEntry; const originalItemTransaction = searchResults?.data?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${itemTransaction?.comment?.originalTransactionID}`]; const itemParentReport = searchResults?.data?.[`${ONYXKEYS.COLLECTION.REPORT}${transactionItem.report?.parentReportID}`] as OnyxEntry; - return mapTransactionItemToSelectedEntry( - transactionItem, + return mapTransactionItemToSelectedEntry({ + item: transactionItem, itemTransaction, originalItemTransaction, - email ?? '', - accountID, + currentUserLogin: email ?? '', + currentUserAccountID: accountID, + archivedReportsIDSet, outstandingReportsByPolicyID, - true, - itemParentReport, selfDMReport, isProduction, - ); + allowNegativeAmount: true, + parentReport: itemParentReport, + }); }), ); } @@ -1538,10 +1576,11 @@ function Search({ updateSelectAllMatchingItemsState, clearSelectedTransactions, transactions, + searchResults?.data, email, accountID, + archivedReportsIDSet, outstandingReportsByPolicyID, - searchResults?.data, selfDMReport, isProduction, ]); diff --git a/src/hooks/useArchivedReportsIDSet.ts b/src/hooks/useArchivedReportsIDSet.ts new file mode 100644 index 000000000000..5b3ba137bf98 --- /dev/null +++ b/src/hooks/useArchivedReportsIDSet.ts @@ -0,0 +1,15 @@ +import {buildArchivedReportsIDSet} from '@libs/ReportUtils'; +import type {ArchivedReportsIDSet} from '@libs/SearchUIUtils'; +import ONYXKEYS from '@src/ONYXKEYS'; +import useOnyx from './useOnyx'; + +/** + * Hook that returns a Set of archived report IDs + */ +function useArchivedReportsIDSet(): ArchivedReportsIDSet { + const [reportNameValuePairs] = useOnyx(ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS); + + return buildArchivedReportsIDSet(reportNameValuePairs); +} + +export default useArchivedReportsIDSet; diff --git a/src/hooks/useArchivedReportsIdSet.ts b/src/hooks/useArchivedReportsIdSet.ts deleted file mode 100644 index 20dc07998fa0..000000000000 --- a/src/hooks/useArchivedReportsIdSet.ts +++ /dev/null @@ -1,23 +0,0 @@ -import {isArchivedReport} from '@libs/ReportUtils'; -import type {ArchivedReportsIDSet} from '@libs/SearchUIUtils'; -import ONYXKEYS from '@src/ONYXKEYS'; -import useOnyx from './useOnyx'; - -/** - * Hook that returns a Set of archived report IDs - */ -function useArchivedReportsIdSet(): ArchivedReportsIDSet { - const [reportNameValuePairs] = useOnyx(ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS); - const ids: string[] = []; - - if (reportNameValuePairs) { - for (const [key, value] of Object.entries(reportNameValuePairs)) { - if (isArchivedReport(value)) { - ids.push(key); - } - } - } - return new Set(ids); -} - -export default useArchivedReportsIdSet; diff --git a/src/hooks/useAutoCreateTrackWorkspace.ts b/src/hooks/useAutoCreateTrackWorkspace.ts index 25f3c2e771bb..7dc07f940edd 100644 --- a/src/hooks/useAutoCreateTrackWorkspace.ts +++ b/src/hooks/useAutoCreateTrackWorkspace.ts @@ -12,7 +12,7 @@ import {setOnboardingAdminsChatReportID, setOnboardingPolicyID} from '@userActio import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import type {OnboardingPurpose, OnboardingRHPVariant, Policy} from '@src/types/onyx'; -import useArchivedReportsIdSet from './useArchivedReportsIdSet'; +import useArchivedReportsIDSet from './useArchivedReportsIDSet'; import useOnboardingWorkspaceCreationState from './useOnboardingWorkspaceCreationState'; import useOnyx from './useOnyx'; import usePermissions from './usePermissions'; @@ -52,7 +52,7 @@ function useAutoCreateTrackWorkspace() { const [conciergeChatReportID = ''] = useOnyx(ONYXKEYS.CONCIERGE_REPORT_ID); const [onboardingValues] = useOnyx(ONYXKEYS.NVP_ONBOARDING); - const archivedReportsIdSet = useArchivedReportsIdSet(); + const archivedReportsIDSet = useArchivedReportsIDSet(); const {isBetaEnabled} = usePermissions(); const mergedAccountConciergeReportID = !onboardingValues?.shouldRedirectToClassicAfterMerge && onboardingValues?.shouldValidate ? conciergeChatReportID : undefined; @@ -126,7 +126,7 @@ function useAutoCreateTrackWorkspace() { shouldUseNarrowLayout, isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS), conciergeChatReportID, - archivedReportsIdSet, + archivedReportsIDSet, newPolicyID, mergedAccountConciergeReportID, false, @@ -155,7 +155,7 @@ function useAutoCreateTrackWorkspace() { shouldUseNarrowLayout, isBetaEnabled, conciergeChatReportID, - archivedReportsIdSet, + archivedReportsIDSet, mergedAccountConciergeReportID, ], ); diff --git a/src/hooks/useDeleteTransactions.ts b/src/hooks/useDeleteTransactions.ts index 177de274f14e..cf472a275375 100644 --- a/src/hooks/useDeleteTransactions.ts +++ b/src/hooks/useDeleteTransactions.ts @@ -11,7 +11,7 @@ import initSplitExpense from '@libs/actions/SplitExpenses'; import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID'; import {calculateAmount as calculateIOUAmount} from '@libs/IOUUtils'; import {getOriginalMessage, isMoneyRequestAction} from '@libs/ReportActionsUtils'; -import {isSelfDM} from '@libs/ReportUtils'; +import {isReportArchivedByID, isSelfDM} from '@libs/ReportUtils'; import {getActiveGroupSearchHashes} from '@libs/SearchUIUtils'; import { getChildTransactions, @@ -23,7 +23,7 @@ import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import type {Policy, Report, ReportAction, Transaction, TransactionViolations} from '@src/types/onyx'; import type {SplitExpense} from '@src/types/onyx/IOU'; -import useArchivedReportsIdSet from './useArchivedReportsIdSet'; +import useArchivedReportsIDSet from './useArchivedReportsIDSet'; import useCurrentUserPersonalDetails from './useCurrentUserPersonalDetails'; import useEnvironment from './useEnvironment'; import useNetwork from './useNetwork'; @@ -78,7 +78,7 @@ function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransac const [allPolicyTags] = useOnyx(ONYXKEYS.COLLECTION.POLICY_TAGS, {selector: passthroughPolicyTagListSelector}); const [betas] = useOnyx(ONYXKEYS.BETAS); const {isBetaEnabled} = usePermissions(); - const archivedReportsIdSet = useArchivedReportsIdSet(); + const archivedReportsIDSet = useArchivedReportsIDSet(); const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST); const [selfDMReportID] = useOnyx(ONYXKEYS.SELF_DM_REPORT_ID); const {isOffline} = useNetwork(); @@ -300,7 +300,7 @@ function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransac const chatReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${iouReport?.chatReportID}`]; const transactionThreadReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${action?.childReportID}`]; const chatIOUReportID = chatReport?.reportID; - const isChatIOUReportArchived = archivedReportsIdSet.has(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${chatIOUReportID}`); + const isChatIOUReportArchived = isReportArchivedByID(archivedReportsIDSet, chatIOUReportID); deleteMoneyRequest({ transactionID, reportAction: action, @@ -334,7 +334,7 @@ function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransac allReports, allSnapshots, allTransactions, - archivedReportsIdSet, + archivedReportsIDSet, currentUserPersonalDetails, currentSearchQueryJSON, currentSearchResults?.data, diff --git a/src/hooks/useOutstandingReports.ts b/src/hooks/useOutstandingReports.ts index cf793b743ef5..256c070e0c94 100644 --- a/src/hooks/useOutstandingReports.ts +++ b/src/hooks/useOutstandingReports.ts @@ -1,53 +1,22 @@ -import type {OnyxCollection, OnyxEntry} from 'react-native-onyx'; -import getReportNameValuePairsForReports from '@libs/ReportNameValuePairsUtils'; +import type {OnyxEntry} from 'react-native-onyx'; import {getOutstandingReportsForUser, isSelfDM} from '@libs/ReportUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import type {OutstandingReportsByPolicyIDDerivedValue, Policy, ReportNameValuePairs} from '@src/types/onyx'; +import type {Policy} from '@src/types/onyx'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; +import useArchivedReportsIDSet from './useArchivedReportsIDSet'; import useMappedPolicies from './useMappedPolicies'; import useOnyx from './useOnyx'; const policyIdMapper = (policy: OnyxEntry) => policy?.id; -const createOutstandingReportsNVPsSelector = - ( - outstandingReportsByPolicyID: OnyxEntry, - selectedPolicyID: string | undefined, - personalPolicyID: string | undefined, - allPoliciesID: OnyxCollection, - shouldUseAllPolicies: boolean, - ) => - (allNVPs: OnyxCollection): OnyxCollection | undefined => { - if (!outstandingReportsByPolicyID || !allNVPs) { - return undefined; - } - - const result: OnyxCollection = {}; - if (shouldUseAllPolicies) { - for (const policyID of Object.values(allPoliciesID ?? {})) { - if (!policyID || policyID === personalPolicyID) { - continue; - } - Object.assign(result, getReportNameValuePairsForReports(outstandingReportsByPolicyID[policyID], allNVPs)); - } - return result; - } - - return getReportNameValuePairsForReports(outstandingReportsByPolicyID[selectedPolicyID ?? CONST.DEFAULT_NUMBER_ID], allNVPs); - }; - export default function useOutstandingReports(selectedReportID: string | undefined, selectedPolicyID: string | undefined, ownerAccountID: number | undefined, isEditing: boolean) { const [outstandingReportsByPolicyID] = useOnyx(ONYXKEYS.DERIVED.OUTSTANDING_REPORTS_BY_POLICY_ID); const [personalPolicyID] = useOnyx(ONYXKEYS.PERSONAL_POLICY_ID); const [allPoliciesID] = useMappedPolicies(policyIdMapper); const [selectedReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${selectedReportID}`); const shouldUseAllPolicies = !selectedPolicyID || selectedPolicyID === personalPolicyID || isSelfDM(selectedReport); - const [reportNameValuePairs] = useOnyx( - ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS, - {selector: createOutstandingReportsNVPsSelector(outstandingReportsByPolicyID, selectedPolicyID, personalPolicyID, allPoliciesID, shouldUseAllPolicies)}, - [outstandingReportsByPolicyID, selectedPolicyID, personalPolicyID, allPoliciesID, shouldUseAllPolicies], - ); + const archivedReportsIDSet = useArchivedReportsIDSet(); // Early return if no reports are available to prevent useless loop if (!outstandingReportsByPolicyID || isEmptyObject(outstandingReportsByPolicyID)) { @@ -61,11 +30,11 @@ export default function useOutstandingReports(selectedReportID: string | undefin continue; } - const reports = getOutstandingReportsForUser(policyID, ownerAccountID, outstandingReportsByPolicyID[policyID] ?? {}, reportNameValuePairs, isEditing); + const reports = getOutstandingReportsForUser(policyID, ownerAccountID, archivedReportsIDSet, outstandingReportsByPolicyID[policyID] ?? {}, isEditing); result.push(...reports); } return result; } - return getOutstandingReportsForUser(selectedPolicyID, ownerAccountID, outstandingReportsByPolicyID?.[selectedPolicyID ?? CONST.DEFAULT_NUMBER_ID] ?? {}, reportNameValuePairs, isEditing); + return getOutstandingReportsForUser(selectedPolicyID, ownerAccountID, archivedReportsIDSet, outstandingReportsByPolicyID?.[selectedPolicyID ?? CONST.DEFAULT_NUMBER_ID] ?? {}, isEditing); } diff --git a/src/hooks/useSearchSections.ts b/src/hooks/useSearchSections.ts index fd331bef0c3e..f79fa75bc411 100644 --- a/src/hooks/useSearchSections.ts +++ b/src/hooks/useSearchSections.ts @@ -3,7 +3,7 @@ import {getSections, getSortedSections} from '@libs/SearchUIUtils'; import ONYXKEYS from '@src/ONYXKEYS'; import type LastSearchParams from '@src/types/onyx/ReportNavigation'; import useActionLoadingReportIDs from './useActionLoadingReportIDs'; -import useArchivedReportsIdSet from './useArchivedReportsIdSet'; +import useArchivedReportsIDSet from './useArchivedReportsIDSet'; import {useCurrencyListActions} from './useCurrencyList'; import useCurrentUserPersonalDetails from './useCurrentUserPersonalDetails'; import useFilterPendingDeleteReports from './useFilterPendingDeleteReports'; @@ -28,7 +28,7 @@ function useSearchSections(): UseSearchSectionsResult { const [nonPersonalAndWorkspaceCards] = useOnyx(ONYXKEYS.DERIVED.NON_PERSONAL_AND_WORKSPACE_CARD_LIST); const [bankAccountList] = useOnyx(ONYXKEYS.BANK_ACCOUNT_LIST); - const archivedReportsIdSet = useArchivedReportsIdSet(); + const archivedReportsIDSet = useArchivedReportsIDSet(); const [conciergeReportID] = useOnyx(ONYXKEYS.CONCIERGE_REPORT_ID); const {type, status, sortBy, sortOrder, groupBy} = lastSearchQuery?.queryJSON ?? {}; @@ -50,7 +50,7 @@ function useSearchSections(): UseSearchSectionsResult { bankAccountList, groupBy, currentSearch: searchKey, - archivedReportsIDList: archivedReportsIdSet, + archivedReportsIDList: archivedReportsIDSet, isActionLoadingSet, cardFeeds, cardList: nonPersonalAndWorkspaceCards, diff --git a/src/hooks/useSelectedTransactionsActions.ts b/src/hooks/useSelectedTransactionsActions.ts index 0370c88f8d8c..a584d4d530ae 100644 --- a/src/hooks/useSelectedTransactionsActions.ts +++ b/src/hooks/useSelectedTransactionsActions.ts @@ -36,6 +36,7 @@ import ROUTES from '@src/ROUTES'; import type {Route} from '@src/ROUTES'; import type {Policy, Report, ReportAction, Session, Transaction} from '@src/types/onyx'; import useAllTransactions from './useAllTransactions'; +import useArchivedReportsIDSet from './useArchivedReportsIDSet'; import useConfirmModal from './useConfirmModal'; import {useCurrencyListActions} from './useCurrencyList'; import useCurrentUserPersonalDetails from './useCurrentUserPersonalDetails'; @@ -83,6 +84,7 @@ function useSelectedTransactionsActions({ const {currentSearchHash} = useSearchQueryContext(); const {clearSelectedTransactions} = useSearchSelectionActions(); const allTransactions = useAllTransactions(); + const archivedReportsIDSet = useArchivedReportsIDSet(); const [allReports] = useOnyx(ONYXKEYS.COLLECTION.REPORT); const [allReportActions] = useOnyx(ONYXKEYS.COLLECTION.REPORT_ACTIONS); const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY); @@ -430,7 +432,13 @@ function useSelectedTransactionsActions({ } const iouReportAction = getIOUActionForTransactionID(reportActions, transaction.transactionID); - const canMoveExpense = canEditFieldOfMoneyRequest({reportAction: iouReportAction, fieldToEdit: CONST.EDIT_REQUEST_FIELD.REPORT, outstandingReportsByPolicyID, transaction}); + const canMoveExpense = canEditFieldOfMoneyRequest({ + reportAction: iouReportAction, + fieldToEdit: CONST.EDIT_REQUEST_FIELD.REPORT, + outstandingReportsByPolicyID, + transaction, + archivedReportsIDSet, + }); return canMoveExpense; }); diff --git a/src/libs/Navigation/AppNavigator/KeyboardShortcutsHandler/MarkAllMessagesAsReadHandler.tsx b/src/libs/Navigation/AppNavigator/KeyboardShortcutsHandler/MarkAllMessagesAsReadHandler.tsx index 13b70d5bfee4..3f3ae0675b82 100644 --- a/src/libs/Navigation/AppNavigator/KeyboardShortcutsHandler/MarkAllMessagesAsReadHandler.tsx +++ b/src/libs/Navigation/AppNavigator/KeyboardShortcutsHandler/MarkAllMessagesAsReadHandler.tsx @@ -1,22 +1,22 @@ import {useEffect, useRef} from 'react'; -import useArchivedReportsIdSet from '@hooks/useArchivedReportsIdSet'; +import useArchivedReportsIDSet from '@hooks/useArchivedReportsIDSet'; import markAllMessagesAsRead from '@libs/actions/Report/MarkAllMessageAsRead'; import KeyboardShortcut from '@libs/KeyboardShortcut'; import CONST from '@src/CONST'; function MarkAllMessagesAsReadHandler() { - const archivedReportsIdSet = useArchivedReportsIdSet(); - const archivedReportsIdSetRef = useRef(archivedReportsIdSet); + const archivedReportsIDSet = useArchivedReportsIDSet(); + const archivedReportsIDSetRef = useRef(archivedReportsIDSet); useEffect(() => { - archivedReportsIdSetRef.current = archivedReportsIdSet; - }, [archivedReportsIdSet]); + archivedReportsIDSetRef.current = archivedReportsIDSet; + }, [archivedReportsIDSet]); useEffect(() => { const shortcutConfig = CONST.KEYBOARD_SHORTCUTS.MARK_ALL_MESSAGES_AS_READ; const unsubscribe = KeyboardShortcut.subscribe( shortcutConfig.shortcutKey, - () => markAllMessagesAsRead(archivedReportsIdSetRef.current), + () => markAllMessagesAsRead(archivedReportsIDSetRef.current), shortcutConfig.descriptionKey, shortcutConfig.modifiers, true, diff --git a/src/libs/Navigation/AppNavigator/Navigators/ReportsSplitNavigator.tsx b/src/libs/Navigation/AppNavigator/Navigators/ReportsSplitNavigator.tsx index 2fa371a64f86..5e07e6d54362 100644 --- a/src/libs/Navigation/AppNavigator/Navigators/ReportsSplitNavigator.tsx +++ b/src/libs/Navigation/AppNavigator/Navigators/ReportsSplitNavigator.tsx @@ -1,5 +1,5 @@ import React, {useState} from 'react'; -import useArchivedReportsIdSet from '@hooks/useArchivedReportsIdSet'; +import useArchivedReportsIDSet from '@hooks/useArchivedReportsIDSet'; import usePermissions from '@hooks/usePermissions'; import createSplitNavigator from '@libs/Navigation/AppNavigator/createSplitNavigator'; import FreezeWrapper from '@libs/Navigation/AppNavigator/FreezeWrapper'; @@ -26,7 +26,7 @@ const Split = createSplitNavigator(); function ReportsSplitNavigator({route}: PlatformStackScreenProps) { const {isBetaEnabled} = usePermissions(); const splitNavigatorScreenOptions = useSplitNavigatorScreenOptions(); - const archivedReportsIdSet = useArchivedReportsIdSet(); + const archivedReportsIDSet = useArchivedReportsIDSet(); const isOpenOnAdminRoom = shouldOpenOnAdminRoom(); const [initialReportID] = useState(() => { @@ -50,7 +50,7 @@ function ReportsSplitNavigator({route}: PlatformStackScreenProps | undefined, allNVPs: NonNullable>): OnyxCollection { - const result: OnyxCollection = {}; - for (const report of Object.values(reports ?? {})) { - if (!report?.reportID) { - continue; - } - const key = `${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report.reportID}` as const; - if (allNVPs[key] !== undefined) { - result[key] = allNVPs[key]; - } - } - return result; -} - -export default getReportNameValuePairsForReports; diff --git a/src/libs/ReportSecondaryActionUtils.ts b/src/libs/ReportSecondaryActionUtils.ts index 95ac79a05c03..9eb83effb371 100644 --- a/src/libs/ReportSecondaryActionUtils.ts +++ b/src/libs/ReportSecondaryActionUtils.ts @@ -1171,7 +1171,13 @@ function getSecondaryTransactionThreadActions({ if ( reportTransaction?.transactionID && reportAction && - canEditFieldOfMoneyRequest({reportAction, fieldToEdit: CONST.EDIT_REQUEST_FIELD.REPORT, isChatReportArchived, outstandingReportsByPolicyID, transaction: reportTransaction}) && + canEditFieldOfMoneyRequest({ + reportAction, + fieldToEdit: CONST.EDIT_REQUEST_FIELD.REPORT, + isChatReportArchived, + outstandingReportsByPolicyID, + transaction: reportTransaction, + }) && canUserPerformWriteActionReportUtils(parentReport, isChatReportArchived) ) { options.push(CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.MOVE_EXPENSE); diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index b3bcbae3d67d..094b02b3195b 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -2266,7 +2266,7 @@ function getMostRecentlyVisitedReport(reports: Array>, lastVis * This function is used to find the last accessed report and we don't need to subscribe the data in the UI. * So please use `Onyx.connectWithoutView()` to get the necessary data when we remove the `Onyx.connect()` */ -function findLastAccessedReport(ignoreDomainRooms: boolean, openOnAdminRoom = false, excludeReportID?: string, archivedReportsIdSet?: ArchivedReportsIDSet): OnyxEntry { +function findLastAccessedReport(ignoreDomainRooms: boolean, openOnAdminRoom = false, excludeReportID?: string, archivedReportsIDSet?: ArchivedReportsIDSet): OnyxEntry { let reportsValues = Object.values(deprecatedAllReports ?? {}); if (openOnAdminRoom) { @@ -2303,7 +2303,7 @@ function findLastAccessedReport(ignoreDomainRooms: boolean, openOnAdminRoom = fa reportsValues = reportsValues.filter((report) => { const reportNameValuePairsKey = `${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.reportID}`; - const isArchived = archivedReportsIdSet ? archivedReportsIdSet.has(reportNameValuePairsKey) : isArchivedReport(allReportNameValuePair?.[reportNameValuePairsKey]); + const isArchived = archivedReportsIDSet ? archivedReportsIDSet.has(reportNameValuePairsKey) : isArchivedReport(allReportNameValuePair?.[reportNameValuePairsKey]); return !isSystemChat(report) && !isArchived; }) ?? []; @@ -2372,6 +2372,23 @@ function isArchivedReport(reportNameValuePairs?: OnyxInputOrEntry): ArchivedReportsIDSet { + const archivedReportsIDSet = new Set(); + for (const [key, value] of Object.entries(reportNameValuePairs ?? {})) { + if (isArchivedReport(value)) { + archivedReportsIDSet.add(key); + } + } + return archivedReportsIDSet; +} + /** * Whether the report was created during harvesting */ @@ -4918,6 +4935,7 @@ function canEditFieldOfMoneyRequest({ transaction, report, policy, + archivedReportsIDSet, }: { reportAction: OnyxInputOrEntry; fieldToEdit: ValueOf; @@ -4927,6 +4945,8 @@ function canEditFieldOfMoneyRequest({ transaction: OnyxEntry; report?: OnyxInputOrEntry; policy?: OnyxEntry; + // Temporarily optional while archived report checks are migrated in smaller PRs. Remove this fallback as part of https://github.com/Expensify/App/issues/66422. + archivedReportsIDSet?: ArchivedReportsIDSet; }): boolean { // A list of fields that cannot be edited by anyone, once an expense has been settled const restrictedFields: string[] = [ @@ -5024,7 +5044,9 @@ function canEditFieldOfMoneyRequest({ return true; } - if (!isReportOutstanding(moneyRequestReport, moneyRequestReport.policyID)) { + const archivedReportIDs = archivedReportsIDSet ?? buildArchivedReportsIDSet(allReportNameValuePair); + + if (!isReportOutstanding(moneyRequestReport, moneyRequestReport.policyID, archivedReportIDs)) { return false; } @@ -5039,6 +5061,7 @@ function canEditFieldOfMoneyRequest({ getOutstandingReportsForUser( moneyRequestReport?.policyID, moneyRequestReport?.ownerAccountID, + archivedReportIDs, outstandingReportsByPolicyID?.[moneyRequestReport?.policyID ?? CONST.DEFAULT_NUMBER_ID] ?? {}, ).length > 0 ); @@ -5052,14 +5075,14 @@ function canEditFieldOfMoneyRequest({ } // Check the cheaper condition first - if ((isOwner || isAdmin || isManager) && isReportOutstanding(moneyRequestReport, moneyRequestReport.policyID)) { + if ((isOwner || isAdmin || isManager) && isReportOutstanding(moneyRequestReport, moneyRequestReport.policyID, archivedReportIDs)) { return true; } // Check if there are multiple outstanding reports across policies let outstandingReportsCount = 0; for (const currentPolicy of policiesArray) { - const reports = getOutstandingReportsForUser(currentPolicy.id, moneyRequestReport?.ownerAccountID, outstandingReportsByPolicyID?.[currentPolicy?.id] ?? {}); + const reports = getOutstandingReportsForUser(currentPolicy.id, moneyRequestReport?.ownerAccountID, archivedReportIDs, outstandingReportsByPolicyID?.[currentPolicy?.id] ?? {}); outstandingReportsCount += reports.length; // Short-circuit once we find more than 1 @@ -11563,7 +11586,8 @@ function isForwardedReport(report: OnyxEntry): boolean { function isReportOutstanding( iouReport: OnyxInputOrEntry, policyID: string | undefined, - reportNameValuePairs: OnyxCollection = allReportNameValuePair, + // Temporarily optional while archived report checks are migrated in smaller PRs. Remove this fallback as part of https://github.com/Expensify/App/issues/66422. + archivedReportsIDSet?: ArchivedReportsIDSet, allowSubmitted = true, ): boolean { if ( @@ -11577,8 +11601,8 @@ function isReportOutstanding( ) { return false; } - const reportNameValuePair = reportNameValuePairs?.[`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${iouReport.reportID}`]; - if (isArchivedReport(reportNameValuePair)) { + const reportNameValuePair = allReportNameValuePair?.[`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${iouReport.reportID}`]; + if (archivedReportsIDSet ? isReportArchivedByID(archivedReportsIDSet, iouReport.reportID) : isArchivedReport(reportNameValuePair)) { return false; } const currentRoute = navigationRef.getCurrentRoute(); @@ -11600,17 +11624,20 @@ function isReportOutstanding( function getOutstandingReportsForUser( policyID: string | undefined, reportOwnerAccountID: number | undefined, + // Temporarily optional while archived report checks are migrated in smaller PRs. Remove this fallback as part of https://github.com/Expensify/App/issues/66422. + archivedReportsIDSet?: ArchivedReportsIDSet, reports: OnyxCollection = deprecatedAllReports, - reportNameValuePairs: OnyxCollection = allReportNameValuePair, allowSubmitted = true, ): Array> { + const archivedReportIDs = archivedReportsIDSet ?? buildArchivedReportsIDSet(allReportNameValuePair); + if (!reports) { return []; } return Object.values(reports).filter( (report) => report?.pendingFields?.preview !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE && - isReportOutstanding(report, policyID, reportNameValuePairs, allowSubmitted) && + isReportOutstanding(report, policyID, archivedReportIDs, allowSubmitted) && report?.ownerAccountID === reportOwnerAccountID, ); } @@ -13332,6 +13359,7 @@ export { buildOptimisticReportLevelRejectCommentAction, buildOptimisticMarkedAsResolvedReportAction, buildParticipantsFromAccountIDs, + buildArchivedReportsIDSet, buildOptimisticChangeApproverReportAction, buildTransactionThread, canAccessReport, @@ -13474,6 +13502,7 @@ export { isAnnounceRoom, isArchivedNonExpenseReport, isArchivedReport, + isReportArchivedByID, isClosedReport, isCanceledTaskReport, isChatReport, diff --git a/src/libs/actions/Report/MarkAllMessageAsRead.tsx b/src/libs/actions/Report/MarkAllMessageAsRead.tsx index 0c31360c9453..b7d0a014aa9a 100644 --- a/src/libs/actions/Report/MarkAllMessageAsRead.tsx +++ b/src/libs/actions/Report/MarkAllMessageAsRead.tsx @@ -27,7 +27,7 @@ Onyx.connectWithoutView({ callback: (value) => (allReports = value), }); -function markAllMessagesAsRead(archivedReportsIdSet: ArchivedReportsIDSet) { +function markAllMessagesAsRead(archivedReportsIDSet: ArchivedReportsIDSet) { if (isAnonymousUser()) { return; } @@ -48,7 +48,7 @@ function markAllMessagesAsRead(archivedReportsIdSet: ArchivedReportsIDSet) { const chatReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${report.chatReportID}`]; const oneTransactionThreadReportID = getOneTransactionThreadReportID(report, chatReport, allReportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.reportID}`]); const oneTransactionThreadReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${oneTransactionThreadReportID}`]; - const isArchivedReport = archivedReportsIdSet.has(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report.reportID}`); + const isArchivedReport = archivedReportsIDSet.has(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report.reportID}`); if (!isUnread(report, oneTransactionThreadReport, isArchivedReport)) { continue; } diff --git a/src/libs/navigateAfterOnboarding.ts b/src/libs/navigateAfterOnboarding.ts index 8a5443e93d12..4c76ae21790c 100644 --- a/src/libs/navigateAfterOnboarding.ts +++ b/src/libs/navigateAfterOnboarding.ts @@ -31,7 +31,7 @@ function getReportIDAfterOnboarding( isSmallScreenWidth: boolean, canUseDefaultRooms: boolean | undefined, conciergeReportID: string, - archivedReportsIdSet: ArchivedReportsIDSet, + archivedReportsIDSet: ArchivedReportsIDSet, onboardingPolicyID?: string, onboardingAdminsChatReportID?: string, shouldPreventOpenAdminRoom = false, @@ -46,7 +46,7 @@ function getReportIDAfterOnboarding( return undefined; } - const lastAccessedReport = findLastAccessedReport(!canUseDefaultRooms, shouldOpenOnAdminRoom() && !shouldPreventOpenAdminRoom, undefined, archivedReportsIdSet); + const lastAccessedReport = findLastAccessedReport(!canUseDefaultRooms, shouldOpenOnAdminRoom() && !shouldPreventOpenAdminRoom, undefined, archivedReportsIDSet); const lastAccessedReportID = lastAccessedReport?.reportID; // When the user goes through the onboarding flow, a workspace can be created if the user selects specific options. The user should be taken to the #admins room for that workspace because it is the most natural place for them to start their experience in the app. @@ -62,7 +62,7 @@ function navigateAfterOnboarding( isSmallScreenWidth: boolean, canUseDefaultRooms: boolean | undefined, conciergeReportID: string, - archivedReportsIdSet: ArchivedReportsIDSet, + archivedReportsIDSet: ArchivedReportsIDSet, onboardingPolicyID?: string, onboardingAdminsChatReportID?: string, shouldPreventOpenAdminRoom = false, @@ -89,7 +89,7 @@ function navigateAfterOnboarding( isSmallScreenWidth, canUseDefaultRooms, conciergeReportID, - archivedReportsIdSet, + archivedReportsIDSet, onboardingPolicyID, onboardingAdminsChatReportID, shouldPreventOpenAdminRoom, @@ -106,7 +106,7 @@ function navigateAfterOnboardingWithMicrotaskQueue( isSmallScreenWidth: boolean, canUseDefaultRooms: boolean | undefined, conciergeReportID: string, - archivedReportsIdSet: ArchivedReportsIDSet, + archivedReportsIDSet: ArchivedReportsIDSet, onboardingPolicyID?: string, onboardingAdminsChatReportID?: string, shouldPreventOpenAdminRoom = false, @@ -118,7 +118,7 @@ function navigateAfterOnboardingWithMicrotaskQueue( isSmallScreenWidth, canUseDefaultRooms, conciergeReportID, - archivedReportsIdSet, + archivedReportsIDSet, onboardingPolicyID, onboardingAdminsChatReportID, shouldPreventOpenAdminRoom, diff --git a/src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx b/src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx index b717ade6c111..2dbd5c0cf89e 100644 --- a/src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx +++ b/src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx @@ -13,7 +13,7 @@ import Section from '@components/Section'; import isSidePanelReportSupported from '@components/SidePanel/isSidePanelReportSupported'; import Text from '@components/Text'; import useActivePolicy from '@hooks/useActivePolicy'; -import useArchivedReportsIdSet from '@hooks/useArchivedReportsIdSet'; +import useArchivedReportsIDSet from '@hooks/useArchivedReportsIDSet'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; import useHasActiveAdminPolicies from '@hooks/useHasActiveAdminPolicies'; import useLastWorkspaceNumber from '@hooks/useLastWorkspaceNumber'; @@ -66,7 +66,7 @@ function BaseOnboardingInterestedFeatures({shouldUseNativeStyles}: BaseOnboardin const {isBetaEnabled} = usePermissions(); const [session] = useOnyx(ONYXKEYS.SESSION); const [conciergeReportID = ''] = useOnyx(ONYXKEYS.CONCIERGE_REPORT_ID); - const archivedReportsIdSet = useArchivedReportsIdSet(); + const archivedReportsIDSet = useArchivedReportsIDSet(); const activePolicy = useActivePolicy(); const hasActiveAdminPolicies = useHasActiveAdminPolicies(); const lastWorkspaceNumber = useLastWorkspaceNumber(); @@ -253,7 +253,7 @@ function BaseOnboardingInterestedFeatures({shouldUseNativeStyles}: BaseOnboardin isSmallScreenWidth, isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS), conciergeReportID, - archivedReportsIdSet, + archivedReportsIDSet, policyID, adminsChatReportID, // Onboarding tasks would show in Concierge instead of admins room for testing accounts, we should open where onboarding tasks are located @@ -268,7 +268,7 @@ function BaseOnboardingInterestedFeatures({shouldUseNativeStyles}: BaseOnboardin }, [ isBetaEnabled, isSmallScreenWidth, - archivedReportsIdSet, + archivedReportsIDSet, onboardingAdminsChatReportID, onboardingCompanySize, onboardingMessages, diff --git a/src/pages/OnboardingPersonalDetails/BaseOnboardingPersonalDetails.tsx b/src/pages/OnboardingPersonalDetails/BaseOnboardingPersonalDetails.tsx index 798520050a45..f3ef4dcfdc95 100644 --- a/src/pages/OnboardingPersonalDetails/BaseOnboardingPersonalDetails.tsx +++ b/src/pages/OnboardingPersonalDetails/BaseOnboardingPersonalDetails.tsx @@ -9,7 +9,7 @@ import ScreenWrapper from '@components/ScreenWrapper'; import Text from '@components/Text'; import TextInput from '@components/TextInput'; import withCurrentUserPersonalDetails from '@components/withCurrentUserPersonalDetails'; -import useArchivedReportsIdSet from '@hooks/useArchivedReportsIdSet'; +import useArchivedReportsIDSet from '@hooks/useArchivedReportsIDSet'; import useAutoCreateSubmitWorkspace from '@hooks/useAutoCreateSubmitWorkspace'; import useAutoCreateTrackWorkspace from '@hooks/useAutoCreateTrackWorkspace'; import useAutoFocusInput from '@hooks/useAutoFocusInput'; @@ -46,7 +46,7 @@ function BaseOnboardingPersonalDetails({currentUserPersonalDetails, shouldUseNat const [onboardingAdminsChatReportID] = useOnyx(ONYXKEYS.ONBOARDING_ADMINS_CHAT_REPORT_ID); const [account] = useOnyx(ONYXKEYS.ACCOUNT); const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED); - const archivedReportsIdSet = useArchivedReportsIdSet(); + const archivedReportsIDSet = useArchivedReportsIDSet(); const [loginList] = useOnyx(ONYXKEYS.LOGINS, {selector: expensifyLoginsSelector}); const [onboardingValues] = useOnyx(ONYXKEYS.NVP_ONBOARDING); const [conciergeChatReportID = ''] = useOnyx(ONYXKEYS.CONCIERGE_REPORT_ID); @@ -102,7 +102,7 @@ function BaseOnboardingPersonalDetails({currentUserPersonalDetails, shouldUseNat isSmallScreenWidth, isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS), conciergeChatReportID, - archivedReportsIdSet, + archivedReportsIDSet, onboardingPolicyID, mergedAccountConciergeReportID, false, @@ -114,7 +114,7 @@ function BaseOnboardingPersonalDetails({currentUserPersonalDetails, shouldUseNat onboardingMessages, onboardingPolicyID, isBetaEnabled, - archivedReportsIdSet, + archivedReportsIDSet, isSmallScreenWidth, mergedAccountConciergeReportID, conciergeChatReportID, diff --git a/src/pages/OnboardingWorkspaceInvite/BaseOnboardingWorkspaceInvite.tsx b/src/pages/OnboardingWorkspaceInvite/BaseOnboardingWorkspaceInvite.tsx index b957c769dec7..8e30a81936b6 100644 --- a/src/pages/OnboardingWorkspaceInvite/BaseOnboardingWorkspaceInvite.tsx +++ b/src/pages/OnboardingWorkspaceInvite/BaseOnboardingWorkspaceInvite.tsx @@ -10,7 +10,7 @@ import SelectionListWithSections from '@components/SelectionList/SelectionListWi import type {Section} from '@components/SelectionList/SelectionListWithSections/types'; import Text from '@components/Text'; import useAllPolicyExpenseChatReportActions from '@hooks/useAllPolicyExpenseChatReportActions'; -import useArchivedReportsIdSet from '@hooks/useArchivedReportsIdSet'; +import useArchivedReportsIDSet from '@hooks/useArchivedReportsIDSet'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; import useLocalize from '@hooks/useLocalize'; import useOnboardingMessages from '@hooks/useOnboardingMessages'; @@ -65,7 +65,7 @@ function BaseOnboardingWorkspaceInvite({shouldUseNativeStyles}: BaseOnboardingWo const session = useSession(); const {isBetaEnabled} = usePermissions(); const [conciergeReportID = ''] = useOnyx(ONYXKEYS.CONCIERGE_REPORT_ID); - const archivedReportsIdSet = useArchivedReportsIdSet(); + const archivedReportsIDSet = useArchivedReportsIDSet(); const filteredReportActions = useAllPolicyExpenseChatReportActions(); const ineligibleInvitees = getIneligibleInvitees(policy?.employeeList); @@ -142,7 +142,7 @@ function BaseOnboardingWorkspaceInvite({shouldUseNativeStyles}: BaseOnboardingWo isSmallScreenWidth, isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS), conciergeReportID, - archivedReportsIdSet, + archivedReportsIDSet, onboardingPolicyID, onboardingAdminsChatReportID, // Onboarding tasks would show in Concierge instead of admins room for testing accounts, we should open where onboarding tasks are located diff --git a/src/pages/OnboardingWorkspaceOptional/BaseOnboardingWorkspaceOptional.tsx b/src/pages/OnboardingWorkspaceOptional/BaseOnboardingWorkspaceOptional.tsx index 7ff551f620bc..d363dec03fa0 100644 --- a/src/pages/OnboardingWorkspaceOptional/BaseOnboardingWorkspaceOptional.tsx +++ b/src/pages/OnboardingWorkspaceOptional/BaseOnboardingWorkspaceOptional.tsx @@ -9,7 +9,7 @@ import ScreenWrapper from '@components/ScreenWrapper'; import ScrollView from '@components/ScrollView'; import Text from '@components/Text'; import useActivePolicy from '@hooks/useActivePolicy'; -import useArchivedReportsIdSet from '@hooks/useArchivedReportsIdSet'; +import useArchivedReportsIDSet from '@hooks/useArchivedReportsIDSet'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; import useHasActiveAdminPolicies from '@hooks/useHasActiveAdminPolicies'; import useHasTeam2025Pricing from '@hooks/useHasTeam2025Pricing'; @@ -55,7 +55,7 @@ function BaseOnboardingWorkspaceOptional({shouldUseNativeStyles}: BaseOnboarding const [onboardingPolicyID] = useOnyx(ONYXKEYS.ONBOARDING_POLICY_ID); const [onboardingAdminsChatReportID] = useOnyx(ONYXKEYS.ONBOARDING_ADMINS_CHAT_REPORT_ID); const [conciergeChatReportID = ''] = useOnyx(ONYXKEYS.CONCIERGE_REPORT_ID); - const archivedReportsIdSet = useArchivedReportsIdSet(); + const archivedReportsIDSet = useArchivedReportsIDSet(); const {onboardingMessages} = useOnboardingMessages(); const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED); const [session] = useOnyx(ONYXKEYS.SESSION); @@ -128,7 +128,7 @@ function BaseOnboardingWorkspaceOptional({shouldUseNativeStyles}: BaseOnboarding isSmallScreenWidth, isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS), conciergeChatReportID, - archivedReportsIdSet, + archivedReportsIDSet, resolvedPolicyID, mergedAccountConciergeReportID, false, @@ -141,7 +141,7 @@ function BaseOnboardingWorkspaceOptional({shouldUseNativeStyles}: BaseOnboarding onboardingAdminsChatReportID, onboardingMessages, onboardingPolicyID, - archivedReportsIdSet, + archivedReportsIDSet, isSmallScreenWidth, isBetaEnabled, mergedAccountConciergeReportID, diff --git a/src/pages/OnboardingWorkspaces/BaseOnboardingWorkspaces.tsx b/src/pages/OnboardingWorkspaces/BaseOnboardingWorkspaces.tsx index 4bf2022df227..ad5037dee989 100644 --- a/src/pages/OnboardingWorkspaces/BaseOnboardingWorkspaces.tsx +++ b/src/pages/OnboardingWorkspaces/BaseOnboardingWorkspaces.tsx @@ -8,7 +8,7 @@ import ScreenWrapper from '@components/ScreenWrapper'; import SelectionList from '@components/SelectionList'; import BareUserListItem from '@components/SelectionList/ListItem/BareUserListItem'; import Text from '@components/Text'; -import useArchivedReportsIdSet from '@hooks/useArchivedReportsIdSet'; +import useArchivedReportsIDSet from '@hooks/useArchivedReportsIDSet'; import useAutoCreateSubmitWorkspace from '@hooks/useAutoCreateSubmitWorkspace'; import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; @@ -59,7 +59,7 @@ function BaseOnboardingWorkspaces({route, shouldUseNativeStyles}: BaseOnboarding const [session] = useOnyx(ONYXKEYS.SESSION); const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED); const [isSelfTourViewed] = useOnyx(ONYXKEYS.NVP_ONBOARDING, {selector: hasSeenTourSelector}); - const archivedReportsIdSet = useArchivedReportsIdSet(); + const archivedReportsIDSet = useArchivedReportsIDSet(); const isValidated = isCurrentUserValidated(loginList, session?.email); @@ -107,7 +107,7 @@ function BaseOnboardingWorkspaces({route, shouldUseNativeStyles}: BaseOnboarding isSmallScreenWidth, isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS), conciergeReportID, - archivedReportsIdSet, + archivedReportsIDSet, policy.automaticJoiningEnabled ? policy.policyID : undefined, undefined, false, diff --git a/src/pages/inbox/ReportRouteParamHandler.tsx b/src/pages/inbox/ReportRouteParamHandler.tsx index d934c75eedef..cd6531d3834e 100644 --- a/src/pages/inbox/ReportRouteParamHandler.tsx +++ b/src/pages/inbox/ReportRouteParamHandler.tsx @@ -1,5 +1,5 @@ import {useFocusEffect, useNavigation, useRoute} from '@react-navigation/native'; -import useArchivedReportsIdSet from '@hooks/useArchivedReportsIdSet'; +import useArchivedReportsIDSet from '@hooks/useArchivedReportsIDSet'; import usePermissions from '@hooks/usePermissions'; import Log from '@libs/Log'; import Navigation from '@libs/Navigation/Navigation'; @@ -22,7 +22,7 @@ function ReportRouteParamHandler() { const route = useRoute(); const navigation = useNavigation(); const {isBetaEnabled} = usePermissions(); - const archivedReportsIdSet = useArchivedReportsIdSet(); + const archivedReportsIDSet = useArchivedReportsIDSet(); useFocusEffect(() => { // Don't update if there is a reportID in the params already @@ -39,7 +39,7 @@ function ReportRouteParamHandler() { !isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS), 'openOnAdminRoom' in route.params && !!route.params.openOnAdminRoom, undefined, - archivedReportsIdSet, + archivedReportsIDSet, )?.reportID; // It's possible that reports aren't fully loaded yet diff --git a/src/pages/tasks/TaskShareDestinationSelectorModal.tsx b/src/pages/tasks/TaskShareDestinationSelectorModal.tsx index f2087ca731b8..32b0c7064d80 100644 --- a/src/pages/tasks/TaskShareDestinationSelectorModal.tsx +++ b/src/pages/tasks/TaskShareDestinationSelectorModal.tsx @@ -4,7 +4,7 @@ import HeaderWithBackButton from '@components/HeaderWithBackButton'; import ScreenWrapper from '@components/ScreenWrapper'; import SelectionList from '@components/SelectionList'; import UserListItem from '@components/SelectionList/ListItem/UserListItem'; -import useArchivedReportsIdSet from '@hooks/useArchivedReportsIdSet'; +import useArchivedReportsIDSet from '@hooks/useArchivedReportsIDSet'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import useOnyx from '@hooks/useOnyx'; @@ -64,15 +64,15 @@ function TaskShareDestinationSelectorModal() { onSingleSelect: selectReportHandler, }); - const archivedReportsIdSet = useArchivedReportsIdSet(); + const archivedReportsIDSet = useArchivedReportsIDSet(); const filteredOptions = useMemo(() => { - const filteredReports = reportFilter(availableOptions.recentReports as Array>, archivedReportsIdSet); + const filteredReports = reportFilter(availableOptions.recentReports as Array>, archivedReportsIDSet); return { ...availableOptions, recentReports: filteredReports ?? [], }; - }, [availableOptions, archivedReportsIdSet]); + }, [availableOptions, archivedReportsIDSet]); const data = useMemo( () => diff --git a/src/pages/workspace/rooms/WorkspaceRoomsPage.tsx b/src/pages/workspace/rooms/WorkspaceRoomsPage.tsx index b4b1b912f814..066d72aa65c6 100644 --- a/src/pages/workspace/rooms/WorkspaceRoomsPage.tsx +++ b/src/pages/workspace/rooms/WorkspaceRoomsPage.tsx @@ -8,7 +8,7 @@ import {usePersonalDetails} from '@components/OnyxListItemProvider'; import ScreenWrapper from '@components/ScreenWrapper'; import WorkspaceRoomsTable from '@components/Tables/WorkspaceRoomsTable'; import type {WorkspaceRoomRowData} from '@components/Tables/WorkspaceRoomsTable'; -import useArchivedReportsIdSet from '@hooks/useArchivedReportsIdSet'; +import useArchivedReportsIDSet from '@hooks/useArchivedReportsIDSet'; import {useMemoizedLazyExpensifyIcons, useMemoizedLazyIllustrations} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; @@ -45,15 +45,15 @@ function WorkspaceRoomsPage({route}: WorkspaceRoomsPageProps) { useWorkspaceDocumentTitle(policy?.name, 'workspace.common.rooms'); const reportAttributes = useReportAttributes(); - const archivedReportsIdSet = useArchivedReportsIdSet(); + const archivedReportsIDSet = useArchivedReportsIDSet(); const personalDetails = usePersonalDetails(); const [policyReports] = useOnyx( ONYXKEYS.COLLECTION.REPORT, { - selector: policyChatRoomsSelector(policyID, archivedReportsIdSet), + selector: policyChatRoomsSelector(policyID, archivedReportsIDSet), }, - [policyID, archivedReportsIdSet], + [policyID, archivedReportsIDSet], ); // The newly created room reportID is stored in Onyx right before navigating back here so its row can play the highlight animation. diff --git a/tests/unit/ReportSecondaryActionUtilsTest.ts b/tests/unit/ReportSecondaryActionUtilsTest.ts index e0f98b822e97..98c9ab1946c9 100644 --- a/tests/unit/ReportSecondaryActionUtilsTest.ts +++ b/tests/unit/ReportSecondaryActionUtilsTest.ts @@ -3410,7 +3410,6 @@ describe('getSecondaryTransactionThreadActions', () => { originalTransaction: {} as Transaction, policy, transactionThreadReport, - isProduction: false, }); expect(result).toContain(CONST.REPORT.SECONDARY_ACTIONS.REMOVE_HOLD); @@ -3426,7 +3425,6 @@ describe('getSecondaryTransactionThreadActions', () => { originalTransaction: {} as Transaction, policy, transactionThreadReport, - isProduction: false, }); expect(result2).not.toContain(CONST.REPORT.SECONDARY_ACTIONS.REMOVE_HOLD); @@ -3885,7 +3883,6 @@ describe('getSecondaryTransactionThreadActions', () => { originalTransaction: {} as Transaction, policy, grandParentReport: selfDMReport, - isProduction: false, }); expect(result.includes(CONST.REPORT.SECONDARY_ACTIONS.SPLIT)).toBe(true); @@ -3944,7 +3941,6 @@ describe('getSecondaryTransactionThreadActions', () => { originalTransaction: {} as Transaction, policy, isChatReportArchived: false, - isProduction: false, }); expect(result).toContain(CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.MOVE_EXPENSE); @@ -3974,7 +3970,6 @@ describe('getSecondaryTransactionThreadActions', () => { originalTransaction: {} as Transaction, policy, isChatReportArchived: false, - isProduction: false, }); expect(result).not.toContain(CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.MOVE_EXPENSE); diff --git a/tests/unit/ReportUtilsTest.ts b/tests/unit/ReportUtilsTest.ts index 9e36e95891b3..3c204ffd0306 100644 --- a/tests/unit/ReportUtilsTest.ts +++ b/tests/unit/ReportUtilsTest.ts @@ -7781,7 +7781,8 @@ describe('ReportUtils', () => { }); it('should not return an archived report even if it was most recently accessed', () => { - const result = findLastAccessedReport(false); + const archivedReportsIDSet = new Set([`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${archivedReport.reportID}`]); + const result = findLastAccessedReport(false, false, undefined, archivedReportsIDSet); // Even though the archived report has a more recent lastVisitTime, // the function should filter it out and return the normal report @@ -8717,8 +8718,8 @@ describe('ReportUtils', () => { statusNum: CONST.REPORT.STATUS_NUM.SUBMITTED, }; - await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report.reportID}`, {private_isArchived: DateUtils.getDBTime()}); - expect(isReportOutstanding(report, policy.id)).toBe(false); + const archivedReportsIDSet = new Set([`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report.reportID}`]); + expect(isReportOutstanding(report, policy.id, archivedReportsIDSet)).toBe(false); }); }); diff --git a/tests/unit/hooks/useArchivedReportsIdSet.test.ts b/tests/unit/hooks/useArchivedReportsIDSet.test.ts similarity index 87% rename from tests/unit/hooks/useArchivedReportsIdSet.test.ts rename to tests/unit/hooks/useArchivedReportsIDSet.test.ts index 50ae22e69319..d096207645f9 100644 --- a/tests/unit/hooks/useArchivedReportsIdSet.test.ts +++ b/tests/unit/hooks/useArchivedReportsIDSet.test.ts @@ -1,9 +1,9 @@ import {renderHook, waitFor} from '@testing-library/react-native'; import Onyx from 'react-native-onyx'; -import useArchivedReportsIdSet from '@hooks/useArchivedReportsIdSet'; +import useArchivedReportsIDSet from '@hooks/useArchivedReportsIDSet'; import ONYXKEYS from '@src/ONYXKEYS'; -describe('useArchivedReportsIdSet', () => { +describe('useArchivedReportsIDSet', () => { beforeAll(() => { Onyx.init({keys: ONYXKEYS}); }); @@ -13,7 +13,7 @@ describe('useArchivedReportsIdSet', () => { }); it('should return an empty Set when no report name value pairs exist', async () => { - const {result} = renderHook(() => useArchivedReportsIdSet()); + const {result} = renderHook(() => useArchivedReportsIDSet()); await waitFor(() => { expect(result.current).toBeInstanceOf(Set); @@ -25,7 +25,7 @@ describe('useArchivedReportsIdSet', () => { await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}123`, {private_isArchived: 'archived'}); await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}456`, {private_isArchived: ''}); - const {result} = renderHook(() => useArchivedReportsIdSet()); + const {result} = renderHook(() => useArchivedReportsIDSet()); await waitFor(() => { expect(result.current.size).toBe(1); @@ -39,7 +39,7 @@ describe('useArchivedReportsIdSet', () => { await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}200`, {private_isArchived: 'archived'}); await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}300`, {private_isArchived: ''}); - const {result} = renderHook(() => useArchivedReportsIdSet()); + const {result} = renderHook(() => useArchivedReportsIDSet()); await waitFor(() => { expect(result.current.size).toBe(2); @@ -52,7 +52,7 @@ describe('useArchivedReportsIdSet', () => { it('should update when a report becomes archived', async () => { await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}123`, {private_isArchived: ''}); - const {result} = renderHook(() => useArchivedReportsIdSet()); + const {result} = renderHook(() => useArchivedReportsIDSet()); await waitFor(() => { expect(result.current.has(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}123`)).toBe(false); @@ -69,7 +69,7 @@ describe('useArchivedReportsIdSet', () => { await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}123`, {private_isArchived: 'archived'}); await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}456`, null); - const {result} = renderHook(() => useArchivedReportsIdSet()); + const {result} = renderHook(() => useArchivedReportsIDSet()); await waitFor(() => { expect(result.current.size).toBe(1); diff --git a/tests/unit/hooks/useSearchSections.test.ts b/tests/unit/hooks/useSearchSections.test.ts index 0b669b05e9ee..7772153ad834 100644 --- a/tests/unit/hooks/useSearchSections.test.ts +++ b/tests/unit/hooks/useSearchSections.test.ts @@ -35,7 +35,7 @@ jest.mock('@hooks/useActionLoadingReportIDs', () => ({ default: () => new Set(), })); -jest.mock('@hooks/useArchivedReportsIdSet', () => ({ +jest.mock('@hooks/useArchivedReportsIDSet', () => ({ __esModule: true, default: () => new Set(), })); diff --git a/tests/unit/navigateAfterOnboardingTest.ts b/tests/unit/navigateAfterOnboardingTest.ts index 004c7a8644a3..044ce2b49f22 100644 --- a/tests/unit/navigateAfterOnboardingTest.ts +++ b/tests/unit/navigateAfterOnboardingTest.ts @@ -121,14 +121,14 @@ describe('navigateAfterOnboarding', () => { expect(navigate).toHaveBeenCalledWith(ROUTES.REPORT_WITH_ID.getRoute(REPORT_ID)); }); - it('should pass archivedReportsIdSet when looking up last accessed report', () => { - const archivedReportsIdSet = new Set(['report_1']); + it('should pass archivedReportsIDSet when looking up last accessed report', () => { + const archivedReportsIDSet = new Set(['report_1']); mockFindLastAccessedReport.mockReturnValue(undefined); mockShouldOpenOnAdminRoom.mockReturnValue(false); - navigateAfterOnboarding(true, true, '', archivedReportsIdSet, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID); + navigateAfterOnboarding(true, true, '', archivedReportsIDSet, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID); - expect(mockFindLastAccessedReport).toHaveBeenCalledWith(false, false, undefined, archivedReportsIdSet); + expect(mockFindLastAccessedReport).toHaveBeenCalledWith(false, false, undefined, archivedReportsIDSet); }); it('should navigate to Concierge room if user uses a test email', () => {