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>;