Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove invalid recent waypoint when creating / editing distance request #50323

32 changes: 28 additions & 4 deletions src/libs/actions/IOU.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ import * as Category from './Policy/Category';
import * as Policy from './Policy/Policy';
import * as Tag from './Policy/Tag';
import * as Report from './Report';
import {getRecentWaypoints, sanitizeRecentWaypoints} from './Transaction';

type IOURequestType = ValueOf<typeof CONST.IOU.REQUEST_TYPE>;

Expand Down Expand Up @@ -3108,7 +3109,7 @@ function updateMoneyRequestDistance({
policyCategories = {},
}: UpdateMoneyRequestDistanceParams) {
const transactionChanges: TransactionChanges = {
waypoints,
waypoints: sanitizeRecentWaypoints(waypoints),
routes,
};
const allReports = ReportConnection.getAllReports();
Expand All @@ -3121,6 +3122,14 @@ function updateMoneyRequestDistance({
data = getUpdateMoneyRequestParams(transactionID, transactionThreadReportID, transactionChanges, policy, policyTagList, policyCategories, true);
}
const {params, onyxData} = data;

const recentServerValidatedWaypoints = getRecentWaypoints().filter((item) => !item.pendingAction);
onyxData?.failureData?.push({
onyxMethod: Onyx.METHOD.SET,
key: `${ONYXKEYS.NVP_RECENT_WAYPOINTS}`,
value: recentServerValidatedWaypoints,
});

API.write(WRITE_COMMANDS.UPDATE_MONEY_REQUEST_DISTANCE, params, onyxData);
}

Expand Down Expand Up @@ -3765,6 +3774,13 @@ function trackExpense(
) ?? {};
const activeReportID = isMoneyRequestReport ? report.reportID : chatReport?.reportID;

const recentServerValidatedWaypoints = getRecentWaypoints().filter((item) => !item.pendingAction);
onyxData?.failureData?.push({
onyxMethod: Onyx.METHOD.SET,
key: `${ONYXKEYS.NVP_RECENT_WAYPOINTS}`,
value: recentServerValidatedWaypoints,
});

switch (action) {
case CONST.IOU.ACTION.CATEGORIZE: {
if (!linkedTrackedExpenseReportAction || !actionableWhisperReportActionID || !linkedTrackedExpenseReportID) {
Expand Down Expand Up @@ -3853,7 +3869,7 @@ function trackExpense(
receiptGpsPoints: gpsPoints ? JSON.stringify(gpsPoints) : undefined,
transactionThreadReportID: transactionThreadReportID ?? '-1',
createdReportActionIDForThread: createdReportActionIDForThread ?? '-1',
waypoints: validWaypoints ? JSON.stringify(validWaypoints) : undefined,
waypoints: validWaypoints ? JSON.stringify(sanitizeRecentWaypoints(validWaypoints)) : undefined,
customUnitRateID,
};
if (actionableWhisperReportActionIDParam) {
Expand Down Expand Up @@ -5106,6 +5122,7 @@ function createDistanceRequest(

let parameters: CreateDistanceRequestParams;
let onyxData: OnyxData;
const sanitizedWaypoints = sanitizeRecentWaypoints(validWaypoints);
if (iouType === CONST.IOU.TYPE.SPLIT) {
const {
splitData,
Expand Down Expand Up @@ -5138,7 +5155,7 @@ function createDistanceRequest(
chatReportID: splitData.chatReportID,
createdChatReportActionID: splitData.createdReportActionID ?? '',
reportActionID: splitData.reportActionID,
waypoints: JSON.stringify(validWaypoints),
waypoints: JSON.stringify(sanitizedWaypoints),
customUnitRateID,
comment,
created,
Expand Down Expand Up @@ -5197,7 +5214,7 @@ function createDistanceRequest(
createdChatReportActionID,
createdIOUReportActionID,
reportPreviewReportActionID: reportPreviewAction.reportActionID,
waypoints: JSON.stringify(validWaypoints),
waypoints: JSON.stringify(sanitizedWaypoints),
created,
category,
tag,
Expand All @@ -5211,6 +5228,13 @@ function createDistanceRequest(
};
}

const recentServerValidatedWaypoints = getRecentWaypoints().filter((item) => !item.pendingAction);
onyxData?.failureData?.push({
onyxMethod: Onyx.METHOD.SET,
key: `${ONYXKEYS.NVP_RECENT_WAYPOINTS}`,
value: recentServerValidatedWaypoints,
});

API.write(WRITE_COMMANDS.CREATE_DISTANCE_REQUEST, parameters, onyxData);
const activeReportID = isMoneyRequestReport ? report?.reportID ?? '-1' : parameters.chatReportID;
Navigation.dismissModal(isSearchTopmostCentralPane() ? undefined : activeReportID);
Expand Down
25 changes: 23 additions & 2 deletions src/libs/actions/Transaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,8 @@ function saveWaypoint(transactionID: string, index: string, waypoint: RecentWayp
const recentWaypointAlreadyExists = recentWaypoints.find((recentWaypoint) => recentWaypoint?.address === waypoint?.address);
if (!recentWaypointAlreadyExists && waypoint !== null) {
const clonedWaypoints = lodashClone(recentWaypoints);
clonedWaypoints.unshift(waypoint);
const updatedWaypoint = {...waypoint, pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD};
clonedWaypoints.unshift(updatedWaypoint);
Onyx.merge(ONYXKEYS.NVP_RECENT_WAYPOINTS, clonedWaypoints.slice(0, CONST.RECENT_WAYPOINTS_NUMBER));
}
}
Expand Down Expand Up @@ -245,14 +246,28 @@ function getOnyxDataForRouteRequest(transactionID: string, isDraft = false): Ony
};
}

/**
* Sanitizes the waypoints by removing the pendingAction property.
*
* @param waypoints - The collection of waypoints to sanitize.
* @returns The sanitized collection of waypoints.
*/
function sanitizeRecentWaypoints(waypoints: WaypointCollection): WaypointCollection {
Copy link
Contributor

Choose a reason for hiding this comment

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

Why do we need to do this?

Copy link
Contributor

Choose a reason for hiding this comment

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

Ah I see, the backend saves the waypoints as is, and we don't want to save the pendingAction property. I'm good with this then.

return Object.entries(waypoints).reduce((acc, [key, waypoint]) => {
const {pendingAction, ...rest} = waypoint as RecentWaypoint;
acc[key] = rest;
return acc;
}, {} as WaypointCollection);
}

/**
* Gets the route for a set of waypoints
* Used so we can generate a map view of the provided waypoints
*/
function getRoute(transactionID: string, waypoints: WaypointCollection, isDraft: boolean) {
const parameters: GetRouteParams = {
transactionID,
waypoints: JSON.stringify(waypoints),
waypoints: JSON.stringify(sanitizeRecentWaypoints(waypoints)),
};

API.read(isDraft ? READ_COMMANDS.GET_ROUTE_FOR_DRAFT : READ_COMMANDS.GET_ROUTE, parameters, getOnyxDataForRouteRequest(transactionID, isDraft));
Expand Down Expand Up @@ -470,6 +485,10 @@ function openDraftDistanceExpense() {
API.read(READ_COMMANDS.OPEN_DRAFT_DISTANCE_EXPENSE, null, onyxData);
}

function getRecentWaypoints() {
return recentWaypoints;
}

export {
addStop,
createInitialWaypoints,
Expand All @@ -483,4 +502,6 @@ export {
setReviewDuplicatesKey,
abandonReviewDuplicateTransactions,
openDraftDistanceExpense,
getRecentWaypoints,
sanitizeRecentWaypoints,
};
5 changes: 5 additions & 0 deletions src/types/onyx/RecentWaypoint.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import type * as OnyxCommon from './OnyxCommon';

/** Model of recent endpoint used in distance expense */
type RecentWaypoint = {
/** The name associated with the address of the waypoint */
Expand All @@ -14,6 +16,9 @@ type RecentWaypoint = {

/** A unique key for waypoint is required for correct draggable list rendering */
keyForList?: string;

/** The pending action for recent waypoint */
pendingAction?: OnyxCommon.PendingAction | null;
};

export default RecentWaypoint;
Loading