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'} >