@@ -43,27 +43,36 @@ function SideBar({
4343 years : string [ ] ,
4444 campus : string [ ] ,
4545 semester : string [ ] ,
46- anskey : boolean ,
46+ anskey : boolean
4747 ) => void ;
4848 handleSelectAll : ( ) => void ;
4949 handleDeselectAll : ( ) => void ;
5050 handleDownloadSelected : ( ) => void ;
5151} ) {
52+ const Button : React . FC < {
53+ onClick : ( ) => void ;
54+ selected ?: boolean ;
55+ className ?: string ;
56+ children : React . ReactNode ;
57+ } > = ( { onClick, selected = false , className, children } ) => (
58+ < div
59+ onClick = { onClick }
60+ className = { `cursor-pointer rounded-full border-2 px-2 py-1 font-play text-xs font-semibold ${
61+ selected
62+ ? "border-[#B2B8FF] bg-[#B2B8FF] text-black dark:border-[#434dba] dark:bg-[#434dba] dark:text-white"
63+ : "border-black hover:bg-[#B2B8FF] hover:text-black dark:border-white dark:hover:border-[#434dba] dark:hover:bg-[#434dba] dark:hover:text-white"
64+ } ${ className ?? "" } `}
65+ >
66+ { children }
67+ </ div >
68+ ) ;
69+
5270 const exams =
53- filterOptions ?. unique_exams . map ( ( exam ) => ( {
54- label : exam ,
55- value : exam ,
56- } ) ) ?? [ ] ;
71+ filterOptions ?. unique_exams . map ( ( exam ) => ( { label : exam , value : exam } ) ) ?? [ ] ;
5772 const slots =
58- filterOptions ?. unique_slots . map ( ( slot ) => ( {
59- label : slot ,
60- value : slot ,
61- } ) ) ?? [ ] ;
73+ filterOptions ?. unique_slots . map ( ( slot ) => ( { label : slot , value : slot } ) ) ?? [ ] ;
6274 const years =
63- filterOptions ?. unique_years . map ( ( year ) => ( {
64- label : year ,
65- value : year ,
66- } ) ) ?? [ ] ;
75+ filterOptions ?. unique_years . map ( ( year ) => ( { label : year , value : year } ) ) ?? [ ] ;
6776 const semesters =
6877 filterOptions ?. unique_semesters . map ( ( semester ) => ( {
6978 label : semester ,
@@ -82,7 +91,7 @@ function SideBar({
8291 selectedYears ,
8392 selectedCampuses ,
8493 selectedSemesters ,
85- selectedAnswerKeyIncluded ,
94+ selectedAnswerKeyIncluded
8695 ) ,
8796 } ,
8897 {
@@ -96,7 +105,7 @@ function SideBar({
96105 selectedYears ,
97106 selectedCampuses ,
98107 selectedSemesters ,
99- selectedAnswerKeyIncluded ,
108+ selectedAnswerKeyIncluded
100109 ) ,
101110 } ,
102111 {
@@ -110,7 +119,7 @@ function SideBar({
110119 newVal ,
111120 selectedCampuses ,
112121 selectedSemesters ,
113- selectedAnswerKeyIncluded ,
122+ selectedAnswerKeyIncluded
114123 ) ,
115124 } ,
116125 {
@@ -124,72 +133,48 @@ function SideBar({
124133 selectedYears ,
125134 selectedCampuses ,
126135 newVal ,
127- selectedAnswerKeyIncluded ,
136+ selectedAnswerKeyIncluded
128137 ) ,
129138 } ,
130139 ] ;
131140
132141 return (
133142 < div className = "no-scrollbar fixed sticky top-0 h-[100vh] flex-col items-baseline overflow-y-auto border-r-2 border-[#36266d] bg-[#f3f5ff] pt-[10px] dark:bg-[#070114] md:flex" >
143+ { /* Header */ }
134144 < div className = "flex w-full items-center justify-between border-b-2 border-[#36266d] px-[10px] py-4" >
135145 < div className = "flex items-center gap-1" >
136146 < Filter size = { 24 } />
137147 < div className = "font-play text-xl font-bold" > Filters</ div >
138148 </ div >
139- < div className = "flex flex-col" >
140- < div
141- className = "cursor-pointer rounded-full border-2 border-black px-2 py-1 font-play text-xs font-semibold hover:bg-slate-800 hover:text-white dark:border-[#434dba] dark:hover:border-white dark:hover:bg-slate-900"
142- onClick = { ( ) => {
143- handleApplyFilters ( [ ] , [ ] , [ ] , [ ] , [ ] , false ) ;
144- } }
145- >
146- Reset Filters
147- </ div >
148- </ div >
149+ < Button onClick = { ( ) => handleApplyFilters ( [ ] , [ ] , [ ] , [ ] , [ ] , false ) } >
150+ Reset Filters
151+ </ Button >
149152 </ div >
150153
154+ { /* Answer Key Toggle */ }
151155 < div className = "flex w-full items-center justify-between border-b-2 border-[#36266d] px-[10px] py-4" >
152- < div
153- onClick = { ( ) => {
156+ < Button
157+ selected = { selectedAnswerKeyIncluded }
158+ onClick = { ( ) =>
154159 handleApplyFilters (
155160 selectedExams ,
156161 selectedSlots ,
157162 selectedYears ,
158163 selectedCampuses ,
159164 selectedSemesters ,
160- ! selectedAnswerKeyIncluded ,
161- ) ;
162- } }
163- className = { `flex cursor-pointer rounded-full border-2 border-black px-2 py-1 font-play text-xs font-semibold hover:bg-slate-800 hover:text-white ${
164- selectedAnswerKeyIncluded
165- ? "border-[#B2B8FF] bg-[#B2B8FF] hover:border-black hover:bg-[#B2B8FF] dark:border-[#434dba] dark:bg-[#434dba] dark:hover:border-[white] dark:hover:bg-[#434dba]"
166- : "bg-none hover:bg-[#B2B8FF] dark:border-white dark:hover:border-[#434dba]"
167- } `}
165+ ! selectedAnswerKeyIncluded
166+ )
167+ }
168168 >
169169 Answer Key Available
170- </ div >
170+ </ Button >
171171 </ div >
172172
173173 { /* Select/Deselect/Download All Buttons */ }
174174 < div className = "flex w-full flex-wrap justify-between gap-2 border-b-2 border-[#36266d] px-[10px] py-4" >
175- < div
176- onClick = { handleSelectAll }
177- className = "cursor-pointer rounded-full border-2 border-black px-2 py-1 font-play text-xs font-semibold hover:bg-[#B2B8FF] hover:text-black dark:border-white dark:hover:border-[#434dba] dark:hover:bg-[#434dba] dark:hover:text-white"
178- >
179- Select All
180- </ div >
181- < div
182- onClick = { handleDeselectAll }
183- className = "cursor-pointer rounded-full border-2 border-black px-2 py-1 font-play text-xs font-semibold hover:bg-[#B2B8FF] hover:text-black dark:border-white dark:hover:border-[#434dba] dark:hover:bg-[#434dba] dark:hover:text-white"
184- >
185- Deselect All
186- </ div >
187- < div
188- onClick = { handleDownloadAll }
189- className = "cursor-pointer rounded-full border-2 border-black px-2 py-1 font-play text-xs font-semibold hover:bg-[#B2B8FF] hover:text-black dark:border-white dark:hover:border-[#434dba] dark:hover:bg-[#434dba] dark:hover:text-white"
190- >
191- Download Selected
192- </ div >
175+ < Button onClick = { handleSelectAll } > Select All</ Button >
176+ < Button onClick = { handleDeselectAll } > Deselect All</ Button >
177+ < Button onClick = { handleDownloadAll } > Download Selected</ Button >
193178 </ div >
194179
195180 { /* Filters */ }
@@ -201,29 +186,24 @@ function SideBar({
201186 < Accordion className = "w-full" type = "single" collapsible >
202187 < AccordionItem className = "border-none no-underline" value = "item-1" >
203188 < AccordionTrigger className = "w-full no-underline" >
204- < div className = "font-play text-sm no-underline" >
205- { section . label }
206- </ div >
189+ < div className = "font-play text-sm no-underline" > { section . label } </ div >
207190 </ AccordionTrigger >
208191 < AccordionContent >
209192 < div className = "my-2 flex w-full flex-wrap items-center" >
210193 { section . data . map ( ( item ) => (
211- < div
194+ < Button
212195 key = { item . value }
196+ selected = { section . selected . includes ( item . value ) }
213197 onClick = { ( ) => {
214198 const newValues = section . selected . includes ( item . value )
215199 ? section . selected . filter ( ( v ) => v !== item . value )
216200 : [ ...section . selected , item . value ] ;
217201 section . updater ( newValues ) ;
218202 } }
219- className = { `mb-2 mr-2 flex h-fit cursor-pointer items-center rounded-full border-2 border-black px-2 py-1 font-play text-xs font-semibold hover:bg-slate-800 hover:text-white ${
220- section . selected . includes ( item . value )
221- ? "border-[#B2B8FF] bg-[#B2B8FF] dark:border-[#434dba] dark:bg-[#434dba]"
222- : "bg-none dark:border-white"
223- } `}
203+ className = "mb-2 mr-2"
224204 >
225205 { item . label }
226- </ div >
206+ </ Button >
227207 ) ) }
228208 </ div >
229209 </ AccordionContent >
@@ -235,4 +215,4 @@ function SideBar({
235215 ) ;
236216}
237217
238- export default SideBar ;
218+ export default SideBar ;
0 commit comments