From c64aeff2ae2ff6a27f3d54365608b9710761fbee Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Mon, 9 Aug 2021 12:59:37 -0400 Subject: [PATCH 01/31] Add new routes --- src/ROUTES.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ROUTES.js b/src/ROUTES.js index bbe1883d441..216444029cf 100644 --- a/src/ROUTES.js +++ b/src/ROUTES.js @@ -70,6 +70,8 @@ export default { // when linking users from e.com in order to share a session in this app. VALIDATE_LOGIN_WITH_VALIDATE_CODE_NEW_WORKSPACE: 'v/:accountID/:validateCode/new-workspace', VALIDATE_LOGIN_WITH_VALIDATE_CODE_2FA_NEW_WORKSPACE: 'v/:accountID/:validateCode/2fa/new-workspace', + VALIDATE_LOGIN_WITH_VALIDATE_CODE_WORKSPACE_CARD: 'v/:accountID/:validateCode/workspace/:policyID/card', + VALIDATE_LOGIN_WITH_VALIDATE_CODE_2FA_WORKSPACE_CARD: 'v/:accountID/:validateCode/2fa/workspace/:policyID/card', ENABLE_PAYMENTS: 'enable-payments', WORKSPACE_NEW: 'workspace/new', WORKSPACE: 'workspace', From d5b58c123b891ae3384aaed23570d7720a7908f2 Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Mon, 9 Aug 2021 21:04:18 -0400 Subject: [PATCH 02/31] Add workspace_card route to be available when validating login and redirecting --- src/SCREENS.js | 2 ++ src/libs/Navigation/AppNavigator/AuthScreens.js | 10 ++++++++++ src/libs/Navigation/AppNavigator/PublicScreens.js | 10 ++++++++++ src/libs/Navigation/linkingConfig.js | 2 ++ src/pages/ValidateLogin2FANewWorkspacePage.js | 7 ++++++- src/pages/ValidateLoginNewWorkspacePage.js | 8 +++++++- 6 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/SCREENS.js b/src/SCREENS.js index 521e5a47185..a1a74ce5c3c 100644 --- a/src/SCREENS.js +++ b/src/SCREENS.js @@ -8,4 +8,6 @@ export default { REPORT: 'Report', VALIDATE_LOGIN_NEW_WORKSPACE: 'ValidateLoginNewWorkspace', VALIDATE_LOGIN_2FA_NEW_WORKSPACE: 'ValidateLogin2FANewWorkspace', + VALIDATE_LOGIN_WORKSPACE_CARD: 'ValidateLoginWorkspaceCard', + VALIDATE_LOGIN_2FA_WORKSPACE_CARD: 'ValidateLogin2FAWorkspaceCard', }; diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.js b/src/libs/Navigation/AppNavigator/AuthScreens.js index 5ba802e792b..ec1b675b393 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.js +++ b/src/libs/Navigation/AppNavigator/AuthScreens.js @@ -291,6 +291,16 @@ class AuthScreens extends React.Component { options={defaultScreenOptions} component={ValidateLogin2FANewWorkspacePage} /> + + {/* These are the various modal routes */} {/* Note: Each modal must have it's own stack navigator since we want to be able to navigate to any diff --git a/src/libs/Navigation/AppNavigator/PublicScreens.js b/src/libs/Navigation/AppNavigator/PublicScreens.js index bfe32607bdc..278e4ee0938 100644 --- a/src/libs/Navigation/AppNavigator/PublicScreens.js +++ b/src/libs/Navigation/AppNavigator/PublicScreens.js @@ -42,5 +42,15 @@ export default () => ( options={defaultScreenOptions} component={ValidateLogin2FANewWorkspacePage} /> + + ); diff --git a/src/libs/Navigation/linkingConfig.js b/src/libs/Navigation/linkingConfig.js index cf3c57b07ac..6549bf2cf43 100644 --- a/src/libs/Navigation/linkingConfig.js +++ b/src/libs/Navigation/linkingConfig.js @@ -29,6 +29,8 @@ export default { ValidateLogin: ROUTES.VALIDATE_LOGIN_WITH_VALIDATE_CODE, [SCREENS.VALIDATE_LOGIN_NEW_WORKSPACE]: ROUTES.VALIDATE_LOGIN_WITH_VALIDATE_CODE_NEW_WORKSPACE, [SCREENS.VALIDATE_LOGIN_2FA_NEW_WORKSPACE]: ROUTES.VALIDATE_LOGIN_WITH_VALIDATE_CODE_2FA_NEW_WORKSPACE, + [SCREENS.VALIDATE_LOGIN_WORKSPACE_CARD]: ROUTES.VALIDATE_LOGIN_WITH_VALIDATE_CODE_WORKSPACE_CARD, + [SCREENS.VALIDATE_LOGIN_2FA_WORKSPACE_CARD]: ROUTES.VALIDATE_LOGIN_WITH_VALIDATE_CODE_2FA_WORKSPACE_CARD, // Modal Screens Settings: { diff --git a/src/pages/ValidateLogin2FANewWorkspacePage.js b/src/pages/ValidateLogin2FANewWorkspacePage.js index 6e9c07d44b9..001f9abda14 100644 --- a/src/pages/ValidateLogin2FANewWorkspacePage.js +++ b/src/pages/ValidateLogin2FANewWorkspacePage.js @@ -49,6 +49,7 @@ class ValidateLogin2FANewWorkspacePage extends Component { super(props); this.validateAndSubmitForm = this.validateAndSubmitForm.bind(this); + console.log(props); this.state = { twoFactorAuthCode: '', @@ -70,8 +71,12 @@ class ValidateLogin2FANewWorkspacePage extends Component { if (_.isEmpty(this.props.betas)) { setRedirectToWorkspaceNewAfterSignIn(true); - } else { + } else if (this.props.route.name === SCREENS.VALIDATE_LOGIN_WORKSPACE_CARD) { + Navigation.navigate(ROUTES.getWorkspaceCardRoute(this.props.route.params.policyID)); + } else if (this.props.route.name === SCREENS.VALIDATE_LOGIN_NEW_WORKSPACE) { Navigation.navigate(ROUTES.WORKSPACE_NEW); + } else { + Navigation.navigate(ROUTES.HOME); } } } diff --git a/src/pages/ValidateLoginNewWorkspacePage.js b/src/pages/ValidateLoginNewWorkspacePage.js index 864d742dd8b..dd033ced372 100644 --- a/src/pages/ValidateLoginNewWorkspacePage.js +++ b/src/pages/ValidateLoginNewWorkspacePage.js @@ -8,6 +8,7 @@ import compose from '../libs/compose'; import ONYXKEYS from '../ONYXKEYS'; import Navigation from '../libs/Navigation/Navigation'; import ROUTES from '../ROUTES'; +import SCREENS from '../SCREENS'; import {continueSessionFromECom, setRedirectToWorkspaceNewAfterSignIn} from '../libs/actions/Session'; @@ -36,6 +37,7 @@ const defaultProps = { }; class ValidateLoginNewWorkspacePage extends Component { componentDidMount() { + console.log(this.props); // If the user has an active session already, they need to be redirected straight to the new workspace page if (this.props.session.authToken) { // In order to navigate to a modal, we first have to dismiss the current modal. But there is no current @@ -47,8 +49,12 @@ class ValidateLoginNewWorkspacePage extends Component { Navigation.dismissModal(); if (_.isEmpty(this.props.betas)) { setRedirectToWorkspaceNewAfterSignIn(true); - } else { + } else if (this.props.route.name === SCREENS.VALIDATE_LOGIN_WORKSPACE_CARD) { + Navigation.navigate(ROUTES.getWorkspaceCardRoute(this.props.route.params.policyID)); + } else if (this.props.route.name === SCREENS.VALIDATE_LOGIN_NEW_WORKSPACE) { Navigation.navigate(ROUTES.WORKSPACE_NEW); + } else { + Navigation.navigate(ROUTES.HOME); } return; } From 38d8a24a2435c8f50068e944eed93ee7f657f4b4 Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Mon, 9 Aug 2021 21:13:34 -0400 Subject: [PATCH 03/31] remove console statements and add missing import --- src/pages/ValidateLogin2FANewWorkspacePage.js | 2 +- src/pages/ValidateLoginNewWorkspacePage.js | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/pages/ValidateLogin2FANewWorkspacePage.js b/src/pages/ValidateLogin2FANewWorkspacePage.js index 001f9abda14..2f5d38687cf 100644 --- a/src/pages/ValidateLogin2FANewWorkspacePage.js +++ b/src/pages/ValidateLogin2FANewWorkspacePage.js @@ -18,6 +18,7 @@ import compose from '../libs/compose'; import ONYXKEYS from '../ONYXKEYS'; import Navigation from '../libs/Navigation/Navigation'; import ROUTES from '../ROUTES'; +import SCREENS from '../SCREENS'; const propTypes = { /* Onyx Props */ @@ -49,7 +50,6 @@ class ValidateLogin2FANewWorkspacePage extends Component { super(props); this.validateAndSubmitForm = this.validateAndSubmitForm.bind(this); - console.log(props); this.state = { twoFactorAuthCode: '', diff --git a/src/pages/ValidateLoginNewWorkspacePage.js b/src/pages/ValidateLoginNewWorkspacePage.js index dd033ced372..01c1b66ded1 100644 --- a/src/pages/ValidateLoginNewWorkspacePage.js +++ b/src/pages/ValidateLoginNewWorkspacePage.js @@ -37,7 +37,6 @@ const defaultProps = { }; class ValidateLoginNewWorkspacePage extends Component { componentDidMount() { - console.log(this.props); // If the user has an active session already, they need to be redirected straight to the new workspace page if (this.props.session.authToken) { // In order to navigate to a modal, we first have to dismiss the current modal. But there is no current From ee2e2203f3280ae029185843a88170aee60af3b0 Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Tue, 10 Aug 2021 13:12:29 -0400 Subject: [PATCH 04/31] Update uses to remove VALIDATE_ since we aren't validating logins --- src/ROUTES.js | 8 ++++---- src/SCREENS.js | 8 ++++---- src/libs/Navigation/AppNavigator/AuthScreens.js | 8 ++++---- src/libs/Navigation/AppNavigator/PublicScreens.js | 8 ++++---- src/libs/Navigation/linkingConfig.js | 8 ++++---- src/pages/ValidateLogin2FANewWorkspacePage.js | 4 ++-- src/pages/ValidateLoginNewWorkspacePage.js | 4 ++-- 7 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/ROUTES.js b/src/ROUTES.js index 41756a3334d..4b6930110ad 100644 --- a/src/ROUTES.js +++ b/src/ROUTES.js @@ -70,10 +70,10 @@ export default { // This is a special validation URL that will take the user to /workspace/new after validation. This is used // when linking users from e.com in order to share a session in this app. - VALIDATE_LOGIN_WITH_VALIDATE_CODE_NEW_WORKSPACE: 'v/:accountID/:validateCode/new-workspace', - VALIDATE_LOGIN_WITH_VALIDATE_CODE_2FA_NEW_WORKSPACE: 'v/:accountID/:validateCode/2fa/new-workspace', - VALIDATE_LOGIN_WITH_VALIDATE_CODE_WORKSPACE_CARD: 'v/:accountID/:validateCode/workspace/:policyID/card', - VALIDATE_LOGIN_WITH_VALIDATE_CODE_2FA_WORKSPACE_CARD: 'v/:accountID/:validateCode/2fa/workspace/:policyID/card', + LOGIN_WITH_VALIDATE_CODE_NEW_WORKSPACE: 'v/:accountID/:validateCode/new-workspace', + LOGIN_WITH_VALIDATE_CODE_2FA_NEW_WORKSPACE: 'v/:accountID/:validateCode/2fa/new-workspace', + LOGIN_WITH_VALIDATE_CODE_WORKSPACE_CARD: 'v/:accountID/:validateCode/workspace/:policyID/card', + LOGIN_WITH_VALIDATE_CODE_2FA_WORKSPACE_CARD: 'v/:accountID/:validateCode/2fa/workspace/:policyID/card', ENABLE_PAYMENTS: 'enable-payments', WORKSPACE_NEW: 'workspace/new', WORKSPACE: 'workspace', diff --git a/src/SCREENS.js b/src/SCREENS.js index a1a74ce5c3c..fdd2e6c867a 100644 --- a/src/SCREENS.js +++ b/src/SCREENS.js @@ -6,8 +6,8 @@ export default { HOME: 'Home', LOADING: 'Loading', REPORT: 'Report', - VALIDATE_LOGIN_NEW_WORKSPACE: 'ValidateLoginNewWorkspace', - VALIDATE_LOGIN_2FA_NEW_WORKSPACE: 'ValidateLogin2FANewWorkspace', - VALIDATE_LOGIN_WORKSPACE_CARD: 'ValidateLoginWorkspaceCard', - VALIDATE_LOGIN_2FA_WORKSPACE_CARD: 'ValidateLogin2FAWorkspaceCard', + LOGIN_REDIRECT_NEW_WORKSPACE: 'LoginRedirectNewWorkspace', + LOGIN_REDIRECT_2FA_NEW_WORKSPACE: 'LoginRedirect2FANewWorkspace', + LOGIN_REDIRECT_WORKSPACE_CARD: 'LoginRedirectWorkspaceCard', + LOGIN_REDIRECT_2FA_WORKSPACE_CARD: 'LoginRedirect2FAWorkspaceCard', }; diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.js b/src/libs/Navigation/AppNavigator/AuthScreens.js index b7ed1adb459..b4edcdb7a65 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.js +++ b/src/libs/Navigation/AppNavigator/AuthScreens.js @@ -299,22 +299,22 @@ class AuthScreens extends React.Component { component={ValidateLoginPage} /> diff --git a/src/libs/Navigation/AppNavigator/PublicScreens.js b/src/libs/Navigation/AppNavigator/PublicScreens.js index 278e4ee0938..f114dcd72da 100644 --- a/src/libs/Navigation/AppNavigator/PublicScreens.js +++ b/src/libs/Navigation/AppNavigator/PublicScreens.js @@ -33,22 +33,22 @@ export default () => ( component={PublicWorkspaceNewView} /> diff --git a/src/libs/Navigation/linkingConfig.js b/src/libs/Navigation/linkingConfig.js index 91c32fec521..20e32613baf 100644 --- a/src/libs/Navigation/linkingConfig.js +++ b/src/libs/Navigation/linkingConfig.js @@ -27,10 +27,10 @@ export default { // Public Routes SetPassword: ROUTES.SET_PASSWORD_WITH_VALIDATE_CODE, ValidateLogin: ROUTES.VALIDATE_LOGIN_WITH_VALIDATE_CODE, - [SCREENS.VALIDATE_LOGIN_NEW_WORKSPACE]: ROUTES.VALIDATE_LOGIN_WITH_VALIDATE_CODE_NEW_WORKSPACE, - [SCREENS.VALIDATE_LOGIN_2FA_NEW_WORKSPACE]: ROUTES.VALIDATE_LOGIN_WITH_VALIDATE_CODE_2FA_NEW_WORKSPACE, - [SCREENS.VALIDATE_LOGIN_WORKSPACE_CARD]: ROUTES.VALIDATE_LOGIN_WITH_VALIDATE_CODE_WORKSPACE_CARD, - [SCREENS.VALIDATE_LOGIN_2FA_WORKSPACE_CARD]: ROUTES.VALIDATE_LOGIN_WITH_VALIDATE_CODE_2FA_WORKSPACE_CARD, + [SCREENS.LOGIN_REDIRECT_NEW_WORKSPACE]: ROUTES.LOGIN_WITH_VALIDATE_CODE_NEW_WORKSPACE, + [SCREENS.LOGIN_REDIRECT_2FA_NEW_WORKSPACE]: ROUTES.LOGIN_WITH_VALIDATE_CODE_2FA_NEW_WORKSPACE, + [SCREENS.LOGIN_REDIRECT_WORKSPACE_CARD]: ROUTES.LOGIN_WITH_VALIDATE_CODE_WORKSPACE_CARD, + [SCREENS.LOGIN_REDIRECT_2FA_WORKSPACE_CARD]: ROUTES.LOGIN_WITH_VALIDATE_CODE_2FA_WORKSPACE_CARD, // Modal Screens Settings: { diff --git a/src/pages/ValidateLogin2FANewWorkspacePage.js b/src/pages/ValidateLogin2FANewWorkspacePage.js index eb7ae136071..3ca4fd142bc 100644 --- a/src/pages/ValidateLogin2FANewWorkspacePage.js +++ b/src/pages/ValidateLogin2FANewWorkspacePage.js @@ -71,9 +71,9 @@ class ValidateLogin2FANewWorkspacePage extends Component { if (_.isEmpty(this.props.betas)) { setRedirectToWorkspaceNewAfterSignIn(true); - } else if (this.props.route.name === SCREENS.VALIDATE_LOGIN_WORKSPACE_CARD) { + } else if (this.props.route.name === SCREENS.LOGIN_REDIRECT_2FA_WORKSPACE_CARD) { Navigation.navigate(ROUTES.getWorkspaceCardRoute(this.props.route.params.policyID)); - } else if (this.props.route.name === SCREENS.VALIDATE_LOGIN_NEW_WORKSPACE) { + } else if (this.props.route.name === SCREENS.LOGIN_REDIRECT_2FA_NEW_WORKSPACE) { Navigation.navigate(ROUTES.WORKSPACE_NEW); } else { Navigation.navigate(ROUTES.HOME); diff --git a/src/pages/ValidateLoginNewWorkspacePage.js b/src/pages/ValidateLoginNewWorkspacePage.js index 6c9abe6299e..78cb09a999b 100644 --- a/src/pages/ValidateLoginNewWorkspacePage.js +++ b/src/pages/ValidateLoginNewWorkspacePage.js @@ -47,9 +47,9 @@ class ValidateLoginNewWorkspacePage extends Component { Navigation.dismissModal(); if (_.isEmpty(this.props.betas)) { setRedirectToWorkspaceNewAfterSignIn(true); - } else if (this.props.route.name === SCREENS.VALIDATE_LOGIN_WORKSPACE_CARD) { + } else if (this.props.route.name === SCREENS.LOGIN_REDIRECT_WORKSPACE_CARD) { Navigation.navigate(ROUTES.getWorkspaceCardRoute(this.props.route.params.policyID)); - } else if (this.props.route.name === SCREENS.VALIDATE_LOGIN_NEW_WORKSPACE) { + } else if (this.props.route.name === SCREENS.LOGIN_REDIRECT_NEW_WORKSPACE) { Navigation.navigate(ROUTES.WORKSPACE_NEW); } else { Navigation.navigate(ROUTES.HOME); From 0bec93524535cf2e3cec350b518443c87fdb5ab6 Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Tue, 10 Aug 2021 15:22:03 -0400 Subject: [PATCH 05/31] Rename to redirectAfterSignIn so flag is generic to all validateCodeLogin routes --- src/Expensify.js | 10 +++++----- src/libs/actions/Session.js | 8 ++++---- src/pages/ValidateLogin2FANewWorkspacePage.js | 4 ++-- src/pages/ValidateLoginNewWorkspacePage.js | 4 ++-- src/pages/workspace/PublicWorkspaceNewView.js | 4 ++-- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/Expensify.js b/src/Expensify.js index 60134552bde..811bffce0a7 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -19,7 +19,7 @@ import {growlRef} from './libs/Growl'; import Navigation from './libs/Navigation/Navigation'; import ROUTES from './ROUTES'; import StartupTimer from './libs/StartupTimer'; -import {setRedirectToWorkspaceNewAfterSignIn} from './libs/actions/Session'; +import {setRedirectAfterSign} from './libs/actions/Session'; const propTypes = { /* Onyx Props */ @@ -34,7 +34,7 @@ const propTypes = { accountID: PropTypes.number, /** Should app immediately redirect to new workspace route once authenticated */ - redirectToWorkspaceNewAfterSignIn: PropTypes.bool, + redirectAfterSignIn: PropTypes.bool, }), /** Whether a new update is available and ready to install. */ @@ -54,7 +54,7 @@ const defaultProps = { session: { authToken: null, accountID: null, - redirectToWorkspaceNewAfterSignIn: false, + redirectAfterSignIn: false, }, updateAvailable: false, initialReportDataLoaded: false, @@ -114,8 +114,8 @@ class Expensify extends PureComponent { if (this.getAuthToken() && !_.isEmpty(this.props.betas) - && lodashGet(this.props, 'session.redirectToWorkspaceNewAfterSignIn', false)) { - setRedirectToWorkspaceNewAfterSignIn(false); + && lodashGet(this.props, 'session.redirectAfterSignIn', false)) { + setRedirectAfterSign(false); Navigation.navigate(ROUTES.WORKSPACE_NEW); } diff --git a/src/libs/actions/Session.js b/src/libs/actions/Session.js index eeb303a25c5..477e8a9b369 100644 --- a/src/libs/actions/Session.js +++ b/src/libs/actions/Session.js @@ -304,12 +304,12 @@ function continueSessionFromECom(accountID, validateCode, twoFactorAuthCode) { } /** - * Sets the redirectToWorkspaceNewAfterSignIn flag in the session variable + * Sets the redirectAfterSignIn flag in the session variable * * @param {Boolean} shouldRedirect */ -function setRedirectToWorkspaceNewAfterSignIn(shouldRedirect) { - Onyx.merge(ONYXKEYS.SESSION, {redirectToWorkspaceNewAfterSignIn: shouldRedirect}); +function setRedirectAfterSign(shouldRedirect) { + Onyx.merge(ONYXKEYS.SESSION, {redirectAfterSignIn: shouldRedirect}); } export { @@ -322,5 +322,5 @@ export { resendValidationLink, resetPassword, restartSignin, - setRedirectToWorkspaceNewAfterSignIn, + setRedirectAfterSign, }; diff --git a/src/pages/ValidateLogin2FANewWorkspacePage.js b/src/pages/ValidateLogin2FANewWorkspacePage.js index 3ca4fd142bc..36a71e029b2 100644 --- a/src/pages/ValidateLogin2FANewWorkspacePage.js +++ b/src/pages/ValidateLogin2FANewWorkspacePage.js @@ -6,7 +6,7 @@ import {withOnyx} from 'react-native-onyx'; import _ from 'underscore'; import withLocalize, {withLocalizePropTypes} from '../components/withLocalize'; import validateLinkPropTypes from './validateLinkPropTypes'; -import {continueSessionFromECom, setRedirectToWorkspaceNewAfterSignIn} from '../libs/actions/Session'; +import {continueSessionFromECom, setRedirectAfterSign} from '../libs/actions/Session'; import styles from '../styles/styles'; import ExpensifyCashLogo from '../components/ExpensifyCashLogo'; import variables from '../styles/variables'; @@ -70,7 +70,7 @@ class ValidateLogin2FANewWorkspacePage extends Component { Navigation.dismissModal(); if (_.isEmpty(this.props.betas)) { - setRedirectToWorkspaceNewAfterSignIn(true); + setRedirectAfterSign(true); } else if (this.props.route.name === SCREENS.LOGIN_REDIRECT_2FA_WORKSPACE_CARD) { Navigation.navigate(ROUTES.getWorkspaceCardRoute(this.props.route.params.policyID)); } else if (this.props.route.name === SCREENS.LOGIN_REDIRECT_2FA_NEW_WORKSPACE) { diff --git a/src/pages/ValidateLoginNewWorkspacePage.js b/src/pages/ValidateLoginNewWorkspacePage.js index 78cb09a999b..f88406b6e20 100644 --- a/src/pages/ValidateLoginNewWorkspacePage.js +++ b/src/pages/ValidateLoginNewWorkspacePage.js @@ -9,7 +9,7 @@ import ONYXKEYS from '../ONYXKEYS'; import Navigation from '../libs/Navigation/Navigation'; import ROUTES from '../ROUTES'; import SCREENS from '../SCREENS'; -import {continueSessionFromECom, setRedirectToWorkspaceNewAfterSignIn} from '../libs/actions/Session'; +import {continueSessionFromECom, setRedirectAfterSign} from '../libs/actions/Session'; const propTypes = { /* Onyx Props */ @@ -46,7 +46,7 @@ class ValidateLoginNewWorkspacePage extends Component { // if they cancel out of the new workspace modal. Navigation.dismissModal(); if (_.isEmpty(this.props.betas)) { - setRedirectToWorkspaceNewAfterSignIn(true); + setRedirectAfterSign(true); } else if (this.props.route.name === SCREENS.LOGIN_REDIRECT_WORKSPACE_CARD) { Navigation.navigate(ROUTES.getWorkspaceCardRoute(this.props.route.params.policyID)); } else if (this.props.route.name === SCREENS.LOGIN_REDIRECT_NEW_WORKSPACE) { diff --git a/src/pages/workspace/PublicWorkspaceNewView.js b/src/pages/workspace/PublicWorkspaceNewView.js index 3d4a62f581a..53856e2f9a3 100644 --- a/src/pages/workspace/PublicWorkspaceNewView.js +++ b/src/pages/workspace/PublicWorkspaceNewView.js @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import SCREENS from '../../SCREENS'; -import {setRedirectToWorkspaceNewAfterSignIn} from '../../libs/actions/Session'; +import {setRedirectAfterSign} from '../../libs/actions/Session'; const propTypes = { /** react-navigation navigation object available to screen components */ @@ -13,7 +13,7 @@ const propTypes = { class PublicWorkspaceNewView extends React.PureComponent { componentDidMount() { - setRedirectToWorkspaceNewAfterSignIn(true); + setRedirectAfterSign(true); this.props.navigation.replace(SCREENS.HOME); } From 6d2007420de8f13dbfe7d9f4d6bcce946991f81d Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Tue, 10 Aug 2021 16:23:16 -0400 Subject: [PATCH 06/31] Rename component and constants to match generic functionality of logging with validate code --- src/SCREENS.js | 8 ++++---- .../Navigation/AppNavigator/AuthScreens.js | 20 +++++++++---------- .../Navigation/AppNavigator/PublicScreens.js | 20 +++++++++---------- src/libs/Navigation/linkingConfig.js | 8 ++++---- src/pages/ValidateLogin2FANewWorkspacePage.js | 14 ++++++------- src/pages/ValidateLoginNewWorkspacePage.js | 14 ++++++------- 6 files changed, 42 insertions(+), 42 deletions(-) diff --git a/src/SCREENS.js b/src/SCREENS.js index fdd2e6c867a..764965e7335 100644 --- a/src/SCREENS.js +++ b/src/SCREENS.js @@ -6,8 +6,8 @@ export default { HOME: 'Home', LOADING: 'Loading', REPORT: 'Report', - LOGIN_REDIRECT_NEW_WORKSPACE: 'LoginRedirectNewWorkspace', - LOGIN_REDIRECT_2FA_NEW_WORKSPACE: 'LoginRedirect2FANewWorkspace', - LOGIN_REDIRECT_WORKSPACE_CARD: 'LoginRedirectWorkspaceCard', - LOGIN_REDIRECT_2FA_WORKSPACE_CARD: 'LoginRedirect2FAWorkspaceCard', + LOGIN_WITH_VALIDATE_CODE_NEW_WORKSPACE: 'LoginWithValidateCodeNewWorkspace', + LOGIN_WITH_VALIDATE_CODE_2FA_NEW_WORKSPACE: 'LoginWithValidateCode2FANewWorkspace', + LOGIN_WITH_VALIDATE_CODE_WORKSPACE_CARD: 'LoginWithValidateCodeWorkspaceCard', + LOGIN_WITH_VALIDATE_CODE_2FA_WORKSPACE_CARD: 'LoginWithValidateCode2FAWorkspaceCard', }; diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.js b/src/libs/Navigation/AppNavigator/AuthScreens.js index b4edcdb7a65..811741e535c 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.js +++ b/src/libs/Navigation/AppNavigator/AuthScreens.js @@ -62,8 +62,8 @@ import { } from './ModalStackNavigators'; import SCREENS from '../../../SCREENS'; import Timers from '../../Timers'; -import ValidateLoginNewWorkspacePage from '../../../pages/ValidateLoginNewWorkspacePage'; -import ValidateLogin2FANewWorkspacePage from '../../../pages/ValidateLogin2FANewWorkspacePage'; +import LoginWithValidateCodePage from '../../../pages/ValidateLoginNewWorkspacePage'; +import LoginWithValidateCode2FAPage from '../../../pages/LoginWithValidateCode2FAPage'; import WorkspaceSettingsDrawerNavigator from './WorkspaceSettingsDrawerNavigator'; import spacing from '../../../styles/utilities/spacing'; import CardOverlay from '../../../components/CardOverlay'; @@ -299,24 +299,24 @@ class AuthScreens extends React.Component { component={ValidateLoginPage} /> {/* These are the various modal routes */} diff --git a/src/libs/Navigation/AppNavigator/PublicScreens.js b/src/libs/Navigation/AppNavigator/PublicScreens.js index f114dcd72da..27558acda47 100644 --- a/src/libs/Navigation/AppNavigator/PublicScreens.js +++ b/src/libs/Navigation/AppNavigator/PublicScreens.js @@ -5,8 +5,8 @@ import SetPasswordPage from '../../../pages/SetPasswordPage'; import PublicWorkspaceNewView from '../../../pages/workspace/PublicWorkspaceNewView'; import ValidateLoginPage from '../../../pages/ValidateLoginPage'; import SCREENS from '../../../SCREENS'; -import ValidateLoginNewWorkspacePage from '../../../pages/ValidateLoginNewWorkspacePage'; -import ValidateLogin2FANewWorkspacePage from '../../../pages/ValidateLogin2FANewWorkspacePage'; +import LoginWithValidateCodePage from '../../../pages/ValidateLoginNewWorkspacePage'; +import LoginWithValidateCode2FAPage from '../../../pages/LoginWithValidateCode2FAPage'; import defaultScreenOptions from './defaultScreenOptions'; const RootStack = createStackNavigator(); @@ -33,24 +33,24 @@ export default () => ( component={PublicWorkspaceNewView} /> ); diff --git a/src/libs/Navigation/linkingConfig.js b/src/libs/Navigation/linkingConfig.js index 20e32613baf..ba16784927b 100644 --- a/src/libs/Navigation/linkingConfig.js +++ b/src/libs/Navigation/linkingConfig.js @@ -27,10 +27,10 @@ export default { // Public Routes SetPassword: ROUTES.SET_PASSWORD_WITH_VALIDATE_CODE, ValidateLogin: ROUTES.VALIDATE_LOGIN_WITH_VALIDATE_CODE, - [SCREENS.LOGIN_REDIRECT_NEW_WORKSPACE]: ROUTES.LOGIN_WITH_VALIDATE_CODE_NEW_WORKSPACE, - [SCREENS.LOGIN_REDIRECT_2FA_NEW_WORKSPACE]: ROUTES.LOGIN_WITH_VALIDATE_CODE_2FA_NEW_WORKSPACE, - [SCREENS.LOGIN_REDIRECT_WORKSPACE_CARD]: ROUTES.LOGIN_WITH_VALIDATE_CODE_WORKSPACE_CARD, - [SCREENS.LOGIN_REDIRECT_2FA_WORKSPACE_CARD]: ROUTES.LOGIN_WITH_VALIDATE_CODE_2FA_WORKSPACE_CARD, + [SCREENS.LOGIN_WITH_VALIDATE_CODE_NEW_WORKSPACE]: ROUTES.LOGIN_WITH_VALIDATE_CODE_NEW_WORKSPACE, + [SCREENS.LOGIN_WITH_VALIDATE_CODE_2FA_NEW_WORKSPACE]: ROUTES.LOGIN_WITH_VALIDATE_CODE_2FA_NEW_WORKSPACE, + [SCREENS.LOGIN_WITH_VALIDATE_CODE_WORKSPACE_CARD]: ROUTES.LOGIN_WITH_VALIDATE_CODE_WORKSPACE_CARD, + [SCREENS.LOGIN_WITH_VALIDATE_CODE_2FA_WORKSPACE_CARD]: ROUTES.LOGIN_WITH_VALIDATE_CODE_2FA_WORKSPACE_CARD, // Modal Screens Settings: { diff --git a/src/pages/ValidateLogin2FANewWorkspacePage.js b/src/pages/ValidateLogin2FANewWorkspacePage.js index 36a71e029b2..438573c8714 100644 --- a/src/pages/ValidateLogin2FANewWorkspacePage.js +++ b/src/pages/ValidateLogin2FANewWorkspacePage.js @@ -45,7 +45,7 @@ const defaultProps = { session: {}, betas: [], }; -class ValidateLogin2FANewWorkspacePage extends Component { +class LoginWithValidateCode2FAPage extends Component { constructor(props) { super(props); @@ -59,7 +59,7 @@ class ValidateLogin2FANewWorkspacePage extends Component { } componentDidMount() { - // If the user has an active session already, they need to be redirected straight to the new workspace page + // If the user has an active session already, they need to be redirected straight to the relevant page if (this.props.session.authToken) { // In order to navigate to a modal, we first have to dismiss the current modal. But there is no current // modal you say? I know, it confuses me too. Without dismissing the current modal, if they user cancels @@ -71,9 +71,9 @@ class ValidateLogin2FANewWorkspacePage extends Component { if (_.isEmpty(this.props.betas)) { setRedirectAfterSign(true); - } else if (this.props.route.name === SCREENS.LOGIN_REDIRECT_2FA_WORKSPACE_CARD) { + } else if (this.props.route.name === SCREENS.LOGIN_WITH_VALIDATE_CODE_2FA_WORKSPACE_CARD) { Navigation.navigate(ROUTES.getWorkspaceCardRoute(this.props.route.params.policyID)); - } else if (this.props.route.name === SCREENS.LOGIN_REDIRECT_2FA_NEW_WORKSPACE) { + } else if (this.props.route.name === SCREENS.LOGIN_WITH_VALIDATE_CODE_2FA_NEW_WORKSPACE) { Navigation.navigate(ROUTES.WORKSPACE_NEW); } else { Navigation.navigate(ROUTES.HOME); @@ -150,8 +150,8 @@ class ValidateLogin2FANewWorkspacePage extends Component { } } -ValidateLogin2FANewWorkspacePage.propTypes = propTypes; -ValidateLogin2FANewWorkspacePage.defaultProps = defaultProps; +LoginWithValidateCode2FAPage.propTypes = propTypes; +LoginWithValidateCode2FAPage.defaultProps = defaultProps; export default compose( withLocalize, @@ -163,4 +163,4 @@ export default compose( key: ONYXKEYS.BETAS, }, }), -)(ValidateLogin2FANewWorkspacePage); +)(LoginWithValidateCode2FAPage); diff --git a/src/pages/ValidateLoginNewWorkspacePage.js b/src/pages/ValidateLoginNewWorkspacePage.js index f88406b6e20..a91ddf75eff 100644 --- a/src/pages/ValidateLoginNewWorkspacePage.js +++ b/src/pages/ValidateLoginNewWorkspacePage.js @@ -34,9 +34,9 @@ const defaultProps = { session: {}, betas: [], }; -class ValidateLoginNewWorkspacePage extends Component { +class LoginWithValidateCodePage extends Component { componentDidMount() { - // If the user has an active session already, they need to be redirected straight to the new workspace page + // If the user has an active session already, they need to be redirected straight to the relevant page if (this.props.session.authToken) { // In order to navigate to a modal, we first have to dismiss the current modal. But there is no current // modal you say? I know, it confuses me too. Without dismissing the current modal, if they user cancels @@ -47,9 +47,9 @@ class ValidateLoginNewWorkspacePage extends Component { Navigation.dismissModal(); if (_.isEmpty(this.props.betas)) { setRedirectAfterSign(true); - } else if (this.props.route.name === SCREENS.LOGIN_REDIRECT_WORKSPACE_CARD) { + } else if (this.props.route.name === SCREENS.LOGIN_WITH_VALIDATE_CODE_WORKSPACE_CARD) { Navigation.navigate(ROUTES.getWorkspaceCardRoute(this.props.route.params.policyID)); - } else if (this.props.route.name === SCREENS.LOGIN_REDIRECT_NEW_WORKSPACE) { + } else if (this.props.route.name === SCREENS.LOGIN_WITH_VALIDATE_CODE_NEW_WORKSPACE) { Navigation.navigate(ROUTES.WORKSPACE_NEW); } else { Navigation.navigate(ROUTES.HOME); @@ -69,8 +69,8 @@ class ValidateLoginNewWorkspacePage extends Component { } } -ValidateLoginNewWorkspacePage.propTypes = propTypes; -ValidateLoginNewWorkspacePage.defaultProps = defaultProps; +LoginWithValidateCodePage.propTypes = propTypes; +LoginWithValidateCodePage.defaultProps = defaultProps; export default compose( withOnyx({ @@ -81,4 +81,4 @@ export default compose( key: ONYXKEYS.BETAS, }, }), -)(ValidateLoginNewWorkspacePage); +)(LoginWithValidateCodePage); From 7ca2bb3c6b24f1e21e666632dd8490c6cd377a68 Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Tue, 10 Aug 2021 16:41:24 -0400 Subject: [PATCH 07/31] Rename files to fit new generic functionality --- src/libs/Navigation/AppNavigator/AuthScreens.js | 2 +- src/libs/Navigation/AppNavigator/PublicScreens.js | 2 +- ...in2FANewWorkspacePage.js => LoginWithValidateCode2FAPage.js} | 0 ...ateLoginNewWorkspacePage.js => LoginWithValidateCodePage.js} | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename src/pages/{ValidateLogin2FANewWorkspacePage.js => LoginWithValidateCode2FAPage.js} (100%) rename src/pages/{ValidateLoginNewWorkspacePage.js => LoginWithValidateCodePage.js} (100%) diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.js b/src/libs/Navigation/AppNavigator/AuthScreens.js index 811741e535c..d399267ca9f 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.js +++ b/src/libs/Navigation/AppNavigator/AuthScreens.js @@ -62,7 +62,7 @@ import { } from './ModalStackNavigators'; import SCREENS from '../../../SCREENS'; import Timers from '../../Timers'; -import LoginWithValidateCodePage from '../../../pages/ValidateLoginNewWorkspacePage'; +import LoginWithValidateCodePage from '../../../pages/LoginWithValidateCodePage'; import LoginWithValidateCode2FAPage from '../../../pages/LoginWithValidateCode2FAPage'; import WorkspaceSettingsDrawerNavigator from './WorkspaceSettingsDrawerNavigator'; import spacing from '../../../styles/utilities/spacing'; diff --git a/src/libs/Navigation/AppNavigator/PublicScreens.js b/src/libs/Navigation/AppNavigator/PublicScreens.js index 27558acda47..0e6d7db91ad 100644 --- a/src/libs/Navigation/AppNavigator/PublicScreens.js +++ b/src/libs/Navigation/AppNavigator/PublicScreens.js @@ -5,7 +5,7 @@ import SetPasswordPage from '../../../pages/SetPasswordPage'; import PublicWorkspaceNewView from '../../../pages/workspace/PublicWorkspaceNewView'; import ValidateLoginPage from '../../../pages/ValidateLoginPage'; import SCREENS from '../../../SCREENS'; -import LoginWithValidateCodePage from '../../../pages/ValidateLoginNewWorkspacePage'; +import LoginWithValidateCodePage from '../../../pages/LoginWithValidateCodePage'; import LoginWithValidateCode2FAPage from '../../../pages/LoginWithValidateCode2FAPage'; import defaultScreenOptions from './defaultScreenOptions'; diff --git a/src/pages/ValidateLogin2FANewWorkspacePage.js b/src/pages/LoginWithValidateCode2FAPage.js similarity index 100% rename from src/pages/ValidateLogin2FANewWorkspacePage.js rename to src/pages/LoginWithValidateCode2FAPage.js diff --git a/src/pages/ValidateLoginNewWorkspacePage.js b/src/pages/LoginWithValidateCodePage.js similarity index 100% rename from src/pages/ValidateLoginNewWorkspacePage.js rename to src/pages/LoginWithValidateCodePage.js From b4e635ea5640c42353eb46e497e370f72edf275d Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Wed, 11 Aug 2021 14:35:54 -0400 Subject: [PATCH 08/31] Remove uneeded line --- src/pages/LoginWithValidateCodePage.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/LoginWithValidateCodePage.js b/src/pages/LoginWithValidateCodePage.js index 76d7e872de4..85ba088a692 100644 --- a/src/pages/LoginWithValidateCodePage.js +++ b/src/pages/LoginWithValidateCodePage.js @@ -55,7 +55,6 @@ class LoginWithValidateCodePage extends Component { create(); } else { Navigation.navigate(ROUTES.HOME); - setRedirectToWorkspaceNewAfterSignIn(true); } return; } From f47c7289247e8fc4dfa1319add28abc3bac049a9 Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Wed, 11 Aug 2021 14:46:00 -0400 Subject: [PATCH 09/31] Clearer comment --- src/pages/LoginWithValidateCode2FAPage.js | 2 +- src/pages/LoginWithValidateCodePage.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/LoginWithValidateCode2FAPage.js b/src/pages/LoginWithValidateCode2FAPage.js index 28d0fe81f16..72d3a5b38c5 100644 --- a/src/pages/LoginWithValidateCode2FAPage.js +++ b/src/pages/LoginWithValidateCode2FAPage.js @@ -75,7 +75,7 @@ class LoginWithValidateCode2FAPage extends Component { } else if (this.props.route.name === SCREENS.LOGIN_WITH_VALIDATE_CODE_2FA_WORKSPACE_CARD) { Navigation.navigate(ROUTES.getWorkspaceCardRoute(this.props.route.params.policyID)); } else if (this.props.route.name === SCREENS.LOGIN_WITH_VALIDATE_CODE_2FA_NEW_WORKSPACE) { - // Create a new workspace then the user will be routed to it's settings page + // Create a new workspace so that the user will be routed to it's settings page afterwards create(); } else { Navigation.navigate(ROUTES.HOME); diff --git a/src/pages/LoginWithValidateCodePage.js b/src/pages/LoginWithValidateCodePage.js index 85ba088a692..828384a57f7 100644 --- a/src/pages/LoginWithValidateCodePage.js +++ b/src/pages/LoginWithValidateCodePage.js @@ -51,7 +51,7 @@ class LoginWithValidateCodePage extends Component { } else if (this.props.route.name === SCREENS.LOGIN_WITH_VALIDATE_CODE_WORKSPACE_CARD) { Navigation.navigate(ROUTES.getWorkspaceCardRoute(this.props.route.params.policyID)); } else if (this.props.route.name === SCREENS.LOGIN_WITH_VALIDATE_CODE_NEW_WORKSPACE) { - // Create a new workspace then the user will be routed to it's settings page + // Create a new workspace so that the user will be routed to it's settings page afterwards create(); } else { Navigation.navigate(ROUTES.HOME); From 1b0607b9fcff2f481ed41cbb165fabae053f276e Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Wed, 11 Aug 2021 15:01:34 -0400 Subject: [PATCH 10/31] Fix missing parentheses --- src/Expensify.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Expensify.js b/src/Expensify.js index 3eed94a7996..7f363896b18 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -116,7 +116,7 @@ class Expensify extends PureComponent { && lodashGet(this.props, 'session.redirectAfterSignIn', false)) { setRedirectAfterSign(false); create(); - + } if (this.getAuthToken() && this.props.initialReportDataLoaded && this.props.isSidebarLoaded) { BootSplash.getVisibilityStatus() From 4b5c433b11aff2221f30e57aad575f563a95db3d Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Thu, 12 Aug 2021 18:18:10 -0400 Subject: [PATCH 11/31] Remove unused public workspace route --- .../Navigation/AppNavigator/PublicScreens.js | 5 ---- src/pages/workspace/PublicWorkspaceNewView.js | 27 ------------------- 2 files changed, 32 deletions(-) delete mode 100644 src/pages/workspace/PublicWorkspaceNewView.js diff --git a/src/libs/Navigation/AppNavigator/PublicScreens.js b/src/libs/Navigation/AppNavigator/PublicScreens.js index 0e6d7db91ad..2ea797d0ddb 100644 --- a/src/libs/Navigation/AppNavigator/PublicScreens.js +++ b/src/libs/Navigation/AppNavigator/PublicScreens.js @@ -2,7 +2,6 @@ import React from 'react'; import {createStackNavigator} from '@react-navigation/stack'; import SignInPage from '../../../pages/signin/SignInPage'; import SetPasswordPage from '../../../pages/SetPasswordPage'; -import PublicWorkspaceNewView from '../../../pages/workspace/PublicWorkspaceNewView'; import ValidateLoginPage from '../../../pages/ValidateLoginPage'; import SCREENS from '../../../SCREENS'; import LoginWithValidateCodePage from '../../../pages/LoginWithValidateCodePage'; @@ -28,10 +27,6 @@ export default () => ( options={defaultScreenOptions} component={SetPasswordPage} /> - Date: Thu, 12 Aug 2021 18:26:40 -0400 Subject: [PATCH 12/31] rename to setRedirectAfterSignIn --- src/Expensify.js | 5 ++--- src/libs/actions/Session.js | 4 ++-- src/pages/LoginWithValidateCode2FAPage.js | 4 ++-- src/pages/LoginWithValidateCodePage.js | 4 ++-- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/Expensify.js b/src/Expensify.js index 7f363896b18..ea0807f062d 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -17,7 +17,7 @@ import Visibility from './libs/Visibility'; import GrowlNotification from './components/GrowlNotification'; import {growlRef} from './libs/Growl'; import StartupTimer from './libs/StartupTimer'; -import {setRedirectAfterSign} from './libs/actions/Session'; +import {setRedirectAfterSignIn} from './libs/actions/Session'; import {create} from './libs/actions/Policy'; const propTypes = { @@ -114,8 +114,7 @@ class Expensify extends PureComponent { if (this.getAuthToken() && !_.isEmpty(this.props.betas) && lodashGet(this.props, 'session.redirectAfterSignIn', false)) { - setRedirectAfterSign(false); - create(); + setRedirectAfterSignIn(false); } if (this.getAuthToken() && this.props.initialReportDataLoaded && this.props.isSidebarLoaded) { diff --git a/src/libs/actions/Session.js b/src/libs/actions/Session.js index 477e8a9b369..0ab21fec7ce 100644 --- a/src/libs/actions/Session.js +++ b/src/libs/actions/Session.js @@ -308,7 +308,7 @@ function continueSessionFromECom(accountID, validateCode, twoFactorAuthCode) { * * @param {Boolean} shouldRedirect */ -function setRedirectAfterSign(shouldRedirect) { +function setRedirectAfterSignIn(shouldRedirect) { Onyx.merge(ONYXKEYS.SESSION, {redirectAfterSignIn: shouldRedirect}); } @@ -322,5 +322,5 @@ export { resendValidationLink, resetPassword, restartSignin, - setRedirectAfterSign, + setRedirectAfterSignIn, }; diff --git a/src/pages/LoginWithValidateCode2FAPage.js b/src/pages/LoginWithValidateCode2FAPage.js index 72d3a5b38c5..264e060f77a 100644 --- a/src/pages/LoginWithValidateCode2FAPage.js +++ b/src/pages/LoginWithValidateCode2FAPage.js @@ -6,7 +6,7 @@ import {withOnyx} from 'react-native-onyx'; import _ from 'underscore'; import withLocalize, {withLocalizePropTypes} from '../components/withLocalize'; import validateLinkPropTypes from './validateLinkPropTypes'; -import {continueSessionFromECom, setRedirectAfterSign} from '../libs/actions/Session'; +import {continueSessionFromECom, setRedirectAfterSignIn} from '../libs/actions/Session'; import styles from '../styles/styles'; import ExpensifyCashLogo from '../components/ExpensifyCashLogo'; import variables from '../styles/variables'; @@ -71,7 +71,7 @@ class LoginWithValidateCode2FAPage extends Component { Navigation.dismissModal(); if (_.isEmpty(this.props.betas)) { - setRedirectAfterSign(true); + setRedirectAfterSignIn(true); } else if (this.props.route.name === SCREENS.LOGIN_WITH_VALIDATE_CODE_2FA_WORKSPACE_CARD) { Navigation.navigate(ROUTES.getWorkspaceCardRoute(this.props.route.params.policyID)); } else if (this.props.route.name === SCREENS.LOGIN_WITH_VALIDATE_CODE_2FA_NEW_WORKSPACE) { diff --git a/src/pages/LoginWithValidateCodePage.js b/src/pages/LoginWithValidateCodePage.js index 828384a57f7..0fdc4b27b90 100644 --- a/src/pages/LoginWithValidateCodePage.js +++ b/src/pages/LoginWithValidateCodePage.js @@ -9,7 +9,7 @@ import ONYXKEYS from '../ONYXKEYS'; import Navigation from '../libs/Navigation/Navigation'; import ROUTES from '../ROUTES'; import SCREENS from '../SCREENS'; -import {continueSessionFromECom, setRedirectAfterSign} from '../libs/actions/Session'; +import {continueSessionFromECom, setRedirectAfterSignIn} from '../libs/actions/Session'; import {create} from '../libs/actions/Policy'; const propTypes = { @@ -47,7 +47,7 @@ class LoginWithValidateCodePage extends Component { // if they cancel out of the new workspace modal. Navigation.dismissModal(); if (_.isEmpty(this.props.betas)) { - setRedirectAfterSign(true); + setRedirectAfterSignIn(true); } else if (this.props.route.name === SCREENS.LOGIN_WITH_VALIDATE_CODE_WORKSPACE_CARD) { Navigation.navigate(ROUTES.getWorkspaceCardRoute(this.props.route.params.policyID)); } else if (this.props.route.name === SCREENS.LOGIN_WITH_VALIDATE_CODE_NEW_WORKSPACE) { From ed2a67e6410cd539cdd84834a55bfd886942f807 Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Thu, 12 Aug 2021 22:14:51 -0400 Subject: [PATCH 13/31] consolidated beta loading logic in LoginWith components --- src/Expensify.js | 16 --------- src/libs/actions/Session.js | 10 ------ src/pages/LoginWithValidateCode2FAPage.js | 42 ++++++++++++++--------- src/pages/LoginWithValidateCodePage.js | 41 ++++++++++++++-------- 4 files changed, 52 insertions(+), 57 deletions(-) diff --git a/src/Expensify.js b/src/Expensify.js index ea0807f062d..29b4cddeb55 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -3,7 +3,6 @@ import PropTypes from 'prop-types'; import React, {PureComponent} from 'react'; import {View, AppState} from 'react-native'; import {withOnyx} from 'react-native-onyx'; -import _ from 'underscore'; import BootSplash from './libs/BootSplash'; import * as ActiveClientManager from './libs/ActiveClientManager'; @@ -17,8 +16,6 @@ import Visibility from './libs/Visibility'; import GrowlNotification from './components/GrowlNotification'; import {growlRef} from './libs/Growl'; import StartupTimer from './libs/StartupTimer'; -import {setRedirectAfterSignIn} from './libs/actions/Session'; -import {create} from './libs/actions/Policy'; const propTypes = { /* Onyx Props */ @@ -44,9 +41,6 @@ const propTypes = { /** Tells us if the sidebar has rendered */ isSidebarLoaded: PropTypes.bool, - - /** List of betas */ - betas: PropTypes.arrayOf(PropTypes.string), }; const defaultProps = { @@ -58,7 +52,6 @@ const defaultProps = { updateAvailable: false, initialReportDataLoaded: false, isSidebarLoaded: false, - betas: [], }; class Expensify extends PureComponent { @@ -111,12 +104,6 @@ class Expensify extends PureComponent { BootSplash.show({fade: true}); } - if (this.getAuthToken() - && !_.isEmpty(this.props.betas) - && lodashGet(this.props, 'session.redirectAfterSignIn', false)) { - setRedirectAfterSignIn(false); - } - if (this.getAuthToken() && this.props.initialReportDataLoaded && this.props.isSidebarLoaded) { BootSplash.getVisibilityStatus() .then((value) => { @@ -171,9 +158,6 @@ export default withOnyx({ session: { key: ONYXKEYS.SESSION, }, - betas: { - key: ONYXKEYS.BETAS, - }, updateAvailable: { key: ONYXKEYS.UPDATE_AVAILABLE, initWithStoredValues: false, diff --git a/src/libs/actions/Session.js b/src/libs/actions/Session.js index 0ab21fec7ce..75922c7bf79 100644 --- a/src/libs/actions/Session.js +++ b/src/libs/actions/Session.js @@ -303,15 +303,6 @@ function continueSessionFromECom(accountID, validateCode, twoFactorAuthCode) { }); } -/** - * Sets the redirectAfterSignIn flag in the session variable - * - * @param {Boolean} shouldRedirect - */ -function setRedirectAfterSignIn(shouldRedirect) { - Onyx.merge(ONYXKEYS.SESSION, {redirectAfterSignIn: shouldRedirect}); -} - export { continueSessionFromECom, fetchAccountDetails, @@ -322,5 +313,4 @@ export { resendValidationLink, resetPassword, restartSignin, - setRedirectAfterSignIn, }; diff --git a/src/pages/LoginWithValidateCode2FAPage.js b/src/pages/LoginWithValidateCode2FAPage.js index 264e060f77a..f9b64b3185d 100644 --- a/src/pages/LoginWithValidateCode2FAPage.js +++ b/src/pages/LoginWithValidateCode2FAPage.js @@ -3,10 +3,9 @@ import {TextInput, View} from 'react-native'; import lodashGet from 'lodash/get'; import PropTypes from 'prop-types'; import {withOnyx} from 'react-native-onyx'; -import _ from 'underscore'; import withLocalize, {withLocalizePropTypes} from '../components/withLocalize'; import validateLinkPropTypes from './validateLinkPropTypes'; -import {continueSessionFromECom, setRedirectAfterSignIn} from '../libs/actions/Session'; +import {continueSessionFromECom} from '../libs/actions/Session'; import styles from '../styles/styles'; import ExpensifyCashLogo from '../components/ExpensifyCashLogo'; import variables from '../styles/variables'; @@ -20,6 +19,7 @@ import Navigation from '../libs/Navigation/Navigation'; import ROUTES from '../ROUTES'; import SCREENS from '../SCREENS'; import {create} from '../libs/actions/Policy'; +import Permissions from '../libs/Permissions'; const propTypes = { /* Onyx Props */ @@ -63,26 +63,36 @@ class LoginWithValidateCode2FAPage extends Component { // If the user has an active session already, they need to be redirected straight to the relevant page if (this.props.session.authToken) { // In order to navigate to a modal, we first have to dismiss the current modal. But there is no current - // modal you say? I know, it confuses me too. Without dismissing the current modal, if they user cancels - // out of the new workspace modal, then they will be routed back to - // /v///new-workspace and we don't want that. We want them to go back to `/` and - // by calling dismissModal(), the /v/... route is removed from history so the user will get taken to `/` + // modal you say? I know, it confuses me too. Without dismissing the current modal, if they user cancels out + // of the new workspace modal, then they will be routed back to + // /v///workspace/123/card and we don't want that. We want them to go back to `/` + // and by calling dismissModal(), the /v/... route is removed from history so the user will get taken to `/` // if they cancel out of the new workspace modal. Navigation.dismissModal(); - - if (_.isEmpty(this.props.betas)) { - setRedirectAfterSignIn(true); - } else if (this.props.route.name === SCREENS.LOGIN_WITH_VALIDATE_CODE_2FA_WORKSPACE_CARD) { - Navigation.navigate(ROUTES.getWorkspaceCardRoute(this.props.route.params.policyID)); - } else if (this.props.route.name === SCREENS.LOGIN_WITH_VALIDATE_CODE_2FA_NEW_WORKSPACE) { - // Create a new workspace so that the user will be routed to it's settings page afterwards - create(); - } else { - Navigation.navigate(ROUTES.HOME); + if (Permissions.canUseFreePlan(this.props.betas)) { + this.rerouteToRelevantPage(); } } } + componentDidUpdate() { + // Betas can be loaded a little after a user is authenticated, so check again if the betas have been updated + if (this.props.session.authToken && Permissions.canUseFreePlan(this.props.betas)) { + this.rerouteToRelevantPage(); + } + } + + rerouteToRelevantPage() { + if (this.props.route.name === SCREENS.LOGIN_WITH_VALIDATE_CODE_2FA_WORKSPACE_CARD) { + Navigation.navigate(ROUTES.getWorkspaceCardRoute(this.props.route.params.policyID)); + } else if (this.props.route.name === SCREENS.LOGIN_WITH_VALIDATE_CODE_2FA_NEW_WORKSPACE) { + // Create a new workspace so that the user will be routed to its settings page afterwards + create(); + } else { + Navigation.navigate(ROUTES.HOME); + } + } + validateAndSubmitForm() { if (!this.state.twoFactorAuthCode.trim()) { this.setState({formError: this.props.translate('passwordForm.pleaseFillOutAllFields')}); diff --git a/src/pages/LoginWithValidateCodePage.js b/src/pages/LoginWithValidateCodePage.js index 0fdc4b27b90..342108abfea 100644 --- a/src/pages/LoginWithValidateCodePage.js +++ b/src/pages/LoginWithValidateCodePage.js @@ -2,15 +2,15 @@ import {Component} from 'react'; import PropTypes from 'prop-types'; import {withOnyx} from 'react-native-onyx'; import lodashGet from 'lodash/get'; -import _ from 'underscore'; import validateLinkPropTypes from './validateLinkPropTypes'; import compose from '../libs/compose'; import ONYXKEYS from '../ONYXKEYS'; import Navigation from '../libs/Navigation/Navigation'; import ROUTES from '../ROUTES'; import SCREENS from '../SCREENS'; -import {continueSessionFromECom, setRedirectAfterSignIn} from '../libs/actions/Session'; +import {continueSessionFromECom} from '../libs/actions/Session'; import {create} from '../libs/actions/Policy'; +import Permissions from '../libs/Permissions'; const propTypes = { /* Onyx Props */ @@ -40,21 +40,14 @@ class LoginWithValidateCodePage extends Component { // If the user has an active session already, they need to be redirected straight to the relevant page if (this.props.session.authToken) { // In order to navigate to a modal, we first have to dismiss the current modal. But there is no current - // modal you say? I know, it confuses me too. Without dismissing the current modal, if they user cancels - // out of the new workspace modal, then they will be routed back to - // /v///new-workspace and we don't want that. We want them to go back to `/` and - // by calling dismissModal(), the /v/... route is removed from history so the user will get taken to `/` + // modal you say? I know, it confuses me too. Without dismissing the current modal, if they user cancels out + // of the new workspace modal, then they will be routed back to + // /v///workspace/123/card and we don't want that. We want them to go back to `/` + // and by calling dismissModal(), the /v/... route is removed from history so the user will get taken to `/` // if they cancel out of the new workspace modal. Navigation.dismissModal(); - if (_.isEmpty(this.props.betas)) { - setRedirectAfterSignIn(true); - } else if (this.props.route.name === SCREENS.LOGIN_WITH_VALIDATE_CODE_WORKSPACE_CARD) { - Navigation.navigate(ROUTES.getWorkspaceCardRoute(this.props.route.params.policyID)); - } else if (this.props.route.name === SCREENS.LOGIN_WITH_VALIDATE_CODE_NEW_WORKSPACE) { - // Create a new workspace so that the user will be routed to it's settings page afterwards - create(); - } else { - Navigation.navigate(ROUTES.HOME); + if (Permissions.canUseFreePlan(this.props.betas)) { + this.rerouteToRelevantPage(); } return; } @@ -64,6 +57,24 @@ class LoginWithValidateCodePage extends Component { continueSessionFromECom(accountID, validateCode); } + componentDidUpdate() { + // Betas can be loaded a little after a user is authenticated, so check again if the betas have been updated + if (this.props.session.authToken && Permissions.canUseFreePlan(this.props.betas)) { + this.rerouteToRelevantPage(); + } + } + + rerouteToRelevantPage() { + if (this.props.route.name === SCREENS.LOGIN_WITH_VALIDATE_CODE_WORKSPACE_CARD) { + Navigation.navigate(ROUTES.getWorkspaceCardRoute(this.props.route.params.policyID)); + } else if (this.props.route.name === SCREENS.LOGIN_WITH_VALIDATE_CODE_NEW_WORKSPACE) { + // Create a new workspace so that the user will be routed to its settings page afterwards + create(); + } else { + Navigation.navigate(ROUTES.HOME); + } + } + render() { // Don't render anything here since the user is redirected to the new workspace page // once we've attempted to validate their login in continueSessionFromECom() From f0ffacfabd64308f4957b081d95ff07c497adcdb Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Thu, 12 Aug 2021 22:16:30 -0400 Subject: [PATCH 14/31] Make sure new policy is autocreated only after all policies have been loaded --- src/ONYXKEYS.js | 4 ++++ src/libs/actions/Policy.js | 2 ++ src/pages/workspace/WorkspaceSidebar.js | 23 +++++++++++++---------- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/ONYXKEYS.js b/src/ONYXKEYS.js index 71b26929071..56d37527b7e 100755 --- a/src/ONYXKEYS.js +++ b/src/ONYXKEYS.js @@ -19,6 +19,10 @@ export default { // Boolean flag set whenever the sidebar has loaded IS_SIDEBAR_LOADED: 'isSidebarLoaded', + // Boolean flag set after policies are loaded. This exists since policies are loaded only behind the freePlan beta. + // This and all calls to this can be removed after Permissions.canUseFreePlan() is no longer needed. + ARE_ALL_POLICIES_LOADED: 'areAllPoliciesLoaded', + NETWORK_REQUEST_QUEUE: 'networkRequestQueue', // What the active route is for our navigator. Global route that determines what views to display. diff --git a/src/libs/actions/Policy.js b/src/libs/actions/Policy.js index 661a66b6ba2..f90888ce534 100644 --- a/src/libs/actions/Policy.js +++ b/src/libs/actions/Policy.js @@ -95,6 +95,8 @@ function getPolicyList() { // And overwrite them with only the ones returned by the API call ...policyDataToStore, }); + + Onyx.set(ONYXKEYS.ARE_ALL_POLICIES_LOADED, true); } }); } diff --git a/src/pages/workspace/WorkspaceSidebar.js b/src/pages/workspace/WorkspaceSidebar.js index 0dd7990db4e..a39450f48ad 100644 --- a/src/pages/workspace/WorkspaceSidebar.js +++ b/src/pages/workspace/WorkspaceSidebar.js @@ -1,5 +1,5 @@ import _ from 'underscore'; -import React, {useEffect} from 'react'; +import React from 'react'; import {View, ScrollView, Pressable} from 'react-native'; import {withOnyx} from 'react-native-onyx'; import lodashGet from 'lodash/get'; @@ -45,7 +45,9 @@ const defaultProps = { policy: {}, }; -const WorkspaceSidebar = ({translate, isSmallScreenWidth, policy}) => { +const WorkspaceSidebar = ({ + translate, isSmallScreenWidth, policy, areAllPoliciesLoaded, +}) => { const menuItems = [ { translationKey: 'workspace.common.card', @@ -65,14 +67,12 @@ const WorkspaceSidebar = ({translate, isSmallScreenWidth, policy}) => { }, ]; - useEffect(() => { - if (_.isEmpty(policy)) { - Growl.error(translate('workspace.error.growlMessageInvalidPolicy'), CONST.GROWL.DURATION_LONG); - Navigation.dismissModal(); - create(); - return null; - } - }, [policy]); + if (areAllPoliciesLoaded && _.isEmpty(policy)) { + Growl.error(translate('workspace.error.growlMessageInvalidPolicy'), CONST.GROWL.DURATION_LONG); + Navigation.dismissModal(); + create(); + return null; + } const openEditor = () => Navigation.navigate(ROUTES.getWorkspaceEditorRoute(policy.id)); @@ -172,5 +172,8 @@ export default compose( return `${ONYXKEYS.COLLECTION.POLICY}${policyID}`; }, }, + areAllPoliciesLoaded: { + key: ONYXKEYS.ARE_ALL_POLICIES_LOADED, + }, }), )(WorkspaceSidebar); From 81150170013225760f83f144822978ad23cf1a58 Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Thu, 12 Aug 2021 22:51:37 -0400 Subject: [PATCH 15/31] remove unused proptype --- src/Expensify.js | 4 ---- src/libs/Permissions.js | 3 ++- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/Expensify.js b/src/Expensify.js index 29b4cddeb55..6f08789e9c0 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -28,9 +28,6 @@ const propTypes = { /** Currently logged in user accountID */ accountID: PropTypes.number, - - /** Should app immediately redirect to new workspace route once authenticated */ - redirectAfterSignIn: PropTypes.bool, }), /** Whether a new update is available and ready to install. */ @@ -47,7 +44,6 @@ const defaultProps = { session: { authToken: null, accountID: null, - redirectAfterSignIn: false, }, updateAvailable: false, initialReportDataLoaded: false, diff --git a/src/libs/Permissions.js b/src/libs/Permissions.js index 1ca31ce8871..72c85e3dd50 100644 --- a/src/libs/Permissions.js +++ b/src/libs/Permissions.js @@ -8,7 +8,8 @@ import CONST from '../CONST'; * @returns {Boolean} */ function canUseAllBetas(betas) { - return isDevelopment() || _.contains(betas, CONST.BETAS.ALL); + // return isDevelopment() || _.contains(betas, CONST.BETAS.ALL); + return _.contains(betas, CONST.BETAS.ALL); } /** From 8cceef25478723d9a9c53990bc50e50e3ab63b0f Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Fri, 13 Aug 2021 11:42:34 -0400 Subject: [PATCH 16/31] revert change to permissions --- src/libs/Permissions.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/libs/Permissions.js b/src/libs/Permissions.js index 72c85e3dd50..1ca31ce8871 100644 --- a/src/libs/Permissions.js +++ b/src/libs/Permissions.js @@ -8,8 +8,7 @@ import CONST from '../CONST'; * @returns {Boolean} */ function canUseAllBetas(betas) { - // return isDevelopment() || _.contains(betas, CONST.BETAS.ALL); - return _.contains(betas, CONST.BETAS.ALL); + return isDevelopment() || _.contains(betas, CONST.BETAS.ALL); } /** From d154f4462a9c095c2de14396f1e8557127b173a1 Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Fri, 13 Aug 2021 11:43:54 -0400 Subject: [PATCH 17/31] fix comment typo --- src/pages/LoginWithValidateCode2FAPage.js | 2 +- src/pages/LoginWithValidateCodePage.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/LoginWithValidateCode2FAPage.js b/src/pages/LoginWithValidateCode2FAPage.js index f9b64b3185d..895b7012af8 100644 --- a/src/pages/LoginWithValidateCode2FAPage.js +++ b/src/pages/LoginWithValidateCode2FAPage.js @@ -63,7 +63,7 @@ class LoginWithValidateCode2FAPage extends Component { // If the user has an active session already, they need to be redirected straight to the relevant page if (this.props.session.authToken) { // In order to navigate to a modal, we first have to dismiss the current modal. But there is no current - // modal you say? I know, it confuses me too. Without dismissing the current modal, if they user cancels out + // modal you say? I know, it confuses me too. Without dismissing the current modal, if the user cancels out // of the new workspace modal, then they will be routed back to // /v///workspace/123/card and we don't want that. We want them to go back to `/` // and by calling dismissModal(), the /v/... route is removed from history so the user will get taken to `/` diff --git a/src/pages/LoginWithValidateCodePage.js b/src/pages/LoginWithValidateCodePage.js index 342108abfea..753e8fe35f9 100644 --- a/src/pages/LoginWithValidateCodePage.js +++ b/src/pages/LoginWithValidateCodePage.js @@ -40,7 +40,7 @@ class LoginWithValidateCodePage extends Component { // If the user has an active session already, they need to be redirected straight to the relevant page if (this.props.session.authToken) { // In order to navigate to a modal, we first have to dismiss the current modal. But there is no current - // modal you say? I know, it confuses me too. Without dismissing the current modal, if they user cancels out + // modal you say? I know, it confuses me too. Without dismissing the current modal, if the user cancels out // of the new workspace modal, then they will be routed back to // /v///workspace/123/card and we don't want that. We want them to go back to `/` // and by calling dismissModal(), the /v/... route is removed from history so the user will get taken to `/` From 90b2c21baeb8c00a4be403896fcd6f09d4251c56 Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Fri, 13 Aug 2021 12:31:05 -0400 Subject: [PATCH 18/31] Show loader to prevent user from being immediately rerouted to the home page --- src/pages/LoginWithValidateCode2FAPage.js | 6 +++--- src/pages/LoginWithValidateCodePage.js | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/pages/LoginWithValidateCode2FAPage.js b/src/pages/LoginWithValidateCode2FAPage.js index 895b7012af8..be223e9c812 100644 --- a/src/pages/LoginWithValidateCode2FAPage.js +++ b/src/pages/LoginWithValidateCode2FAPage.js @@ -20,6 +20,7 @@ import ROUTES from '../ROUTES'; import SCREENS from '../SCREENS'; import {create} from '../libs/actions/Policy'; import Permissions from '../libs/Permissions'; +import FullScreenLoadingIndicator from '../components/FullscreenLoadingIndicator'; const propTypes = { /* Onyx Props */ @@ -110,10 +111,9 @@ class LoginWithValidateCode2FAPage extends Component { } render() { - // If the user is already logged in, don't need to display anything because they will get redirected to the - // new workspace page in componentDidMount + // Show a loader so that the user isn't immediately kicked to the home page before rerouteToRelevantPage runs if (this.props.session.authToken) { - return null; + return ; } return ( diff --git a/src/pages/LoginWithValidateCodePage.js b/src/pages/LoginWithValidateCodePage.js index 753e8fe35f9..4f0ef692a06 100644 --- a/src/pages/LoginWithValidateCodePage.js +++ b/src/pages/LoginWithValidateCodePage.js @@ -11,6 +11,7 @@ import SCREENS from '../SCREENS'; import {continueSessionFromECom} from '../libs/actions/Session'; import {create} from '../libs/actions/Policy'; import Permissions from '../libs/Permissions'; +import FullScreenLoadingIndicator from '../components/FullscreenLoadingIndicator'; const propTypes = { /* Onyx Props */ @@ -76,9 +77,8 @@ class LoginWithValidateCodePage extends Component { } render() { - // Don't render anything here since the user is redirected to the new workspace page - // once we've attempted to validate their login in continueSessionFromECom() - return null; + // Show a loader so that the user isn't immediately kicked to the home page before rerouteToRelevantPage runs + return ; } } From 876fc469a1f1d231cc16e66c8858b5704d844ead Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Fri, 13 Aug 2021 13:11:11 -0400 Subject: [PATCH 19/31] Fix 2fa page's styles --- src/pages/LoginWithValidateCode2FAPage.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/LoginWithValidateCode2FAPage.js b/src/pages/LoginWithValidateCode2FAPage.js index be223e9c812..f2c9ee6255a 100644 --- a/src/pages/LoginWithValidateCode2FAPage.js +++ b/src/pages/LoginWithValidateCode2FAPage.js @@ -117,11 +117,11 @@ class LoginWithValidateCode2FAPage extends Component { } return ( - + - + {this.props.translate('signInPage.expensifyDotCash')} From ec60643eab73eeb448497f23473f88127a44bcff Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Fri, 13 Aug 2021 13:29:42 -0400 Subject: [PATCH 20/31] Fix missing React import needed for FullScreenLoadingIndicator --- src/pages/LoginWithValidateCodePage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/LoginWithValidateCodePage.js b/src/pages/LoginWithValidateCodePage.js index 4f0ef692a06..32363195e93 100644 --- a/src/pages/LoginWithValidateCodePage.js +++ b/src/pages/LoginWithValidateCodePage.js @@ -1,4 +1,4 @@ -import {Component} from 'react'; +import React, {Component} from 'react'; import PropTypes from 'prop-types'; import {withOnyx} from 'react-native-onyx'; import lodashGet from 'lodash/get'; From 501dd9551872f7dfc825ca5b332f792e6529cfd2 Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Mon, 16 Aug 2021 16:28:23 -0400 Subject: [PATCH 21/31] Use existing collection to determine if policies have been loaded --- src/pages/workspace/WorkspaceSidebar.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/pages/workspace/WorkspaceSidebar.js b/src/pages/workspace/WorkspaceSidebar.js index a39450f48ad..2152e827b4e 100644 --- a/src/pages/workspace/WorkspaceSidebar.js +++ b/src/pages/workspace/WorkspaceSidebar.js @@ -37,16 +37,20 @@ const propTypes = { name: PropTypes.string, }), + /** All the polices that we have loaded in Onyx */ + allPolicies: PropTypes.object, + ...withLocalizePropTypes, ...windowDimensionsPropTypes, }; const defaultProps = { policy: {}, + allPolicies: null, }; const WorkspaceSidebar = ({ - translate, isSmallScreenWidth, policy, areAllPoliciesLoaded, + translate, isSmallScreenWidth, policy, allPolicies, }) => { const menuItems = [ { @@ -67,7 +71,8 @@ const WorkspaceSidebar = ({ }, ]; - if (areAllPoliciesLoaded && _.isEmpty(policy)) { + // After all the policies have loaded, we can know if the given policyID points to a nonexistant workspace + if (allPolicies !== null && _.isEmpty(policy)) { Growl.error(translate('workspace.error.growlMessageInvalidPolicy'), CONST.GROWL.DURATION_LONG); Navigation.dismissModal(); create(); @@ -172,8 +177,8 @@ export default compose( return `${ONYXKEYS.COLLECTION.POLICY}${policyID}`; }, }, - areAllPoliciesLoaded: { - key: ONYXKEYS.ARE_ALL_POLICIES_LOADED, + allPolicies: { + key: ONYXKEYS.COLLECTION.POLICY, }, }), )(WorkspaceSidebar); From 786b57eeb3bfe4e704cf943f44a9073861731305 Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Mon, 16 Aug 2021 20:20:19 -0400 Subject: [PATCH 22/31] Use switch and add comments for clarity --- src/pages/LoginWithValidateCode2FAPage.js | 24 +++++++++++++++-------- src/pages/LoginWithValidateCodePage.js | 22 ++++++++++++++------- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/src/pages/LoginWithValidateCode2FAPage.js b/src/pages/LoginWithValidateCode2FAPage.js index f2c9ee6255a..2926c6997b7 100644 --- a/src/pages/LoginWithValidateCode2FAPage.js +++ b/src/pages/LoginWithValidateCode2FAPage.js @@ -31,7 +31,7 @@ const propTypes = { authToken: PropTypes.string, }), - /** The accountID and validateCode are passed via the URL */ + /** The route name, accountID, and validateCode are passed via the URL */ route: validateLinkPropTypes, /** List of betas */ @@ -84,13 +84,21 @@ class LoginWithValidateCode2FAPage extends Component { } rerouteToRelevantPage() { - if (this.props.route.name === SCREENS.LOGIN_WITH_VALIDATE_CODE_2FA_WORKSPACE_CARD) { - Navigation.navigate(ROUTES.getWorkspaceCardRoute(this.props.route.params.policyID)); - } else if (this.props.route.name === SCREENS.LOGIN_WITH_VALIDATE_CODE_2FA_NEW_WORKSPACE) { - // Create a new workspace so that the user will be routed to its settings page afterwards - create(); - } else { - Navigation.navigate(ROUTES.HOME); + // Since all 2FA validate code login routes lead to this component, redirect to the appropriate page based on + // the original route. + switch (this.props.route.name) { + case SCREENS.LOGIN_WITH_VALIDATE_CODE_2FA_WORKSPACE_CARD: + Navigation.navigate(ROUTES.getWorkspaceCardRoute(this.props.route.params.policyID)); + break; + + case SCREENS.LOGIN_WITH_VALIDATE_CODE_2FA_NEW_WORKSPACE: + // Creating a policy will reroute the user to the settings page afterwards + create(); + break; + + default: + Navigation.navigate(ROUTES.HOME); + break; } } diff --git a/src/pages/LoginWithValidateCodePage.js b/src/pages/LoginWithValidateCodePage.js index 32363195e93..706399ff520 100644 --- a/src/pages/LoginWithValidateCodePage.js +++ b/src/pages/LoginWithValidateCodePage.js @@ -66,13 +66,21 @@ class LoginWithValidateCodePage extends Component { } rerouteToRelevantPage() { - if (this.props.route.name === SCREENS.LOGIN_WITH_VALIDATE_CODE_WORKSPACE_CARD) { - Navigation.navigate(ROUTES.getWorkspaceCardRoute(this.props.route.params.policyID)); - } else if (this.props.route.name === SCREENS.LOGIN_WITH_VALIDATE_CODE_NEW_WORKSPACE) { - // Create a new workspace so that the user will be routed to its settings page afterwards - create(); - } else { - Navigation.navigate(ROUTES.HOME); + // Since all validate code login routes lead to this component, redirect to the appropriate page based on + // the original route. + switch (this.props.route.name) { + case SCREENS.LOGIN_WITH_VALIDATE_CODE_2FA_WORKSPACE_CARD: + Navigation.navigate(ROUTES.getWorkspaceCardRoute(this.props.route.params.policyID)); + break; + + case SCREENS.LOGIN_WITH_VALIDATE_CODE_2FA_NEW_WORKSPACE: + // Creating a policy will reroute the user to the settings page afterwards + create(); + break; + + default: + Navigation.navigate(ROUTES.HOME); + break; } } From 96b4a4a627a06053aaaf781699495a41d80913c1 Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Mon, 16 Aug 2021 21:21:14 -0400 Subject: [PATCH 23/31] Use existing policies collection to determine if policies have loaded --- src/ONYXKEYS.js | 2 +- src/libs/actions/Policy.js | 2 -- src/pages/workspace/WorkspaceSidebar.js | 5 ++++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/ONYXKEYS.js b/src/ONYXKEYS.js index 56d37527b7e..1eebf32cc1b 100755 --- a/src/ONYXKEYS.js +++ b/src/ONYXKEYS.js @@ -19,7 +19,7 @@ export default { // Boolean flag set whenever the sidebar has loaded IS_SIDEBAR_LOADED: 'isSidebarLoaded', - // Boolean flag set after policies are loaded. This exists since policies are loaded only behind the freePlan beta. + // Boolean flag set after policies are loaded. This is since policies are loaded only behind the freePlan beta. // This and all calls to this can be removed after Permissions.canUseFreePlan() is no longer needed. ARE_ALL_POLICIES_LOADED: 'areAllPoliciesLoaded', diff --git a/src/libs/actions/Policy.js b/src/libs/actions/Policy.js index f90888ce534..661a66b6ba2 100644 --- a/src/libs/actions/Policy.js +++ b/src/libs/actions/Policy.js @@ -95,8 +95,6 @@ function getPolicyList() { // And overwrite them with only the ones returned by the API call ...policyDataToStore, }); - - Onyx.set(ONYXKEYS.ARE_ALL_POLICIES_LOADED, true); } }); } diff --git a/src/pages/workspace/WorkspaceSidebar.js b/src/pages/workspace/WorkspaceSidebar.js index 2152e827b4e..ffb564966b1 100644 --- a/src/pages/workspace/WorkspaceSidebar.js +++ b/src/pages/workspace/WorkspaceSidebar.js @@ -38,7 +38,9 @@ const propTypes = { }), /** All the polices that we have loaded in Onyx */ - allPolicies: PropTypes.object, + allPolicies: PropTypes.shape({ + id: PropTypes.string, + }), ...withLocalizePropTypes, ...windowDimensionsPropTypes, @@ -72,6 +74,7 @@ const WorkspaceSidebar = ({ ]; // After all the policies have loaded, we can know if the given policyID points to a nonexistant workspace + // allPolicies as a prop can be removed after Permissions.canUseFreePlan() is no longer needed and free plan is out of beta. if (allPolicies !== null && _.isEmpty(policy)) { Growl.error(translate('workspace.error.growlMessageInvalidPolicy'), CONST.GROWL.DURATION_LONG); Navigation.dismissModal(); From cc0c2b88fa87fa285cd191032458fd8e2bdc7d35 Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Mon, 16 Aug 2021 21:21:29 -0400 Subject: [PATCH 24/31] Use screens relevant to validateCode not 2fa --- src/pages/LoginWithValidateCodePage.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/LoginWithValidateCodePage.js b/src/pages/LoginWithValidateCodePage.js index 706399ff520..7a73b921c3d 100644 --- a/src/pages/LoginWithValidateCodePage.js +++ b/src/pages/LoginWithValidateCodePage.js @@ -69,11 +69,11 @@ class LoginWithValidateCodePage extends Component { // Since all validate code login routes lead to this component, redirect to the appropriate page based on // the original route. switch (this.props.route.name) { - case SCREENS.LOGIN_WITH_VALIDATE_CODE_2FA_WORKSPACE_CARD: + case SCREENS.LOGIN_WITH_VALIDATE_CODE_WORKSPACE_CARD: Navigation.navigate(ROUTES.getWorkspaceCardRoute(this.props.route.params.policyID)); break; - case SCREENS.LOGIN_WITH_VALIDATE_CODE_2FA_NEW_WORKSPACE: + case SCREENS.LOGIN_WITH_VALIDATE_CODE_NEW_WORKSPACE: // Creating a policy will reroute the user to the settings page afterwards create(); break; From fac742ead7a576529d240335f045bb84f54c036f Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Mon, 16 Aug 2021 21:29:11 -0400 Subject: [PATCH 25/31] Remove unused Onyx key --- src/ONYXKEYS.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/ONYXKEYS.js b/src/ONYXKEYS.js index 1eebf32cc1b..71b26929071 100755 --- a/src/ONYXKEYS.js +++ b/src/ONYXKEYS.js @@ -19,10 +19,6 @@ export default { // Boolean flag set whenever the sidebar has loaded IS_SIDEBAR_LOADED: 'isSidebarLoaded', - // Boolean flag set after policies are loaded. This is since policies are loaded only behind the freePlan beta. - // This and all calls to this can be removed after Permissions.canUseFreePlan() is no longer needed. - ARE_ALL_POLICIES_LOADED: 'areAllPoliciesLoaded', - NETWORK_REQUEST_QUEUE: 'networkRequestQueue', // What the active route is for our navigator. Global route that determines what views to display. From fcbeadf70369f25eeca03428f621e4e422e12ae6 Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Mon, 16 Aug 2021 21:34:12 -0400 Subject: [PATCH 26/31] Clarify when this logic can be removed --- src/pages/workspace/WorkspaceSidebar.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pages/workspace/WorkspaceSidebar.js b/src/pages/workspace/WorkspaceSidebar.js index ffb564966b1..f35a92b3e5b 100644 --- a/src/pages/workspace/WorkspaceSidebar.js +++ b/src/pages/workspace/WorkspaceSidebar.js @@ -74,7 +74,8 @@ const WorkspaceSidebar = ({ ]; // After all the policies have loaded, we can know if the given policyID points to a nonexistant workspace - // allPolicies as a prop can be removed after Permissions.canUseFreePlan() is no longer needed and free plan is out of beta. + // When free plan is out of beta and Permissions.canUseFreePlan() gets removed, + // all code involving 'allPolicies' can be removed since policy loading will no longer be delayed on login. if (allPolicies !== null && _.isEmpty(policy)) { Growl.error(translate('workspace.error.growlMessageInvalidPolicy'), CONST.GROWL.DURATION_LONG); Navigation.dismissModal(); From b40cabf3316cc7a9e02b19207a4b698b3c479ba5 Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Tue, 17 Aug 2021 14:32:08 -0400 Subject: [PATCH 27/31] Add todo to comment so it's clearer theres some action to be done in remove this --- src/pages/workspace/WorkspaceSidebar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/workspace/WorkspaceSidebar.js b/src/pages/workspace/WorkspaceSidebar.js index f35a92b3e5b..e0bbe1101f5 100644 --- a/src/pages/workspace/WorkspaceSidebar.js +++ b/src/pages/workspace/WorkspaceSidebar.js @@ -74,7 +74,7 @@ const WorkspaceSidebar = ({ ]; // After all the policies have loaded, we can know if the given policyID points to a nonexistant workspace - // When free plan is out of beta and Permissions.canUseFreePlan() gets removed, + // TODO: When free plan is out of beta and Permissions.canUseFreePlan() gets removed, // all code involving 'allPolicies' can be removed since policy loading will no longer be delayed on login. if (allPolicies !== null && _.isEmpty(policy)) { Growl.error(translate('workspace.error.growlMessageInvalidPolicy'), CONST.GROWL.DURATION_LONG); From 20ee86ae45c92674cf290e8e09614281b915fac6 Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Wed, 18 Aug 2021 11:45:53 -0400 Subject: [PATCH 28/31] Add missing doc --- src/pages/workspace/WorkspaceSidebar.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/workspace/WorkspaceSidebar.js b/src/pages/workspace/WorkspaceSidebar.js index e0bbe1101f5..1e7a5bde9df 100644 --- a/src/pages/workspace/WorkspaceSidebar.js +++ b/src/pages/workspace/WorkspaceSidebar.js @@ -39,6 +39,7 @@ const propTypes = { /** All the polices that we have loaded in Onyx */ allPolicies: PropTypes.shape({ + /** ID of the policy */ id: PropTypes.string, }), From 23798c7986896cdb751c6ab93f44ab1318cb7a48 Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Wed, 18 Aug 2021 11:46:41 -0400 Subject: [PATCH 29/31] Use Policy to make code more contextual --- src/pages/LoginWithValidateCode2FAPage.js | 4 ++-- src/pages/LoginWithValidateCodePage.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pages/LoginWithValidateCode2FAPage.js b/src/pages/LoginWithValidateCode2FAPage.js index 2926c6997b7..5484242544d 100644 --- a/src/pages/LoginWithValidateCode2FAPage.js +++ b/src/pages/LoginWithValidateCode2FAPage.js @@ -18,7 +18,7 @@ import ONYXKEYS from '../ONYXKEYS'; import Navigation from '../libs/Navigation/Navigation'; import ROUTES from '../ROUTES'; import SCREENS from '../SCREENS'; -import {create} from '../libs/actions/Policy'; +import * as Policy from '../libs/actions/Policy'; import Permissions from '../libs/Permissions'; import FullScreenLoadingIndicator from '../components/FullscreenLoadingIndicator'; @@ -93,7 +93,7 @@ class LoginWithValidateCode2FAPage extends Component { case SCREENS.LOGIN_WITH_VALIDATE_CODE_2FA_NEW_WORKSPACE: // Creating a policy will reroute the user to the settings page afterwards - create(); + Policy.create(); break; default: diff --git a/src/pages/LoginWithValidateCodePage.js b/src/pages/LoginWithValidateCodePage.js index 7a73b921c3d..c01fcbcc52e 100644 --- a/src/pages/LoginWithValidateCodePage.js +++ b/src/pages/LoginWithValidateCodePage.js @@ -9,7 +9,7 @@ import Navigation from '../libs/Navigation/Navigation'; import ROUTES from '../ROUTES'; import SCREENS from '../SCREENS'; import {continueSessionFromECom} from '../libs/actions/Session'; -import {create} from '../libs/actions/Policy'; +import * as Policy from '../libs/actions/Policy'; import Permissions from '../libs/Permissions'; import FullScreenLoadingIndicator from '../components/FullscreenLoadingIndicator'; @@ -75,7 +75,7 @@ class LoginWithValidateCodePage extends Component { case SCREENS.LOGIN_WITH_VALIDATE_CODE_NEW_WORKSPACE: // Creating a policy will reroute the user to the settings page afterwards - create(); + Policy.create(); break; default: From b4d779c04eed42100f780890fc285ce134dfc753 Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Wed, 18 Aug 2021 11:52:32 -0400 Subject: [PATCH 30/31] Use @ --- src/pages/workspace/WorkspaceSidebar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/workspace/WorkspaceSidebar.js b/src/pages/workspace/WorkspaceSidebar.js index 1e7a5bde9df..96d2132eb8d 100644 --- a/src/pages/workspace/WorkspaceSidebar.js +++ b/src/pages/workspace/WorkspaceSidebar.js @@ -75,7 +75,7 @@ const WorkspaceSidebar = ({ ]; // After all the policies have loaded, we can know if the given policyID points to a nonexistant workspace - // TODO: When free plan is out of beta and Permissions.canUseFreePlan() gets removed, + // @TODO: When free plan is out of beta and Permissions.canUseFreePlan() gets removed, // all code involving 'allPolicies' can be removed since policy loading will no longer be delayed on login. if (allPolicies !== null && _.isEmpty(policy)) { Growl.error(translate('workspace.error.growlMessageInvalidPolicy'), CONST.GROWL.DURATION_LONG); From 3e6fae691c5e8ef1b116839e9485164bba1fef5b Mon Sep 17 00:00:00 2001 From: Amal Nazeem Date: Thu, 19 Aug 2021 11:36:49 -0400 Subject: [PATCH 31/31] remove @TODO since workspace has already been created --- src/pages/workspace/WorkspaceSidebar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/workspace/WorkspaceSidebar.js b/src/pages/workspace/WorkspaceSidebar.js index 96d2132eb8d..35f78092491 100644 --- a/src/pages/workspace/WorkspaceSidebar.js +++ b/src/pages/workspace/WorkspaceSidebar.js @@ -75,7 +75,7 @@ const WorkspaceSidebar = ({ ]; // After all the policies have loaded, we can know if the given policyID points to a nonexistant workspace - // @TODO: When free plan is out of beta and Permissions.canUseFreePlan() gets removed, + // When free plan is out of beta and Permissions.canUseFreePlan() gets removed, // all code involving 'allPolicies' can be removed since policy loading will no longer be delayed on login. if (allPolicies !== null && _.isEmpty(policy)) { Growl.error(translate('workspace.error.growlMessageInvalidPolicy'), CONST.GROWL.DURATION_LONG);