Skip to content

Commit 80d336f

Browse files
committed
fix : changed hover over buttons for light mode functionality and refactored file
1 parent db777ef commit 80d336f

1 file changed

Lines changed: 54 additions & 81 deletions

File tree

src/components/SideBar.tsx

Lines changed: 54 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"use client";
22

33
import React from "react";
4+
import clsx from "clsx";
45
import { Filter } from "lucide-react";
56
import { type Filters, type IPaper } from "@/interface";
67
import {
@@ -11,14 +12,14 @@ import {
1112
} from "@/components/ui/accordion";
1213

1314
function SideBar({
15+
loading,
1416
selectedExams,
1517
selectedSlots,
1618
selectedYears,
1719
selectedCampuses,
1820
selectedSemesters,
1921
selectedAnswerKeyIncluded,
2022
filterOptions,
21-
filtersNotPulled,
2223
handleApplyFilters,
2324
handleSelectAll,
2425
handleDeselectAll,
@@ -31,44 +32,46 @@ function SideBar({
3132
selectedCampuses: string[];
3233
selectedSemesters: string[];
3334
selectedAnswerKeyIncluded: boolean;
34-
filtersNotPulled: () => void;
35-
noAppliedFilters: () => void;
36-
closeFilters: () => void;
37-
subject: string | null;
3835
filterOptions: Filters | undefined;
39-
selectedPapers: IPaper[];
4036
handleApplyFilters: (
4137
exams: string[],
4238
slots: string[],
4339
years: string[],
4440
campus: string[],
4541
semester: string[],
46-
anskey: boolean,
42+
anskey: boolean
4743
) => void;
4844
handleSelectAll: () => void;
4945
handleDeselectAll: () => void;
5046
handleDownloadSelected: () => void;
5147
}) {
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+
5267
const exams =
53-
filterOptions?.unique_exams.map((exam) => ({
54-
label: exam,
55-
value: exam,
56-
})) ?? [];
68+
filterOptions?.unique_exams.map((exam) => ({ label: exam, value: exam })) ?? [];
5769
const slots =
58-
filterOptions?.unique_slots.map((slot) => ({
59-
label: slot,
60-
value: slot,
61-
})) ?? [];
70+
filterOptions?.unique_slots.map((slot) => ({ label: slot, value: slot })) ?? [];
6271
const years =
63-
filterOptions?.unique_years.map((year) => ({
64-
label: year,
65-
value: year,
66-
})) ?? [];
72+
filterOptions?.unique_years.map((year) => ({ label: year, value: year })) ?? [];
6773
const semesters =
68-
filterOptions?.unique_semesters.map((semester) => ({
69-
label: semester,
70-
value: semester,
71-
})) ?? [];
74+
filterOptions?.unique_semesters.map((semester) => ({ label: semester, value: semester })) ?? [];
7275

7376
const filtersForSidebar = [
7477
{
@@ -82,7 +85,7 @@ function SideBar({
8285
selectedYears,
8386
selectedCampuses,
8487
selectedSemesters,
85-
selectedAnswerKeyIncluded,
88+
selectedAnswerKeyIncluded
8689
),
8790
},
8891
{
@@ -96,7 +99,7 @@ function SideBar({
9699
selectedYears,
97100
selectedCampuses,
98101
selectedSemesters,
99-
selectedAnswerKeyIncluded,
102+
selectedAnswerKeyIncluded
100103
),
101104
},
102105
{
@@ -110,7 +113,7 @@ function SideBar({
110113
newVal,
111114
selectedCampuses,
112115
selectedSemesters,
113-
selectedAnswerKeyIncluded,
116+
selectedAnswerKeyIncluded
114117
),
115118
},
116119
{
@@ -124,75 +127,51 @@ function SideBar({
124127
selectedYears,
125128
selectedCampuses,
126129
newVal,
127-
selectedAnswerKeyIncluded,
130+
selectedAnswerKeyIncluded
128131
),
129132
},
130133
];
131134

132135
return (
133136
<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 */}
134138
<div className="flex w-full items-center justify-between border-b-2 border-[#36266d] px-[10px] py-4">
135139
<div className="flex items-center gap-1">
136140
<Filter size={24} />
137141
<div className="font-play text-xl font-bold">Filters</div>
138142
</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>
143+
<SidebarButton
144+
label="Reset Filters"
145+
onClick={() => handleApplyFilters([], [], [], [], [], false)}
146+
/>
149147
</div>
150148

149+
{/* Answer Key Toggle */}
151150
<div className="flex w-full items-center justify-between border-b-2 border-[#36266d] px-[10px] py-4">
152-
<div
153-
onClick={() => {
151+
<SidebarButton
152+
label="Answer Key Available"
153+
onClick={() =>
154154
handleApplyFilters(
155155
selectedExams,
156156
selectedSlots,
157157
selectedYears,
158158
selectedCampuses,
159159
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-
}`}
168-
>
169-
Answer Key Available
170-
</div>
160+
!selectedAnswerKeyIncluded
161+
)
162+
}
163+
selected={selectedAnswerKeyIncluded}
164+
/>
171165
</div>
172166

173167
{/* Select/Deselect/Download All Buttons */}
174168
<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>
169+
<SidebarButton label="Select All" onClick={handleSelectAll} />
170+
<SidebarButton label="Deselect All" onClick={handleDeselectAll} />
171+
<SidebarButton label="Download Selected" onClick={handleDownloadAll} />
193172
</div>
194173

195-
{/* Filters */}
174+
{/* Filters Accordion */}
196175
{filtersForSidebar.map((section) => (
197176
<div
198177
key={section.label}
@@ -201,29 +180,23 @@ function SideBar({
201180
<Accordion className="w-full" type="single" collapsible>
202181
<AccordionItem className="border-none no-underline" value="item-1">
203182
<AccordionTrigger className="w-full no-underline">
204-
<div className="font-play text-sm no-underline">
205-
{section.label}
206-
</div>
183+
<div className="font-play text-sm no-underline">{section.label}</div>
207184
</AccordionTrigger>
208185
<AccordionContent>
209186
<div className="my-2 flex w-full flex-wrap items-center">
210187
{section.data.map((item) => (
211-
<div
188+
<SidebarButton
212189
key={item.value}
190+
label={item.label}
213191
onClick={() => {
214192
const newValues = section.selected.includes(item.value)
215193
? section.selected.filter((v) => v !== item.value)
216194
: [...section.selected, item.value];
217195
section.updater(newValues);
218196
}}
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>
197+
selected={section.selected.includes(item.value)}
198+
className="mb-2 mr-2"
199+
/>
227200
))}
228201
</div>
229202
</AccordionContent>

0 commit comments

Comments
 (0)