diff --git a/docs/README.md b/docs/README.md
index 30b83dc6e406..c583fd94eb81 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -70,7 +70,7 @@ There are 3 main components in the hub page: 1. Stage title, 2. Row of Card butt
+
+ {% include floating-concierge-button.html id="floating-concierge-button-global" %}
+
-
\ No newline at end of file
+
diff --git a/src/ROUTES.js b/src/ROUTES.js
index 0900bf9a2f9e..0cd8b4164a8e 100644
--- a/src/ROUTES.js
+++ b/src/ROUTES.js
@@ -42,6 +42,10 @@ export default {
REPORT,
REPORT_WITH_ID: 'r/:reportID',
getReportRoute: reportID => `r/${reportID}`,
+
+ /** This is a utility route used to go to the user's concierge chat, or the sign-in page if the user's not authenticated */
+ CONCIERGE: 'concierge',
+
IOU_REQUEST,
IOU_BILL,
IOU_SEND,
diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.js b/src/libs/Navigation/AppNavigator/AuthScreens.js
index 79868dbe51e3..202ea37c7f58 100644
--- a/src/libs/Navigation/AppNavigator/AuthScreens.js
+++ b/src/libs/Navigation/AppNavigator/AuthScreens.js
@@ -37,6 +37,7 @@ import defaultScreenOptions from './defaultScreenOptions';
import * as App from '../../actions/App';
import * as Session from '../../actions/Session';
import LogOutPreviousUserPage from '../../../pages/LogOutPreviousUserPage';
+import ConciergePage from '../../../pages/ConciergePage';
let currentUserEmail;
Onyx.connect({
@@ -219,6 +220,11 @@ class AuthScreens extends React.Component {
options={defaultScreenOptions}
component={LogOutPreviousUserPage}
/>
+
{/* 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 e072e72b4c57..4bfa5265fb01 100644
--- a/src/libs/Navigation/AppNavigator/PublicScreens.js
+++ b/src/libs/Navigation/AppNavigator/PublicScreens.js
@@ -4,6 +4,7 @@ import SignInPage from '../../../pages/signin/SignInPage';
import SetPasswordPage from '../../../pages/SetPasswordPage';
import ValidateLoginPage from '../../../pages/ValidateLoginPage';
import LogInWithShortLivedTokenPage from '../../../pages/LogInWithShortLivedTokenPage';
+import ConciergePage from '../../../pages/ConciergePage';
import SCREENS from '../../../SCREENS';
import defaultScreenOptions from './defaultScreenOptions';
@@ -31,6 +32,11 @@ const PublicScreens = () => (
options={defaultScreenOptions}
component={SetPasswordPage}
/>
+
);
diff --git a/src/libs/Navigation/linkingConfig.js b/src/libs/Navigation/linkingConfig.js
index 63d286580c84..23cfa9ea349c 100644
--- a/src/libs/Navigation/linkingConfig.js
+++ b/src/libs/Navigation/linkingConfig.js
@@ -28,6 +28,7 @@ export default {
SetPassword: ROUTES.SET_PASSWORD_WITH_VALIDATE_CODE,
ValidateLogin: ROUTES.VALIDATE_LOGIN,
[SCREENS.TRANSITION_FROM_OLD_DOT]: ROUTES.TRANSITION_FROM_OLD_DOT,
+ Concierge: ROUTES.CONCIERGE,
// Modal Screens
Settings: {
diff --git a/src/pages/ConciergePage.js b/src/pages/ConciergePage.js
new file mode 100644
index 000000000000..efde8c1db55c
--- /dev/null
+++ b/src/pages/ConciergePage.js
@@ -0,0 +1,44 @@
+import _ from 'underscore';
+import React from 'react';
+import PropTypes from 'prop-types';
+import {withOnyx} from 'react-native-onyx';
+import CONST from '../CONST';
+import ONYXKEYS from '../ONYXKEYS';
+import FullScreenLoadingIndicator from '../components/FullscreenLoadingIndicator';
+import Navigation from '../libs/Navigation/Navigation';
+import * as Report from '../libs/actions/Report';
+
+const propTypes = {
+ /** Session info for the currently logged in user. */
+ session: PropTypes.shape({
+ /** Currently logged in user authToken */
+ authToken: PropTypes.string,
+
+ /** Currently logged in user email */
+ email: PropTypes.string,
+ }).isRequired,
+};
+
+/*
+ * This is a "utility page", that does this:
+ * - If the user is authenticated, find their concierge chat and re-route to it
+ * - Else re-route to the login page
+ */
+const ConciergePage = (props) => {
+ if (_.has(props.session, 'authToken')) {
+ Report.fetchOrCreateChatReport([props.session.email, CONST.EMAIL.CONCIERGE]);
+ } else {
+ Navigation.navigate();
+ }
+
+ return ;
+};
+
+ConciergePage.propTypes = propTypes;
+ConciergePage.displayName = 'ConciergePage';
+
+export default withOnyx({
+ session: {
+ key: ONYXKEYS.SESSION,
+ },
+})(ConciergePage);