|
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