Skip to content

Commit 0403451

Browse files
authored
Merge pull request #1300 from dacadeorg/fix/email-validation-regex
fix: change the regex to validate emails according to RFC 1034 standard
2 parents c43f326 + b1b83c4 commit 0403451

File tree

5 files changed

+33
-10
lines changed

5 files changed

+33
-10
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
"classnames": "^2.3.2",
3333
"date-fns": "^2.29.3",
3434
"dompurify": "^3.0.1",
35+
"email-validator": "^2.0.4",
3536
"eslint": "8.36.0",
3637
"eslint-config-next": "13.2.4",
3738
"eslint-plugin-prettier": "^5.0.0",

src/components/ui/EmailInput.tsx

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { useTranslation } from "next-i18next";
44
import { ReactElement } from "react";
55
import { FieldErrors, UseFormRegister } from "react-hook-form";
66
import { FormValues } from "@/pages/signup";
7+
import * as EmailValidator from "email-validator";
78

89
interface EmailInputProps {
910
register: UseFormRegister<FormValues>;
@@ -38,13 +39,10 @@ export default function EmailInput({ errors, register, emailValue, testId = "ema
3839
placeholder={`${t("login-page.email.placeholder")}`}
3940
label={`${t("login-page.email.label")}`}
4041
value={emailValue}
41-
error={errors?.email?.message || error?.error?.data.details.email}
42+
error={errors?.email?.message || error?.error?.data?.details?.email}
4243
{...register("email", {
4344
required: "This field is required",
44-
pattern: {
45-
value: /^([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$/i,
46-
message: "This must be a valid email address",
47-
},
45+
validate: (value) => EmailValidator.validate(value) || "This must be a valid email address",
4846
})}
4947
/>
5048
);

src/components/ui/UsernameInput.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export default function UsernameInput({ register, errors, usernameValue, testId
3636
placeholder={`${t("login-page.username.placeholde")}`}
3737
label={`${t("login-page.username.label")}`}
3838
value={usernameValue}
39-
error={errors.username?.message || (error?.error?.data.details.username as string)}
39+
error={errors.username?.message || (error?.error?.data?.details?.username as string)}
4040
{...register("username", {
4141
required: "This field is required",
4242
minLength: {

src/pages/signup.tsx

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Head from "next/head";
99
import Link from "next/link";
1010
import { GetServerSideProps } from "next";
1111
import i18Translate from "@/utilities/I18Translate";
12-
import { useSelector } from "@/hooks/useTypedSelector";
12+
import { useMultiSelector } from "@/hooks/useTypedSelector";
1313
import { useDispatch } from "@/hooks/useTypedDispatch";
1414
import classNames from "classnames";
1515
import Checkbox from "@/components/ui/Checkbox";
@@ -19,6 +19,8 @@ import LayoutWithoutFooter from "@/layouts/WithoutFooter";
1919
import EmailInput from "@/components/ui/EmailInput";
2020
import UsernameInput from "@/components/ui/UsernameInput";
2121
import { setError } from "@/store/feature/index.slice";
22+
import { IRootState } from "@/store";
23+
import { Referral } from "@/types/community";
2224

2325
/**
2426
* Signup form values
@@ -36,6 +38,20 @@ export interface FormValues {
3638
checkTerms: boolean;
3739
}
3840

41+
interface ErrorDetails {
42+
error: {
43+
data: {
44+
details: {
45+
password?: string;
46+
};
47+
};
48+
};
49+
}
50+
interface MultiSelector {
51+
referrals: Referral[];
52+
error: ErrorDetails;
53+
}
54+
3955
/**
4056
* signup page
4157
* @date 4/6/2023 - 4:15:13 PM
@@ -56,7 +72,10 @@ export default function SignupWithInvite(): ReactElement {
5672
const referralCodeValue = watch("referralCode") || "";
5773
const { query, locale } = useRouter();
5874
const referrer = query.invite;
59-
const referrals = useSelector((state) => state.referrals.list);
75+
const { referrals, error } = useMultiSelector<unknown, MultiSelector>({
76+
referrals: (state: IRootState) => state.referrals.list,
77+
error: (state: IRootState) => state.store.error,
78+
});
6079
const { t } = useTranslation();
6180
const [loading, setLoading] = useState(false);
6281
const dispatch = useDispatch();
@@ -73,7 +92,7 @@ export default function SignupWithInvite(): ReactElement {
7392
};
7493
try {
7594
if (!checkTerms) return;
76-
await dispatch(signUp({ locale, payload: { ...signupData } }));
95+
dispatch(signUp({ locale, payload: { ...signupData } }));
7796
} catch (error) {
7897
setError(error);
7998
console.error(error);
@@ -122,7 +141,7 @@ export default function SignupWithInvite(): ReactElement {
122141
value={passwordValue}
123142
placeholder={`${t("login-page.password.placeholde")}`}
124143
label={`${t("login-page.password.label")}`}
125-
error={errors.password?.message}
144+
error={error?.error?.data?.details?.password}
126145
{...register("password", {
127146
required: "This field is required",
128147
minLength: { value: 3, message: "The password is too short" },

yarn.lock

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6527,6 +6527,11 @@ elliptic@^6.4.0, elliptic@^6.5.4:
65276527
minimalistic-assert "^1.0.1"
65286528
minimalistic-crypto-utils "^1.0.1"
65296529

6530+
email-validator@^2.0.4:
6531+
version "2.0.4"
6532+
resolved "https://registry.yarnpkg.com/email-validator/-/email-validator-2.0.4.tgz#b8dfaa5d0dae28f1b03c95881d904d4e40bfe7ed"
6533+
integrity sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==
6534+
65306535
emittery@^0.13.1:
65316536
version "0.13.1"
65326537
resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad"

0 commit comments

Comments
 (0)