From ccea23cd485244fd4dd05fcbc5f595f66e4e1259 Mon Sep 17 00:00:00 2001 From: Srikar Parsi <48188732+srikarparsi@users.noreply.github.com> Date: Mon, 24 Feb 2025 18:55:02 -0700 Subject: [PATCH] Merge pull request #57362 from Expensify/francois-revert-55966 Revert #55966 / Fix "just sign in here" Magic Code page link (cherry picked from commit 76286270f90ffad96002838c31e574bd9ec6c6ae) (CP triggered by chiragsalian) --- .../Navigation/AppNavigator/AuthScreens.tsx | 89 ++++++++++--------- src/libs/Navigation/linkingConfig/config.ts | 14 +-- src/libs/actions/App.ts | 2 +- src/libs/actions/Session/index.ts | 17 +++- 4 files changed, 61 insertions(+), 61 deletions(-) diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.tsx b/src/libs/Navigation/AppNavigator/AuthScreens.tsx index b88992d32079..7d4f674d8e2b 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.tsx +++ b/src/libs/Navigation/AppNavigator/AuthScreens.tsx @@ -3,7 +3,7 @@ import {findFocusedRoute, useNavigation} from '@react-navigation/native'; import React, {memo, useEffect, useMemo, useRef} from 'react'; import {NativeModules} from 'react-native'; import type {OnyxEntry} from 'react-native-onyx'; -import Onyx, {useOnyx} from 'react-native-onyx'; +import Onyx, {withOnyx} from 'react-native-onyx'; import ActiveGuidesEventListener from '@components/ActiveGuidesEventListener'; import ActiveWorkspaceContextProvider from '@components/ActiveWorkspaceProvider'; import ComposeProviders from '@components/ComposeProviders'; @@ -55,7 +55,6 @@ import SCREENS from '@src/SCREENS'; import type * as OnyxTypes from '@src/types/onyx'; import type {SelectedTimezone, Timezone} from '@src/types/onyx/PersonalDetails'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; -import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue'; import type ReactComponentModule from '@src/types/utils/ReactComponentModule'; import createRootStackNavigator from './createRootStackNavigator'; import {reportsSplitsWithEnteringAnimation, workspaceSplitsWithoutEnteringAnimation} from './createRootStackNavigator/GetStateForActionHandlers'; @@ -69,6 +68,17 @@ import RightModalNavigator from './Navigators/RightModalNavigator'; import WelcomeVideoModalNavigator from './Navigators/WelcomeVideoModalNavigator'; import useRootNavigatorScreenOptions from './useRootNavigatorScreenOptions'; +type AuthScreensProps = { + /** Session of currently logged in user */ + session: OnyxEntry; + + /** The report ID of the last opened public room as anonymous user */ + lastOpenedPublicRoomID: OnyxEntry; + + /** The last Onyx update ID was applied to the client */ + initialLastUpdateIDAppliedToClient: OnyxEntry; +}; + const loadReportAttachments = () => require('../../../pages/home/report/ReportAttachments').default; const loadValidateLoginPage = () => require('../../../pages/ValidateLoginPage').default; const loadLogOutPreviousUserPage = () => require('../../../pages/LogOutPreviousUserPage').default; @@ -201,10 +211,7 @@ const modalScreenListenersWithCancelSearch = { }, }; -function AuthScreens() { - const [session] = useOnyx(ONYXKEYS.SESSION); - const [lastOpenedPublicRoomID, lastOpenedPublicRoomIDStatus] = useOnyx(ONYXKEYS.LAST_OPENED_PUBLIC_ROOM_ID); - const [initialLastUpdateIDAppliedToClient, initialLastUpdateIDAppliedToClientStatus] = useOnyx(ONYXKEYS.ONYX_UPDATES_LAST_UPDATE_ID_APPLIED_TO_CLIENT); +function AuthScreens({session, lastOpenedPublicRoomID, initialLastUpdateIDAppliedToClient}: AuthScreensProps) { const theme = useTheme(); const {shouldUseNarrowLayout} = useResponsiveLayout(); const rootNavigatorScreenOptions = useRootNavigatorScreenOptions(); @@ -213,10 +220,6 @@ function AuthScreens() { const modal = useRef({}); const {isOnboardingCompleted} = useOnboardingFlowRouter(); - const isLastOpenedPublicRoomIDLoading = isLoadingOnyxValue(lastOpenedPublicRoomIDStatus); - const isInitialLastUpdateIDAppliedToClientLoading = isLoadingOnyxValue(initialLastUpdateIDAppliedToClientStatus); - const isLastOpenedPublicRoomIDLoadedRef = useRef(false); - const isInitialLastUpdateIDAppliedToClientLoadedRef = useRef(false); const navigation = useNavigation(); useEffect(() => { @@ -239,37 +242,6 @@ function AuthScreens() { }; }, [theme]); - useEffect(() => { - if (isLastOpenedPublicRoomIDLoading || isLastOpenedPublicRoomIDLoadedRef.current) { - return; - } - - isLastOpenedPublicRoomIDLoadedRef.current = true; - if (lastOpenedPublicRoomID) { - // Re-open the last opened public room if the user logged in from a public room link - Report.openLastOpenedPublicRoom(lastOpenedPublicRoomID); - } - }, [isLastOpenedPublicRoomIDLoading, lastOpenedPublicRoomID]); - - useEffect(() => { - if (isInitialLastUpdateIDAppliedToClientLoading || isInitialLastUpdateIDAppliedToClientLoadedRef.current) { - return; - } - - isInitialLastUpdateIDAppliedToClientLoadedRef.current = true; - // In Hybrid App we decide to call one of those method when booting ND and we don't want to duplicate calls - if (!NativeModules.HybridAppModule) { - // If we are on this screen then we are "logged in", but the user might not have "just logged in". They could be reopening the app - // or returning from background. If so, we'll assume they have some app data already and we can call reconnectApp() instead of openApp(). - if (SessionUtils.didUserLogInDuringSession()) { - App.openApp(); - } else { - Log.info('[AuthScreens] Sending ReconnectApp'); - App.reconnectApp(initialLastUpdateIDAppliedToClient); - } - } - }, [initialLastUpdateIDAppliedToClient, isInitialLastUpdateIDAppliedToClientLoading]); - useEffect(() => { const shortcutsOverviewShortcutConfig = CONST.KEYBOARD_SHORTCUTS.SHORTCUTS; const searchShortcutConfig = CONST.KEYBOARD_SHORTCUTS.SEARCH; @@ -289,12 +261,28 @@ function AuthScreens() { PusherConnectionManager.init(); initializePusher(); + // In Hybrid App we decide to call one of those method when booting ND and we don't want to duplicate calls + if (!NativeModules.HybridAppModule) { + // If we are on this screen then we are "logged in", but the user might not have "just logged in". They could be reopening the app + // or returning from background. If so, we'll assume they have some app data already and we can call reconnectApp() instead of openApp(). + if (SessionUtils.didUserLogInDuringSession()) { + App.openApp(); + } else { + Log.info('[AuthScreens] Sending ReconnectApp'); + App.reconnectApp(initialLastUpdateIDAppliedToClient); + } + } + PriorityMode.autoSwitchToFocusMode(); App.setUpPoliciesAndNavigate(session); App.redirectThirdPartyDesktopSignIn(); + if (lastOpenedPublicRoomID) { + // Re-open the last opened public room if the user logged in from a public room link + Report.openLastOpenedPublicRoom(lastOpenedPublicRoomID); + } Download.clearDownloads(); const unsubscribeOnyxModal = onyxSubscribe({ @@ -635,5 +623,20 @@ function AuthScreens() { AuthScreens.displayName = 'AuthScreens'; -// This memo is needed because is one of the main components in the app and navigation root and is relevant for the app performance. -export default memo(AuthScreens); +const AuthScreensMemoized = memo(AuthScreens, () => true); + +// Migration to useOnyx cause re-login if logout from deeplinked report in desktop app +// Further analysis required and more details can be seen here: +// https://github.com/Expensify/App/issues/50560 +// eslint-disable-next-line +export default withOnyx({ + session: { + key: ONYXKEYS.SESSION, + }, + lastOpenedPublicRoomID: { + key: ONYXKEYS.LAST_OPENED_PUBLIC_ROOM_ID, + }, + initialLastUpdateIDAppliedToClient: { + key: ONYXKEYS.ONYX_UPDATES_LAST_UPDATE_ID_APPLIED_TO_CLIENT, + }, +})(AuthScreensMemoized); diff --git a/src/libs/Navigation/linkingConfig/config.ts b/src/libs/Navigation/linkingConfig/config.ts index 1c6a58718cb6..e089d1188bdb 100644 --- a/src/libs/Navigation/linkingConfig/config.ts +++ b/src/libs/Navigation/linkingConfig/config.ts @@ -1539,19 +1539,7 @@ const config: LinkingOptions['config'] = { path: ROUTES.HOME, exact: true, }, - [SCREENS.REPORT]: { - path: ROUTES.REPORT_WITH_ID.route, - // If params are defined, but reportID is explicitly undefined, we will get the url /r/undefined. - // We want to avoid that situation, so we will return an empty string instead. - parse: { - // eslint-disable-next-line - reportID: (reportID: string | undefined) => reportID ?? '', - }, - stringify: { - // eslint-disable-next-line - reportID: (reportID: string | undefined) => reportID ?? '', - }, - }, + [SCREENS.REPORT]: ROUTES.REPORT_WITH_ID.route, }, }, diff --git a/src/libs/actions/App.ts b/src/libs/actions/App.ts index 5ceb7af3364b..f5fa451c59a4 100644 --- a/src/libs/actions/App.ts +++ b/src/libs/actions/App.ts @@ -500,7 +500,7 @@ function setUpPoliciesAndNavigate(session: OnyxEntry) { if (!isLoggingInAsNewUser && exitTo) { Navigation.waitForProtectedRoutes() .then(() => { - Navigation.navigate(exitTo, {forceReplace: true}); + Navigation.navigate(exitTo); }) .then(endSignOnTransition); } else { diff --git a/src/libs/actions/Session/index.ts b/src/libs/actions/Session/index.ts index 49185eb93597..98f643b385e5 100644 --- a/src/libs/actions/Session/index.ts +++ b/src/libs/actions/Session/index.ts @@ -54,6 +54,7 @@ import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import type {HybridAppRoute, Route} from '@src/ROUTES'; import ROUTES from '@src/ROUTES'; +import SCREENS from '@src/SCREENS'; import type Credentials from '@src/types/onyx/Credentials'; import type Session from '@src/types/onyx/Session'; import type {AutoAuthState} from '@src/types/onyx/Session'; @@ -825,11 +826,19 @@ function clearSignInData() { } /** - * Reset navigation state after logout + * Reset all current params of the Home route */ -function resetNavigationState() { +function resetHomeRouteParams() { Navigation.isNavigationReady().then(() => { - navigationRef.resetRoot(navigationRef.getRootState()); + const routes = navigationRef.current?.getState()?.routes; + const homeRoute = routes?.find((route) => route.name === SCREENS.HOME); + + const emptyParams: Record = {}; + Object.keys(homeRoute?.params ?? {}).forEach((paramKey) => { + emptyParams[paramKey] = undefined; + }); + + Navigation.setParams(emptyParams, homeRoute?.key ?? ''); Onyx.set(ONYXKEYS.IS_CHECKING_PUBLIC_ROOM, false); }); } @@ -849,7 +858,7 @@ function cleanupSession() { PersistedRequests.clear(); NetworkConnection.clearReconnectionCallbacks(); SessionUtils.resetDidUserLogInDuringSession(); - resetNavigationState(); + resetHomeRouteParams(); clearCache().then(() => { Log.info('Cleared all cache data', true, {}, true); });