diff --git a/src/components/MoneyReportHeader.tsx b/src/components/MoneyReportHeader.tsx index c681897c4a57..6cf5247b8501 100644 --- a/src/components/MoneyReportHeader.tsx +++ b/src/components/MoneyReportHeader.tsx @@ -20,7 +20,7 @@ import {downloadReportPDF, exportReportToCSV, exportReportToPDF, exportToIntegra import {getThreadReportIDsForTransactions, getTotalAmountForIOUReportPreviewButton} from '@libs/MoneyRequestReportUtils'; import Navigation from '@libs/Navigation/Navigation'; import {buildOptimisticNextStepForPreventSelfApprovalsEnabled} from '@libs/NextStepUtils'; -import {getConnectedIntegration} from '@libs/PolicyUtils'; +import {getValidConnectedIntegration} from '@libs/PolicyUtils'; import {getOriginalMessage, getReportAction, isMoneyRequestAction} from '@libs/ReportActionsUtils'; import {getReportPrimaryAction} from '@libs/ReportPrimaryActionUtils'; import {getSecondaryReportActions} from '@libs/ReportSecondaryActionUtils'; @@ -184,7 +184,7 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea const [requestType, setRequestType] = useState(); const canAllowSettlement = hasUpdatedTotal(moneyRequestReport, policy); const policyType = policy?.type; - const connectedIntegration = getConnectedIntegration(policy); + const connectedIntegration = getValidConnectedIntegration(policy); const hasScanningReceipt = getTransactionsWithReceipts(moneyRequestReport?.reportID).some((t) => isReceiptBeingScanned(t)); const hasOnlyPendingTransactions = useMemo(() => { return !!transactions && transactions.length > 0 && transactions.every((t) => isExpensifyCardTransaction(t) && isPending(t)); diff --git a/src/components/ReportActionItem/ReportPreview.tsx b/src/components/ReportActionItem/ReportPreview.tsx index 8abb8b93a58f..620a7c151c2e 100644 --- a/src/components/ReportActionItem/ReportPreview.tsx +++ b/src/components/ReportActionItem/ReportPreview.tsx @@ -37,7 +37,7 @@ import {getTotalAmountForIOUReportPreviewButton} from '@libs/MoneyRequestReportU import Navigation from '@libs/Navigation/Navigation'; import Parser from '@libs/Parser'; import Performance from '@libs/Performance'; -import {getConnectedIntegration} from '@libs/PolicyUtils'; +import {getValidConnectedIntegration} from '@libs/PolicyUtils'; import {getThumbnailAndImageURIs} from '@libs/ReceiptUtils'; import {getReportActionText} from '@libs/ReportActionsUtils'; import getReportPreviewAction from '@libs/ReportPreviewActionUtils'; @@ -459,7 +459,7 @@ function ReportPreview({ /* * Manual export */ - const connectedIntegration = getConnectedIntegration(policy); + const connectedIntegration = getValidConnectedIntegration(policy); useEffect(() => { if (!isPaidAnimationRunning || isApprovedAnimationRunning) { diff --git a/src/libs/PolicyUtils.ts b/src/libs/PolicyUtils.ts index 94221328d48b..88b1a3225add 100644 --- a/src/libs/PolicyUtils.ts +++ b/src/libs/PolicyUtils.ts @@ -32,7 +32,7 @@ import type { import type PolicyEmployee from '@src/types/onyx/PolicyEmployee'; import type {SearchPolicy} from '@src/types/onyx/SearchResults'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; -import {hasSynchronizationErrorMessage} from './actions/connections'; +import {hasSynchronizationErrorMessage, isAuthenticationError} from './actions/connections'; import {shouldShowQBOReimbursableExportDestinationAccountError} from './actions/connections/QuickbooksOnline'; import {getCurrentUserAccountID, getCurrentUserEmail} from './actions/Report'; import {getCategoryApproverRule} from './CategoryUtils'; @@ -1156,6 +1156,12 @@ function getConnectedIntegration(policy: Policy | undefined, accountingIntegrati return (accountingIntegrations ?? Object.values(CONST.POLICY.CONNECTIONS.NAME)).find((integration) => !!policy?.connections?.[integration]); } +function getValidConnectedIntegration(policy: Policy | undefined, accountingIntegrations?: ConnectionName[]) { + return (accountingIntegrations ?? Object.values(CONST.POLICY.CONNECTIONS.NAME)).find( + (integration) => !!policy?.connections?.[integration] && !isAuthenticationError(policy, integration), + ); +} + function hasIntegrationAutoSync(policy: Policy | undefined, connectedIntegration?: ConnectionName) { return (connectedIntegration && policy?.connections?.[connectedIntegration]?.config?.autoSync?.enabled) ?? false; } @@ -1409,6 +1415,7 @@ export { getAdminEmployees, getCleanedTagName, getConnectedIntegration, + getValidConnectedIntegration, getCountOfEnabledTagsOfList, getIneligibleInvitees, getMemberAccountIDsForWorkspace, diff --git a/src/libs/ReportPreviewActionUtils.ts b/src/libs/ReportPreviewActionUtils.ts index 01b7ea7cecd4..da67e6e6248c 100644 --- a/src/libs/ReportPreviewActionUtils.ts +++ b/src/libs/ReportPreviewActionUtils.ts @@ -6,10 +6,9 @@ import {isApprover as isApproverMember} from './actions/Policy/Member'; import {getCurrentUserAccountID} from './actions/Report'; import { arePaymentsEnabled, - getConnectedIntegration, getCorrectedAutoReportingFrequency, getSubmitToAccountID, - hasAccountingConnections, + getValidConnectedIntegration, hasIntegrationAutoSync, isPolicyAdmin, isPreferredExporter, @@ -142,13 +141,12 @@ function canExport(report: Report, violations: OnyxCollection