From afa04425860d7012431699c72a1f5b8950887cb8 Mon Sep 17 00:00:00 2001 From: Puneet Lath Date: Mon, 6 Feb 2023 14:24:00 -0500 Subject: [PATCH 01/16] Add display name constants --- src/CONST.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/CONST.js b/src/CONST.js index ae3ffca7f025..b958809cdbc3 100755 --- a/src/CONST.js +++ b/src/CONST.js @@ -40,6 +40,11 @@ const CONST = { DEFAULT_AVATAR_COUNT: 24, OLD_DEFAULT_AVATAR_COUNT: 8, + DISPLAY_NAME: { + MAX_LENGTH: 50, + RESERVED_FIRST_NAMES: ['Expensify', 'Concierge'], + }, + // Sizes needed for report empty state background image handling EMPTY_STATE_BACKGROUND: { SMALL_SCREEN: { From 29dc61204f3097e473e24faf30cb3b78bf81ffe8 Mon Sep 17 00:00:00 2001 From: Puneet Lath Date: Mon, 6 Feb 2023 14:26:22 -0500 Subject: [PATCH 02/16] Add maxLength on display name inputs --- src/pages/settings/Profile/DisplayNamePage.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/pages/settings/Profile/DisplayNamePage.js b/src/pages/settings/Profile/DisplayNamePage.js index 3d0336b45358..747bd69d14b2 100644 --- a/src/pages/settings/Profile/DisplayNamePage.js +++ b/src/pages/settings/Profile/DisplayNamePage.js @@ -140,6 +140,7 @@ class DisplayNamePage extends Component { label={this.props.translate('common.firstName')} defaultValue={lodashGet(currentUserDetails, 'firstName', '')} placeholder={this.props.translate('displayNamePage.john')} + maxLength={CONST.DISPLAY_NAME.MAX_LENGTH} /> @@ -149,6 +150,7 @@ class DisplayNamePage extends Component { label={this.props.translate('common.lastName')} defaultValue={lodashGet(currentUserDetails, 'lastName', '')} placeholder={this.props.translate('displayNamePage.doe')} + maxLength={CONST.DISPLAY_NAME.MAX_LENGTH} /> From 7e8f90c6933b0a7c1723b4bdfbc51bd2e9c4ec2d Mon Sep 17 00:00:00 2001 From: Puneet Lath Date: Mon, 6 Feb 2023 14:50:44 -0500 Subject: [PATCH 03/16] Refactor display name validation to remove assignErrors function --- src/pages/settings/Profile/DisplayNamePage.js | 60 +++++-------------- 1 file changed, 16 insertions(+), 44 deletions(-) diff --git a/src/pages/settings/Profile/DisplayNamePage.js b/src/pages/settings/Profile/DisplayNamePage.js index 747bd69d14b2..bd1939ac4406 100644 --- a/src/pages/settings/Profile/DisplayNamePage.js +++ b/src/pages/settings/Profile/DisplayNamePage.js @@ -58,57 +58,29 @@ class DisplayNamePage extends Component { validate(values) { const errors = {}; - // Check for invalid characters in first and last name - const [firstNameInvalidCharacter, lastNameInvalidCharacter] = ValidationUtils.findInvalidSymbols( + const [doesFirstNameHaveInvalidCharacters, doesLastNameHaveInvalidCharacters] = ValidationUtils.findInvalidSymbols( [values.firstName, values.lastName], ); - this.assignError( - errors, - 'firstName', - !_.isEmpty(firstNameInvalidCharacter), - Localize.translateLocal( - 'personalDetails.error.hasInvalidCharacter', - {invalidCharacter: firstNameInvalidCharacter}, - ), - ); - this.assignError( - errors, - 'lastName', - !_.isEmpty(lastNameInvalidCharacter), - Localize.translateLocal( - 'personalDetails.error.hasInvalidCharacter', - {invalidCharacter: lastNameInvalidCharacter}, - ), - ); - if (!_.isEmpty(errors)) { - return errors; - } - - // Check the character limit for first and last name - const characterLimitError = Localize.translateLocal('personalDetails.error.characterLimit', {limit: CONST.FORM_CHARACTER_LIMIT}); - const [hasFirstNameError, hasLastNameError] = ValidationUtils.doesFailCharacterLimitAfterTrim( - CONST.FORM_CHARACTER_LIMIT, + const [isFirstNameTooLong, isLastNameTooLong] = ValidationUtils.doesFailCharacterLimitAfterTrim( + CONST.DISPLAY_NAME.MAX_LENGTH, [values.firstName, values.lastName], ); - this.assignError(errors, 'firstName', hasFirstNameError, characterLimitError); - this.assignError(errors, 'lastName', hasLastNameError, characterLimitError); - return errors; - } + // First we validate the first name field + if (doesFirstNameHaveInvalidCharacters.length > 0) { + errors.firstName = this.props.translate('personalDetails.error.hasInvalidCharacter'); + } else if (isFirstNameTooLong) { + errors.firstName = this.props.translate('personalDetails.error.firstNameLength'); + } - /** - * @param {Object} errors - * @param {String} errorKey - * @param {Boolean} hasError - * @param {String} errorCopy - * @returns {Object} - An object containing the errors for each inputID - */ - assignError(errors, errorKey, hasError, errorCopy) { - const validateErrors = errors; - if (hasError) { - validateErrors[errorKey] = errorCopy; + // Then we validate the last name field + if (doesLastNameHaveInvalidCharacters.length > 0) { + errors.lastName = this.props.translate('personalDetails.error.hasInvalidCharacter'); + } else if (isLastNameTooLong) { + errors.lastName = this.props.translate('personalDetails.error.lastNameLength'); } - return validateErrors; + + return errors; } render() { From 863a0d1ec33e3caf8b56c0ece0f57c4eee4d3755 Mon Sep 17 00:00:00 2001 From: Puneet Lath Date: Mon, 6 Feb 2023 14:58:41 -0500 Subject: [PATCH 04/16] Refactor findInvalidSymbols to be doesContainCommaOrSemicolon --- src/libs/ValidationUtils.js | 19 +++++-------------- src/pages/settings/Profile/DisplayNamePage.js | 6 +++--- 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/src/libs/ValidationUtils.js b/src/libs/ValidationUtils.js index f287c821f73b..3ba438921b5b 100644 --- a/src/libs/ValidationUtils.js +++ b/src/libs/ValidationUtils.js @@ -357,22 +357,13 @@ function doesFailCharacterLimitAfterTrim(maxLength, valuesToBeValidated) { } /** - * Checks if input value includes comma or semicolon which are not accepted + * Checks if each provided string includes any commas or semicolons * * @param {String[]} valuesToBeValidated - * @returns {String[]} + * @returns {Boolean[]} */ -function findInvalidSymbols(valuesToBeValidated) { - return _.map(valuesToBeValidated, (value) => { - if (!value) { - return ''; - } - let inValidSymbol = value.replace(/[,]+/g, '') !== value ? Localize.translateLocal('personalDetails.error.comma') : ''; - if (_.isEmpty(inValidSymbol)) { - inValidSymbol = value.replace(/[;]+/g, '') !== value ? Localize.translateLocal('personalDetails.error.semicolon') : ''; - } - return inValidSymbol; - }); +function doesContainCommaOrSemicolon(valuesToBeValidated) { + return _.map(valuesToBeValidated, value => (value.includes(',') || value.includes(';'))); } /** @@ -455,5 +446,5 @@ export { isValidRoomName, isValidTaxID, isValidValidateCode, - findInvalidSymbols, + doesContainCommaOrSemicolon, }; diff --git a/src/pages/settings/Profile/DisplayNamePage.js b/src/pages/settings/Profile/DisplayNamePage.js index bd1939ac4406..088234362e84 100644 --- a/src/pages/settings/Profile/DisplayNamePage.js +++ b/src/pages/settings/Profile/DisplayNamePage.js @@ -58,7 +58,7 @@ class DisplayNamePage extends Component { validate(values) { const errors = {}; - const [doesFirstNameHaveInvalidCharacters, doesLastNameHaveInvalidCharacters] = ValidationUtils.findInvalidSymbols( + const [doesFirstNameHaveInvalidCharacters, doesLastNameHaveInvalidCharacters] = ValidationUtils.doesContainCommaOrSemicolon( [values.firstName, values.lastName], ); const [isFirstNameTooLong, isLastNameTooLong] = ValidationUtils.doesFailCharacterLimitAfterTrim( @@ -67,14 +67,14 @@ class DisplayNamePage extends Component { ); // First we validate the first name field - if (doesFirstNameHaveInvalidCharacters.length > 0) { + if (doesFirstNameHaveInvalidCharacters) { errors.firstName = this.props.translate('personalDetails.error.hasInvalidCharacter'); } else if (isFirstNameTooLong) { errors.firstName = this.props.translate('personalDetails.error.firstNameLength'); } // Then we validate the last name field - if (doesLastNameHaveInvalidCharacters.length > 0) { + if (doesLastNameHaveInvalidCharacters) { errors.lastName = this.props.translate('personalDetails.error.hasInvalidCharacter'); } else if (isLastNameTooLong) { errors.lastName = this.props.translate('personalDetails.error.lastNameLength'); From b4ad41210565b1096093f9b7c072ecf7c2d773c3 Mon Sep 17 00:00:00 2001 From: Puneet Lath Date: Mon, 6 Feb 2023 15:09:06 -0500 Subject: [PATCH 05/16] Update copy for display name errorsg --- src/languages/en.js | 9 +++------ src/languages/es.js | 9 +++------ 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/languages/en.js b/src/languages/en.js index 32ea9bb7ba15..d6fd4cba1057 100755 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -581,12 +581,9 @@ export default { }, personalDetails: { error: { - firstNameLength: 'First name shouldn\'t be longer than 50 characters', - lastNameLength: 'Last name shouldn\'t be longer than 50 characters', - characterLimit: ({limit}) => `Exceeds the max length of ${limit} characters`, - hasInvalidCharacter: ({invalidCharacter}) => `Please remove the ${invalidCharacter} from the name field.`, - comma: 'comma', - semicolon: 'semicolon', + firstNameLength: 'First name cannot be longer than 50 characters', + lastNameLength: 'Last name cannot be longer than 50 characters', + hasInvalidCharacter: 'Name cannot contain a comma or semicolon', }, }, resendValidationForm: { diff --git a/src/languages/es.js b/src/languages/es.js index 6a4985f201e6..fbc37719b8e4 100644 --- a/src/languages/es.js +++ b/src/languages/es.js @@ -581,12 +581,9 @@ export default { }, personalDetails: { error: { - firstNameLength: 'El nombre no debe tener más de 50 caracteres', - lastNameLength: 'El apellido no debe tener más de 50 caracteres', - characterLimit: ({limit}) => `Supera el límite de ${limit} caracteres`, - hasInvalidCharacter: ({invalidCharacter}) => `Por favor elimina ${invalidCharacter} del campo nombre.`, - comma: 'la coma', - semicolon: 'el punto y coma', + firstNameLength: 'El nombre no puede tener más de 50 caracteres', + lastNameLength: 'El apellido no puede tener más de 50 caracteres', + hasInvalidCharacter: 'El nombre no puede contener una coma o un punto y coma', }, }, resendValidationForm: { From 2fc23492aaa123cc6d38d66f16c5710d0e211010 Mon Sep 17 00:00:00 2001 From: Puneet Lath Date: Mon, 6 Feb 2023 15:59:41 -0500 Subject: [PATCH 06/16] Add reserved word in first name check --- src/libs/ValidationUtils.js | 13 +++++++++++++ src/pages/settings/Profile/DisplayNamePage.js | 3 ++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/libs/ValidationUtils.js b/src/libs/ValidationUtils.js index 3ba438921b5b..eac106442be3 100644 --- a/src/libs/ValidationUtils.js +++ b/src/libs/ValidationUtils.js @@ -366,6 +366,18 @@ function doesContainCommaOrSemicolon(valuesToBeValidated) { return _.map(valuesToBeValidated, value => (value.includes(',') || value.includes(';'))); } +/** + * Checks if the provided string includes any of the provided reserved words + * + * @param {String} value + * @param {String[]} reservedWords + * @returns {Boolean} + */ +function doesContainReservedWord(value, reservedWords) { + const valueToCheck = value.trim().toLowerCase(); + return _.some(reservedWords, reservedWord => valueToCheck.includes(reservedWord.toLowerCase())); +} + /** * Checks if is one of the certain names which are reserved for default rooms * and should not be used for policy rooms. @@ -447,4 +459,5 @@ export { isValidTaxID, isValidValidateCode, doesContainCommaOrSemicolon, + doesContainReservedWord, }; diff --git a/src/pages/settings/Profile/DisplayNamePage.js b/src/pages/settings/Profile/DisplayNamePage.js index 088234362e84..faab6b76f9c5 100644 --- a/src/pages/settings/Profile/DisplayNamePage.js +++ b/src/pages/settings/Profile/DisplayNamePage.js @@ -57,7 +57,6 @@ class DisplayNamePage extends Component { */ validate(values) { const errors = {}; - const [doesFirstNameHaveInvalidCharacters, doesLastNameHaveInvalidCharacters] = ValidationUtils.doesContainCommaOrSemicolon( [values.firstName, values.lastName], ); @@ -71,6 +70,8 @@ class DisplayNamePage extends Component { errors.firstName = this.props.translate('personalDetails.error.hasInvalidCharacter'); } else if (isFirstNameTooLong) { errors.firstName = this.props.translate('personalDetails.error.firstNameLength'); + } else if (ValidationUtils.doesContainReservedWord(values.firstName, CONST.DISPLAY_NAME.RESERVED_FIRST_NAMES)) { + errors.firstName = 'blah blah'; } // Then we validate the last name field From 411b2bf114cbb865b64231bfc072d6b7d2148049 Mon Sep 17 00:00:00 2001 From: Puneet Lath Date: Mon, 6 Feb 2023 16:19:30 -0500 Subject: [PATCH 07/16] Add copy for reserved word error --- src/languages/en.js | 1 + src/languages/es.js | 1 + src/pages/settings/Profile/DisplayNamePage.js | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/languages/en.js b/src/languages/en.js index d6fd4cba1057..21556613862c 100755 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -583,6 +583,7 @@ export default { error: { firstNameLength: 'First name cannot be longer than 50 characters', lastNameLength: 'Last name cannot be longer than 50 characters', + containsReservedWord: 'First name cannot contain the words Expensify or Concierge', hasInvalidCharacter: 'Name cannot contain a comma or semicolon', }, }, diff --git a/src/languages/es.js b/src/languages/es.js index fbc37719b8e4..670f180afe74 100644 --- a/src/languages/es.js +++ b/src/languages/es.js @@ -583,6 +583,7 @@ export default { error: { firstNameLength: 'El nombre no puede tener más de 50 caracteres', lastNameLength: 'El apellido no puede tener más de 50 caracteres', + containsReservedWord: 'El nombre no puede contener las palabras Expensify o Concierge', hasInvalidCharacter: 'El nombre no puede contener una coma o un punto y coma', }, }, diff --git a/src/pages/settings/Profile/DisplayNamePage.js b/src/pages/settings/Profile/DisplayNamePage.js index faab6b76f9c5..84a90c3fd3f2 100644 --- a/src/pages/settings/Profile/DisplayNamePage.js +++ b/src/pages/settings/Profile/DisplayNamePage.js @@ -71,7 +71,7 @@ class DisplayNamePage extends Component { } else if (isFirstNameTooLong) { errors.firstName = this.props.translate('personalDetails.error.firstNameLength'); } else if (ValidationUtils.doesContainReservedWord(values.firstName, CONST.DISPLAY_NAME.RESERVED_FIRST_NAMES)) { - errors.firstName = 'blah blah'; + errors.firstName = this.props.translate('personalDetails.error.containsReservedWord'); } // Then we validate the last name field From c281fe0f099828555a3a25d794a304879b8fa812 Mon Sep 17 00:00:00 2001 From: Puneet Lath Date: Mon, 6 Feb 2023 16:36:13 -0500 Subject: [PATCH 08/16] Use const on request call page --- src/pages/RequestCallPage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/RequestCallPage.js b/src/pages/RequestCallPage.js index 4bcd38d97410..ce655e219b2e 100644 --- a/src/pages/RequestCallPage.js +++ b/src/pages/RequestCallPage.js @@ -219,7 +219,7 @@ class RequestCallPage extends Component { errors.lastName = this.props.translate('requestCallPage.error.lastName'); } - const [firstNameLengthError, lastNameLengthError] = ValidationUtils.doesFailCharacterLimit(50, [values.firstName, values.lastName]); + const [firstNameLengthError, lastNameLengthError] = ValidationUtils.doesFailCharacterLimit(CONST.DISPLAY_NAME.MAX_LENGTH, [values.firstName, values.lastName]); if (firstNameLengthError) { errors.firstName = this.props.translate('requestCallPage.error.firstNameLength'); From 33b015ec4628240cfea10d95a59798ec07125ecf Mon Sep 17 00:00:00 2001 From: Puneet Lath Date: Mon, 6 Feb 2023 16:47:07 -0500 Subject: [PATCH 09/16] Remove no longer used imports --- src/libs/ValidationUtils.js | 1 - src/pages/RequestCallPage.js | 2 ++ src/pages/settings/Profile/DisplayNamePage.js | 2 -- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/libs/ValidationUtils.js b/src/libs/ValidationUtils.js index eac106442be3..77712dbbc2a5 100644 --- a/src/libs/ValidationUtils.js +++ b/src/libs/ValidationUtils.js @@ -3,7 +3,6 @@ import _ from 'underscore'; import CONST from '../CONST'; import * as CardUtils from './CardUtils'; import * as LoginUtils from './LoginUtils'; -import * as Localize from './Localize'; /** * Implements the Luhn Algorithm, a checksum formula used to validate credit card diff --git a/src/pages/RequestCallPage.js b/src/pages/RequestCallPage.js index ce655e219b2e..1ffed3a099d1 100644 --- a/src/pages/RequestCallPage.js +++ b/src/pages/RequestCallPage.js @@ -285,6 +285,7 @@ class RequestCallPage extends Component { name="fname" placeholder={this.props.translate('profilePage.john')} containerStyles={[styles.mt4]} + maxLength={CONST.DISPLAY_NAME.MAX_LENGTH} /> Date: Mon, 6 Feb 2023 18:07:55 -0500 Subject: [PATCH 10/16] Remove unncessary max length validation --- src/languages/en.js | 2 -- src/languages/es.js | 2 -- src/libs/ValidationUtils.js | 26 ------------------- src/pages/RequestCallPage.js | 10 ------- src/pages/settings/Profile/DisplayNamePage.js | 8 ------ 5 files changed, 48 deletions(-) diff --git a/src/languages/en.js b/src/languages/en.js index 21556613862c..8d36bc27c363 100755 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -1037,8 +1037,6 @@ export default { phoneNumberExtension: 'Please enter a valid phone extension number', firstName: 'Please provide your first name', lastName: 'Please provide your last name', - firstNameLength: 'First name shouldn\'t be longer than 50 characters', - lastNameLength: 'Last name shouldn\'t be longer than 50 characters', }, }, requestCallConfirmationScreen: { diff --git a/src/languages/es.js b/src/languages/es.js index 670f180afe74..7e0081ac139e 100644 --- a/src/languages/es.js +++ b/src/languages/es.js @@ -1039,8 +1039,6 @@ export default { phoneNumberExtension: 'Por favor, introduce una extensión telefónica válida', firstName: 'Por favor, ingresa tu nombre', lastName: 'Por favor, ingresa tu apellido', - firstNameLength: 'El nombre no debe tener más de 50 caracteres', - lastNameLength: 'El apellido no debe tener más de 50 caracteres', }, }, requestCallConfirmationScreen: { diff --git a/src/libs/ValidationUtils.js b/src/libs/ValidationUtils.js index 77712dbbc2a5..fe35922d11e1 100644 --- a/src/libs/ValidationUtils.js +++ b/src/libs/ValidationUtils.js @@ -331,30 +331,6 @@ function isValidRoutingNumber(number) { return false; } -/** - * Checks if each string in array is of valid length and then returns true - * for each string which exceeds the limit. - * - * @param {Number} maxLength - * @param {String[]} valuesToBeValidated - * @returns {Boolean[]} - */ -function doesFailCharacterLimit(maxLength, valuesToBeValidated) { - return _.map(valuesToBeValidated, value => value && value.length > maxLength); -} - -/** - * Checks if each string in array is of valid length and then returns true - * for each string which exceeds the limit. The function trims the passed values. - * - * @param {Number} maxLength - * @param {String[]} valuesToBeValidated - * @returns {Boolean[]} - */ -function doesFailCharacterLimitAfterTrim(maxLength, valuesToBeValidated) { - return _.map(valuesToBeValidated, value => value && value.trim().length > maxLength); -} - /** * Checks if each provided string includes any commas or semicolons * @@ -450,8 +426,6 @@ export { isValidRoutingNumber, isValidSSNLastFour, isValidSSNFullNine, - doesFailCharacterLimit, - doesFailCharacterLimitAfterTrim, isReservedRoomName, isExistingRoomName, isValidRoomName, diff --git a/src/pages/RequestCallPage.js b/src/pages/RequestCallPage.js index 1ffed3a099d1..91b6d1e5e0e8 100644 --- a/src/pages/RequestCallPage.js +++ b/src/pages/RequestCallPage.js @@ -219,16 +219,6 @@ class RequestCallPage extends Component { errors.lastName = this.props.translate('requestCallPage.error.lastName'); } - const [firstNameLengthError, lastNameLengthError] = ValidationUtils.doesFailCharacterLimit(CONST.DISPLAY_NAME.MAX_LENGTH, [values.firstName, values.lastName]); - - if (firstNameLengthError) { - errors.firstName = this.props.translate('requestCallPage.error.firstNameLength'); - } - - if (lastNameLengthError) { - errors.lastName = this.props.translate('requestCallPage.error.lastNameLength'); - } - const phoneNumber = LoginUtils.getPhoneNumberWithoutSpecialChars(values.phoneNumber); if (_.isEmpty(values.phoneNumber.trim()) || !Str.isValidPhone(phoneNumber)) { errors.phoneNumber = this.props.translate('common.error.phoneNumber'); diff --git a/src/pages/settings/Profile/DisplayNamePage.js b/src/pages/settings/Profile/DisplayNamePage.js index 07ce3fbc6fec..2e001488cf64 100644 --- a/src/pages/settings/Profile/DisplayNamePage.js +++ b/src/pages/settings/Profile/DisplayNamePage.js @@ -58,16 +58,10 @@ class DisplayNamePage extends Component { const [doesFirstNameHaveInvalidCharacters, doesLastNameHaveInvalidCharacters] = ValidationUtils.doesContainCommaOrSemicolon( [values.firstName, values.lastName], ); - const [isFirstNameTooLong, isLastNameTooLong] = ValidationUtils.doesFailCharacterLimitAfterTrim( - CONST.DISPLAY_NAME.MAX_LENGTH, - [values.firstName, values.lastName], - ); // First we validate the first name field if (doesFirstNameHaveInvalidCharacters) { errors.firstName = this.props.translate('personalDetails.error.hasInvalidCharacter'); - } else if (isFirstNameTooLong) { - errors.firstName = this.props.translate('personalDetails.error.firstNameLength'); } else if (ValidationUtils.doesContainReservedWord(values.firstName, CONST.DISPLAY_NAME.RESERVED_FIRST_NAMES)) { errors.firstName = this.props.translate('personalDetails.error.containsReservedWord'); } @@ -75,8 +69,6 @@ class DisplayNamePage extends Component { // Then we validate the last name field if (doesLastNameHaveInvalidCharacters) { errors.lastName = this.props.translate('personalDetails.error.hasInvalidCharacter'); - } else if (isLastNameTooLong) { - errors.lastName = this.props.translate('personalDetails.error.lastNameLength'); } return errors; From eeb046ce54092e99476d7ff70cae589f8c009290 Mon Sep 17 00:00:00 2001 From: Puneet Lath Date: Mon, 6 Feb 2023 18:14:36 -0500 Subject: [PATCH 11/16] Use constants for error copy --- src/languages/en.js | 4 ++-- src/languages/es.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/languages/en.js b/src/languages/en.js index 8d36bc27c363..7ff597608385 100755 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -581,8 +581,8 @@ export default { }, personalDetails: { error: { - firstNameLength: 'First name cannot be longer than 50 characters', - lastNameLength: 'Last name cannot be longer than 50 characters', + firstNameLength: `First name cannot be longer than ${CONST.DISPLAY_NAME.MAX_LENGTH} characters`, + lastNameLength: `Last name cannot be longer than ${CONST.DISPLAY_NAME.MAX_LENGTH} characters`, containsReservedWord: 'First name cannot contain the words Expensify or Concierge', hasInvalidCharacter: 'Name cannot contain a comma or semicolon', }, diff --git a/src/languages/es.js b/src/languages/es.js index 7e0081ac139e..6a6b70a9c66a 100644 --- a/src/languages/es.js +++ b/src/languages/es.js @@ -581,8 +581,8 @@ export default { }, personalDetails: { error: { - firstNameLength: 'El nombre no puede tener más de 50 caracteres', - lastNameLength: 'El apellido no puede tener más de 50 caracteres', + firstNameLength: `El nombre no puede tener más de ${CONST.DISPLAY_NAME.MAX_LENGTH} caracteres`, + lastNameLength: `El apellido no puede tener más de ${CONST.DISPLAY_NAME.MAX_LENGTH} caracteres`, containsReservedWord: 'El nombre no puede contener las palabras Expensify o Concierge', hasInvalidCharacter: 'El nombre no puede contener una coma o un punto y coma', }, From 9b8ae398f57fe23573396a2097349f4c7b21dca6 Mon Sep 17 00:00:00 2001 From: Puneet Lath Date: Tue, 7 Feb 2023 14:05:00 -0500 Subject: [PATCH 12/16] Add localize import --- src/libs/ValidationUtils.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libs/ValidationUtils.js b/src/libs/ValidationUtils.js index dcf728e99c56..aa51c5014f05 100644 --- a/src/libs/ValidationUtils.js +++ b/src/libs/ValidationUtils.js @@ -3,6 +3,7 @@ import _ from 'underscore'; import CONST from '../CONST'; import * as CardUtils from './CardUtils'; import * as LoginUtils from './LoginUtils'; +import * as Localize from './Localize'; /** * Implements the Luhn Algorithm, a checksum formula used to validate credit card From 841d8ae33043779c16eddf8a387bc0c2d63928be Mon Sep 17 00:00:00 2001 From: Puneet Lath Date: Wed, 8 Feb 2023 17:18:46 -0500 Subject: [PATCH 13/16] Use this.props.translate instead of Localize --- src/pages/settings/Profile/PersonalDetails/LegalNamePage.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/pages/settings/Profile/PersonalDetails/LegalNamePage.js b/src/pages/settings/Profile/PersonalDetails/LegalNamePage.js index e1faeade54e6..72fd36671862 100644 --- a/src/pages/settings/Profile/PersonalDetails/LegalNamePage.js +++ b/src/pages/settings/Profile/PersonalDetails/LegalNamePage.js @@ -6,7 +6,6 @@ import {withOnyx} from 'react-native-onyx'; import ScreenWrapper from '../../../../components/ScreenWrapper'; import HeaderWithCloseButton from '../../../../components/HeaderWithCloseButton'; import withLocalize, {withLocalizePropTypes} from '../../../../components/withLocalize'; -import * as Localize from '../../../../libs/Localize'; import ROUTES from '../../../../ROUTES'; import Form from '../../../../components/Form'; import ONYXKEYS from '../../../../ONYXKEYS'; @@ -75,13 +74,13 @@ class LegalNamePage extends Component { if (doesLegalFirstNameHaveInvalidCharacters) { errors.legalFirstName = this.props.translate('personalDetails.error.hasInvalidCharacter'); } else if (_.isEmpty(values.legalFirstName)) { - errors.legalFirstName = Localize.translateLocal('common.error.fieldRequired'); + errors.legalFirstName = this.props.translate('common.error.fieldRequired'); } if (doesLegalLastNameHaveInvalidCharacters) { errors.legalLastName = this.props.translate('personalDetails.error.hasInvalidCharacter'); } else if (_.isEmpty(values.legalLastName)) { - errors.legalLastName = Localize.translateLocal('common.error.fieldRequired'); + errors.legalLastName = this.props.translate('common.error.fieldRequired'); } return errors; From 5ea2df617b13431a97abf68a458adee5da725817 Mon Sep 17 00:00:00 2001 From: Puneet Lath Date: Wed, 8 Feb 2023 17:20:08 -0500 Subject: [PATCH 14/16] Remove unused privatePersonalDetails.error.hasInvalidCharacter --- src/languages/en.js | 1 - src/languages/es.js | 1 - 2 files changed, 2 deletions(-) diff --git a/src/languages/en.js b/src/languages/en.js index 1a1946701bbf..5e478b5bb30e 100755 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -604,7 +604,6 @@ export default { legalLastName: 'Legal last name', homeAddress: 'Home address', error: { - hasInvalidCharacter: ({invalidCharacter}) => `Please remove the ${invalidCharacter} from the field above.`, dateShouldBeBefore: ({dateString}) => `Date should be before ${dateString}.`, dateShouldBeAfter: ({dateString}) => `Date should be after ${dateString}.`, }, diff --git a/src/languages/es.js b/src/languages/es.js index 67f85647d451..978bc0899f86 100644 --- a/src/languages/es.js +++ b/src/languages/es.js @@ -604,7 +604,6 @@ export default { legalLastName: 'Apellidos', homeAddress: 'Domicilio', error: { - hasInvalidCharacter: ({invalidCharacter}) => `Por favor elimina ${invalidCharacter}`, dateShouldBeBefore: ({dateString}) => `La fecha debe ser anterior a ${dateString}.`, dateShouldBeAfter: ({dateString}) => `La fecha debe ser posterior a ${dateString}.`, }, From 00ae7048c8d921e4d2d81071257754f616a6fbed Mon Sep 17 00:00:00 2001 From: Puneet Lath Date: Mon, 13 Feb 2023 11:57:00 -0500 Subject: [PATCH 15/16] Fully merge es.js --- src/languages/es.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/languages/es.js b/src/languages/es.js index bb829e676ebe..d764fa328a8f 100644 --- a/src/languages/es.js +++ b/src/languages/es.js @@ -1060,13 +1060,7 @@ export default { error: { phoneNumberExtension: 'Por favor, introduce una extensión telefónica válida', firstName: 'Por favor, ingresa tu nombre', -<<<<<<< HEAD - lastName: 'Por favor, ingresa tu apellido', -======= lastName: 'Por favor, ingresa tus apellidos', - firstNameLength: 'El nombre no debe tener más de 50 caracteres', - lastNameLength: 'Los apellidos no deben tener más de 50 caracteres', ->>>>>>> main }, }, requestCallConfirmationScreen: { From b31fb6375b2b800baf5b0970c41a4082c0d98cbc Mon Sep 17 00:00:00 2001 From: Puneet Lath Date: Tue, 14 Feb 2023 11:42:06 -0500 Subject: [PATCH 16/16] Change doesContainCommaOrSemicolon to isValidDisplayName --- src/libs/ValidationUtils.js | 12 ++++++------ src/pages/settings/Profile/DisplayNamePage.js | 7 ++----- .../Profile/PersonalDetails/LegalNamePage.js | 9 ++------- 3 files changed, 10 insertions(+), 18 deletions(-) diff --git a/src/libs/ValidationUtils.js b/src/libs/ValidationUtils.js index aa51c5014f05..ee8cd145f055 100644 --- a/src/libs/ValidationUtils.js +++ b/src/libs/ValidationUtils.js @@ -357,13 +357,13 @@ function isValidRoutingNumber(number) { } /** - * Checks if each provided string includes any commas or semicolons + * Checks that the provided name doesn't contain any commas or semicolons * - * @param {String[]} valuesToBeValidated - * @returns {Boolean[]} + * @param {String} name + * @returns {Boolean} */ -function doesContainCommaOrSemicolon(valuesToBeValidated) { - return _.map(valuesToBeValidated, value => (value.includes(',') || value.includes(';'))); +function isValidDisplayName(name) { + return !name.includes(',') && !name.includes(';'); } /** @@ -457,6 +457,6 @@ export { isValidRoomName, isValidTaxID, isValidValidateCode, - doesContainCommaOrSemicolon, + isValidDisplayName, doesContainReservedWord, }; diff --git a/src/pages/settings/Profile/DisplayNamePage.js b/src/pages/settings/Profile/DisplayNamePage.js index 2e001488cf64..9e4e948237f4 100644 --- a/src/pages/settings/Profile/DisplayNamePage.js +++ b/src/pages/settings/Profile/DisplayNamePage.js @@ -55,19 +55,16 @@ class DisplayNamePage extends Component { */ validate(values) { const errors = {}; - const [doesFirstNameHaveInvalidCharacters, doesLastNameHaveInvalidCharacters] = ValidationUtils.doesContainCommaOrSemicolon( - [values.firstName, values.lastName], - ); // First we validate the first name field - if (doesFirstNameHaveInvalidCharacters) { + if (!ValidationUtils.isValidDisplayName(values.firstName)) { errors.firstName = this.props.translate('personalDetails.error.hasInvalidCharacter'); } else if (ValidationUtils.doesContainReservedWord(values.firstName, CONST.DISPLAY_NAME.RESERVED_FIRST_NAMES)) { errors.firstName = this.props.translate('personalDetails.error.containsReservedWord'); } // Then we validate the last name field - if (doesLastNameHaveInvalidCharacters) { + if (!ValidationUtils.isValidDisplayName(values.lastName)) { errors.lastName = this.props.translate('personalDetails.error.hasInvalidCharacter'); } diff --git a/src/pages/settings/Profile/PersonalDetails/LegalNamePage.js b/src/pages/settings/Profile/PersonalDetails/LegalNamePage.js index 72fd36671862..dee460123f1e 100644 --- a/src/pages/settings/Profile/PersonalDetails/LegalNamePage.js +++ b/src/pages/settings/Profile/PersonalDetails/LegalNamePage.js @@ -66,18 +66,13 @@ class LegalNamePage extends Component { validate(values) { const errors = {}; - // Check for invalid characters in legal first and last name - const [doesLegalFirstNameHaveInvalidCharacters, doesLegalLastNameHaveInvalidCharacters] = ValidationUtils.doesContainCommaOrSemicolon( - [values.legalFirstName, values.legalLastName], - ); - - if (doesLegalFirstNameHaveInvalidCharacters) { + if (!ValidationUtils.isValidDisplayName(values.legalFirstName)) { errors.legalFirstName = this.props.translate('personalDetails.error.hasInvalidCharacter'); } else if (_.isEmpty(values.legalFirstName)) { errors.legalFirstName = this.props.translate('common.error.fieldRequired'); } - if (doesLegalLastNameHaveInvalidCharacters) { + if (!ValidationUtils.isValidDisplayName(values.legalLastName)) { errors.legalLastName = this.props.translate('personalDetails.error.hasInvalidCharacter'); } else if (_.isEmpty(values.legalLastName)) { errors.legalLastName = this.props.translate('common.error.fieldRequired');