Skip to content

Commit 8411f5f

Browse files
committed
fix : fixed buttons light mode hover and refactored file
1 parent f154647 commit 8411f5f

1 file changed

Lines changed: 47 additions & 67 deletions

File tree

src/components/SideBar.tsx

Lines changed: 47 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)