diff --git a/src/components/ReportActionItem/ReportPreview.js b/src/components/ReportActionItem/ReportPreview.js index aa3c02b76fc0..39f3e189f8ab 100644 --- a/src/components/ReportActionItem/ReportPreview.js +++ b/src/components/ReportActionItem/ReportPreview.js @@ -1,6 +1,6 @@ import lodashGet from 'lodash/get'; import PropTypes from 'prop-types'; -import React, {useMemo} from 'react'; +import React, {useEffect, useMemo, useState} from 'react'; import {View} from 'react-native'; import {withOnyx} from 'react-native-onyx'; import _ from 'underscore'; @@ -21,6 +21,7 @@ import ControlSelection from '@libs/ControlSelection'; import * as CurrencyUtils from '@libs/CurrencyUtils'; import * as DeviceCapabilities from '@libs/DeviceCapabilities'; import Navigation from '@libs/Navigation/Navigation'; +import onyxSubscribe from '@libs/onyxSubscribe'; import * as ReceiptUtils from '@libs/ReceiptUtils'; import * as ReportActionUtils from '@libs/ReportActionsUtils'; import * as ReportUtils from '@libs/ReportUtils'; @@ -121,6 +122,11 @@ function ReportPreview(props) { const styles = useThemeStyles(); const {translate} = useLocalize(); + const [hasMissingSmartscanFields, sethasMissingSmartscanFields] = useState(false); + const [areAllRequestsBeingSmartScanned, setAreAllRequestsBeingSmartScanned] = useState(false); + const [hasOnlyDistanceRequests, setHasOnlyDistanceRequests] = useState(false); + const [hasNonReimbursableTransactions, setHasNonReimbursableTransactions] = useState(false); + const managerID = props.iouReport.managerID || 0; const isCurrentUserManager = managerID === lodashGet(props.session, 'accountID'); const {totalDisplaySpend, reimbursableSpend} = ReportUtils.getMoneyRequestSpendBreakdown(props.iouReport); @@ -132,17 +138,16 @@ function ReportPreview(props) { const moneyRequestComment = lodashGet(props.action, 'childLastMoneyRequestComment', ''); const isPolicyExpenseChat = ReportUtils.isPolicyExpenseChat(props.chatReport); const isDraftExpenseReport = isPolicyExpenseChat && ReportUtils.isDraftExpenseReport(props.iouReport); + const isApproved = ReportUtils.isReportApproved(props.iouReport); const isMoneyRequestReport = ReportUtils.isMoneyRequestReport(props.iouReport); const transactionsWithReceipts = ReportUtils.getTransactionsWithReceipts(props.iouReportID); const numberOfScanningReceipts = _.filter(transactionsWithReceipts, (transaction) => TransactionUtils.isReceiptBeingScanned(transaction)).length; const hasReceipts = transactionsWithReceipts.length > 0; - const hasOnlyDistanceRequests = ReportUtils.hasOnlyDistanceRequestTransactions(props.iouReportID); - const isScanning = hasReceipts && ReportUtils.areAllRequestsBeingSmartScanned(props.iouReportID, props.action); - const hasErrors = hasReceipts && ReportUtils.hasMissingSmartscanFields(props.iouReportID); + const isScanning = hasReceipts && areAllRequestsBeingSmartScanned; + const hasErrors = hasReceipts && hasMissingSmartscanFields; const lastThreeTransactionsWithReceipts = transactionsWithReceipts.slice(-3); const lastThreeReceipts = _.map(lastThreeTransactionsWithReceipts, (transaction) => ReceiptUtils.getThumbnailAndImageURIs(transaction)); - const hasNonReimbursableTransactions = ReportUtils.hasNonReimbursableTransactions(props.iouReportID); let formattedMerchant = numberOfRequests === 1 && hasReceipts ? TransactionUtils.getMerchant(transactionsWithReceipts[0]) : null; const hasPendingWaypoints = formattedMerchant && hasOnlyDistanceRequests && _.every(transactionsWithReceipts, (transaction) => lodashGet(transaction, 'pendingFields.waypoints', null)); if (hasPendingWaypoints) { @@ -201,6 +206,28 @@ function ReportPreview(props) { const bankAccountRoute = ReportUtils.getBankAccountRoute(props.chatReport); + useEffect(() => { + const unsubscribeOnyxTransaction = onyxSubscribe({ + key: ONYXKEYS.COLLECTION.TRANSACTION, + waitForCollectionCallback: true, + callback: (allTransactions) => { + if (_.isEmpty(allTransactions)) { + return; + } + + sethasMissingSmartscanFields(ReportUtils.hasMissingSmartscanFields(props.iouReportID)); + setAreAllRequestsBeingSmartScanned(ReportUtils.areAllRequestsBeingSmartScanned(props.iouReportID)); + setHasOnlyDistanceRequests(ReportUtils.hasOnlyDistanceRequestTransactions(props.iouReportID)); + setHasNonReimbursableTransactions(ReportUtils.hasNonReimbursableTransactions(props.iouReportID)); + }, + }); + + return () => { + unsubscribeOnyxTransaction(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + const isGroupPolicy = ReportUtils.isGroupPolicyExpenseChat(props.chatReport); const isPolicyAdmin = policyType !== CONST.POLICY.TYPE.PERSONAL && lodashGet(props.policy, 'role') === CONST.POLICY.ROLE.ADMIN; const isPayer = isGroupPolicy