From 0913a958761a9ea1b9cd971e33b592e991b3dd94 Mon Sep 17 00:00:00 2001 From: dominictb Date: Mon, 20 Jan 2025 17:53:21 +0700 Subject: [PATCH 1/3] fix: Delete Receipt button is not displayed in merged transaction --- src/components/AttachmentModal.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/AttachmentModal.tsx b/src/components/AttachmentModal.tsx index 0ad6dfbb8f7f..61b98d18da56 100644 --- a/src/components/AttachmentModal.tsx +++ b/src/components/AttachmentModal.tsx @@ -450,8 +450,10 @@ function AttachmentModal({ onSelected: () => downloadAttachment(), }); } + + const hasOnlyEReceipt = TransactionUtils.hasEReceipt(transaction) && !TransactionUtils.hasReceiptSource(transaction); if ( - !TransactionUtils.hasEReceipt(transaction) && + !hasOnlyEReceipt && TransactionUtils.hasReceipt(transaction) && !TransactionUtils.isReceiptBeingScanned(transaction) && canEditReceipt && From 45abb77e09638fe824a6797f3b235be97ac46aaf Mon Sep 17 00:00:00 2001 From: dominictb Date: Mon, 20 Jan 2025 18:22:27 +0700 Subject: [PATCH 2/3] fix inexistent ids lint --- src/ROUTES.ts | 8 ++++-- src/components/AttachmentModal.tsx | 40 +++++++++++------------------- src/libs/actions/IOU.ts | 5 +++- 3 files changed, 24 insertions(+), 29 deletions(-) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 7bf1bf1c9e07..5fa574c58935 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -656,8 +656,12 @@ const ROUTES = { }, MONEY_REQUEST_STEP_SCAN: { route: ':action/:iouType/scan/:transactionID/:reportID', - getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '') => - getUrlWithBackToParam(`${action as string}/${iouType as string}/scan/${transactionID}/${reportID}`, backTo), + getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, backTo = '') => { + if (!transactionID || !reportID) { + Log.warn('Invalid transactionID or reportID is used to build the MONEY_REQUEST_STEP_SCAN route'); + } + return getUrlWithBackToParam(`${action as string}/${iouType as string}/scan/${transactionID}/${reportID}`, backTo); + }, }, MONEY_REQUEST_STEP_TAG: { route: ':action/:iouType/tag/:orderWeight/:transactionID/:reportID/:reportActionID?', diff --git a/src/components/AttachmentModal.tsx b/src/components/AttachmentModal.tsx index 61b98d18da56..65ff2c769f2c 100644 --- a/src/components/AttachmentModal.tsx +++ b/src/components/AttachmentModal.tsx @@ -14,13 +14,13 @@ import useWindowDimensions from '@hooks/useWindowDimensions'; import addEncryptedAuthTokenToURL from '@libs/addEncryptedAuthTokenToURL'; import attachmentModalHandler from '@libs/AttachmentModalHandler'; import fileDownload from '@libs/fileDownload'; -import * as FileUtils from '@libs/fileDownload/FileUtils'; +import {cleanFileName, getFileName, validateImageForCorruption} from '@libs/fileDownload/FileUtils'; import Navigation from '@libs/Navigation/Navigation'; -import * as ReportActionsUtils from '@libs/ReportActionsUtils'; -import * as TransactionUtils from '@libs/TransactionUtils'; +import {getOriginalMessage, getReportAction, isMoneyRequestAction} from '@libs/ReportActionsUtils'; +import {hasEReceipt, hasMissingSmartscanFields, hasReceipt, hasReceiptSource, isReceiptBeingScanned} from '@libs/TransactionUtils'; import type {AvatarSource} from '@libs/UserUtils'; import variables from '@styles/variables'; -import * as IOU from '@userActions/IOU'; +import {detachReceipt} from '@userActions/IOU'; import CONST from '@src/CONST'; import type {TranslationPaths} from '@src/languages/types'; import ONYXKEYS from '@src/ONYXKEYS'; @@ -183,8 +183,8 @@ function AttachmentModal({ const nope = useSharedValue(false); const isOverlayModalVisible = (isReceiptAttachment && isDeleteReceiptConfirmModalVisible) || (!isReceiptAttachment && isAttachmentInvalid); const iouType = useMemo(() => (isTrackExpenseAction ? CONST.IOU.TYPE.TRACK : CONST.IOU.TYPE.SUBMIT), [isTrackExpenseAction]); - const parentReportAction = ReportActionsUtils.getReportAction(report?.parentReportID ?? '-1', report?.parentReportActionID ?? '-1'); - const transactionID = ReportActionsUtils.isMoneyRequestAction(parentReportAction) ? ReportActionsUtils.getOriginalMessage(parentReportAction)?.IOUTransactionID ?? '-1' : '-1'; + const parentReportAction = getReportAction(report?.parentReportID, report?.parentReportActionID); + const transactionID = (isMoneyRequestAction(parentReportAction) && getOriginalMessage(parentReportAction)?.IOUTransactionID) || CONST.DEFAULT_NUMBER_ID; const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`); const [currentAttachmentLink, setCurrentAttachmentLink] = useState(attachmentLink); @@ -249,7 +249,7 @@ function AttachmentModal({ } if (typeof sourceURL === 'string') { - const fileName = type === CONST.ATTACHMENT_TYPE.SEARCH ? FileUtils.getFileName(`${sourceURL}`) : file?.name; + const fileName = type === CONST.ATTACHMENT_TYPE.SEARCH ? getFileName(`${sourceURL}`) : file?.name; fileDownload(sourceURL, fileName ?? ''); } @@ -288,14 +288,14 @@ function AttachmentModal({ * Detach the receipt and close the modal. */ const deleteAndCloseModal = useCallback(() => { - IOU.detachReceipt(transaction?.transactionID ?? '-1'); + detachReceipt(transaction?.transactionID); setIsDeleteReceiptConfirmModalVisible(false); - Navigation.goBack(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report?.reportID ?? '-1')); + Navigation.goBack(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report?.reportID)); }, [transaction, report]); const isValidFile = useCallback( (fileObject: FileObject) => - FileUtils.validateImageForCorruption(fileObject) + validateImageForCorruption(fileObject) .then(() => { if (fileObject.size && fileObject.size > CONST.API_ATTACHMENT_VALIDATIONS.MAX_SIZE) { setIsAttachmentInvalid(true); @@ -355,7 +355,7 @@ function AttachmentModal({ * upload, drag and drop, copy-paste */ let updatedFile = fileObject; - const cleanName = FileUtils.cleanFileName(updatedFile.name); + const cleanName = cleanFileName(updatedFile.name); if (updatedFile.name !== cleanName) { updatedFile = new File([updatedFile], cleanName, {type: updatedFile.type}); } @@ -432,13 +432,7 @@ function AttachmentModal({ onSelected: () => { closeModal(true); Navigation.navigate( - ROUTES.MONEY_REQUEST_STEP_SCAN.getRoute( - CONST.IOU.ACTION.EDIT, - iouType, - transaction?.transactionID ?? '-1', - report?.reportID ?? '-1', - Navigation.getActiveRouteWithoutParams(), - ), + ROUTES.MONEY_REQUEST_STEP_SCAN.getRoute(CONST.IOU.ACTION.EDIT, iouType, transaction?.transactionID, report?.reportID, Navigation.getActiveRouteWithoutParams()), ); }, }); @@ -451,14 +445,8 @@ function AttachmentModal({ }); } - const hasOnlyEReceipt = TransactionUtils.hasEReceipt(transaction) && !TransactionUtils.hasReceiptSource(transaction); - if ( - !hasOnlyEReceipt && - TransactionUtils.hasReceipt(transaction) && - !TransactionUtils.isReceiptBeingScanned(transaction) && - canEditReceipt && - !TransactionUtils.hasMissingSmartscanFields(transaction) - ) { + const hasOnlyEReceipt = hasEReceipt(transaction) && !hasReceiptSource(transaction); + if (!hasOnlyEReceipt && hasReceipt(transaction) && !isReceiptBeingScanned(transaction) && canEditReceipt && !hasMissingSmartscanFields(transaction)) { menuItems.push({ icon: Expensicons.Trashcan, text: translate('receipt.deleteReceipt'), diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 26ebf5e37a8e..ca1960eef25f 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -8521,7 +8521,10 @@ function payInvoice(paymentMethodType: PaymentMethodType, chatReport: OnyxTypes. API.write(WRITE_COMMANDS.PAY_INVOICE, params, {optimisticData, successData, failureData}); } -function detachReceipt(transactionID: string) { +function detachReceipt(transactionID: string | undefined) { + if (!transactionID) { + return; + } const transaction = allTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]; const newTransaction = transaction ? { From b414ec3ae7ffb4932f1044ceb696d46a3d0397a1 Mon Sep 17 00:00:00 2001 From: dominictb Date: Mon, 20 Jan 2025 18:24:56 +0700 Subject: [PATCH 3/3] silent lint --- src/components/AttachmentModal.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/AttachmentModal.tsx b/src/components/AttachmentModal.tsx index 65ff2c769f2c..74ff19f21a46 100644 --- a/src/components/AttachmentModal.tsx +++ b/src/components/AttachmentModal.tsx @@ -184,6 +184,7 @@ function AttachmentModal({ const isOverlayModalVisible = (isReceiptAttachment && isDeleteReceiptConfirmModalVisible) || (!isReceiptAttachment && isAttachmentInvalid); const iouType = useMemo(() => (isTrackExpenseAction ? CONST.IOU.TYPE.TRACK : CONST.IOU.TYPE.SUBMIT), [isTrackExpenseAction]); const parentReportAction = getReportAction(report?.parentReportID, report?.parentReportActionID); + // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing const transactionID = (isMoneyRequestAction(parentReportAction) && getOriginalMessage(parentReportAction)?.IOUTransactionID) || CONST.DEFAULT_NUMBER_ID; const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`); const [currentAttachmentLink, setCurrentAttachmentLink] = useState(attachmentLink);