Skip to content

Commit d6c8265

Browse files
authored
Merge pull request #26 from the-road-to-react-with-firebase/deploy-security-rules
IMPORTANT: Deploy Security Rules
2 parents 076e79f + 8cb594e commit d6c8265

File tree

9 files changed

+44
-69
lines changed

9 files changed

+44
-69
lines changed

src/components/Admin/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ const AdminPage = () => (
2020
);
2121

2222
const condition = authUser =>
23-
authUser && authUser.roles.includes(ROLES.ADMIN);
23+
authUser && !!authUser.roles[ROLES.ADMIN];
2424

2525
export default compose(
2626
withEmailVerification,

src/components/Firebase/firebase.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ class Firebase {
7373

7474
// default empty roles
7575
if (!dbUser.roles) {
76-
dbUser.roles = [];
76+
dbUser.roles = {};
7777
}
7878

7979
// merge auth and db user

src/components/Home/index.js

+8-34
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,21 @@
1-
import React, { Component } from 'react';
1+
import React from 'react';
22
import { compose } from 'recompose';
33

44
import { withAuthorization, withEmailVerification } from '../Session';
5-
import { withFirebase } from '../Firebase';
65
import Messages from '../Messages';
76

8-
class HomePage extends Component {
9-
constructor(props) {
10-
super(props);
7+
const HomePage = () => (
8+
<div>
9+
<h1>Home Page</h1>
10+
<p>The Home Page is accessible by every signed in user.</p>
1111

12-
this.state = {
13-
users: null,
14-
};
15-
}
16-
17-
componentDidMount() {
18-
this.props.firebase.users().on('value', snapshot => {
19-
this.setState({
20-
users: snapshot.val(),
21-
});
22-
});
23-
}
24-
25-
componentWillUnmount() {
26-
this.props.firebase.users().off();
27-
}
28-
29-
render() {
30-
return (
31-
<div>
32-
<h1>Home Page</h1>
33-
<p>The Home Page is accessible by every signed in user.</p>
34-
35-
<Messages users={this.state.users} />
36-
</div>
37-
);
38-
}
39-
}
12+
<Messages />
13+
</div>
14+
);
4015

4116
const condition = authUser => !!authUser;
4217

4318
export default compose(
44-
withFirebase,
4519
withEmailVerification,
4620
withAuthorization(condition),
4721
)(HomePage);

src/components/Messages/MessageItem.js

+21-19
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class MessageItem extends Component {
2828
};
2929

3030
render() {
31-
const { message, onRemoveMessage } = this.props;
31+
const { authUser, message, onRemoveMessage } = this.props;
3232
const { editMode, editText } = this.state;
3333

3434
return (
@@ -41,29 +41,31 @@ class MessageItem extends Component {
4141
/>
4242
) : (
4343
<span>
44-
<strong>
45-
{message.user.username || message.user.userId}
46-
</strong>{' '}
47-
{message.text} {message.editedAt && <span>(Edited)</span>}
44+
<strong>{message.userId}</strong> {message.text}
45+
{message.editedAt && <span>(Edited)</span>}
4846
</span>
4947
)}
5048

51-
{editMode ? (
49+
{authUser.uid === message.userId && (
5250
<span>
53-
<button onClick={this.onSaveEditText}>Save</button>
54-
<button onClick={this.onToggleEditMode}>Reset</button>
55-
</span>
56-
) : (
57-
<button onClick={this.onToggleEditMode}>Edit</button>
58-
)}
51+
{editMode ? (
52+
<span>
53+
<button onClick={this.onSaveEditText}>Save</button>
54+
<button onClick={this.onToggleEditMode}>Reset</button>
55+
</span>
56+
) : (
57+
<button onClick={this.onToggleEditMode}>Edit</button>
58+
)}
5959

60-
{!editMode && (
61-
<button
62-
type="button"
63-
onClick={() => onRemoveMessage(message.uid)}
64-
>
65-
Delete
66-
</button>
60+
{!editMode && (
61+
<button
62+
type="button"
63+
onClick={() => onRemoveMessage(message.uid)}
64+
>
65+
Delete
66+
</button>
67+
)}
68+
</span>
6769
)}
6870
</li>
6971
);

src/components/Messages/MessageList.js

+2
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@ import React from 'react';
33
import MessageItem from './MessageItem';
44

55
const MessageList = ({
6+
authUser,
67
messages,
78
onEditMessage,
89
onRemoveMessage,
910
}) => (
1011
<ul>
1112
{messages.map(message => (
1213
<MessageItem
14+
authUser={authUser}
1315
key={message.uid}
1416
message={message}
1517
onEditMessage={onEditMessage}

src/components/Messages/Messages.js

+5-8
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,10 @@ class Messages extends Component {
6767
};
6868

6969
onEditMessage = (message, text) => {
70+
const { uid, ...messageSnapshot } = message;
71+
7072
this.props.firebase.message(message.uid).set({
71-
...message,
73+
...messageSnapshot,
7274
text,
7375
editedAt: this.props.firebase.serverValue.TIMESTAMP,
7476
});
@@ -86,7 +88,6 @@ class Messages extends Component {
8688
};
8789

8890
render() {
89-
const { users } = this.props;
9091
const { text, messages, loading } = this.state;
9192

9293
return (
@@ -103,12 +104,8 @@ class Messages extends Component {
103104

104105
{messages && (
105106
<MessageList
106-
messages={messages.map(message => ({
107-
...message,
108-
user: users
109-
? users[message.userId]
110-
: { userId: message.userId },
111-
}))}
107+
authUser={authUser}
108+
messages={messages}
112109
onEditMessage={this.onEditMessage}
113110
onRemoveMessage={this.onRemoveMessage}
114111
/>

src/components/Navigation/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ const NavigationAuth = ({ authUser }) => (
2929
<li>
3030
<Link to={ROUTES.ACCOUNT}>Account</Link>
3131
</li>
32-
{authUser.roles.includes(ROLES.ADMIN) && (
32+
{!!authUser.roles[ROLES.ADMIN] && (
3333
<li>
3434
<Link to={ROUTES.ADMIN}>Admin</Link>
3535
</li>

src/components/SignIn/index.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ class SignInGoogleBase extends Component {
108108
return this.props.firebase.user(socialAuthUser.user.uid).set({
109109
username: socialAuthUser.user.displayName,
110110
email: socialAuthUser.user.email,
111-
roles: [],
111+
roles: {},
112112
});
113113
})
114114
.then(() => {
@@ -154,7 +154,7 @@ class SignInFacebookBase extends Component {
154154
return this.props.firebase.user(socialAuthUser.user.uid).set({
155155
username: socialAuthUser.additionalUserInfo.profile.name,
156156
email: socialAuthUser.additionalUserInfo.profile.email,
157-
roles: [],
157+
roles: {},
158158
});
159159
})
160160
.then(() => {
@@ -200,7 +200,7 @@ class SignInTwitterBase extends Component {
200200
return this.props.firebase.user(socialAuthUser.user.uid).set({
201201
username: socialAuthUser.additionalUserInfo.profile.name,
202202
email: socialAuthUser.additionalUserInfo.profile.email,
203-
roles: [],
203+
roles: {},
204204
});
205205
})
206206
.then(() => {

src/components/SignUp/index.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,10 @@ class SignUpFormBase extends Component {
4141

4242
onSubmit = event => {
4343
const { username, email, passwordOne, isAdmin } = this.state;
44-
const roles = [];
44+
const roles = {};
4545

4646
if (isAdmin) {
47-
roles.push(ROLES.ADMIN);
47+
roles[ROLES.ADMIN] = ROLES.ADMIN;
4848
}
4949

5050
this.props.firebase

0 commit comments

Comments
 (0)