diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 454c25a0b6d1d..4850891304afa 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -2153,6 +2153,18 @@ function canDeleteTransaction(moneyRequestReport: OnyxEntry): boolean { return canAddOrDeleteTransactions(moneyRequestReport); } +/** + * Checks whether the card transaction support deleting based on liability type + */ +function canDeleteCardTransactionByLiabilityType(iouTransactionID?: string): boolean { + const transaction = getTransaction(iouTransactionID ?? CONST.DEFAULT_NUMBER_ID); + const isCardTransaction = isCardTransactionTransactionUtils(transaction); + if (!isCardTransaction) { + return true; + } + return transaction?.comment?.liabilityType === CONST.TRANSACTION.LIABILITY_TYPE.ALLOW; +} + /** * Can only delete if the author is this user and the action is an ADD_COMMENT action or an IOU action in an unsettled report, or if the user is a * policy admin @@ -2161,11 +2173,10 @@ function canDeleteReportAction(reportAction: OnyxInputOrEntry, rep const report = getReportOrDraftReport(reportID); const isActionOwner = reportAction?.actorAccountID === currentUserAccountID; const policy = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`] ?? null; - const iouTransactionID = isMoneyRequestAction(reportAction) ? getOriginalMessage(reportAction)?.IOUTransactionID : ''; - const transaction = getTransaction(iouTransactionID ?? CONST.DEFAULT_NUMBER_ID); - const isCardTransaction = isCardTransactionTransactionUtils(transaction); if (isMoneyRequestAction(reportAction)) { + const iouTransactionID = getOriginalMessage(reportAction)?.IOUTransactionID; + const isCardTransactionCanBeDeleted = canDeleteCardTransactionByLiabilityType(iouTransactionID); // For now, users cannot delete split actions const isSplitAction = getOriginalMessage(reportAction)?.type === CONST.IOU.REPORT_ACTION_TYPE.SPLIT; @@ -2175,7 +2186,7 @@ function canDeleteReportAction(reportAction: OnyxInputOrEntry, rep if (isActionOwner) { if (!isEmptyObject(report) && (isMoneyRequestReport(report) || isInvoiceReport(report))) { - return canDeleteTransaction(report) && (!isCardTransaction || (isCardTransaction && transaction?.comment?.liabilityType === CONST.TRANSACTION.LIABILITY_TYPE.ALLOW)); + return canDeleteTransaction(report) && isCardTransactionCanBeDeleted; } return true; } @@ -9363,6 +9374,7 @@ export { getRoom, getRootParentReport, getRouteFromLink, + canDeleteCardTransactionByLiabilityType, getTaskAssigneeChatOnyxData, getTransactionDetails, getTransactionReportName, diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index afbc1fa160139..29c15a7c94705 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -39,6 +39,7 @@ import {getPersonalDetailsForAccountIDs} from '@libs/OptionsListUtils'; import {getConnectedIntegration, isPolicyAdmin as isPolicyAdminUtil, isPolicyEmployee as isPolicyEmployeeUtil, shouldShowPolicy} from '@libs/PolicyUtils'; import {getOneTransactionThreadReportID, getOriginalMessage, getTrackExpenseActionableWhisper, isDeletedAction, isMoneyRequestAction, isTrackExpenseAction} from '@libs/ReportActionsUtils'; import { + canDeleteCardTransactionByLiabilityType, canDeleteTransaction, canEditReportDescription as canEditReportDescriptionUtil, canHoldUnholdReportAction as canHoldUnholdReportActionUtil, @@ -92,7 +93,6 @@ import { shouldUseFullTitleToDisplay, } from '@libs/ReportUtils'; import StringUtils from '@libs/StringUtils'; -import {isCardTransaction as isCardTransactionTransactionUtils} from '@libs/TransactionUtils'; import { canCancelPayment, cancelPayment as cancelPaymentAction, @@ -297,13 +297,8 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta isTaskReport && !isCanceledTaskReport && canWriteInReport(report) && report.stateNum !== CONST.REPORT.STATE_NUM.APPROVED && !isClosedReport(report) && canModifyTask && canActionTask; const canDeleteRequest = isActionOwner && (canDeleteTransaction(moneyRequestReport) || isSelfDMTrackExpenseReport) && !isDeletedParentAction; const iouTransactionID = isMoneyRequestAction(requestParentReportAction) ? getOriginalMessage(requestParentReportAction)?.IOUTransactionID : ''; - - /* eslint-disable @typescript-eslint/prefer-nullish-coalescing */ - const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${iouTransactionID || CONST.DEFAULT_NUMBER_ID}`); - const isCardTransaction = isCardTransactionTransactionUtils(transaction); - - const shouldShowDeleteButton = - shouldShowTaskDeleteButton || (canDeleteRequest && (!isCardTransaction || (isCardTransaction && transaction?.comment?.liabilityType === CONST.TRANSACTION.LIABILITY_TYPE.ALLOW))); + const isCardTransactionCanBeDeleted = canDeleteCardTransactionByLiabilityType(iouTransactionID); + const shouldShowDeleteButton = shouldShowTaskDeleteButton || (canDeleteRequest && isCardTransactionCanBeDeleted); useEffect(() => { if (canDeleteRequest) {