From 5bc0f4f3839b119bbff319df66cfdbe931595d6c Mon Sep 17 00:00:00 2001 From: Rajat Parashar Date: Mon, 23 Aug 2021 06:16:45 +0530 Subject: [PATCH 1/8] block system user from Workspaces --- src/languages/en.js | 1 + src/languages/es.js | 1 + src/libs/reportUtils.js | 15 +++++++++++++++ src/pages/workspace/WorkspaceInvitePage.js | 8 ++++++++ 4 files changed, 25 insertions(+) diff --git a/src/languages/en.js b/src/languages/en.js index 657cff14fc2..97759d3cbdb 100755 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -594,6 +594,7 @@ export default { pleaseEnterValidLogin: 'Please ensure the email or phone number is valid (e.g. +15005550006).', pleaseEnterUniqueLogin: 'That user is already a member of this workspace.', genericFailureMessage: 'An error occurred inviting the user to the workspace, please try again.', + systemUserError: 'Please ensure email or phone number is not a system User.', welcomeNote: ({workspaceName}) => `You have been invited to the ${workspaceName} Workspace! Download the Expensify mobile App to start tracking your expenses.`, }, editor: { diff --git a/src/languages/es.js b/src/languages/es.js index ca416b673c0..3336b8e171d 100644 --- a/src/languages/es.js +++ b/src/languages/es.js @@ -596,6 +596,7 @@ export default { pleaseEnterValidLogin: 'Asegúrese de que el correo electrónico o el número de teléfono sean válidos (e.g. +15005550006).', pleaseEnterUniqueLogin: 'Ese usuario ya es miembro de este espacio de trabajo.', genericFailureMessage: 'Se produjo un error al invitar al usuario al espacio de trabajo. Vuelva a intentarlo..', + systemUserError: 'Asegúrese de que el correo electrónico o el número de teléfono no sea un usuario del sistema.', welcomeNote: ({workspaceName}) => `¡Has sido invitado a la ${workspaceName} Espacio de trabajo! Descargue la aplicación móvil Expensify para comenzar a rastrear sus gastos.`, }, editor: { diff --git a/src/libs/reportUtils.js b/src/libs/reportUtils.js index 66f9c4dbae8..4155e538bde 100644 --- a/src/libs/reportUtils.js +++ b/src/libs/reportUtils.js @@ -152,6 +152,20 @@ function isConciergeChatReport(report) { && report.participants[0] === CONST.EMAIL.CONCIERGE; } +/** + * Whether a login is system email + * + * @param {String} login - user email + * @return {Boolean} + */ +function isSystemUser(login) { + return [ + CONST.EMAIL.CONCIERGE, + CONST.EMAIL.CHRONOS, + CONST.EMAIL.RECEIPTS, + ].includes(login); +} + export { getReportParticipantsTitle, isReportMessageAttachment, @@ -163,4 +177,5 @@ export { getDefaultRoomSubtitle, isArchivedRoom, isConciergeChatReport, + isSystemUser, }; diff --git a/src/pages/workspace/WorkspaceInvitePage.js b/src/pages/workspace/WorkspaceInvitePage.js index e50a5226651..99b0f23777d 100644 --- a/src/pages/workspace/WorkspaceInvitePage.js +++ b/src/pages/workspace/WorkspaceInvitePage.js @@ -20,6 +20,7 @@ import Growl from '../../libs/Growl'; import ExpensiTextInput from '../../components/ExpensiTextInput'; import FixedFooter from '../../components/FixedFooter'; import KeyboardAvoidingView from '../../components/KeyboardAvoidingView'; +import {isSystemUser} from '../../libs/reportUtils'; const propTypes = { ...withLocalizePropTypes, @@ -88,6 +89,13 @@ class WorkspaceInvitePage extends React.Component { Growl.error(this.props.translate('workspace.invite.pleaseEnterValidLogin'), 5000); return; } + + const isEnteredLoginSystemLogin = _.some(logins, login => isSystemUser(login)); + if (isEnteredLoginSystemLogin) { + Growl.error(this.props.translate('workspace.invite.systemUserError'), 5000); + return; + } + const policyEmployeeList = lodashGet(this.props, 'policy.employeeList', []); const AreLoginsDuplicate = _.every(logins, login => _.contains(policyEmployeeList, login)); if (AreLoginsDuplicate) { From 8c6c736759daf9f25ea080f449f7d5422cac752d Mon Sep 17 00:00:00 2001 From: Rajat Parashar Date: Mon, 23 Aug 2021 06:22:04 +0530 Subject: [PATCH 2/8] fix silly mistake and correct variable name --- src/pages/workspace/WorkspaceInvitePage.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/workspace/WorkspaceInvitePage.js b/src/pages/workspace/WorkspaceInvitePage.js index 99b0f23777d..936ee6dc551 100644 --- a/src/pages/workspace/WorkspaceInvitePage.js +++ b/src/pages/workspace/WorkspaceInvitePage.js @@ -97,8 +97,8 @@ class WorkspaceInvitePage extends React.Component { } const policyEmployeeList = lodashGet(this.props, 'policy.employeeList', []); - const AreLoginsDuplicate = _.every(logins, login => _.contains(policyEmployeeList, login)); - if (AreLoginsDuplicate) { + const areLoginsDuplicate = _.some(logins, login => _.contains(policyEmployeeList, login)); + if (areLoginsDuplicate) { Growl.error(this.props.translate('workspace.invite.pleaseEnterUniqueLogin'), 5000); return; } From 0896cc71ebdddd205a9201e2f51e99136db26830 Mon Sep 17 00:00:00 2001 From: Rajat Parashar Date: Mon, 23 Aug 2021 06:31:34 +0530 Subject: [PATCH 3/8] correct copy for multiple users --- src/languages/en.js | 5 +++-- src/languages/es.js | 5 +++-- src/pages/workspace/WorkspaceInvitePage.js | 1 + 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/languages/en.js b/src/languages/en.js index 97759d3cbdb..295f4796ea1 100755 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -588,9 +588,10 @@ export default { }, invite: { invitePeople: 'Invite People', - invitePeoplePrompt: 'Invite a colleague to your workspace.', + invitePeoplePrompt: 'Invite colleagues to your workspace.', personalMessagePrompt: 'Add a Personal Message (Optional)', - enterEmailOrPhone: 'Email or Phone', + enterEmailOrPhone: 'Emails or Phones', + EmailOrPhonePlaceholder: 'Enter comma-separated emails or phones', pleaseEnterValidLogin: 'Please ensure the email or phone number is valid (e.g. +15005550006).', pleaseEnterUniqueLogin: 'That user is already a member of this workspace.', genericFailureMessage: 'An error occurred inviting the user to the workspace, please try again.', diff --git a/src/languages/es.js b/src/languages/es.js index 3336b8e171d..32bcd310448 100644 --- a/src/languages/es.js +++ b/src/languages/es.js @@ -590,9 +590,10 @@ export default { }, invite: { invitePeople: 'Invitar a la gente', - invitePeoplePrompt: 'Invita a un colega a tu espacio de trabajo.', + invitePeoplePrompt: 'Invita a sus colegas a tu espacio de trabajo.', personalMessagePrompt: 'Agregar un mensaje personal (Opcional)', - enterEmailOrPhone: 'Email o teléfono', + enterEmailOrPhone: 'Correos electrónicos o teléfonos', + EmailOrPhonePlaceholder: 'Ingrese correos electrónicos o teléfonos separados por comas', pleaseEnterValidLogin: 'Asegúrese de que el correo electrónico o el número de teléfono sean válidos (e.g. +15005550006).', pleaseEnterUniqueLogin: 'Ese usuario ya es miembro de este espacio de trabajo.', genericFailureMessage: 'Se produjo un error al invitar al usuario al espacio de trabajo. Vuelva a intentarlo..', diff --git a/src/pages/workspace/WorkspaceInvitePage.js b/src/pages/workspace/WorkspaceInvitePage.js index 936ee6dc551..b40b1c2b589 100644 --- a/src/pages/workspace/WorkspaceInvitePage.js +++ b/src/pages/workspace/WorkspaceInvitePage.js @@ -124,6 +124,7 @@ class WorkspaceInvitePage extends React.Component { this.emailOrPhoneInputRef = el} label={this.props.translate('workspace.invite.enterEmailOrPhone')} + placeholder={this.props.translate('workspace.invite.EmailOrPhonePlaceholder')} autoCompleteType="email" autoCorrect={false} autoCapitalize="none" From 242734b9bfe40ec416c623a12a1b24c4a49a7a15 Mon Sep 17 00:00:00 2001 From: Rajat Parashar Date: Mon, 23 Aug 2021 06:51:39 +0530 Subject: [PATCH 4/8] fix: match Phone number users correctly --- src/pages/workspace/WorkspaceInvitePage.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pages/workspace/WorkspaceInvitePage.js b/src/pages/workspace/WorkspaceInvitePage.js index b40b1c2b589..93db90383ab 100644 --- a/src/pages/workspace/WorkspaceInvitePage.js +++ b/src/pages/workspace/WorkspaceInvitePage.js @@ -21,6 +21,7 @@ import ExpensiTextInput from '../../components/ExpensiTextInput'; import FixedFooter from '../../components/FixedFooter'; import KeyboardAvoidingView from '../../components/KeyboardAvoidingView'; import {isSystemUser} from '../../libs/reportUtils'; +import {addSMSDomainIfPhoneNumber} from '../../libs/OptionsListUtils'; const propTypes = { ...withLocalizePropTypes, @@ -97,7 +98,7 @@ class WorkspaceInvitePage extends React.Component { } const policyEmployeeList = lodashGet(this.props, 'policy.employeeList', []); - const areLoginsDuplicate = _.some(logins, login => _.contains(policyEmployeeList, login)); + const areLoginsDuplicate = _.some(logins, login => _.contains(policyEmployeeList, addSMSDomainIfPhoneNumber(login))); if (areLoginsDuplicate) { Growl.error(this.props.translate('workspace.invite.pleaseEnterUniqueLogin'), 5000); return; From f238c734e4850448cbf03a3e72e65d677bc5ccc5 Mon Sep 17 00:00:00 2001 From: Rajat Parashar Date: Tue, 24 Aug 2021 05:08:50 +0530 Subject: [PATCH 5/8] updated the error message --- src/languages/en.js | 2 +- src/languages/es.js | 2 +- src/libs/reportUtils.js | 15 --------------- src/libs/userUtils.js | 20 ++++++++++++++++++++ src/pages/workspace/WorkspaceInvitePage.js | 8 ++++---- 5 files changed, 26 insertions(+), 21 deletions(-) create mode 100644 src/libs/userUtils.js diff --git a/src/languages/en.js b/src/languages/en.js index 295f4796ea1..b0fafc903be 100755 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -595,7 +595,7 @@ export default { pleaseEnterValidLogin: 'Please ensure the email or phone number is valid (e.g. +15005550006).', pleaseEnterUniqueLogin: 'That user is already a member of this workspace.', genericFailureMessage: 'An error occurred inviting the user to the workspace, please try again.', - systemUserError: 'Please ensure email or phone number is not a system User.', + systemUserError: ({email}) => `Sorry, you cannot invite ${email} to a workspace.`, welcomeNote: ({workspaceName}) => `You have been invited to the ${workspaceName} Workspace! Download the Expensify mobile App to start tracking your expenses.`, }, editor: { diff --git a/src/languages/es.js b/src/languages/es.js index 32bcd310448..c7bd7f0d9da 100644 --- a/src/languages/es.js +++ b/src/languages/es.js @@ -597,7 +597,7 @@ export default { pleaseEnterValidLogin: 'Asegúrese de que el correo electrónico o el número de teléfono sean válidos (e.g. +15005550006).', pleaseEnterUniqueLogin: 'Ese usuario ya es miembro de este espacio de trabajo.', genericFailureMessage: 'Se produjo un error al invitar al usuario al espacio de trabajo. Vuelva a intentarlo..', - systemUserError: 'Asegúrese de que el correo electrónico o el número de teléfono no sea un usuario del sistema.', + systemUserError: ({email}) => `Lo sentimos, no puedes invitar a ${email} a un espacio de trabajo.`, welcomeNote: ({workspaceName}) => `¡Has sido invitado a la ${workspaceName} Espacio de trabajo! Descargue la aplicación móvil Expensify para comenzar a rastrear sus gastos.`, }, editor: { diff --git a/src/libs/reportUtils.js b/src/libs/reportUtils.js index 4155e538bde..66f9c4dbae8 100644 --- a/src/libs/reportUtils.js +++ b/src/libs/reportUtils.js @@ -152,20 +152,6 @@ function isConciergeChatReport(report) { && report.participants[0] === CONST.EMAIL.CONCIERGE; } -/** - * Whether a login is system email - * - * @param {String} login - user email - * @return {Boolean} - */ -function isSystemUser(login) { - return [ - CONST.EMAIL.CONCIERGE, - CONST.EMAIL.CHRONOS, - CONST.EMAIL.RECEIPTS, - ].includes(login); -} - export { getReportParticipantsTitle, isReportMessageAttachment, @@ -177,5 +163,4 @@ export { getDefaultRoomSubtitle, isArchivedRoom, isConciergeChatReport, - isSystemUser, }; diff --git a/src/libs/userUtils.js b/src/libs/userUtils.js new file mode 100644 index 00000000000..0c3fea404c2 --- /dev/null +++ b/src/libs/userUtils.js @@ -0,0 +1,20 @@ +import CONST from '../CONST'; + +/** + * Whether a login is system email + * + * @param {String} login - user email + * @return {Boolean} + */ +function isSystemUser(login) { + return [ + CONST.EMAIL.CONCIERGE, + CONST.EMAIL.CHRONOS, + CONST.EMAIL.RECEIPTS, + ].includes(login); +} + +export { + // eslint-disable-next-line import/prefer-default-export + isSystemUser, +}; diff --git a/src/pages/workspace/WorkspaceInvitePage.js b/src/pages/workspace/WorkspaceInvitePage.js index 93db90383ab..34b07fa4b38 100644 --- a/src/pages/workspace/WorkspaceInvitePage.js +++ b/src/pages/workspace/WorkspaceInvitePage.js @@ -20,7 +20,7 @@ import Growl from '../../libs/Growl'; import ExpensiTextInput from '../../components/ExpensiTextInput'; import FixedFooter from '../../components/FixedFooter'; import KeyboardAvoidingView from '../../components/KeyboardAvoidingView'; -import {isSystemUser} from '../../libs/reportUtils'; +import {isSystemUser} from '../../libs/userUtils'; import {addSMSDomainIfPhoneNumber} from '../../libs/OptionsListUtils'; const propTypes = { @@ -91,9 +91,9 @@ class WorkspaceInvitePage extends React.Component { return; } - const isEnteredLoginSystemLogin = _.some(logins, login => isSystemUser(login)); - if (isEnteredLoginSystemLogin) { - Growl.error(this.props.translate('workspace.invite.systemUserError'), 5000); + const foundSystemLogin = _.find(logins, login => isSystemUser(login)); + if (foundSystemLogin) { + Growl.error(this.props.translate('workspace.invite.systemUserError', {email: foundSystemLogin}), 5000); return; } From b710d97d9d6212f0bad38bbb97548942090790fa Mon Sep 17 00:00:00 2001 From: Rajat Parashar Date: Tue, 24 Aug 2021 09:11:16 +0530 Subject: [PATCH 6/8] change copy --- src/languages/en.js | 4 ++-- src/languages/es.js | 4 ++-- src/pages/workspace/WorkspaceInvitePage.js | 2 ++ 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/languages/en.js b/src/languages/en.js index b0fafc903be..328a95613fc 100755 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -590,8 +590,8 @@ export default { invitePeople: 'Invite People', invitePeoplePrompt: 'Invite colleagues to your workspace.', personalMessagePrompt: 'Add a Personal Message (Optional)', - enterEmailOrPhone: 'Emails or Phones', - EmailOrPhonePlaceholder: 'Enter comma-separated emails or phones', + enterEmailOrPhone: 'Emails or phone numbers', + EmailOrPhonePlaceholder: 'Enter comma-separated list of emails or phone numbers', pleaseEnterValidLogin: 'Please ensure the email or phone number is valid (e.g. +15005550006).', pleaseEnterUniqueLogin: 'That user is already a member of this workspace.', genericFailureMessage: 'An error occurred inviting the user to the workspace, please try again.', diff --git a/src/languages/es.js b/src/languages/es.js index c7bd7f0d9da..7429bb5a8e3 100644 --- a/src/languages/es.js +++ b/src/languages/es.js @@ -592,8 +592,8 @@ export default { invitePeople: 'Invitar a la gente', invitePeoplePrompt: 'Invita a sus colegas a tu espacio de trabajo.', personalMessagePrompt: 'Agregar un mensaje personal (Opcional)', - enterEmailOrPhone: 'Correos electrónicos o teléfonos', - EmailOrPhonePlaceholder: 'Ingrese correos electrónicos o teléfonos separados por comas', + enterEmailOrPhone: 'Correos electrónicos o números de teléfono', + EmailOrPhonePlaceholder: 'Ingrese una lista separada por comas de correos electrónicos o números de teléfono', pleaseEnterValidLogin: 'Asegúrese de que el correo electrónico o el número de teléfono sean válidos (e.g. +15005550006).', pleaseEnterUniqueLogin: 'Ese usuario ya es miembro de este espacio de trabajo.', genericFailureMessage: 'Se produjo un error al invitar al usuario al espacio de trabajo. Vuelva a intentarlo..', diff --git a/src/pages/workspace/WorkspaceInvitePage.js b/src/pages/workspace/WorkspaceInvitePage.js index 34b07fa4b38..11a25b6e125 100644 --- a/src/pages/workspace/WorkspaceInvitePage.js +++ b/src/pages/workspace/WorkspaceInvitePage.js @@ -129,6 +129,8 @@ class WorkspaceInvitePage extends React.Component { autoCompleteType="email" autoCorrect={false} autoCapitalize="none" + multiline + numberOfLines={2} value={this.state.userLogins} onChangeText={text => this.setState({userLogins: text})} /> From aabda01e45a805599939c2f732530bc30c074cf0 Mon Sep 17 00:00:00 2001 From: Rajat Parashar Date: Wed, 25 Aug 2021 04:02:20 +0530 Subject: [PATCH 7/8] fix: label --- src/languages/en.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/languages/en.js b/src/languages/en.js index 328a95613fc..c644d57d8cf 100755 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -590,7 +590,7 @@ export default { invitePeople: 'Invite People', invitePeoplePrompt: 'Invite colleagues to your workspace.', personalMessagePrompt: 'Add a Personal Message (Optional)', - enterEmailOrPhone: 'Emails or phone numbers', + enterEmailOrPhone: 'Emails or Phone Numbers', EmailOrPhonePlaceholder: 'Enter comma-separated list of emails or phone numbers', pleaseEnterValidLogin: 'Please ensure the email or phone number is valid (e.g. +15005550006).', pleaseEnterUniqueLogin: 'That user is already a member of this workspace.', From 32f41f9354cb30a920225f2bc3ba1e962b713c4c Mon Sep 17 00:00:00 2001 From: Rajat Parashar Date: Thu, 26 Aug 2021 15:50:27 +0530 Subject: [PATCH 8/8] transaltion fix --- src/languages/es.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/languages/es.js b/src/languages/es.js index 7429bb5a8e3..b67181cbfb1 100644 --- a/src/languages/es.js +++ b/src/languages/es.js @@ -590,10 +590,10 @@ export default { }, invite: { invitePeople: 'Invitar a la gente', - invitePeoplePrompt: 'Invita a sus colegas a tu espacio de trabajo.', + invitePeoplePrompt: 'Invita a tus compañeros a tu espacio de trabajo.', personalMessagePrompt: 'Agregar un mensaje personal (Opcional)', enterEmailOrPhone: 'Correos electrónicos o números de teléfono', - EmailOrPhonePlaceholder: 'Ingrese una lista separada por comas de correos electrónicos o números de teléfono', + EmailOrPhonePlaceholder: 'Introduce una lista de correos electrónicos o números de teléfono separado por comas', pleaseEnterValidLogin: 'Asegúrese de que el correo electrónico o el número de teléfono sean válidos (e.g. +15005550006).', pleaseEnterUniqueLogin: 'Ese usuario ya es miembro de este espacio de trabajo.', genericFailureMessage: 'Se produjo un error al invitar al usuario al espacio de trabajo. Vuelva a intentarlo..',