|
1 |
| -import PropTypes from 'prop-types'; |
2 |
| -import React, { useEffect } from 'react'; |
3 |
| -import { connect } from 'react-redux'; |
4 |
| -import { bindActionCreators } from 'redux'; |
5 |
| -import { withTranslation } from 'react-i18next'; |
| 1 | +import React, { useEffect, useMemo } from 'react'; |
6 | 2 | import { Helmet } from 'react-helmet';
|
7 |
| -import browserHistory from '../../../browserHistory'; |
| 3 | +import { useLocation, useHistory } from 'react-router-dom'; |
| 4 | +import { useSelector, useDispatch } from 'react-redux'; |
| 5 | +import { useTranslation } from 'react-i18next'; |
8 | 6 | import { verifyEmailConfirmation } from '../actions';
|
9 | 7 | import RootPage from '../../../components/RootPage';
|
10 | 8 | import Nav from '../../IDE/components/Header/Nav';
|
11 | 9 |
|
12 |
| -const EmailVerificationView = (props) => { |
13 |
| - const { emailVerificationTokenState, location, t } = props; |
14 |
| - |
15 |
| - const verificationTokenFromLocation = () => { |
| 10 | +const EmailVerificationView = () => { |
| 11 | + const { t } = useTranslation(); |
| 12 | + const location = useLocation(); |
| 13 | + const dispatch = useDispatch(); |
| 14 | + const browserHistory = useHistory(); |
| 15 | + const emailVerificationTokenState = useSelector( |
| 16 | + (state) => state.user.emailVerificationTokenState |
| 17 | + ); |
| 18 | + const verificationToken = useMemo(() => { |
16 | 19 | const searchParams = new URLSearchParams(location.search);
|
17 | 20 | return searchParams.get('t');
|
18 |
| - }; |
19 |
| - |
| 21 | + }, [location.search]); |
20 | 22 | useEffect(() => {
|
21 |
| - const verificationToken = verificationTokenFromLocation(); |
22 |
| - if (verificationToken != null) { |
23 |
| - props.verifyEmailConfirmation(verificationToken); |
| 23 | + if (verificationToken) { |
| 24 | + dispatch(verifyEmailConfirmation(verificationToken)); |
24 | 25 | }
|
25 |
| - }, [location, props]); |
26 |
| - |
| 26 | + }, [dispatch, verificationToken]); |
27 | 27 | let status = null;
|
28 |
| - |
29 |
| - if (verificationTokenFromLocation() == null) { |
| 28 | + if (!verificationToken) { |
30 | 29 | status = <p>{t('EmailVerificationView.InvalidTokenNull')}</p>;
|
31 | 30 | } else if (emailVerificationTokenState === 'checking') {
|
32 | 31 | status = <p>{t('EmailVerificationView.Checking')}</p>;
|
@@ -54,39 +53,4 @@ const EmailVerificationView = (props) => {
|
54 | 53 | </RootPage>
|
55 | 54 | );
|
56 | 55 | };
|
57 |
| - |
58 |
| -function mapStateToProps(state) { |
59 |
| - return { |
60 |
| - emailVerificationTokenState: state.user.emailVerificationTokenState |
61 |
| - }; |
62 |
| -} |
63 |
| - |
64 |
| -function mapDispatchToProps(dispatch) { |
65 |
| - return bindActionCreators( |
66 |
| - { |
67 |
| - verifyEmailConfirmation |
68 |
| - }, |
69 |
| - dispatch |
70 |
| - ); |
71 |
| -} |
72 |
| - |
73 |
| -EmailVerificationView.defaultProps = { |
74 |
| - emailVerificationTokenState: null |
75 |
| -}; |
76 |
| - |
77 |
| -EmailVerificationView.propTypes = { |
78 |
| - emailVerificationTokenState: PropTypes.oneOf([ |
79 |
| - 'checking', |
80 |
| - 'verified', |
81 |
| - 'invalid' |
82 |
| - ]), |
83 |
| - verifyEmailConfirmation: PropTypes.func.isRequired, |
84 |
| - t: PropTypes.func.isRequired, |
85 |
| - location: PropTypes.shape({ |
86 |
| - search: PropTypes.string.isRequired |
87 |
| - }).isRequired |
88 |
| -}; |
89 |
| - |
90 |
| -export default withTranslation()( |
91 |
| - connect(mapStateToProps, mapDispatchToProps)(EmailVerificationView) |
92 |
| -); |
| 56 | +export default EmailVerificationView; |
0 commit comments