Skip to content

Commit 26c4e8e

Browse files
Merge pull request #95052 from shubham1206agra/migrate-getRate-2
Refactor: migrate getRate to use usePersonalPolicy hook (part 2)
2 parents a2a2b9d + 93c7fa5 commit 26c4e8e

15 files changed

Lines changed: 678 additions & 85 deletions

config/eslint/eslint.seatbelt.tsv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1805,7 +1805,7 @@
18051805
"../../tests/unit/SidebarTest.ts" "@typescript-eslint/no-unsafe-type-assertion" 2
18061806
"../../tests/unit/SidebarUtilsTest.ts" "@typescript-eslint/no-unsafe-type-assertion" 35
18071807
"../../tests/unit/SidebarUtilsTest.ts" "no-restricted-imports" 1
1808-
"../../tests/unit/SplitExpenseAutoAdjustmentTest.ts" "@typescript-eslint/no-unsafe-type-assertion" 1
1808+
"../../tests/unit/SplitExpenseAutoAdjustmentTest.ts" "@typescript-eslint/no-unsafe-type-assertion" 3
18091809
"../../tests/unit/SubscriptionUtilsTest.ts" "@typescript-eslint/no-unsafe-type-assertion" 2
18101810
"../../tests/unit/SuggestedFollowupTest.ts" "@typescript-eslint/no-unsafe-type-assertion" 1
18111811
"../../tests/unit/SuggestionMentionTest.tsx" "@typescript-eslint/no-unsafe-type-assertion" 4

