diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index f585089e1fd2..973bd9132e2c 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -610,6 +610,7 @@ type CreateDistanceRequestInformation = { backToReport?: string; isASAPSubmitBetaEnabled: boolean; transactionViolations: OnyxCollection; + quickAction: OnyxEntry; }; type CreateSplitsTransactionParams = Omit & { @@ -627,6 +628,7 @@ type CreateSplitsAndOnyxDataParams = { policyRecentlyUsedCategories?: OnyxEntry; isASAPSubmitBetaEnabled: boolean; transactionViolations: OnyxCollection; + quickAction: OnyxEntry; }; type TrackExpenseTransactionParams = { @@ -760,6 +762,7 @@ type StartSplitBilActionParams = { taxAmount: number; shouldPlaySound?: boolean; policyRecentlyUsedCategories?: OnyxEntry; + quickAction: OnyxEntry; }; type UpdateSplitTransactionsParams = { @@ -6975,6 +6978,7 @@ function createSplitsAndOnyxData({ policyRecentlyUsedCategories, isASAPSubmitBetaEnabled, transactionViolations, + quickAction, }: CreateSplitsAndOnyxDataParams): SplitsAndOnyxData { const currentUserEmailForIOUSplit = addSMSDomainIfPhoneNumber(currentUserLogin); const participantAccountIDs = participants.map((participant) => Number(participant.accountID)); @@ -7057,7 +7061,7 @@ function createSplitsAndOnyxData({ value: { action: iouRequestType === CONST.IOU.REQUEST_TYPE.DISTANCE ? CONST.QUICK_ACTIONS.SPLIT_DISTANCE : CONST.QUICK_ACTIONS.SPLIT_MANUAL, chatReportID: splitChatReport.reportID, - isFirstQuickAction: isEmptyObject(deprecatedQuickAction), + isFirstQuickAction: isEmptyObject(quickAction), }, }, existingSplitChatReport @@ -7141,7 +7145,7 @@ function createSplitsAndOnyxData({ { onyxMethod: Onyx.METHOD.SET, key: ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE, - value: deprecatedQuickAction ?? null, + value: quickAction ?? null, }, ]; @@ -7465,6 +7469,7 @@ type SplitBillActionsParams = { policyRecentlyUsedCategories?: OnyxEntry; isASAPSubmitBetaEnabled: boolean; transactionViolations: OnyxCollection; + quickAction: OnyxEntry; }; /** @@ -7492,6 +7497,7 @@ function splitBill({ policyRecentlyUsedCategories, isASAPSubmitBetaEnabled, transactionViolations, + quickAction, }: SplitBillActionsParams) { const parsedComment = getParsedComment(comment); const {splitData, splits, onyxData} = createSplitsAndOnyxData({ @@ -7517,6 +7523,7 @@ function splitBill({ policyRecentlyUsedCategories, isASAPSubmitBetaEnabled, transactionViolations, + quickAction, }); const parameters: SplitBillParams = { @@ -7575,6 +7582,7 @@ function splitBillAndOpenReport({ policyRecentlyUsedCategories, isASAPSubmitBetaEnabled, transactionViolations, + quickAction, }: SplitBillActionsParams) { const parsedComment = getParsedComment(comment); const {splitData, splits, onyxData} = createSplitsAndOnyxData({ @@ -7600,6 +7608,7 @@ function splitBillAndOpenReport({ }, policyRecentlyUsedCategories, transactionViolations, + quickAction, }); const parameters: SplitBillParams = { @@ -7654,6 +7663,7 @@ function startSplitBill({ taxAmount = 0, shouldPlaySound = true, policyRecentlyUsedCategories, + quickAction, }: StartSplitBilActionParams) { const currentUserEmailForIOUSplit = addSMSDomainIfPhoneNumber(currentUserLogin); const participantAccountIDs = participants.map((participant) => Number(participant.accountID)); @@ -7718,7 +7728,7 @@ function startSplitBill({ value: { action: CONST.QUICK_ACTIONS.SPLIT_SCAN, chatReportID: splitChatReport.reportID, - isFirstQuickAction: isEmptyObject(deprecatedQuickAction), + isFirstQuickAction: isEmptyObject(quickAction), }, }, existingSplitChatReport @@ -7800,7 +7810,7 @@ function startSplitBill({ { onyxMethod: Onyx.METHOD.SET, key: ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE, - value: deprecatedQuickAction ?? null, + value: quickAction ?? null, }, ]; @@ -7818,6 +7828,7 @@ function startSplitBill({ currency, taxCode, taxAmount, + quickAction, }; if (existingSplitChatReport) { @@ -8309,6 +8320,7 @@ function createDistanceRequest(distanceRequestInformation: CreateDistanceRequest backToReport, isASAPSubmitBetaEnabled, transactionViolations, + quickAction, } = distanceRequestInformation; const {policy, policyCategories, policyTagList, policyRecentlyUsedCategories} = policyParams; const parsedComment = getParsedComment(transactionParams.comment); @@ -8377,6 +8389,7 @@ function createDistanceRequest(distanceRequestInformation: CreateDistanceRequest policyRecentlyUsedCategories, isASAPSubmitBetaEnabled, transactionViolations, + quickAction, }); onyxData = splitOnyxData; diff --git a/src/pages/iou/request/step/IOURequestStepConfirmation.tsx b/src/pages/iou/request/step/IOURequestStepConfirmation.tsx index 024c95fad2ac..a32e104d9384 100644 --- a/src/pages/iou/request/step/IOURequestStepConfirmation.tsx +++ b/src/pages/iou/request/step/IOURequestStepConfirmation.tsx @@ -804,6 +804,7 @@ function IOURequestStepConfirmation({ backToReport, isASAPSubmitBetaEnabled, transactionViolations, + quickAction, }); }, [ @@ -824,6 +825,7 @@ function IOURequestStepConfirmation({ backToReport, isASAPSubmitBetaEnabled, transactionViolations, + quickAction, ], ); @@ -888,6 +890,7 @@ function IOURequestStepConfirmation({ taxAmount: transactionTaxAmount, shouldPlaySound: index === transactions.length - 1, policyRecentlyUsedCategories, + quickAction, }); } } @@ -919,6 +922,7 @@ function IOURequestStepConfirmation({ policyRecentlyUsedCategories, isASAPSubmitBetaEnabled, transactionViolations, + quickAction, }); } return; @@ -947,6 +951,7 @@ function IOURequestStepConfirmation({ policyRecentlyUsedCategories, isASAPSubmitBetaEnabled, transactionViolations, + quickAction, }); } return; @@ -1063,9 +1068,9 @@ function IOURequestStepConfirmation({ [ iouType, transaction, - transactions, isDistanceRequest, isMovingTransactionFromTrackExpense, + isUnreported, receiptFiles, isCategorizingTrackExpense, isSharingTrackExpense, @@ -1074,21 +1079,22 @@ function IOURequestStepConfirmation({ createDistanceRequest, currentUserPersonalDetails.login, currentUserPersonalDetails.accountID, + transactions, report, transactionTaxCode, transactionTaxAmount, + policyRecentlyUsedCategories, + quickAction, + isASAPSubmitBetaEnabled, + transactionViolations, + receiverParticipantAccountID, + existingInvoiceReport, policy, policyTags, policyCategories, - policyRecentlyUsedCategories, trackExpense, userLocation, submitPerDiemExpense, - existingInvoiceReport, - isUnreported, - isASAPSubmitBetaEnabled, - receiverParticipantAccountID, - transactionViolations, ], ); diff --git a/src/pages/iou/request/step/IOURequestStepDistance.tsx b/src/pages/iou/request/step/IOURequestStepDistance.tsx index 688e36f090fd..ab1a86fdad86 100644 --- a/src/pages/iou/request/step/IOURequestStepDistance.tsx +++ b/src/pages/iou/request/step/IOURequestStepDistance.tsx @@ -93,6 +93,7 @@ function IOURequestStepDistance({ const defaultExpensePolicy = useDefaultExpensePolicy(); const [skipConfirmation] = useOnyx(`${ONYXKEYS.COLLECTION.SKIP_CONFIRMATION}${transactionID}`, {canBeMissing: false}); const [lastSelectedDistanceRates] = useOnyx(ONYXKEYS.NVP_LAST_SELECTED_DISTANCE_RATES, {canBeMissing: true}); + const [quickAction] = useOnyx(ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE, {canBeMissing: true}); const [optimisticWaypoints, setOptimisticWaypoints] = useState(null); const waypoints = useMemo( () => @@ -379,6 +380,7 @@ function IOURequestStepDistance({ backToReport, isASAPSubmitBetaEnabled, transactionViolations, + quickAction, }); return; } @@ -446,6 +448,7 @@ function IOURequestStepDistance({ reportID, transactionViolations, currentUserPersonalDetails.accountID, + quickAction, ]); const getError = () => { diff --git a/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx b/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx index 21f11310d392..6257f5fed5f0 100644 --- a/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx +++ b/src/pages/iou/request/step/IOURequestStepDistanceManual.tsx @@ -88,6 +88,7 @@ function IOURequestStepDistanceManual({ const [lastSelectedDistanceRates] = useOnyx(ONYXKEYS.NVP_LAST_SELECTED_DISTANCE_RATES, {canBeMissing: true}); const [reportAttributesDerived] = useOnyx(ONYXKEYS.DERIVED.REPORT_ATTRIBUTES, {canBeMissing: true, selector: reportsSelector}); const [transactionViolations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, {canBeMissing: true}); + const [quickAction] = useOnyx(ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE, {canBeMissing: true}); const isEditing = action === CONST.IOU.ACTION.EDIT; const isCreatingNewRequest = !(backTo || isEditing); @@ -249,6 +250,7 @@ function IOURequestStepDistanceManual({ backToReport, isASAPSubmitBetaEnabled, transactionViolations, + quickAction, }); return; } @@ -314,6 +316,7 @@ function IOURequestStepDistanceManual({ personalPolicy?.autoReporting, transactionViolations, currentUserPersonalDetails.accountID, + quickAction, ], ); diff --git a/src/pages/iou/request/step/IOURequestStepDistanceMap.tsx b/src/pages/iou/request/step/IOURequestStepDistanceMap.tsx index 39d642525d04..fe08ffe11b80 100644 --- a/src/pages/iou/request/step/IOURequestStepDistanceMap.tsx +++ b/src/pages/iou/request/step/IOURequestStepDistanceMap.tsx @@ -94,6 +94,7 @@ function IOURequestStepDistanceMap({ const defaultExpensePolicy = useDefaultExpensePolicy(); const [skipConfirmation] = useOnyx(`${ONYXKEYS.COLLECTION.SKIP_CONFIRMATION}${transactionID}`, {canBeMissing: false}); const [lastSelectedDistanceRates] = useOnyx(ONYXKEYS.NVP_LAST_SELECTED_DISTANCE_RATES, {canBeMissing: true}); + const [quickAction] = useOnyx(ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE, {canBeMissing: true}); const [transactionViolations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, {canBeMissing: true}); const [optimisticWaypoints, setOptimisticWaypoints] = useState(null); const waypoints = useMemo( @@ -381,6 +382,7 @@ function IOURequestStepDistanceMap({ backToReport, isASAPSubmitBetaEnabled, transactionViolations, + quickAction, }); return; } @@ -448,6 +450,7 @@ function IOURequestStepDistanceMap({ reportID, transactionViolations, currentUserPersonalDetails.accountID, + quickAction, ]); const getError = () => { diff --git a/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx b/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx index 8bee5fe465e5..d1fbafe24393 100644 --- a/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx +++ b/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx @@ -122,6 +122,7 @@ function IOURequestStepScan({ const [skipConfirmation] = useOnyx(`${ONYXKEYS.COLLECTION.SKIP_CONFIRMATION}${initialTransactionID}`, {canBeMissing: true}); const defaultExpensePolicy = useDefaultExpensePolicy(); const [dismissedProductTraining] = useOnyx(ONYXKEYS.NVP_DISMISSED_PRODUCT_TRAINING, {canBeMissing: true}); + const [quickAction] = useOnyx(ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE, {canBeMissing: true}); const [reportAttributesDerived] = useOnyx(ONYXKEYS.DERIVED.REPORT_ATTRIBUTES, {canBeMissing: true, selector: reportsSelector}); const lazyIllustrations = useMemoizedLazyIllustrations(['MultiScan', 'Hand', 'Shutter']); const lazyIcons = useMemoizedLazyExpensifyIcons(['Bolt', 'Gallery', 'ReceiptMultiple', 'boltSlash']); @@ -440,6 +441,7 @@ function IOURequestStepScan({ currency: initialTransaction?.currency ?? 'USD', taxCode: transactionTaxCode, taxAmount: transactionTaxAmount, + quickAction, }); return; } @@ -531,21 +533,22 @@ function IOURequestStepScan({ initialTransaction?.reportID, reportNameValuePairs, iouType, - personalPolicy?.autoReporting, defaultExpensePolicy, report, initialTransactionID, navigateToConfirmationPage, + currentUserPersonalDetails.accountID, + currentUserPersonalDetails?.login, shouldSkipConfirmation, personalDetails, reportAttributesDerived, createTransaction, - currentUserPersonalDetails?.login, - currentUserPersonalDetails.accountID, reportID, transactionTaxCode, transactionTaxAmount, + quickAction, policy, + personalPolicy?.autoReporting, selfDMReportID, ], ); diff --git a/src/pages/iou/request/step/IOURequestStepScan/index.tsx b/src/pages/iou/request/step/IOURequestStepScan/index.tsx index c252af4be094..2de8c7d4ab56 100644 --- a/src/pages/iou/request/step/IOURequestStepScan/index.tsx +++ b/src/pages/iou/request/step/IOURequestStepScan/index.tsx @@ -123,6 +123,7 @@ function IOURequestStepScan({ const [skipConfirmation] = useOnyx(`${ONYXKEYS.COLLECTION.SKIP_CONFIRMATION}${initialTransactionID}`, {canBeMissing: true}); const defaultExpensePolicy = useDefaultExpensePolicy(); const [dismissedProductTraining] = useOnyx(ONYXKEYS.NVP_DISMISSED_PRODUCT_TRAINING, {canBeMissing: true}); + const [quickAction] = useOnyx(ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE, {canBeMissing: true}); const [reportAttributesDerived] = useOnyx(ONYXKEYS.DERIVED.REPORT_ATTRIBUTES, {canBeMissing: true, selector: reportsSelector}); const lazyIllustrations = useMemoizedLazyIllustrations(['MultiScan', 'Hand', 'ReceiptUpload', 'Shutter']); const lazyIcons = useMemoizedLazyExpensifyIcons(['Bolt', 'Gallery', 'ReceiptMultiple', 'boltSlash', 'ReplaceReceipt', 'SmartScan']); @@ -500,6 +501,7 @@ function IOURequestStepScan({ currency: initialTransaction?.currency ?? 'USD', taxCode: transactionTaxCode, taxAmount: transactionTaxAmount, + quickAction, }); return; } @@ -590,21 +592,22 @@ function IOURequestStepScan({ initialTransaction?.reportID, reportNameValuePairs, iouType, - personalPolicy?.autoReporting, defaultExpensePolicy, report, initialTransactionID, navigateToConfirmationPage, + currentUserPersonalDetails.accountID, + currentUserPersonalDetails?.login, shouldSkipConfirmation, personalDetails, reportAttributesDerived, createTransaction, - currentUserPersonalDetails?.login, - currentUserPersonalDetails.accountID, reportID, transactionTaxCode, transactionTaxAmount, + quickAction, policy, + personalPolicy?.autoReporting, selfDMReportID, ], ); diff --git a/tests/actions/IOUTest.ts b/tests/actions/IOUTest.ts index 84ca9b66982c..0b99d4308ef1 100644 --- a/tests/actions/IOUTest.ts +++ b/tests/actions/IOUTest.ts @@ -2196,6 +2196,7 @@ describe('actions/IOU', () => { }, isASAPSubmitBetaEnabled: false, transactionViolations: {}, + quickAction: undefined, }); expect(notifyNewAction).toHaveBeenCalledTimes(0); }); @@ -2215,11 +2216,56 @@ describe('actions/IOU', () => { }, isASAPSubmitBetaEnabled: false, transactionViolations: {}, + quickAction: undefined, }); expect(notifyNewAction).toHaveBeenCalledTimes(1); }); - }); + it('correctly sets quickAction', async () => { + createDistanceRequest({ + report: {reportID: '123', type: CONST.REPORT.TYPE.EXPENSE}, + iouType: CONST.IOU.TYPE.SPLIT, + participants: [], + transactionParams: { + amount: 1, + attendees: [], + currency: CONST.CURRENCY.USD, + + created: '', + merchant: '', + comment: '', + validWaypoints: {}, + }, + isASAPSubmitBetaEnabled: false, + transactionViolations: {}, + quickAction: undefined, + }); + await waitForBatchedUpdates(); + expect(await getOnyxValue(ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE)).toHaveProperty('isFirstQuickAction', true); + createDistanceRequest({ + report: {reportID: '123', type: CONST.REPORT.TYPE.EXPENSE}, + iouType: CONST.IOU.TYPE.SPLIT, + participants: [], + transactionParams: { + amount: 1, + attendees: [], + currency: CONST.CURRENCY.USD, + created: '', + merchant: '', + comment: '', + validWaypoints: {}, + }, + isASAPSubmitBetaEnabled: false, + transactionViolations: {}, + quickAction: {action: CONST.QUICK_ACTIONS.SEND_MONEY, chatReportID: '456'}, + }); + await waitForBatchedUpdates(); + expect(await getOnyxValue(ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE)).toMatchObject({ + action: CONST.QUICK_ACTIONS.SPLIT_DISTANCE, + isFirstQuickAction: false, + }); + }); + }); describe('split expense', () => { it('creates and updates new chats and IOUs as needed', () => { jest.setTimeout(10 * 1000); @@ -2389,6 +2435,7 @@ describe('actions/IOU', () => { existingSplitChatReportID: '', isASAPSubmitBetaEnabled: false, transactionViolations: {}, + quickAction: undefined, }, ); return waitForBatchedUpdates(); @@ -2723,6 +2770,7 @@ describe('actions/IOU', () => { existingSplitChatReportID: workspaceReportID, isASAPSubmitBetaEnabled: false, transactionViolations: {}, + quickAction: undefined, }); await waitForBatchedUpdates(); @@ -2750,6 +2798,52 @@ describe('actions/IOU', () => { }); }); + it('correctly sets quickAction', async () => { + // Given a expense chat with no expenses + const workspaceReportID = '1'; + await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${workspaceReportID}`, {reportID: workspaceReportID, isOwnPolicyExpenseChat: true}); + + splitBill({ + participants: [{reportID: workspaceReportID}], + currentUserLogin: RORY_EMAIL, + currentUserAccountID: RORY_ACCOUNT_ID, + comment: '', + amount: 100, + currency: CONST.CURRENCY.USD, + merchant: 'test', + created: '', + existingSplitChatReportID: workspaceReportID, + isASAPSubmitBetaEnabled: false, + transactionViolations: {}, + quickAction: undefined, + }); + + await waitForBatchedUpdates(); + + expect(await getOnyxValue(ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE)).toHaveProperty('isFirstQuickAction', true); + + splitBill({ + participants: [{reportID: workspaceReportID}], + currentUserLogin: RORY_EMAIL, + currentUserAccountID: RORY_ACCOUNT_ID, + comment: '', + amount: 100, + currency: CONST.CURRENCY.USD, + merchant: 'test', + created: '', + existingSplitChatReportID: workspaceReportID, + isASAPSubmitBetaEnabled: false, + transactionViolations: {}, + quickAction: {action: CONST.QUICK_ACTIONS.SEND_MONEY, chatReportID: '456'}, + }); + await waitForBatchedUpdates(); + + expect(await getOnyxValue(ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE)).toMatchObject({ + action: CONST.QUICK_ACTIONS.SPLIT_MANUAL, + isFirstQuickAction: false, + }); + }); + it('should update split chat report lastVisibleActionCreated to the latest IOU action when split bill in a DM', async () => { // Given a DM chat with no expenses const reportID = '1'; @@ -2772,6 +2866,7 @@ describe('actions/IOU', () => { existingSplitChatReportID: reportID, isASAPSubmitBetaEnabled: false, transactionViolations: {}, + quickAction: undefined, }); await waitForBatchedUpdates(); @@ -2788,6 +2883,7 @@ describe('actions/IOU', () => { existingSplitChatReportID: reportID, isASAPSubmitBetaEnabled: false, transactionViolations: {}, + quickAction: undefined, }); await waitForBatchedUpdates(); @@ -2843,6 +2939,7 @@ describe('actions/IOU', () => { comment: '', isASAPSubmitBetaEnabled: false, transactionViolations: {}, + quickAction: undefined, }); await waitForBatchedUpdates(); @@ -2888,6 +2985,7 @@ describe('actions/IOU', () => { existingSplitChatReportID: reportID, isASAPSubmitBetaEnabled: false, transactionViolations: {}, + quickAction: undefined, }); await waitForBatchedUpdates(); @@ -2930,6 +3028,7 @@ describe('actions/IOU', () => { tag: undefined, taxCode: '', taxAmount: 0, + quickAction: undefined, }); await waitForBatchedUpdates();