@@ -12,6 +12,7 @@ const Posts = () => {
12
12
const [ tagInput , setTagInput ] = useState ( '' ) ;
13
13
const [ filterTags , setFilterTags ] = useState < string [ ] > ( [ ] ) ;
14
14
const filterRef = useRef < HTMLDivElement > ( null ) ;
15
+ const [ searchQuery , setSearchQuery ] = useState ( '' ) ;
15
16
16
17
useEffect ( ( ) => {
17
18
const fetchPosts = async ( ) => {
@@ -64,11 +65,14 @@ const Posts = () => {
64
65
} ;
65
66
66
67
const filteredPosts = posts . filter ( post =>
67
- filterTags . every ( tag => post . tags . map ( t => t . toLowerCase ( ) ) . includes ( tag ) )
68
+ filterTags . every ( tag => post . tags . map ( t => t . toLowerCase ( ) ) . includes ( tag ) ) &&
69
+ ( post . title . toLowerCase ( ) . includes ( searchQuery . toLowerCase ( ) ) ||
70
+ post . description . toLowerCase ( ) . includes ( searchQuery . toLowerCase ( ) ) ||
71
+ post . author . username . toLowerCase ( ) . includes ( searchQuery . toLowerCase ( ) ) )
68
72
) ;
69
73
70
74
if ( loading ) {
71
- return < Loader /> ;
75
+ return < Loader /> ;
72
76
}
73
77
74
78
if ( error ) {
@@ -126,10 +130,17 @@ const Posts = () => {
126
130
</ div >
127
131
</ div >
128
132
) }
133
+ < input
134
+ type = "text"
135
+ value = { searchQuery }
136
+ onChange = { ( e ) => setSearchQuery ( e . target . value ) }
137
+ placeholder = "🔍 Search anything"
138
+ className = "p-2 w-full max-w-xs rounded-md bg-gray-700 text-white focus:outline-none focus:ring-2 focus:ring-blue-500"
139
+ />
129
140
</ div >
130
141
< div className = "grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-4 w-full" >
131
- { filteredPosts . map ( ( post ) => (
132
- < PostCard post = { post } />
142
+ { filteredPosts . map ( ( post , index ) => (
143
+ < PostCard key = { index } post = { post } />
133
144
) ) }
134
145
</ div >
135
146
</ div >
0 commit comments