diff --git a/app/livechat/client/views/app/tabbar/visitorTranscript.js b/app/livechat/client/views/app/tabbar/visitorTranscript.js index f888aed80a1..d99c02c82aa 100644 --- a/app/livechat/client/views/app/tabbar/visitorTranscript.js +++ b/app/livechat/client/views/app/tabbar/visitorTranscript.js @@ -4,7 +4,8 @@ import { Template } from 'meteor/templating'; import { dispatchToastMessage } from '../../../../../../client/lib/toast'; import { handleError } from '../../../../../../client/lib/utils/handleError'; -import { t, isEmail, roomTypes } from '../../../../../utils'; +import { t, roomTypes } from '../../../../../utils'; +import { isEmail } from '../../../../../../lib/utils/isEmail'; import { APIClient } from '../../../../../utils/client'; import './visitorTranscript.html'; diff --git a/app/utils/client/index.js b/app/utils/client/index.js index 98078f775fe..9445f2d91e9 100644 --- a/app/utils/client/index.js +++ b/app/utils/client/index.js @@ -1,7 +1,6 @@ export { t, isRtl } from '../lib/tapi18n'; export { getDefaultSubscriptionPref } from '../lib/getDefaultSubscriptionPref'; export { Info } from '../rocketchat.info'; -export { isEmail } from '../lib/isEmail'; export { getUserPreference } from '../lib/getUserPreference'; export { fileUploadMediaWhiteList, fileUploadIsValidContentType } from '../lib/fileUploadRestrictions'; export { roomTypes } from './lib/roomTypes'; diff --git a/app/utils/lib/isEmail.js b/app/utils/lib/isEmail.js deleted file mode 100644 index 1927b879a89..00000000000 --- a/app/utils/lib/isEmail.js +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Code from https://github.com/dleitee/valid.js - * Checks for email - * @params email - * @return boolean - */ -export const isEmail = (email) => { - const sQtext = '[^\\x0d\\x22\\x5c]'; - const sDtext = '[^\\x0d\\x5b-\\x5d]'; - const sAtom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d]+'; - const sQuotedPair = '\\x5c[\\x00-\\x7f]'; - const sDomainLiteral = `\\x5b(${ sDtext }|${ sQuotedPair })*\\x5d`; - const sQuotedString = `\\x22(${ sQtext }|${ sQuotedPair })*\\x22`; - const sDomainRef = sAtom; - const sSubDomain = `(${ sDomainRef }|${ sDomainLiteral })`; - const sWord = `(${ sAtom }|${ sQuotedString })`; - const sDomain = `${ sSubDomain }(\\x2e${ sSubDomain })*`; - const sLocalPart = `${ sWord }(\\x2e${ sWord })*`; - const sAddrSpec = `${ sLocalPart }\\x40${ sDomain }`; - const sValidEmail = `^${ sAddrSpec }$`; - const reg = new RegExp(sValidEmail); - return reg.test(email); -}; diff --git a/client/views/account/AccountProfileForm.js b/client/views/account/AccountProfileForm.js index 9ac2ae3b0ba..96fd45bc667 100644 --- a/client/views/account/AccountProfileForm.js +++ b/client/views/account/AccountProfileForm.js @@ -14,8 +14,8 @@ import { import { useDebouncedCallback, useSafely } from '@rocket.chat/fuselage-hooks'; import React, { useCallback, useMemo, useEffect, useState } from 'react'; -import { isEmail } from '../../../app/utils/lib/isEmail.js'; import { getUserEmailAddress } from '../../../lib/getUserEmailAddress'; +import { isEmail } from '../../../lib/utils/isEmail'; import CustomFieldsForm from '../../components/CustomFieldsForm'; import { USER_STATUS_TEXT_MAX_LENGTH } from '../../components/UserStatus'; import UserStatusMenu from '../../components/UserStatusMenu'; diff --git a/client/views/admin/emailInbox/EmailInboxForm.js b/client/views/admin/emailInbox/EmailInboxForm.js index eab047bb15b..942b2549ad5 100644 --- a/client/views/admin/emailInbox/EmailInboxForm.js +++ b/client/views/admin/emailInbox/EmailInboxForm.js @@ -13,7 +13,7 @@ import { import { useMutableCallback } from '@rocket.chat/fuselage-hooks'; import React, { useCallback, useState } from 'react'; -import { isEmail } from '../../../../app/utils/client'; +import { isEmail } from '../../../../lib/utils/isEmail'; import AutoCompleteDepartment from '../../../components/AutoCompleteDepartment'; import GenericModal from '../../../components/GenericModal'; import Page from '../../../components/Page'; diff --git a/client/views/admin/mailer/Mailer.js b/client/views/admin/mailer/Mailer.js index 8a68b3ae417..16aa010da5b 100644 --- a/client/views/admin/mailer/Mailer.js +++ b/client/views/admin/mailer/Mailer.js @@ -10,8 +10,8 @@ import { } from '@rocket.chat/fuselage'; import React, { useState, useCallback } from 'react'; -import { isEmail } from '../../../../app/utils/lib/isEmail.js'; -import { isJSON } from '../../../../app/utils/lib/isJSON.js'; +import { isJSON } from '../../../../app/utils/lib/isJSON'; +import { isEmail } from '../../../../lib/utils/isEmail'; import Page from '../../../components/Page'; import { useTranslation } from '../../../contexts/TranslationContext'; diff --git a/client/views/admin/users/InviteUsers.js b/client/views/admin/users/InviteUsers.js index 32bfcf138bb..18e2d008a96 100644 --- a/client/views/admin/users/InviteUsers.js +++ b/client/views/admin/users/InviteUsers.js @@ -1,7 +1,7 @@ import { Box, Button, Icon, TextAreaInput } from '@rocket.chat/fuselage'; import React, { useCallback, useState } from 'react'; -import { isEmail } from '../../../../app/utils/lib/isEmail.js'; +import { isEmail } from '../../../../lib/utils/isEmail'; import VerticalBar from '../../../components/VerticalBar'; import { useMethod } from '../../../contexts/ServerContext'; import { useToastMessageDispatch } from '../../../contexts/ToastMessagesContext'; diff --git a/client/views/admin/users/UserForm.js b/client/views/admin/users/UserForm.js index 8729d6de9b8..561f7fa64f7 100644 --- a/client/views/admin/users/UserForm.js +++ b/client/views/admin/users/UserForm.js @@ -12,7 +12,7 @@ import { } from '@rocket.chat/fuselage'; import React, { useCallback, useMemo, useState } from 'react'; -import { isEmail } from '../../../../app/utils/lib/isEmail.js'; +import { isEmail } from '../../../../lib/utils/isEmail'; import CustomFieldsForm from '../../../components/CustomFieldsForm'; import VerticalBar from '../../../components/VerticalBar'; import { useTranslation } from '../../../contexts/TranslationContext'; diff --git a/client/views/omnichannel/departments/EditDepartment.js b/client/views/omnichannel/departments/EditDepartment.js index b1e2d1c2f17..24885d0f53a 100644 --- a/client/views/omnichannel/departments/EditDepartment.js +++ b/client/views/omnichannel/departments/EditDepartment.js @@ -17,7 +17,7 @@ import { useMutableCallback, useUniqueId } from '@rocket.chat/fuselage-hooks'; import React, { useMemo, useState, useRef } from 'react'; import { useSubscription } from 'use-subscription'; -import { isEmail } from '../../../../app/utils/client'; +import { isEmail } from '../../../../lib/utils/isEmail'; import Page from '../../../components/Page'; import { useRoomsList } from '../../../components/RoomAutoComplete/hooks/useRoomsList'; import { useRoute } from '../../../contexts/RouterContext'; diff --git a/client/views/omnichannel/directory/contacts/contextualBar/ContactNewEdit.js b/client/views/omnichannel/directory/contacts/contextualBar/ContactNewEdit.js index 3a4005b3f22..be4c7ef13b8 100644 --- a/client/views/omnichannel/directory/contacts/contextualBar/ContactNewEdit.js +++ b/client/views/omnichannel/directory/contacts/contextualBar/ContactNewEdit.js @@ -4,7 +4,7 @@ import React, { useState, useMemo } from 'react'; import { useSubscription } from 'use-subscription'; import { hasAtLeastOnePermission } from '../../../../../../app/authorization/client'; -import { isEmail } from '../../../../../../app/utils/client'; +import { isEmail } from '../../../../../../lib/utils/isEmail'; import CustomFieldsForm from '../../../../../components/CustomFieldsForm'; import VerticalBar from '../../../../../components/VerticalBar'; import { useToastMessageDispatch } from '../../../../../contexts/ToastMessagesContext'; diff --git a/client/views/room/contextualBar/ExportMessages/MailExportForm.js b/client/views/room/contextualBar/ExportMessages/MailExportForm.js index 45c3a2afb78..35fd205d982 100644 --- a/client/views/room/contextualBar/ExportMessages/MailExportForm.js +++ b/client/views/room/contextualBar/ExportMessages/MailExportForm.js @@ -12,7 +12,8 @@ import { import { useMutableCallback } from '@rocket.chat/fuselage-hooks'; import React, { useState, useEffect } from 'react'; -import { roomTypes, isEmail } from '../../../../../app/utils/client'; +import { roomTypes } from '../../../../../app/utils/client'; +import { isEmail } from '../../../../../lib/utils/isEmail'; import UserAutoCompleteMultiple from '../../../../components/UserAutoCompleteMultiple'; import { useEndpoint } from '../../../../contexts/ServerContext'; import { useToastMessageDispatch } from '../../../../contexts/ToastMessagesContext'; diff --git a/lib/utils/isEmail.ts b/lib/utils/isEmail.ts new file mode 100644 index 00000000000..966bbf8457d --- /dev/null +++ b/lib/utils/isEmail.ts @@ -0,0 +1,21 @@ +const sQtext = '[^\\x0d\\x22\\x5c]'; +const sDtext = '[^\\x0d\\x5b-\\x5d]'; +const sAtom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d]+'; +const sQuotedPair = '\\x5c[\\x00-\\x7f]'; +const sDomainLiteral = `\\x5b(${ sDtext }|${ sQuotedPair })*\\x5d`; +const sQuotedString = `\\x22(${ sQtext }|${ sQuotedPair })*\\x22`; +const sDomainRef = sAtom; +const sSubDomain = `(${ sDomainRef }|${ sDomainLiteral })`; +const sWord = `(${ sAtom }|${ sQuotedString })`; +const sDomain = `${ sSubDomain }(\\x2e${ sSubDomain })*`; +const sLocalPart = `${ sWord }(\\x2e${ sWord })*`; +const sAddrSpec = `${ sLocalPart }\\x40${ sDomain }`; +const sValidEmail = `^${ sAddrSpec }$`; +const reg = new RegExp(sValidEmail); + +/* + * Code from https://github.com/dleitee/valid.js + * Checks for email + * @params email + */ +export const isEmail = (email: string): boolean => reg.test(email);