From 4a024f3988dd65f5658f23a03af15d77b1ac7db4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Ch=C3=A1vez?= Date: Thu, 29 Sep 2022 17:39:40 -0500 Subject: [PATCH 1/8] add same changes from original PR --- src/Expensify.js | 4 ++++ src/libs/Navigation/Navigation.js | 20 +++++++++++++++++ src/libs/Navigation/NavigationRoot.js | 1 + src/libs/actions/User.js | 31 +++++++++++---------------- 4 files changed, 37 insertions(+), 19 deletions(-) diff --git a/src/Expensify.js b/src/Expensify.js index 6ea72a9ba582..9d9b58a4f752 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -22,6 +22,7 @@ import compose from './libs/compose'; import withLocalize, {withLocalizePropTypes} from './components/withLocalize'; import * as User from './libs/actions/User'; import NetworkConnection from './libs/NetworkConnection'; +import Navigation from './libs/Navigation/Navigation'; Onyx.registerLogger(({level, message}) => { if (level === 'alert') { @@ -141,6 +142,9 @@ class Expensify extends PureComponent { setNavigationReady() { this.setState({isNavigationReady: true}); + + // Navigate to any pending routes now that the NavigationContainer is ready + Navigation.goToPendingRoute(); } /** diff --git a/src/libs/Navigation/Navigation.js b/src/libs/Navigation/Navigation.js index 30f6b4ca8399..037717ff021b 100644 --- a/src/libs/Navigation/Navigation.js +++ b/src/libs/Navigation/Navigation.js @@ -16,6 +16,8 @@ const navigationIsReadyPromise = new Promise((resolve) => { }); let isLoggedIn = false; +let pendingRoute = false; + Onyx.connect({ key: ONYXKEYS.SESSION, callback: val => isLoggedIn = Boolean(val && val.authToken), @@ -124,6 +126,10 @@ function isDrawerRoute(route) { */ function navigate(route = ROUTES.HOME) { if (!canNavigate('navigate', {route})) { + // Store intended route if the navigator is not yet available, + // we will try again after the NavigationContainer is ready + Log.hmmm(`[Navigation] Container not yet ready, storing route as pending: ${route}`); + pendingRoute = route; return; } @@ -202,6 +208,19 @@ function setIsNavigationReady() { resolveNavigationIsReadyPromise(); } +/** + * Navigate to the route that we originally intended to go to + * but the NavigationContainer was not ready when navigate() was called + */ +function goToPendingRoute() { + if (pendingRoute === false) { + return; + } + Log.hmmm(`[Navigation] Container now ready, going to pending route: ${pendingRoute}`); + navigate(pendingRoute); + pendingRoute = false; +} + export default { canNavigate, navigate, @@ -209,6 +228,7 @@ export default { isActiveRoute, getActiveRoute, goBack, + goToPendingRoute, closeDrawer, getDefaultDrawerState, setDidTapNotification, diff --git a/src/libs/Navigation/NavigationRoot.js b/src/libs/Navigation/NavigationRoot.js index 1618fea6d3c4..29cee1badc8d 100644 --- a/src/libs/Navigation/NavigationRoot.js +++ b/src/libs/Navigation/NavigationRoot.js @@ -48,6 +48,7 @@ class NavigationRoot extends Component { UnreadIndicatorUpdater.throttledUpdatePageTitleAndUnreadCount(); Navigation.setIsNavigationReady(); + this.props.onReady(); } render() { diff --git a/src/libs/actions/User.js b/src/libs/actions/User.js index 7554ce05a040..cf178e894320 100644 --- a/src/libs/actions/User.js +++ b/src/libs/actions/User.js @@ -218,27 +218,20 @@ function validateLogin(accountID, validateCode) { const redirectRoute = isLoggedIn ? ROUTES.getReportRoute(currentlyViewedReportID) : ROUTES.HOME; Onyx.merge(ONYXKEYS.ACCOUNT, {...CONST.DEFAULT_ACCOUNT_DATA, isLoading: true}); - DeprecatedAPI.ValidateEmail({ + const optimisticData = [ + { + onyxMethod: CONST.ONYX.METHOD.MERGE, + key: ONYXKEYS.ACCOUNT, + value: { + isLoading: false, + }, + }, + ]; + API.write('ValidateLogin', { accountID, validateCode, - }).then((response) => { - if (response.jsonCode === 200) { - const {email} = response; - - if (isLoggedIn) { - getUserDetails(); - } else { - // Let the user know we've successfully validated their login - const success = lodashGet(response, 'message', `Your secondary login ${email} has been validated.`); - Onyx.merge(ONYXKEYS.ACCOUNT, {success}); - } - } else { - Onyx.merge(ONYXKEYS.ACCOUNT, {errors: {[DateUtils.getMicroseconds()]: Localize.translateLocal('resendValidationForm.validationCodeFailedMessage')}}); - } - }).finally(() => { - Onyx.merge(ONYXKEYS.ACCOUNT, {isLoading: false}); - Navigation.navigate(redirectRoute); - }); + }, {optimisticData}); + Navigation.navigate(redirectRoute); } /** From 50ad9661269fad833f99cd5bc97ec1c54e029373 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Ch=C3=A1vez?= Date: Thu, 29 Sep 2022 17:40:18 -0500 Subject: [PATCH 2/8] remove unused library --- src/libs/actions/User.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libs/actions/User.js b/src/libs/actions/User.js index cf178e894320..8d0ba0df94d8 100644 --- a/src/libs/actions/User.js +++ b/src/libs/actions/User.js @@ -18,7 +18,6 @@ import * as Link from './Link'; import getSkinToneEmojiFromIndex from '../../components/EmojiPicker/getSkinToneEmojiFromIndex'; import * as SequentialQueue from '../Network/SequentialQueue'; import PusherUtils from '../PusherUtils'; -import DateUtils from '../DateUtils'; let sessionAuthToken = ''; let currentUserAccountID = ''; From 14efc08f9b29a1f47d7164757f1b80f7857d310e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Ch=C3=A1vez?= Date: Thu, 29 Sep 2022 18:50:35 -0500 Subject: [PATCH 3/8] use setIsNavigationReady to resolve pending routes --- src/Expensify.js | 4 +--- src/libs/Navigation/Navigation.js | 24 ++++++++++++------------ src/libs/Navigation/NavigationRoot.js | 1 - 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/src/Expensify.js b/src/Expensify.js index 9d9b58a4f752..21469668d637 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -142,9 +142,7 @@ class Expensify extends PureComponent { setNavigationReady() { this.setState({isNavigationReady: true}); - - // Navigate to any pending routes now that the NavigationContainer is ready - Navigation.goToPendingRoute(); + Navigation.setIsNavigationReady(); } /** diff --git a/src/libs/Navigation/Navigation.js b/src/libs/Navigation/Navigation.js index 037717ff021b..23ce380e254f 100644 --- a/src/libs/Navigation/Navigation.js +++ b/src/libs/Navigation/Navigation.js @@ -197,17 +197,6 @@ function isActiveRoute(routePath) { return getActiveRoute().substring(1) === routePath; } -/** - * @returns {Promise} - */ -function isNavigationReady() { - return navigationIsReadyPromise; -} - -function setIsNavigationReady() { - resolveNavigationIsReadyPromise(); -} - /** * Navigate to the route that we originally intended to go to * but the NavigationContainer was not ready when navigate() was called @@ -221,6 +210,18 @@ function goToPendingRoute() { pendingRoute = false; } +/** + * @returns {Promise} + */ +function isNavigationReady() { + return navigationIsReadyPromise; +} + +function setIsNavigationReady() { + goToPendingRoute(); + resolveNavigationIsReadyPromise(); +} + export default { canNavigate, navigate, @@ -228,7 +229,6 @@ export default { isActiveRoute, getActiveRoute, goBack, - goToPendingRoute, closeDrawer, getDefaultDrawerState, setDidTapNotification, diff --git a/src/libs/Navigation/NavigationRoot.js b/src/libs/Navigation/NavigationRoot.js index 29cee1badc8d..1618fea6d3c4 100644 --- a/src/libs/Navigation/NavigationRoot.js +++ b/src/libs/Navigation/NavigationRoot.js @@ -48,7 +48,6 @@ class NavigationRoot extends Component { UnreadIndicatorUpdater.throttledUpdatePageTitleAndUnreadCount(); Navigation.setIsNavigationReady(); - this.props.onReady(); } render() { From 6caa92a1968a841546f23a916a129bc21793b087 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Ch=C3=A1vez?= Date: Mon, 3 Oct 2022 21:34:25 -0500 Subject: [PATCH 4/8] use null instead of false for pendingRoute --- src/libs/Navigation/Navigation.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libs/Navigation/Navigation.js b/src/libs/Navigation/Navigation.js index 204a49cb7b34..9c7ebecb0ea0 100644 --- a/src/libs/Navigation/Navigation.js +++ b/src/libs/Navigation/Navigation.js @@ -21,7 +21,7 @@ const drawerIsReadyPromise = new Promise((resolve) => { }); let isLoggedIn = false; -let pendingRoute = false; +let pendingRoute = null; Onyx.connect({ key: ONYXKEYS.SESSION, @@ -207,12 +207,12 @@ function isActiveRoute(routePath) { * but the NavigationContainer was not ready when navigate() was called */ function goToPendingRoute() { - if (pendingRoute === false) { + if (pendingRoute === null) { return; } Log.hmmm(`[Navigation] Container now ready, going to pending route: ${pendingRoute}`); navigate(pendingRoute); - pendingRoute = false; + pendingRoute = null; } /** From 6fe1b41490d9f1734b12907313b9a229c35a2a3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Ch=C3=A1vez?= Date: Wed, 5 Oct 2022 13:45:52 -0500 Subject: [PATCH 5/8] add original comment --- src/Expensify.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Expensify.js b/src/Expensify.js index 21469668d637..93224dfd9321 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -142,6 +142,8 @@ class Expensify extends PureComponent { setNavigationReady() { this.setState({isNavigationReady: true}); + + // Navigate to any pending routes now that the NavigationContainer is ready Navigation.setIsNavigationReady(); } From 2663f41555773f8b0b1402d5b66001b754f8f7b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Ch=C3=A1vez?= Date: Thu, 6 Oct 2022 12:38:27 -0500 Subject: [PATCH 6/8] remove unused variables --- src/libs/actions/User.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/libs/actions/User.js b/src/libs/actions/User.js index 3cbd2278f4e7..c1f11e361065 100644 --- a/src/libs/actions/User.js +++ b/src/libs/actions/User.js @@ -19,12 +19,10 @@ import getSkinToneEmojiFromIndex from '../../components/EmojiPicker/getSkinToneE import * as SequentialQueue from '../Network/SequentialQueue'; import PusherUtils from '../PusherUtils'; -let sessionAuthToken = ''; let currentUserAccountID = ''; Onyx.connect({ key: ONYXKEYS.SESSION, callback: (val) => { - sessionAuthToken = lodashGet(val, 'authToken', ''); currentUserAccountID = lodashGet(val, 'accountID', ''); }, }); @@ -207,7 +205,6 @@ function setSecondaryLoginAndNavigate(login, password) { * @param {String} validateCode */ function validateLogin(accountID, validateCode) { - const isLoggedIn = !_.isEmpty(sessionAuthToken); Onyx.merge(ONYXKEYS.ACCOUNT, {...CONST.DEFAULT_ACCOUNT_DATA, isLoading: true}); const optimisticData = [ From 1cd4b1ab6be451a562eacf930a4efa05d8dc0726 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Ch=C3=A1vez?= Date: Thu, 6 Oct 2022 13:19:55 -0500 Subject: [PATCH 7/8] check if there's no pending route to open the drawer --- src/libs/Navigation/Navigation.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/Navigation/Navigation.js b/src/libs/Navigation/Navigation.js index 9af6a87a6c36..fd9c226bce53 100644 --- a/src/libs/Navigation/Navigation.js +++ b/src/libs/Navigation/Navigation.js @@ -140,7 +140,7 @@ function navigate(route = ROUTES.HOME) { } if (route === ROUTES.HOME) { - if (isLoggedIn) { + if (isLoggedIn && pendingRoute === null) { openDrawer(); return; } From 8208bc9ee3074ba4b22adbbf1dbc9a09545648b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Ch=C3=A1vez?= Date: Thu, 6 Oct 2022 13:24:41 -0500 Subject: [PATCH 8/8] add comment to pop loading screen --- src/libs/Navigation/Navigation.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libs/Navigation/Navigation.js b/src/libs/Navigation/Navigation.js index fd9c226bce53..e937e501597a 100644 --- a/src/libs/Navigation/Navigation.js +++ b/src/libs/Navigation/Navigation.js @@ -147,6 +147,7 @@ function navigate(route = ROUTES.HOME) { // If we're navigating to the signIn page while logged out, pop whatever screen is on top // since it's guaranteed that the sign in page will be underneath (since it's the initial route). + // Also, if we're coming from a link to validate login (pendingRoute is not null), we want to pop the loading screen. navigationRef.current.dispatch(StackActions.pop()); return; }