src/components/MoneyRequestHeaderSecondaryActions.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import useLocalize from '@hooks/useLocalize';
1818
import useNetwork from '@hooks/useNetwork';
1919
import useOnyx from '@hooks/useOnyx';
2020
import usePermissions from '@hooks/usePermissions';
21+
import usePersonalPolicy from '@hooks/usePersonalPolicy';
2122
import usePolicyForMovingExpenses from '@hooks/usePolicyForMovingExpenses';
2223
import useReportIsArchived from '@hooks/useReportIsArchived';
2324
import useResponsiveLayout from '@hooks/useResponsiveLayout';
@@ -152,6 +153,7 @@ function MoneyRequestHeaderSecondaryActions({reportID, onBackButtonPress}: Money
152153
const [betas] = useOnyx(ONYXKEYS.BETAS);
153154
const [selfDMReportID] = useOnyx(ONYXKEYS.SELF_DM_REPORT_ID);
154155
const splitEffectivePolicy = useSplitEffectivePolicy(report, undefined, transaction);
156+
const personalPolicy = usePersonalPolicy();
155157
const restrictedActionPolicyID = useRestrictedActionPolicyID(policy);
156158

157159
// Custom hooks
@@ -346,7 +348,7 @@ function MoneyRequestHeaderSecondaryActions({reportID, onBackButtonPress}: Money
346348
icon: expensifyIcons.ArrowSplit,
347349
value: CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.SPLIT,
348350
onSelected: () => {
349-
initSplitExpense(transaction, report, splitEffectivePolicy, selfDMReportID, restrictedActionPolicyID, {isProduction});
351+
initSplitExpense(transaction, report, splitEffectivePolicy, selfDMReportID, restrictedActionPolicyID, personalPolicy?.outputCurrency, {isProduction});
350352
},
351353
},
352354
[CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.MERGE]: {

src/components/ReportActionItem/MoneyRequestView.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1139,7 +1139,9 @@ function MoneyRequestView({
11391139
}
11401140

11411141
if (shouldShowSplitIndicator && isSplitAvailable) {
1142-
initSplitExpense(transaction, transactionThreadReport, splitEffectivePolicy, selfDMReportID, restrictedActionPolicyID, {isProduction});
1142+
initSplitExpense(transaction, transactionThreadReport, splitEffectivePolicy, selfDMReportID, restrictedActionPolicyID, personalPolicy?.outputCurrency, {
1143+
isProduction,
1144+
});
11431145
return;
11441146
}
11451147

src/hooks/useDeleteTransactions.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import useEnvironment from './useEnvironment';
2828
import useNetwork from './useNetwork';
2929
import useOnyx from './useOnyx';
3030
import usePermissions from './usePermissions';
31+
import usePersonalPolicy from './usePersonalPolicy';
3132
import usePolicyForMovingExpenses from './usePolicyForMovingExpenses';
3233
import useRestrictedActionPolicyID from './useRestrictedActionPolicyID';
3334
import {findSplitPolicyForCustomUnit, getSplitEffectivePolicy} from './useSplitEffectivePolicy';
@@ -85,6 +86,7 @@ function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransac
8586
const [selfDMReportID] = useOnyx(ONYXKEYS.SELF_DM_REPORT_ID);
8687
const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY);
8788
const {policyForMovingExpenses} = usePolicyForMovingExpenses();
89+
const personalPolicy = usePersonalPolicy();
8890
const restrictedActionPolicyID = useRestrictedActionPolicyID(policy);
8991
const {isOffline} = useNetwork();
9092
const {isProduction} = useEnvironment();
@@ -169,10 +171,18 @@ function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransac
169171
policyForCustomUnit: findSplitPolicyForCustomUnit(allPolicies, splitExpenseEditTransaction),
170172
fallbackPolicy: policyForMovingExpenses,
171173
});
172-
initSplitExpense(splitExpenseEditTransaction, splitExpenseEditTransactionReport, splitEffectivePolicy, selfDMReportID, restrictedActionPolicyID, {
173-
navigateToEditSplitExpense: true,
174-
isProduction,
175-
});
174+
initSplitExpense(
175+
splitExpenseEditTransaction,
176+
splitExpenseEditTransactionReport,
177+
splitEffectivePolicy,
178+
selfDMReportID,
179+
restrictedActionPolicyID,
180+
personalPolicy?.outputCurrency,
181+
{
182+
navigateToEditSplitExpense: true,
183+
isProduction,
184+
},
185+
);
176186
return {
177187
action: 'redirected',
178188
};
@@ -376,6 +386,7 @@ function useDeleteTransactions({report, reportActions, policy}: UseDeleteTransac
376386
getSplitExpenseEditTransactionOnDelete,
377387
isOffline,
378388
isProduction,
389+
personalPolicy?.outputCurrency,
379390
],
380391
);
381392

