diff --git a/src/hooks/useAutoCreateTrackWorkspace.ts b/src/hooks/useAutoCreateTrackWorkspace.ts index c79150251df5..b11e4c97a1fb 100644 --- a/src/hooks/useAutoCreateTrackWorkspace.ts +++ b/src/hooks/useAutoCreateTrackWorkspace.ts @@ -19,6 +19,7 @@ import type {OnyxCollection} from 'react-native-onyx'; import {useCallback, useMemo} from 'react'; import useDelegateAccountID from './useDelegateAccountID'; +import useIsAnonymousUser from './useIsAnonymousUser'; import useOnboardingWorkspaceCreationState from './useOnboardingWorkspaceCreationState'; import useOnyx from './useOnyx'; import usePermissions from './usePermissions'; @@ -62,6 +63,7 @@ function useAutoCreateTrackWorkspace() { const [selfDMReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${selfDMReportID}`); const [onboardingValues] = useOnyx(ONYXKEYS.NVP_ONBOARDING); const [reportNameValuePairs] = useOnyx(ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS); + const isAnonymousUser = useIsAnonymousUser(); const {isBetaEnabled} = usePermissions(); const delegateAccountID = useDelegateAccountID(); @@ -143,6 +145,7 @@ function useAutoCreateTrackWorkspace() { isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS), conciergeChatReportID, reportNameValuePairs, + isAnonymousUser, newPolicyID, mergedAccountConciergeReportID, false, @@ -172,6 +175,7 @@ function useAutoCreateTrackWorkspace() { isBetaEnabled, conciergeChatReportID, reportNameValuePairs, + isAnonymousUser, mergedAccountConciergeReportID, conciergeChat, selfDMReport, diff --git a/src/hooks/useCompleteOnboarding.ts b/src/hooks/useCompleteOnboarding.ts index 0d432a3b4f92..bb8943332ccc 100644 --- a/src/hooks/useCompleteOnboarding.ts +++ b/src/hooks/useCompleteOnboarding.ts @@ -21,6 +21,7 @@ import useCurrentUserPersonalDetails from './useCurrentUserPersonalDetails'; import useDelegateAccountID from './useDelegateAccountID'; import useHasActiveAdminPolicies from './useHasActiveAdminPolicies'; import useHasOwnedPaidPolicy from './useHasOwnedPaidPolicy'; +import useIsAnonymousUser from './useIsAnonymousUser'; import useLastWorkspaceNumber from './useLastWorkspaceNumber'; import useLocalize from './useLocalize'; import useOnboardingMessages from './useOnboardingMessages'; @@ -59,6 +60,7 @@ function useCompleteOnboarding() { const [adminsChatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${onboardingAdminsChatReportID}`); const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY); const [reportNameValuePairs] = useOnyx(ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS); + const isAnonymousUser = useIsAnonymousUser(); const [isLoading, setIsLoading] = useState(false); const groupPolicy = Object.values(allPolicies ?? {}).find((policy) => isGroupPolicy(policy) && isPolicyAdmin(policy, currentUserPersonalDetails.email)); @@ -143,6 +145,7 @@ function useCompleteOnboarding() { isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS), conciergeReportID, reportNameValuePairs, + isAnonymousUser, policyID, adminsChatReportID, (currentUserPersonalDetails.email ?? '').includes('+'), diff --git a/src/hooks/useFindLastAccessedReport.ts b/src/hooks/useFindLastAccessedReport.ts index c371cb4d6ac0..cb5e767acbfb 100644 --- a/src/hooks/useFindLastAccessedReport.ts +++ b/src/hooks/useFindLastAccessedReport.ts @@ -4,6 +4,7 @@ import {findLastAccessedReport} from '@libs/ReportUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; +import useIsAnonymousUser from './useIsAnonymousUser'; import useOnyx from './useOnyx'; import usePermissions from './usePermissions'; @@ -20,9 +21,11 @@ function useFindLastAccessedReport({openOnAdminRoom, enabled = true}: UseFindLas const ignoreDomainRooms = !isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS); const shouldPreferAdminRoom = openOnAdminRoom ?? shouldOpenOnAdminRoom(); const [guideAccountIDs] = useOnyx(ONYXKEYS.DERIVED.GUIDE_ACCOUNT_IDS); + const isAnonymousUser = useIsAnonymousUser(); const [reportNameValuePairs, reportNameValuePairsMetadata] = useOnyx(ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS); const [lastAccessedReportID, reportsMetadata] = useOnyx(ONYXKEYS.COLLECTION.REPORT, { - selector: (reports) => (enabled ? findLastAccessedReport(ignoreDomainRooms, guideAccountIDs, shouldPreferAdminRoom, undefined, reportNameValuePairs, reports)?.reportID : undefined), + selector: (reports) => + enabled ? findLastAccessedReport(ignoreDomainRooms, guideAccountIDs, isAnonymousUser, shouldPreferAdminRoom, undefined, reportNameValuePairs, reports)?.reportID : undefined, }); return {lastAccessedReportID, reportsMetadata, reportNameValuePairsMetadata}; } diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index e191ec76d575..0af00e1a44ad 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -108,7 +108,6 @@ import type {AvatarSource} from './UserAvatarUtils'; import {isIntuitEnterpriseSuiteConnection} from './AccountingUtils'; import {getBankAccountFromID} from './actions/BankAccounts'; import hasCreditBankAccount from './actions/ReimbursementAccount/hasCreditBankAccount'; -import {isAnonymousUser as isAnonymousUserSession} from './actions/Session'; import {convertAttendeesToArray, normalizeAttendees} from './AttendeeUtils'; import {buildOnboardingMessagesWithoutManageTeam} from './buildOnboardingMessages'; import {isCardWithPotentialFraud} from './CardUtils'; @@ -2571,9 +2570,9 @@ function hasExpensifyGuidesEmails(accountIDs: number[], guideAccountIDs: GuideAc return accountIDs.some((accountID) => Str.extractEmailDomain(getPersonalDetail(accountID)?.login ?? '') === CONST.EMAIL.GUIDES_DOMAIN); } -function getMostRecentlyVisitedReport(reports: Array>, lastVisitTimes: Record): OnyxEntry { +function getMostRecentlyVisitedReport(reports: Array>, lastVisitTimes: Record, isAnonymousUser: boolean): OnyxEntry { const filteredReports = reports.filter((report) => { - if (!report?.isPinned && isHiddenForCurrentUser(report) && !(isPublicRoom(report) && isAnonymousUserSession())) { + if (!report?.isPinned && isHiddenForCurrentUser(report) && !(isPublicRoom(report) && isAnonymousUser)) { return false; } return !!report?.reportID && !!(lastVisitTimes?.[report.reportID] ?? report?.lastReadTime); @@ -2600,6 +2599,7 @@ function toLastAccessedReport(report: OnyxEntry): LastAccessedReport | u function findLastAccessedReport( ignoreDomainRooms: boolean, guideAccountIDs: GuideAccountIDsDerivedValue | undefined, + isAnonymousUser: boolean, openOnAdminRoom = false, excludeReportID?: string, reportNameValuePairs?: OnyxCollection, @@ -2631,7 +2631,7 @@ function findLastAccessedReport( // and it prompts the user to use the Concierge chat instead. return !isSystemChat(report) && !isArchivedReport(reportNameValuePairsCollection?.[`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${report?.reportID}`]); }; - const isVisible = (report: OnyxEntry) => !!report?.isPinned || !isHiddenForCurrentUser(report) || (isPublicRoom(report) && isAnonymousUserSession()); + const isVisible = (report: OnyxEntry) => !!report?.isPinned || !isHiddenForCurrentUser(report) || (isPublicRoom(report) && isAnonymousUser); // Any visited report outranks every unvisited one, so pick the newest eligible visit instead of scanning all reports. let newestVisitTime = ''; @@ -2663,7 +2663,7 @@ function findLastAccessedReport( } return toLastAccessedReport(lodashMaxBy(reportsValues, (a) => a?.lastReadTime ?? '')); } - return toLastAccessedReport(getMostRecentlyVisitedReport(reportsValues, allReportLastVisitTimes)); + return toLastAccessedReport(getMostRecentlyVisitedReport(reportsValues, allReportLastVisitTimes, isAnonymousUser)); } /** @@ -12982,7 +12982,7 @@ function canJoinChat( /** * Whether the user can leave a report */ -function canLeaveChat(report: OnyxEntry, policy: OnyxEntry, currentUserAccountID: number | undefined, isReportArchived = false): boolean { +function canLeaveChat(report: OnyxEntry, policy: OnyxEntry, currentUserAccountID: number | undefined, isAnonymousUser: boolean, isReportArchived = false): boolean { if (isRootGroupChat(report, isReportArchived)) { return true; } @@ -12991,7 +12991,7 @@ function canLeaveChat(report: OnyxEntry, policy: OnyxEntry, curr return true; } - if (isPublicRoom(report) && isAnonymousUserSession()) { + if (isPublicRoom(report) && isAnonymousUser) { return false; } diff --git a/src/libs/actions/Link.ts b/src/libs/actions/Link.ts index e83a24383d13..e42f3bbff746 100644 --- a/src/libs/actions/Link.ts +++ b/src/libs/actions/Link.ts @@ -582,7 +582,7 @@ function openReportFromDeepLink( // If the report does not exist, navigate to the last accessed report or Concierge chat if (reportID && (!report?.reportID || report.errorFields?.notFound)) { // TODO: Pass guideAccountIDs once callers are fully migrated — PR 33 (https://github.com/Expensify/App/issues/66413); findLastAccessedReport falls back to hasExpensifyGuidesEmails → allPersonalDetails - const lastAccessedReportID = findLastAccessedReport(false, undefined, shouldOpenOnAdminRoom(), reportID, reportNameValuePairs)?.reportID; + const lastAccessedReportID = findLastAccessedReport(false, undefined, isAnonymousUser(), shouldOpenOnAdminRoom(), reportID, reportNameValuePairs)?.reportID; if (lastAccessedReportID) { const lastAccessedReportRoute = ROUTES.REPORT_WITH_ID.getRoute(lastAccessedReportID); Navigation.navigate(lastAccessedReportRoute, {forceReplace: Navigation.getTopmostReportId() === reportID, waitForTransition: true}); diff --git a/src/libs/navigateAfterOnboarding.ts b/src/libs/navigateAfterOnboarding.ts index 4ef611026a60..bc6f6de5f05f 100644 --- a/src/libs/navigateAfterOnboarding.ts +++ b/src/libs/navigateAfterOnboarding.ts @@ -72,6 +72,7 @@ function getReportIDAfterOnboarding( canUseDefaultRooms: boolean | undefined, conciergeReportID: string | undefined, reportNameValuePairs: OnyxCollection, + isAnonymousUser: boolean, onboardingPolicyID?: string, onboardingAdminsChatReportID?: string, shouldPreventOpenAdminRoom = false, @@ -87,7 +88,14 @@ function getReportIDAfterOnboarding( } // TODO: Pass guideAccountIDs once callers are fully migrated — PR 33 (https://github.com/Expensify/App/issues/66413); findLastAccessedReport falls back to hasExpensifyGuidesEmails → allPersonalDetails - const lastAccessedReport = findLastAccessedReport(!canUseDefaultRooms, undefined, shouldOpenOnAdminRoom() && !shouldPreventOpenAdminRoom, undefined, reportNameValuePairs); + const lastAccessedReport = findLastAccessedReport( + !canUseDefaultRooms, + undefined, + isAnonymousUser, + shouldOpenOnAdminRoom() && !shouldPreventOpenAdminRoom, + undefined, + reportNameValuePairs, + ); const lastAccessedReportID = lastAccessedReport?.reportID; // When the user goes through the onboarding flow, a workspace can be created if the user selects specific options. The user should be taken to the #admins room for that workspace because it is the most natural place for them to start their experience in the app. @@ -109,6 +117,7 @@ function navigateAfterOnboarding( canUseDefaultRooms: boolean | undefined, conciergeReportID: string | undefined, reportNameValuePairs: OnyxCollection, + isAnonymousUser: boolean, onboardingPolicyID?: string, onboardingAdminsChatReportID?: string, shouldPreventOpenAdminRoom = false, @@ -153,6 +162,7 @@ function navigateAfterOnboarding( canUseDefaultRooms, conciergeReportID, reportNameValuePairs, + isAnonymousUser, onboardingPolicyID, onboardingAdminsChatReportID, shouldPreventOpenAdminRoom, @@ -170,6 +180,7 @@ function navigateAfterOnboardingWithMicrotaskQueue( canUseDefaultRooms: boolean | undefined, conciergeReportID: string | undefined, reportNameValuePairs: OnyxCollection, + isAnonymousUser: boolean, onboardingPolicyID?: string, onboardingAdminsChatReportID?: string, shouldPreventOpenAdminRoom = false, @@ -182,6 +193,7 @@ function navigateAfterOnboardingWithMicrotaskQueue( canUseDefaultRooms, conciergeReportID, reportNameValuePairs, + isAnonymousUser, onboardingPolicyID, onboardingAdminsChatReportID, shouldPreventOpenAdminRoom, diff --git a/src/pages/DynamicReportDetailsPage/ReportDetailsMenuLeaveItem.tsx b/src/pages/DynamicReportDetailsPage/ReportDetailsMenuLeaveItem.tsx index f86d68f191db..b96aced4aae5 100644 --- a/src/pages/DynamicReportDetailsPage/ReportDetailsMenuLeaveItem.tsx +++ b/src/pages/DynamicReportDetailsPage/ReportDetailsMenuLeaveItem.tsx @@ -3,6 +3,7 @@ import {ModalActions} from '@components/Modal/Global/ModalContext'; import useConfirmModal from '@hooks/useConfirmModal'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; +import useIsAnonymousUser from '@hooks/useIsAnonymousUser'; import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; @@ -46,10 +47,11 @@ function ReportDetailsMenuLeaveItem({reportID}: ReportDetailsMenuLeaveItemProps) const [personalDetails] = useAllPersonalDetails(); const currentUserPersonalDetails = useCurrentUserPersonalDetails(); const currentUserAccountID = currentUserPersonalDetails?.accountID; + const isAnonymousUser = useIsAnonymousUser(); const isReportArchived = useReportIsArchived(reportID); const {showConfirmModal} = useConfirmModal(); - const shouldShowLeaveButton = canLeaveChat(report, policy, currentUserAccountID, !!reportNameValuePairs?.private_isArchived); + const shouldShowLeaveButton = canLeaveChat(report, policy, currentUserAccountID, isAnonymousUser, !!reportNameValuePairs?.private_isArchived); if (!report || !shouldShowLeaveButton) { return null; @@ -61,7 +63,7 @@ function ReportDetailsMenuLeaveItem({reportID}: ReportDetailsMenuLeaveItemProps) const leaveChat = () => { // Resolve on tap from the module-scoped copies so this large page does not subscribe to whole collections. - const lastAccessedReportID = findLastAccessedReport(false, guideAccountIDs, false, report.reportID)?.reportID; + const lastAccessedReportID = findLastAccessedReport(false, guideAccountIDs, isAnonymousUser, false, report.reportID)?.reportID; if (isRootGroupChat) { leaveGroupChat( report, diff --git a/src/pages/DynamicReportDetailsPage/ReportDetailsTaskDeleteAction.tsx b/src/pages/DynamicReportDetailsPage/ReportDetailsTaskDeleteAction.tsx index 69f3bde3a436..db6a85c27062 100644 --- a/src/pages/DynamicReportDetailsPage/ReportDetailsTaskDeleteAction.tsx +++ b/src/pages/DynamicReportDetailsPage/ReportDetailsTaskDeleteAction.tsx @@ -3,6 +3,7 @@ import MenuItemAction from '@components/MenuItem/presets/MenuItemAction'; import useAncestors from '@hooks/useAncestors'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; import useHasOutstandingChildTask from '@hooks/useHasOutstandingChildTask'; +import useIsAnonymousUser from '@hooks/useIsAnonymousUser'; import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; @@ -47,6 +48,7 @@ function ReportDetailsTaskDeleteActionContent({report, parentReport, parentRepor const taskDeleteBackTo = Navigation.getTopmostSearchReportRouteParams()?.backTo; const hasOutstandingChildTask = useHasOutstandingChildTask(report); const [guideAccountIDs] = useOnyx(ONYXKEYS.DERIVED.GUIDE_ACCOUNT_IDS); + const isAnonymousUser = useIsAnonymousUser(); const [conciergeReportID] = useOnyx(ONYXKEYS.CONCIERGE_REPORT_ID); const [reportActionsForOriginalReportID] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report.reportID}`); const [delegateEmail] = useOnyx(ONYXKEYS.ACCOUNT, {selector: delegateEmailSelector}); @@ -68,7 +70,7 @@ function ReportDetailsTaskDeleteActionContent({report, parentReport, parentRepor { ancestors, shouldNavigateBack: !taskDeleteBackTo, - lastAccessedReportID: findLastAccessedReport(false, guideAccountIDs, false, report.reportID)?.reportID, + lastAccessedReportID: findLastAccessedReport(false, guideAccountIDs, isAnonymousUser, false, report.reportID)?.reportID, }, ); }; diff --git a/src/pages/OnboardingPersonalDetails/BaseOnboardingPersonalDetails.tsx b/src/pages/OnboardingPersonalDetails/BaseOnboardingPersonalDetails.tsx index c19a21a3c89a..5535a4a5d9bd 100644 --- a/src/pages/OnboardingPersonalDetails/BaseOnboardingPersonalDetails.tsx +++ b/src/pages/OnboardingPersonalDetails/BaseOnboardingPersonalDetails.tsx @@ -11,6 +11,7 @@ import useAutoCreateSubmitWorkspace from '@hooks/useAutoCreateSubmitWorkspace'; import useAutoCreateTrackWorkspace from '@hooks/useAutoCreateTrackWorkspace'; import useAutoFocusInput from '@hooks/useAutoFocusInput'; import useDelegateAccountID from '@hooks/useDelegateAccountID'; +import useIsAnonymousUser from '@hooks/useIsAnonymousUser'; import useLocalize from '@hooks/useLocalize'; import useOnboardingMessages from '@hooks/useOnboardingMessages'; import useOnyx from '@hooks/useOnyx'; @@ -56,6 +57,7 @@ function BaseOnboardingPersonalDetails({currentUserPersonalDetails, shouldUseNat const delegateAccountID = useDelegateAccountID(); const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED); const [reportNameValuePairs] = useOnyx(ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS); + const isAnonymousUser = useIsAnonymousUser(); const [loginList] = useOnyx(ONYXKEYS.LOGINS, {selector: expensifyLoginsSelector}); const [onboardingValues] = useOnyx(ONYXKEYS.NVP_ONBOARDING); const [conciergeChatReportID = ''] = useOnyx(ONYXKEYS.CONCIERGE_REPORT_ID); @@ -135,6 +137,7 @@ function BaseOnboardingPersonalDetails({currentUserPersonalDetails, shouldUseNat isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS), conciergeChatReportID, reportNameValuePairs, + isAnonymousUser, onboardingPurposeSelected === CONST.ONBOARDING_CHOICES.JOIN_WORKSPACE && !onboardingPolicy ? undefined : onboardingPolicyID, mergedAccountConciergeReportID, false, @@ -161,6 +164,7 @@ function BaseOnboardingPersonalDetails({currentUserPersonalDetails, shouldUseNat onboardingPolicy, isBetaEnabled, reportNameValuePairs, + isAnonymousUser, isSmallScreenWidth, mergedAccountConciergeReportID, conciergeChatReportID, diff --git a/src/pages/OnboardingPrivateDomain/BaseOnboardingPrivateDomain.tsx b/src/pages/OnboardingPrivateDomain/BaseOnboardingPrivateDomain.tsx index afb793632f04..36a68629d1d6 100644 --- a/src/pages/OnboardingPrivateDomain/BaseOnboardingPrivateDomain.tsx +++ b/src/pages/OnboardingPrivateDomain/BaseOnboardingPrivateDomain.tsx @@ -6,6 +6,7 @@ import ValidateCodeForm from '@components/ValidateCodeActionModal/ValidateCodeFo import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; import useDelegateAccountID from '@hooks/useDelegateAccountID'; +import useIsAnonymousUser from '@hooks/useIsAnonymousUser'; import useLocalize from '@hooks/useLocalize'; import useOnboardingIntent from '@hooks/useOnboardingIntent'; import useOnboardingMessages from '@hooks/useOnboardingMessages'; @@ -73,6 +74,7 @@ function BaseOnboardingPrivateDomain({shouldUseNativeStyles, route}: BaseOnboard const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED); const [isSelfTourViewed] = useOnyx(ONYXKEYS.NVP_ONBOARDING, {selector: hasSeenTourSelector}); const [reportNameValuePairs] = useOnyx(ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS); + const isAnonymousUser = useIsAnonymousUser(); const {joinWorkspaceMessages} = useOnboardingMessages(); const {isBetaEnabled} = usePermissions(); const isVsb = onboardingValues?.signupQualifier === CONST.ONBOARDING_SIGNUP_QUALIFIERS.VSB; @@ -168,6 +170,7 @@ function BaseOnboardingPrivateDomain({shouldUseNativeStyles, route}: BaseOnboard isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS), conciergeReportID, reportNameValuePairs, + isAnonymousUser, onboardingPolicyID, onboardingAdminsChatReportID, false, @@ -185,6 +188,7 @@ function BaseOnboardingPrivateDomain({shouldUseNativeStyles, route}: BaseOnboard email, introSelected, isBetaEnabled, + isAnonymousUser, firstName, isCompletingOnboarding, isSelfTourViewed, diff --git a/src/pages/OnboardingPurpose/BaseOnboardingPurpose.tsx b/src/pages/OnboardingPurpose/BaseOnboardingPurpose.tsx index bd66c16d645a..9e1478b18f5b 100644 --- a/src/pages/OnboardingPurpose/BaseOnboardingPurpose.tsx +++ b/src/pages/OnboardingPurpose/BaseOnboardingPurpose.tsx @@ -9,6 +9,7 @@ import useAutoCreateSubmitWorkspace from '@hooks/useAutoCreateSubmitWorkspace'; import useAutoCreateTrackWorkspace from '@hooks/useAutoCreateTrackWorkspace'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; import useDelegateAccountID from '@hooks/useDelegateAccountID'; +import useIsAnonymousUser from '@hooks/useIsAnonymousUser'; import {useMemoizedLazyIllustrations} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; import useOnboardingMessages from '@hooks/useOnboardingMessages'; @@ -79,6 +80,7 @@ function BaseOnboardingPurpose({shouldUseNativeStyles, shouldEnableMaxHeight, ro const [conciergeChat] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${conciergeReportID}`); const {onboardingMessages} = useOnboardingMessages(); const [reportNameValuePairs] = useOnyx(ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS); + const isAnonymousUser = useIsAnonymousUser(); const isPrivateDomainAndHasAccessiblePolicies = !account?.isFromPublicDomain && !!account?.hasAccessibleDomainPolicies; @@ -194,6 +196,7 @@ function BaseOnboardingPurpose({shouldUseNativeStyles, shouldEnableMaxHeight, ro isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS), conciergeReportID, reportNameValuePairs, + isAnonymousUser, onboardingPolicyID, onboardingAdminsChatReportID, false, diff --git a/src/pages/OnboardingWorkspaces/BaseOnboardingWorkspaces.tsx b/src/pages/OnboardingWorkspaces/BaseOnboardingWorkspaces.tsx index 88cc1eb64d2c..26e84d2e8ee9 100644 --- a/src/pages/OnboardingWorkspaces/BaseOnboardingWorkspaces.tsx +++ b/src/pages/OnboardingWorkspaces/BaseOnboardingWorkspaces.tsx @@ -11,6 +11,7 @@ import useAutoCreateSubmitWorkspace from '@hooks/useAutoCreateSubmitWorkspace'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; import useDefaultExpensePolicy from '@hooks/useDefaultExpensePolicy'; import useDelegateAccountID from '@hooks/useDelegateAccountID'; +import useIsAnonymousUser from '@hooks/useIsAnonymousUser'; import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; import useOnboardingIntent from '@hooks/useOnboardingIntent'; @@ -84,6 +85,7 @@ function BaseOnboardingWorkspaces({route, shouldUseNativeStyles}: BaseOnboarding selector: hasSeenTourSelector, }); const [reportNameValuePairs] = useOnyx(ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS); + const isAnonymousUser = useIsAnonymousUser(); const {accountID: currentUserAccountID, email: currentUserEmail} = useCurrentUserPersonalDetails(); const isValidated = isCurrentUserValidated(loginList, currentUserEmail); @@ -188,6 +190,7 @@ function BaseOnboardingWorkspaces({route, shouldUseNativeStyles}: BaseOnboarding isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS), conciergeReportID, reportNameValuePairs, + isAnonymousUser, policy.automaticJoiningEnabled ? policy.policyID : undefined, undefined, false, @@ -388,7 +391,16 @@ function BaseOnboardingWorkspaces({route, shouldUseNativeStyles}: BaseOnboarding }); setOnboardingAdminsChatReportID(); - navigateAfterOnboardingWithMicrotaskQueue(isSmallScreenWidth, isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS), conciergeReportID, reportNameValuePairs, undefined, undefined, false); + navigateAfterOnboardingWithMicrotaskQueue( + isSmallScreenWidth, + isBetaEnabled(CONST.BETAS.DEFAULT_ROOMS), + conciergeReportID, + reportNameValuePairs, + isAnonymousUser, + undefined, + undefined, + false, + ); return; } diff --git a/tests/perf-local/ReportUtils.perf-local.ts b/tests/perf-local/ReportUtils.perf-local.ts index bcafd512bebe..ca601e949bc9 100644 --- a/tests/perf-local/ReportUtils.perf-local.ts +++ b/tests/perf-local/ReportUtils.perf-local.ts @@ -96,7 +96,7 @@ describe('ReportUtils', () => { }); await waitForBatchedUpdates(); - await measureFunction(() => findLastAccessedReport(ignoreDomainRooms, undefined, openOnAdminRoom)); + await measureFunction(() => findLastAccessedReport(ignoreDomainRooms, undefined, false, openOnAdminRoom)); }); test('[ReportUtils] canDeleteReportAction on 1k reports and policies', async () => { diff --git a/tests/unit/ReportUtilsTest.ts b/tests/unit/ReportUtilsTest.ts index d62e39b57d97..15f064bb670c 100644 --- a/tests/unit/ReportUtilsTest.ts +++ b/tests/unit/ReportUtilsTest.ts @@ -5592,7 +5592,23 @@ describe('ReportUtils', () => { lastReadTime: '2023-07-08 07:15:44.030', participants: {[currentUserAccountID]: {notificationPreference: CONST.REPORT.NOTIFICATION_PREFERENCE.ALWAYS}}, }; - expect(getMostRecentlyVisitedReport(reports, {})).toEqual(latestReport); + expect(getMostRecentlyVisitedReport(reports, {}, false)).toEqual(latestReport); + }); + + it('should keep a hidden public room only when the user is anonymous', () => { + // Given a public room the user does not participate in, so it is hidden for them + const publicRoom: Report = { + ...createRandomReport(1, CONST.REPORT.CHAT_TYPE.POLICY_ROOM), + visibility: CONST.REPORT.VISIBILITY.PUBLIC, + isPinned: false, + participants: {}, + lastReadTime: '2023-07-08 07:15:44.030', + }; + + // When a regular user and an anonymous visitor look for the most recently visited report + // Then only the anonymous visitor, who opened the room from a public link, gets it back + expect(getMostRecentlyVisitedReport([publicRoom], {}, false)).toBeUndefined(); + expect(getMostRecentlyVisitedReport([publicRoom], {}, true)).toEqual(publicRoom); }); }); @@ -6378,9 +6394,9 @@ describe('ReportUtils', () => { participants: buildParticipantsFromAccountIDs([currentUserAccountID, ownerAccountID]), }; - expect(canLeaveChat(report, undefined, unrelatedAccountID)).toBe(true); - expect(canLeaveChat(report, undefined, ownerAccountID)).toBe(false); - expect(canLeaveChat(report, undefined, managerAccountID)).toBe(false); + expect(canLeaveChat(report, undefined, unrelatedAccountID, false, false)).toBe(true); + expect(canLeaveChat(report, undefined, ownerAccountID, false, false)).toBe(false); + expect(canLeaveChat(report, undefined, managerAccountID, false, false)).toBe(false); }); }); @@ -10907,7 +10923,7 @@ describe('ReportUtils', () => { const reportNameValuePairsCollection = { [`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${archivedReport.reportID}`]: {private_isArchived: DateUtils.getDBTime()}, }; - const result = findLastAccessedReport(false, undefined, false, undefined, reportNameValuePairsCollection); + const result = findLastAccessedReport(false, undefined, false, false, undefined, reportNameValuePairsCollection); // Even though the archived report has a more recent lastVisitTime, // the function should filter it out and return the normal report @@ -10930,11 +10946,11 @@ describe('ReportUtils', () => { // When resolving with visit data present // Then the visited report wins, because any visit time outranks a lastReadTime-only report - expect(findLastAccessedReport(false, undefined, false, undefined, undefined, reports)?.reportID).toBe(normalReport.reportID); + expect(findLastAccessedReport(false, undefined, false, false, undefined, undefined, reports)?.reportID).toBe(normalReport.reportID); // When the only visited report is excluded // Then the lookup falls back to the most recently read eligible report - expect(findLastAccessedReport(false, undefined, false, normalReport.reportID, undefined, reports)?.reportID).toBe(unvisitedReport.reportID); + expect(findLastAccessedReport(false, undefined, false, false, normalReport.reportID, undefined, reports)?.reportID).toBe(unvisitedReport.reportID); }); }); describe('findLastAccessedReport should return owned report if no reports was accessed before', () => { @@ -10982,7 +10998,7 @@ describe('ReportUtils', () => { }); it('findLastAccessedReport should return owned report if no reports was accessed before', () => { - const result = findLastAccessedReport(false, undefined); + const result = findLastAccessedReport(false, undefined, false); // Even though the archived report has a more recent lastVisitTime, // the function should filter it out and return the normal report @@ -11021,33 +11037,33 @@ describe('ReportUtils', () => { it('should resolve a report from the passed collection while the stored reports are still empty', () => { // Nothing is in Onyx yet, so the copy the function reads by default holds no reports. - expect(findLastAccessedReport(false, undefined)).toBeUndefined(); + expect(findLastAccessedReport(false, undefined, false)).toBeUndefined(); const reports: OnyxCollection = { [`${ONYXKEYS.COLLECTION.REPORT}${providedReport.reportID}`]: providedReport, }; - expect(findLastAccessedReport(false, undefined, false, undefined, undefined, reports)?.reportID).toBe(providedReport.reportID); + expect(findLastAccessedReport(false, undefined, false, false, undefined, undefined, reports)?.reportID).toBe(providedReport.reportID); }); it('should prefer the passed collection over the stored reports', async () => { await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${storedReport.reportID}`, storedReport); await waitForBatchedUpdates(); - expect(findLastAccessedReport(false, undefined)?.reportID).toBe(storedReport.reportID); + expect(findLastAccessedReport(false, undefined, false)?.reportID).toBe(storedReport.reportID); const reports: OnyxCollection = { [`${ONYXKEYS.COLLECTION.REPORT}${providedReport.reportID}`]: providedReport, }; - expect(findLastAccessedReport(false, undefined, false, undefined, undefined, reports)?.reportID).toBe(providedReport.reportID); + expect(findLastAccessedReport(false, undefined, false, false, undefined, undefined, reports)?.reportID).toBe(providedReport.reportID); }); it('should fall back to the stored reports when no collection is passed', async () => { await Onyx.set(`${ONYXKEYS.COLLECTION.REPORT}${storedReport.reportID}`, storedReport); await waitForBatchedUpdates(); - expect(findLastAccessedReport(false, undefined)?.reportID).toBe(storedReport.reportID); + expect(findLastAccessedReport(false, undefined, false)?.reportID).toBe(storedReport.reportID); }); }); @@ -15130,7 +15146,7 @@ describe('ReportUtils', () => { it('should return true for root group chat', () => { const report: Report = createRandomReport(1, CONST.REPORT.CHAT_TYPE.GROUP); - expect(canLeaveChat(report, undefined, currentUserAccountID, false)).toBe(true); + expect(canLeaveChat(report, undefined, currentUserAccountID, false, false)).toBe(true); }); it('should return false for a task off a group chat', () => { @@ -15142,7 +15158,7 @@ describe('ReportUtils', () => { participants: buildParticipantsFromAccountIDs([currentUserAccountID]), }; - expect(canLeaveChat(report, undefined, currentUserAccountID, false)).toBe(false); + expect(canLeaveChat(report, undefined, currentUserAccountID, false, false)).toBe(false); }); it('should return true for policy expense chat if the user is not the owner and the user is not an admin', () => { @@ -15157,18 +15173,33 @@ describe('ReportUtils', () => { role: CONST.POLICY.ROLE.USER, }; - expect(canLeaveChat(report, reportPolicy, currentUserAccountID, false)).toBe(true); + expect(canLeaveChat(report, reportPolicy, currentUserAccountID, false, false)).toBe(true); }); - it('should return false if the chat is public room and the user is the guest', async () => { + it('should return true for the same public room when the user is not anonymous', () => { + // Given a public policy room the current user participates in, viewed by a regular (non-anonymous) user const report: Report = { ...createRandomReport(1, CONST.REPORT.CHAT_TYPE.POLICY_ROOM), visibility: CONST.REPORT.VISIBILITY.PUBLIC, + participants: buildParticipantsFromAccountIDs([currentUserAccountID]), }; - await Onyx.set(ONYXKEYS.SESSION, {email: currentUserEmail, accountID: currentUserAccountID, authTokenType: CONST.AUTH_TOKEN_TYPES.ANONYMOUS}); + // When checking whether the user can leave it + // Then the user can leave it, which is what makes the anonymous-guest case meaningful + expect(canLeaveChat(report, undefined, currentUserAccountID, false, false)).toBe(true); + }); + + it('should return false if the chat is public room and the user is the guest', () => { + // Given the same public room, but viewed by an anonymous (signed-out) guest + const report: Report = { + ...createRandomReport(1, CONST.REPORT.CHAT_TYPE.POLICY_ROOM), + visibility: CONST.REPORT.VISIBILITY.PUBLIC, + participants: buildParticipantsFromAccountIDs([currentUserAccountID]), + }; - expect(canLeaveChat(report, undefined, currentUserAccountID, false)).toBe(false); + // When checking whether the guest can leave it + // Then the anonymous flag passed by the caller blocks leaving + expect(canLeaveChat(report, undefined, currentUserAccountID, true, false)).toBe(false); }); it('should return false if the report is hidden for the current user', async () => { @@ -15185,7 +15216,7 @@ describe('ReportUtils', () => { await Onyx.set(ONYXKEYS.SESSION, {email: currentUserEmail, accountID: currentUserAccountID}); - expect(canLeaveChat(report, undefined, currentUserAccountID, false)).toBe(false); + expect(canLeaveChat(report, undefined, currentUserAccountID, false, false)).toBe(false); }); it('should return false for selfDM reports', () => { @@ -15194,7 +15225,7 @@ describe('ReportUtils', () => { type: CONST.REPORT.TYPE.CHAT, }; - expect(canLeaveChat(report, undefined, currentUserAccountID, false)).toBe(false); + expect(canLeaveChat(report, undefined, currentUserAccountID, false, false)).toBe(false); }); it('should return false for the public announce room if the user is a member of the policy', () => { @@ -15208,7 +15239,7 @@ describe('ReportUtils', () => { role: CONST.POLICY.ROLE.USER, }; - expect(canLeaveChat(report, reportPolicy, currentUserAccountID, false)).toBe(false); + expect(canLeaveChat(report, reportPolicy, currentUserAccountID, false, false)).toBe(false); }); it('should return true for the invoice room if the user is not the sender or receiver', async () => { @@ -15229,7 +15260,7 @@ describe('ReportUtils', () => { role: CONST.POLICY.ROLE.USER, }; - expect(canLeaveChat(report, reportPolicy, currentUserAccountID, false)).toBe(true); + expect(canLeaveChat(report, reportPolicy, currentUserAccountID, false, false)).toBe(true); }); it('should return true for chat thread if the user is joined', async () => { @@ -15243,7 +15274,7 @@ describe('ReportUtils', () => { await Onyx.set(ONYXKEYS.SESSION, {email: currentUserEmail, accountID: currentUserAccountID}); - expect(canLeaveChat(report, undefined, currentUserAccountID, false)).toBe(true); + expect(canLeaveChat(report, undefined, currentUserAccountID, false, false)).toBe(true); }); it('should return true for user created policy room', async () => { @@ -15259,7 +15290,7 @@ describe('ReportUtils', () => { role: CONST.POLICY.ROLE.USER, }; - expect(canLeaveChat(report, reportPolicy, currentUserAccountID, false)).toBe(true); + expect(canLeaveChat(report, reportPolicy, currentUserAccountID, false, false)).toBe(true); }); }); diff --git a/tests/unit/navigateAfterOnboardingTest.ts b/tests/unit/navigateAfterOnboardingTest.ts index eb572a164e3f..e3001f6215bf 100644 --- a/tests/unit/navigateAfterOnboardingTest.ts +++ b/tests/unit/navigateAfterOnboardingTest.ts @@ -107,14 +107,14 @@ describe('navigateAfterOnboarding', () => { const navigate = jest.spyOn(Navigation, 'navigate'); const testSession = {email: 'realaccount@gmail.com'}; - navigateAfterOnboarding(false, true, '', {}, undefined, ONBOARDING_ADMINS_CHAT_REPORT_ID, (testSession?.email ?? '').includes('+')); + navigateAfterOnboarding(false, true, '', {}, false, undefined, ONBOARDING_ADMINS_CHAT_REPORT_ID, (testSession?.email ?? '').includes('+')); expect(navigate).toHaveBeenCalledWith(ROUTES.REPORT_WITH_ID.getRoute(ONBOARDING_ADMINS_CHAT_REPORT_ID), undefined); }); it('should navigate to home if onboardingAdminsChatReportID is not provided on larger screens and no report is topmost', () => { const navigate = jest.spyOn(Navigation, 'navigate'); - navigateAfterOnboarding(false, true, '', {}, undefined, undefined); + navigateAfterOnboarding(false, true, '', {}, false, undefined, undefined); // Without an admins chat report, we fall back to HOME to trigger guard evaluation instead of opening a report. expect(navigate).not.toHaveBeenCalledWith(ROUTES.REPORT_WITH_ID.getRoute(ONBOARDING_ADMINS_CHAT_REPORT_ID)); expect(navigate).toHaveBeenCalledWith(ROUTES.HOME, undefined); @@ -128,7 +128,7 @@ describe('navigateAfterOnboarding', () => { finishDismissal = afterTransition; }); - navigateAfterOnboardingWithMicrotaskQueue(false, true, '', {}); + navigateAfterOnboardingWithMicrotaskQueue(false, true, '', {}, false); expect(dismissOnboardingModalBeforeExit).toHaveBeenCalledTimes(1); expect(navigate).not.toHaveBeenCalled(); @@ -142,7 +142,7 @@ describe('navigateAfterOnboarding', () => { const navigate = jest.spyOn(Navigation, 'navigate'); mockIsReportTopmostSplitNavigator.mockReturnValue(true); - navigateAfterOnboarding(false, true, '', {}, undefined, undefined); + navigateAfterOnboarding(false, true, '', {}, false, undefined, undefined); expect(navigate).not.toHaveBeenCalled(); }); @@ -162,7 +162,7 @@ describe('navigateAfterOnboarding', () => { mockFindLastAccessedReport.mockReturnValue(lastAccessedReport); mockShouldOpenOnAdminRoom.mockReturnValue(false); - navigateAfterOnboarding(true, true, REPORT_ID, {}, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID); + navigateAfterOnboarding(true, true, REPORT_ID, {}, false, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID); expect(navigate).not.toHaveBeenCalledWith(ROUTES.REPORT_WITH_ID.getRoute(REPORT_ID)); }); @@ -171,7 +171,7 @@ describe('navigateAfterOnboarding', () => { mockFindLastAccessedReport.mockReturnValue(lastAccessedReport); mockShouldOpenOnAdminRoom.mockReturnValue(false); - navigateAfterOnboarding(true, true, '', {}, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID); + navigateAfterOnboarding(true, true, '', {}, false, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID); expect(Navigation.navigate).not.toHaveBeenCalledWith(ROUTES.REPORT_WITH_ID.getRoute(REPORT_ID)); }); @@ -180,7 +180,7 @@ describe('navigateAfterOnboarding', () => { mockFindLastAccessedReport.mockReturnValue(lastAccessedReport); mockShouldOpenOnAdminRoom.mockReturnValue(false); - navigateAfterOnboarding(true, true, '', {}, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID); + navigateAfterOnboarding(true, true, '', {}, false, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID); expect(Navigation.navigate).not.toHaveBeenCalledWith(ROUTES.REPORT_WITH_ID.getRoute(REPORT_ID)); }); @@ -190,18 +190,21 @@ describe('navigateAfterOnboarding', () => { mockFindLastAccessedReport.mockReturnValue(lastAccessedReport); mockShouldOpenOnAdminRoom.mockReturnValue(true); - navigateAfterOnboarding(true, true, '', {}, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID); + navigateAfterOnboarding(true, true, '', {}, false, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID); expect(navigate).toHaveBeenCalledWith(ROUTES.REPORT_WITH_ID.getRoute(REPORT_ID), undefined); }); - it('should pass reportNameValuePairs when looking up last accessed report', () => { + it('should pass reportNameValuePairs and the anonymous flag when looking up last accessed report', () => { + // Given archived report data and an anonymous caller const reportNameValuePairs = {[`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${REPORT_ID}`]: {private_isArchived: '2024-02-01 04:56:47.233'}}; mockFindLastAccessedReport.mockReturnValue(undefined); mockShouldOpenOnAdminRoom.mockReturnValue(false); - navigateAfterOnboarding(true, true, '', reportNameValuePairs, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID); + // When navigating after onboarding on a small screen + navigateAfterOnboarding(true, true, '', reportNameValuePairs, true, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID); - expect(mockFindLastAccessedReport).toHaveBeenCalledWith(false, undefined, false, undefined, reportNameValuePairs); + // Then both values reach findLastAccessedReport instead of being read from module state + expect(mockFindLastAccessedReport).toHaveBeenCalledWith(false, undefined, true, false, undefined, reportNameValuePairs); }); it('should navigate to Concierge room if user uses a test email', () => { @@ -211,13 +214,13 @@ describe('navigateAfterOnboarding', () => { mockShouldOpenOnAdminRoom.mockReturnValue(true); const testSession = {email: 'test+account@gmail.com'}; - navigateAfterOnboarding(true, true, '', {}, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID, (testSession?.email ?? '').includes('+')); + navigateAfterOnboarding(true, true, '', {}, false, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID, (testSession?.email ?? '').includes('+')); expect(navigate).toHaveBeenCalledWith(ROUTES.REPORT_WITH_ID.getRoute(REPORT_ID), undefined); }); it('should navigate to the admin room when the inboxAdminsBespoke variant is assigned', () => { const navigate = jest.spyOn(Navigation, 'navigate'); - navigateAfterOnboarding(false, true, '', {}, undefined, ONBOARDING_ADMINS_CHAT_REPORT_ID, false, {variantOverride: CONST.ONBOARDING_RHP_VARIANT.INBOX_ADMINS_BESPOKE}); + navigateAfterOnboarding(false, true, '', {}, false, undefined, ONBOARDING_ADMINS_CHAT_REPORT_ID, false, {variantOverride: CONST.ONBOARDING_RHP_VARIANT.INBOX_ADMINS_BESPOKE}); expect(navigate).toHaveBeenCalledWith(ROUTES.REPORT_WITH_ID.getRoute(ONBOARDING_ADMINS_CHAT_REPORT_ID), undefined); }); @@ -228,7 +231,7 @@ describe('navigateAfterOnboarding', () => { setDeepLinkToOpenAfterOnboarding(openDeepLink); // When onboarding finishes - navigateAfterOnboarding(false, true, '', {}, undefined, ONBOARDING_ADMINS_CHAT_REPORT_ID); + navigateAfterOnboarding(false, true, '', {}, false, undefined, ONBOARDING_ADMINS_CHAT_REPORT_ID); // Then the parked link wins and no default destination is used expect(openDeepLink).toHaveBeenCalledTimes(1); @@ -242,7 +245,7 @@ describe('navigateAfterOnboarding', () => { setDeepLinkToOpenAfterOnboarding(openDeepLink); // When onboarding finishes - navigateAfterOnboarding(true, true, REPORT_ID, {}, undefined, ONBOARDING_ADMINS_CHAT_REPORT_ID, false, { + navigateAfterOnboarding(true, true, REPORT_ID, {}, false, undefined, ONBOARDING_ADMINS_CHAT_REPORT_ID, false, { variantOverride: CONST.ONBOARDING_RHP_VARIANT.TRACK_EXPENSES_WITH_CONCIERGE, }); @@ -260,7 +263,7 @@ describe('navigateAfterOnboarding', () => { setDeepLinkToOpenAfterOnboarding(openDeepLink); // When onboarding finishes - navigateAfterOnboarding(false, true, '', {}, undefined, ONBOARDING_ADMINS_CHAT_REPORT_ID); + navigateAfterOnboarding(false, true, '', {}, false, undefined, ONBOARDING_ADMINS_CHAT_REPORT_ID); // Then the user still lands somewhere instead of on an empty screen expect(openDeepLink).toHaveBeenCalledTimes(1); @@ -274,7 +277,7 @@ describe('navigateAfterOnboarding', () => { setDeepLinkToOpenAfterOnboarding(openDeepLink); // When onboarding finishes - navigateAfterOnboarding(false, true, '', {}, undefined, ONBOARDING_ADMINS_CHAT_REPORT_ID); + navigateAfterOnboarding(false, true, '', {}, false, undefined, ONBOARDING_ADMINS_CHAT_REPORT_ID); // Then the default destination is used, because nothing else was opened expect(openDeepLink).toHaveBeenCalledTimes(1); @@ -288,8 +291,8 @@ describe('navigateAfterOnboarding', () => { setDeepLinkToOpenAfterOnboarding(openDeepLink); // When onboarding exits twice - navigateAfterOnboarding(false, true, '', {}, undefined, ONBOARDING_ADMINS_CHAT_REPORT_ID); - navigateAfterOnboarding(false, true, '', {}, undefined, ONBOARDING_ADMINS_CHAT_REPORT_ID); + navigateAfterOnboarding(false, true, '', {}, false, undefined, ONBOARDING_ADMINS_CHAT_REPORT_ID); + navigateAfterOnboarding(false, true, '', {}, false, undefined, ONBOARDING_ADMINS_CHAT_REPORT_ID); // Then the link opens only the first time and the second exit uses the default destination expect(openDeepLink).toHaveBeenCalledTimes(1); @@ -301,7 +304,7 @@ describe('navigateAfterOnboarding', () => { const navigate = jest.spyOn(Navigation, 'navigate'); // When onboarding finishes with the homePageNoRHP arm of the experiment - navigateAfterOnboarding(false, true, '', {}, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID, false, {variantOverride: CONST.ONBOARDING_RHP_VARIANT.HOME_PAGE_NO_RHP}); + navigateAfterOnboarding(false, true, '', {}, false, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID, false, {variantOverride: CONST.ONBOARDING_RHP_VARIANT.HOME_PAGE_NO_RHP}); // Then the user starts on Home, so Home's Getting started is the only onboarding surface they see expect(navigate).toHaveBeenCalledWith(ROUTES.HOME, undefined); @@ -317,7 +320,9 @@ describe('navigateAfterOnboarding', () => { await Onyx.set(ONYXKEYS.ONBOARDING_COMPANY_SIZE, companySize); // When onboarding finishes with the homePageNoRHP arm - navigateAfterOnboarding(false, true, '', {}, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID, false, {variantOverride: CONST.ONBOARDING_RHP_VARIANT.HOME_PAGE_NO_RHP}); + navigateAfterOnboarding(false, true, '', {}, false, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID, false, { + variantOverride: CONST.ONBOARDING_RHP_VARIANT.HOME_PAGE_NO_RHP, + }); await waitForBatchedUpdates(); // Then the arm behaves the same at every company size: Home, and the side panel is never opened @@ -336,7 +341,7 @@ describe('navigateAfterOnboarding', () => { mockIsReportTopmostSplitNavigator.mockReturnValue(true); // When onboarding finishes with the homePageNoRHP arm - navigateAfterOnboarding(false, true, '', {}, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID, false, {variantOverride: CONST.ONBOARDING_RHP_VARIANT.HOME_PAGE_NO_RHP}); + navigateAfterOnboarding(false, true, '', {}, false, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID, false, {variantOverride: CONST.ONBOARDING_RHP_VARIANT.HOME_PAGE_NO_RHP}); await waitForBatchedUpdates(); // Then the report stays where it is, and the side panel is not opened over it @@ -350,7 +355,7 @@ describe('navigateAfterOnboarding', () => { await Onyx.set(ONYXKEYS.NVP_ONBOARDING_RHP_VARIANT, CONST.ONBOARDING_RHP_VARIANT.HOME_PAGE_NO_RHP); // When onboarding finishes without a variant override - navigateAfterOnboarding(false, true, '', {}, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID); + navigateAfterOnboarding(false, true, '', {}, false, ONBOARDING_POLICY_ID, ONBOARDING_ADMINS_CHAT_REPORT_ID); // Then the stored variant still applies and the user lands on Home rather than the admin room expect(navigate).toHaveBeenCalledWith(ROUTES.HOME, undefined);