diff --git a/src/components/AutoEmailLink.js b/src/components/AutoEmailLink.js
new file mode 100644
index 000000000000..f99c8ea76f3c
--- /dev/null
+++ b/src/components/AutoEmailLink.js
@@ -0,0 +1,54 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import _ from 'underscore';
+import {CONST} from 'expensify-common/lib/CONST';
+import Text from './Text';
+import TextLink from './TextLink';
+import styles from '../styles/styles';
+
+const propTypes = {
+ text: PropTypes.string.isRequired,
+ style: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.object), PropTypes.object]),
+};
+
+const defaultProps = {
+ style: [],
+};
+
+/*
+ * This is a "utility component", that does this:
+ * - Checks if a text contains any email. If it does, render it as a mailto: link
+ * - Else just render it inside `Text` component
+ */
+
+const AutoEmailLink = (props) => (
+
+ {_.map(props.text.split(CONST.REG_EXP.EXTRACT_EMAIL), (str, index) => {
+ if (CONST.REG_EXP.EMAIL.test(str)) {
+ return (
+
+ {str}
+
+ );
+ }
+
+ return (
+
+ {str}
+
+ );
+ })}
+
+);
+
+AutoEmailLink.displayName = 'AutoEmailLink';
+AutoEmailLink.propTypes = propTypes;
+AutoEmailLink.defaultProps = defaultProps;
+export default AutoEmailLink;
diff --git a/src/components/BlockingViews/BlockingView.js b/src/components/BlockingViews/BlockingView.js
index d3a552d83824..5b7246f476d9 100644
--- a/src/components/BlockingViews/BlockingView.js
+++ b/src/components/BlockingViews/BlockingView.js
@@ -8,6 +8,7 @@ import Text from '../Text';
import themeColors from '../../styles/themes/default';
import TextLink from '../TextLink';
import Navigation from '../../libs/Navigation/Navigation';
+import AutoEmailLink from '../AutoEmailLink';
const propTypes = {
/** Expensicon for the page */
@@ -56,7 +57,10 @@ const BlockingView = (props) => (
height={props.iconHeight}
/>
{props.title}
- {props.subtitle}
+
{props.shouldShowLink ? (
`Go to ${roomName} room`,
},
emptyWorkspace: {
diff --git a/src/languages/es.js b/src/languages/es.js
index a44bd0ae5bcd..eb710750b0eb 100644
--- a/src/languages/es.js
+++ b/src/languages/es.js
@@ -1078,6 +1078,7 @@ export default {
growlMessageOnDeleteError: 'No se puede eliminar el espacio de trabajo porque tiene informes que están siendo procesados',
unavailable: 'Espacio de trabajo no disponible',
memberNotFound: 'Miembro no encontrado. Para invitar a un nuevo miembro al espacio de trabajo, por favor, utiliza el botón Invitar que está arriba.',
+ notAuthorized: `No tienes acceso a esta página. ¿Estás tratando de unirte al espacio de trabajo? Comunícate con el propietario de este espacio de trabajo para que pueda agregarte como miembro. ¿Necesitas algo más? Comunícate con ${CONST.EMAIL.CONCIERGE}`,
goToRoom: ({roomName}) => `Ir a la sala ${roomName}`,
},
emptyWorkspace: {
diff --git a/src/pages/workspace/WorkspaceInitialPage.js b/src/pages/workspace/WorkspaceInitialPage.js
index 92d8e0fe0f3d..970b6cc3e9e8 100644
--- a/src/pages/workspace/WorkspaceInitialPage.js
+++ b/src/pages/workspace/WorkspaceInitialPage.js
@@ -163,8 +163,9 @@ const WorkspaceInitialPage = (props) => {
{({safeAreaPaddingBottomStyle}) => (
Navigation.goBack(ROUTES.SETTINGS_WORKSPACES)}
+ shouldShow={_.isEmpty(props.policy) || !Policy.isPolicyOwner(props.policy)}
+ subtitleKey={_.isEmpty(props.policy) ? undefined : 'workspace.common.notAuthorized'}
>
Navigation.goBack(ROUTES.SETTINGS_WORKSPACES)}
+ shouldShow={_.isEmpty(this.props.policy) || !Policy.isPolicyOwner(this.props.policy)}
+ subtitleKey={_.isEmpty(this.props.policy) ? undefined : 'workspace.common.notAuthorized'}
>