Skip to content
Open
Show file tree
Hide file tree
Changes from 7 commits
Commits
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
4 changes: 4 additions & 0 deletions src/ONYXKEYS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -644,6 +644,9 @@ const ONYXKEYS = {
/** Keeps track of whether the "Confirm Navigate to Expensify Classic" modal is opened */
IS_OPEN_CONFIRM_NAVIGATE_EXPENSIFY_CLASSIC_MODAL_OPEN: 'IsOpenConfirmNavigateExpensifyClassicModalOpen',

/** The transaction IDs to be highlighted when opening the Expenses search route page */
TRANSACTION_IDS_HIGHLIGHT_ON_SEARCH_ROUTE: 'transactionIdsHighlightOnSearchRoute',

/** Collection Keys */
COLLECTION: {
DOMAIN: 'domain_',
Expand Down Expand Up @@ -1378,6 +1381,7 @@ type OnyxValuesMapping = {
[ONYXKEYS.HAS_DENIED_CONTACT_IMPORT_PROMPT]: boolean | undefined;
[ONYXKEYS.IS_OPEN_CONFIRM_NAVIGATE_EXPENSIFY_CLASSIC_MODAL_OPEN]: boolean;
[ONYXKEYS.PERSONAL_POLICY_ID]: string;
[ONYXKEYS.TRANSACTION_IDS_HIGHLIGHT_ON_SEARCH_ROUTE]: Record<string, Record<string, boolean>>;
};

type OnyxDerivedValuesMapping = {
Expand Down
48 changes: 45 additions & 3 deletions src/hooks/useSearchHighlightAndScroll.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,13 @@ import type {SearchListItem, SelectionListHandle, TransactionGroupListItemType,
import {search} from '@libs/actions/Search';
import {isReportActionEntry} from '@libs/SearchUIUtils';
import type {SearchKey} from '@libs/SearchUIUtils';
import {mergeTransactionIdsHighlightOnSearchRoute} from '@libs/TransactionUtils';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import type {ReportActions, SearchResults, Transaction} from '@src/types/onyx';
import {isEmptyObject} from '@src/types/utils/EmptyObject';
import useNetwork from './useNetwork';
import useOnyx from './useOnyx';
import usePrevious from './usePrevious';

type UseSearchHighlightAndScroll = {
Expand Down Expand Up @@ -52,6 +55,12 @@ function useSearchHighlightAndScroll({
const hasPendingSearchRef = useRef(false);
const isChat = queryJSON.type === CONST.SEARCH.DATA_TYPES.CHAT;

const transactionIDsToHighlightSelector = useCallback((allTransactionIDs: OnyxEntry<Record<string, Record<string, boolean>>>) => allTransactionIDs?.[queryJSON.type], [queryJSON.type]);
const [transactionIDsToHighlight] = useOnyx(ONYXKEYS.TRANSACTION_IDS_HIGHLIGHT_ON_SEARCH_ROUTE, {
canBeMissing: true,
selector: transactionIDsToHighlightSelector,
});

const existingSearchResultIDs = useMemo(() => {
if (!searchResults?.data) {
return [];
Expand Down Expand Up @@ -201,11 +210,20 @@ function useSearchHighlightAndScroll({
} else {
const previousTransactionIDs = extractTransactionIDsFromSearchResults(previousSearchResults);
const currentTransactionIDs = extractTransactionIDsFromSearchResults(searchResults.data);
const manualHighlightTransactionIDs = new Set(Object.keys(transactionIDsToHighlight ?? {}).filter((id) => !!transactionIDsToHighlight?.[id]));

// Find new transaction IDs that are not in the previousTransactionIDs and not already highlighted
const newTransactionIDs = currentTransactionIDs.filter((id) => !previousTransactionIDs.includes(id) && !highlightedIDs.current.has(id));
const newTransactionIDs = currentTransactionIDs.filter((id) => {
if (manualHighlightTransactionIDs.has(id)) {
return true;
}
if (!triggeredByHookRef.current || !hasNewItemsRef.current) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you explain why we check this condition here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This condition means I only moved the check from the outer if into the filter condition of currentTransactionIDs to ensure that manualHighlightTransactionIDs are merged without breaking the original logic.

As for why there are two conditions, you can also notice that the useSearchHighlightAndScroll hook only highlights items that it itself fetched from the server.

return false;
}
return !previousTransactionIDs.includes(id) && !highlightedIDs.current.has(id);
});

if (!triggeredByHookRef.current || newTransactionIDs.length === 0 || !hasNewItemsRef.current) {
if (newTransactionIDs.length === 0) {
return;
}

Expand All @@ -217,7 +235,31 @@ function useSearchHighlightAndScroll({
}
setNewSearchResultKeys(newKeys);
}
}, [searchResults?.data, previousSearchResults, isChat]);
}, [searchResults?.data, previousSearchResults, isChat, transactionIDsToHighlight]);

// Reset transactionIDsToHighlight after they have been highlighted
useEffect(() => {
if (isEmptyObject(transactionIDsToHighlight) || newSearchResultKeys === null) {
return;
}

const highlightedTransactionIDs = Object.keys(transactionIDsToHighlight).filter(
(id) => transactionIDsToHighlight[id] && newSearchResultKeys?.has(`${ONYXKEYS.COLLECTION.TRANSACTION}${id}`),
);

const timer = setTimeout(() => {
mergeTransactionIdsHighlightOnSearchRoute(queryJSON.type, Object.fromEntries(highlightedTransactionIDs.map((id) => [id, false])));
}, CONST.ANIMATED_HIGHLIGHT_START_DURATION);
return () => clearTimeout(timer);
}, [transactionIDsToHighlight, queryJSON.type, newSearchResultKeys]);

// Remove transactionIDsToHighlight when the user leaves the current search type
useEffect(
() => () => {
mergeTransactionIdsHighlightOnSearchRoute(queryJSON.type, null);
},
[queryJSON.type],
);

// Reset newSearchResultKey after it's been used
useEffect(() => {
Expand Down
7 changes: 7 additions & 0 deletions src/libs/TransactionUtils/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@
import type {Errors, PendingAction} from '@src/types/onyx/OnyxCommon';
import type {CurrentUserPersonalDetails} from '@src/types/onyx/PersonalDetails';
import type {OnyxData} from '@src/types/onyx/Request';
import type {SearchDataTypes} from '@src/types/onyx/SearchResults';
import type {
Comment,
Receipt,
Expand Down Expand Up @@ -126,7 +127,7 @@
};

let deprecatedAllReports: OnyxCollection<Report> = {};
Onyx.connect({

Check warning on line 130 in src/libs/TransactionUtils/index.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 All @@ -135,7 +136,7 @@
});

let deprecatedAllTransactionViolations: OnyxCollection<TransactionViolations> = {};
Onyx.connect({

Check warning on line 139 in src/libs/TransactionUtils/index.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_VIOLATIONS,
waitForCollectionCallback: true,
callback: (value) => (deprecatedAllTransactionViolations = value),
Expand Down Expand Up @@ -2502,6 +2503,11 @@
return !isMultiScanEnabled || (transactions.length === 1 && (!initialTransaction.receipt?.source || initialTransaction.receipt?.isTestReceipt === true));
}

function mergeTransactionIdsHighlightOnSearchRoute(type: SearchDataTypes, data: Record<string, boolean> | null) {
// eslint-disable-next-line rulesdir/prefer-actions-set-data
return Onyx.merge(ONYXKEYS.TRANSACTION_IDS_HIGHLIGHT_ON_SEARCH_ROUTE, {[type]: data});
}

export {
buildOptimisticTransaction,
calculateTaxAmount,
Expand Down Expand Up @@ -2631,6 +2637,7 @@
getOriginalCurrencyForDisplay,
shouldShowExpenseBreakdown,
isTimeRequest,
mergeTransactionIdsHighlightOnSearchRoute,
};

export type {TransactionChanges};
17 changes: 9 additions & 8 deletions src/libs/actions/IOU/SendInvoice.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ import DateUtils from '@libs/DateUtils';
import {getMicroSecondOnyxErrorWithTranslationKey} from '@libs/ErrorUtils';
import {formatPhoneNumber} from '@libs/LocalePhoneNumber';
import Log from '@libs/Log';
import isSearchTopmostFullScreenRoute from '@libs/Navigation/helpers/isSearchTopmostFullScreenRoute';
import Navigation from '@libs/Navigation/Navigation';
import {getReportActionHtml, getReportActionText} from '@libs/ReportActionsUtils';
import type {OptimisticChatReport, OptimisticCreatedReportAction, OptimisticIOUReportAction} from '@libs/ReportUtils';
import {
Expand All @@ -34,7 +32,7 @@ import type {InvoiceReceiver, InvoiceReceiverType} from '@src/types/onyx/Report'
import type {OnyxData} from '@src/types/onyx/Request';
import type {Receipt} from '@src/types/onyx/Transaction';
import {isEmptyObject} from '@src/types/utils/EmptyObject';
import {getAllPersonalDetails, getReceiptError, getSearchOnyxUpdate, mergePolicyRecentlyUsedCategories, mergePolicyRecentlyUsedCurrencies} from '.';
import {getAllPersonalDetails, getReceiptError, getSearchOnyxUpdate, handleNavigateAfterExpenseCreate, mergePolicyRecentlyUsedCategories, mergePolicyRecentlyUsedCurrencies} from '.';
import type {BasePolicyParams} from '.';

type SendInvoiceInformation = {
Expand Down Expand Up @@ -66,6 +64,7 @@ type SendInvoiceOptions = {
companyWebsite?: string;
policyRecentlyUsedCategories?: OnyxEntry<OnyxTypes.RecentlyUsedCategories>;
policyRecentlyUsedTags?: OnyxEntry<OnyxTypes.RecentlyUsedTags>;
isFromGlobalCreate?: boolean;
};

type BuildOnyxDataForInvoiceParams = {
Expand Down Expand Up @@ -679,6 +678,7 @@ function sendInvoice({
companyWebsite,
policyRecentlyUsedCategories,
policyRecentlyUsedTags,
isFromGlobalCreate,
}: SendInvoiceOptions) {
const parsedComment = getParsedComment(transaction?.comment?.comment?.trim() ?? '');
if (transaction?.comment) {
Expand Down Expand Up @@ -743,11 +743,12 @@ function sendInvoice({
// eslint-disable-next-line @typescript-eslint/no-deprecated
InteractionManager.runAfterInteractions(() => removeDraftTransaction(CONST.IOU.OPTIMISTIC_TRANSACTION_ID));

if (isSearchTopmostFullScreenRoute()) {
Navigation.dismissModal();
} else {
Navigation.dismissModalWithReport({reportID: invoiceRoom.reportID});
}
handleNavigateAfterExpenseCreate({
activeReportID: invoiceRoom.reportID,
transactionID,
isFromGlobalCreate,
isInvoice: true,
});

notifyNewAction(invoiceRoom.reportID, currentUserAccountID);
}
Expand Down
89 changes: 77 additions & 12 deletions src/libs/actions/IOU/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
import Log from '@libs/Log';
import {validateAmount} from '@libs/MoneyRequestUtils';
import isReportOpenInRHP from '@libs/Navigation/helpers/isReportOpenInRHP';
import isReportTopmostSplitNavigator from '@libs/Navigation/helpers/isReportTopmostSplitNavigator';
import isSearchTopmostFullScreenRoute from '@libs/Navigation/helpers/isSearchTopmostFullScreenRoute';
import Navigation, {navigationRef} from '@libs/Navigation/Navigation';
import {isOffline} from '@libs/Network/NetworkStore';
Expand Down Expand Up @@ -198,7 +199,7 @@
shouldEnableNegative,
updateReportPreview,
} from '@libs/ReportUtils';
import {getCurrentSearchQueryJSON} from '@libs/SearchQueryUtils';
import {buildCannedSearchQuery, getCurrentSearchQueryJSON} from '@libs/SearchQueryUtils';
import {getSuggestedSearches} from '@libs/SearchUIUtils';
import playSound, {SOUNDS} from '@libs/Sound';
import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils';
Expand Down Expand Up @@ -230,6 +231,7 @@
isPerDiemRequest as isPerDiemRequestTransactionUtils,
isScanning,
isScanRequest as isScanRequestTransactionUtils,
mergeTransactionIdsHighlightOnSearchRoute,
removeTransactionFromDuplicateTransactionViolation,
} from '@libs/TransactionUtils';
import ViolationsUtils from '@libs/Violations/ViolationsUtils';
Expand Down Expand Up @@ -281,6 +283,7 @@
billable?: boolean;
reimbursable?: boolean;
customUnitRateID?: string;
isFromGlobalCreate?: boolean;
};

type InitMoneyRequestParams = {
Expand Down Expand Up @@ -669,6 +672,7 @@
isLinkedTrackedExpenseReportArchived?: boolean;
odometerStart?: number;
odometerEnd?: number;
isFromGlobalCreate?: boolean;
};

type TrackExpenseAccountantParams = {
Expand Down Expand Up @@ -737,7 +741,7 @@
};

let allPersonalDetails: OnyxTypes.PersonalDetailsList = {};
Onyx.connect({

Check warning on line 744 in src/libs/actions/IOU/index.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) => {
allPersonalDetails = value ?? {};
Expand Down Expand Up @@ -839,7 +843,7 @@
};

let allTransactions: NonNullable<OnyxCollection<OnyxTypes.Transaction>> = {};
Onyx.connect({

Check warning on line 846 in src/libs/actions/IOU/index.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 @@ -853,7 +857,7 @@
});

let allTransactionDrafts: NonNullable<OnyxCollection<OnyxTypes.Transaction>> = {};
Onyx.connect({

Check warning on line 860 in src/libs/actions/IOU/index.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_DRAFT,
waitForCollectionCallback: true,
callback: (value) => {
Expand All @@ -862,7 +866,7 @@
});

let allTransactionViolations: NonNullable<OnyxCollection<OnyxTypes.TransactionViolations>> = {};
Onyx.connect({

Check warning on line 869 in src/libs/actions/IOU/index.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_VIOLATIONS,
waitForCollectionCallback: true,
callback: (value) => {
Expand All @@ -876,7 +880,7 @@
});

let allNextSteps: NonNullable<OnyxCollection<OnyxTypes.ReportNextStepDeprecated>> = {};
Onyx.connect({

Check warning on line 883 in src/libs/actions/IOU/index.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.NEXT_STEP,
waitForCollectionCallback: true,
callback: (value) => {
Expand All @@ -885,7 +889,7 @@
});

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

Check warning on line 892 in src/libs/actions/IOU/index.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 All @@ -894,7 +898,7 @@
});

let allReportNameValuePairs: OnyxCollection<OnyxTypes.ReportNameValuePairs>;
Onyx.connect({

Check warning on line 901 in src/libs/actions/IOU/index.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_NAME_VALUE_PAIRS,
waitForCollectionCallback: true,
callback: (value) => {
Expand All @@ -904,7 +908,7 @@

let userAccountID = -1;
let currentUserEmail = '';
Onyx.connect({

Check warning on line 911 in src/libs/actions/IOU/index.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) => {
currentUserEmail = value?.email ?? '';
Expand Down Expand Up @@ -969,9 +973,9 @@
* If the action is done from the report RHP, then we just want to dismiss the money request flow screens.
* It is a helper function used only in this file.
*/
function dismissModalAndOpenReportInInboxTab(reportID?: string) {
function dismissModalAndOpenReportInInboxTab(reportID?: string, isInvoice?: boolean) {
const rootState = navigationRef.getRootState();
if (isReportOpenInRHP(rootState)) {
if (!isInvoice && isReportOpenInRHP(rootState)) {
const rhpKey = rootState.routes.at(-1)?.state?.key;
if (rhpKey) {
const hasMultipleTransactions = Object.values(allTransactions).filter((transaction) => transaction?.reportID === reportID).length > 0;
Expand All @@ -994,6 +998,52 @@
Navigation.dismissModalWithReport({reportID});
}

/**
* Helper to navigate after an expense is created in order to standardize the post‑creation experience
* when creating an expense from the global create button.
* If the expense is created from the global create button then:
* - If it is created on the inbox tab, it will open the chat report containing that expense.
* - If it is created elsewhere, it will navigate to Reports > Expense and highlight the newly created expense.
*/
function handleNavigateAfterExpenseCreate({
activeReportID,
transactionID,
isFromGlobalCreate,
isInvoice,
shouldHandleNavigation = true,
}: {
activeReportID?: string;
transactionID?: string;
isFromGlobalCreate?: boolean;
isInvoice?: boolean;
shouldHandleNavigation?: boolean;
}) {
const isUserOnInbox = isReportTopmostSplitNavigator();

// If the expense is not created from global create or is currently on the inbox tab,
// we just need to dismiss the money request flow screens
// and open the report chat containing the IOU report
if (!isFromGlobalCreate || isUserOnInbox || !transactionID) {
if (shouldHandleNavigation) {
dismissModalAndOpenReportInInboxTab(activeReportID, isInvoice);
}
return;
}

const type = isInvoice ? CONST.SEARCH.DATA_TYPES.INVOICE : CONST.SEARCH.DATA_TYPES.EXPENSE;
// We mark this transaction to be highlighted when opening the expense search route page
mergeTransactionIdsHighlightOnSearchRoute(type, {[transactionID]: true});

if (!shouldHandleNavigation) {
return;
}
const queryString = buildCannedSearchQuery({type});
Navigation.dismissModal();
Navigation.setNavigationActionToMicrotaskQueue(() => {
Navigation.navigate(ROUTES.SEARCH_ROOT.getRoute({query: queryString}));
});
}

/**
* Find the report preview action from given chat report and iou report
*/
Expand Down Expand Up @@ -5859,6 +5909,7 @@
count,
rate,
unit,
isFromGlobalCreate,
} = transactionParams;

const testDriveCommentReportActionID = isTestDrive ? NumberUtils.rand64() : undefined;
Expand Down Expand Up @@ -6053,16 +6104,22 @@
if (shouldHandleNavigation) {
// eslint-disable-next-line @typescript-eslint/no-deprecated
InteractionManager.runAfterInteractions(() => removeDraftTransactions());
if (!requestMoneyInformation.isRetry) {
dismissModalAndOpenReportInInboxTab(backToReport ?? activeReportID);
}

const trackReport = Navigation.getReportRouteByID(linkedTrackedExpenseReportAction?.childReportID);
if (trackReport?.key) {
Navigation.removeScreenByKey(trackReport.key);
}
}

if (!requestMoneyInformation.isRetry) {
handleNavigateAfterExpenseCreate({
activeReportID: backToReport ?? activeReportID,
transactionID: transaction.transactionID,
isFromGlobalCreate,
shouldHandleNavigation,
});
}

if (activeReportID && !isMoneyRequestReport) {
Navigation.setNavigationActionToMicrotaskQueue(() =>
setTimeout(() => {
Expand Down Expand Up @@ -6091,7 +6148,7 @@
policyRecentlyUsedCurrencies,
} = submitPerDiemExpenseInformation;
const {payeeAccountID} = participantParams;
const {currency, comment = '', category, tag, created, customUnit, attendees} = transactionParams;
const {currency, comment = '', category, tag, created, customUnit, attendees, isFromGlobalCreate} = transactionParams;

if (
isEmptyObject(policyParams.policy) ||
Expand Down Expand Up @@ -6176,7 +6233,7 @@

// eslint-disable-next-line @typescript-eslint/no-deprecated
InteractionManager.runAfterInteractions(() => removeDraftTransaction(CONST.IOU.OPTIMISTIC_TRANSACTION_ID));
dismissModalAndOpenReportInInboxTab(activeReportID);
handleNavigateAfterExpenseCreate({activeReportID, transactionID: transaction.transactionID, isFromGlobalCreate});

if (activeReportID) {
notifyNewAction(activeReportID, payeeAccountID);
Expand Down Expand Up @@ -6231,6 +6288,7 @@
attendees,
odometerStart,
odometerEnd,
isFromGlobalCreate,
} = transactionData;
const isMoneyRequestReport = isMoneyRequestReportReportUtils(report);
const currentChatReport = isMoneyRequestReport ? getReportOrDraftReport(report?.chatReportID) : report;
Expand Down Expand Up @@ -6505,10 +6563,15 @@
if (shouldHandleNavigation) {
// eslint-disable-next-line @typescript-eslint/no-deprecated
InteractionManager.runAfterInteractions(() => removeDraftTransactions());
}

if (!params.isRetry) {
dismissModalAndOpenReportInInboxTab(activeReportID);
}
if (!params.isRetry) {
handleNavigateAfterExpenseCreate({
activeReportID,
transactionID: transaction?.transactionID,
isFromGlobalCreate,
shouldHandleNavigation,
});
}

notifyNewAction(activeReportID, payeeAccountID);
Expand Down Expand Up @@ -8073,6 +8136,7 @@
receipt,
odometerStart,
odometerEnd,
isFromGlobalCreate,
} = transactionParams;

// If the report is an iou or expense report, we should get the linked chat report to be passed to the getMoneyRequestInformation function
Expand Down Expand Up @@ -8256,7 +8320,7 @@
// eslint-disable-next-line @typescript-eslint/no-deprecated
InteractionManager.runAfterInteractions(() => removeDraftTransaction(CONST.IOU.OPTIMISTIC_TRANSACTION_ID));
const activeReportID = isMoneyRequestReport && report?.reportID ? report.reportID : parameters.chatReportID;
dismissModalAndOpenReportInInboxTab(backToReport ?? activeReportID);
handleNavigateAfterExpenseCreate({activeReportID: backToReport ?? activeReportID, isFromGlobalCreate, transactionID: parameters.transactionID});

if (!isMoneyRequestReport) {
notifyNewAction(activeReportID, userAccountID);
Expand Down Expand Up @@ -14758,6 +14822,7 @@
getAllPersonalDetails,
getReceiptError,
getSearchOnyxUpdate,
handleNavigateAfterExpenseCreate,
};
export type {
GPSPoint as GpsPoint,
Expand Down
Loading
Loading