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()); }