diff --git a/src/hooks/useReportTransactions.ts b/src/hooks/useReportTransactions.ts new file mode 100644 index 000000000000..ccc18f5cba6c --- /dev/null +++ b/src/hooks/useReportTransactions.ts @@ -0,0 +1,24 @@ +import ONYXKEYS from '@src/ONYXKEYS'; +import type {Transaction} from '@src/types/onyx'; +import getEmptyArray from '@src/types/utils/getEmptyArray'; +import useOnyx from './useOnyx'; + +/** + * Hook to get all transactions for a specific report + */ +function useReportTransactions(reportID: string | undefined): Transaction[] { + const [reportTransactions = getEmptyArray()] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION, { + selector: (transactions) => { + if (!transactions || !reportID) { + return []; + } + + return Object.values(transactions).filter((transaction): transaction is Transaction => !!transaction && transaction.reportID === reportID); + }, + canBeMissing: true, + }); + + return reportTransactions; +} + +export default useReportTransactions; diff --git a/src/pages/Search/SearchTransactionsChangeReport.tsx b/src/pages/Search/SearchTransactionsChangeReport.tsx index 61e6b81d840b..36162420d348 100644 --- a/src/pages/Search/SearchTransactionsChangeReport.tsx +++ b/src/pages/Search/SearchTransactionsChangeReport.tsx @@ -57,6 +57,7 @@ function SearchTransactionsChangeReport() { void; removeFromReport?: () => void; @@ -40,6 +42,7 @@ type Props = { function IOURequestEditReportCommon({ backTo, transactionsReports, + transactionIds, selectReport, policyID: policyIDFromProps, removeFromReport, @@ -62,9 +65,21 @@ function IOURequestEditReportCommon({ const [searchValue, debouncedSearchValue, setSearchValue] = useDebouncedState(''); const onlyReport = transactionsReports.length === 1 ? transactionsReports.at(0) : undefined; + const reportTransactions = useReportTransactions(onlyReport?.reportID); + const isOwner = onlyReport ? onlyReport.ownerAccountID === currentUserPersonalDetails.accountID : false; const isReportIOU = onlyReport ? isIOUReport(onlyReport) : false; - const shouldShowRemoveFromReport = isEditing && isOwner && !isReportIOU && !isUnreported; + const isCardTransaction = useMemo(() => { + if (!transactionIds || !onlyReport) { + return false; + } + + return reportTransactions + .filter((transaction) => transactionIds.includes(transaction.transactionID)) + .some((transaction) => transaction?.comment?.liabilityType === CONST.TRANSACTION.LIABILITY_TYPE.RESTRICT); + }, [transactionIds, onlyReport, reportTransactions]); + + const shouldShowRemoveFromReport = isEditing && isOwner && !isReportIOU && !isUnreported && !isCardTransaction; const expenseReports = useMemo(() => { // Early return if no reports are available to prevent useless loop diff --git a/src/pages/iou/request/step/IOURequestStepReport.tsx b/src/pages/iou/request/step/IOURequestStepReport.tsx index 5d157ce29e70..ce32ade036a9 100644 --- a/src/pages/iou/request/step/IOURequestStepReport.tsx +++ b/src/pages/iou/request/step/IOURequestStepReport.tsx @@ -137,6 +137,7 @@ function IOURequestStepReport({route, transaction}: IOURequestStepReportProps) {