diff --git a/src/libs/IOUUtils.ts b/src/libs/IOUUtils.ts index fcc754008199..d50b15e56eb9 100644 --- a/src/libs/IOUUtils.ts +++ b/src/libs/IOUUtils.ts @@ -5,15 +5,14 @@ import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; import type {OnyxInputOrEntry, PersonalDetails, Policy, Report} from '@src/types/onyx'; import type {Attendee, Participant} from '@src/types/onyx/IOU'; -import type Transaction from '@src/types/onyx/Transaction'; import SafeString from '@src/utils/SafeString'; import type {IOURequestType} from './actions/IOU'; import {getCurrencyUnit} from './CurrencyUtils'; import Navigation from './Navigation/Navigation'; import Performance from './Performance'; import {isPaidGroupPolicy} from './PolicyUtils'; -import {getReportTransactions, isExpenseReport, isPolicyExpenseChat as isPolicyExpenseChatUtils} from './ReportUtils'; -import {getCurrency, getTagArrayFromName, isMerchantMissing, isScanRequest} from './TransactionUtils'; +import {getReportTransactions} from './ReportUtils'; +import {getCurrency, getTagArrayFromName} from './TransactionUtils'; function navigateToStartMoneyRequestStep(requestType: IOURequestType, iouType: IOUType, transactionID: string, reportID: string, iouAction?: IOUAction): void { if (iouAction === CONST.IOU.ACTION.CATEGORIZE || iouAction === CONST.IOU.ACTION.SUBMIT || iouAction === CONST.IOU.ACTION.SHARE) { @@ -325,34 +324,6 @@ function formatCurrentUserToAttendee(currentUser?: PersonalDetails, reportID?: s return [initialAttendee]; } -/** - * Checks if merchant is required and missing for a transaction. - * Merchant is required for policy expense chats, expense requests, or when any participant is a policy expense chat. - * For scan requests, merchant is not required unless it's a split bill being edited. - * - * @param transaction - The transaction to check - * @param report - The report associated with the transaction - * @param isEditingSplitBill - Whether this is editing a split bill - * @returns true if merchant is required and missing, false otherwise - */ -function shouldRequireMerchant(transaction: OnyxInputOrEntry | undefined, report: OnyxInputOrEntry | undefined, isEditingSplitBill = false): boolean { - if (!transaction) { - return false; - } - - if (!isMerchantMissing(transaction)) { - return false; - } - - // For scan requests, merchant is not required unless it's a split bill being edited - if (isScanRequest(transaction) && !isEditingSplitBill) { - return false; - } - - // Check if merchant is required based on report type and participants - return !!(isPolicyExpenseChatUtils(report) || isExpenseReport(report) || transaction?.participants?.some((participant) => !!participant.isPolicyExpenseChat)); -} - function navigateToConfirmationPage( iouType: IOUType, transactionID: string, @@ -421,7 +392,6 @@ export { formatCurrentUserToAttendee, navigateToParticipantPage, shouldShowReceiptEmptyState, - shouldRequireMerchant, navigateToConfirmationPage, calculateDefaultReimbursable, }; diff --git a/src/pages/iou/request/step/IOURequestStepAmount.tsx b/src/pages/iou/request/step/IOURequestStepAmount.tsx index a15b8795bf17..af510159aebb 100644 --- a/src/pages/iou/request/step/IOURequestStepAmount.tsx +++ b/src/pages/iou/request/step/IOURequestStepAmount.tsx @@ -21,7 +21,7 @@ import useShowNotFoundPageInIOUStep from '@hooks/useShowNotFoundPageInIOUStep'; import {setTransactionReport} from '@libs/actions/Transaction'; import {convertToBackendAmount} from '@libs/CurrencyUtils'; import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID'; -import {calculateDefaultReimbursable, isMovingTransactionFromTrackExpense, navigateToConfirmationPage, navigateToParticipantPage, shouldRequireMerchant} from '@libs/IOUUtils'; +import {calculateDefaultReimbursable, isMovingTransactionFromTrackExpense, navigateToConfirmationPage, navigateToParticipantPage} from '@libs/IOUUtils'; import Navigation from '@libs/Navigation/Navigation'; import {getParticipantsOption, getReportOption} from '@libs/OptionsListUtils'; import {getPolicyExpenseChat, getReportOrDraftReport, getTransactionDetails, isMoneyRequestReport, isPolicyExpenseChat, isSelfDM, shouldEnableNegative} from '@libs/ReportUtils'; @@ -307,14 +307,8 @@ function IOURequestStepAmount({ setSplitShares(transaction, amountInSmallestCurrencyUnits, selectedCurrency || CONST.CURRENCY.USD, participantAccountIDs); } setMoneyRequestParticipantsFromReport(transactionID, report, currentUserPersonalDetails.accountID).then(() => { - // If merchant is required and missing, navigate to merchant step first - if (shouldRequireMerchant(transaction, report, isEditingSplitBill)) { - Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_MERCHANT.getRoute(action, CONST.IOU.TYPE.SUBMIT, transactionID, reportID, undefined, reportActionID)); - return; - } navigateToConfirmationPage(iouType, transactionID, reportID, backToReport); }); - return; } @@ -330,11 +324,7 @@ function IOURequestStepAmount({ const resetToDefaultWorkspace = () => { setTransactionReport(transactionID, {reportID: transactionReportID}, true); setMoneyRequestParticipantsFromReport(transactionID, targetReport, currentUserPersonalDetails.accountID).then(() => { - if (transactionReportID === CONST.REPORT.UNREPORTED_REPORT_ID) { - Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, iouTypeTrackOrSubmit, transactionID, targetReport?.reportID)); - return; - } - Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_MERCHANT.getRoute(action, CONST.IOU.TYPE.SUBMIT, transactionID, targetReport?.reportID, undefined, reportActionID)); + Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, iouTypeTrackOrSubmit, transactionID, targetReport?.reportID)); }); }; @@ -356,10 +346,6 @@ function IOURequestStepAmount({ const chatReportID = selectedReport?.chatReportID ?? selectedReport?.reportID; Navigation.setNavigationActionToMicrotaskQueue(() => { - if (shouldRequireMerchant(transaction, selectedReport, isEditingSplitBill)) { - Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_MERCHANT.getRoute(CONST.IOU.ACTION.CREATE, navigationIOUType, transactionID, chatReportID, undefined, reportActionID)); - return; - } Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, navigationIOUType, transactionID, chatReportID)); }); } else { diff --git a/src/pages/iou/request/step/IOURequestStepMerchant.tsx b/src/pages/iou/request/step/IOURequestStepMerchant.tsx index bc8c04eceaff..eaf970aae95d 100644 --- a/src/pages/iou/request/step/IOURequestStepMerchant.tsx +++ b/src/pages/iou/request/step/IOURequestStepMerchant.tsx @@ -1,5 +1,4 @@ -import {useFocusEffect} from '@react-navigation/native'; -import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react'; +import React, {useCallback, useEffect, useRef, useState} from 'react'; import {InteractionManager, View} from 'react-native'; import FormProvider from '@components/Form/FormProvider'; import InputWrapper from '@components/Form/InputWrapper'; @@ -22,7 +21,6 @@ import {setMoneyRequestMerchant, updateMoneyRequestMerchant} from '@userActions/ import {setDraftSplitTransaction} from '@userActions/IOU/Split'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES from '@src/ROUTES'; import type SCREENS from '@src/SCREENS'; import INPUT_IDS from '@src/types/form/MoneyRequestMerchantForm'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; @@ -71,35 +69,19 @@ function IOURequestStepMerchant({ const {isBetaEnabled} = usePermissions(); const isASAPSubmitBetaEnabled = isBetaEnabled(CONST.BETAS.ASAP_SUBMIT); - const isMerchantRequired = useMemo(() => { - if (isEditing) { - return isPolicyExpenseChat(report) || isExpenseRequest(report); - } - return transaction?.participants?.some((participant) => !!participant.isPolicyExpenseChat); - }, [isEditing, report, transaction?.participants]); + const isMerchantRequired = isPolicyExpenseChat(report) || isExpenseRequest(report) || transaction?.participants?.some((participant) => !!participant.isPolicyExpenseChat); const navigateBack = useCallback(() => { Navigation.goBack(backTo); }, [backTo]); - useFocusEffect( - useCallback(() => { - setIsSaved(false); - setCurrentMerchant(initialMerchant); - }, [initialMerchant]), - ); - useEffect(() => { if (!isSaved || !shouldNavigateAfterSaveRef.current) { return; } shouldNavigateAfterSaveRef.current = false; - if (!isEditing && !backTo) { - Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(action, iouType, transactionID, reportID, undefined, undefined, Navigation.getActiveRoute())); - return; - } navigateBack(); - }, [isSaved, navigateBack, action, iouType, transactionID, reportID, backTo, isEditing]); + }, [isSaved, navigateBack]); const validate = useCallback( (value: FormOnyxValues) => { @@ -183,7 +165,6 @@ function IOURequestStepMerchant({ inputID={INPUT_IDS.MONEY_REQUEST_MERCHANT} name={INPUT_IDS.MONEY_REQUEST_MERCHANT} defaultValue={initialMerchant} - value={currentMerchant} onValueChange={updateMerchantRef} label={translate('common.merchant')} accessibilityLabel={translate('common.merchant')} diff --git a/src/pages/iou/request/step/IOURequestStepParticipants.tsx b/src/pages/iou/request/step/IOURequestStepParticipants.tsx index 96155d7c21f2..8be3dcef4d37 100644 --- a/src/pages/iou/request/step/IOURequestStepParticipants.tsx +++ b/src/pages/iou/request/step/IOURequestStepParticipants.tsx @@ -22,7 +22,7 @@ import {isPaidGroupPolicy} from '@libs/PolicyUtils'; import {findSelfDMReportID, generateReportID, isInvoiceRoomWithID} from '@libs/ReportUtils'; import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils'; import {endSpan} from '@libs/telemetry/activeSpans'; -import {getRequestType, hasRoute, isCorporateCardTransaction, isDistanceRequest, isMerchantMissing, isPerDiemRequest} from '@libs/TransactionUtils'; +import {getRequestType, hasRoute, isCorporateCardTransaction, isDistanceRequest, isPerDiemRequest} from '@libs/TransactionUtils'; import MoneyRequestParticipantsSelector from '@pages/iou/request/MoneyRequestParticipantsSelector'; import { navigateToStartStepIfScanFileCannotBeRead, @@ -38,7 +38,6 @@ import {createDraftWorkspace} from '@userActions/Policy/Policy'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; -import type {Route} from '@src/ROUTES'; import type SCREENS from '@src/SCREENS'; import type {Policy} from '@src/types/onyx'; import type {Participant} from '@src/types/onyx/IOU'; @@ -89,7 +88,6 @@ function IOURequestStepParticipants({ // We need to set selectedReportID if user has navigated back from confirmation page and navigates to confirmation page with already selected participant const selectedReportID = useRef(participants?.length === 1 ? (participants.at(0)?.reportID ?? reportID) : reportID); - const selectedParticipants = useRef(participants); const numberOfParticipants = useRef(participants?.length ?? 0); const iouRequestType = getRequestType(initialTransaction); const isSplitRequest = iouType === CONST.IOU.TYPE.SPLIT; @@ -223,7 +221,6 @@ function IOURequestStepParticipants({ (val: Participant[]) => { HttpUtils.cancelPendingRequests(READ_COMMANDS.SEARCH_FOR_REPORTS); - selectedParticipants.current = val; const firstParticipant = val.at(0); if (firstParticipant?.isSelfDM && !isSplitRequest) { @@ -338,9 +335,6 @@ function IOURequestStepParticipants({ return; } - const firstParticipant = selectedParticipants.current?.at(0); - const isMerchantRequired = !!firstParticipant?.isPolicyExpenseChat && isMerchantMissing(initialTransaction) && iouRequestType === CONST.IOU.REQUEST_TYPE.MANUAL; - const iouConfirmationPageRoute = ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute( action, iouType === CONST.IOU.TYPE.CREATE || iouType === CONST.IOU.TYPE.TRACK ? CONST.IOU.TYPE.SUBMIT : iouType, @@ -351,18 +345,9 @@ function IOURequestStepParticipants({ action === CONST.IOU.ACTION.SHARE ? Navigation.getActiveRoute() : undefined, ); - let route: Route = iouConfirmationPageRoute; - - if (isCategorizing) { - route = ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute(action, iouType, initialTransactionID, selectedReportID.current || reportID, iouConfirmationPageRoute); - } else if (isMerchantRequired) { - route = ROUTES.MONEY_REQUEST_STEP_MERCHANT.getRoute( - action, - iouType === CONST.IOU.TYPE.CREATE || iouType === CONST.IOU.TYPE.TRACK ? CONST.IOU.TYPE.SUBMIT : iouType, - initialTransactionID, - newReportID, - ); - } + const route = isCategorizing + ? ROUTES.MONEY_REQUEST_STEP_CATEGORY.getRoute(action, iouType, initialTransactionID, selectedReportID.current || reportID, iouConfirmationPageRoute) + : iouConfirmationPageRoute; Performance.markStart(CONST.TIMING.OPEN_CREATE_EXPENSE_APPROVE); waitForKeyboardDismiss(() => { @@ -370,15 +355,11 @@ function IOURequestStepParticipants({ // We wrap navigation in setNavigationActionToMicrotaskQueue so that data loading in Onyx and navigation do not occur simultaneously, which resets the amount to 0. // More information can be found here: https://github.com/Expensify/App/issues/73728 Navigation.setNavigationActionToMicrotaskQueue(() => { - if (backTo && !isMerchantRequired) { + if (backTo) { // We don't want to compare params because we just changed the participants. Navigation.goBack(route, {compareParams: false}); } else { - // If the merchant step is required and the backTo parameter is set, we need to go back the the confirmation screen first and then navigate to the merchant page with forceReplace to remove this screen from the stack - if (isMerchantRequired && backTo) { - Navigation.goBack(); - } - Navigation.navigate(route, {forceReplace: isMerchantRequired && !!backTo}); + Navigation.navigate(route); } }); }); @@ -388,15 +369,14 @@ function IOURequestStepParticipants({ participants, iouType, initialTransaction, - iouRequestType, initialTransactionID, + reportID, waitForKeyboardDismiss, transactions, isMovingTransactionFromTrackExpense, allPolicies, policyForMovingExpenses, introSelected, - reportID, backTo, selfDMReportID, ],