11"use client" ;
22
33import React from "react" ;
4- import clsx from "clsx" ;
54import { Filter } from "lucide-react" ;
65import { type Filters , type IPaper } from "@/interface" ;
76import {
@@ -12,14 +11,14 @@ import {
1211} from "@/components/ui/accordion" ;
1312
1413function SideBar ( {
15- loading,
1614 selectedExams,
1715 selectedSlots,
1816 selectedYears,
1917 selectedCampuses,
2018 selectedSemesters,
2119 selectedAnswerKeyIncluded,
2220 filterOptions,
21+ filtersNotPulled,
2322 handleApplyFilters,
2423 handleSelectAll,
2524 handleDeselectAll,
@@ -32,46 +31,44 @@ function SideBar({
3231 selectedCampuses : string [ ] ;
3332 selectedSemesters : string [ ] ;
3433 selectedAnswerKeyIncluded : boolean ;
34+ filtersNotPulled : ( ) => void ;
35+ noAppliedFilters : ( ) => void ;
36+ closeFilters : ( ) => void ;
37+ subject : string | null ;
3538 filterOptions : Filters | undefined ;
39+ selectedPapers : IPaper [ ] ;
3640 handleApplyFilters : (
3741 exams : string [ ] ,
3842 slots : string [ ] ,
3943 years : string [ ] ,
4044 campus : string [ ] ,
4145 semester : string [ ] ,
42- anskey : boolean
46+ anskey : boolean ,
4347 ) => void ;
4448 handleSelectAll : ( ) => void ;
4549 handleDeselectAll : ( ) => void ;
4650 handleDownloadSelected : ( ) => void ;
4751} ) {
48- // Reusable button with consistent hover styles
49- const SidebarButton : React . FC < {
50- label : string ;
51- onClick : ( ) => void ;
52- selected ?: boolean ;
53- className ?: string ;
54- } > = ( { label, onClick, selected = false , className } ) => (
55- < div
56- onClick = { onClick }
57- className = { clsx (
58- "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" ,
59- selected && "border-[#B2B8FF] bg-[#B2B8FF] dark:border-[#434dba] dark:bg-[#434dba]" ,
60- className
61- ) }
62- >
63- { label }
64- </ div >
65- ) ;
66-
6752 const exams =
68- filterOptions ?. unique_exams . map ( ( exam ) => ( { label : exam , value : exam } ) ) ?? [ ] ;
53+ filterOptions ?. unique_exams . map ( ( exam ) => ( {
54+ label : exam ,
55+ value : exam ,
56+ } ) ) ?? [ ] ;
6957 const slots =
70- filterOptions ?. unique_slots . map ( ( slot ) => ( { label : slot , value : slot } ) ) ?? [ ] ;
58+ filterOptions ?. unique_slots . map ( ( slot ) => ( {
59+ label : slot ,
60+ value : slot ,
61+ } ) ) ?? [ ] ;
7162 const years =
72- filterOptions ?. unique_years . map ( ( year ) => ( { label : year , value : year } ) ) ?? [ ] ;
63+ filterOptions ?. unique_years . map ( ( year ) => ( {
64+ label : year ,
65+ value : year ,
66+ } ) ) ?? [ ] ;
7367 const semesters =
74- filterOptions ?. unique_semesters . map ( ( semester ) => ( { label : semester , value : semester } ) ) ?? [ ] ;
68+ filterOptions ?. unique_semesters . map ( ( semester ) => ( {
69+ label : semester ,
70+ value : semester ,
71+ } ) ) ?? [ ] ;
7572
7673 const filtersForSidebar = [
7774 {
@@ -85,7 +82,7 @@ function SideBar({
8582 selectedYears ,
8683 selectedCampuses ,
8784 selectedSemesters ,
88- selectedAnswerKeyIncluded
85+ selectedAnswerKeyIncluded ,
8986 ) ,
9087 } ,
9188 {
@@ -99,7 +96,7 @@ function SideBar({
9996 selectedYears ,
10097 selectedCampuses ,
10198 selectedSemesters ,
102- selectedAnswerKeyIncluded
99+ selectedAnswerKeyIncluded ,
103100 ) ,
104101 } ,
105102 {
@@ -113,7 +110,7 @@ function SideBar({
113110 newVal ,
114111 selectedCampuses ,
115112 selectedSemesters ,
116- selectedAnswerKeyIncluded
113+ selectedAnswerKeyIncluded ,
117114 ) ,
118115 } ,
119116 {
@@ -127,51 +124,75 @@ function SideBar({
127124 selectedYears ,
128125 selectedCampuses ,
129126 newVal ,
130- selectedAnswerKeyIncluded
127+ selectedAnswerKeyIncluded ,
131128 ) ,
132129 } ,
133130 ] ;
134131
135132 return (
136133 < 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" >
137- { /* Header */ }
138134 < div className = "flex w-full items-center justify-between border-b-2 border-[#36266d] px-[10px] py-4" >
139135 < div className = "flex items-center gap-1" >
140136 < Filter size = { 24 } />
141137 < div className = "font-play text-xl font-bold" > Filters</ div >
142138 </ div >
143- < SidebarButton
144- label = "Reset Filters"
145- onClick = { ( ) => handleApplyFilters ( [ ] , [ ] , [ ] , [ ] , [ ] , false ) }
146- />
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 >
147149 </ div >
148150
149- { /* Answer Key Toggle */ }
150151 < div className = "flex w-full items-center justify-between border-b-2 border-[#36266d] px-[10px] py-4" >
151- < SidebarButton
152- label = "Answer Key Available"
153- onClick = { ( ) =>
152+ < div
153+ onClick = { ( ) => {
154154 handleApplyFilters (
155155 selectedExams ,
156156 selectedSlots ,
157157 selectedYears ,
158158 selectedCampuses ,
159159 selectedSemesters ,
160- ! selectedAnswerKeyIncluded
161- )
162- }
163- selected = { selectedAnswerKeyIncluded }
164- />
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+ } `}
168+ >
169+ Answer Key Available
170+ </ div >
165171 </ div >
166172
167173 { /* Select/Deselect/Download All Buttons */ }
168174 < div className = "flex w-full flex-wrap justify-between gap-2 border-b-2 border-[#36266d] px-[10px] py-4" >
169- < SidebarButton label = "Select All" onClick = { handleSelectAll } />
170- < SidebarButton label = "Deselect All" onClick = { handleDeselectAll } />
171- < SidebarButton label = "Download Selected" onClick = { handleDownloadAll } />
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 >
172193 </ div >
173194
174- { /* Filters Accordion */ }
195+ { /* Filters */ }
175196 { filtersForSidebar . map ( ( section ) => (
176197 < div
177198 key = { section . label }
@@ -180,23 +201,29 @@ function SideBar({
180201 < Accordion className = "w-full" type = "single" collapsible >
181202 < AccordionItem className = "border-none no-underline" value = "item-1" >
182203 < AccordionTrigger className = "w-full no-underline" >
183- < div className = "font-play text-sm no-underline" > { section . label } </ div >
204+ < div className = "font-play text-sm no-underline" >
205+ { section . label }
206+ </ div >
184207 </ AccordionTrigger >
185208 < AccordionContent >
186209 < div className = "my-2 flex w-full flex-wrap items-center" >
187210 { section . data . map ( ( item ) => (
188- < SidebarButton
211+ < div
189212 key = { item . value }
190- label = { item . label }
191213 onClick = { ( ) => {
192214 const newValues = section . selected . includes ( item . value )
193215 ? section . selected . filter ( ( v ) => v !== item . value )
194216 : [ ...section . selected , item . value ] ;
195217 section . updater ( newValues ) ;
196218 } }
197- selected = { section . selected . includes ( item . value ) }
198- className = "mb-2 mr-2"
199- />
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+ } `}
224+ >
225+ { item . label }
226+ </ div >
200227 ) ) }
201228 </ div >
202229 </ AccordionContent >
0 commit comments