From 8e341c7c105b65f830ae991536eeb8658427fe36 Mon Sep 17 00:00:00 2001 From: DylanDylann <141406735+DylanDylann@users.noreply.github.com> Date: Thu, 7 Aug 2025 16:25:14 +0700 Subject: [PATCH] Revert "fix: remove call to getReportNameValuePairs() in method findLastAccessedReport" --- src/hooks/useLastAccessedReport.ts | 84 ------------------- .../Navigators/ReportsSplitNavigator.tsx | 6 +- src/libs/ReportUtils.ts | 35 +++----- src/libs/actions/Report.ts | 21 +++-- src/libs/actions/Task.ts | 8 +- src/libs/navigateAfterOnboarding.ts | 12 +-- .../BaseOnboardingInterestedFeatures.tsx | 23 ++--- .../BaseOnboardingPersonalDetails.tsx | 8 +- .../BaseOnboardingWorkspaceInvite.tsx | 16 ++-- .../BaseOnboardingWorkspaceOptional.tsx | 8 +- .../BaseOnboardingWorkspaces.tsx | 8 +- src/pages/ReportDetailsPage.tsx | 22 ++--- src/pages/home/HeaderView.tsx | 4 +- src/pages/home/ReportScreen.tsx | 14 ++-- tests/perf-test/ReportUtils.perf-test.ts | 4 +- tests/unit/ReportUtilsTest.ts | 6 +- tests/unit/navigateAfterOnboardingTest.ts | 18 ++-- 17 files changed, 88 insertions(+), 209 deletions(-) delete mode 100644 src/hooks/useLastAccessedReport.ts diff --git a/src/hooks/useLastAccessedReport.ts b/src/hooks/useLastAccessedReport.ts deleted file mode 100644 index decd42e6f253..000000000000 --- a/src/hooks/useLastAccessedReport.ts +++ /dev/null @@ -1,84 +0,0 @@ -import {useMemo} from 'react'; -import type {OnyxCollection, OnyxEntry} from 'react-native-onyx'; -import {findLastAccessedReport} from '@src/libs/ReportUtils'; -import ONYXKEYS from '@src/ONYXKEYS'; -import type {Policy, Report, ReportMetadata, ReportNameValuePairs} from '@src/types/onyx'; -import mapOnyxCollectionItems from '@src/utils/mapOnyxCollectionItems'; -import useOnyx from './useOnyx'; - -// Optimized selectors based on complete field usage analysis in findLastAccessedReport -type ReportSelector = Pick; - -type PolicySelector = Pick; - -type ReportMetadataSelector = Pick; - -type ReportNameValuePairsSelector = Pick; - -const reportSelector = (report: OnyxEntry): ReportSelector => - (report && { - reportID: report.reportID, - lastReadTime: report.lastReadTime, - chatType: report.chatType, - type: report.type, - participants: report.participants, - invoiceReceiver: report.invoiceReceiver, - ownerAccountID: report.ownerAccountID, - parentReportActionID: report.parentReportActionID, - policyID: report.policyID, - }) as ReportSelector; - -const policySelector = (policy: OnyxEntry): PolicySelector => - (policy && { - id: policy.id, - employeeList: policy.employeeList, - }) as PolicySelector; - -const reportNameValuePairsSelector = (reportNameValuePairs: OnyxEntry): ReportNameValuePairsSelector => - (reportNameValuePairs && { - private_isArchived: reportNameValuePairs.private_isArchived, - }) as ReportNameValuePairsSelector; - -const reportMetadataSelector = (reportMetadata: OnyxEntry): ReportMetadataSelector => - (reportMetadata && { - lastVisitTime: reportMetadata.lastVisitTime, - }) as ReportMetadataSelector; - -function useLastAccessedReport(ignoreDomainRooms: boolean, openOnAdminRoom = false, policyID?: string, excludeReportID?: string) { - const [allReports] = useOnyx(ONYXKEYS.COLLECTION.REPORT, { - canBeMissing: true, - selector: (c) => mapOnyxCollectionItems(c, reportSelector), - }); - - const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, { - canBeMissing: true, - selector: (c) => mapOnyxCollectionItems(c, policySelector), - }); - - const [allReportNameValuePairs] = useOnyx(ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS, { - canBeMissing: true, - selector: (c) => mapOnyxCollectionItems(c, reportNameValuePairsSelector), - }); - - const [allReportMetadata] = useOnyx(ONYXKEYS.COLLECTION.REPORT_METADATA, { - canBeMissing: true, - selector: (c) => mapOnyxCollectionItems(c, reportMetadataSelector), - }); - - const lastAccessReport = useMemo(() => { - return findLastAccessedReport( - allReports, - allPolicies as OnyxCollection>, - allReportMetadata, - allReportNameValuePairs, - ignoreDomainRooms, - openOnAdminRoom, - policyID, - excludeReportID, - ); - }, [allReports, allPolicies, allReportMetadata, allReportNameValuePairs, ignoreDomainRooms, openOnAdminRoom, policyID, excludeReportID]); - - return {lastAccessReport, lastAccessReportID: lastAccessReport?.reportID}; -} - -export default useLastAccessedReport; diff --git a/src/libs/Navigation/AppNavigator/Navigators/ReportsSplitNavigator.tsx b/src/libs/Navigation/AppNavigator/Navigators/ReportsSplitNavigator.tsx index 9af307f842e7..ee0232c9044c 100644 --- a/src/libs/Navigation/AppNavigator/Navigators/ReportsSplitNavigator.tsx +++ b/src/libs/Navigation/AppNavigator/Navigators/ReportsSplitNavigator.tsx @@ -1,5 +1,4 @@ import React, {useState} from 'react'; -import useLastAccessedReport from '@hooks/useLastAccessedReport'; import usePermissions from '@hooks/usePermissions'; import createSplitNavigator from '@libs/Navigation/AppNavigator/createSplitNavigator'; import FreezeWrapper from '@libs/Navigation/AppNavigator/FreezeWrapper'; @@ -8,6 +7,7 @@ import getCurrentUrl from '@libs/Navigation/currentUrl'; import shouldOpenOnAdminRoom from '@libs/Navigation/helpers/shouldOpenOnAdminRoom'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {AuthScreensParamList, ReportsSplitNavigatorParamList} from '@libs/Navigation/types'; +import * as ReportUtils from '@libs/ReportUtils'; import CONST from '@src/CONST'; import type NAVIGATORS from '@src/NAVIGATORS'; import SCREENS from '@src/SCREENS'; @@ -24,7 +24,6 @@ const Split = createSplitNavigator(); function ReportsSplitNavigator({route}: PlatformStackScreenProps) { const {isBetaEnabled} = usePermissions(); const splitNavigatorScreenOptions = useSplitNavigatorScreenOptions(); - const {lastAccessReportID} = useLastAccessedReport(!isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS), shouldOpenOnAdminRoom()); const [initialReportID] = useState(() => { const currentURL = getCurrentUrl(); @@ -33,8 +32,9 @@ function ReportsSplitNavigator({route}: PlatformStackScreenProps>, reportM return lodashMaxBy(filteredReports, (a) => [reportMetadata?.[`${ONYXKEYS.COLLECTION.REPORT_METADATA}${a?.reportID}`]?.lastVisitTime ?? '', a?.lastReadTime ?? '']); } -function findLastAccessedReport( - reports: OnyxCollection>, - policies: OnyxCollection>, - reportMetadata: OnyxCollection, - reportNameValuePairs: OnyxCollection, - ignoreDomainRooms: boolean, - openOnAdminRoom = false, - policyID?: string, - excludeReportID?: string, -): OnyxEntry { +function findLastAccessedReport(ignoreDomainRooms: boolean, openOnAdminRoom = false, policyID?: string, excludeReportID?: string): OnyxEntry { // If it's the user's first time using New Expensify, then they could either have: // - just a Concierge report, if so we'll return that // - their Concierge report, and a separate report that must have deeplinked them to the app before they created their account. // If it's the latter, we'll use the deeplinked report over the Concierge report, // since the Concierge report would be incorrectly selected over the deep-linked report in the logic below. - const policyMemberAccountIDs = getPolicyEmployeeListByIdWithoutCurrentUser(policies, policyID, currentUserAccountID); + const policyMemberAccountIDs = getPolicyEmployeeListByIdWithoutCurrentUser(allPolicies, policyID, currentUserAccountID); - let reportsValues = Object.values(reports ?? {}); + let reportsValues = Object.values(allReports ?? {}); if (!!policyID || policyMemberAccountIDs.length > 0) { reportsValues = filterReportsByPolicyIDAndMemberAccountIDs(reportsValues, policyMemberAccountIDs, policyID); @@ -2025,29 +2016,24 @@ function findLastAccessedReport( // and it prompts the user to use the Concierge chat instead. reportsValues = reportsValues.filter((report) => { - return !isSystemChat(report) && !isArchivedReport(reportNameValuePairs?.[`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.reportID}`]); + // This will get removed as part of https://github.com/Expensify/App/issues/59961 + // eslint-disable-next-line deprecation/deprecation + const reportNameValuePairs = getReportNameValuePairs(report?.reportID); + + return !isSystemChat(report) && !isArchivedReport(reportNameValuePairs); }) ?? []; // At least two reports remain: self DM and Concierge chat. // Return the most recently visited report. Get the last read report from the report metadata. // If allReportMetadata is empty we'll return most recent report owned by user - if (isEmptyObject(reportMetadata)) { + if (isEmptyObject(allReportMetadata)) { const ownedReports = reportsValues.filter((report) => report?.ownerAccountID === currentUserAccountID); if (ownedReports.length > 0) { return lodashMaxBy(ownedReports, (a) => a?.lastReadTime ?? ''); } return lodashMaxBy(reportsValues, (a) => a?.lastReadTime ?? ''); } - return getMostRecentlyVisitedReport(reportsValues, reportMetadata); -} - -/** - * This function is used to retrieve the last accessed report in background - * It's used in the case we need to get the last accessed report in a listener like openReportFromDeepLink - * Please use useLastAccessedReport hook instead if we need to get the last accessed report from the UI - */ -function findLastAccessedReportWithoutView(ignoreDomainRooms: boolean, openOnAdminRoom = false, policyID?: string, excludeReportID?: string): OnyxEntry { - return findLastAccessedReport(allReports, allPolicies, allReportMetadata, allReportNameValuePair, ignoreDomainRooms, openOnAdminRoom, policyID, excludeReportID); + return getMostRecentlyVisitedReport(reportsValues, allReportMetadata); } /** @@ -11669,7 +11655,6 @@ export { isWorkspaceTaskReport, isWorkspaceThread, getReportStatusTranslation, - findLastAccessedReportWithoutView, }; export type { diff --git a/src/libs/actions/Report.ts b/src/libs/actions/Report.ts index 6ff6704a660d..f46e6d59187f 100644 --- a/src/libs/actions/Report.ts +++ b/src/libs/actions/Report.ts @@ -114,7 +114,7 @@ import { buildOptimisticSelfDMReport, buildOptimisticUnreportedTransactionAction, canUserPerformWriteAction as canUserPerformWriteActionReportUtils, - findLastAccessedReportWithoutView, + findLastAccessedReport, findSelfDMReportID, formatReportLastMessageText, generateReportID, @@ -3412,7 +3412,7 @@ function openReportFromDeepLink( // Navigate to the report after sign-in/sign-up. InteractionManager.runAfterInteractions(() => { waitForUserSignIn().then(() => { - const connection = Onyx.connectWithoutView({ + const connection = Onyx.connect({ key: ONYXKEYS.NVP_ONBOARDING, callback: (val) => { if (!val && !isAnonymousUser()) { @@ -3458,7 +3458,7 @@ function openReportFromDeepLink( const report = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${reportID}`]; // If the report does not exist, navigate to the last accessed report or Concierge chat if (reportID && !report) { - const lastAccessedReportID = findLastAccessedReportWithoutView(false, shouldOpenOnAdminRoom(), undefined, reportID)?.reportID; + const lastAccessedReportID = findLastAccessedReport(false, shouldOpenOnAdminRoom(), undefined, reportID)?.reportID; if (lastAccessedReportID) { const lastAccessedReportRoute = ROUTES.REPORT_WITH_ID.getRoute(lastAccessedReportID); Navigation.navigate(lastAccessedReportRoute); @@ -3504,7 +3504,9 @@ function getCurrentUserEmail(): string | undefined { return currentUserEmail; } -function navigateToMostRecentReport(currentReport: OnyxEntry, lastAccessedReportID: string | undefined) { +function navigateToMostRecentReport(currentReport: OnyxEntry) { + const lastAccessedReportID = findLastAccessedReport(false, false, undefined, currentReport?.reportID)?.reportID; + if (lastAccessedReportID) { const lastAccessedReportRoute = ROUTES.REPORT_WITH_ID.getRoute(lastAccessedReportID); Navigation.goBack(lastAccessedReportRoute); @@ -3520,7 +3522,8 @@ function navigateToMostRecentReport(currentReport: OnyxEntry, lastAccess } } -function getMostRecentReportID(lastAccessedReportID: string | undefined) { +function getMostRecentReportID(currentReport: OnyxEntry) { + const lastAccessedReportID = findLastAccessedReport(false, false, undefined, currentReport?.reportID)?.reportID; return lastAccessedReportID ?? conciergeReportID; } @@ -3537,7 +3540,7 @@ function joinRoom(report: OnyxEntry) { ); } -function leaveGroupChat(reportID: string, lastAccessedReportID: string | undefined) { +function leaveGroupChat(reportID: string) { const report = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${reportID}`]; if (!report) { Log.warn('Attempting to leave Group Chat that does not existing locally'); @@ -3589,12 +3592,12 @@ function leaveGroupChat(reportID: string, lastAccessedReportID: string | undefin }, ]; - navigateToMostRecentReport(report, lastAccessedReportID); + navigateToMostRecentReport(report); API.write(WRITE_COMMANDS.LEAVE_GROUP_CHAT, {reportID}, {optimisticData, successData, failureData}); } /** Leave a report by setting the state to submitted and closed */ -function leaveRoom(reportID: string, lastAccessedReportID: string | undefined, isWorkspaceMemberLeavingWorkspaceRoom = false) { +function leaveRoom(reportID: string, isWorkspaceMemberLeavingWorkspaceRoom = false) { const report = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${reportID}`]; if (!report) { @@ -3701,7 +3704,7 @@ function leaveRoom(reportID: string, lastAccessedReportID: string | undefined, i return; } // In other cases, the report is deleted and we should move the user to another report. - navigateToMostRecentReport(report, lastAccessedReportID); + navigateToMostRecentReport(report); } function buildInviteToRoomOnyxData(reportID: string, inviteeEmailsToAccountIDs: InvitedEmailsToAccountIDs, formatPhoneNumber: LocaleContextProps['formatPhoneNumber']) { diff --git a/src/libs/actions/Task.ts b/src/libs/actions/Task.ts index 00aa95afff36..255d91532e66 100644 --- a/src/libs/actions/Task.ts +++ b/src/libs/actions/Task.ts @@ -1045,7 +1045,7 @@ function getParentReport(report: OnyxEntry): OnyxEntry, lastAccessedReportID: string | undefined): string | undefined { +function getNavigationUrlOnTaskDelete(report: OnyxEntry): string | undefined { if (!report) { return undefined; } @@ -1062,7 +1062,7 @@ function getNavigationUrlOnTaskDelete(report: OnyxEntry, lastA } // If no parent report, try to navigate to most recent report - const mostRecentReportID = getMostRecentReportID(lastAccessedReportID); + const mostRecentReportID = getMostRecentReportID(report); if (mostRecentReportID) { return ROUTES.REPORT_WITH_ID.getRoute(mostRecentReportID); } @@ -1073,7 +1073,7 @@ function getNavigationUrlOnTaskDelete(report: OnyxEntry, lastA /** * Cancels a task by setting the report state to SUBMITTED and status to CLOSED */ -function deleteTask(report: OnyxEntry, lastAccessedReportID: string | undefined) { +function deleteTask(report: OnyxEntry) { if (!report) { return; } @@ -1212,7 +1212,7 @@ function deleteTask(report: OnyxEntry, lastAccessedReportID: s API.write(WRITE_COMMANDS.CANCEL_TASK, parameters, {optimisticData, successData, failureData}); notifyNewAction(report.reportID, currentUserAccountID); - const urlToNavigateBack = getNavigationUrlOnTaskDelete(report, lastAccessedReportID); + const urlToNavigateBack = getNavigationUrlOnTaskDelete(report); if (urlToNavigateBack) { Navigation.goBack(); return urlToNavigateBack; diff --git a/src/libs/navigateAfterOnboarding.ts b/src/libs/navigateAfterOnboarding.ts index 158ec69944c5..7c02ad4d5ced 100644 --- a/src/libs/navigateAfterOnboarding.ts +++ b/src/libs/navigateAfterOnboarding.ts @@ -1,13 +1,12 @@ -import type {OnyxEntry} from 'react-native-onyx'; import ROUTES from '@src/ROUTES'; -import type {Report} from '@src/types/onyx'; import {setDisableDismissOnEscape} from './actions/Modal'; +import shouldOpenOnAdminRoom from './Navigation/helpers/shouldOpenOnAdminRoom'; import Navigation from './Navigation/Navigation'; -import {isConciergeChatReport} from './ReportUtils'; +import {findLastAccessedReport, isConciergeChatReport} from './ReportUtils'; const navigateAfterOnboarding = ( isSmallScreenWidth: boolean, - lastAccessedReport: OnyxEntry, + canUseDefaultRooms: boolean | undefined, onboardingPolicyID?: string, onboardingAdminsChatReportID?: string, shouldPreventOpenAdminRoom = false, @@ -25,6 +24,7 @@ const navigateAfterOnboarding = ( reportID = onboardingAdminsChatReportID; } } else { + const lastAccessedReport = findLastAccessedReport(!canUseDefaultRooms, shouldOpenOnAdminRoom() && !shouldPreventOpenAdminRoom); const lastAccessedReportID = lastAccessedReport?.reportID; // we don't want to navigate to newly created workspaces after onboarding is completed. if (lastAccessedReportID && lastAccessedReport.policyID !== onboardingPolicyID && !isConciergeChatReport(lastAccessedReport)) { @@ -52,13 +52,13 @@ const navigateAfterOnboarding = ( const navigateAfterOnboardingWithMicrotaskQueue = ( isSmallScreenWidth: boolean, - lastAccessedReport: OnyxEntry, + canUseDefaultRooms: boolean | undefined, onboardingPolicyID?: string, onboardingAdminsChatReportID?: string, shouldPreventOpenAdminRoom = false, ) => { Navigation.setNavigationActionToMicrotaskQueue(() => { - navigateAfterOnboarding(isSmallScreenWidth, lastAccessedReport, onboardingPolicyID, onboardingAdminsChatReportID, shouldPreventOpenAdminRoom); + navigateAfterOnboarding(isSmallScreenWidth, canUseDefaultRooms, onboardingPolicyID, onboardingAdminsChatReportID, shouldPreventOpenAdminRoom); }); }; diff --git a/src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx b/src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx index 2446c18124e7..c5e6a5d32ed0 100644 --- a/src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx +++ b/src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx @@ -13,7 +13,6 @@ import ScrollView from '@components/ScrollView'; import Section from '@components/Section'; import Text from '@components/Text'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; -import useLastAccessedReport from '@hooks/useLastAccessedReport'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import useOnboardingMessages from '@hooks/useOnboardingMessages'; @@ -28,7 +27,6 @@ import {completeOnboarding} from '@libs/actions/Report'; import {setOnboardingAdminsChatReportID, setOnboardingPolicyID} from '@libs/actions/Welcome'; import {WRITE_COMMANDS} from '@libs/API/types'; import {navigateAfterOnboardingWithMicrotaskQueue} from '@libs/navigateAfterOnboarding'; -import shouldOpenOnAdminRoom from '@libs/Navigation/helpers/shouldOpenOnAdminRoom'; import Navigation from '@libs/Navigation/Navigation'; import {waitForIdle} from '@libs/Network/SequentialQueue'; import {shouldOnboardingRedirectToOldDot} from '@libs/OnboardingUtils'; @@ -61,9 +59,6 @@ function BaseOnboardingInterestedFeatures({shouldUseNativeStyles}: BaseOnboardin const {isBetaEnabled} = usePermissions(); const [session] = useOnyx(ONYXKEYS.SESSION, {canBeMissing: false}); - const shouldPreventOpenAdminRoom = (session?.email ?? '').includes('+'); - const {lastAccessReport} = useLastAccessedReport(!isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS), shouldOpenOnAdminRoom() && !shouldPreventOpenAdminRoom); - const paidGroupPolicy = Object.values(allPolicies ?? {}).find((policy) => isPaidGroupPolicy(policy) && isPolicyAdmin(policy, session?.email)); const [onboarding] = useOnyx(ONYXKEYS.NVP_ONBOARDING, {canBeMissing: true}); const {isOffline} = useNetwork(); @@ -237,28 +232,28 @@ function BaseOnboardingInterestedFeatures({shouldUseNativeStyles}: BaseOnboardin // We need to wait the policy is created before navigating out the onboarding flow navigateAfterOnboardingWithMicrotaskQueue( isSmallScreenWidth, - lastAccessReport, + isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS), policyID, adminsChatReportID, // Onboarding tasks would show in Concierge instead of admins room for testing accounts, we should open where onboarding tasks are located // See https://github.com/Expensify/App/issues/57167 for more details - shouldPreventOpenAdminRoom, + (session?.email ?? '').includes('+'), ); }, [ - onboardingPurposeSelected, + isBetaEnabled, + isSmallScreenWidth, + onboardingAdminsChatReportID, onboardingCompanySize, + onboardingMessages, onboardingPolicyID, + onboardingPurposeSelected, paidGroupPolicy, - selectedFeatures, + session?.email, userReportedIntegration, features, - onboardingAdminsChatReportID, - onboardingMessages, + selectedFeatures, currentUserPersonalDetails?.firstName, currentUserPersonalDetails?.lastName, - isSmallScreenWidth, - lastAccessReport, - shouldPreventOpenAdminRoom, ]); // Create items for enabled features diff --git a/src/pages/OnboardingPersonalDetails/BaseOnboardingPersonalDetails.tsx b/src/pages/OnboardingPersonalDetails/BaseOnboardingPersonalDetails.tsx index ea9936df4de3..830b92db9888 100644 --- a/src/pages/OnboardingPersonalDetails/BaseOnboardingPersonalDetails.tsx +++ b/src/pages/OnboardingPersonalDetails/BaseOnboardingPersonalDetails.tsx @@ -9,7 +9,6 @@ import Text from '@components/Text'; import TextInput from '@components/TextInput'; import withCurrentUserPersonalDetails from '@components/withCurrentUserPersonalDetails'; import useAutoFocusInput from '@hooks/useAutoFocusInput'; -import useLastAccessedReport from '@hooks/useLastAccessedReport'; import useLocalize from '@hooks/useLocalize'; import useOnboardingMessages from '@hooks/useOnboardingMessages'; import useOnyx from '@hooks/useOnyx'; @@ -18,7 +17,6 @@ import useResponsiveLayout from '@hooks/useResponsiveLayout'; import useThemeStyles from '@hooks/useThemeStyles'; import {addErrorMessage} from '@libs/ErrorUtils'; import {navigateAfterOnboardingWithMicrotaskQueue} from '@libs/navigateAfterOnboarding'; -import shouldOpenOnAdminRoom from '@libs/Navigation/helpers/shouldOpenOnAdminRoom'; import Navigation from '@libs/Navigation/Navigation'; import {isCurrentUserValidated} from '@libs/UserUtils'; import {doesContainReservedWord, isValidDisplayName} from '@libs/ValidationUtils'; @@ -54,8 +52,6 @@ function BaseOnboardingPersonalDetails({currentUserPersonalDetails, shouldUseNat const [shouldValidateOnChange, setShouldValidateOnChange] = useState(false); const {isBetaEnabled} = usePermissions(); - const {lastAccessReport} = useLastAccessedReport(!isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS), shouldOpenOnAdminRoom()); - const isPrivateDomainAndHasAccessiblePolicies = !account?.isFromPublicDomain && !!account?.hasAccessibleDomainPolicies; const isValidated = isCurrentUserValidated(loginList); @@ -83,9 +79,9 @@ function BaseOnboardingPersonalDetails({currentUserPersonalDetails, shouldUseNat setOnboardingAdminsChatReportID(); setOnboardingPolicyID(); - navigateAfterOnboardingWithMicrotaskQueue(isSmallScreenWidth, lastAccessReport, onboardingPolicyID, mergedAccountConciergeReportID, false); + navigateAfterOnboardingWithMicrotaskQueue(isSmallScreenWidth, isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS), onboardingPolicyID, mergedAccountConciergeReportID); }, - [onboardingPurposeSelected, onboardingAdminsChatReportID, onboardingMessages, onboardingPolicyID, lastAccessReport, isSmallScreenWidth, mergedAccountConciergeReportID], + [onboardingPurposeSelected, onboardingAdminsChatReportID, onboardingMessages, onboardingPolicyID, isBetaEnabled, isSmallScreenWidth, mergedAccountConciergeReportID], ); const handleSubmit = useCallback( diff --git a/src/pages/OnboardingWorkspaceInvite/BaseOnboardingWorkspaceInvite.tsx b/src/pages/OnboardingWorkspaceInvite/BaseOnboardingWorkspaceInvite.tsx index f93e3dd48aa3..ec8e3df2eaeb 100644 --- a/src/pages/OnboardingWorkspaceInvite/BaseOnboardingWorkspaceInvite.tsx +++ b/src/pages/OnboardingWorkspaceInvite/BaseOnboardingWorkspaceInvite.tsx @@ -12,7 +12,6 @@ import type {Section} from '@components/SelectionList/types'; import Text from '@components/Text'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; import useDebouncedState from '@hooks/useDebouncedState'; -import useLastAccessedReport from '@hooks/useLastAccessedReport'; import useLocalize from '@hooks/useLocalize'; import useOnboardingMessages from '@hooks/useOnboardingMessages'; import useOnyx from '@hooks/useOnyx'; @@ -27,7 +26,6 @@ import {canUseTouchScreen} from '@libs/DeviceCapabilities'; import HttpUtils from '@libs/HttpUtils'; import {appendCountryCode} from '@libs/LoginUtils'; import {navigateAfterOnboardingWithMicrotaskQueue} from '@libs/navigateAfterOnboarding'; -import shouldOpenOnAdminRoom from '@libs/Navigation/helpers/shouldOpenOnAdminRoom'; import type {MemberForList} from '@libs/OptionsListUtils'; import {filterAndOrderOptions, formatMemberForList, getHeaderMessage, getMemberInviteOptions, getSearchValueForPhoneOrEmail} from '@libs/OptionsListUtils'; import {addSMSDomainIfPhoneNumber, parsePhoneNumber} from '@libs/PhoneNumber'; @@ -63,10 +61,6 @@ function BaseOnboardingWorkspaceInvite({shouldUseNativeStyles}: BaseOnboardingWo const currentUserPersonalDetails = useCurrentUserPersonalDetails(); const session = useSession(); const {isBetaEnabled} = usePermissions(); - - const shouldPreventOpenAdminRoom = (session?.email ?? '').includes('+'); - const {lastAccessReport} = useLastAccessedReport(!isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS), shouldOpenOnAdminRoom() && !shouldPreventOpenAdminRoom); - const {options, areOptionsInitialized} = useOptionsList({ shouldInitialize: didScreenTransitionEnd, }); @@ -238,22 +232,22 @@ function BaseOnboardingWorkspaceInvite({shouldUseNativeStyles}: BaseOnboardingWo navigateAfterOnboardingWithMicrotaskQueue( isSmallScreenWidth, - lastAccessReport, + isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS), onboardingPolicyID, onboardingAdminsChatReportID, // Onboarding tasks would show in Concierge instead of admins room for testing accounts, we should open where onboarding tasks are located // See https://github.com/Expensify/App/issues/57167 for more details - shouldPreventOpenAdminRoom, + (session?.email ?? '').includes('+'), ); }, [ - onboardingMessages, currentUserPersonalDetails.firstName, + onboardingMessages, currentUserPersonalDetails.lastName, onboardingAdminsChatReportID, onboardingPolicyID, isSmallScreenWidth, - lastAccessReport, - shouldPreventOpenAdminRoom, + isBetaEnabled, + session?.email, ]); const inviteUser = useCallback(() => { diff --git a/src/pages/OnboardingWorkspaceOptional/BaseOnboardingWorkspaceOptional.tsx b/src/pages/OnboardingWorkspaceOptional/BaseOnboardingWorkspaceOptional.tsx index 35816ce0c624..4b59caa15abd 100644 --- a/src/pages/OnboardingWorkspaceOptional/BaseOnboardingWorkspaceOptional.tsx +++ b/src/pages/OnboardingWorkspaceOptional/BaseOnboardingWorkspaceOptional.tsx @@ -8,7 +8,6 @@ import RenderHTML from '@components/RenderHTML'; import ScreenWrapper from '@components/ScreenWrapper'; import Text from '@components/Text'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; -import useLastAccessedReport from '@hooks/useLastAccessedReport'; import useLocalize from '@hooks/useLocalize'; import useOnboardingMessages from '@hooks/useOnboardingMessages'; import useOnyx from '@hooks/useOnyx'; @@ -16,7 +15,6 @@ import usePermissions from '@hooks/usePermissions'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; import useThemeStyles from '@hooks/useThemeStyles'; import {navigateAfterOnboardingWithMicrotaskQueue} from '@libs/navigateAfterOnboarding'; -import shouldOpenOnAdminRoom from '@libs/Navigation/helpers/shouldOpenOnAdminRoom'; import Navigation from '@libs/Navigation/Navigation'; import {completeOnboarding as completeOnboardingReport} from '@userActions/Report'; import {setOnboardingAdminsChatReportID, setOnboardingErrorMessage, setOnboardingPolicyID} from '@userActions/Welcome'; @@ -49,8 +47,6 @@ function BaseOnboardingWorkspaceOptional({shouldUseNativeStyles}: BaseOnboarding const {onboardingIsMediumOrLargerScreenWidth, isSmallScreenWidth} = useResponsiveLayout(); const currentUserPersonalDetails = useCurrentUserPersonalDetails(); const {isBetaEnabled} = usePermissions(); - - const {lastAccessReport} = useLastAccessedReport(!isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS), shouldOpenOnAdminRoom()); const ICON_SIZE = 48; const processedHelperText = `${translate('onboarding.workspace.price')}`; @@ -91,7 +87,7 @@ function BaseOnboardingWorkspaceOptional({shouldUseNativeStyles}: BaseOnboarding setOnboardingAdminsChatReportID(); setOnboardingPolicyID(); - navigateAfterOnboardingWithMicrotaskQueue(isSmallScreenWidth, lastAccessReport, onboardingPolicyID, mergedAccountConciergeReportID, false); + navigateAfterOnboardingWithMicrotaskQueue(isSmallScreenWidth, isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS), onboardingPolicyID, mergedAccountConciergeReportID); }, [ onboardingPurposeSelected, currentUserPersonalDetails.firstName, @@ -99,8 +95,8 @@ function BaseOnboardingWorkspaceOptional({shouldUseNativeStyles}: BaseOnboarding onboardingAdminsChatReportID, onboardingMessages, onboardingPolicyID, - lastAccessReport, isSmallScreenWidth, + isBetaEnabled, mergedAccountConciergeReportID, ]); diff --git a/src/pages/OnboardingWorkspaces/BaseOnboardingWorkspaces.tsx b/src/pages/OnboardingWorkspaces/BaseOnboardingWorkspaces.tsx index bc326c17ca7f..1c2812c502a2 100644 --- a/src/pages/OnboardingWorkspaces/BaseOnboardingWorkspaces.tsx +++ b/src/pages/OnboardingWorkspaces/BaseOnboardingWorkspaces.tsx @@ -8,7 +8,6 @@ import ScreenWrapper from '@components/ScreenWrapper'; import SelectionList from '@components/SelectionList'; import UserListItem from '@components/SelectionList/UserListItem'; import Text from '@components/Text'; -import useLastAccessedReport from '@hooks/useLastAccessedReport'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import useOnboardingMessages from '@hooks/useOnboardingMessages'; @@ -17,7 +16,6 @@ import usePermissions from '@hooks/usePermissions'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; import useThemeStyles from '@hooks/useThemeStyles'; import {navigateAfterOnboardingWithMicrotaskQueue} from '@libs/navigateAfterOnboarding'; -import shouldOpenOnAdminRoom from '@libs/Navigation/helpers/shouldOpenOnAdminRoom'; import Navigation from '@libs/Navigation/Navigation'; import {getDefaultWorkspaceAvatar} from '@libs/ReportUtils'; import {isCurrentUserValidated} from '@libs/UserUtils'; @@ -54,8 +52,6 @@ function BaseOnboardingWorkspaces({route, shouldUseNativeStyles}: BaseOnboarding const {isBetaEnabled} = usePermissions(); - const {lastAccessReport} = useLastAccessedReport(!isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS), shouldOpenOnAdminRoom()); - const [onboardingValues] = useOnyx(ONYXKEYS.NVP_ONBOARDING, {canBeMissing: true}); const isVsb = onboardingValues?.signupQualifier === CONST.ONBOARDING_SIGNUP_QUALIFIERS.VSB; const isSmb = onboardingValues?.signupQualifier === CONST.ONBOARDING_SIGNUP_QUALIFIERS.SMB; @@ -76,9 +72,9 @@ function BaseOnboardingWorkspaces({route, shouldUseNativeStyles}: BaseOnboarding setOnboardingAdminsChatReportID(); setOnboardingPolicyID(policy.policyID); - navigateAfterOnboardingWithMicrotaskQueue(isSmallScreenWidth, lastAccessReport, policy.automaticJoiningEnabled ? policy.policyID : undefined, undefined, false); + navigateAfterOnboardingWithMicrotaskQueue(isSmallScreenWidth, isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS), policy.automaticJoiningEnabled ? policy.policyID : undefined); }, - [onboardingMessages, onboardingPersonalDetails?.firstName, onboardingPersonalDetails?.lastName, lastAccessReport, isSmallScreenWidth], + [onboardingMessages, onboardingPersonalDetails?.firstName, onboardingPersonalDetails?.lastName, isSmallScreenWidth, isBetaEnabled], ); const policyIDItems = useMemo(() => { diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index e35dddcad6c0..2fabbf45749b 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -24,7 +24,6 @@ import ScrollView from '@components/ScrollView'; import {useSearchContext} from '@components/Search/SearchContext'; import TextWithCopy from '@components/TextWithCopy'; import useDuplicateTransactionsAndViolations from '@hooks/useDuplicateTransactionsAndViolations'; -import useLastAccessedReport from '@hooks/useLastAccessedReport'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import useOnyx from '@hooks/useOnyx'; @@ -149,8 +148,6 @@ function ReportDetailsPage({policy, report, route, reportMetadata}: ReportDetail const styles = useThemeStyles(); const backTo = route.params.backTo; - const {lastAccessReportID} = useLastAccessedReport(false, false, undefined, report.reportID); - const [parentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${report.parentReportID}`, {canBeMissing: true}); const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${report.chatReportID}`, {canBeMissing: true}); @@ -307,13 +304,13 @@ function ReportDetailsPage({policy, report, route, reportMetadata}: ReportDetail Navigation.dismissModal(); Navigation.isNavigationReady().then(() => { if (isRootGroupChat) { - leaveGroupChat(report.reportID, lastAccessReportID); + leaveGroupChat(report.reportID); return; } const isWorkspaceMemberLeavingWorkspaceRoom = (report.visibility === CONST.REPORT.VISIBILITY.RESTRICTED || isPolicyExpenseChat) && isPolicyEmployee; - leaveRoom(report.reportID, lastAccessReportID, isWorkspaceMemberLeavingWorkspaceRoom); + leaveRoom(report.reportID, isWorkspaceMemberLeavingWorkspaceRoom); }); - }, [isPolicyEmployee, isPolicyExpenseChat, isRootGroupChat, report.reportID, report.visibility, lastAccessReportID]); + }, [isPolicyEmployee, isPolicyExpenseChat, isRootGroupChat, report.reportID, report.visibility]); const shouldShowLeaveButton = canLeaveChat(report, policy, !!reportNameValuePairs?.private_isArchived); const shouldShowGoToWorkspace = shouldShowPolicy(policy, false, session?.email) && !policy?.isJoinRequestPending; @@ -771,7 +768,7 @@ function ReportDetailsPage({policy, report, route, reportMetadata}: ReportDetail const deleteTransaction = useCallback(() => { if (caseID === CASES.DEFAULT) { - deleteTask(report, lastAccessReportID); + deleteTask(report); return; } @@ -788,16 +785,15 @@ function ReportDetailsPage({policy, report, route, reportMetadata}: ReportDetail removeTransaction(iouTransactionID); } }, [ - caseID, - requestParentReportAction, - report, - lastAccessReportID, - moneyRequestReport?.reportID, - iouTransactionID, duplicateTransactions, duplicateTransactionViolations, + caseID, + iouTransactionID, isSingleTransactionView, + moneyRequestReport?.reportID, removeTransaction, + report, + requestParentReportAction, ]); // A flag to indicate whether the user chose to delete the transaction or not diff --git a/src/pages/home/HeaderView.tsx b/src/pages/home/HeaderView.tsx index c133f07d26f7..84307de89c72 100644 --- a/src/pages/home/HeaderView.tsx +++ b/src/pages/home/HeaderView.tsx @@ -22,7 +22,6 @@ import TaskHeaderActionButton from '@components/TaskHeaderActionButton'; import Text from '@components/Text'; import Tooltip from '@components/Tooltip'; import useHasTeam2025Pricing from '@hooks/useHasTeam2025Pricing'; -import useLastAccessedReport from '@hooks/useLastAccessedReport'; import useLoadingBarVisibility from '@hooks/useLoadingBarVisibility'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; @@ -111,7 +110,6 @@ function HeaderView({report, parentReportAction, onNavigationMenuButtonClicked, const [reportNameValuePairs] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.reportID}`, {canBeMissing: true}); const [reportMetadata] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_METADATA}${report?.reportID}`, {canBeMissing: true}); const isReportArchived = isArchivedReport(reportNameValuePairs); - const {lastAccessReportID} = useLastAccessedReport(false, false, undefined, report?.reportID); const {translate, localeCompare} = useLocalize(); const theme = useTheme(); @@ -358,7 +356,7 @@ function HeaderView({report, parentReportAction, onNavigationMenuButtonClicked, isVisible={isDeleteTaskConfirmModalVisible} onConfirm={() => { setIsDeleteTaskConfirmModalVisible(false); - deleteTask(report, lastAccessReportID); + deleteTask(report); }} onCancel={() => setIsDeleteTaskConfirmModalVisible(false)} title={translate('task.deleteTask')} diff --git a/src/pages/home/ReportScreen.tsx b/src/pages/home/ReportScreen.tsx index 8d05aaa3fb70..e6df82f391a6 100644 --- a/src/pages/home/ReportScreen.tsx +++ b/src/pages/home/ReportScreen.tsx @@ -19,7 +19,6 @@ import useAppFocusEvent from '@hooks/useAppFocusEvent'; import useCurrentReportID from '@hooks/useCurrentReportID'; import useDeepCompareRef from '@hooks/useDeepCompareRef'; import useIsReportReadyToDisplay from '@hooks/useIsReportReadyToDisplay'; -import useLastAccessedReport from '@hooks/useLastAccessedReport'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import useNewTransactions from '@hooks/useNewTransactions'; @@ -53,6 +52,7 @@ import { import { canEditReportAction, canUserPerformWriteAction, + findLastAccessedReport, getParticipantsAccountIDsForDisplay, getReportOfflinePendingActionAndErrors, isChatThread, @@ -166,8 +166,6 @@ function ReportScreen({route, navigation}: ReportScreenProps) { const permissions = useDeepCompareRef(reportOnyx?.permissions); - const {lastAccessReportID} = useLastAccessedReport(!isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS), !!route.params.openOnAdminRoom); - useEffect(() => { // Don't update if there is a reportID in the params already if (route.params.reportID) { @@ -179,15 +177,17 @@ function ReportScreen({route, navigation}: ReportScreenProps) { return; } + const lastAccessedReportID = findLastAccessedReport(!isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS), !!route.params.openOnAdminRoom)?.reportID; + // It's possible that reports aren't fully loaded yet // in that case the reportID is undefined - if (!lastAccessReportID) { + if (!lastAccessedReportID) { return; } - Log.info(`[ReportScreen] no reportID found in params, setting it to lastAccessedReportID: ${lastAccessReportID}`); - navigation.setParams({reportID: lastAccessReportID}); - }, [lastAccessReportID, navigation, route]); + Log.info(`[ReportScreen] no reportID found in params, setting it to lastAccessedReportID: ${lastAccessedReportID}`); + navigation.setParams({reportID: lastAccessedReportID}); + }, [isBetaEnabled, navigation, route]); const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {canBeMissing: true}); const chatWithAccountManagerText = useMemo(() => { diff --git a/tests/perf-test/ReportUtils.perf-test.ts b/tests/perf-test/ReportUtils.perf-test.ts index 8e8153c849f9..67b33740f497 100644 --- a/tests/perf-test/ReportUtils.perf-test.ts +++ b/tests/perf-test/ReportUtils.perf-test.ts @@ -3,7 +3,7 @@ import {measureFunction} from 'reassure'; import { canDeleteReportAction, canShowReportRecipientLocalTime, - findLastAccessedReportWithoutView, + findLastAccessedReport, getDisplayNamesWithTooltips, getIcons, getIconsForParticipants, @@ -85,7 +85,7 @@ describe('ReportUtils', () => { }); await waitForBatchedUpdates(); - await measureFunction(() => findLastAccessedReportWithoutView(ignoreDomainRooms, openOnAdminRoom)); + await measureFunction(() => findLastAccessedReport(ignoreDomainRooms, openOnAdminRoom)); }); test('[ReportUtils] canDeleteReportAction on 1k reports and policies', async () => { diff --git a/tests/unit/ReportUtilsTest.ts b/tests/unit/ReportUtilsTest.ts index 473350f42442..47884239ae9b 100644 --- a/tests/unit/ReportUtilsTest.ts +++ b/tests/unit/ReportUtilsTest.ts @@ -33,7 +33,7 @@ import { canLeaveChat, canSeeDefaultRoom, canUserPerformWriteAction, - findLastAccessedReportWithoutView, + findLastAccessedReport, getAllAncestorReportActions, getApprovalChain, getChatByParticipants, @@ -3086,7 +3086,7 @@ describe('ReportUtils', () => { }); it('should not return an archived report even if it was most recently accessed', () => { - const result = findLastAccessedReportWithoutView(false); + const result = findLastAccessedReport(false); // Even though the archived report has a more recent lastVisitTime, // the function should filter it out and return the normal report @@ -3129,7 +3129,7 @@ describe('ReportUtils', () => { }); it('findLastAccessedReport should return owned report if no reports was accessed before', () => { - const result = findLastAccessedReportWithoutView(false); + const result = findLastAccessedReport(false); // Even though the archived report has a more recent lastVisitTime, // the function should filter it out and return the normal report diff --git a/tests/unit/navigateAfterOnboardingTest.ts b/tests/unit/navigateAfterOnboardingTest.ts index 639f1b9023e4..f238d7c3959b 100644 --- a/tests/unit/navigateAfterOnboardingTest.ts +++ b/tests/unit/navigateAfterOnboardingTest.ts @@ -66,12 +66,12 @@ describe('navigateAfterOnboarding', () => { const navigate = jest.spyOn(Navigation, 'navigate'); const testSession = {email: 'realaccount@gmail.com'}; - navigateAfterOnboarding(false, undefined, undefined, ONBOARDING_ADMINS_CHAT_REPORT_ID, (testSession?.email ?? '').includes('+')); + navigateAfterOnboarding(false, true, undefined, ONBOARDING_ADMINS_CHAT_REPORT_ID, (testSession?.email ?? '').includes('+')); expect(navigate).toHaveBeenCalledWith(ROUTES.REPORT_WITH_ID.getRoute(ONBOARDING_ADMINS_CHAT_REPORT_ID)); }); it('should not navigate to the admin room report if onboardingAdminsChatReportID is not provided on larger screens', () => { - navigateAfterOnboarding(false, undefined, undefined, undefined); + navigateAfterOnboarding(false, true, undefined, undefined); expect(Navigation.navigate).not.toHaveBeenCalledWith(ROUTES.REPORT_WITH_ID.getRoute(undefined)); }); @@ -88,36 +88,40 @@ describe('navigateAfterOnboarding', () => { }; await Onyx.set(ONYXKEYS.CONCIERGE_REPORT_ID, REPORT_ID); await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${REPORT_ID}`, lastAccessedReport); + mockFindLastAccessedReport.mockReturnValue(lastAccessedReport); mockShouldOpenOnAdminRoom.mockReturnValue(false); - navigateAfterOnboarding(true, lastAccessedReport, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID); + navigateAfterOnboarding(true, true, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID); expect(navigate).not.toHaveBeenCalledWith(ROUTES.REPORT_WITH_ID.getRoute(REPORT_ID)); }); it('should not navigate to last accessed report if it is onboarding expense chat on small screens', () => { const lastAccessedReport = {reportID: REPORT_ID, policyID: ONBOARDING_POLICY_ID}; + mockFindLastAccessedReport.mockReturnValue(lastAccessedReport); mockShouldOpenOnAdminRoom.mockReturnValue(false); - navigateAfterOnboarding(true, lastAccessedReport, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID); + navigateAfterOnboarding(true, true, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID); expect(Navigation.navigate).not.toHaveBeenCalledWith(ROUTES.REPORT_WITH_ID.getRoute(REPORT_ID)); }); it('should navigate to last accessed report if shouldOpenOnAdminRoom is true on small screens', () => { const navigate = jest.spyOn(Navigation, 'navigate'); const lastAccessedReport = {reportID: REPORT_ID}; + mockFindLastAccessedReport.mockReturnValue(lastAccessedReport); mockShouldOpenOnAdminRoom.mockReturnValue(true); - navigateAfterOnboarding(true, lastAccessedReport, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID); + navigateAfterOnboarding(true, true, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID); expect(navigate).toHaveBeenCalledWith(ROUTES.REPORT_WITH_ID.getRoute(REPORT_ID)); }); it('should navigate to Concierge room if user uses a test email', () => { const navigate = jest.spyOn(Navigation, 'navigate'); const lastAccessedReport = {reportID: REPORT_ID}; + mockFindLastAccessedReport.mockReturnValue(lastAccessedReport); mockShouldOpenOnAdminRoom.mockReturnValue(true); const testSession = {email: 'test+account@gmail.com'}; - navigateAfterOnboarding(true, lastAccessedReport, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID, (testSession?.email ?? '').includes('+')); + navigateAfterOnboarding(true, true, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID, (testSession?.email ?? '').includes('+')); expect(navigate).toHaveBeenCalledWith(ROUTES.REPORT_WITH_ID.getRoute(REPORT_ID)); }); @@ -125,7 +129,7 @@ describe('navigateAfterOnboarding', () => { const navigate = jest.spyOn(Navigation, 'navigate'); jest.spyOn(Navigation, 'isNavigationReady').mockReturnValue(Promise.resolve()); - navigateAfterOnboarding(true, undefined); + navigateAfterOnboarding(true, true); await waitFor(() => expect(navigate).toHaveBeenCalledWith(ROUTES.TEST_DRIVE_MODAL_ROOT.route)); }); });