@@ -21,6 +21,27 @@ const SORTS = {
21
21
POINTS : list => sortBy ( list , 'points' ) . reverse ( ) ,
22
22
} ;
23
23
24
+ const updateSearchTopStoriesState = ( hits , page ) => ( prevState ) => {
25
+ const { searchKey, results } = prevState ;
26
+
27
+ const oldHits = results && results [ searchKey ]
28
+ ? results [ searchKey ] . hits
29
+ : [ ] ;
30
+
31
+ const updatedHits = [
32
+ ...oldHits ,
33
+ ...hits
34
+ ] ;
35
+
36
+ return {
37
+ results : {
38
+ ...results ,
39
+ [ searchKey ] : { hits : updatedHits , page }
40
+ } ,
41
+ isLoading : false
42
+ } ;
43
+ } ;
44
+
24
45
class App extends Component {
25
46
constructor ( props ) {
26
47
super ( props ) ;
@@ -31,8 +52,6 @@ class App extends Component {
31
52
searchTerm : DEFAULT_QUERY ,
32
53
error : null ,
33
54
isLoading : false ,
34
- sortKey : 'NONE' ,
35
- isSortReverse : false ,
36
55
} ;
37
56
38
57
this . needsToSearchTopStories = this . needsToSearchTopStories . bind ( this ) ;
@@ -41,12 +60,6 @@ class App extends Component {
41
60
this . onSearchChange = this . onSearchChange . bind ( this ) ;
42
61
this . onSearchSubmit = this . onSearchSubmit . bind ( this ) ;
43
62
this . onDismiss = this . onDismiss . bind ( this ) ;
44
- this . onSort = this . onSort . bind ( this ) ;
45
- }
46
-
47
- onSort ( sortKey ) {
48
- const isSortReverse = this . state . sortKey === sortKey && ! this . state . isSortReverse ;
49
- this . setState ( { sortKey, isSortReverse } ) ;
50
63
}
51
64
52
65
needsToSearchTopStories ( searchTerm ) {
@@ -55,24 +68,7 @@ class App extends Component {
55
68
56
69
setSearchTopStories ( result ) {
57
70
const { hits, page } = result ;
58
- const { searchKey, results } = this . state ;
59
-
60
- const oldHits = results && results [ searchKey ]
61
- ? results [ searchKey ] . hits
62
- : [ ] ;
63
-
64
- const updatedHits = [
65
- ...oldHits ,
66
- ...hits
67
- ] ;
68
-
69
- this . setState ( {
70
- results : {
71
- ...results ,
72
- [ searchKey ] : { hits : updatedHits , page }
73
- } ,
74
- isLoading : false
75
- } ) ;
71
+ this . setState ( updateSearchTopStoriesState ( hits , page ) ) ;
76
72
}
77
73
78
74
fetchSearchTopStories ( searchTerm , page = 0 ) {
@@ -126,9 +122,7 @@ class App extends Component {
126
122
results,
127
123
searchKey,
128
124
error,
129
- isLoading,
130
- sortKey,
131
- isSortReverse
125
+ isLoading
132
126
} = this . state ;
133
127
134
128
const page = (
@@ -160,9 +154,6 @@ class App extends Component {
160
154
</ div >
161
155
: < Table
162
156
list = { list }
163
- sortKey = { sortKey }
164
- isSortReverse = { isSortReverse }
165
- onSort = { this . onSort }
166
157
onDismiss = { this . onDismiss }
167
158
/>
168
159
}
@@ -195,87 +186,109 @@ const Search = ({
195
186
</ button >
196
187
</ form >
197
188
198
- const Table = ( {
199
- list,
200
- sortKey,
201
- isSortReverse,
202
- onSort,
203
- onDismiss
204
- } ) => {
205
- const sortedList = SORTS [ sortKey ] ( list ) ;
206
- const reverseSortedList = isSortReverse
207
- ? sortedList . reverse ( )
208
- : sortedList ;
209
-
210
- return (
211
- < div className = "table" >
212
- < div className = "table-header" >
213
- < span style = { { width : '40%' } } >
214
- < Sort
215
- sortKey = { 'TITLE' }
216
- onSort = { onSort }
217
- activeSortKey = { sortKey }
218
- >
219
- Title
220
- </ Sort >
221
- </ span >
222
- < span style = { { width : '30%' } } >
223
- < Sort
224
- sortKey = { 'AUTHOR' }
225
- onSort = { onSort }
226
- activeSortKey = { sortKey }
227
- >
228
- Author
229
- </ Sort >
230
- </ span >
231
- < span style = { { width : '10%' } } >
232
- < Sort
233
- sortKey = { 'COMMENTS' }
234
- onSort = { onSort }
235
- activeSortKey = { sortKey }
236
- >
237
- Comments
238
- </ Sort >
239
- </ span >
240
- < span style = { { width : '10%' } } >
241
- < Sort
242
- sortKey = { 'POINTS' }
243
- onSort = { onSort }
244
- activeSortKey = { sortKey }
245
- >
246
- Points
247
- </ Sort >
248
- </ span >
249
- < span style = { { width : '10%' } } >
250
- Archive
251
- </ span >
252
- </ div >
253
- { reverseSortedList . map ( item =>
254
- < div key = { item . objectID } className = "table-row" >
189
+ class Table extends Component {
190
+ constructor ( props ) {
191
+ super ( props ) ;
192
+
193
+ this . state = {
194
+ sortKey : 'NONE' ,
195
+ isSortReverse : false ,
196
+ } ;
197
+
198
+ this . onSort = this . onSort . bind ( this ) ;
199
+ }
200
+
201
+ onSort ( sortKey ) {
202
+ const isSortReverse = this . state . sortKey === sortKey && ! this . state . isSortReverse ;
203
+ this . setState ( { sortKey, isSortReverse } ) ;
204
+ }
205
+
206
+ render ( ) {
207
+ const {
208
+ list,
209
+ onDismiss
210
+ } = this . props ;
211
+
212
+ const {
213
+ sortKey,
214
+ isSortReverse,
215
+ } = this . state ;
216
+
217
+ const sortedList = SORTS [ sortKey ] ( list ) ;
218
+ const reverseSortedList = isSortReverse
219
+ ? sortedList . reverse ( )
220
+ : sortedList ;
221
+
222
+ return (
223
+ < div className = "table" >
224
+ < div className = "table-header" >
255
225
< span style = { { width : '40%' } } >
256
- < a href = { item . url } > { item . title } </ a >
226
+ < Sort
227
+ sortKey = { 'TITLE' }
228
+ onSort = { this . onSort }
229
+ activeSortKey = { sortKey }
230
+ >
231
+ Title
232
+ </ Sort >
257
233
</ span >
258
234
< span style = { { width : '30%' } } >
259
- { item . author }
235
+ < Sort
236
+ sortKey = { 'AUTHOR' }
237
+ onSort = { this . onSort }
238
+ activeSortKey = { sortKey }
239
+ >
240
+ Author
241
+ </ Sort >
260
242
</ span >
261
243
< span style = { { width : '10%' } } >
262
- { item . num_comments }
244
+ < Sort
245
+ sortKey = { 'COMMENTS' }
246
+ onSort = { this . onSort }
247
+ activeSortKey = { sortKey }
248
+ >
249
+ Comments
250
+ </ Sort >
263
251
</ span >
264
252
< span style = { { width : '10%' } } >
265
- { item . points }
253
+ < Sort
254
+ sortKey = { 'POINTS' }
255
+ onSort = { this . onSort }
256
+ activeSortKey = { sortKey }
257
+ >
258
+ Points
259
+ </ Sort >
266
260
</ span >
267
261
< span style = { { width : '10%' } } >
268
- < Button
269
- onClick = { ( ) => onDismiss ( item . objectID ) }
270
- className = "button-inline"
271
- >
272
- Dismiss
273
- </ Button >
262
+ Archive
274
263
</ span >
275
264
</ div >
276
- ) }
277
- </ div >
278
- ) ;
265
+ { reverseSortedList . map ( item =>
266
+ < div key = { item . objectID } className = "table-row" >
267
+ < span style = { { width : '40%' } } >
268
+ < a href = { item . url } > { item . title } </ a >
269
+ </ span >
270
+ < span style = { { width : '30%' } } >
271
+ { item . author }
272
+ </ span >
273
+ < span style = { { width : '10%' } } >
274
+ { item . num_comments }
275
+ </ span >
276
+ < span style = { { width : '10%' } } >
277
+ { item . points }
278
+ </ span >
279
+ < span style = { { width : '10%' } } >
280
+ < Button
281
+ onClick = { ( ) => onDismiss ( item . objectID ) }
282
+ className = "button-inline"
283
+ >
284
+ Dismiss
285
+ </ Button >
286
+ </ span >
287
+ </ div >
288
+ ) }
289
+ </ div >
290
+ ) ;
291
+ }
279
292
}
280
293
281
294
const Sort = ( {
0 commit comments