diff --git a/src/components/AttachmentComposerModal.tsx b/src/components/AttachmentComposerModal.tsx index a317716f74cf..dace0b604c94 100644 --- a/src/components/AttachmentComposerModal.tsx +++ b/src/components/AttachmentComposerModal.tsx @@ -175,7 +175,7 @@ function AttachmentComposerModal({onConfirm, onModalShow = () => {}, onModalHide } }, [fileError, validFilesToUpload, convertFileToAttachment, getModalType]); - const {ErrorModal, validateFiles, PDFValidationComponent} = useFilesValidation(setValidFilesToUpload); + const {ErrorModal, validateFiles, PDFValidationComponent} = useFilesValidation(setValidFilesToUpload, false); const confirmAndContinue = () => { if (fileError === CONST.FILE_VALIDATION_ERRORS.MAX_FILE_LIMIT_EXCEEDED) { diff --git a/src/hooks/useFilesValidation.tsx b/src/hooks/useFilesValidation.tsx index 6e09bfacc389..a3ae468f4b49 100644 --- a/src/hooks/useFilesValidation.tsx +++ b/src/hooks/useFilesValidation.tsx @@ -27,7 +27,7 @@ type ErrorObject = { fileExtension?: string; }; -function useFilesValidation(proceedWithFilesAction: (files: FileObject[]) => void, isValidatingReceipts = false) { +function useFilesValidation(proceedWithFilesAction: (files: FileObject[]) => void, isValidatingReceipts = true) { const styles = useThemeStyles(); const {translate} = useLocalize(); const [isErrorModalVisible, setIsErrorModalVisible] = useState(false); diff --git a/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx b/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx index 804335e8d50a..9c3f234e1d96 100644 --- a/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx +++ b/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx @@ -130,6 +130,8 @@ function IOURequestStepScan({ return allTransactions.filter((transaction): transaction is Transaction => !!transaction); }, [initialTransaction, initialTransactionID, optimisticTransactions]); + const shouldAcceptMultipleFiles = isBetaEnabled(CONST.BETAS.NEWDOT_MULTI_FILES_DRAG_AND_DROP) && !isEditing && !backTo; + const blinkOpacity = useSharedValue(0); const blinkStyle = useAnimatedStyle(() => ({ opacity: blinkOpacity.get(), @@ -442,8 +444,14 @@ function IOURequestStepScan({ // If there was no reportID, then that means the user started this flow from the global + menu // and an optimistic reportID was generated. In that case, the next step is to select the participants for this expense. - if (iouType === CONST.IOU.TYPE.CREATE && isPaidGroupPolicy(activePolicy) && activePolicy?.isPolicyExpenseChatEnabled && !shouldRestrictUserBillableActions(activePolicy.id)) { - const activePolicyExpenseChat = getPolicyExpenseChat(currentUserPersonalDetails.accountID, activePolicy?.id); + const activePolicyExpenseChat = getPolicyExpenseChat(currentUserPersonalDetails.accountID, activePolicy?.id); + if ( + (!initialTransaction?.participants || initialTransaction?.participants?.at(0)?.reportID === activePolicyExpenseChat?.reportID) && + iouType === CONST.IOU.TYPE.CREATE && + isPaidGroupPolicy(activePolicy) && + activePolicy?.isPolicyExpenseChatEnabled && + !shouldRestrictUserBillableActions(activePolicy.id) + ) { const setParticipantsPromises = files.map((receiptFile) => setMoneyRequestParticipantsFromReport(receiptFile.transactionID, activePolicyExpenseChat)); Promise.all(setParticipantsPromises).then(() => Navigation.navigate( @@ -456,6 +464,12 @@ function IOURequestStepScan({ ), ); } else { + // If the initial transaction already has the participants selected, then we can skip the participants step and go straight to the confirmation step. + if (initialTransaction?.participants && initialTransaction?.participants.length > 0) { + const setParticipantsPromises = files.map((receiptFile) => setMoneyRequestParticipants(receiptFile.transactionID, initialTransaction?.participants)); + Promise.all(setParticipantsPromises).then(() => navigateToConfirmationPage(false, initialTransaction?.reportID)); + return; + } navigateToParticipantPage(iouType, initialTransactionID, reportID); } }, @@ -464,16 +478,18 @@ function IOURequestStepScan({ report, reportNameValuePairs, iouType, + initialTransaction?.participants, + initialTransaction?.currency, + initialTransaction?.reportID, activePolicy, initialTransactionID, navigateToConfirmationPage, shouldSkipConfirmation, personalDetails, createTransaction, - currentUserPersonalDetails.login, + currentUserPersonalDetails?.login, currentUserPersonalDetails.accountID, reportID, - initialTransaction?.currency, transactionTaxCode, transactionTaxAmount, policy, @@ -532,7 +548,7 @@ function IOURequestStepScan({ files.forEach((file, index) => { const transaction = - !isBetaEnabled(CONST.BETAS.NEWDOT_MULTI_FILES_DRAG_AND_DROP) || (index === 0 && transactions.length === 1 && !initialTransaction?.receipt) + !shouldAcceptMultipleFiles || (index === 0 && transactions.length === 1 && !initialTransaction?.receipt?.source) ? (initialTransaction as Partial) : buildOptimisticTransactionAndCreateDraft({ initialTransaction: initialTransaction as Partial, @@ -817,7 +833,7 @@ function IOURequestStepScan({ setIsLoaderVisible(true)} - fileLimit={isBetaEnabled(CONST.BETAS.NEWDOT_MULTI_FILES_DRAG_AND_DROP) ? CONST.API_ATTACHMENT_VALIDATIONS.MAX_FILE_LIMIT : 1} + fileLimit={shouldAcceptMultipleFiles ? CONST.API_ATTACHMENT_VALIDATIONS.MAX_FILE_LIMIT : 1} > {({openPicker}) => ( Object.values(items ?? {}), @@ -317,7 +317,7 @@ function IOURequestStepScan({ }, [backTo]); const navigateToConfirmationPage = useCallback( - (isTestTransaction = false, reportIDParam: string | undefined = undefined) => { + (shouldNavigateToSubmit = false, reportIDParam: string | undefined = undefined) => { switch (iouType) { case CONST.IOU.TYPE.REQUEST: Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.SUBMIT, initialTransactionID, reportID, backToReport)); @@ -329,7 +329,7 @@ function IOURequestStepScan({ Navigation.navigate( ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute( CONST.IOU.ACTION.CREATE, - isTestTransaction ? CONST.IOU.TYPE.SUBMIT : iouType, + shouldNavigateToSubmit ? CONST.IOU.TYPE.SUBMIT : iouType, initialTransactionID, // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing reportIDParam || reportID, @@ -505,8 +505,14 @@ function IOURequestStepScan({ // If there was no reportID, then that means the user started this flow from the global + menu // and an optimistic reportID was generated. In that case, the next step is to select the participants for this expense. - if (iouType === CONST.IOU.TYPE.CREATE && isPaidGroupPolicy(activePolicy) && activePolicy?.isPolicyExpenseChatEnabled && !shouldRestrictUserBillableActions(activePolicy.id)) { - const activePolicyExpenseChat = getPolicyExpenseChat(currentUserPersonalDetails.accountID, activePolicy?.id); + const activePolicyExpenseChat = getPolicyExpenseChat(currentUserPersonalDetails.accountID, activePolicy?.id); + if ( + (!initialTransaction?.participants || initialTransaction?.participants?.at(0)?.reportID === activePolicyExpenseChat?.reportID) && + iouType === CONST.IOU.TYPE.CREATE && + isPaidGroupPolicy(activePolicy) && + activePolicy?.isPolicyExpenseChatEnabled && + !shouldRestrictUserBillableActions(activePolicy.id) + ) { const setParticipantsPromises = files.map((receiptFile) => setMoneyRequestParticipantsFromReport(receiptFile.transactionID, activePolicyExpenseChat)); Promise.all(setParticipantsPromises).then(() => Navigation.navigate( @@ -519,6 +525,12 @@ function IOURequestStepScan({ ), ); } else { + // If the initial transaction already has the participants selected, then we can skip the participants step and go straight to the confirmation step. + if (initialTransaction?.participants && initialTransaction?.participants.length > 0) { + const setParticipantsPromises = files.map((receiptFile) => setMoneyRequestParticipants(receiptFile.transactionID, initialTransaction?.participants)); + Promise.all(setParticipantsPromises).then(() => navigateToConfirmationPage(true, initialTransaction?.reportID)); + return; + } navigateToParticipantPage(iouType, initialTransactionID, reportID); } }, @@ -527,6 +539,9 @@ function IOURequestStepScan({ report, reportNameValuePairs, iouType, + initialTransaction?.participants, + initialTransaction?.currency, + initialTransaction?.reportID, activePolicy, initialTransactionID, navigateToConfirmationPage, @@ -536,7 +551,6 @@ function IOURequestStepScan({ currentUserPersonalDetails?.login, currentUserPersonalDetails.accountID, reportID, - initialTransaction?.currency, transactionTaxCode, transactionTaxAmount, policy, @@ -573,7 +587,7 @@ function IOURequestStepScan({ files.forEach((file, index) => { const source = URL.createObjectURL(file as Blob); const transaction = - !isBetaEnabled(CONST.BETAS.NEWDOT_MULTI_FILES_DRAG_AND_DROP) || (index === 0 && transactions.length === 1 && !initialTransaction?.receipt) + !shouldAcceptMultipleFiles || (index === 0 && transactions.length === 1 && !initialTransaction?.receipt?.source) ? (initialTransaction as Partial) : buildOptimisticTransactionAndCreateDraft({ initialTransaction: initialTransaction as Partial,