@@ -20,23 +20,102 @@ const list = [
20
20
} ,
21
21
] ;
22
22
23
+ const isSearched = searchTerm => item =>
24
+ item . title . toLowerCase ( ) . includes ( searchTerm . toLowerCase ( ) ) ;
25
+
23
26
class App extends Component {
27
+ constructor ( props ) {
28
+ super ( props ) ;
29
+
30
+ this . state = {
31
+ list,
32
+ searchTerm : '' ,
33
+ } ;
34
+
35
+ this . onSearchChange = this . onSearchChange . bind ( this ) ;
36
+ this . onDismiss = this . onDismiss . bind ( this ) ;
37
+ }
38
+
39
+ onSearchChange ( event ) {
40
+ this . setState ( { searchTerm : event . target . value } ) ;
41
+ }
42
+
43
+ onDismiss ( id ) {
44
+ const isNotId = item => item . objectID !== id ;
45
+ const updatedList = this . state . list . filter ( isNotId ) ;
46
+ this . setState ( { list : updatedList } ) ;
47
+ }
48
+
24
49
render ( ) {
50
+ const { searchTerm, list } = this . state ;
25
51
return (
26
- < div className = "App" >
27
- { list . map ( item =>
28
- < div key = { item . objectID } >
29
- < span >
30
- < a href = { item . url } > { item . title } </ a >
31
- </ span >
32
- < span > { item . author } </ span >
33
- < span > { item . num_comments } </ span >
34
- < span > { item . points } </ span >
35
- </ div >
36
- ) }
52
+ < div className = "page" >
53
+ < div className = "interactions" >
54
+ < Search
55
+ value = { searchTerm }
56
+ onChange = { this . onSearchChange }
57
+ >
58
+ Search
59
+ </ Search >
60
+ </ div >
61
+ < Table
62
+ list = { list }
63
+ pattern = { searchTerm }
64
+ onDismiss = { this . onDismiss }
65
+ />
37
66
</ div >
38
67
) ;
39
68
}
40
69
}
41
70
71
+ const Search = ( { value, onChange, children } ) =>
72
+ < form >
73
+ { children } < input
74
+ type = "text"
75
+ value = { value }
76
+ onChange = { onChange }
77
+ />
78
+ </ form >
79
+
80
+ const Table = ( { list, pattern, onDismiss } ) =>
81
+ < div className = "table" >
82
+ { list . filter ( isSearched ( pattern ) ) . map ( item =>
83
+ < div key = { item . objectID } className = "table-row" >
84
+ < span style = { { width : '40%' } } >
85
+ < a href = { item . url } > { item . title } </ a >
86
+ </ span >
87
+ < span style = { { width : '30%' } } >
88
+ { item . author }
89
+ </ span >
90
+ < span style = { { width : '10%' } } >
91
+ { item . num_comments }
92
+ </ span >
93
+ < span style = { { width : '10%' } } >
94
+ { item . points }
95
+ </ span >
96
+ < span style = { { width : '10%' } } >
97
+ < Button
98
+ onClick = { ( ) => onDismiss ( item . objectID ) }
99
+ className = "button-inline"
100
+ >
101
+ Dismiss
102
+ </ Button >
103
+ </ span >
104
+ </ div >
105
+ ) }
106
+ </ div >
107
+
108
+ const Button = ( {
109
+ onClick,
110
+ className = '' ,
111
+ children,
112
+ } ) =>
113
+ < button
114
+ onClick = { onClick }
115
+ className = { className }
116
+ type = "button"
117
+ >
118
+ { children }
119
+ </ button >
120
+
42
121
export default App ;
0 commit comments