1
1
import React , { Component } from 'react' ;
2
+ import { connect } from 'react-redux' ;
2
3
import { compose } from 'recompose' ;
3
4
4
- import {
5
- AuthUserContext ,
6
- withAuthorization ,
7
- withEmailVerification ,
8
- } from '../Session' ;
5
+ import { withAuthorization , withEmailVerification } from '../Session' ;
9
6
import { withFirebase } from '../Firebase' ;
7
+ import Messages from '../Messages' ;
10
8
11
9
class HomePage extends Component {
12
- constructor ( props ) {
13
- super ( props ) ;
14
-
15
- this . state = {
16
- loading : false ,
17
- users : null ,
18
- } ;
19
- }
20
-
21
10
componentDidMount ( ) {
22
- this . setState ( { loading : true } ) ;
23
11
this . props . firebase . users ( ) . on ( 'value' , snapshot => {
24
- this . setState ( {
25
- users : snapshot . val ( ) ,
26
- loading : false ,
27
- } ) ;
12
+ this . props . onSetUsers ( snapshot . val ( ) ) ;
28
13
} ) ;
29
14
}
30
15
@@ -33,239 +18,35 @@ class HomePage extends Component {
33
18
}
34
19
35
20
render ( ) {
36
- const { users, loading } = this . state ;
21
+ const { users } = this . props ;
37
22
38
23
return (
39
24
< div >
40
25
< h1 > Home Page</ h1 >
41
26
< p > The Home Page is accessible by every signed in user.</ p >
42
27
43
- < Messages users = { users } usersLoading = { loading } />
28
+ < Messages users = { users } />
44
29
</ div >
45
30
) ;
46
31
}
47
32
}
48
33
49
- class MessagesBase extends Component {
50
- constructor ( props ) {
51
- super ( props ) ;
52
-
53
- this . state = {
54
- text : '' ,
55
- loading : false ,
56
- messages : [ ] ,
57
- limit : 5 ,
58
- } ;
59
- }
60
-
61
- componentDidMount ( ) {
62
- this . onListenForMessages ( ) ;
63
- }
64
-
65
- onListenForMessages = ( ) => {
66
- this . setState ( { loading : true } ) ;
67
-
68
- this . props . firebase
69
- . messages ( )
70
- . orderByChild ( 'createdAt' )
71
- . limitToLast ( this . state . limit )
72
- . on ( 'value' , snapshot => {
73
- const messageObject = snapshot . val ( ) ;
74
-
75
- if ( messageObject ) {
76
- const messageList = Object . keys ( messageObject ) . map ( key => ( {
77
- ...messageObject [ key ] ,
78
- uid : key ,
79
- } ) ) ;
80
-
81
- this . setState ( {
82
- messages : messageList ,
83
- loading : false ,
84
- } ) ;
85
- } else {
86
- this . setState ( { messages : null , loading : false } ) ;
87
- }
88
- } ) ;
89
- } ;
90
-
91
- componentWillUnmount ( ) {
92
- this . props . firebase . messages ( ) . off ( ) ;
93
- }
94
-
95
- onChangeText = event => {
96
- this . setState ( { text : event . target . value } ) ;
97
- } ;
98
-
99
- onCreateMessage = ( event , authUser ) => {
100
- this . props . firebase . messages ( ) . push ( {
101
- text : this . state . text ,
102
- userId : authUser . uid ,
103
- createdAt : this . props . firebase . serverValue . TIMESTAMP ,
104
- } ) ;
105
-
106
- this . setState ( { text : '' } ) ;
107
-
108
- event . preventDefault ( ) ;
109
- } ;
110
-
111
- onEditMessage = ( message , text ) => {
112
- this . props . firebase . message ( message . uid ) . set ( {
113
- ...message ,
114
- text,
115
- editedAt : this . props . firebase . serverValue . TIMESTAMP ,
116
- } ) ;
117
- } ;
118
-
119
- onRemoveMessage = uid => {
120
- this . props . firebase . message ( uid ) . remove ( ) ;
121
- } ;
122
-
123
- onNextPage = ( ) => {
124
- this . setState (
125
- state => ( { limit : state . limit + 5 } ) ,
126
- this . onListenForMessages ,
127
- ) ;
128
- } ;
129
-
130
- render ( ) {
131
- const { users, usersLoading } = this . props ;
132
- const { text, messages, loading } = this . state ;
133
-
134
- return (
135
- < AuthUserContext . Consumer >
136
- { authUser => (
137
- < div >
138
- { ! loading && messages && (
139
- < button type = "button" onClick = { this . onNextPage } >
140
- More
141
- </ button >
142
- ) }
143
-
144
- { loading && usersLoading && < div > Loading ...</ div > }
145
-
146
- { users && messages && (
147
- < MessageList
148
- messages = { messages . map ( message => ( {
149
- ...message ,
150
- user : users [ message . userId ] ,
151
- } ) ) }
152
- onEditMessage = { this . onEditMessage }
153
- onRemoveMessage = { this . onRemoveMessage }
154
- />
155
- ) }
156
-
157
- { ! messages && < div > There are no messages ...</ div > }
158
-
159
- < form
160
- onSubmit = { event =>
161
- this . onCreateMessage ( event , authUser )
162
- }
163
- >
164
- < input
165
- type = "text"
166
- value = { text }
167
- onChange = { this . onChangeText }
168
- />
169
- < button type = "submit" > Send</ button >
170
- </ form >
171
- </ div >
172
- ) }
173
- </ AuthUserContext . Consumer >
174
- ) ;
175
- }
176
- }
177
-
178
- const MessageList = ( {
179
- messages,
180
- onEditMessage,
181
- onRemoveMessage,
182
- } ) => (
183
- < ul >
184
- { messages . map ( message => (
185
- < MessageItem
186
- key = { message . uid }
187
- message = { message }
188
- onEditMessage = { onEditMessage }
189
- onRemoveMessage = { onRemoveMessage }
190
- />
191
- ) ) }
192
- </ ul >
193
- ) ;
194
-
195
- class MessageItem extends Component {
196
- constructor ( props ) {
197
- super ( props ) ;
198
-
199
- this . state = {
200
- editMode : false ,
201
- editText : this . props . message . text ,
202
- } ;
203
- }
204
-
205
- onToggleEditMode = ( ) => {
206
- this . setState ( state => ( {
207
- editMode : ! state . editMode ,
208
- editText : this . props . message . text ,
209
- } ) ) ;
210
- } ;
211
-
212
- onChangeEditText = event => {
213
- this . setState ( { editText : event . target . value } ) ;
214
- } ;
215
-
216
- onSaveEditText = ( ) => {
217
- this . props . onEditMessage ( this . props . message , this . state . editText ) ;
218
-
219
- this . setState ( { editMode : false } ) ;
220
- } ;
221
-
222
- render ( ) {
223
- const { message, onRemoveMessage } = this . props ;
224
- const { editMode, editText } = this . state ;
225
-
226
- return (
227
- < li >
228
- { editMode ? (
229
- < input
230
- type = "text"
231
- value = { editText }
232
- onChange = { this . onChangeEditText }
233
- />
234
- ) : (
235
- < span >
236
- < strong > { message . user . username } </ strong > { message . text } { ' ' }
237
- { message . editedAt && < span > (Edited)</ span > }
238
- </ span >
239
- ) }
240
-
241
- { editMode ? (
242
- < span >
243
- < button onClick = { this . onSaveEditText } > Save</ button >
244
- < button onClick = { this . onToggleEditMode } > Reset</ button >
245
- </ span >
246
- ) : (
247
- < button onClick = { this . onToggleEditMode } > Edit</ button >
248
- ) }
249
-
250
- { ! editMode && (
251
- < button
252
- type = "button"
253
- onClick = { ( ) => onRemoveMessage ( message . uid ) }
254
- >
255
- Delete
256
- </ button >
257
- ) }
258
- </ li >
259
- ) ;
260
- }
261
- }
34
+ const mapStateToProps = state => ( {
35
+ users : state . userState . users ,
36
+ } ) ;
262
37
263
- const Messages = withFirebase ( MessagesBase ) ;
38
+ const mapDispatchToProps = dispatch => ( {
39
+ onSetUsers : users => dispatch ( { type : 'USERS_SET' , users } ) ,
40
+ } ) ;
264
41
265
42
const condition = authUser => ! ! authUser ;
266
43
267
44
export default compose (
268
45
withFirebase ,
46
+ connect (
47
+ mapStateToProps ,
48
+ mapDispatchToProps ,
49
+ ) ,
269
50
withEmailVerification ,
270
51
withAuthorization ( condition ) ,
271
52
) ( HomePage ) ;
0 commit comments