From 89ce2368b333e88bb1aae9cc5f1264be8a0efc29 Mon Sep 17 00:00:00 2001 From: Carlos Martins Date: Thu, 27 Jul 2023 15:54:14 -0600 Subject: [PATCH 01/18] pass receipt param --- src/libs/ReportUtils.js | 3 ++- src/libs/TransactionUtils.js | 3 ++- src/libs/actions/IOU.js | 8 ++++++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/libs/ReportUtils.js b/src/libs/ReportUtils.js index 8b3a0cacffca..60a73fd7a85e 100644 --- a/src/libs/ReportUtils.js +++ b/src/libs/ReportUtils.js @@ -1709,9 +1709,10 @@ function getIOUReportActionMessage(type, total, comment, currency, paymentType = * @param {String} [iouReportID] - Only required if the IOUReportActions type is oneOf(decline, cancel, pay). Generates a randomID as default. * @param {Boolean} [isSettlingUp] - Whether we are settling up an IOU. * @param {Boolean} [isSendMoneyFlow] - Whether this is send money flow + * @param {Object} [receipt] * @returns {Object} */ -function buildOptimisticIOUReportAction(type, amount, currency, comment, participants, transactionID, paymentType = '', iouReportID = '', isSettlingUp = false, isSendMoneyFlow = false) { +function buildOptimisticIOUReportAction(type, amount, currency, comment, participants, transactionID, paymentType = '', iouReportID = '', isSettlingUp = false, isSendMoneyFlow = false, receipt = undefined) { const IOUReportID = iouReportID || generateReportID(); const originalMessage = { diff --git a/src/libs/TransactionUtils.js b/src/libs/TransactionUtils.js index 266720bc631f..621b90be61f0 100644 --- a/src/libs/TransactionUtils.js +++ b/src/libs/TransactionUtils.js @@ -12,9 +12,10 @@ import * as NumberUtils from './NumberUtils'; * @param {String} [source] * @param {String} [originalTransactionID] * @param {String} [merchant] + * @param {Object} [receipt] * @returns {Object} */ -function buildOptimisticTransaction(amount, currency, reportID, comment = '', source = '', originalTransactionID = '', merchant = CONST.REPORT.TYPE.IOU) { +function buildOptimisticTransaction(amount, currency, reportID, comment = '', source = '', originalTransactionID = '', merchant = CONST.REPORT.TYPE.IOU, receipt = undefined) { // transactionIDs are random, positive, 64-bit numeric strings. // Because JS can only handle 53-bit numbers, transactionIDs are strings in the front-end (just like reportActionID) const transactionID = NumberUtils.rand64(); diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index b7713c6224d2..bf2d8f84adce 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -296,8 +296,10 @@ function buildOnyxDataForMoneyRequest( * @param {Number} payeeAccountID * @param {Object} participant * @param {String} comment + * @param {Object} receipt + * */ -function requestMoney(report, amount, currency, payeeEmail, payeeAccountID, participant, comment) { +function requestMoney(report, amount, currency, payeeEmail, payeeAccountID, participant, comment, receipt) { const payerEmail = OptionsListUtils.addSMSDomainIfPhoneNumber(participant.login); const payerAccountID = Number(participant.accountID); const isPolicyExpenseChat = participant.isPolicyExpenseChat; @@ -342,7 +344,7 @@ function requestMoney(report, amount, currency, payeeEmail, payeeAccountID, part } // STEP 3: Build optimistic transaction - const optimisticTransaction = TransactionUtils.buildOptimisticTransaction(amount, currency, iouReport.reportID, comment); + const optimisticTransaction = TransactionUtils.buildOptimisticTransaction(amount, currency, iouReport.reportID, comment, receipt); // STEP 4: Build optimistic reportActions. We need: // 1. CREATED action for the chatReport @@ -361,6 +363,7 @@ function requestMoney(report, amount, currency, payeeEmail, payeeAccountID, part optimisticTransaction.transactionID, '', iouReport.reportID, + receipt, ); // Add optimistic personal details for participant @@ -414,6 +417,7 @@ function requestMoney(report, amount, currency, payeeEmail, payeeAccountID, part createdChatReportActionID: isNewChatReport ? optimisticCreatedActionForChat.reportActionID : 0, createdIOUReportActionID: isNewIOUReport ? optimisticCreatedActionForIOU.reportActionID : 0, reportPreviewReportActionID: reportPreviewAction.reportActionID, + receipt, }, {optimisticData, successData, failureData}, ); From 94cccccf3fd63b24c1a6f08a3ec4546f935ec2c6 Mon Sep 17 00:00:00 2001 From: Carlos Martins Date: Thu, 27 Jul 2023 16:09:36 -0600 Subject: [PATCH 02/18] create buildOptimisticReceipt --- src/CONST.js | 3 +++ src/libs/ReportUtils.js | 1 + src/libs/TransactionUtils.js | 20 ++++++++++++++++++++ src/libs/actions/IOU.js | 5 +++-- 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/CONST.js b/src/CONST.js index 39d190788b41..71ff3cec148e 100755 --- a/src/CONST.js +++ b/src/CONST.js @@ -1057,6 +1057,9 @@ const CONST = { DELETE: 'delete', }, AMOUNT_MAX_LENGTH: 10, + RECEIPT_STATE: { + SCANREADY: 'SCANREADY', + } }, GROWL: { diff --git a/src/libs/ReportUtils.js b/src/libs/ReportUtils.js index 60a73fd7a85e..afe31042330d 100644 --- a/src/libs/ReportUtils.js +++ b/src/libs/ReportUtils.js @@ -1758,6 +1758,7 @@ function buildOptimisticIOUReportAction(type, amount, currency, comment, partici shouldShow: true, created: DateUtils.getDBTime(), pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + receipt, }; } diff --git a/src/libs/TransactionUtils.js b/src/libs/TransactionUtils.js index 621b90be61f0..6b6d025cee23 100644 --- a/src/libs/TransactionUtils.js +++ b/src/libs/TransactionUtils.js @@ -37,9 +37,29 @@ function buildOptimisticTransaction(amount, currency, reportID, comment = '', so merchant, created: DateUtils.getDBTime(), pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + receipt, }; } +/** + * Optimistically generate a receipt. + * + * @param {Object} receipt + * @returns {Object} + */ +function buildOptimisticReceipt(receipt) { + if (!receipt) { + return; + } + + return ({ + receiptID: NumberUtils.rand64(), + source: receipt.source, + state: CONST.IOU.RECEIPT_STATE.SCANREADY, + }); +} + export default { buildOptimisticTransaction, + buildOptimisticReceipt, }; diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index bf2d8f84adce..5c70c6871469 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -19,6 +19,7 @@ import TransactionUtils from '../TransactionUtils'; import * as ErrorUtils from '../ErrorUtils'; import * as UserUtils from '../UserUtils'; import * as Report from './Report'; +import * as NumberUtils from '../NumberUtils'; let allReports; Onyx.connect({ @@ -296,10 +297,10 @@ function buildOnyxDataForMoneyRequest( * @param {Number} payeeAccountID * @param {Object} participant * @param {String} comment - * @param {Object} receipt + * @param {Object} [receipt] * */ -function requestMoney(report, amount, currency, payeeEmail, payeeAccountID, participant, comment, receipt) { +function requestMoney(report, amount, currency, payeeEmail, payeeAccountID, participant, comment, receipt = undefined) { const payerEmail = OptionsListUtils.addSMSDomainIfPhoneNumber(participant.login); const payerAccountID = Number(participant.accountID); const isPolicyExpenseChat = participant.isPolicyExpenseChat; From eafded7498768879657cbe9a78f782d2fffb4fe2 Mon Sep 17 00:00:00 2001 From: Carlos Martins Date: Thu, 27 Jul 2023 16:17:59 -0600 Subject: [PATCH 03/18] move buildOptimisticReceipt logic --- src/libs/TransactionUtils.js | 34 +++++++++++++++------------------- src/libs/actions/IOU.js | 1 - 2 files changed, 15 insertions(+), 20 deletions(-) diff --git a/src/libs/TransactionUtils.js b/src/libs/TransactionUtils.js index 6b6d025cee23..5eeb5d143e68 100644 --- a/src/libs/TransactionUtils.js +++ b/src/libs/TransactionUtils.js @@ -2,6 +2,20 @@ import CONST from '../CONST'; import DateUtils from './DateUtils'; import * as NumberUtils from './NumberUtils'; +/** + * Optimistically generate a receipt. + * + * @param {Object} receipt + * @returns {Object} + */ +function buildOptimisticReceipt(receipt) { + return ({ + receiptID: NumberUtils.rand64(), + source: receipt.source, + state: CONST.IOU.RECEIPT_STATE.SCANREADY, + }); +} + /** * Optimistically generate a transaction. * @@ -37,28 +51,10 @@ function buildOptimisticTransaction(amount, currency, reportID, comment = '', so merchant, created: DateUtils.getDBTime(), pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, - receipt, + ...(receipt ? {receipt: buildOptimisticReceipt(receipt)} : {}), }; } -/** - * Optimistically generate a receipt. - * - * @param {Object} receipt - * @returns {Object} - */ -function buildOptimisticReceipt(receipt) { - if (!receipt) { - return; - } - - return ({ - receiptID: NumberUtils.rand64(), - source: receipt.source, - state: CONST.IOU.RECEIPT_STATE.SCANREADY, - }); -} - export default { buildOptimisticTransaction, buildOptimisticReceipt, diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index 5c70c6871469..a86fa8355127 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -19,7 +19,6 @@ import TransactionUtils from '../TransactionUtils'; import * as ErrorUtils from '../ErrorUtils'; import * as UserUtils from '../UserUtils'; import * as Report from './Report'; -import * as NumberUtils from '../NumberUtils'; let allReports; Onyx.connect({ From af581b451be28acfd4247adc85ee11aff3445a52 Mon Sep 17 00:00:00 2001 From: Carlos Martins Date: Thu, 27 Jul 2023 16:19:53 -0600 Subject: [PATCH 04/18] add receipt to buildOptimisticIOUReportAction --- src/libs/ReportUtils.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libs/ReportUtils.js b/src/libs/ReportUtils.js index afe31042330d..2ff5a952d977 100644 --- a/src/libs/ReportUtils.js +++ b/src/libs/ReportUtils.js @@ -20,6 +20,7 @@ import isReportMessageAttachment from './isReportMessageAttachment'; import * as defaultWorkspaceAvatars from '../components/Icon/WorkspaceDefaultAvatars'; import * as CurrencyUtils from './CurrencyUtils'; import * as UserUtils from './UserUtils'; +import TransactionUtils from './TransactionUtils'; let currentUserEmail; let currentUserAccountID; @@ -1758,7 +1759,7 @@ function buildOptimisticIOUReportAction(type, amount, currency, comment, partici shouldShow: true, created: DateUtils.getDBTime(), pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, - receipt, + ...(receipt ? {receipt: TransactionUtils.buildOptimisticReceipt(receipt)} : {}), }; } From 1f7f7bddc34b24ac7e63325623b71aba36672d7f Mon Sep 17 00:00:00 2001 From: Carlos Martins Date: Thu, 27 Jul 2023 16:25:11 -0600 Subject: [PATCH 05/18] create single optimisticReceipt --- src/libs/ReportUtils.js | 4 ++-- src/libs/TransactionUtils.js | 8 ++++++-- src/libs/actions/IOU.js | 7 ++++--- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/libs/ReportUtils.js b/src/libs/ReportUtils.js index 2ff5a952d977..98ac5c379f05 100644 --- a/src/libs/ReportUtils.js +++ b/src/libs/ReportUtils.js @@ -1713,7 +1713,7 @@ function getIOUReportActionMessage(type, total, comment, currency, paymentType = * @param {Object} [receipt] * @returns {Object} */ -function buildOptimisticIOUReportAction(type, amount, currency, comment, participants, transactionID, paymentType = '', iouReportID = '', isSettlingUp = false, isSendMoneyFlow = false, receipt = undefined) { +function buildOptimisticIOUReportAction(type, amount, currency, comment, participants, transactionID, paymentType = '', iouReportID = '', isSettlingUp = false, isSendMoneyFlow = false, receipt = {}) { const IOUReportID = iouReportID || generateReportID(); const originalMessage = { @@ -1759,7 +1759,7 @@ function buildOptimisticIOUReportAction(type, amount, currency, comment, partici shouldShow: true, created: DateUtils.getDBTime(), pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, - ...(receipt ? {receipt: TransactionUtils.buildOptimisticReceipt(receipt)} : {}), + receipt, }; } diff --git a/src/libs/TransactionUtils.js b/src/libs/TransactionUtils.js index 5eeb5d143e68..f35b63ac23e5 100644 --- a/src/libs/TransactionUtils.js +++ b/src/libs/TransactionUtils.js @@ -9,6 +9,10 @@ import * as NumberUtils from './NumberUtils'; * @returns {Object} */ function buildOptimisticReceipt(receipt) { + if (!receipt) { + return {}; + } + return ({ receiptID: NumberUtils.rand64(), source: receipt.source, @@ -29,7 +33,7 @@ function buildOptimisticReceipt(receipt) { * @param {Object} [receipt] * @returns {Object} */ -function buildOptimisticTransaction(amount, currency, reportID, comment = '', source = '', originalTransactionID = '', merchant = CONST.REPORT.TYPE.IOU, receipt = undefined) { +function buildOptimisticTransaction(amount, currency, reportID, comment = '', source = '', originalTransactionID = '', merchant = CONST.REPORT.TYPE.IOU, receipt = {}) { // transactionIDs are random, positive, 64-bit numeric strings. // Because JS can only handle 53-bit numbers, transactionIDs are strings in the front-end (just like reportActionID) const transactionID = NumberUtils.rand64(); @@ -51,7 +55,7 @@ function buildOptimisticTransaction(amount, currency, reportID, comment = '', so merchant, created: DateUtils.getDBTime(), pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, - ...(receipt ? {receipt: buildOptimisticReceipt(receipt)} : {}), + receipt, }; } diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index a86fa8355127..359e9ff0e165 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -343,8 +343,9 @@ function requestMoney(report, amount, currency, payeeEmail, payeeAccountID, part : ReportUtils.buildOptimisticIOUReport(payeeAccountID, payerAccountID, amount, chatReport.reportID, currency); } - // STEP 3: Build optimistic transaction - const optimisticTransaction = TransactionUtils.buildOptimisticTransaction(amount, currency, iouReport.reportID, comment, receipt); + // STEP 3: Build optimistic receipt (if available) and transaction + const optimisticReceipt = TransactionUtils.buildOptimisticReceipt(receipt); + const optimisticTransaction = TransactionUtils.buildOptimisticTransaction(amount, currency, iouReport.reportID, comment, optimisticReceipt); // STEP 4: Build optimistic reportActions. We need: // 1. CREATED action for the chatReport @@ -363,7 +364,7 @@ function requestMoney(report, amount, currency, payeeEmail, payeeAccountID, part optimisticTransaction.transactionID, '', iouReport.reportID, - receipt, + optimisticReceipt, ); // Add optimistic personal details for participant From 3715973fb31f70b29df78fa3746de54f075bb97e Mon Sep 17 00:00:00 2001 From: Carlos Martins Date: Thu, 27 Jul 2023 16:25:32 -0600 Subject: [PATCH 06/18] rm unsued import --- src/libs/ReportUtils.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libs/ReportUtils.js b/src/libs/ReportUtils.js index 98ac5c379f05..3cd4262a56b1 100644 --- a/src/libs/ReportUtils.js +++ b/src/libs/ReportUtils.js @@ -20,7 +20,6 @@ import isReportMessageAttachment from './isReportMessageAttachment'; import * as defaultWorkspaceAvatars from '../components/Icon/WorkspaceDefaultAvatars'; import * as CurrencyUtils from './CurrencyUtils'; import * as UserUtils from './UserUtils'; -import TransactionUtils from './TransactionUtils'; let currentUserEmail; let currentUserAccountID; From 991fc6af82c53ec539ee2b27f89572e2ab39564a Mon Sep 17 00:00:00 2001 From: Carlos Martins Date: Thu, 27 Jul 2023 16:28:04 -0600 Subject: [PATCH 07/18] add more checks to buildOptimisticReceipt --- src/libs/TransactionUtils.js | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/libs/TransactionUtils.js b/src/libs/TransactionUtils.js index f35b63ac23e5..5f973b58549d 100644 --- a/src/libs/TransactionUtils.js +++ b/src/libs/TransactionUtils.js @@ -2,24 +2,6 @@ import CONST from '../CONST'; import DateUtils from './DateUtils'; import * as NumberUtils from './NumberUtils'; -/** - * Optimistically generate a receipt. - * - * @param {Object} receipt - * @returns {Object} - */ -function buildOptimisticReceipt(receipt) { - if (!receipt) { - return {}; - } - - return ({ - receiptID: NumberUtils.rand64(), - source: receipt.source, - state: CONST.IOU.RECEIPT_STATE.SCANREADY, - }); -} - /** * Optimistically generate a transaction. * @@ -59,6 +41,24 @@ function buildOptimisticTransaction(amount, currency, reportID, comment = '', so }; } +/** + * Optimistically generate a receipt. + * + * @param {Object} receipt + * @returns {Object} + */ +function buildOptimisticReceipt(receipt) { + if (!receipt || !receipt.source) { + return {}; + } + + return ({ + receiptID: NumberUtils.rand64(), + source: receipt.source, + state: CONST.IOU.RECEIPT_STATE.SCANREADY, + }); +} + export default { buildOptimisticTransaction, buildOptimisticReceipt, From 7c882715da78b4cdaf8e719f6f5ec0ff6b0cf7d6 Mon Sep 17 00:00:00 2001 From: Carlos Martins Date: Thu, 27 Jul 2023 16:34:46 -0600 Subject: [PATCH 08/18] update comment --- src/libs/actions/IOU.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index 359e9ff0e165..5275f386cd9b 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -343,7 +343,7 @@ function requestMoney(report, amount, currency, payeeEmail, payeeAccountID, part : ReportUtils.buildOptimisticIOUReport(payeeAccountID, payerAccountID, amount, chatReport.reportID, currency); } - // STEP 3: Build optimistic receipt (if available) and transaction + // STEP 3: Build optimistic receipt and transaction const optimisticReceipt = TransactionUtils.buildOptimisticReceipt(receipt); const optimisticTransaction = TransactionUtils.buildOptimisticTransaction(amount, currency, iouReport.reportID, comment, optimisticReceipt); From c075113b65566094a17e57093df5c1236d88fde2 Mon Sep 17 00:00:00 2001 From: Carlos Martins Date: Thu, 27 Jul 2023 16:39:21 -0600 Subject: [PATCH 09/18] fix style --- src/CONST.js | 2 +- src/libs/ReportUtils.js | 14 +++++++++++++- src/libs/TransactionUtils.js | 6 +++--- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/CONST.js b/src/CONST.js index 71ff3cec148e..224bc7638ae6 100755 --- a/src/CONST.js +++ b/src/CONST.js @@ -1059,7 +1059,7 @@ const CONST = { AMOUNT_MAX_LENGTH: 10, RECEIPT_STATE: { SCANREADY: 'SCANREADY', - } + }, }, GROWL: { diff --git a/src/libs/ReportUtils.js b/src/libs/ReportUtils.js index 3cd4262a56b1..364fb9d3d93e 100644 --- a/src/libs/ReportUtils.js +++ b/src/libs/ReportUtils.js @@ -1712,7 +1712,19 @@ function getIOUReportActionMessage(type, total, comment, currency, paymentType = * @param {Object} [receipt] * @returns {Object} */ -function buildOptimisticIOUReportAction(type, amount, currency, comment, participants, transactionID, paymentType = '', iouReportID = '', isSettlingUp = false, isSendMoneyFlow = false, receipt = {}) { +function buildOptimisticIOUReportAction( + type, + amount, + currency, + comment, + participants, + transactionID, + paymentType = '', + iouReportID = '', + isSettlingUp = false, + isSendMoneyFlow = false, + receipt = {}, +) { const IOUReportID = iouReportID || generateReportID(); const originalMessage = { diff --git a/src/libs/TransactionUtils.js b/src/libs/TransactionUtils.js index 5f973b58549d..364da084001d 100644 --- a/src/libs/TransactionUtils.js +++ b/src/libs/TransactionUtils.js @@ -44,7 +44,7 @@ function buildOptimisticTransaction(amount, currency, reportID, comment = '', so /** * Optimistically generate a receipt. * - * @param {Object} receipt + * @param {Object} receipt * @returns {Object} */ function buildOptimisticReceipt(receipt) { @@ -52,11 +52,11 @@ function buildOptimisticReceipt(receipt) { return {}; } - return ({ + return { receiptID: NumberUtils.rand64(), source: receipt.source, state: CONST.IOU.RECEIPT_STATE.SCANREADY, - }); + }; } export default { From 0a3cd9b3cf2b19017e1d6b7412a730cf67944f43 Mon Sep 17 00:00:00 2001 From: Carlos Martins Date: Mon, 31 Jul 2023 15:49:58 -0600 Subject: [PATCH 10/18] rm buildOptimisticReceipt --- src/libs/TransactionUtils.js | 19 ------------------- src/libs/actions/IOU.js | 10 +++++++--- 2 files changed, 7 insertions(+), 22 deletions(-) diff --git a/src/libs/TransactionUtils.js b/src/libs/TransactionUtils.js index 364da084001d..f88f53467ae8 100644 --- a/src/libs/TransactionUtils.js +++ b/src/libs/TransactionUtils.js @@ -41,25 +41,6 @@ function buildOptimisticTransaction(amount, currency, reportID, comment = '', so }; } -/** - * Optimistically generate a receipt. - * - * @param {Object} receipt - * @returns {Object} - */ -function buildOptimisticReceipt(receipt) { - if (!receipt || !receipt.source) { - return {}; - } - - return { - receiptID: NumberUtils.rand64(), - source: receipt.source, - state: CONST.IOU.RECEIPT_STATE.SCANREADY, - }; -} - export default { buildOptimisticTransaction, - buildOptimisticReceipt, }; diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index 5275f386cd9b..50cfc2c3e50b 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -344,8 +344,12 @@ function requestMoney(report, amount, currency, payeeEmail, payeeAccountID, part } // STEP 3: Build optimistic receipt and transaction - const optimisticReceipt = TransactionUtils.buildOptimisticReceipt(receipt); - const optimisticTransaction = TransactionUtils.buildOptimisticTransaction(amount, currency, iouReport.reportID, comment, optimisticReceipt); + const receiptObject = {}; + if (receipt && receipt.source) { + receiptObject.source = receipt.source; + receiptObject.state = CONST.IOU.RECEIPT_STATE.SCANREADY; + } + const optimisticTransaction = TransactionUtils.buildOptimisticTransaction(amount, currency, iouReport.reportID, comment, receiptObject); // STEP 4: Build optimistic reportActions. We need: // 1. CREATED action for the chatReport @@ -364,7 +368,7 @@ function requestMoney(report, amount, currency, payeeEmail, payeeAccountID, part optimisticTransaction.transactionID, '', iouReport.reportID, - optimisticReceipt, + receiptObject, ); // Add optimistic personal details for participant From 448813c809ad477a3cdaeebfc363fb5a4d1283a7 Mon Sep 17 00:00:00 2001 From: Carlos Martins Date: Tue, 1 Aug 2023 14:34:30 -0600 Subject: [PATCH 11/18] create readFileAsync --- src/libs/fileDownload/FileUtils.js | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/libs/fileDownload/FileUtils.js b/src/libs/fileDownload/FileUtils.js index 81dcfa933660..f953544f651d 100644 --- a/src/libs/fileDownload/FileUtils.js +++ b/src/libs/fileDownload/FileUtils.js @@ -118,4 +118,31 @@ function cleanFileName(fileName) { return fileName.replace(/[^a-zA-Z0-9\-._]/g, '_'); } -export {showGeneralErrorAlert, showSuccessAlert, showPermissionErrorAlert, splitExtensionFromFileName, getAttachmentName, getFileType, cleanFileName}; +/** + * Returns the filename replacing special characters with underscore + * + * @param {String} path - the blob url of the locally uplodaded file + * @param {String} fileName + * @returns {Promise} + */ +const readFileAsync = (path, fileName) => + new Promise((resolve) => { + if (!path) { + resolve(); + } + + return fetch(path) + .then(res => { + if (!res.ok) { + throw Error(res.statusText); + } + return res.blob(); + }) + .then(blob => resolve(new File([blob], cleanFileName(fileName) || 'file'))) + .catch((e) => { + console.debug('[FileUtils] Could not read uploaded file', e); + resolve(); + }) + }) + +export {showGeneralErrorAlert, showSuccessAlert, showPermissionErrorAlert, splitExtensionFromFileName, getAttachmentName, getFileType, cleanFileName, readFileAsync}; From 43922f76ed91737c354ac940b295f2a8440e3700 Mon Sep 17 00:00:00 2001 From: Carlos Martins Date: Tue, 1 Aug 2023 14:35:16 -0600 Subject: [PATCH 12/18] update comment --- src/libs/fileDownload/FileUtils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/fileDownload/FileUtils.js b/src/libs/fileDownload/FileUtils.js index f953544f651d..7206fa0ec94b 100644 --- a/src/libs/fileDownload/FileUtils.js +++ b/src/libs/fileDownload/FileUtils.js @@ -119,7 +119,7 @@ function cleanFileName(fileName) { } /** - * Returns the filename replacing special characters with underscore + * Reads a locally uploaded file * * @param {String} path - the blob url of the locally uplodaded file * @param {String} fileName From 551af16532fdc91d13181b34dad33b7abbd05aca Mon Sep 17 00:00:00 2001 From: Carlos Martins Date: Tue, 1 Aug 2023 14:40:41 -0600 Subject: [PATCH 13/18] read uploaded receipt --- .../iou/steps/MoneyRequestConfirmPage.js | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/pages/iou/steps/MoneyRequestConfirmPage.js b/src/pages/iou/steps/MoneyRequestConfirmPage.js index 4816a395780a..9f5151ae280d 100644 --- a/src/pages/iou/steps/MoneyRequestConfirmPage.js +++ b/src/pages/iou/steps/MoneyRequestConfirmPage.js @@ -20,6 +20,7 @@ import ONYXKEYS from '../../../ONYXKEYS'; import withCurrentUserPersonalDetails, {withCurrentUserPersonalDetailsDefaultProps, withCurrentUserPersonalDetailsPropTypes} from '../../../components/withCurrentUserPersonalDetails'; import reportPropTypes from '../../reportPropTypes'; import personalDetailsPropType from '../../personalDetailsPropType'; +import * as FileUtils from '../../../libs/fileDownload/FileUtils'; const propTypes = { report: reportPropTypes, @@ -140,17 +141,21 @@ function MoneyRequestConfirmPage(props) { return; } - IOU.requestMoney( - props.report, - props.iou.amount, - props.iou.currency, - props.currentUserPersonalDetails.login, - props.currentUserPersonalDetails.accountID, - selectedParticipants[0], - trimmedComment, - ); + FileUtils.readFileAsync(props.iou.receiptPath, props.iou.receiptSource) + .then(receipt => { + IOU.requestMoney( + props.report, + props.iou.amount, + props.iou.currency, + props.currentUserPersonalDetails.login, + props.currentUserPersonalDetails.accountID, + selectedParticipants[0], + trimmedComment, + receipt, + ); + }) }, - [props.iou.amount, props.iou.comment, props.currentUserPersonalDetails.login, props.currentUserPersonalDetails.accountID, props.iou.currency, props.report], + [props.iou.amount, props.iou.comment, props.currentUserPersonalDetails.login, props.currentUserPersonalDetails.accountID, props.iou.currency, props.report, props.iou.receiptPath, props.iou.receiptSource], ); /** From bbeb8cc5410e3782b80bc15ba5555e5f7d1472c7 Mon Sep 17 00:00:00 2001 From: Carlos Martins Date: Tue, 1 Aug 2023 14:56:30 -0600 Subject: [PATCH 14/18] fix style --- src/libs/fileDownload/FileUtils.js | 10 +++--- .../iou/steps/MoneyRequestConfirmPage.js | 36 +++++++++++-------- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/src/libs/fileDownload/FileUtils.js b/src/libs/fileDownload/FileUtils.js index 26aa924045c9..ab9d6fae6760 100644 --- a/src/libs/fileDownload/FileUtils.js +++ b/src/libs/fileDownload/FileUtils.js @@ -138,24 +138,24 @@ function appendTimeToFileName(fileName) { * @param {String} fileName * @returns {Promise} */ -const readFileAsync = (path, fileName) => +const readFileAsync = (path, fileName) => new Promise((resolve) => { if (!path) { resolve(); } return fetch(path) - .then(res => { + .then((res) => { if (!res.ok) { throw Error(res.statusText); } return res.blob(); }) - .then(blob => resolve(new File([blob], cleanFileName(fileName) || 'file'))) + .then((blob) => resolve(new File([blob], cleanFileName(fileName) || 'file'))) .catch((e) => { console.debug('[FileUtils] Could not read uploaded file', e); resolve(); - }) - }) + }); + }); export {showGeneralErrorAlert, showSuccessAlert, showPermissionErrorAlert, splitExtensionFromFileName, getAttachmentName, getFileType, cleanFileName, appendTimeToFileName, readFileAsync}; diff --git a/src/pages/iou/steps/MoneyRequestConfirmPage.js b/src/pages/iou/steps/MoneyRequestConfirmPage.js index 9f5151ae280d..42f54687c514 100644 --- a/src/pages/iou/steps/MoneyRequestConfirmPage.js +++ b/src/pages/iou/steps/MoneyRequestConfirmPage.js @@ -141,21 +141,29 @@ function MoneyRequestConfirmPage(props) { return; } - FileUtils.readFileAsync(props.iou.receiptPath, props.iou.receiptSource) - .then(receipt => { - IOU.requestMoney( - props.report, - props.iou.amount, - props.iou.currency, - props.currentUserPersonalDetails.login, - props.currentUserPersonalDetails.accountID, - selectedParticipants[0], - trimmedComment, - receipt, - ); - }) + FileUtils.readFileAsync(props.iou.receiptPath, props.iou.receiptSource).then((receipt) => { + IOU.requestMoney( + props.report, + props.iou.amount, + props.iou.currency, + props.currentUserPersonalDetails.login, + props.currentUserPersonalDetails.accountID, + selectedParticipants[0], + trimmedComment, + receipt, + ); + }); }, - [props.iou.amount, props.iou.comment, props.currentUserPersonalDetails.login, props.currentUserPersonalDetails.accountID, props.iou.currency, props.report, props.iou.receiptPath, props.iou.receiptSource], + [ + props.iou.amount, + props.iou.comment, + props.currentUserPersonalDetails.login, + props.currentUserPersonalDetails.accountID, + props.iou.currency, + props.report, + props.iou.receiptPath, + props.iou.receiptSource, + ], ); /** From 71a848187da25e733cf128c2f5a849a1f170ee62 Mon Sep 17 00:00:00 2001 From: Carlos Martins Date: Tue, 1 Aug 2023 16:20:59 -0600 Subject: [PATCH 15/18] add path to file --- src/libs/actions/IOU.js | 1 + src/libs/fileDownload/FileUtils.js | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index 3dd249c8cb14..a77a6dd255bc 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -300,6 +300,7 @@ function buildOnyxDataForMoneyRequest( * */ function requestMoney(report, amount, currency, payeeEmail, payeeAccountID, participant, comment, receipt = undefined) { + console.log('over here', receipt) const payerEmail = OptionsListUtils.addSMSDomainIfPhoneNumber(participant.login); const payerAccountID = Number(participant.accountID); const isPolicyExpenseChat = participant.isPolicyExpenseChat; diff --git a/src/libs/fileDownload/FileUtils.js b/src/libs/fileDownload/FileUtils.js index ab9d6fae6760..4d714fff4f24 100644 --- a/src/libs/fileDownload/FileUtils.js +++ b/src/libs/fileDownload/FileUtils.js @@ -151,7 +151,11 @@ const readFileAsync = (path, fileName) => } return res.blob(); }) - .then((blob) => resolve(new File([blob], cleanFileName(fileName) || 'file'))) + .then((blob) => { + const file = new File([blob], cleanFileName(fileName)); + file.source = path; + resolve(file); + }) .catch((e) => { console.debug('[FileUtils] Could not read uploaded file', e); resolve(); From 0c5f0c26a6bc6e855a1ad86f3273901f690fef7c Mon Sep 17 00:00:00 2001 From: Carlos Martins Date: Tue, 1 Aug 2023 16:29:17 -0600 Subject: [PATCH 16/18] pass receipt as correct param --- src/libs/actions/IOU.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index a77a6dd255bc..aa7d595473af 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -300,7 +300,6 @@ function buildOnyxDataForMoneyRequest( * */ function requestMoney(report, amount, currency, payeeEmail, payeeAccountID, participant, comment, receipt = undefined) { - console.log('over here', receipt) const payerEmail = OptionsListUtils.addSMSDomainIfPhoneNumber(participant.login); const payerAccountID = Number(participant.accountID); const isPolicyExpenseChat = participant.isPolicyExpenseChat; @@ -350,7 +349,7 @@ function requestMoney(report, amount, currency, payeeEmail, payeeAccountID, part receiptObject.source = receipt.source; receiptObject.state = CONST.IOU.RECEIPT_STATE.SCANREADY; } - const optimisticTransaction = TransactionUtils.buildOptimisticTransaction(amount, currency, iouReport.reportID, comment, receiptObject); + const optimisticTransaction = TransactionUtils.buildOptimisticTransaction(amount, currency, iouReport.reportID, comment, '', '', '', receiptObject); // STEP 4: Build optimistic reportActions. We need: // 1. CREATED action for the chatReport From 576c4de48d5ab853c521250a2d76ee0adb45f36e Mon Sep 17 00:00:00 2001 From: Carlos Martins Date: Tue, 1 Aug 2023 17:22:58 -0600 Subject: [PATCH 17/18] fix tests --- src/libs/actions/IOU.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index aa7d595473af..55a16154d914 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -349,7 +349,7 @@ function requestMoney(report, amount, currency, payeeEmail, payeeAccountID, part receiptObject.source = receipt.source; receiptObject.state = CONST.IOU.RECEIPT_STATE.SCANREADY; } - const optimisticTransaction = TransactionUtils.buildOptimisticTransaction(amount, currency, iouReport.reportID, comment, '', '', '', receiptObject); + const optimisticTransaction = TransactionUtils.buildOptimisticTransaction(amount, currency, iouReport.reportID, comment, '', '', undefined, receiptObject); // STEP 4: Build optimistic reportActions. We need: // 1. CREATED action for the chatReport From 68afecf5a02a69e5f11bb528eaa1c4e8dc6e3f77 Mon Sep 17 00:00:00 2001 From: Carlos Martins Date: Thu, 3 Aug 2023 11:11:46 -0600 Subject: [PATCH 18/18] only call readfile when receipt is present --- .../iou/steps/MoneyRequestConfirmPage.js | 43 +++++++++++++------ 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/src/pages/iou/steps/MoneyRequestConfirmPage.js b/src/pages/iou/steps/MoneyRequestConfirmPage.js index 10bd7549389c..d8711de4fc1c 100644 --- a/src/pages/iou/steps/MoneyRequestConfirmPage.js +++ b/src/pages/iou/steps/MoneyRequestConfirmPage.js @@ -110,6 +110,27 @@ function MoneyRequestConfirmPage(props) { Navigation.goBack(fallback); }; + /** + * @param {Array} selectedParticipants + * @param {String} trimmedComment + * @param {File} [receipt] + */ + const requestMoney = useCallback( + (selectedParticipants, trimmedComment, receipt) => { + IOU.requestMoney( + props.report, + props.iou.amount, + props.iou.currency, + props.currentUserPersonalDetails.login, + props.currentUserPersonalDetails.accountID, + selectedParticipants[0], + trimmedComment, + receipt, + ); + }, + [props.report, props.iou.amount, props.iou.currency, props.currentUserPersonalDetails.login, props.currentUserPersonalDetails.accountID], + ); + const createTransaction = useCallback( (selectedParticipants) => { const trimmedComment = props.iou.comment.trim(); @@ -142,18 +163,14 @@ function MoneyRequestConfirmPage(props) { return; } - FileUtils.readFileAsync(props.iou.receiptPath, props.iou.receiptSource).then((receipt) => { - IOU.requestMoney( - props.report, - props.iou.amount, - props.iou.currency, - props.currentUserPersonalDetails.login, - props.currentUserPersonalDetails.accountID, - selectedParticipants[0], - trimmedComment, - receipt, - ); - }); + if (props.iou.receiptPath && props.iou.receiptSource) { + FileUtils.readFileAsync(props.iou.receiptPath, props.iou.receiptSource).then((receipt) => { + requestMoney(selectedParticipants, trimmedComment, receipt); + }); + return; + } + + requestMoney(selectedParticipants, trimmedComment); }, [ props.iou.amount, @@ -161,9 +178,9 @@ function MoneyRequestConfirmPage(props) { props.currentUserPersonalDetails.login, props.currentUserPersonalDetails.accountID, props.iou.currency, - props.report, props.iou.receiptPath, props.iou.receiptSource, + requestMoney, ], );