Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
88a080a
fix:(search) update optimistic transactions pending action in search …
marufsharifi Sep 24, 2025
320fb50
Merge branch 'main' into fix/expense-not-greyed-out-offline-delete
marufsharifi Sep 25, 2025
970bc19
fix(search): update snapshot optimistic data when delete from search/…
marufsharifi Sep 25, 2025
d77b81b
fix(search): handle update optimistic data for search snapshot
marufsharifi Sep 25, 2025
f165a42
Merge branch 'main' into fix/expense-not-greyed-out-offline-delete
marufsharifi Sep 30, 2025
6e4c8d2
fix(search): update deleted transaction in all search snapshots
marufsharifi Sep 30, 2025
3b0bb1c
Merge branch 'main' into fix/expense-not-greyed-out-offline-delete
marufsharifi Oct 2, 2025
7b4d0e4
Merge branch 'main' into fix/expense-not-greyed-out-offline-delete
marufsharifi Oct 3, 2025
503d3fa
fix(search): allow users to delete expenses and reports in offline mode
marufsharifi Oct 3, 2025
f0cdcbe
Merge branch 'main' into fix/expense-not-greyed-out-offline-delete
marufsharifi Oct 7, 2025
9b1164e
Merge branch 'main' into fix/expense-not-greyed-out-offline-delete
marufsharifi Oct 8, 2025
da5ba47
fix(search): covered update optimistic data in bulk delete
marufsharifi Oct 8, 2025
b5e6237
Merge branch 'main' into fix/expense-not-greyed-out-offline-delete
marufsharifi Oct 15, 2025
e7b0c61
delete transaction and report if needed
marufsharifi Oct 16, 2025
ea38ab0
Merge branch 'main' into fix/expense-not-greyed-out-offline-delete
marufsharifi Oct 16, 2025
4f30fa4
Merge branch 'main' into fix/expense-not-greyed-out-offline-delete
marufsharifi Oct 25, 2025
d56664e
Merge branch 'main' into fix/expense-not-greyed-out-offline-delete
marufsharifi Nov 5, 2025
0c3443b
Merge branch 'main' into fix/expense-not-greyed-out-offline-delete
marufsharifi Nov 10, 2025
29899cb
Merge branch 'main' into fix/expense-not-greyed-out-offline-delete
marufsharifi Nov 12, 2025
7f3d109
refactor: provided transactions and snapshotKeys through arguments in…
marufsharifi Nov 12, 2025
a1938ce
added isSingleTransactionView back as non intentional removed
marufsharifi Nov 12, 2025
4bbdaac
Merge branch 'main' into fix/expense-not-greyed-out-offline-delete
marufsharifi Nov 17, 2025
b23d221
fixed type issues.
marufsharifi Nov 17, 2025
abebc6e
fixed eslint errors
marufsharifi Nov 17, 2025
3ca6370
Merge branch 'main' into fix/expense-not-greyed-out-offline-delete
marufsharifi Nov 17, 2025
fd98396
fix some more eslint errors
marufsharifi Nov 17, 2025
ed748e8
fixed remained eslint issues
marufsharifi Nov 18, 2025
4e45479
Merge branch 'main' into fix/expense-not-greyed-out-offline-delete
marufsharifi Nov 18, 2025
66eec9b
Merge branch 'main' into fix/expense-not-greyed-out-offline-delete
marufsharifi Nov 19, 2025
3f1d27b
Merge branch 'main' into fix/expense-not-greyed-out-offline-delete
marufsharifi Nov 19, 2025
05f6d01
unified getSnapshotKeys to and helper function
marufsharifi Nov 19, 2025
8799725
Merge branch 'main' into fix/expense-not-greyed-out-offline-delete
marufsharifi Nov 20, 2025
0c8a397
removed unused useMemo
marufsharifi Nov 20, 2025
277e833
replaced SearchTransaction with Transaction it was deprecated
marufsharifi Nov 20, 2025
9822a94
replaced SearchTransaction for ReportUtils with Transaction
marufsharifi Nov 20, 2025
600ec50
fixed report utils type error
marufsharifi Nov 20, 2025
fa1f66b
Merge branch 'main' into fix/expense-not-greyed-out-offline-delete
marufsharifi Nov 20, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 30 additions & 15 deletions src/components/MoneyRequestHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'
import useDeleteTransactions from '@hooks/useDeleteTransactions';
import useDuplicateTransactionsAndViolations from '@hooks/useDuplicateTransactionsAndViolations';
import useGetIOUReportFromReportAction from '@hooks/useGetIOUReportFromReportAction';
import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
import useLoadingBarVisibility from '@hooks/useLoadingBarVisibility';
import useLocalize from '@hooks/useLocalize';
import useOnyx from '@hooks/useOnyx';
Expand Down Expand Up @@ -59,7 +60,6 @@ import HeaderWithBackButton from './HeaderWithBackButton';
import HoldOrRejectEducationalModal from './HoldOrRejectEducationalModal';
import HoldSubmitterEducationalModal from './HoldSubmitterEducationalModal';
import Icon from './Icon';
import * as Expensicons from './Icon/Expensicons';
import LoadingBar from './LoadingBar';
import type {MoneyRequestHeaderStatusBarProps} from './MoneyRequestHeaderStatusBar';
import MoneyRequestHeaderStatusBar from './MoneyRequestHeaderStatusBar';
Expand Down Expand Up @@ -108,6 +108,7 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre
> | null>(null);
const [dismissedRejectUseExplanation] = useOnyx(ONYXKEYS.NVP_DISMISSED_REJECT_USE_EXPLANATION, {canBeMissing: true});
const [dismissedHoldUseExplanation] = useOnyx(ONYXKEYS.NVP_DISMISSED_HOLD_USE_EXPLANATION, {canBeMissing: true});
const [allSnapshots] = useOnyx(ONYXKEYS.COLLECTION.SNAPSHOT, {canBeMissing: true});
const shouldShowLoadingBar = useLoadingBarVisibility();
const styles = useThemeStyles();
const theme = useTheme();
Expand Down Expand Up @@ -154,24 +155,37 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre
/>
);

