diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 332cc0d5ccf1..463cb43cfb8b 100755 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -676,6 +676,7 @@ const CONST = { TRACK_FLOWS: 'trackFlows', EUR_BILLING: 'eurBilling', MANUAL_DISTANCE: 'manualDistance', + NO_OPTIMISTIC_TRANSACTION_THREADS: 'noOptimisticTransactionThreads', VACATION_DELEGATE: 'vacationDelegate', }, BUTTON_STATES: { diff --git a/src/libs/API/parameters/CreatePerDiemRequestParams.ts b/src/libs/API/parameters/CreatePerDiemRequestParams.ts index 910cd2daf2c1..c75de9e50ca6 100644 --- a/src/libs/API/parameters/CreatePerDiemRequestParams.ts +++ b/src/libs/API/parameters/CreatePerDiemRequestParams.ts @@ -18,7 +18,7 @@ type CreatePerDiemRequestParams = { createdChatReportActionID?: string; createdIOUReportActionID?: string; reportPreviewReportActionID: string; - transactionThreadReportID: string; + transactionThreadReportID?: string; createdReportActionIDForThread: string | undefined; billable?: boolean; reimbursable?: boolean; diff --git a/src/libs/API/parameters/RequestMoneyParams.ts b/src/libs/API/parameters/RequestMoneyParams.ts index a78cde0fafd0..c50664abcf82 100644 --- a/src/libs/API/parameters/RequestMoneyParams.ts +++ b/src/libs/API/parameters/RequestMoneyParams.ts @@ -25,7 +25,7 @@ type RequestMoneyParams = { taxAmount: number; billable?: boolean; receiptGpsPoints?: string; - transactionThreadReportID: string; + transactionThreadReportID?: string; createdReportActionIDForThread: string | undefined; reimbursable?: boolean; description?: string; diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 3474b4f80373..f4dbff3d85e8 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -636,7 +636,7 @@ type OptimisticModifiedExpenseReportAction = Pick< | 'delegateAccountID' > & {reportID?: string}; -type OptimisticMoneyRequestEntities = { +type BaseOptimisticMoneyRequestEntities = { iouReport: Report; type: ValueOf; amount: number; @@ -655,6 +655,10 @@ type OptimisticMoneyRequestEntities = { optimisticCreatedReportActionID?: string; }; +type OptimisticMoneyRequestEntities = BaseOptimisticMoneyRequestEntities & {shouldGenerateTransactionThreadReport?: boolean}; +type OptimisticMoneyRequestEntitiesWithTransactionThreadFlag = BaseOptimisticMoneyRequestEntities & {shouldGenerateTransactionThreadReport: boolean}; +type OptimisticMoneyRequestEntitiesWithoutTransactionThreadFlag = BaseOptimisticMoneyRequestEntities; + type OptimisticTaskReport = SetRequired< Pick< Report, @@ -7820,6 +7824,12 @@ function buildTransactionThread( * 4. Transaction Thread linked to the IOU action via `parentReportActionID` * 5. CREATED action for the Transaction Thread */ +function buildOptimisticMoneyRequestEntities( + optimisticMoneyRequestEntities: OptimisticMoneyRequestEntitiesWithoutTransactionThreadFlag, +): [OptimisticCreatedReportAction, OptimisticCreatedReportAction, OptimisticIOUReportAction, OptimisticChatReport, OptimisticCreatedReportAction | null]; +function buildOptimisticMoneyRequestEntities( + optimisticMoneyRequestEntities: OptimisticMoneyRequestEntitiesWithTransactionThreadFlag, +): [OptimisticCreatedReportAction, OptimisticCreatedReportAction, OptimisticIOUReportAction, OptimisticChatReport | undefined, OptimisticCreatedReportAction | null]; function buildOptimisticMoneyRequestEntities({ iouReport, type, @@ -7837,7 +7847,14 @@ function buildOptimisticMoneyRequestEntities({ existingTransactionThreadReportID, linkedTrackedExpenseReportAction, optimisticCreatedReportActionID, -}: OptimisticMoneyRequestEntities): [OptimisticCreatedReportAction, OptimisticCreatedReportAction, OptimisticIOUReportAction, OptimisticChatReport, OptimisticCreatedReportAction | null] { + shouldGenerateTransactionThreadReport = true, +}: OptimisticMoneyRequestEntities): [ + OptimisticCreatedReportAction, + OptimisticCreatedReportAction, + OptimisticIOUReportAction, + OptimisticChatReport | undefined, + OptimisticCreatedReportAction | null, +] { const createdActionForChat = buildOptimisticCreatedReportAction(payeeEmail, undefined, optimisticCreatedReportActionID); // The `CREATED` action must be optimistically generated before the IOU action so that it won't appear after the IOU action in the chat. @@ -7862,11 +7879,11 @@ function buildOptimisticMoneyRequestEntities({ }); // Create optimistic transactionThread and the `CREATED` action for it, if existingTransactionThreadReportID is undefined - const transactionThread = buildTransactionThread(iouAction, iouReport, existingTransactionThreadReportID); - const createdActionForTransactionThread = existingTransactionThreadReportID ? null : buildOptimisticCreatedReportAction(payeeEmail); + const transactionThread = shouldGenerateTransactionThreadReport ? buildTransactionThread(iouAction, iouReport, existingTransactionThreadReportID) : undefined; + const createdActionForTransactionThread = !!existingTransactionThreadReportID || !shouldGenerateTransactionThreadReport ? null : buildOptimisticCreatedReportAction(payeeEmail); // The IOU action and the transactionThread are co-dependent as parent-child, so we need to link them together - iouAction.childReportID = existingTransactionThreadReportID ?? transactionThread.reportID; + iouAction.childReportID = existingTransactionThreadReportID ?? transactionThread?.reportID; return [createdActionForChat, createdActionForIOUReport, iouAction, transactionThread, createdActionForTransactionThread]; } diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 0c452576ef2e..02243c934013 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -274,7 +274,7 @@ type MoneyRequestInformation = { createdChatReportActionID?: string; createdIOUReportActionID?: string; reportPreviewAction: OnyxTypes.ReportAction; - transactionThreadReportID: string; + transactionThreadReportID?: string; createdReportActionIDForThread: string | undefined; onyxData: OnyxData; billable?: boolean; @@ -444,6 +444,7 @@ type RequestMoneyInformation = { optimisticCreatedReportActionID?: string; optimisticIOUReportID?: string; optimisticReportPreviewActionID?: string; + shouldGenerateTransactionThreadReport: boolean; }; type MoneyRequestInformationParams = { @@ -461,6 +462,7 @@ type MoneyRequestInformationParams = { optimisticCreatedReportActionID?: string; optimisticIOUReportID?: string; optimisticReportPreviewActionID?: string; + shouldGenerateTransactionThreadReport?: boolean; }; type MoneyRequestOptimisticParams = { @@ -476,7 +478,7 @@ type MoneyRequestOptimisticParams = { }; transactionParams: { transaction: OnyxTypes.Transaction; - transactionThreadReport: OptimisticChatReport | null; + transactionThreadReport?: OptimisticChatReport | null; transactionThreadCreatedReportAction: OptimisticCreatedReportAction | null; }; policyRecentlyUsed: { @@ -499,6 +501,7 @@ type BuildOnyxDataForMoneyRequestParams = { optimisticParams: MoneyRequestOptimisticParams; retryParams?: StartSplitBilActionParams | CreateTrackExpenseParams | RequestMoneyInformation | ReplaceReceipt; participant?: Participant; + shouldGenerateTransactionThreadReport?: boolean; }; type DistanceRequestTransactionParams = BaseTransactionParams & { @@ -1423,6 +1426,7 @@ function buildOnyxDataForMoneyRequest(moneyRequestParams: BuildOnyxDataForMoneyR optimisticParams, retryParams, participant, + shouldGenerateTransactionThreadReport = true, } = moneyRequestParams; const {policy, policyCategories, policyTagList} = policyParams; const { @@ -1525,22 +1529,27 @@ function buildOnyxDataForMoneyRequest(moneyRequestParams: BuildOnyxDataForMoneyR [iou.action.reportActionID]: iou.action as OnyxTypes.ReportAction, }, }, - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReport?.reportID}`, - value: { - ...transactionThreadReport, - pendingFields: {createChat: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD}, + ); + + if (shouldGenerateTransactionThreadReport) { + optimisticData.push( + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReport?.reportID}`, + value: { + ...transactionThreadReport, + pendingFields: {createChat: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD}, + }, }, - }, - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT_METADATA}${transactionThreadReport?.reportID}`, - value: { - isOptimisticReport: true, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_METADATA}${transactionThreadReport?.reportID}`, + value: { + isOptimisticReport: true, + }, }, - }, - ); + ); + } if (isNewChatReport) { optimisticData.push({ @@ -1562,7 +1571,7 @@ function buildOnyxDataForMoneyRequest(moneyRequestParams: BuildOnyxDataForMoneyR }); } - if (!isEmptyObject(transactionThreadCreatedReportAction)) { + if (shouldGenerateTransactionThreadReport && !isEmptyObject(transactionThreadCreatedReportAction)) { optimisticData.push({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionThreadReport?.reportID}`, @@ -1740,22 +1749,6 @@ function buildOnyxDataForMoneyRequest(moneyRequestParams: BuildOnyxDataForMoneyR isOptimisticReport: false, }, }, - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReport?.reportID}`, - value: { - participants: redundantParticipants, - pendingFields: null, - errorFields: null, - }, - }, - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT_METADATA}${transactionThreadReport?.reportID}`, - value: { - isOptimisticReport: false, - }, - }, { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transaction.transactionID}`, @@ -1810,7 +1803,28 @@ function buildOnyxDataForMoneyRequest(moneyRequestParams: BuildOnyxDataForMoneyR }, ); - if (!isEmptyObject(transactionThreadCreatedReportAction)) { + if (shouldGenerateTransactionThreadReport) { + successData.push( + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReport?.reportID}`, + value: { + participants: redundantParticipants, + pendingFields: null, + errorFields: null, + }, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_METADATA}${transactionThreadReport?.reportID}`, + value: { + isOptimisticReport: false, + }, + }, + ); + } + + if (shouldGenerateTransactionThreadReport && !isEmptyObject(transactionThreadCreatedReportAction)) { successData.push({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionThreadReport?.reportID}`, @@ -1855,18 +1869,6 @@ function buildOnyxDataForMoneyRequest(moneyRequestParams: BuildOnyxDataForMoneyR }, }, }, - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReport?.reportID}`, - value: { - pendingFields: null, - errorFields: existingTransactionThreadReport - ? null - : { - createChat: getMicroSecondOnyxErrorWithTranslationKey('report.genericCreateReportFailureMessage'), - }, - }, - }, { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transaction.transactionID}`, @@ -1924,6 +1926,21 @@ function buildOnyxDataForMoneyRequest(moneyRequestParams: BuildOnyxDataForMoneyR }, ); + if (shouldGenerateTransactionThreadReport) { + failureData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${transactionThreadReport?.reportID}`, + value: { + pendingFields: null, + errorFields: existingTransactionThreadReport + ? null + : { + createChat: getMicroSecondOnyxErrorWithTranslationKey('report.genericCreateReportFailureMessage'), + }, + }, + }); + } + if (!isOneOnOneSplit) { optimisticData.push({ onyxMethod: Onyx.METHOD.SET, @@ -1941,7 +1958,7 @@ function buildOnyxDataForMoneyRequest(moneyRequestParams: BuildOnyxDataForMoneyR }); } - if (!isEmptyObject(transactionThreadCreatedReportAction)) { + if (shouldGenerateTransactionThreadReport && !isEmptyObject(transactionThreadCreatedReportAction)) { failureData.push({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionThreadReport?.reportID}`, @@ -3298,6 +3315,7 @@ function getMoneyRequestInformation(moneyRequestInformation: MoneyRequestInforma optimisticCreatedReportActionID, optimisticIOUReportID, optimisticReportPreviewActionID, + shouldGenerateTransactionThreadReport = true, } = moneyRequestInformation; const {payeeAccountID = userAccountID, payeeEmail = currentUserEmail, participant} = participantParams; const {policy, policyCategories, policyTagList} = policyParams; @@ -3443,6 +3461,7 @@ function getMoneyRequestInformation(moneyRequestInformation: MoneyRequestInforma existingTransactionThreadReportID: linkedTrackedExpenseReportAction?.childReportID, optimisticCreatedReportActionID, linkedTrackedExpenseReportAction, + shouldGenerateTransactionThreadReport, }); let reportPreviewAction = shouldCreateNewMoneyRequestReport ? null : getReportPreviewAction(chatReport.reportID, iouReport.reportID); @@ -3481,6 +3500,7 @@ function getMoneyRequestInformation(moneyRequestInformation: MoneyRequestInforma participant, isNewChatReport, shouldCreateNewMoneyRequestReport, + shouldGenerateTransactionThreadReport, policyParams: { policy, policyCategories, @@ -5045,7 +5065,7 @@ type ConvertTrackedExpenseToRequestParams = { merchant: string; created: string; attendees?: Attendee[]; - transactionThreadReportID: string; + transactionThreadReportID?: string; }; chatParams: { reportID: string; @@ -5469,6 +5489,7 @@ function requestMoney(requestMoneyInformation: RequestMoneyInformation) { optimisticCreatedReportActionID, optimisticIOUReportID, optimisticReportPreviewActionID, + shouldGenerateTransactionThreadReport, } = requestMoneyInformation; const {payeeAccountID} = participantParams; const parsedComment = getParsedComment(transactionParams.comment ?? ''); @@ -5552,6 +5573,7 @@ function requestMoney(requestMoneyInformation: RequestMoneyInformation) { optimisticCreatedReportActionID, optimisticIOUReportID, optimisticReportPreviewActionID, + shouldGenerateTransactionThreadReport, }); const activeReportID = isMoneyRequestReport ? report?.reportID : chatReport.reportID; diff --git a/src/pages/Share/SubmitDetailsPage.tsx b/src/pages/Share/SubmitDetailsPage.tsx index 52c12a0b0c31..efb50bd65f73 100644 --- a/src/pages/Share/SubmitDetailsPage.tsx +++ b/src/pages/Share/SubmitDetailsPage.tsx @@ -12,6 +12,7 @@ import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails' import useFilesValidation from '@hooks/useFilesValidation'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; +import usePermissions from '@hooks/usePermissions'; import useThemeStyles from '@hooks/useThemeStyles'; import type {GpsPoint} from '@libs/actions/IOU'; import {getIOURequestPolicyID, getMoneyRequestParticipantsFromReport, initMoneyRequest, requestMoney, trackExpense, updateLastLocationPermissionPrompt} from '@libs/actions/IOU'; @@ -58,6 +59,9 @@ function SubmitDetailsPage({ const [errorTitle, setErrorTitle] = useState(undefined); const [errorMessage, setErrorMessage] = useState(undefined); + const {isBetaEnabled} = usePermissions(); + const shouldGenerateTransactionThreadReport = !isBetaEnabled(CONST.BETAS.NO_OPTIMISTIC_TRANSACTION_THREADS); + const [validFilesToUpload, setValidFilesToUpload] = useState([]); const {validateFiles} = useFilesValidation(setValidFilesToUpload); @@ -153,6 +157,7 @@ function SubmitDetailsPage({ linkedTrackedExpenseReportAction: transaction.linkedTrackedExpenseReportAction, linkedTrackedExpenseReportID: transaction.linkedTrackedExpenseReportID, }, + shouldGenerateTransactionThreadReport, }); } }; diff --git a/src/pages/iou/request/step/IOURequestStepAmount.tsx b/src/pages/iou/request/step/IOURequestStepAmount.tsx index fcacd0cbf5a6..f01eec1570e6 100644 --- a/src/pages/iou/request/step/IOURequestStepAmount.tsx +++ b/src/pages/iou/request/step/IOURequestStepAmount.tsx @@ -7,6 +7,7 @@ import type {WithCurrentUserPersonalDetailsProps} from '@components/withCurrentU import useDuplicateTransactionsAndViolations from '@hooks/useDuplicateTransactionsAndViolations'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; +import usePermissions from '@hooks/usePermissions'; import {createDraftTransaction, removeDraftTransaction} from '@libs/actions/TransactionEdit'; import {convertToBackendAmount, isValidCurrencyCode} from '@libs/CurrencyUtils'; import {navigateToParticipantPage} from '@libs/IOUUtils'; @@ -68,6 +69,7 @@ function IOURequestStepAmount({ shouldKeepUserInput = false, }: IOURequestStepAmountProps) { const {translate} = useLocalize(); + const {isBetaEnabled} = usePermissions(); const textInput = useRef(null); const focusTimeoutRef = useRef(null); const isSaveButtonPressed = useRef(false); @@ -92,6 +94,7 @@ function IOURequestStepAmount({ const {amount: transactionAmount} = getTransactionDetails(currentTransaction) ?? {amount: 0}; const {currency: originalCurrency} = getTransactionDetails(isEditing && !isEmptyObject(draftTransaction) ? draftTransaction : transaction) ?? {currency: CONST.CURRENCY.USD}; const currency = isValidCurrencyCode(selectedCurrency) ? selectedCurrency : originalCurrency; + const shouldGenerateTransactionThreadReport = !isBetaEnabled(CONST.BETAS.NO_OPTIMISTIC_TRANSACTION_THREADS); // For quick button actions, we'll skip the confirmation page unless the report is archived or this is a workspace request, as // the user will have to add a merchant. @@ -209,6 +212,7 @@ function IOURequestStepAmount({ attendees: transaction?.comment?.attendees, }, backToReport, + shouldGenerateTransactionThreadReport, }); return; } diff --git a/src/pages/iou/request/step/IOURequestStepConfirmation.tsx b/src/pages/iou/request/step/IOURequestStepConfirmation.tsx index a97fba62af73..3e3dd4fee828 100644 --- a/src/pages/iou/request/step/IOURequestStepConfirmation.tsx +++ b/src/pages/iou/request/step/IOURequestStepConfirmation.tsx @@ -19,6 +19,7 @@ import useFilesValidation from '@hooks/useFilesValidation'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import useOnyx from '@hooks/useOnyx'; +import usePermissions from '@hooks/usePermissions'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import useThreeDotsAnchorPosition from '@hooks/useThreeDotsAnchorPosition'; @@ -147,6 +148,7 @@ function IOURequestStepConfirmation({ const styles = useThemeStyles(); const theme = useTheme(); const {translate} = useLocalize(); + const {isBetaEnabled} = usePermissions(); const threeDotsAnchorPosition = useThreeDotsAnchorPosition(styles.threeDotsPopoverOffsetNoCloseButton); const {isOffline} = useNetwork(); const [startLocationPermissionFlow, setStartLocationPermissionFlow] = useState(false); @@ -214,6 +216,7 @@ function IOURequestStepConfirmation({ [transaction?.participants, iouType, personalDetails, reportAttributesDerived], ); const isPolicyExpenseChat = useMemo(() => participants?.some((participant) => participant.isPolicyExpenseChat), [participants]); + const shouldGenerateTransactionThreadReport = !isBetaEnabled(CONST.BETAS.NO_OPTIMISTIC_TRANSACTION_THREADS); const formHasBeenSubmitted = useRef(false); useFetchRoute(transaction, transaction?.comment?.waypoints, action, shouldUseTransactionDraft(action) ? CONST.TRANSACTION.STATE.DRAFT : CONST.TRANSACTION.STATE.CURRENT); @@ -502,6 +505,7 @@ function IOURequestStepConfirmation({ source: item.comment?.source, }, shouldHandleNavigation: index === transactions.length - 1, + shouldGenerateTransactionThreadReport, backToReport, }); }); @@ -520,6 +524,7 @@ function IOURequestStepConfirmation({ transactionTaxAmount, customUnitRateID, backToReport, + shouldGenerateTransactionThreadReport, ], ); diff --git a/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx b/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx index 58bb027bc79c..501eb275dbef 100644 --- a/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx +++ b/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx @@ -27,6 +27,7 @@ import useFilesValidation from '@hooks/useFilesValidation'; import useIOUUtils from '@hooks/useIOUUtils'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; +import usePermissions from '@hooks/usePermissions'; import usePolicy from '@hooks/usePolicy'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; @@ -91,6 +92,7 @@ function IOURequestStepScan({ }: IOURequestStepScanProps) { const theme = useTheme(); const styles = useThemeStyles(); + const {isBetaEnabled} = usePermissions(); const {isLoaderVisible, setIsLoaderVisible} = useFullScreenLoader(); const device = useCameraDevice('back', { physicalDevices: ['wide-angle-camera', 'ultra-wide-angle-camera'], @@ -119,6 +121,7 @@ function IOURequestStepScan({ const [shouldShowMultiScanEducationalPopup, setShouldShowMultiScanEducationalPopup] = useState(false); const [cameraKey, setCameraKey] = useState(0); const {shouldStartLocationPermissionFlow} = useIOUUtils(); + const shouldGenerateTransactionThreadReport = !isBetaEnabled(CONST.BETAS.NO_OPTIMISTIC_TRANSACTION_THREADS); const defaultTaxCode = getDefaultTaxCode(policy, initialTransaction); const transactionTaxCode = (initialTransaction?.taxCode ? initialTransaction?.taxCode : defaultTaxCode) ?? ''; @@ -343,11 +346,12 @@ function IOURequestStepScan({ }, shouldHandleNavigation: index === files.length - 1, backToReport, + shouldGenerateTransactionThreadReport, }); } }); }, - [backToReport, currentUserPersonalDetails.accountID, currentUserPersonalDetails.login, iouType, report, transactions], + [backToReport, currentUserPersonalDetails.accountID, currentUserPersonalDetails.login, iouType, report, transactions, shouldGenerateTransactionThreadReport], ); const navigateToConfirmationStep = useCallback( diff --git a/src/pages/iou/request/step/IOURequestStepScan/index.tsx b/src/pages/iou/request/step/IOURequestStepScan/index.tsx index 6fb2a569fa9d..b252cb77e641 100644 --- a/src/pages/iou/request/step/IOURequestStepScan/index.tsx +++ b/src/pages/iou/request/step/IOURequestStepScan/index.tsx @@ -29,6 +29,7 @@ import useFilesValidation from '@hooks/useFilesValidation'; import useIOUUtils from '@hooks/useIOUUtils'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; +import usePermissions from '@hooks/usePermissions'; import usePolicy from '@hooks/usePolicy'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; import useTheme from '@hooks/useTheme'; @@ -99,6 +100,7 @@ function IOURequestStepScan({ // eslint-disable-next-line rulesdir/prefer-shouldUseNarrowLayout-instead-of-isSmallScreenWidth const {isSmallScreenWidth} = useResponsiveLayout(); const {translate} = useLocalize(); + const {isBetaEnabled} = usePermissions(); const {isDraggingOver} = useContext(DragAndDropContext); const [cameraPermissionState, setCameraPermissionState] = useState('prompt'); const [isFlashLightOn, toggleFlashlight] = useReducer((state) => !state, false); @@ -121,6 +123,7 @@ function IOURequestStepScan({ const canUseMultiScan = !isEditing && iouType !== CONST.IOU.TYPE.SPLIT && !backTo && !backToReport; const isReplacingReceipt = (isEditing && hasReceipt(initialTransaction)) || (!!initialTransaction?.receipt && !!backTo); const {shouldStartLocationPermissionFlow} = useIOUUtils(); + const shouldGenerateTransactionThreadReport = !isBetaEnabled(CONST.BETAS.NO_OPTIMISTIC_TRANSACTION_THREADS); const [optimisticTransactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_DRAFT, { selector: (items) => Object.values(items ?? {}), @@ -400,11 +403,12 @@ function IOURequestStepScan({ }, shouldHandleNavigation: index === files.length - 1, backToReport, + shouldGenerateTransactionThreadReport, }); } }); }, - [backToReport, currentUserPersonalDetails.accountID, currentUserPersonalDetails.login, iouType, report, transactions], + [backToReport, currentUserPersonalDetails.accountID, currentUserPersonalDetails.login, iouType, report, transactions, shouldGenerateTransactionThreadReport], ); const navigateToConfirmationStep = useCallback( diff --git a/tests/actions/IOUTest.ts b/tests/actions/IOUTest.ts index 87853a882291..50cbf641ac52 100644 --- a/tests/actions/IOUTest.ts +++ b/tests/actions/IOUTest.ts @@ -664,6 +664,7 @@ describe('actions/IOU', () => { merchant, comment, }, + shouldGenerateTransactionThreadReport: true, }); return waitForBatchedUpdates() .then( @@ -894,6 +895,7 @@ describe('actions/IOU', () => { merchant: '', comment, }, + shouldGenerateTransactionThreadReport: true, }); return waitForBatchedUpdates(); }) @@ -1113,6 +1115,7 @@ describe('actions/IOU', () => { merchant: '', comment, }, + shouldGenerateTransactionThreadReport: true, }); } return waitForBatchedUpdates(); @@ -1266,6 +1269,7 @@ describe('actions/IOU', () => { merchant: '', comment, }, + shouldGenerateTransactionThreadReport: true, }); return ( waitForBatchedUpdates() @@ -1596,6 +1600,7 @@ describe('actions/IOU', () => { merchant: '', comment: '', }, + shouldGenerateTransactionThreadReport: true, }); expect(notifyNewAction).toHaveBeenCalledTimes(0); }); @@ -1616,6 +1621,7 @@ describe('actions/IOU', () => { merchant: '', comment: '', }, + shouldGenerateTransactionThreadReport: true, }); expect(Navigation.setNavigationActionToMicrotaskQueue).toHaveBeenCalledTimes(1); }); @@ -2518,6 +2524,7 @@ describe('actions/IOU', () => { merchant: '', comment, }, + shouldGenerateTransactionThreadReport: true, }); return waitForBatchedUpdates() .then( @@ -2755,6 +2762,7 @@ describe('actions/IOU', () => { merchant, comment, }, + shouldGenerateTransactionThreadReport: true, }); } return waitForBatchedUpdates(); @@ -2887,6 +2895,7 @@ describe('actions/IOU', () => { merchant, comment, }, + shouldGenerateTransactionThreadReport: true, }); } return waitForBatchedUpdates(); @@ -3111,6 +3120,7 @@ describe('actions/IOU', () => { merchant, comment, }, + shouldGenerateTransactionThreadReport: true, }); } return waitForBatchedUpdates(); @@ -3210,6 +3220,7 @@ describe('actions/IOU', () => { merchant: '', comment, }, + shouldGenerateTransactionThreadReport: true, }); await waitForBatchedUpdates(); @@ -3430,6 +3441,7 @@ describe('actions/IOU', () => { merchant: '', comment, }, + shouldGenerateTransactionThreadReport: true, }); await waitForBatchedUpdates(); @@ -3953,6 +3965,7 @@ describe('actions/IOU', () => { merchant: '', comment: comment2, }, + shouldGenerateTransactionThreadReport: true, }); } @@ -4011,6 +4024,7 @@ describe('actions/IOU', () => { merchant: '', comment, }, + shouldGenerateTransactionThreadReport: true, }); await waitForBatchedUpdates(); @@ -4160,6 +4174,7 @@ describe('actions/IOU', () => { merchant, comment, }, + shouldGenerateTransactionThreadReport: true, }); } return waitForBatchedUpdates(); @@ -4274,6 +4289,7 @@ describe('actions/IOU', () => { merchant, comment, }, + shouldGenerateTransactionThreadReport: true, }); } return waitForBatchedUpdates(); @@ -4445,6 +4461,7 @@ describe('actions/IOU', () => { merchant, comment, }, + shouldGenerateTransactionThreadReport: true, }); } return waitForBatchedUpdates(); @@ -5324,6 +5341,7 @@ describe('actions/IOU', () => { actionableWhisperReportActionID: '1', linkedTrackedExpenseReportID: '1', }, + shouldGenerateTransactionThreadReport: true, }); await waitForBatchedUpdates(); @@ -6037,6 +6055,7 @@ describe('actions/IOU', () => { merchant, comment, }, + shouldGenerateTransactionThreadReport: true, }); } await waitForBatchedUpdates(); @@ -6121,6 +6140,7 @@ describe('actions/IOU', () => { merchant, comment, }, + shouldGenerateTransactionThreadReport: true, }); } await waitForBatchedUpdates(); @@ -6596,6 +6616,7 @@ describe('actions/IOU', () => { merchant: 'NASDAQ', comment: '*hey* `hey`', }, + shouldGenerateTransactionThreadReport: true, }); await waitForBatchedUpdates(); await getOnyxData({