Skip to content

Commit

Permalink
Merge pull request #50323 from wildan-m/wildan/fix/48631-remove-inval…
Browse files Browse the repository at this point in the history
…id-recent-waypoint

Remove invalid recent waypoint when creating / editing distance request
  • Loading branch information
neil-marcellini authored Oct 8, 2024
2 parents bcddf24 + c9f9ad3 commit 6d74fe7
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 6 deletions.
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 {
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;

0 comments on commit 6d74fe7

Please sign in to comment.