diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index ed43569c360a..919273d3c04a 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -645,18 +645,17 @@ function createDistanceRequest(report, participant, comment, created, transactio } /** - * Edits an existing distance request - * * @param {String} transactionID * @param {Number} transactionThreadReportID * @param {Object} transactionChanges - * @param {String} [transactionChanges.created] - * @param {Number} [transactionChanges.amount] - * @param {Object} [transactionChanges.comment] - * @param {Object} [transactionChanges.waypoints] - * + * @param {String} [transactionChanges.created] Present when updated the date field + * @param {Boolean} onlyIncludeChangedFields + * When 'true', then the returned params will only include the transaction details for the fields that were changed. + * When `false`, then the returned params will include all the transaction details, regardless of which fields were changed. + * This setting is necessary while the UpdateDistanceRequest API is refactored to be fully 1:1:1 in https://github.com/Expensify/App/issues/28358 + * @returns {object} */ -function editDistanceMoneyRequest(transactionID, transactionThreadReportID, transactionChanges) { +function getUpdateMoneyRequestParams(transactionID, transactionThreadReportID, transactionChanges, onlyIncludeChangedFields) { const optimisticData = []; const successData = []; const failureData = []; @@ -676,11 +675,15 @@ function editDistanceMoneyRequest(transactionID, transactionThreadReportID, tran const updatedTransaction = TransactionUtils.getUpdatedTransaction(transaction, transactionChanges, isFromExpenseReport); const transactionDetails = ReportUtils.getTransactionDetails(updatedTransaction); + // This needs to be a JSON string since we're sending this to the MapBox API + transactionDetails.waypoints = JSON.stringify(transactionDetails.waypoints); + + const dataToIncludeInParams = onlyIncludeChangedFields ? _.pick(transactionDetails, _.keys(transactionChanges)) : transactionDetails; + const params = { - ...transactionDetails, + ...dataToIncludeInParams, + reportID: iouReport.reportID, transactionID, - // This needs to be a JSON string since we're sending this to the MapBox API - waypoints: JSON.stringify(transactionDetails.waypoints), }; // Step 3: Build the modified expense report actions @@ -740,12 +743,13 @@ function editDistanceMoneyRequest(transactionID, transactionThreadReportID, tran } // Optimistically modify the transaction + const optimisticTransaction = onlyIncludeChangedFields ? _.pick(updatedTransaction, _.keys(transactionChanges)) : updatedTransaction; optimisticData.push({ // We need to use SET method to save updated waypoint instead MERGE method to avoid wrong update of waypoints. More detail: https://github.com/Expensify/App/issues/30290#issuecomment-1778957070 onyxMethod: Onyx.METHOD.SET, key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, value: { - ...updatedTransaction, + ...optimisticTransaction, pendingFields, isLoading: _.has(transactionChanges, 'waypoints'), errorFields: null, @@ -790,7 +794,42 @@ function editDistanceMoneyRequest(transactionID, transactionThreadReportID, tran value: iouReport, }); - API.write('UpdateDistanceRequest', params, {optimisticData, successData, failureData}); + return { + params, + onyxData: {optimisticData, successData, failureData}, + }; +} + +/** + * Updates the created date of a money request + * + * @param {String} transactionID + * @param {Number} transactionThreadReportID + * @param {String} val + */ +function updateMoneyRequestDate(transactionID, transactionThreadReportID, val) { + const transactionChanges = { + created: val, + }; + const {params, onyxData} = getUpdateMoneyRequestParams(transactionID, transactionThreadReportID, transactionChanges, true); + API.write('UpdateMoneyRequestDate', params, onyxData); +} + +/** + * Edits an existing distance request + * + * @param {String} transactionID + * @param {Number} transactionThreadReportID + * @param {Object} transactionChanges + * @param {String} [transactionChanges.created] + * @param {Number} [transactionChanges.amount] + * @param {Object} [transactionChanges.comment] + * @param {Object} [transactionChanges.waypoints] + * + */ +function updateDistanceRequest(transactionID, transactionThreadReportID, transactionChanges) { + const {params, onyxData} = getUpdateMoneyRequestParams(transactionID, transactionThreadReportID, transactionChanges, false); + API.write('UpdateDistanceRequest', params, onyxData); } /** @@ -1971,7 +2010,7 @@ function editRegularMoneyRequest(transactionID, transactionThreadReportID, trans */ function editMoneyRequest(transaction, transactionThreadReportID, transactionChanges) { if (TransactionUtils.isDistanceRequest(transaction)) { - editDistanceMoneyRequest(transaction.transactionID, transactionThreadReportID, transactionChanges); + updateDistanceRequest(transaction.transactionID, transactionThreadReportID, transactionChanges); } else { editRegularMoneyRequest(transaction.transactionID, transactionThreadReportID, transactionChanges); } @@ -3012,6 +3051,7 @@ export { setMoneyRequestReceipt, setUpDistanceTransaction, navigateToNextPage, + updateMoneyRequestDate, replaceReceipt, detachReceipt, getIOUReportID, diff --git a/src/pages/EditRequestPage.js b/src/pages/EditRequestPage.js index 95313bea142d..2bdf3d19f16a 100644 --- a/src/pages/EditRequestPage.js +++ b/src/pages/EditRequestPage.js @@ -1,7 +1,7 @@ import lodashGet from 'lodash/get'; import lodashValues from 'lodash/values'; import PropTypes from 'prop-types'; -import React, {useEffect, useMemo} from 'react'; +import React, {useCallback, useEffect, useMemo} from 'react'; import {withOnyx} from 'react-native-onyx'; import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView'; import categoryPropTypes from '@components/categoryPropTypes'; @@ -85,9 +85,6 @@ function EditRequestPage({report, route, parentReport, policyCategories, policyT } = ReportUtils.getTransactionDetails(transaction); const defaultCurrency = lodashGet(route, 'params.currency', '') || transactionCurrency; - - // Take only the YYYY-MM-DD value - const transactionCreated = TransactionUtils.getCreated(transaction); const fieldToEdit = lodashGet(route, ['params', 'field'], ''); // For now, it always defaults to the first tag of the policy @@ -123,6 +120,19 @@ function EditRequestPage({report, route, parentReport, policyCategories, policyT Navigation.dismissModal(report.reportID); } + const saveCreated = useCallback( + ({created: newCreated}) => { + // If the value hasn't changed, don't request to save changes on the server and just close the modal + if (newCreated === TransactionUtils.getCreated(transaction)) { + Navigation.dismissModal(); + return; + } + IOU.updateMoneyRequestDate(transaction.transactionID, report.reportID, newCreated); + Navigation.dismissModal(); + }, + [transaction, report], + ); + if (fieldToEdit === CONST.EDIT_REQUEST_FIELD.DESCRIPTION) { return ( { - // In case the date hasn't been changed, do not make the API request. - if (transactionChanges.created === transactionCreated) { - Navigation.dismissModal(); - return; - } - editMoneyRequest(transactionChanges); - }} + defaultCreated={TransactionUtils.getCreated(transaction)} + onSubmit={saveCreated} /> ); } diff --git a/src/pages/EditSplitBillPage.js b/src/pages/EditSplitBillPage.js index 3e5a5e7f5d53..dd1a96a4c8b4 100644 --- a/src/pages/EditSplitBillPage.js +++ b/src/pages/EditSplitBillPage.js @@ -71,10 +71,10 @@ function EditSplitBillPage({route, transaction, draftTransaction, report}) { Navigation.navigate(ROUTES.SPLIT_BILL_DETAILS.getRoute(reportID, reportActionID)); } - function setDraftSplitTransaction(transactionChanges) { + const setDraftSplitTransaction = (transactionChanges) => { IOU.setDraftSplitTransaction(transaction.transactionID, transactionChanges); navigateBackToSplitDetails(); - } + }; if (fieldToEdit === CONST.EDIT_REQUEST_FIELD.DESCRIPTION) { return ( @@ -93,13 +93,7 @@ function EditSplitBillPage({route, transaction, draftTransaction, report}) { return ( { - setDraftSplitTransaction({ - created: transactionChanges.created, - }); - }} + onSubmit={setDraftSplitTransaction} /> ); }