Skip to content

Commit

Permalink
Merge pull request #42337 from nkdengineer/fix/41817
Browse files Browse the repository at this point in the history
Fix amount of distance request isn't updated optimistically
  • Loading branch information
neil-marcellini authored May 28, 2024
2 parents 7b362b7 + f20358c commit deb4c79
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 9 deletions.
2 changes: 1 addition & 1 deletion src/libs/ReportUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2784,7 +2784,7 @@ function getTransactionReportName(reportAction: OnyxEntry<ReportAction | Optimis
return Localize.translateLocal('iou.receiptMissingDetails');
}

if (TransactionUtils.isFetchingWaypointsFromServer(transaction)) {
if (TransactionUtils.isFetchingWaypointsFromServer(transaction) && TransactionUtils.getMerchant(transaction) === Localize.translateLocal('iou.fieldPending')) {
return Localize.translateLocal('iou.fieldPending');
}

Expand Down
52 changes: 45 additions & 7 deletions src/libs/actions/IOU.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import DistanceRequestUtils from '@libs/DistanceRequestUtils';
import * as ErrorUtils from '@libs/ErrorUtils';
import * as FileUtils from '@libs/fileDownload/FileUtils';
import * as IOUUtils from '@libs/IOUUtils';
import {toLocaleDigit} from '@libs/LocaleDigitUtils';
import * as LocalePhoneNumber from '@libs/LocalePhoneNumber';
import * as Localize from '@libs/Localize';
import Navigation from '@libs/Navigation/Navigation';
Expand All @@ -55,7 +56,8 @@ import type {IOUMessage, PaymentMethodType} from '@src/types/onyx/OriginalMessag
import type ReportAction from '@src/types/onyx/ReportAction';
import type {ReportPreviewAction} from '@src/types/onyx/ReportAction';
import type {OnyxData} from '@src/types/onyx/Request';
import type {Comment, Receipt, ReceiptSource, SplitShares, TransactionChanges, WaypointCollection} from '@src/types/onyx/Transaction';
import type {Comment, Receipt, ReceiptSource, Routes, SplitShares, TransactionChanges, WaypointCollection} from '@src/types/onyx/Transaction';
import type DeepValueOf from '@src/types/utils/DeepValueOf';
import type {EmptyObject} from '@src/types/utils/EmptyObject';
import {isEmptyObject} from '@src/types/utils/EmptyObject';
import * as CachedPDFPaths from './CachedPDFPaths';
Expand Down Expand Up @@ -269,6 +271,17 @@ Onyx.connect({
},
});

let preferredLocale: DeepValueOf<typeof CONST.LOCALES> = CONST.LOCALES.DEFAULT;
Onyx.connect({
key: ONYXKEYS.NVP_PREFERRED_LOCALE,
callback: (value) => {
if (!value) {
return;
}
preferredLocale = value;
},
});

/**
* Find the report preview action from given chat report and iou report
*/
Expand Down Expand Up @@ -2312,6 +2325,32 @@ function calculateDiffAmount(iouReport: OnyxEntry<OnyxTypes.Report>, updatedTran
return 0;
}

function calculateAmountForUpdatedWaypoint(
transaction: OnyxEntry<OnyxTypes.Transaction>,
transactionChanges: TransactionChanges,
policy: OnyxEntry<OnyxTypes.Policy>,
iouReport: OnyxEntry<OnyxTypes.Report>,
) {
let updatedAmount: number = CONST.IOU.DEFAULT_AMOUNT;
let updatedMerchant = Localize.translateLocal('iou.fieldPending');
if (!isEmptyObject(transactionChanges?.routes)) {
const customUnitRateID = TransactionUtils.getRateID(transaction) ?? '';
const mileageRates = DistanceRequestUtils.getMileageRates(policy);
const policyCurrency = policy?.outputCurrency ?? PolicyUtils.getPersonalPolicy()?.outputCurrency ?? CONST.CURRENCY.USD;
const mileageRate = TransactionUtils.isCustomUnitRateIDForP2P(transaction)
? DistanceRequestUtils.getRateForP2P(policyCurrency)
: mileageRates?.[customUnitRateID] ?? DistanceRequestUtils.getDefaultMileageRate(policy);
const {unit, rate} = mileageRate;
const distance = TransactionUtils.getDistance(transaction);
const amount = DistanceRequestUtils.getDistanceRequestAmount(distance, unit, rate ?? 0);
updatedAmount = ReportUtils.isExpenseReport(iouReport) ? -amount : amount;
updatedMerchant = DistanceRequestUtils.getDistanceMerchant(true, distance, unit, rate, transaction?.currency ?? CONST.CURRENCY.USD, Localize.translateLocal, (digit) =>
toLocaleDigit(preferredLocale, digit),
);
}
return {amount: updatedAmount, modifiedAmount: updatedAmount, modifiedMerchant: updatedMerchant};
}

