Skip to content

Commit b1ae960

Browse files
committed
Migrate to firestore
1 parent ddcabe8 commit b1ae960

File tree

8 files changed

+70
-60
lines changed

8 files changed

+70
-60
lines changed

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/Firebase/firebase.js

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import app from 'firebase/app';
22
import 'firebase/auth';
33
import 'firebase/database';
4+
import 'firebase/firestore';
45

56
const config = {
67
apiKey: process.env.REACT_APP_API_KEY,
@@ -17,13 +18,17 @@ class Firebase {
1718

1819
/* Helper */
1920

20-
this.serverValue = app.database.ServerValue;
21+
this.fieldValue = app.firestore.FieldValue;
2122
this.emailAuthProvider = app.auth.EmailAuthProvider;
2223

2324
/* Firebase APIs */
2425

2526
this.auth = app.auth();
26-
this.db = app.database();
27+
28+
/* FireStore */
29+
this.db = app.firestore();
30+
const settings = { timestampsInSnapshots: true};
31+
this.db.settings(settings);
2732

2833
/* Social Sign In Method Provider */
2934

@@ -67,9 +72,9 @@ class Firebase {
6772
this.auth.onAuthStateChanged(authUser => {
6873
if (authUser) {
6974
this.user(authUser.uid)
70-
.once('value')
75+
.get()
7176
.then(snapshot => {
72-
const dbUser = snapshot.val();
77+
const dbUser = snapshot.data() || {};
7378

7479
// default empty roles
7580
if (!dbUser.roles) {
@@ -94,15 +99,15 @@ class Firebase {
9499

95100
// *** User API ***
96101

97-
user = uid => this.db.ref(`users/${uid}`);
102+
user = uid => this.db.doc(`users/${uid}`);
98103

99-
users = () => this.db.ref('users');
104+
users = () => this.db.collection('users');
100105

101106
// *** Message API ***
102107

103-
message = uid => this.db.ref(`messages/${uid}`);
108+
message = uid => this.db.doc(`messages/${uid}`);
104109

105-
messages = () => this.db.ref('messages');
110+
messages = () => this.db.collection('messages');
106111
}
107112

108113
export default Firebase;

src/components/Home/index.js

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,24 @@ class HomePage extends Component {
1212
this.state = {
1313
users: null,
1414
};
15+
this.unsubscribe = null;
1516
}
1617

1718
componentDidMount() {
18-
this.props.firebase.users().on('value', snapshot => {
19-
this.setState({
20-
users: snapshot.val(),
19+
this.unsubscribe = this.props.firebase
20+
.users()
21+
.onSnapshot(snapshot => {
22+
let users = {};
23+
snapshot.forEach(doc => (users[doc.id] = doc.data()));
24+
25+
this.setState({
26+
users: users,
27+
});
2128
});
22-
});
2329
}
2430

2531
componentWillUnmount() {
26-
this.props.firebase.users().off();
32+
this.unsubscribe && this.unsubscribe();
2733
}
2834

2935
render() {

src/components/Messages/Messages.js

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class Messages extends Component {
1414
messages: [],
1515
limit: 5,
1616
};
17+
this.unsubscribe = null;
1718
}
1819

1920
componentDidMount() {
@@ -23,42 +24,37 @@ class Messages extends Component {
2324
onListenForMessages = () => {
2425
this.setState({ loading: true });
2526

26-
this.props.firebase
27+
this.unsubscribe = this.props.firebase
2728
.messages()
28-
.orderByChild('createdAt')
29-
.limitToLast(this.state.limit)
30-
.on('value', snapshot => {
31-
const messageObject = snapshot.val();
32-
33-
if (messageObject) {
34-
const messageList = Object.keys(messageObject).map(key => ({
35-
...messageObject[key],
36-
uid: key,
37-
}));
38-
39-
this.setState({
40-
messages: messageList,
41-
loading: false,
42-
});
43-
} else {
44-
this.setState({ messages: null, loading: false });
45-
}
29+
.orderBy('createdAt', 'desc')
30+
.limit(this.state.limit) // firestore doesn't have limitLast, so we use combination of order desc and limit
31+
.onSnapshot(snapshot => {
32+
let messageList = [];
33+
34+
snapshot.forEach(doc =>
35+
messageList.push({ ...doc.data(), uid: doc.id }),
36+
);
37+
38+
this.setState({
39+
messages: messageList.reverse(),
40+
loading: false,
41+
});
4642
});
4743
};
4844

4945
componentWillUnmount() {
50-
this.props.firebase.messages().off();
46+
this.unsubscribe && this.unsubscribe();
5147
}
5248

5349
onChangeText = event => {
5450
this.setState({ text: event.target.value });
5551
};
5652

5753
onCreateMessage = (event, authUser) => {
58-
this.props.firebase.messages().push({
54+
this.props.firebase.messages().add({
5955
text: this.state.text,
6056
userId: authUser.uid,
61-
createdAt: this.props.firebase.serverValue.TIMESTAMP,
57+
createdAt: this.props.firebase.fieldValue.serverTimestamp(),
6258
});
6359

6460
this.setState({ text: '' });
@@ -67,15 +63,15 @@ class Messages extends Component {
6763
};
6864

6965
onEditMessage = (message, text) => {
70-
this.props.firebase.message(message.uid).set({
66+
this.props.firebase.message(message.uid).update({
7167
...message,
7268
text,
73-
editedAt: this.props.firebase.serverValue.TIMESTAMP,
69+
editedAt: this.props.firebase.fieldValue.serverTimestamp(),
7470
});
7571
};
7672

7773
onRemoveMessage = uid => {
78-
this.props.firebase.message(uid).remove();
74+
this.props.firebase.message(uid).delete();
7975
};
8076

8177
onNextPage = () => {
@@ -106,7 +102,7 @@ class Messages extends Component {
106102
messages={messages.map(message => ({
107103
...message,
108104
user: users
109-
? users[message.userId]
105+
? users[message.userId] || {}
110106
: { userId: message.userId },
111107
}))}
112108
onEditMessage={this.onEditMessage}

src/components/SignIn/index.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ class SignInGoogleBase extends Component {
105105
.doSignInWithGoogle()
106106
.then(socialAuthUser => {
107107
// Create a user in your Firebase Realtime Database too
108-
return this.props.firebase.user(socialAuthUser.user.uid).set({
108+
return this.props.firebase.user(socialAuthUser.user.uid).update({
109109
username: socialAuthUser.user.displayName,
110110
email: socialAuthUser.user.email,
111111
roles: [],
@@ -151,7 +151,7 @@ class SignInFacebookBase extends Component {
151151
.doSignInWithFacebook()
152152
.then(socialAuthUser => {
153153
// Create a user in your Firebase Realtime Database too
154-
return this.props.firebase.user(socialAuthUser.user.uid).set({
154+
return this.props.firebase.user(socialAuthUser.user.uid).update({
155155
username: socialAuthUser.additionalUserInfo.profile.name,
156156
email: socialAuthUser.additionalUserInfo.profile.email,
157157
roles: [],
@@ -197,7 +197,7 @@ class SignInTwitterBase extends Component {
197197
.doSignInWithTwitter()
198198
.then(socialAuthUser => {
199199
// Create a user in your Firebase Realtime Database too
200-
return this.props.firebase.user(socialAuthUser.user.uid).set({
200+
return this.props.firebase.user(socialAuthUser.user.uid).update({
201201
username: socialAuthUser.additionalUserInfo.profile.name,
202202
email: socialAuthUser.additionalUserInfo.profile.email,
203203
roles: [],

src/components/SignUp/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ class SignUpFormBase extends Component {
5050
.doCreateUserWithEmailAndPassword(email, passwordOne)
5151
.then(authUser => {
5252
// Create a user in your Firebase realtime database
53-
return this.props.firebase.user(authUser.user.uid).set({
53+
return this.props.firebase.user(authUser.user.uid).update({
5454
username,
5555
email,
5656
roles,

src/components/Users/UserItem.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ class UserItem extends Component {
1111
user: null,
1212
...props.location.state,
1313
};
14+
this.unsubscribe = null;
1415
}
1516

1617
componentDidMount() {
@@ -20,18 +21,18 @@ class UserItem extends Component {
2021

2122
this.setState({ loading: true });
2223

23-
this.props.firebase
24+
this.unsubscribe = this.props.firebase
2425
.user(this.props.match.params.id)
25-
.on('value', snapshot => {
26+
.onSnapshot(snapshot => {
2627
this.setState({
27-
user: snapshot.val(),
28+
user: snapshot.data(),
2829
loading: false,
2930
});
3031
});
3132
}
3233

3334
componentWillUnmount() {
34-
this.props.firebase.user(this.props.match.params.id).off();
35+
this.unsubscribe && this.unsubscribe();
3536
}
3637

3738
onSendPasswordResetEmail = () => {

src/components/Users/UserList.js

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,28 +12,30 @@ class UserList extends Component {
1212
loading: false,
1313
users: [],
1414
};
15+
this.unsubscribe = null;
1516
}
1617

1718
componentDidMount() {
1819
this.setState({ loading: true });
1920

20-
this.props.firebase.users().on('value', snapshot => {
21-
const usersObject = snapshot.val();
21+
this.unsubscribe = this.props.firebase
22+
.users()
23+
.onSnapshot(snapshot => {
24+
let usersList = [];
2225

23-
const usersList = Object.keys(usersObject).map(key => ({
24-
...usersObject[key],
25-
uid: key,
26-
}));
26+
snapshot.forEach(doc =>
27+
usersList.push({ ...doc.data(), uid: doc.id }),
28+
);
2729

28-
this.setState({
29-
users: usersList,
30-
loading: false,
30+
this.setState({
31+
users: usersList,
32+
loading: false,
33+
});
3134
});
32-
});
3335
}
3436

3537
componentWillUnmount() {
36-
this.props.firebase.users().off();
38+
this.unsubscribe && this.unsubscribe();
3739
}
3840

3941
render() {

0 commit comments

Comments
 (0)