src/hooks/useExpenseActions.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ import useLocalize from './useLocalize';
6161
import useOnyx from './useOnyx';
6262
import useParentReportAction from './useParentReportAction';
6363
import usePermissions from './usePermissions';
64+
import usePersonalPolicy from './usePersonalPolicy';
6465
import useReportIsArchived from './useReportIsArchived';
6566
import useRestrictedActionPolicyID from './useRestrictedActionPolicyID';
6667
import useSplitEffectivePolicy from './useSplitEffectivePolicy';
@@ -118,6 +119,7 @@ function useExpenseActions({reportID, isReportInSearch = false, backTo, onDuplic
118119

119120
const currentTransaction = transactions.at(0);
120121
const splitEffectivePolicy = useSplitEffectivePolicy(moneyRequestReport, undefined, currentTransaction);
122+
const personalPolicy = usePersonalPolicy();
121123
const restrictedActionPolicyID = useRestrictedActionPolicyID(policy);
122124
const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(iouTransactionID)}`);
123125
const [originalTransaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(transaction?.comment?.originalTransactionID)}`);
@@ -301,7 +303,7 @@ function useExpenseActions({reportID, isReportInSearch = false, backTo, onDuplic
301303
if (transactions.length !== 1) {
302304
return;
303305
}
304-
initSplitExpense(currentTransaction, moneyRequestReport, splitEffectivePolicy, selfDMReportID, restrictedActionPolicyID, {isProduction});
306+
initSplitExpense(currentTransaction, moneyRequestReport, splitEffectivePolicy, selfDMReportID, restrictedActionPolicyID, personalPolicy?.outputCurrency, {isProduction});
305307
},
306308
},
307309
[CONST.REPORT.SECONDARY_ACTIONS.MERGE]: {

src/hooks/useSearchBulkActions.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ import useOnyx from './useOnyx';
109109
import {getParticipantsInvoiceReport} from './useParticipantsInvoiceReport';
110110
import usePaymentContext from './usePaymentContext';
111111
import usePermissions from './usePermissions';
112+
import usePersonalPolicy from './usePersonalPolicy';
112113
import usePolicyForMovingExpenses from './usePolicyForMovingExpenses';
113114
import useRestrictedActionPolicyID from './useRestrictedActionPolicyID';
114115
import useSelfDMReport from './useSelfDMReport';
@@ -557,6 +558,7 @@ function useSearchBulkActions({queryJSON}: UseSearchBulkActionsParams) {
557558
const firstTransactionReport = firstTransactionFetchedReport ?? (isFirstTransactionUnreported ? selfDMReport : undefined);
558559
const [firstTransactionPolicy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${firstTransactionReport?.policyID}`);
559560
const splitEffectivePolicy = useSplitEffectivePolicy(firstTransactionReport, undefined, firstTransaction);
561+
const personalPolicy = usePersonalPolicy();
560562
const restrictedActionPolicyID = useRestrictedActionPolicyID(firstTransactionPolicy);
561563

562564
// Use the split-aware delete hook for bulk transaction deletion so split children trigger
@@ -2055,7 +2057,9 @@ function useSearchBulkActions({queryJSON}: UseSearchBulkActionsParams) {
20552057
icon: expensifyIcons.ArrowSplit,
20562058
value: CONST.SEARCH.BULK_ACTION_TYPES.SPLIT,
20572059
onSelected: () => {
2058-
initSplitExpense(firstTransaction, firstTransactionReport, splitEffectivePolicy, selfDMReportID, restrictedActionPolicyID, {isProduction});
2060+
initSplitExpense(firstTransaction, firstTransactionReport, splitEffectivePolicy, selfDMReportID, restrictedActionPolicyID, personalPolicy?.outputCurrency, {
2061+
isProduction,
2062+
});
20592063
},
20602064
});
20612065
}
@@ -2197,6 +2201,7 @@ function useSearchBulkActions({queryJSON}: UseSearchBulkActionsParams) {
21972201
personalDetails,
21982202
selfDMReportID,
21992203
splitEffectivePolicy,
2204+
personalPolicy?.outputCurrency,
22002205
restrictedActionPolicyID,
22012206
doSelectedItemsBelongToSubmitPolicy,
22022207
openSearchReportSubmitToPopover,

src/hooks/useSelectedTransactionsActions.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ import useLocalize from './useLocalize';
4848
import useNetworkWithOfflineStatus from './useNetworkWithOfflineStatus';
4949
import useOnyx from './useOnyx';
5050
import usePermissions from './usePermissions';
51+
import usePersonalPolicy from './usePersonalPolicy';
5152
import useReportIsArchived from './useReportIsArchived';
5253
import useRestrictedActionPolicyID from './useRestrictedActionPolicyID';
5354
import {shouldShowBulkDuplicateOption} from './useSearchBulkActions';
@@ -97,6 +98,7 @@ function useSelectedTransactionsActions({
9798
const [selfDMReportID] = useOnyx(ONYXKEYS.SELF_DM_REPORT_ID);
9899
const firstSelectedTransaction = allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${selectedTransactionIDs.at(0)}`];
99100
const splitEffectivePolicy = useSplitEffectivePolicy(report, undefined, firstSelectedTransaction);
101+
const personalPolicy = usePersonalPolicy();
100102
const restrictedActionPolicyID = useRestrictedActionPolicyID(policy);
101103
const {getCurrencyDecimals} = useCurrencyListActions();
102104

@@ -501,7 +503,7 @@ function useSelectedTransactionsActions({
501503
icon: expensifyIcons.ArrowSplit,
502504
value: SPLIT,
503505
onSelected: () => {
504-
initSplitExpense(firstTransaction, report, splitEffectivePolicy, selfDMReportID, restrictedActionPolicyID, {isProduction});
506+
initSplitExpense(firstTransaction, report, splitEffectivePolicy, selfDMReportID, restrictedActionPolicyID, personalPolicy?.outputCurrency, {isProduction});
505507
},
506508
});
507509
}

src/libs/actions/IOU/SplitExpenseItems.ts

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,12 @@ function resolveSplitMileageRate({
9191
transaction,
9292
policy,
9393
isSelfDMSplit,
94+
personalPolicyOutputCurrency,
9495
}: {
9596
transaction: OnyxEntry<OnyxTypes.Transaction>;
96-
policy?: OnyxEntry<OnyxTypes.Policy>;
97+
policy: OnyxEntry<OnyxTypes.Policy>;
9798
isSelfDMSplit?: boolean;
99+
personalPolicyOutputCurrency: string | undefined;
98100
}): ReturnType<typeof DistanceRequestUtils.getRate> {
99101
const customUnitRateID = transaction?.comment?.customUnit?.customUnitRateID;
100102
const isP2PRate = customUnitRateID === CONST.CUSTOM_UNITS.FAKE_P2P_ID;
@@ -106,7 +108,7 @@ function resolveSplitMileageRate({
106108
!!policy &&
107109
(!rawPolicyRate || rawPolicyRate.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE || rawPolicyRate.enabled === false);
108110

109-
const baseMileageRate = DistanceRequestUtils.getRate({transaction, policy: policy ?? undefined});
111+
const baseMileageRate = DistanceRequestUtils.getRate({transaction, policy: policy ?? undefined, personalPolicyOutputCurrency});
110112
if (baseMileageRate.rate && !isOriginalRateDeleted) {
111113
return baseMileageRate;
112114
}
@@ -288,8 +290,9 @@ function addSplitExpenseField(
288290
transaction: OnyxEntry<OnyxTypes.Transaction>,
289291
draftTransaction: OnyxEntry<OnyxTypes.Transaction>,
290292
transactionReport: OnyxEntry<OnyxTypes.Report>,
291-
policy?: OnyxEntry<OnyxTypes.Policy>,
292-
isSelfDMSplit?: boolean,
293+
policy: OnyxEntry<OnyxTypes.Policy>,
294+
isSelfDMSplit: boolean,
295+
personalPolicyOutputCurrency: string | undefined,
293296
) {
294297
if (!transaction || !draftTransaction) {
295298
return;
@@ -310,7 +313,7 @@ function addSplitExpenseField(
310313
}
311314
: undefined;
312315

313-
const mileageRate = resolveSplitMileageRate({transaction, policy, isSelfDMSplit});
316+
const mileageRate = resolveSplitMileageRate({transaction, policy, isSelfDMSplit, personalPolicyOutputCurrency});
314317
const {unit, rate} = mileageRate;
315318

316319
if (rate && rate > 0 && customUnit) {
@@ -369,9 +372,10 @@ function addSplitExpenseField(
369372
*/
370373
function evenlyDistributeSplitExpenseAmounts(
371374
draftTransaction: OnyxEntry<OnyxTypes.Transaction>,
372-
transaction?: OnyxEntry<OnyxTypes.Transaction>,
373-
policy?: OnyxEntry<OnyxTypes.Policy>,
374-
isSelfDMSplit?: boolean,
375+
transaction: OnyxEntry<OnyxTypes.Transaction>,
376+
policy: OnyxEntry<OnyxTypes.Policy>,
377+
isSelfDMSplit: boolean,
378+
personalPolicyOutputCurrency: string | undefined,
375379
) {
376380
if (!draftTransaction) {
377381
return;
@@ -395,7 +399,7 @@ function evenlyDistributeSplitExpenseAmounts(
395399
const splitCount = splitExpenses.length;
396400
const lastIndex = splitCount - 1;
397401

398-
const mileageRate = resolveSplitMileageRate({transaction, policy, isSelfDMSplit});
402+
const mileageRate = resolveSplitMileageRate({transaction, policy, isSelfDMSplit, personalPolicyOutputCurrency});
399403
const {unit, rate} = mileageRate;
400404

401405
const updatedSplitExpenses = splitExpenses.map((splitExpense, index) => {
@@ -446,8 +450,9 @@ function resetSplitExpensesByDateRange(
446450
transactionReport: OnyxEntry<OnyxTypes.Report>,
447451
startDate: string,
448452
endDate: string,
449-
policy?: OnyxEntry<OnyxTypes.Policy>,
450-
isSelfDMSplit?: boolean,
453+
policy: OnyxEntry<OnyxTypes.Policy>,
454+
isSelfDMSplit: boolean,
455+
personalPolicyOutputCurrency: string | undefined,
451456
) {
452457
if (!transaction || !draftTransaction || !startDate || !endDate) {
453458
return;
@@ -465,7 +470,7 @@ function resetSplitExpensesByDateRange(
465470

466471
const isDistanceRequest = isDistanceRequestTransactionUtils(transaction);
467472

468-
const mileageRate = resolveSplitMileageRate({transaction, policy, isSelfDMSplit});
473+
const mileageRate = resolveSplitMileageRate({transaction, policy, isSelfDMSplit, personalPolicyOutputCurrency});
469474
const {unit, rate} = mileageRate;
470475

471476
// Create split expenses for each date with proportional amounts
@@ -543,8 +548,9 @@ function updateSplitExpenseField(
543548
originalTransactionDraft: OnyxEntry<OnyxTypes.Transaction>,
544549
splitExpenseTransactionID: string,
545550
originalTransaction: OnyxEntry<OnyxTypes.Transaction>,
546-
policy?: OnyxEntry<OnyxTypes.Policy>,
547-
isSelfDMSplit?: boolean,
551+
policy: OnyxEntry<OnyxTypes.Policy>,
552+
isSelfDMSplit: boolean,
553+
personalPolicyOutputCurrency: string | undefined,
548554
) {
549555
if (!splitExpenseDraftTransaction || !splitExpenseTransactionID || !originalTransactionDraft) {
550556
return;
@@ -587,7 +593,7 @@ function updateSplitExpenseField(
587593

588594
// Recalculate amount for distance transactions when rate or distance changes
589595
if (isDistanceRequest && originalTransaction) {
590-
const mileageRate = resolveSplitMileageRate({transaction: splitExpenseDraftTransaction, policy, isSelfDMSplit});
596+
const mileageRate = resolveSplitMileageRate({transaction: splitExpenseDraftTransaction, policy, isSelfDMSplit, personalPolicyOutputCurrency});
591597
const {unit, rate} = mileageRate;
592598

593599
if (rate && rate > 0) {
@@ -635,8 +641,9 @@ function updateSplitExpenseAmountField(
635641
draftTransaction: OnyxEntry<OnyxTypes.Transaction>,
636642
currentItemTransactionID: string,
637643
amount: number,
638-
policy?: OnyxEntry<OnyxTypes.Policy>,
639-
isSelfDMSplit?: boolean,
644+
policy: OnyxEntry<OnyxTypes.Policy>,
645+
isSelfDMSplit: boolean,
646+
personalPolicyOutputCurrency: string | undefined,
640647
) {
641648
if (!draftTransaction?.transactionID || !currentItemTransactionID || Number.isNaN(amount)) {
642649
return;
@@ -660,7 +667,7 @@ function updateSplitExpenseAmountField(
660667

661668
// Update distance for distance transactions based on new amount and rate
662669
if (isDistanceRequest && originalTransaction && splitExpense.customUnit) {
663-
const mileageRate = resolveSplitMileageRate({transaction: originalTransaction, policy, isSelfDMSplit});
670+
const mileageRate = resolveSplitMileageRate({transaction: originalTransaction, policy, isSelfDMSplit, personalPolicyOutputCurrency});
664671
const {rate: currentRate = 0} =
665672
DistanceRequestUtils.getRateByCustomUnitRateID({policy, customUnitRateID: splitExpense.customUnit?.customUnitRateID ?? String(CONST.DEFAULT_NUMBER_ID)}) ?? {};
666673
const {unit, rate: mileageRateValue} = mileageRate;

src/libs/actions/SplitExpenses.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ function initSplitExpense(
5353
selfDMReportID: string | undefined,
5454
// When set, the caller's workspace is billing-restricted: redirect to RESTRICTED_ACTION instead of opening the split flow
5555
restrictedActionPolicyID: string | undefined,
56+
personalPolicyOutputCurrency: string | undefined,
5657
{navigateToEditSplitExpense = false, isProduction = false}: {navigateToEditSplitExpense?: boolean; isProduction?: boolean} = {},
5758
): void {
5859
if (!transaction) {
@@ -148,7 +149,7 @@ function initSplitExpense(
148149
if (isDistanceRequest(transaction)) {
149150
// Use the caller-resolved `effectivePolicy` (from `useSplitEffectivePolicy`) for the mileage rate so
150151
// distance calculations stay in sync with the split edit screens; raw `policy` drives only the billing guard.
151-
const mileageRate = resolveSplitMileageRate({transaction, policy: effectivePolicy ?? undefined, isSelfDMSplit: isSelfDMReport});
152+
const mileageRate = resolveSplitMileageRate({transaction, policy: effectivePolicy ?? undefined, isSelfDMSplit: isSelfDMReport, personalPolicyOutputCurrency});
152153
const {rate, unit, currency} = mileageRate;
153154

154155
if (rate && rate > 0 && transaction?.comment?.customUnit) {

src/pages/iou/SplitExpenseCreateDateRagePage.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'
1414
import useEnvironment from '@hooks/useEnvironment';
1515
import useLocalize from '@hooks/useLocalize';
1616
import useOnyx from '@hooks/useOnyx';
17+
import usePersonalPolicy from '@hooks/usePersonalPolicy';
1718
import useReportOrReportDraft from '@hooks/useReportOrReportDraft';
1819
import useSplitEffectivePolicy from '@hooks/useSplitEffectivePolicy';
1920
import useThemeStyles from '@hooks/useThemeStyles';
@@ -50,6 +51,7 @@ function SplitExpenseCreateDateRagePage({route}: SplitExpenseCreateDateRagePageP
5051
const parentReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${report?.parentReportID}`];
5152
const currentReport = report ?? currentSearchResults?.data?.[`${ONYXKEYS.COLLECTION.REPORT}${getNonEmptyStringOnyxID(reportID)}`];
5253

54+
const personalPolicy = usePersonalPolicy();
5355
const effectivePolicy = useSplitEffectivePolicy(currentReport, draftTransaction, transaction);
5456

5557
const {login, accountID: currentUserAccountID} = useCurrentUserPersonalDetails();
@@ -63,6 +65,7 @@ function SplitExpenseCreateDateRagePage({route}: SplitExpenseCreateDateRagePageP
6365
value[INPUT_IDS.END_DATE],
6466
effectivePolicy,
6567
isSelfDM(currentReport) || isSelfDM(parentReport),
68+
personalPolicy?.outputCurrency,
6669
);
6770
Navigation.goBack(backTo);
6871
};

0 commit comments

Comments
 (0)