/**
* @param transactionID
* @param transactionThreadReportID
Expand Down Expand Up @@ -2371,9 +2410,7 @@ function getUpdateMoneyRequestParams(
if (transaction && updatedTransaction && hasPendingWaypoints) {
updatedTransaction = {
...updatedTransaction,
amount: CONST.IOU.DEFAULT_AMOUNT,
modifiedAmount: CONST.IOU.DEFAULT_AMOUNT,
modifiedMerchant: Localize.translateLocal('iou.fieldPending'),
...calculateAmountForUpdatedWaypoint(transaction, transactionChanges, policy, iouReport),
};

// Delete the draft transaction when editing waypoints when the server responds successfully and there are no errors
Expand Down Expand Up @@ -2657,9 +2694,7 @@ function getUpdateTrackExpenseParams(
if (transaction && updatedTransaction && hasPendingWaypoints) {
updatedTransaction = {
...updatedTransaction,
amount: CONST.IOU.DEFAULT_AMOUNT,
modifiedAmount: CONST.IOU.DEFAULT_AMOUNT,
modifiedMerchant: Localize.translateLocal('iou.fieldPending'),
...calculateAmountForUpdatedWaypoint(transaction, transactionChanges, policy, transactionThread),
};

// Delete the draft transaction when editing waypoints when the server responds successfully and there are no errors
Expand Down Expand Up @@ -2906,6 +2941,7 @@ type UpdateMoneyRequestDistanceParams = {
transactionID: string;
transactionThreadReportID: string;
waypoints: WaypointCollection;
routes?: Routes;
policy?: OnyxEntry<OnyxTypes.Policy>;
policyTagList?: OnyxEntry<OnyxTypes.PolicyTagList>;
policyCategories?: OnyxEntry<OnyxTypes.PolicyCategories>;
Expand All @@ -2916,12 +2952,14 @@ function updateMoneyRequestDistance({
transactionID,
transactionThreadReportID,
waypoints,
routes = undefined,
policy = {} as OnyxTypes.Policy,
policyTagList = {},
policyCategories = {},
}: UpdateMoneyRequestDistanceParams) {
const transactionChanges: TransactionChanges = {
waypoints,
routes,
};
const transactionThreadReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReportID}`] ?? null;
const parentReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReport?.parentReportID}`] ?? null;
Expand Down
11 changes: 10 additions & 1 deletion src/pages/iou/request/step/IOURequestStepDistance.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -377,11 +377,18 @@ function IOURequestStepDistance({
const oldWaypoints = transactionBackup?.comment.waypoints ?? {};
const oldAddresses = Object.fromEntries(Object.entries(oldWaypoints).map(([key, waypoint]) => [key, 'address' in waypoint ? waypoint.address : {}]));
const addresses = Object.fromEntries(Object.entries(waypoints).map(([key, waypoint]) => [key, 'address' in waypoint ? waypoint.address : {}]));
const hasRouteChanged = !isEqual(transactionBackup?.routes, transaction?.routes);
if (isEqual(oldAddresses, addresses)) {
Navigation.dismissModal();
return;
}
IOU.updateMoneyRequestDistance({transactionID: transaction?.transactionID ?? '', transactionThreadReportID: report?.reportID ?? '', waypoints});
IOU.updateMoneyRequestDistance({
transactionID: transaction?.transactionID ?? '',
transactionThreadReportID: report?.reportID ?? '',
waypoints,
...(hasRouteChanged ? {routes: transaction?.routes} : {}),
policy,
});
Navigation.dismissModal();
return;
}
Expand All @@ -399,7 +406,9 @@ function IOURequestStepDistance({
transactionBackup,
waypoints,
transaction?.transactionID,
transaction?.routes,
report?.reportID,
policy,
]);

const renderItem = useCallback(
Expand Down
1 change: 1 addition & 0 deletions src/types/onyx/Transaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,7 @@ export type {
Comment,
Receipt,
Waypoint,
Routes,
ReceiptError,
ReceiptErrors,
TransactionPendingFieldsKey,
Expand Down

0 comments on commit deb4c79

Please sign in to comment.