Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
135 commits
Select commit Hold shift + click to select a range
4da3f84
Add merge option when selecting transactions in the report page
youssef-lr Oct 22, 2025
ace5e72
wip refactoring
youssef-lr Oct 23, 2025
b235b1c
Create new read only MoneyRequestView
youssef-lr Oct 25, 2025
9f50f40
Allow MoneyRequestView to use only the expense report when readonly
youssef-lr Oct 29, 2025
80a103f
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Oct 29, 2025
aae525a
Bring back file removed by mistake
youssef-lr Oct 29, 2025
cbb888f
Allow MoneyRequestView to only depend on expense report in readonly
youssef-lr Oct 29, 2025
9483b4e
Use transactions from search results
youssef-lr Oct 29, 2025
2e7cf0f
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Oct 30, 2025
ec7ea28
Remove loading state from details review
youssef-lr Oct 30, 2025
0afc4d6
Fetch report from search results if not found in usual report collection
youssef-lr Oct 30, 2025
a097897
TS fixes
youssef-lr Oct 30, 2025
8cd0daa
Add helper function to decide whether to show the merge option
youssef-lr Oct 30, 2025
3f93614
Bug fix
youssef-lr Oct 30, 2025
e1f1a86
Fix condition
youssef-lr Oct 30, 2025
3f32c23
Cleanup code in helper function
youssef-lr Oct 31, 2025
d2411eb
Allow navigating to receipt page first if possible
youssef-lr Oct 31, 2025
d3e4780
Use transactions from search snapshot if coming from the reports page
youssef-lr Oct 31, 2025
6b48848
Bug fixes
youssef-lr Oct 31, 2025
d4a90c5
Cleanup
youssef-lr Oct 31, 2025
704851c
Bring back receipt view code
youssef-lr Oct 31, 2025
e7cdf18
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Nov 1, 2025
95e4ef5
TS fix
youssef-lr Nov 1, 2025
f208f5f
Extract logic of fetching source&target transactions to hook
youssef-lr Nov 1, 2025
48af514
Eslint & TS fixes
youssef-lr Nov 1, 2025
00e5be5
More eslint fixes
youssef-lr Nov 1, 2025
e2b45c5
Silence warning
youssef-lr Nov 1, 2025
89b9dc7
DRY up code
youssef-lr Nov 2, 2025
e54c9cd
Add code to automatically select receipt
youssef-lr Nov 2, 2025
d976b70
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Nov 3, 2025
92203e3
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Nov 4, 2025
310c266
Remove check handled elsewhere
youssef-lr Nov 5, 2025
57bed13
Add areTransactionsEligibleForMerge test
youssef-lr Nov 5, 2025
841b5f0
Add tests for isMergeActionFromReportView
youssef-lr Nov 5, 2025
0651a5d
Lint
youssef-lr Nov 5, 2025
0a8a941
Allow getting data from search results in MergeTransactionsListPage
youssef-lr Nov 5, 2025
9aa9d0a
Lint
youssef-lr Nov 5, 2025
ca24004
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Nov 6, 2025
77e6a38
Cleanup
youssef-lr Nov 6, 2025
c1037bb
Lint
youssef-lr Nov 7, 2025
6094cad
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Nov 7, 2025
6a07d07
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Nov 11, 2025
6d966cb
Lint
youssef-lr Nov 11, 2025
5813ff4
Update src/hooks/useSelectedTransactionsActions.ts
youssef-lr Nov 12, 2025
79d767a
Use ternaries to clean up code
youssef-lr Nov 12, 2025
53dfa49
Tidy up code and take into account unreported transactions
youssef-lr Nov 12, 2025
f925b00
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Nov 13, 2025
58c7212
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Dec 1, 2025
0713bec
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Dec 1, 2025
a472443
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Dec 2, 2025
57862ff
Construct transaction name from the transaction
youssef-lr Dec 2, 2025
b596e99
Update translations
youssef-lr Dec 2, 2025
46ccad7
Lint & TS fixes
youssef-lr Dec 2, 2025
7719ede
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Dec 3, 2025
df13bfe
Fix missing hash
youssef-lr Dec 3, 2025
287cb86
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Dec 3, 2025
b19b516
Remove parent report dependency in MoneyRequestView to support unrepo…
youssef-lr Dec 3, 2025
249ebe4
Fix navigation when reportID is 0
youssef-lr Dec 3, 2025
6c39514
Simplify split logic
youssef-lr Dec 4, 2025
07f2632
Fix test
youssef-lr Dec 4, 2025
ff13529
Fix missing empty receipt view
youssef-lr Dec 4, 2025
9cad8d0
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Dec 4, 2025
fbe5ae3
Lint
youssef-lr Dec 4, 2025
2edebd5
Fix tests
youssef-lr Dec 4, 2025
1ff5a08
Lint
youssef-lr Dec 4, 2025
050cddb
Fix infinite loading sekeleton
youssef-lr Dec 4, 2025
acb15fe
Remove [staging] prefix
youssef-lr Dec 4, 2025
96ea430
Reuse setupMergeTransactionDataAndNavigate
youssef-lr Dec 4, 2025
ce8a062
Lint
youssef-lr Dec 4, 2025
15cd425
Fix 404 receipt view
youssef-lr Dec 4, 2025
42b07cb
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Dec 5, 2025
a8b12ee
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Dec 6, 2025
4758d3f
Lint
youssef-lr Dec 6, 2025
3d14cf4
Update translations
youssef-lr Dec 6, 2025
9fa78b8
Fix TS
youssef-lr Dec 7, 2025
182858f
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Dec 8, 2025
4949a14
Bring back backTo param
youssef-lr Dec 9, 2025
135e2d8
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Dec 9, 2025
3687516
Revert changes made by mistake
youssef-lr Dec 9, 2025
3803903
Skip to confirmation if transactions are identical. Simplify code.
youssef-lr Dec 10, 2025
d581ee2
Reuse function
youssef-lr Dec 10, 2025
6c11115
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Dec 10, 2025
60ee987
Lint
youssef-lr Dec 10, 2025
7d3109c
Fix react compiler issues
youssef-lr Dec 10, 2025
067c6b8
TS fix
youssef-lr Dec 10, 2025
f0d9eec
Fix test
youssef-lr Dec 10, 2025
11b45e7
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Dec 11, 2025
0e46ff3
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Dec 11, 2025
6a57af9
Remove unrelated changes
youssef-lr Dec 11, 2025
388c3d0
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Dec 12, 2025
d72d177
Fix receipt not showing in confirmation page
youssef-lr Dec 12, 2025
e8269c2
Reuse getTransactionReportName
youssef-lr Dec 12, 2025
20fb958
Fix react compiler issue
youssef-lr Dec 12, 2025
38ec379
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Dec 12, 2025
9f15ee1
Bug fix
youssef-lr Dec 13, 2025
93739de
Cleanup
youssef-lr Dec 13, 2025
3c334df
Fix spelling
youssef-lr Dec 13, 2025
232e9fb
Add selfDM reportID as fallback for receipt route
youssef-lr Dec 15, 2025
ac4cd21
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Dec 15, 2025
cab94c2
Display 'None' for unreported merged transaction in confirmation page
youssef-lr Dec 15, 2025
b3beb13
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Dec 15, 2025
182785c
Lint
youssef-lr Dec 16, 2025
fc00e58
Remove hash dependency and use search context
youssef-lr Dec 16, 2025
090f4f3
Preventt overriding search transactions
youssef-lr Dec 16, 2025
acafc9a
Fix receipt image not showing
youssef-lr Dec 16, 2025
a480706
Load reports from search to display report name in details review
youssef-lr Dec 16, 2025
ecc36c0
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Dec 16, 2025
cd6b3f3
Fix lint & tests
youssef-lr Dec 16, 2025
8163bfa
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Dec 16, 2025
04e92a3
Fix react compiler
youssef-lr Dec 16, 2025
618a931
Fix reselecting 'None' for report name not being reflected
youssef-lr Dec 16, 2025
ce0ed9f
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Dec 16, 2025
b71ac02
Add onyx transaction fallback
youssef-lr Dec 17, 2025
073cc5c
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Dec 17, 2025
a892129
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Dec 17, 2025
217408a
Disable merge when reports are selected
youssef-lr Dec 17, 2025
e5da057
Bug fix
youssef-lr Dec 17, 2025
0e614b6
Fix Merge showing without any transactions selected
youssef-lr Dec 18, 2025
657da21
Use isMergeActionForSelectedTransactions whenever we select transactions
youssef-lr Dec 18, 2025
2c10846
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Dec 18, 2025
7342351
Lint & tests fix
youssef-lr Dec 18, 2025
b2be1ce
Cleanup
youssef-lr Dec 18, 2025
09c1c93
Tidy up code of hook and fix missing target report
youssef-lr Dec 18, 2025
7c0c732
Cleanup
youssef-lr Dec 18, 2025
f61e08a
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Dec 18, 2025
a15b975
Lint
youssef-lr Dec 18, 2025
67ce7db
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Dec 19, 2025
4818cd0
Fix empty line report name
youssef-lr Dec 19, 2025
f23840e
Lint
youssef-lr Dec 19, 2025
a1ab6e7
Fix eslint warnings
youssef-lr Dec 19, 2025
78f9727
Merge branch 'main' into youssef_merge_from_report_page
youssef-lr Dec 19, 2025
caf42cd
Cleanup code and use parentReportID instead
youssef-lr Dec 19, 2025
1bf0c9b
Fix react compiler warning
youssef-lr Dec 19, 2025
7cce420
Use selector for reportActions
youssef-lr Dec 19, 2025
0f8bef3
Remove manual memoization
youssef-lr Dec 19, 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
2 changes: 1 addition & 1 deletion src/CONFIG.ts
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ export default {
SUFFIX: ENVIRONMENT === CONST.ENVIRONMENT.DEV ? get(Config, 'PUSHER_DEV_SUFFIX', '') : '',
CLUSTER: 'mt1',
},
SITE_TITLE: 'New Expensify',
SITE_TITLE: ENVIRONMENT === CONST.ENVIRONMENT.DEV ? 'New Expensify [dev]' : 'New Expensify',
FAVICON: {
DEFAULT: '/favicon.png',
UNREAD: '/favicon-unread.png',
Expand Down
1 change: 1 addition & 0 deletions src/CONST/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6690,6 +6690,7 @@ const CONST = {
PAY: 'pay',
SUBMIT: 'submit',
HOLD: 'hold',
MERGE: 'merge',
UNHOLD: 'unhold',
DELETE: 'delete',
REJECT: 'reject',
Expand Down
24 changes: 16 additions & 8 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2781,26 +2781,34 @@ const ROUTES = {
MERGE_TRANSACTION_LIST_PAGE: {
route: 'r/:transactionID/merge',

// eslint-disable-next-line no-restricted-syntax -- Legacy route generation
getRoute: (transactionID: string | undefined, backTo?: string) => getUrlWithBackToParam(`r/${transactionID}/merge` as const, backTo),
getRoute: (transactionID: string, backTo: string) => {
// eslint-disable-next-line no-restricted-syntax -- Legacy route generation
return getUrlWithBackToParam(`r/${transactionID}/merge` as const, backTo);
},
},
MERGE_TRANSACTION_RECEIPT_PAGE: {
route: 'r/:transactionID/merge/receipt',

// eslint-disable-next-line no-restricted-syntax -- Legacy route generation
getRoute: (transactionID: string, backTo?: string) => getUrlWithBackToParam(`r/${transactionID}/merge/receipt` as const, backTo),
getRoute: (transactionID: string, backTo: string) => {
// eslint-disable-next-line no-restricted-syntax -- Legacy route generation
return getUrlWithBackToParam(`r/${transactionID}/merge/receipt` as const, backTo);
},
},
MERGE_TRANSACTION_DETAILS_PAGE: {
route: 'r/:transactionID/merge/details',

// eslint-disable-next-line no-restricted-syntax -- Legacy route generation
getRoute: (transactionID: string, backTo?: string) => getUrlWithBackToParam(`r/${transactionID}/merge/details` as const, backTo),
getRoute: (transactionID: string, backTo: string) => {
// eslint-disable-next-line no-restricted-syntax -- Legacy route generation
return getUrlWithBackToParam(`r/${transactionID}/merge/details` as const, backTo);
},
},
MERGE_TRANSACTION_CONFIRMATION_PAGE: {
route: 'r/:transactionID/merge/confirmation',

// eslint-disable-next-line no-restricted-syntax -- Legacy route generation
getRoute: (transactionID: string, backTo?: string) => getUrlWithBackToParam(`r/${transactionID}/merge/confirmation` as const, backTo),
getRoute: (transactionID: string, backTo: string) => {
// eslint-disable-next-line no-restricted-syntax -- Legacy route generation
return getUrlWithBackToParam(`r/${transactionID}/merge/confirmation` as const, backTo);
},
},
POLICY_ACCOUNTING_XERO_IMPORT: {
route: 'workspaces/:policyID/accounting/xero/import',
Expand Down
7 changes: 3 additions & 4 deletions src/components/MoneyReportHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ import useThrottledButtonState from '@hooks/useThrottledButtonState';
import useTransactionsAndViolationsForReport from '@hooks/useTransactionsAndViolationsForReport';
import useTransactionViolations from '@hooks/useTransactionViolations';
import {openOldDotLink} from '@libs/actions/Link';
import {setupMergeTransactionData} from '@libs/actions/MergeTransaction';
import {setupMergeTransactionDataAndNavigate} from '@libs/actions/MergeTransaction';
import {turnOffMobileSelectionMode} from '@libs/actions/MobileSelectionMode';
import {createTransactionThreadReport, deleteAppReport, downloadReportPDF, exportReportToCSV, exportReportToPDF, exportToIntegration, markAsManuallyExported} from '@libs/actions/Report';
import {getExportTemplates, queueExportSearchWithTemplate, search} from '@libs/actions/Search';
Expand Down Expand Up @@ -244,7 +244,7 @@ function MoneyReportHeader({
'ReceiptPlus',
] as const);
const [lastDistanceExpenseType] = useOnyx(ONYXKEYS.NVP_LAST_DISTANCE_EXPENSE_TYPE, {canBeMissing: true});
const {translate} = useLocalize();
const {translate, localeCompare} = useLocalize();

const exportTemplates = useMemo(
() => getExportTemplates(integrationsExportTemplates ?? [], csvExportLayouts ?? {}, translate, policy),
Expand Down Expand Up @@ -1219,8 +1219,7 @@ function MoneyReportHeader({
return;
}

setupMergeTransactionData(currentTransaction.transactionID, {targetTransactionID: currentTransaction.transactionID});
Navigation.navigate(ROUTES.MERGE_TRANSACTION_LIST_PAGE.getRoute(currentTransaction.transactionID, Navigation.getActiveRoute()));
setupMergeTransactionDataAndNavigate([currentTransaction], localeCompare);
},
},
[CONST.REPORT.SECONDARY_ACTIONS.DUPLICATE]: {
Expand Down
7 changes: 3 additions & 4 deletions src/components/MoneyRequestHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import useThemeStyles from '@hooks/useThemeStyles';
import useThrottledButtonState from '@hooks/useThrottledButtonState';
import useTransactionViolations from '@hooks/useTransactionViolations';
import {deleteTrackExpense, initSplitExpense, markRejectViolationAsResolved} from '@libs/actions/IOU';
import {setupMergeTransactionData} from '@libs/actions/MergeTransaction';
import {setupMergeTransactionDataAndNavigate} from '@libs/actions/MergeTransaction';
import {setNameValuePair} from '@libs/actions/User';
import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
import Navigation from '@libs/Navigation/Navigation';
Expand Down Expand Up @@ -130,7 +130,7 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre
const shouldShowLoadingBar = useLoadingBarVisibility();
const styles = useThemeStyles();
const theme = useTheme();
const {translate} = useLocalize();
const {translate, localeCompare} = useLocalize();
const icons = useMemoizedLazyExpensifyIcons(['CreditCardHourglass', 'ReceiptScan']);
const {login: currentUserLogin, email, accountID} = useCurrentUserPersonalDetails();
const defaultExpensePolicy = useDefaultExpensePolicy();
Expand Down Expand Up @@ -398,8 +398,7 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre
return;
}

setupMergeTransactionData(transaction.transactionID, {targetTransactionID: transaction.transactionID});
Navigation.navigate(ROUTES.MERGE_TRANSACTION_LIST_PAGE.getRoute(transaction.transactionID, Navigation.getActiveRoute()));
setupMergeTransactionDataAndNavigate([transaction], localeCompare);
},
},
[CONST.REPORT.SECONDARY_ACTIONS.DUPLICATE]: {
Expand Down
24 changes: 6 additions & 18 deletions src/components/ReportActionItem/MoneyRequestReceiptView.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import mapValues from 'lodash/mapValues';
import React, {useCallback, useMemo, useState} from 'react';
import React, {useMemo, useState} from 'react';
import {View} from 'react-native';
import type {StyleProp, ViewStyle} from 'react-native';
import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
Expand Down Expand Up @@ -27,7 +27,7 @@ import {
getCreationReportErrors,
isInvoiceReport,
isPaidGroupPolicy,
isTrackExpenseReport,
isTrackExpenseReportNew,
} from '@libs/ReportUtils';
import {
didReceiptScanSucceed as didReceiptScanSucceedTransactionUtils,
Expand Down Expand Up @@ -112,7 +112,7 @@ function MoneyRequestReceiptView({
const [isLoading, setIsLoading] = useState(true);
const parentReportAction = report?.parentReportActionID ? parentReportActions?.[report.parentReportActionID] : undefined;
const {iouReport, chatReport: chatIOUReport, isChatIOUReportArchived} = useGetIOUReportFromReportAction(parentReportAction);
const isTrackExpense = isTrackExpenseReport(report);
const isTrackExpense = !mergeTransactionID && isTrackExpenseReportNew(report, parentReport, parentReportAction);
const moneyRequestReport = parentReport;
const linkedTransactionID = useMemo(() => {
if (!parentReportAction) {
Expand Down Expand Up @@ -163,7 +163,7 @@ function MoneyRequestReceiptView({

const transactionToCheck = updatedTransaction ?? transaction;
const doesTransactionHaveReceipt = !!transactionToCheck?.receipt && !isEmptyObject(transactionToCheck?.receipt);
const shouldShowReceiptEmptyState = !isInvoice && !hasReceipt && !!transaction && !doesTransactionHaveReceipt;
const shouldShowReceiptEmptyState = !isInvoice && !hasReceipt && !!transactionToCheck && !doesTransactionHaveReceipt;

const [receiptImageViolations, receiptViolations] = useMemo(() => {
const imageViolations = [];
Expand Down Expand Up @@ -213,7 +213,7 @@ function MoneyRequestReceiptView({
[transaction?.errors, parentReportAction?.errors],
);

const dismissReceiptError = useCallback(() => {
const dismissReceiptError = () => {
if (!report?.reportID) {
return;
}
Expand Down Expand Up @@ -248,19 +248,7 @@ function MoneyRequestReceiptView({
}
navigateToConciergeChatAndDeleteReport(report.reportID, true, true);
}
}, [
transaction,
chatReport,
parentReportAction,
linkedTransactionID,
report?.reportID,
iouReport,
chatIOUReport,
isChatIOUReportArchived,
errorsWithoutReportCreation,
reportCreationError,
isInNarrowPaneModal,
]);
};

let receiptStyle: StyleProp<ViewStyle>;

Expand Down
Loading
Loading