diff --git a/android/app/build.gradle b/android/app/build.gradle
index b44828db2e7d1..74396642fdec1 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -150,8 +150,8 @@ android {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
multiDexEnabled rootProject.ext.multiDexEnabled
- versionCode 1001008105
- versionName "1.0.81-5"
+ versionCode 1001008106
+ versionName "1.0.81-6"
}
splits {
abi {
diff --git a/ios/ExpensifyCash/Info.plist b/ios/ExpensifyCash/Info.plist
index 2c30175257a7d..da951d33c0b8b 100644
--- a/ios/ExpensifyCash/Info.plist
+++ b/ios/ExpensifyCash/Info.plist
@@ -30,7 +30,7 @@
CFBundleVersion
- 1.0.81.5
+ 1.0.81.6
ITSAppUsesNonExemptEncryption
LSApplicationQueriesSchemes
diff --git a/ios/ExpensifyCashTests/Info.plist b/ios/ExpensifyCashTests/Info.plist
index cba2c4e516da9..326c3d0e2fe0a 100644
--- a/ios/ExpensifyCashTests/Info.plist
+++ b/ios/ExpensifyCashTests/Info.plist
@@ -19,6 +19,6 @@
CFBundleSignature
????
CFBundleVersion
- 1.0.81.5
+ 1.0.81.6
diff --git a/package-lock.json b/package-lock.json
index 6ea8dfcbe9fbc..70e58fc525ff7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "expensify.cash",
- "version": "1.0.81-5",
+ "version": "1.0.81-6",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
diff --git a/package.json b/package.json
index 73d60c3113de5..dace87611ca36 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "expensify.cash",
- "version": "1.0.81-5",
+ "version": "1.0.81-6",
"author": "Expensify, Inc.",
"homepage": "https://new.expensify.com",
"description": "Expensify.cash is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.",
diff --git a/src/CONST.js b/src/CONST.js
index e822f35cc55de..31f7f704eddcf 100755
--- a/src/CONST.js
+++ b/src/CONST.js
@@ -127,8 +127,8 @@ const CONST = {
PRIVACY_URL: 'https://use.expensify.com/privacy',
LICENSES_URL: 'https://use.expensify.com/licenses',
PLAY_STORE_URL: 'https://play.google.com/store/apps/details?id=com.expensify.chat&hl=en',
- ADD_SECONDARY_LOGIN_URL: 'settings?param={%22section%22:%22account%22}',
- MANAGE_CARDS_URL: 'domain_companycards',
+ ADD_SECONDARY_LOGIN_URL: '/settings?param={%22section%22:%22account%22}',
+ MANAGE_CARDS_URL: '/domain_companycards',
OPTION_TYPE: {
REPORT: 'report',
PERSONAL_DETAIL: 'personalDetail',
diff --git a/src/ROUTES.js b/src/ROUTES.js
index bbe1883d441e0..ab583dd6935f4 100644
--- a/src/ROUTES.js
+++ b/src/ROUTES.js
@@ -80,6 +80,10 @@ export default {
getWorkspaceInviteRoute: policyID => `workspace/${policyID}/invite`,
WORKSPACE_INVITE: 'workspace/:policyID/invite',
REQUEST_CALL: 'request-call',
+ VALIDATE_CODE_URL: (accountID, validateCode, exitTo = '') => {
+ const exitToURL = exitTo ? `?exitTo=${exitTo}` : '';
+ return `v/${accountID}/${validateCode}${exitToURL}`;
+ },
/**
* @param {String} route
diff --git a/src/libs/API.js b/src/libs/API.js
index 5fa63cf9dbf4f..01d0e819b2cda 100644
--- a/src/libs/API.js
+++ b/src/libs/API.js
@@ -425,6 +425,15 @@ function GetAccountStatus(parameters) {
return Network.post(commandName, parameters);
}
+/**
+ * Returns a validate code for this account
+ * @returns {Promise}
+ */
+function GetAccountValidateCode() {
+ const commandName = 'GetAccountValidateCode';
+ return Network.post(commandName);
+}
+
/**
* @param {Object} parameters
* @param {String} parameters.debtorEmail
@@ -1072,6 +1081,7 @@ export {
DeleteLogin,
Get,
GetAccountStatus,
+ GetAccountValidateCode,
GetIOUReport,
GetPolicyList,
GetPolicySummaryList,
diff --git a/src/libs/actions/App.js b/src/libs/actions/App.js
index e3b339fdc7abb..cad9bcce3e236 100644
--- a/src/libs/actions/App.js
+++ b/src/libs/actions/App.js
@@ -1,11 +1,22 @@
import Onyx from 'react-native-onyx';
+import {Linking} from 'react-native';
+import lodashGet from 'lodash/get';
import ONYXKEYS from '../../ONYXKEYS';
import * as API from '../API';
-import Firebase from '../Firebase';
import CONST from '../../CONST';
+import CONFIG from '../../CONFIG';
+import Firebase from '../Firebase';
+import ROUTES from '../../ROUTES';
-let isSidebarLoaded;
+let currentUserAccountID;
+Onyx.connect({
+ key: ONYXKEYS.SESSION,
+ callback: (val) => {
+ currentUserAccountID = lodashGet(val, 'accountID', '');
+ },
+});
+let isSidebarLoaded;
Onyx.connect({
key: ONYXKEYS.IS_SIDEBAR_LOADED,
callback: val => isSidebarLoaded = val,
@@ -27,6 +38,19 @@ function setLocale(locale) {
Onyx.merge(ONYXKEYS.NVP_PREFERRED_LOCALE, locale);
}
+/**
+ * This links to a page in e.com ensuring the user is logged in.
+ * It does so by getting a validate code and redirecting to the validate URL with exitTo set to the URL
+ * we want to visit
+ * @param {string} url relative URL starting with `/` to open in expensify.com
+ */
+function openSignedInLink(url) {
+ API.GetAccountValidateCode().then((response) => {
+ Linking.openURL(CONFIG.EXPENSIFY.URL_EXPENSIFY_COM
+ + ROUTES.VALIDATE_CODE_URL(currentUserAccountID, response.validateCode, url));
+ });
+}
+
function setSidebarLoaded() {
if (isSidebarLoaded) {
return;
@@ -39,5 +63,6 @@ function setSidebarLoaded() {
export {
setCurrentURL,
setLocale,
+ openSignedInLink,
setSidebarLoaded,
};
diff --git a/src/pages/workspace/WorkspaceCardPage.js b/src/pages/workspace/WorkspaceCardPage.js
index b77f05efce9f6..90f93b04e5c7c 100644
--- a/src/pages/workspace/WorkspaceCardPage.js
+++ b/src/pages/workspace/WorkspaceCardPage.js
@@ -1,6 +1,6 @@
import React from 'react';
import {
- View, ScrollView, Linking, StyleSheet,
+ View, ScrollView, StyleSheet,
} from 'react-native';
import PropTypes from 'prop-types';
import {withOnyx} from 'react-native-onyx';
@@ -18,11 +18,11 @@ import Button from '../../components/Button';
import variables from '../../styles/variables';
import themeDefault from '../../styles/themes/default';
import ROUTES from '../../ROUTES';
-import CONFIG from '../../CONFIG';
import CONST from '../../CONST';
import Permissions from '../../libs/Permissions';
import HeroCardWebImage from '../../../assets/images/cascading-cards-web.svg';
import HeroCardMobileImage from '../../../assets/images/cascading-cards-mobile.svg';
+import {openSignedInLink} from '../../libs/actions/App';
const propTypes = {
/* Onyx Props */
@@ -65,9 +65,6 @@ const defaultProps = {
},
};
-const publicLink = CONFIG.EXPENSIFY.URL_EXPENSIFY_COM + CONST.ADD_SECONDARY_LOGIN_URL;
-const manageCardLink = CONFIG.EXPENSIFY.URL_EXPENSIFY_COM + CONST.MANAGE_CARDS_URL;
-
const WorkspaceCardPage = ({
betas,
user,
@@ -89,9 +86,9 @@ const WorkspaceCardPage = ({
const onPress = () => {
if (user.isFromPublicDomain) {
- Linking.openURL(publicLink);
+ openSignedInLink(CONST.ADD_SECONDARY_LOGIN_URL);
} else if (user.isUsingExpensifyCard) {
- Linking.openURL(manageCardLink);
+ openSignedInLink(CONST.MANAGE_CARDS_URL);
} else {
Navigation.navigate(ROUTES.getBankAccountRoute());
}