Skip to content

Commit 316a175

Browse files
committed
18-React Firebase: Email Verification
1 parent 817ffc5 commit 316a175

File tree

7 files changed

+102
-6
lines changed

7 files changed

+102
-6
lines changed

src/components/Account/index.js

+10-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import React, { Component } from 'react';
2+
import { compose } from 'recompose';
23

3-
import { AuthUserContext, withAuthorization } from '../Session';
4+
import {
5+
AuthUserContext,
6+
withAuthorization,
7+
withEmailVerification,
8+
} from '../Session';
49
import { withFirebase } from '../Firebase';
510
import { PasswordForgetForm } from '../PasswordForget';
611
import PasswordChangeForm from '../PasswordChange';
@@ -220,4 +225,7 @@ const LoginManagement = withFirebase(LoginManagementBase);
220225

221226
const condition = authUser => !!authUser;
222227

223-
export default withAuthorization(condition)(AccountPage);
228+
export default compose(
229+
withEmailVerification,
230+
withAuthorization(condition),
231+
)(AccountPage);

src/components/Admin/index.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { Component } from 'react';
22
import { compose } from 'recompose';
33

44
import { withFirebase } from '../Firebase';
5-
import { withAuthorization } from '../Session';
5+
import { withAuthorization, withEmailVerification } from '../Session';
66
import * as ROLES from '../../constants/roles';
77

88
class AdminPage extends Component {
@@ -77,6 +77,7 @@ const condition = authUser =>
7777
authUser && authUser.roles.includes(ROLES.ADMIN);
7878

7979
export default compose(
80+
withEmailVerification,
8081
withAuthorization(condition),
8182
withFirebase,
8283
)(AdminPage);

src/components/Firebase/firebase.js

+7
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ class Firebase {
4545

4646
doPasswordReset = email => this.auth.sendPasswordResetEmail(email);
4747

48+
doSendEmailVerification = () =>
49+
this.auth.currentUser.sendEmailVerification({
50+
url: process.env.REACT_APP_CONFIRMATION_EMAIL_REDIRECT,
51+
});
52+
4853
doPasswordUpdate = password =>
4954
this.auth.currentUser.updatePassword(password);
5055

@@ -67,6 +72,8 @@ class Firebase {
6772
authUser = {
6873
uid: authUser.uid,
6974
email: authUser.email,
75+
emailVerified: authUser.emailVerified,
76+
providerData: authUser.providerData,
7077
...dbUser,
7178
};
7279

src/components/Home/index.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import React from 'react';
2+
import { compose } from 'recompose';
23

3-
import { withAuthorization } from '../Session';
4+
import { withAuthorization, withEmailVerification } from '../Session';
45

56
const HomePage = () => (
67
<div>
@@ -11,4 +12,7 @@ const HomePage = () => (
1112

1213
const condition = authUser => !!authUser;
1314

14-
export default withAuthorization(condition)(HomePage);
15+
export default compose(
16+
withEmailVerification,
17+
withAuthorization(condition),
18+
)(HomePage);

src/components/Session/index.js

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
import AuthUserContext from './context';
22
import withAuthentication from './withAuthentication';
33
import withAuthorization from './withAuthorization';
4+
import withEmailVerification from './withEmailVerification';
45

5-
export { AuthUserContext, withAuthentication, withAuthorization };
6+
export {
7+
AuthUserContext,
8+
withAuthentication,
9+
withAuthorization,
10+
withEmailVerification,
11+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import React from 'react';
2+
3+
import AuthUserContext from './context';
4+
import { withFirebase } from '../Firebase';
5+
6+
const needsEmailVerification = authUser =>
7+
authUser &&
8+
!authUser.emailVerified &&
9+
authUser.providerData
10+
.map(provider => provider.providerId)
11+
.includes('password');
12+
13+
const withEmailVerification = Component => {
14+
class WithEmailVerification extends React.Component {
15+
constructor(props) {
16+
super(props);
17+
18+
this.state = { isSent: false };
19+
}
20+
21+
onSendEmailVerification = () => {
22+
this.props.firebase
23+
.doSendEmailVerification()
24+
.then(() => this.setState({ isSent: true }));
25+
};
26+
27+
render() {
28+
return (
29+
<AuthUserContext.Consumer>
30+
{authUser =>
31+
needsEmailVerification(authUser) ? (
32+
<div>
33+
{this.state.isSent ? (
34+
<p>
35+
E-Mail confirmation sent: Check you E-Mails (Spam
36+
folder included) for a confirmation E-Mail.
37+
Refresh this page once you confirmed your E-Mail.
38+
</p>
39+
) : (
40+
<p>
41+
Verify your E-Mail: Check you E-Mails (Spam folder
42+
included) for a confirmation E-Mail or send
43+
another confirmation E-Mail.
44+
</p>
45+
)}
46+
47+
<button
48+
type="button"
49+
onClick={this.onSendEmailVerification}
50+
disabled={this.state.isSent}
51+
>
52+
Send confirmation E-Mail
53+
</button>
54+
</div>
55+
) : (
56+
<Component {...this.props} />
57+
)
58+
}
59+
</AuthUserContext.Consumer>
60+
);
61+
}
62+
}
63+
64+
return withFirebase(WithEmailVerification);
65+
};
66+
67+
export default withEmailVerification;

src/components/SignUp/index.js

+3
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ class SignUpFormBase extends Component {
5656
roles,
5757
});
5858
})
59+
.then(() => {
60+
return this.props.firebase.doSendEmailVerification();
61+
})
5962
.then(() => {
6063
this.setState({ ...INITIAL_STATE });
6164
this.props.history.push(ROUTES.HOME);

0 commit comments

Comments
 (0)