From c07b2c3e6c4f1e0855feac40fad1930fe4a33100 Mon Sep 17 00:00:00 2001
From: Aryan Singh <ssaryans597@gmail.com>
Date: Sun, 17 Dec 2023 15:01:39 +0530
Subject: [PATCH 1/3] fix: infinite api requests when the verification token is
 invalid

---
 client/modules/User/pages/EmailVerificationView.jsx | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/client/modules/User/pages/EmailVerificationView.jsx b/client/modules/User/pages/EmailVerificationView.jsx
index 5f7bbd92bb..d4280425b6 100644
--- a/client/modules/User/pages/EmailVerificationView.jsx
+++ b/client/modules/User/pages/EmailVerificationView.jsx
@@ -1,5 +1,5 @@
 import PropTypes from 'prop-types';
-import React, { useEffect } from 'react';
+import React, { useState, useEffect } from 'react';
 import { connect } from 'react-redux';
 import { bindActionCreators } from 'redux';
 import { withTranslation } from 'react-i18next';
@@ -10,6 +10,7 @@ import RootPage from '../../../components/RootPage';
 import Nav from '../../IDE/components/Header/Nav';
 
 const EmailVerificationView = (props) => {
+  const [verificationAttempted, setVerificationAttempted] = useState(false);
   const { emailVerificationTokenState, location, t } = props;
 
   const verificationTokenFromLocation = () => {
@@ -19,8 +20,9 @@ const EmailVerificationView = (props) => {
 
   useEffect(() => {
     const verificationToken = verificationTokenFromLocation();
-    if (verificationToken != null) {
+    if (verificationToken != null && !verificationAttempted) {
       props.verifyEmailConfirmation(verificationToken);
+      setVerificationAttempted(true);
     }
   }, [location, props]);
 

From e300390d39e70c67c5b1084c404bb43c40fa9f5e Mon Sep 17 00:00:00 2001
From: Aryan Singh <ssaryans597@gmail.com>
Date: Mon, 18 Dec 2023 15:32:11 +0530
Subject: [PATCH 2/3] migrated to newer redux syntax

---
 .../User/pages/EmailVerificationView.jsx      | 76 +++++--------------
 1 file changed, 19 insertions(+), 57 deletions(-)

diff --git a/client/modules/User/pages/EmailVerificationView.jsx b/client/modules/User/pages/EmailVerificationView.jsx
index d4280425b6..6dfbf07824 100644
--- a/client/modules/User/pages/EmailVerificationView.jsx
+++ b/client/modules/User/pages/EmailVerificationView.jsx
@@ -1,34 +1,31 @@
-import PropTypes from 'prop-types';
-import React, { useState, useEffect } from 'react';
-import { connect } from 'react-redux';
-import { bindActionCreators } from 'redux';
-import { withTranslation } from 'react-i18next';
+import React, { useEffect, useMemo } from 'react';
 import { Helmet } from 'react-helmet';
-import browserHistory from '../../../browserHistory';
+import { useLocation, useHistory } from 'react-router-dom';
+import { useSelector, useDispatch } from 'react-redux';
+import { useTranslation } from 'react-i18next';
 import { verifyEmailConfirmation } from '../actions';
 import RootPage from '../../../components/RootPage';
 import Nav from '../../IDE/components/Header/Nav';
 
-const EmailVerificationView = (props) => {
-  const [verificationAttempted, setVerificationAttempted] = useState(false);
-  const { emailVerificationTokenState, location, t } = props;
-
-  const verificationTokenFromLocation = () => {
+const EmailVerificationView = () => {
+  const { t } = useTranslation();
+  const location = useLocation();
+  const dispatch = useDispatch();
+  const browserHistory = useHistory();
+  const emailVerificationTokenState = useSelector(
+    (state) => state.user.emailVerificationTokenState
+  );
+  const verificationToken = useMemo(() => {
     const searchParams = new URLSearchParams(location.search);
     return searchParams.get('t');
-  };
-
+  }, [location.search]);
   useEffect(() => {
-    const verificationToken = verificationTokenFromLocation();
-    if (verificationToken != null && !verificationAttempted) {
-      props.verifyEmailConfirmation(verificationToken);
-      setVerificationAttempted(true);
+    if (verificationToken) {
+      dispatch(verifyEmailConfirmation(verificationToken));
     }
-  }, [location, props]);
-
+  }, [dispatch, verificationToken]);
   let status = null;
-
-  if (verificationTokenFromLocation() == null) {
+  if (verificationToken == null) {
     status = <p>{t('EmailVerificationView.InvalidTokenNull')}</p>;
   } else if (emailVerificationTokenState === 'checking') {
     status = <p>{t('EmailVerificationView.Checking')}</p>;
@@ -56,39 +53,4 @@ const EmailVerificationView = (props) => {
     </RootPage>
   );
 };
-
-function mapStateToProps(state) {
-  return {
-    emailVerificationTokenState: state.user.emailVerificationTokenState
-  };
-}
-
-function mapDispatchToProps(dispatch) {
-  return bindActionCreators(
-    {
-      verifyEmailConfirmation
-    },
-    dispatch
-  );
-}
-
-EmailVerificationView.defaultProps = {
-  emailVerificationTokenState: null
-};
-
-EmailVerificationView.propTypes = {
-  emailVerificationTokenState: PropTypes.oneOf([
-    'checking',
-    'verified',
-    'invalid'
-  ]),
-  verifyEmailConfirmation: PropTypes.func.isRequired,
-  t: PropTypes.func.isRequired,
-  location: PropTypes.shape({
-    search: PropTypes.string.isRequired
-  }).isRequired
-};
-
-export default withTranslation()(
-  connect(mapStateToProps, mapDispatchToProps)(EmailVerificationView)
-);
+export default EmailVerificationView;

From b90d5dbbf306d3232742c249948a0662e70673bc Mon Sep 17 00:00:00 2001
From: Linda Paiste <lindapaiste@gmail.com>
Date: Sat, 6 Jan 2024 14:04:29 -0600
Subject: [PATCH 3/3] handle empty token string

---
 client/modules/User/pages/EmailVerificationView.jsx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/client/modules/User/pages/EmailVerificationView.jsx b/client/modules/User/pages/EmailVerificationView.jsx
index 6dfbf07824..7ad9d2fa79 100644
--- a/client/modules/User/pages/EmailVerificationView.jsx
+++ b/client/modules/User/pages/EmailVerificationView.jsx
@@ -25,7 +25,7 @@ const EmailVerificationView = () => {
     }
   }, [dispatch, verificationToken]);
   let status = null;
-  if (verificationToken == null) {
+  if (!verificationToken) {
     status = <p>{t('EmailVerificationView.InvalidTokenNull')}</p>;
   } else if (emailVerificationTokenState === 'checking') {
     status = <p>{t('EmailVerificationView.Checking')}</p>;