const expensifyIcons = useMemoizedLazyExpensifyIcons([
'Stopwatch',
'Hourglass',
'Flag',
'CreditCardHourglass',
'ReceiptScan',
'ArrowSplit',
'ArrowCollapse',
'Info',
'Trashcan',
'ThumbsDown',
]);

const getStatusBarProps: () => MoneyRequestHeaderStatusBarProps | undefined = () => {
if (isOnHold) {
return {icon: getStatusIcon(Expensicons.Stopwatch), description: translate('iou.expenseOnHold')};
return {icon: getStatusIcon(expensifyIcons.Stopwatch), description: translate('iou.expenseOnHold')};
}
if (isMarkAsResolvedAction(parentReport, transactionViolations, policy)) {
return {icon: getStatusIcon(Expensicons.Hourglass), description: translate('iou.reject.rejectedStatus')};
return {icon: getStatusIcon(expensifyIcons.Hourglass), description: translate('iou.reject.rejectedStatus')};
}

if (isDuplicate) {
return {icon: getStatusIcon(Expensicons.Flag), description: translate('iou.expenseDuplicate')};
return {icon: getStatusIcon(expensifyIcons.Flag), description: translate('iou.expenseDuplicate')};
}

if (isExpensifyCardTransaction(transaction) && isPending(transaction)) {
return {icon: getStatusIcon(Expensicons.CreditCardHourglass), description: translate('iou.transactionPendingDescription')};
return {icon: getStatusIcon(expensifyIcons.CreditCardHourglass), description: translate('iou.transactionPendingDescription')};
}
if (shouldShowBrokenConnectionViolation) {
return {
icon: getStatusIcon(Expensicons.Hourglass),
icon: getStatusIcon(expensifyIcons.Hourglass),
description: (
<BrokenConnectionDescription
transactionID={transaction?.transactionID}
Expand All @@ -182,10 +196,10 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre
};
}
if (hasPendingRTERViolation) {
return {icon: getStatusIcon(Expensicons.Hourglass), description: translate('iou.pendingMatchWithCreditCardDescription')};
return {icon: getStatusIcon(expensifyIcons.Hourglass), description: translate('iou.pendingMatchWithCreditCardDescription')};
}
if (isScanning(transaction)) {
return {icon: getStatusIcon(Expensicons.ReceiptScan), description: translate('iou.receiptScanInProgressDescription')};
return {icon: getStatusIcon(expensifyIcons.ReceiptScan), description: translate('iou.receiptScanInProgressDescription')};
}
};

Expand Down Expand Up @@ -294,7 +308,7 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre
const secondaryActionsImplementation: Record<ValueOf<typeof CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS>, DropdownOption<ValueOf<typeof CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS>>> = {
[CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.HOLD]: {
text: translate('iou.hold'),
icon: Expensicons.Stopwatch,
icon: expensifyIcons.Stopwatch,
value: CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.HOLD,
onSelected: () => {
if (!parentReportAction) {
Expand All @@ -319,7 +333,7 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre
},
[CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.REMOVE_HOLD]: {
text: translate('iou.unhold'),
icon: Expensicons.Stopwatch,
icon: expensifyIcons.Stopwatch,
value: CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.REMOVE_HOLD,
onSelected: () => {
if (!parentReportAction) {
Expand All @@ -331,15 +345,15 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre
},
[CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.SPLIT]: {
text: isExpenseSplit ? translate('iou.editSplits') : translate('iou.split'),
icon: Expensicons.ArrowSplit,
icon: expensifyIcons.ArrowSplit,
value: CONST.REPORT.SECONDARY_ACTIONS.SPLIT,
onSelected: () => {
initSplitExpense(allTransactions, allReports, transaction);
},
},
[CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.MERGE]: {
text: translate('common.merge'),
icon: Expensicons.ArrowCollapse,
icon: expensifyIcons.ArrowCollapse,
value: CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.MERGE,
onSelected: () => {
if (!transaction) {
Expand All @@ -353,22 +367,22 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre
[CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.VIEW_DETAILS]: {
value: CONST.REPORT.SECONDARY_ACTIONS.VIEW_DETAILS,
text: translate('iou.viewDetails'),
icon: Expensicons.Info,
icon: expensifyIcons.Info,
onSelected: () => {
navigateToDetailsPage(report, Navigation.getActiveRoute());
},
},
[CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.DELETE]: {
text: translate('common.delete'),
icon: Expensicons.Trashcan,
icon: expensifyIcons.Trashcan,
value: CONST.REPORT.SECONDARY_ACTIONS.DELETE,
onSelected: () => {
setIsDeleteModalVisible(true);
},
},
[CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.REJECT]: {
text: translate('common.reject'),
icon: Expensicons.ThumbsDown,
icon: expensifyIcons.ThumbsDown,
value: CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.REJECT,
onSelected: () => {
if (dismissedRejectUseExplanation) {
Expand Down Expand Up @@ -484,6 +498,7 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre
isSingleTransactionView: true,
isChatReportArchived: isParentReportArchived,
isChatIOUReportArchived,
allSnapshots,
});
} else {
deleteTransactions([transaction.transactionID], duplicateTransactions, duplicateTransactionViolations, currentSearchHash, true);
Expand Down
30 changes: 22 additions & 8 deletions src/hooks/useDeleteTransactions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ type UseDeleteTransactionsParams = {
function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransactionsParams) {
const [allTransactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION, {canBeMissing: false});
const [allReports] = useOnyx(ONYXKEYS.COLLECTION.REPORT, {canBeMissing: true});
const [allSnapshots] = useOnyx(ONYXKEYS.COLLECTION.SNAPSHOT, {canBeMissing: true});
const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${getNonEmptyStringOnyxID(report?.policyID)}`, {canBeMissing: true});
const [allPolicyRecentlyUsedCategories] = useOnyx(ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_CATEGORIES, {canBeMissing: true});
const [allReportNameValuePairs] = useOnyx(ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS, {canBeMissing: true});
Expand Down Expand Up @@ -136,18 +137,19 @@ function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransac
const chatReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${iouReport?.chatReportID}`];
const chatIOUReportID = chatReport?.reportID;
const isChatIOUReportArchived = archivedReportsIdSet.has(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${chatIOUReportID}`);
deleteMoneyRequest(
deleteMoneyRequest({
transactionID,
action,
duplicateTransactions,
duplicateTransactionViolations,
reportAction: action,
transactions: duplicateTransactions,
violations: duplicateTransactionViolations,
iouReport,
chatReport,
isChatIOUReportArchived,
allSnapshots,
isSingleTransactionView,
deletedTransactionIDs,
transactionIDs,
);
transactionIDsPendingDeletion: deletedTransactionIDs,
selectedTransactionIDs: transactionIDs,
});
deletedTransactionIDs.push(transactionID);
if (action.childReportID) {
deletedTransactionThreadReportIDs.add(action.childReportID);
Expand All @@ -156,7 +158,19 @@ function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransac

return Array.from(deletedTransactionThreadReportIDs);
},
[reportActions, allTransactions, allReports, report, allReportNameValuePairs, allPolicyRecentlyUsedCategories, policyCategories, policy, archivedReportsIdSet, isBetaEnabled],
[
reportActions,
allTransactions,
allReports,
report,
allReportNameValuePairs,
allPolicyRecentlyUsedCategories,
policyCategories,
policy,
archivedReportsIdSet,
isBetaEnabled,
allSnapshots,
],
);

return {
Expand Down
33 changes: 16 additions & 17 deletions src/libs/ReportUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,6 @@
import type {Message, OldDotReportAction, ReportActions} from '@src/types/onyx/ReportAction';
import type {PendingChatMember} from '@src/types/onyx/ReportMetadata';
import type {OnyxData} from '@src/types/onyx/Request';
import type {SearchTransaction} from '@src/types/onyx/SearchResults';
import type {Comment, TransactionChanges, WaypointCollection} from '@src/types/onyx/Transaction';
import type {FileObject} from '@src/types/utils/Attachment';
import {isEmptyObject} from '@src/types/utils/EmptyObject';
Expand Down Expand Up @@ -925,7 +924,7 @@
parentReportActionParam?: OnyxInputOrEntry<ReportAction>;
personalDetails?: Partial<PersonalDetailsList>;
invoiceReceiverPolicy?: OnyxEntry<Policy>;
transactions?: SearchTransaction[];
transactions?: Transaction[];
reports?: Report[];
policies?: Policy[];
isReportArchived?: boolean;
Expand Down Expand Up @@ -957,7 +956,7 @@
const parsedReportActionMessageCache: Record<string, string> = {};

let conciergeReportID: OnyxEntry<string>;
Onyx.connect({

Check warning on line 959 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.CONCIERGE_REPORT_ID,
callback: (value) => {
conciergeReportID = value;
Expand All @@ -965,7 +964,7 @@
});

const defaultAvatarBuildingIconTestID = 'SvgDefaultAvatarBuilding Icon';
Onyx.connect({

Check warning on line 967 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.SESSION,
callback: (value) => {
// When signed out, val is undefined
Expand All @@ -983,7 +982,7 @@
let allPersonalDetails: OnyxEntry<PersonalDetailsList>;
let allPersonalDetailLogins: string[];
let currentUserPersonalDetails: OnyxEntry<PersonalDetails>;
Onyx.connect({

Check warning on line 985 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.PERSONAL_DETAILS_LIST,
callback: (value) => {
if (currentUserAccountID) {
Expand All @@ -995,14 +994,14 @@
});

let allReportsDraft: OnyxCollection<Report>;
Onyx.connect({

Check warning on line 997 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.REPORT_DRAFT,
waitForCollectionCallback: true,
callback: (value) => (allReportsDraft = value),
});

let allPolicies: OnyxCollection<Policy>;
Onyx.connect({

Check warning on line 1004 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.POLICY,
waitForCollectionCallback: true,
callback: (value) => (allPolicies = value),
Expand All @@ -1017,7 +1016,7 @@

let allReports: OnyxCollection<Report>;
let reportsByPolicyID: ReportByPolicyMap;
Onyx.connect({

Check warning on line 1019 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.REPORT,
waitForCollectionCallback: true,
callback: (value) => {
Expand Down Expand Up @@ -1055,14 +1054,14 @@
});

let allBetas: OnyxEntry<Beta[]>;
Onyx.connect({

Check warning on line 1057 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.BETAS,
callback: (value) => (allBetas = value),
});

let allTransactions: OnyxCollection<Transaction> = {};
let reportsTransactions: Record<string, Transaction[]> = {};
Onyx.connect({

Check warning on line 1064 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.TRANSACTION,
waitForCollectionCallback: true,
callback: (value) => {
Expand All @@ -1088,7 +1087,7 @@
});

let allReportActions: OnyxCollection<ReportActions>;
Onyx.connect({

Check warning on line 1090 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.REPORT_ACTIONS,
waitForCollectionCallback: true,
callback: (actions) => {
Expand All @@ -1101,7 +1100,7 @@

let allReportMetadata: OnyxCollection<ReportMetadata>;
const allReportMetadataKeyValue: Record<string, ReportMetadata> = {};
Onyx.connect({

Check warning on line 1103 in src/libs/ReportUtils.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.REPORT_METADATA,
waitForCollectionCallback: true,
callback: (value) => {
Expand Down Expand Up @@ -2247,7 +2246,7 @@
/**
* Whether the provided report has expenses
*/
function hasExpenses(reportID?: string, transactions?: SearchTransaction[] | Array<OnyxEntry<Transaction>>): boolean {
function hasExpenses(reportID?: string, transactions?: Transaction[] | Array<OnyxEntry<Transaction>>): boolean {
if (transactions) {
return !!transactions?.find((transaction) => transaction?.reportID === reportID);
}
Expand All @@ -2257,7 +2256,7 @@
/**
* Whether the provided report is a closed expense report with no expenses
*/
function isClosedExpenseReportWithNoExpenses(report: OnyxEntry<Report>, transactions?: SearchTransaction[] | Array<OnyxEntry<Transaction>>): boolean {
function isClosedExpenseReportWithNoExpenses(report: OnyxEntry<Report>, transactions?: Transaction[] | Array<OnyxEntry<Transaction>>): boolean {
if (!report?.statusNum || report.statusNum !== CONST.REPORT.STATUS_NUM.CLOSED || !isExpenseReport(report)) {
return false;
}
Expand Down Expand Up @@ -4483,7 +4482,7 @@
isChatReportArchived = false,
report?: OnyxInputOrEntry<Report>,
policy?: OnyxEntry<Policy>,
linkedTransaction?: OnyxEntry<Transaction> | SearchTransaction,
linkedTransaction?: OnyxEntry<Transaction> | Transaction,
): boolean {
const isDeleted = isDeletedAction(reportAction);

Expand Down Expand Up @@ -4625,7 +4624,7 @@
isDeleteAction?: boolean,
isChatReportArchived = false,
outstandingReportsByPolicyID?: OutstandingReportsByPolicyIDDerivedValue,
linkedTransaction?: OnyxEntry<Transaction> | SearchTransaction,
linkedTransaction?: OnyxEntry<Transaction> | Transaction,
report?: OnyxInputOrEntry<Report>,
policy?: OnyxEntry<Policy>,
): boolean {
Expand Down Expand Up @@ -4907,7 +4906,7 @@
*
* NOTE: This method is only meant to be used inside this action file. Do not export and use it elsewhere. Use useOnyx instead.
*/
function getLinkedTransaction(reportAction: OnyxEntry<ReportAction | OptimisticIOUReportAction>, transactions?: SearchTransaction[]): OnyxEntry<Transaction> | SearchTransaction {
function getLinkedTransaction(reportAction: OnyxEntry<ReportAction | OptimisticIOUReportAction>, transactions?: Transaction[]): OnyxEntry<Transaction> | Transaction {
let transactionID: string | undefined;

if (isMoneyRequestAction(reportAction)) {
Expand Down Expand Up @@ -4962,7 +4961,7 @@
reports,
}: {
reportAction: OnyxEntry<ReportAction | OptimisticIOUReportAction>;
transactions?: SearchTransaction[];
transactions?: Transaction[];
reports?: Report[];
}): string {
if (isReversedTransaction(reportAction)) {
Expand Down Expand Up @@ -5595,7 +5594,7 @@
personalDetails?: Partial<PersonalDetailsList>,
invoiceReceiverPolicy?: OnyxEntry<Policy>,
reportAttributes?: ReportAttributesDerivedValue['reports'],
transactions?: SearchTransaction[],
transactions?: Transaction[],
isReportArchived?: boolean,
reports?: Report[],
policies?: Policy[],
Expand Down Expand Up @@ -8904,7 +8903,7 @@
reportID: string | undefined,
transactionViolations: OnyxCollection<TransactionViolation[]>,
shouldShowInReview?: boolean,
reportTransactions?: SearchTransaction[],
reportTransactions?: Transaction[],
): boolean {
const transactions = reportTransactions ?? getReportTransactions(reportID);
return transactions.some((transaction) => hasViolation(transaction, transactionViolations, shouldShowInReview));
Expand All @@ -8917,7 +8916,7 @@
reportID: string | undefined,
transactionViolations: OnyxCollection<TransactionViolation[]>,
shouldShowInReview?: boolean,
reportTransactions?: SearchTransaction[],
reportTransactions?: Transaction[],
): boolean {
const transactions = reportTransactions ?? getReportTransactions(reportID);
return transactions.some((transaction) => hasWarningTypeViolation(transaction, transactionViolations, shouldShowInReview));
Expand Down Expand Up @@ -8950,7 +8949,7 @@
reportID: string | undefined,
transactionViolations: OnyxCollection<TransactionViolation[]>,
shouldShowInReview?: boolean,
reportTransactions?: SearchTransaction[],
reportTransactions?: Transaction[],
): boolean {
const transactions = reportTransactions ?? getReportTransactions(reportID);
return transactions.some((transaction) => hasNoticeTypeViolation(transaction, transactionViolations, shouldShowInReview));
Expand All @@ -8959,7 +8958,7 @@
/**
* Checks to see if a report contains any type of violation
*/
function hasAnyViolations(reportID: string | undefined, transactionViolations: OnyxCollection<TransactionViolation[]>, reportTransactions?: SearchTransaction[]) {
function hasAnyViolations(reportID: string | undefined, transactionViolations: OnyxCollection<TransactionViolation[]>, reportTransactions?: Transaction[]) {
return (
hasViolations(reportID, transactionViolations, undefined, reportTransactions) ||
hasNoticeTypeViolations(reportID, transactionViolations, true, reportTransactions) ||
Expand All @@ -8983,12 +8982,12 @@
reportID: string | undefined,
transactionViolations: OnyxCollection<TransactionViolation[]>,
areStrictPolicyRulesEnabled: boolean,
reportTransactions?: Transaction[] | SearchTransaction[],
reportTransactions?: Transaction[],
) {
if (!areStrictPolicyRulesEnabled) {
return false;
}
return hasAnyViolations(reportID, transactionViolations, reportTransactions as SearchTransaction[]);
return hasAnyViolations(reportID, transactionViolations, reportTransactions);
}

type ReportErrorsAndReportActionThatRequiresAttention = {
Expand Down Expand Up @@ -10341,7 +10340,7 @@
/**
* Check if Report has any held expenses
*/
function hasHeldExpenses(iouReportID?: string, allReportTransactions?: SearchTransaction[]): boolean {
function hasHeldExpenses(iouReportID?: string, allReportTransactions?: Transaction[]): boolean {
const iouReportTransactions = getReportTransactions(iouReportID);
const transactions = allReportTransactions ?? iouReportTransactions;
return transactions.some((transaction) => isOnHoldTransactionUtils(transaction));
Expand All @@ -10350,7 +10349,7 @@
/**
* Check if all expenses in the Report are on hold
*/
function hasOnlyHeldExpenses(iouReportID?: string, allReportTransactions?: SearchTransaction[]): boolean {
function hasOnlyHeldExpenses(iouReportID?: string, allReportTransactions?: Transaction[]): boolean {
const transactionsByIouReportID = getReportTransactions(iouReportID);
const reportTransactions = allReportTransactions ?? transactionsByIouReportID;
return reportTransactions.length > 0 && !reportTransactions.some((transaction) => !isOnHoldTransactionUtils(transaction));
Expand Down
11 changes: 11 additions & 0 deletions src/libs/SearchUIUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2510,6 +2510,16 @@ function getColumnsToShow(
return columns;
}

type OnyxSnapshotKey = `${typeof ONYXKEYS.COLLECTION.SNAPSHOT}${string}`;

function getSnapshotKeys(allSnapshots: OnyxCollection<OnyxTypes.SearchResults>) {
if (!allSnapshots) {
return [];
}

return Object.keys(allSnapshots || {}) as OnyxSnapshotKey[];
}

export {
getSuggestedSearches,
getListItem,
Expand Down Expand Up @@ -2551,5 +2561,6 @@ export {
getActionOptions,
getColumnsToShow,
getHasOptions,
getSnapshotKeys,
};
export type {SavedSearchMenuItem, SearchTypeMenuSection, SearchTypeMenuItem, SearchDateModifier, SearchDateModifierLower, SearchKey, ArchivedReportsIDSet};
Loading
Loading