Skip to content

Commit ee83c43

Browse files
committed
firebase class
1 parent 953c08f commit ee83c43

20 files changed

+307
-169
lines changed

package-lock.json

+64-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
"react": "^16.6.0",
88
"react-dom": "^16.6.0",
99
"react-router-dom": "^4.3.1",
10-
"react-scripts": "2.1.0"
10+
"react-scripts": "2.1.0",
11+
"recompose": "^0.30.0"
1112
},
1213
"scripts": {
1314
"start": "react-scripts start",

src/components/Admin/index.js

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

3-
import { db } from '../../firebase';
4+
import { withFirebase } from '../Firebase';
45
import * as ROLES from '../../constants/roles';
56
import withAuthorization from '../Session/withAuthorization';
67

@@ -18,13 +19,14 @@ class AdminPage extends Component {
1819
componentDidMount() {
1920
this.setState({ loading: true });
2021

21-
db.users()
22+
this.props.firebase
23+
.users()
2224
.once('value')
2325
.then(snapshot => {
2426
const usersObject = snapshot.val();
2527
const users = Object.keys(usersObject).map(key => ({
2628
...usersObject[key],
27-
id: key,
29+
uid: key,
2830
}));
2931

3032
this.setState(state => ({
@@ -36,15 +38,15 @@ class AdminPage extends Component {
3638
this.setState({ error: true, loading: false });
3739
});
3840

39-
db.users().on('child_removed', snapshot => {
41+
this.props.firebase.users().on('child_removed', snapshot => {
4042
this.setState(state => ({
41-
users: state.users.filter(user => user.id !== snapshot.key),
43+
users: state.users.filter(user => user.uid !== snapshot.key),
4244
}));
4345
});
4446
}
4547

4648
onRemove = userId => {
47-
db.user(userId).remove();
49+
this.props.firebase.user(userId).remove();
4850
};
4951

5052
render() {
@@ -69,9 +71,9 @@ class AdminPage extends Component {
6971
const UserList = ({ users, onRemove }) => (
7072
<ul>
7173
{users.map(user => (
72-
<li key={user.id}>
74+
<li key={user.uid}>
7375
<span>
74-
<strong>ID:</strong> {user.id}
76+
<strong>ID:</strong> {user.uid}
7577
</span>
7678
<span>
7779
<strong>E-Mail:</strong> {user.email}
@@ -83,7 +85,7 @@ const UserList = ({ users, onRemove }) => (
8385
<strong>Roles:</strong> {(user.roles || []).join('')}
8486
</span>
8587
<span>
86-
<button type="button" onClick={() => onRemove(user.id)}>
88+
<button type="button" onClick={() => onRemove(user.uid)}>
8789
Remove
8890
</button>
8991
</span>
@@ -95,4 +97,7 @@ const UserList = ({ users, onRemove }) => (
9597
const authCondition = authUser =>
9698
authUser && authUser.roles.includes(ROLES.ADMIN);
9799

98-
export default withAuthorization(authCondition)(AdminPage);
100+
export default compose(
101+
withAuthorization(authCondition),
102+
withFirebase,
103+
)(AdminPage);

src/components/Firebase/context.js

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import React from 'react';
2+
3+
const FirebaseContext = React.createContext(null);
4+
5+
export const withFirebase = Component => props => (
6+
<FirebaseContext.Consumer>
7+
{firebase => <Component {...props} firebase={firebase} />}
8+
</FirebaseContext.Consumer>
9+
);
10+
11+
export default FirebaseContext;

src/components/Firebase/firebase.js

+89
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import app from 'firebase/app';
2+
import 'firebase/auth';
3+
import 'firebase/database';
4+
5+
const prodConfig = {
6+
apiKey: process.env.REACT_APP_API_KEY,
7+
authDomain: process.env.REACT_APP_AUTH_DOMAIN,
8+
databaseURL: process.env.REACT_APP_DATABASE_URL,
9+
projectId: process.env.REACT_APP_PROJECT_ID,
10+
storageBucket: process.env.REACT_APP_STORAGE_BUCKET,
11+
messagingSenderId: process.env.REACT_APP_MESSAGING_SENDER_ID,
12+
};
13+
14+
const devConfig = {
15+
apiKey: process.env.REACT_APP_API_KEY,
16+
authDomain: process.env.REACT_APP_AUTH_DOMAIN,
17+
databaseURL: process.env.REACT_APP_DATABASE_URL,
18+
projectId: process.env.REACT_APP_PROJECT_ID,
19+
storageBucket: process.env.REACT_APP_STORAGE_BUCKET,
20+
messagingSenderId: process.env.REACT_APP_MESSAGING_SENDER_ID,
21+
};
22+
23+
const config =
24+
process.env.NODE_ENV === 'production' ? prodConfig : devConfig;
25+
26+
class Firebase {
27+
constructor() {
28+
app.initializeApp(config);
29+
30+
this.db = app.database();
31+
this.auth = app.auth();
32+
}
33+
34+
// *** Auth API ***
35+
36+
doCreateUserWithEmailAndPassword = (email, password) =>
37+
this.auth.createUserWithEmailAndPassword(email, password);
38+
39+
doSignInWithEmailAndPassword = (email, password) =>
40+
this.auth.signInWithEmailAndPassword(email, password);
41+
42+
doSignOut = () => this.auth.signOut();
43+
44+
doPasswordReset = email => this.auth.sendPasswordResetEmail(email);
45+
46+
doPasswordUpdate = password =>
47+
this.auth.currentUser.updatePassword(password);
48+
49+
// *** Merge Auth and DB User API *** //
50+
51+
onAuthUserListener = (next, fallback) =>
52+
this.auth.onAuthStateChanged(authUser => {
53+
if (authUser) {
54+
this.user(authUser.uid)
55+
.once('value')
56+
.then(snapshot => {
57+
const dbUser = snapshot.val();
58+
59+
// default empty roles
60+
if (!dbUser.roles) {
61+
dbUser.roles = [];
62+
}
63+
64+
// merge auth and db user
65+
authUser = {
66+
uid: authUser.uid,
67+
email: authUser.email,
68+
...dbUser,
69+
};
70+
71+
next(authUser);
72+
});
73+
} else {
74+
fallback();
75+
}
76+
});
77+
78+
// *** User API ***
79+
80+
user = uid => this.db.ref(`users/${uid}`);
81+
82+
users = () => this.db.ref('users');
83+
84+
// *** Message API ***
85+
86+
messages = () => this.db.ref('messages');
87+
}
88+
89+
export default Firebase;

src/components/Firebase/index.js

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import FirebaseContext, { withFirebase } from './context';
2+
import Firebase from './firebase';
3+
4+
export default Firebase;
5+
6+
export { FirebaseContext, withFirebase };

0 commit comments

Comments
 (0)