diff --git a/src/libs/API/index.ts b/src/libs/API/index.ts index 0ba6391d21bc..16405e45ff9d 100644 --- a/src/libs/API/index.ts +++ b/src/libs/API/index.ts @@ -7,7 +7,7 @@ import {isOffline} from '@libs/Network/NetworkStore'; import {push as pushToSequentialQueue, waitForIdle as waitForSequentialQueueIdle} from '@libs/Network/SequentialQueue'; import Pusher from '@libs/Pusher'; import {processWithMiddleware, use} from '@libs/Request'; -import {getLength as getPersistedRequestsLength} from '@userActions/PersistedRequests'; +import {getAll, getLength as getPersistedRequestsLength} from '@userActions/PersistedRequests'; import CONST from '@src/CONST'; import type OnyxRequest from '@src/types/onyx/Request'; import type {PaginatedRequest, PaginationConfig, RequestConflictResolver} from '@src/types/onyx/Request'; @@ -62,8 +62,15 @@ function prepareRequest( ): OnyxRequest { Log.info('[API] Preparing request', false, {command, type}); + let shouldApplyOptimisticData = true; + if (conflictResolver?.checkAndFixConflictingRequest) { + const requests = getAll(); + const {conflictAction} = conflictResolver.checkAndFixConflictingRequest(requests); + shouldApplyOptimisticData = conflictAction.type !== 'noAction'; + } + const {optimisticData, ...onyxDataWithoutOptimisticData} = onyxData; - if (optimisticData) { + if (optimisticData && shouldApplyOptimisticData) { Log.info('[API] Applying optimistic data', false, {command, type}); Onyx.update(optimisticData); } diff --git a/src/libs/actions/Report.ts b/src/libs/actions/Report.ts index 142b6d8fb9bc..9eccc1dc47fa 100644 --- a/src/libs/actions/Report.ts +++ b/src/libs/actions/Report.ts @@ -197,6 +197,7 @@ import {clearByKey} from './CachedPDFPaths'; import {setDownload} from './Download'; import {close} from './Modal'; import navigateFromNotification from './navigateFromNotification'; +import {getAll} from './PersistedRequests'; import {buildAddMembersToWorkspaceOnyxData, buildRoomMembersOnyxData} from './Policy/Member'; import {createPolicyExpenseChats} from './Policy/Policy'; import { @@ -1106,9 +1107,14 @@ function openReport( const isInviteOnboardingComplete = introSelected?.isInviteOnboardingComplete ?? false; const isOnboardingCompleted = onboarding?.hasCompletedGuidedSetupFlow ?? false; + // Some cases we can have two open report requests with guide setup data because isInviteOnboardingComplete is not updated completely. + // Then we need to check the list request and prevent the guided setup data from being duplicated. + const allPersistedRequests = getAll(); + const hasOpenReportWithGuidedSetupData = allPersistedRequests.some((request) => request.command === WRITE_COMMANDS.OPEN_REPORT && request.data?.guidedSetupData); + // Prepare guided setup data only when nvp_introSelected is set and onboarding is not completed // OldDot users will never have nvp_introSelected set, so they will not see guided setup messages - if (introSelected && !isOnboardingCompleted && !isInviteOnboardingComplete) { + if (introSelected && !isOnboardingCompleted && !isInviteOnboardingComplete && !hasOpenReportWithGuidedSetupData) { const {choice, inviteType} = introSelected; const isInviteIOUorInvoice = inviteType === CONST.ONBOARDING_INVITE_TYPES.IOU || inviteType === CONST.ONBOARDING_INVITE_TYPES.INVOICE; const isInviteChoiceCorrect = choice === CONST.ONBOARDING_CHOICES.ADMIN || choice === CONST.ONBOARDING_CHOICES.SUBMIT || choice === CONST.ONBOARDING_CHOICES.CHAT_SPLIT;