@@ -12,6 +12,7 @@ const LogsPage = () => {
1212 const [ loading , setLoading ] = useState ( true ) ;
1313 const [ hiddenLegends , setHiddenLegends ] = useState ( [ ] ) ;
1414 const [ allCategoriesSelected , setAllCategoriesSelected ] = useState ( true ) ;
15+ const [ searchQuery , setSearchQuery ] = useState ( '' ) ;
1516
1617 const handleToggleAllCategories = ( ) => {
1718 if ( allCategoriesSelected ) {
@@ -47,9 +48,13 @@ const LogsPage = () => {
4748
4849 useEffect ( ( ) => {
4950 setFilteredLogs (
50- logs . filter ( ( log ) => ! hiddenLegends . includes ( log . category ) ) ,
51+ logs . filter (
52+ ( log ) =>
53+ ! hiddenLegends . includes ( log . category ) &&
54+ log . title . toLowerCase ( ) . includes ( searchQuery . toLowerCase ( ) ) ,
55+ ) ,
5156 ) ;
52- } , [ logs , hiddenLegends ] ) ;
57+ } , [ logs , hiddenLegends , searchQuery ] ) ;
5358
5459 useEffect ( ( ) => {
5560 const fetchLogs = async ( ) => {
@@ -104,58 +109,66 @@ const LogsPage = () => {
104109 >
105110 < ArrowLeftIcon size = { 24 } /> Back to Home
106111 </ Link >
107- < h1 className = "text-4xl font-bold tracking-tight text-primary-400 sm:text-6xl mb-4 flex items-center" >
108- Logs
109- </ h1 >
110- < div
111- className = "relative flex justify-center items-center w-full cursor-pointer"
112- onClick = { ( ) => setShowLegends ( ! showLegends ) }
113- >
114- < hr className = "border-gray-700 w-full absolute top-1/2 -translate-y-1/2" />
115- < div className = "relative border border-gray-700 bg-gray-900 px-4 z-10" >
116- { showLegends ? (
117- < CaretUp size = { 32 } className = "text-primary-400" />
118- ) : (
119- < CaretDown size = { 32 } className = "text-primary-400" />
120- ) }
121- </ div >
122- </ div >
123- { showLegends && (
124- < div className = "mx-auto p-6 border border-gray-700 shadow-lg text-center bg-gray-900 opacity-80 mt-[-16px] mb-8" >
125- < h2 className = "mb-[-16px] text-xl font-light tracking-tight text-white" >
126- Categories
127- </ h2 >
128- < ColorLegends
129- onLegendClick = { handleLegendClick }
130- hiddenLegends = { hiddenLegends }
131- />
132- < div className = "flex items-center justify-center mt-4" >
133- < span className = "mr-2 text-white text-sm" > Disable All</ span >
134- < label
135- htmlFor = "toggle-all-categories"
136- className = "flex items-center cursor-pointer"
137- >
138- < div className = "relative" >
139- < input
140- type = "checkbox"
141- id = "toggle-all-categories"
142- className = "sr-only"
143- checked = { allCategoriesSelected }
144- onChange = { handleToggleAllCategories }
145- />
146- < div
147- className = { `block w-10 h-6 rounded-full ${ allCategoriesSelected ? 'bg-blue-500' : 'bg-gray-600' } ` }
148- > </ div >
149- < div
150- className = { `dot absolute left-1 top-1 bg-white w-4 h-4 rounded-full transition ${ allCategoriesSelected ? 'translate-x-4 bg-primary-500' : '' } ` }
151- > </ div >
112+ < h1 className = "text-4xl font-bold tracking-tight text-primary-400 sm:text-6xl mb-4 flex items-center" >
113+ Logs
114+ </ h1 >
115+ < div
116+ className = "relative flex justify-center items-center w-full cursor-pointer"
117+ onClick = { ( ) => setShowLegends ( ! showLegends ) }
118+ >
119+ < hr className = "border-gray-700 w-full absolute top-1/2 -translate-y-1/2" />
120+ < div className = "relative border border-gray-700 bg-gray-900 px-4 z-10" >
121+ { showLegends ? (
122+ < CaretUp size = { 32 } className = "text-primary-400" />
123+ ) : (
124+ < CaretDown size = { 32 } className = "text-primary-400" />
125+ ) }
126+ </ div >
152127 </ div >
153- </ label >
154- < span className = "ml-2 text-white text-sm" > Enable All</ span >
155- </ div >
156- </ div >
157- ) }
158- < div
128+ { showLegends && (
129+ < div className = "mx-auto p-6 border border-gray-700 shadow-lg text-center bg-gray-900 opacity-80 mt-[-16px] mb-8" >
130+ < h2 className = "mt-4 mb-[-16px] text-xl font-light tracking-tight text-white" >
131+ Categories
132+ </ h2 >
133+ < ColorLegends
134+ onLegendClick = { handleLegendClick }
135+ hiddenLegends = { hiddenLegends }
136+ />
137+ < div className = "flex items-center justify-center mt-4" >
138+ < span className = "mr-2 text-white text-sm" > Disable All</ span >
139+ < label
140+ htmlFor = "toggle-all-categories"
141+ className = "flex items-center cursor-pointer"
142+ >
143+ < div className = "relative" >
144+ < input
145+ type = "checkbox"
146+ id = "toggle-all-categories"
147+ className = "sr-only"
148+ checked = { allCategoriesSelected }
149+ onChange = { handleToggleAllCategories }
150+ />
151+ < div
152+ className = { `block w-10 h-6 rounded-full ${ allCategoriesSelected ? 'bg-blue-500' : 'bg-gray-600' } ` }
153+ > </ div >
154+ < div
155+ className = { `dot absolute left-1 top-1 bg-white w-4 h-4 rounded-full transition ${ allCategoriesSelected ? 'translate-x-4 bg-primary-500' : '' } ` }
156+ > </ div >
157+ </ div >
158+ </ label >
159+ < span className = "ml-2 text-white text-sm" > Enable All</ span >
160+ </ div >
161+ < div className = "flex items-center justify-center mt-8 mb-4 ml-4 mr-4" >
162+ < input
163+ type = "text"
164+ placeholder = "Search logs by title..."
165+ className = "w-full p-3 border border-gray-700 rounded-md bg-gray-800 text-white placeholder-gray-500 focus:outline-none focus:border-primary-400"
166+ value = { searchQuery }
167+ onChange = { ( e ) => setSearchQuery ( e . target . value ) }
168+ />
169+ </ div >
170+ </ div >
171+ ) } < div
159172 className = { `grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8 ${ ! showLegends ? 'mt-8' : '' } ` }
160173 >
161174 { filteredLogs . map ( ( log ) => (
0 commit comments