Skip to content

Commit f41dbd0

Browse files
committed
Merge pull request #91932 from ZhenjaHorbach/add-isProduction-guard-for-selfDM-splits
[CP Staging] Add production guard for selfDM splits (cherry picked from commit f20b3d5) (cherry-picked to staging by lakchote)
1 parent be31b42 commit f41dbd0

22 files changed

Lines changed: 313 additions & 79 deletions

src/components/MoneyReportHeaderActions/MoneyReportHeaderSecondaryActions.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import type {PaymentActionParams} from '@components/SettlementButton/types';
1919
import useActiveAdminPolicies from '@hooks/useActiveAdminPolicies';
2020
import {useCurrencyListActions} from '@hooks/useCurrencyList';
2121
import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
22+
import useEnvironment from '@hooks/useEnvironment';
2223
import useExpenseActions from '@hooks/useExpenseActions';
2324
import useExportActions from '@hooks/useExportActions';
2425
import useHoldRejectActions from '@hooks/useHoldRejectActions';
@@ -316,6 +317,8 @@ function MoneyReportHeaderSecondaryActionsInner({reportID, primaryAction, isRepo
316317
onPDFModalOpen: openPDFDownload,
317318
});
318319

320+
const {isProduction} = useEnvironment();
321+
319322
// Compute list of applicable secondary action keys
320323
const secondaryActions = moneyRequestReport
321324
? getSecondaryReportActions({
@@ -334,6 +337,7 @@ function MoneyReportHeaderSecondaryActionsInner({reportID, primaryAction, isRepo
334337
policies,
335338
outstandingReportsByPolicyID,
336339
isChatReportArchived,
340+
isProduction,
337341
})
338342
: [];
339343

src/components/MoneyReportHeaderActions/MoneyReportHeaderSelectionDropdown.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import useActiveAdminPolicies from '@hooks/useActiveAdminPolicies';
2222
import useConfirmModal from '@hooks/useConfirmModal';
2323
import {useCurrencyListActions} from '@hooks/useCurrencyList';
2424
import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
25+
import useEnvironment from '@hooks/useEnvironment';
2526
import useExportActions from '@hooks/useExportActions';
2627
import useLastWorkspaceNumber from '@hooks/useLastWorkspaceNumber';
2728
import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
@@ -192,6 +193,8 @@ function MoneyReportHeaderSelectionDropdown({reportID, primaryAction, isReportIn
192193
isOnSearch: !!isReportInSearch,
193194
});
194195

196+
const {isProduction} = useEnvironment();
197+
195198
const computedSecondaryActions = moneyRequestReport
196199
? getSecondaryReportActions({
197200
currentUserLogin: currentUserLogin ?? '',
@@ -209,6 +212,7 @@ function MoneyReportHeaderSelectionDropdown({reportID, primaryAction, isReportIn
209212
policies: allPolicies,
210213
outstandingReportsByPolicyID,
211214
isChatReportArchived,
215+
isProduction,
212216
})
213217
: [];
214218

src/components/MoneyRequestHeaderSecondaryActions.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'
1212
import useDefaultExpensePolicy from '@hooks/useDefaultExpensePolicy';
1313
import useDeleteTransactions from '@hooks/useDeleteTransactions';
1414
import useDuplicateTransactionsAndViolations from '@hooks/useDuplicateTransactionsAndViolations';
15+
import useEnvironment from '@hooks/useEnvironment';
1516
import useGetIOUReportFromReportAction from '@hooks/useGetIOUReportFromReportAction';
1617
import useHasMultipleSplitChildren from '@hooks/useHasMultipleSplitChildren';
1718
import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
@@ -272,6 +273,8 @@ function MoneyRequestHeaderSecondaryActions({reportID, onBackButtonPress}: Money
272273
setRejectModalAction(null);
273274
};
274275

276+
const {isProduction} = useEnvironment();
277+
275278
// Secondary actions
276279
const secondaryActions = (() => {
277280
if (!transaction || !parentReportAction || !parentReport) {
@@ -289,6 +292,7 @@ function MoneyRequestHeaderSecondaryActions({reportID, onBackButtonPress}: Money
289292
outstandingReportsByPolicyID,
290293
isChatReportArchived: isChatIOUReportArchived,
291294
grandParentReport,
295+
isProduction,
292296
});
293297
})();
294298

@@ -341,7 +345,7 @@ function MoneyRequestHeaderSecondaryActions({reportID, onBackButtonPress}: Money
341345
icon: expensifyIcons.ArrowSplit,
342346
value: CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.SPLIT,
343347
onSelected: () => {
344-
initSplitExpense(transaction, policy, report);
348+
initSplitExpense(transaction, policy, report, accountID, {isProduction});
345349
},
346350
},
347351
[CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.MERGE]: {

src/components/ReportActionItem/MoneyRequestView.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ function MoneyRequestView({
181181
const theme = useTheme();
182182
const StyleUtils = useStyleUtils();
183183
const {isOffline} = useNetwork();
184-
const {environmentURL} = useEnvironment();
184+
const {environmentURL, isProduction} = useEnvironment();
185185
const {translate, toLocaleDigit, localeCompare} = useLocalize();
186186
const {convertToDisplayString, getCurrencySymbol} = useCurrencyListActions();
187187
const {getReportRHPActiveRoute} = useActiveRoute();
@@ -357,7 +357,7 @@ function MoneyRequestView({
357357
const isSplitAvailable =
358358
moneyRequestReport &&
359359
transaction &&
360-
isSplitAction(moneyRequestReport, [transaction], originalTransaction, currentUserPersonalDetails.login ?? '', currentUserPersonalDetails.accountID, policy);
360+
isSplitAction(moneyRequestReport, [transaction], originalTransaction, currentUserPersonalDetails.login ?? '', currentUserPersonalDetails.accountID, policy, undefined, isProduction);
361361

362362
const canEditTaxFields = canEdit && !isDistanceRequest;
363363
const canEditAmount =
@@ -956,7 +956,7 @@ function MoneyRequestView({
956956
}
957957

958958
if (shouldShowSplitIndicator && isSplitAvailable) {
959-
initSplitExpense(transaction, policy, transactionThreadReport);
959+
initSplitExpense(transaction, policy, transactionThreadReport, currentUserAccountIDParam, {isProduction});
960960
return;
961961
}
962962

src/components/Search/index.tsx

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import useActionLoadingReportIDs from '@hooks/useActionLoadingReportIDs';
1515
import useArchivedReportsIdSet from '@hooks/useArchivedReportsIdSet';
1616
import {useCurrencyListActions} from '@hooks/useCurrencyList';
1717
import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
18+
import useEnvironment from '@hooks/useEnvironment';
1819
import type {ActionHandledType} from '@hooks/useHoldMenuSubmit';
1920
import useLocalize from '@hooks/useLocalize';
2021
import useMultipleSnapshots from '@hooks/useMultipleSnapshots';
@@ -124,10 +125,11 @@ function mapTransactionItemToSelectedEntry(
124125
originalItemTransaction: OnyxEntry<Transaction>,
125126
currentUserLogin: string,
126127
currentUserAccountID: number,
127-
outstandingReportsByPolicyID?: OutstandingReportsByPolicyIDDerivedValue,
128-
allowNegativeAmount = true,
129-
parentReport?: OnyxEntry<Report>,
130-
selfDMReport?: OnyxEntry<Report>,
128+
outstandingReportsByPolicyID: OutstandingReportsByPolicyIDDerivedValue | undefined,
129+
allowNegativeAmount: boolean,
130+
parentReport: OnyxEntry<Report> | undefined,
131+
selfDMReport: OnyxEntry<Report> | undefined,
132+
isProduction: boolean,
131133
): [string, SelectedTransactionInfo] {
132134
const {canHoldRequest, canUnholdRequest} = canHoldUnholdReportAction(item.report, item.reportAction, item.holdReportAction, item, item.policy, currentUserAccountID);
133135
const canRejectRequest = item.report ? canRejectReportAction(currentUserLogin, item.report) : false;
@@ -144,7 +146,7 @@ function mapTransactionItemToSelectedEntry(
144146
canHold: canHoldRequest,
145147
isHeld: isOnHold(item),
146148
canUnhold: canUnholdRequest,
147-
canSplit: isSplitAction(reportForSplit, [itemTransaction], originalItemTransaction, currentUserLogin, currentUserAccountID, item.policy, parentReport),
149+
canSplit: isSplitAction(reportForSplit, [itemTransaction], originalItemTransaction, currentUserLogin, currentUserAccountID, item.policy, parentReport, isProduction),
148150
hasBeenSplit: getOriginalTransactionWithSplitInfo(itemTransaction, originalItemTransaction).isExpenseSplit,
149151
canChangeReport: canEditFieldOfMoneyRequest({
150152
reportAction: item.reportAction,
@@ -200,9 +202,10 @@ function prepareTransactionsList(
200202
selectedTransactions: SelectedTransactions,
201203
currentUserLogin: string,
202204
currentUserAccountID: number,
203-
outstandingReportsByPolicyID?: OutstandingReportsByPolicyIDDerivedValue,
204-
parentReport?: OnyxEntry<Report>,
205-
selfDMReport?: OnyxEntry<Report>,
205+
outstandingReportsByPolicyID: OutstandingReportsByPolicyIDDerivedValue | undefined,
206+
parentReport: OnyxEntry<Report> | undefined,
207+
selfDMReport: OnyxEntry<Report> | undefined,
208+
isProduction: boolean,
206209
) {
207210
if (selectedTransactions[item.keyForList]?.isSelected) {
208211
const {[item.keyForList]: omittedTransaction, ...transactions} = selectedTransactions;
@@ -220,6 +223,7 @@ function prepareTransactionsList(
220223
false,
221224
parentReport,
222225
selfDMReport,
226+
isProduction,
223227
);
224228

225229
return {
@@ -244,6 +248,7 @@ function Search({
244248
const {type, status, sortBy, sortOrder, hash, similarSearchHash, groupBy, view} = queryJSON;
245249

246250
const {isOffline} = useNetwork();
251+
const {isProduction} = useEnvironment();
247252
const prevIsOffline = usePrevious(isOffline);
248253
// eslint-disable-next-line rulesdir/prefer-shouldUseNarrowLayout-instead-of-isSmallScreenWidth
249254
const {shouldUseNarrowLayout, isSmallScreenWidth, isLargeScreenWidth, isInLandscapeMode} = useResponsiveLayout();
@@ -806,7 +811,7 @@ function Search({
806811
canHold: canHoldRequest,
807812
isHeld: isOnHold(transactionItem),
808813
canUnhold: canUnholdRequest,
809-
canSplit: isSplitAction(reportForSplit, [itemTransaction], originalItemTransaction, login ?? '', accountID, transactionItem.policy, itemParentReport),
814+
canSplit: isSplitAction(reportForSplit, [itemTransaction], originalItemTransaction, login ?? '', accountID, transactionItem.policy, itemParentReport, isProduction),
810815
hasBeenSplit: getOriginalTransactionWithSplitInfo(itemTransaction, originalItemTransaction).isExpenseSplit,
811816
canChangeReport: canEditFieldOfMoneyRequest({
812817
reportAction: transactionItem.reportAction,
@@ -865,7 +870,7 @@ function Search({
865870
canHold: canHoldRequest,
866871
isHeld: isOnHold(transactionItem),
867872
canUnhold: canUnholdRequest,
868-
canSplit: isSplitAction(reportForSplit, [itemTransaction], originalItemTransaction, login ?? '', accountID, transactionItem.policy, itemParentReport),
873+
canSplit: isSplitAction(reportForSplit, [itemTransaction], originalItemTransaction, login ?? '', accountID, transactionItem.policy, itemParentReport, isProduction),
869874
hasBeenSplit: getOriginalTransactionWithSplitInfo(itemTransaction, originalItemTransaction).isExpenseSplit,
870875
canChangeReport: canEditFieldOfMoneyRequest({
871876
reportAction: transactionItem.reportAction,
@@ -1032,6 +1037,7 @@ function Search({
10321037
outstandingReportsByPolicyID,
10331038
itemParentReport,
10341039
selfDMReport,
1040+
isProduction,
10351041
);
10361042
setSelectedTransactions(updatedTransactions);
10371043
updateSelectAllMatchingItemsState(updatedTransactions);
@@ -1108,14 +1114,26 @@ function Search({
11081114
true,
11091115
itemParentReport,
11101116
selfDMReport,
1117+
isProduction,
11111118
);
11121119
}),
11131120
),
11141121
};
11151122
setSelectedTransactions(updatedTransactions);
11161123
updateSelectAllMatchingItemsState(updatedTransactions);
11171124
},
1118-
[selectedTransactions, setSelectedTransactions, updateSelectAllMatchingItemsState, transactions, email, accountID, outstandingReportsByPolicyID, searchResults?.data, selfDMReport],
1125+
[
1126+
selectedTransactions,
1127+
setSelectedTransactions,
1128+
updateSelectAllMatchingItemsState,
1129+
transactions,
1130+
searchResults?.data,
1131+
email,
1132+
accountID,
1133+
outstandingReportsByPolicyID,
1134+
selfDMReport,
1135+
isProduction,
1136+
],
11191137
);
11201138

11211139
const onSelectRowInMobileSelectionMode = (item: SearchListItem) => {
@@ -1429,6 +1447,7 @@ function Search({
14291447
true,
14301448
itemParentReport,
14311449
selfDMReport,
1450+
isProduction,
14321451
);
14331452
});
14341453
});
@@ -1452,6 +1471,7 @@ function Search({
14521471
true,
14531472
itemParentReport,
14541473
selfDMReport,
1474+
isProduction,
14551475
);
14561476
}),
14571477
);
@@ -1471,6 +1491,7 @@ function Search({
14711491
outstandingReportsByPolicyID,
14721492
searchResults?.data,
14731493
selfDMReport,
1494+
isProduction,
14741495
]);
14751496

14761497
const onLayoutBase = useCallback(() => {

src/hooks/useDeleteTransactions.ts

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import type {Policy, Report, ReportAction, Transaction, TransactionViolations} f
2525
import type {SplitExpense} from '@src/types/onyx/IOU';
2626
import useArchivedReportsIdSet from './useArchivedReportsIdSet';
2727
import useCurrentUserPersonalDetails from './useCurrentUserPersonalDetails';
28+
import useEnvironment from './useEnvironment';
2829
import useNetwork from './useNetwork';
2930
import useOnyx from './useOnyx';
3031
import usePermissions from './usePermissions';
@@ -81,6 +82,7 @@ function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransac
8182
const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST);
8283
const [selfDMReportID] = useOnyx(ONYXKEYS.SELF_DM_REPORT_ID);
8384
const {isOffline} = useNetwork();
85+
const {isProduction} = useEnvironment();
8486

8587
const getSplitExpenseEditTransactionOnDelete = useCallback(
8688
(transactionIDs: string[]): Transaction | undefined => {
@@ -95,15 +97,26 @@ function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransac
9597
}
9698

9799
const originalTransaction = allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transaction.comment?.originalTransactionID}`];
100+
101+
if (isProduction) {
102+
if (!shouldRedirectDeleteToSplitExpenseEdit(transaction, originalTransaction, false, isProduction)) {
103+
return undefined;
104+
}
105+
return transaction;
106+
}
107+
98108
const isSelfDMSplit = isSelfDM(report) || (!!selfDMReportID && transaction.reportID === CONST.REPORT.UNREPORTED_REPORT_ID);
99-
const hasMultipleSplits = getChildTransactions(allTransactions, originalTransaction?.transactionID).length > 1;
100-
if (!shouldRedirectDeleteToSplitExpenseEdit(transaction, originalTransaction, isSelfDMSplit) || (!hasMultipleSplits && isPerDiemRequestTransactionUtils(originalTransaction))) {
109+
const hasMultipleSplits = getChildTransactions(allTransactions, originalTransaction?.transactionID, isProduction).length > 1;
110+
if (
111+
!shouldRedirectDeleteToSplitExpenseEdit(transaction, originalTransaction, isSelfDMSplit, isProduction) ||
112+
(!hasMultipleSplits && isPerDiemRequestTransactionUtils(originalTransaction))
113+
) {
101114
return undefined;
102115
}
103116

104117
return transaction;
105118
},
106-
[allTransactions, report, selfDMReportID],
119+
[allTransactions, report, selfDMReportID, isProduction],
107120
);
108121

109122
const shouldOpenSplitExpenseEditFlowOnDelete = useCallback(
@@ -141,7 +154,10 @@ function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransac
141154
const transactionReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${splitExpenseEditTransaction.reportID}`];
142155
const selfDMReport = isSelfDM(report) ? report : allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${selfDMReportID}`];
143156
const splitExpenseEditTransactionReport = transactionReport ?? selfDMReport;
144-
initSplitExpense(splitExpenseEditTransaction, policy, splitExpenseEditTransactionReport, {navigateToEditSplitExpense: true});
157+
initSplitExpense(splitExpenseEditTransaction, policy, splitExpenseEditTransactionReport, currentUserPersonalDetails.accountID, {
158+
navigateToEditSplitExpense: true,
159+
isProduction,
160+
});
145161
return {
146162
action: 'redirected',
147163
};
@@ -166,6 +182,12 @@ function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransac
166182
const {isExpenseSplit} = getOriginalTransactionWithSplitInfo(transaction, originalTransaction);
167183
const originalTransactionID = transaction?.comment?.originalTransactionID;
168184

185+
const isUnreportedSelfDMSplit = transaction?.reportID === CONST.REPORT.UNREPORTED_REPORT_ID;
186+
if (isProduction && isUnreportedSelfDMSplit) {
187+
acc.nonSplitTransactions.push(item);
188+
return acc;
189+
}
190+
169191
if (isExpenseSplit && originalTransactionID) {
170192
acc.splitTransactionsByOriginalTransactionID[originalTransactionID] ??= [];
171193
acc.splitTransactionsByOriginalTransactionID[originalTransactionID].push(item);
@@ -183,7 +205,7 @@ function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransac
183205

184206
for (const transactionID of Object.keys(splitTransactionsByOriginalTransactionID)) {
185207
const splitIDs = new Set((splitTransactionsByOriginalTransactionID[transactionID] ?? []).map((transaction) => transaction.transactionID));
186-
const allChildTransactions = getChildTransactions(allTransactions, transactionID);
208+
const allChildTransactions = getChildTransactions(allTransactions, transactionID, isProduction);
187209
const childTransactions = allChildTransactions.filter((transaction) => !splitIDs.has(transaction?.transactionID ?? String(CONST.DEFAULT_NUMBER_ID)));
188210

189211
if (childTransactions.length === 0) {
@@ -331,6 +353,7 @@ function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransac
331353
selfDMReportID,
332354
getSplitExpenseEditTransactionOnDelete,
333355
isOffline,
356+
isProduction,
334357
],
335358
);
336359

0 commit comments

Comments
 (0)