From f8ea4199f6ca58d7320bfd923b4128c8a3b9e5a3 Mon Sep 17 00:00:00 2001 From: Noscope999 Date: Thu, 17 Jul 2025 00:25:59 +0530 Subject: [PATCH 1/8] feat:moved search bar from sidebar to navbar --- src/components/Navbar.tsx | 25 +++- src/components/SideBar.tsx | 292 +++++-------------------------------- 2 files changed, 56 insertions(+), 261 deletions(-) diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index caa8cb7..98b33c3 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -6,12 +6,24 @@ import ModeToggle from "@/components/toggle-theme"; import Link from "next/link"; import { usePathname } from "next/navigation"; import { ArrowDownLeftIcon } from "lucide-react"; +import SearchbarChild from "./Searchbar/searchbar-child"; +import { fetchSubjects } from "./Searchbar/searchbar"; +import { useEffect, useState } from "react"; function Navbar() { const pathname = usePathname(); + const [subjects, setSubjects] = useState([]); + + useEffect(() => { + const getSubjects = async () => { + const subs = await fetchSubjects(); + setSubjects(subs); + }; + getSubjects(); + }, []); return ( -
+
+ + {pathname === "/catalogue" && ( +
+
+ +
+
+ )} +
@@ -52,4 +73,4 @@ function Navbar() { ); } -export default Navbar; +export default Navbar; \ No newline at end of file diff --git a/src/components/SideBar.tsx b/src/components/SideBar.tsx index c488970..935d743 100644 --- a/src/components/SideBar.tsx +++ b/src/components/SideBar.tsx @@ -2,7 +2,6 @@ import React, { useEffect, useState } from "react"; import { fetchSubjects } from "./Searchbar/searchbar"; -import { Button } from "./ui/button"; import { Filter } from "lucide-react"; import { type Filters, type IPaper } from "@/interface"; import { @@ -11,7 +10,6 @@ import { AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; -import SearchbarChild from "./Searchbar/searchbar-child"; function SideBar({ filtersNotPulled, @@ -23,10 +21,6 @@ function SideBar({ selectedSemesters, selectedAnswerKeyIncluded, filterOptions, - handleSelectAll, - handleDeselectAll, - selectedPapers, - handleDownloadAll, handleApplyFilters, }: { filtersNotPulled: () => void; @@ -41,10 +35,6 @@ function SideBar({ closeFilters: () => void; subject: string | null; filterOptions: Filters | undefined; - handleSelectAll: () => void; - handleDeselectAll: () => void; - selectedPapers: IPaper[]; - handleDownloadAll: () => void; handleApplyFilters: ( exams: string[], slots: string[], @@ -57,73 +47,34 @@ function SideBar({ const exams = filterOptions?.uniqueExams.map((exam) => ({ label: exam, value: exam, - })) ?? []; + })); const slots = filterOptions?.uniqueSlots.map((slot) => ({ label: slot, value: slot, - })) ?? []; + })); const years = filterOptions?.uniqueYears.map((year) => ({ label: year, value: year, - })) ?? []; + })); const semesters = filterOptions?.uniqueSemesters.map((semester) => ({ label: semester, value: semester, - })) ?? []; - // const campuses = filterOptions?.uniqueCampuses.map((campus) => ({ - // label: campus, - // value: campus, - // })); + })); const [subjects, setSubjects] = useState([]); + useEffect(() => { async function fetchSubjectsSidebar() { - if (loading) { - return; - } + if (loading) return; const fetchedSubjects = await fetchSubjects(); setSubjects(fetchedSubjects); } void fetchSubjectsSidebar(); }, [loading]); + return ( -
-
- -
-
-
-
- - -
- -
-
-
+
+ {/* FILTER HEADER */} +
Filters
@@ -139,7 +90,9 @@ function SideBar({
-
+ + {/* ANSWER KEY TOGGLE */} +
{ handleApplyFilters( @@ -156,14 +109,10 @@ function SideBar({ Answer Key Available
-
- - {/* Keep exams open by default for aesthetics */} + + {/* ACCORDIONS */} +
+
Exams
@@ -173,28 +122,19 @@ function SideBar({ {exams?.map((exam) => (
{ - if (selectedExams.includes(exam.value)) { - handleApplyFilters( - selectedExams.filter((e) => e !== exam.value), - selectedSlots, - selectedYears, - selectedCampuses, - selectedSemesters, - selectedAnswerKeyIncluded, - ); - } else { - handleApplyFilters( - [...selectedExams, exam.value], - selectedSlots, - selectedYears, - selectedCampuses, - selectedSemesters, - selectedAnswerKeyIncluded, - ); - } - }} - className={`font-play mb-2 mr-2 flex h-fit cursor-pointer items-center rounded-full border-2 border-black px-2 py-1 text-xs font-semibold hover:bg-slate-800 hover:text-white dark:hover:bg-slate-900 ${selectedExams.includes(exam.value) ? "border-[#B2B8FF] bg-[#B2B8FF] hover:border-black hover:bg-[#B2B8FF] dark:border-[#434dba] dark:bg-[#434dba] dark:hover:border-[white] dark:hover:bg-[#434dba]" : "bg-none hover:bg-[#B2B8FF] dark:border-white dark:hover:border-[#434dba]"}`} + onClick={() => + handleApplyFilters( + selectedExams.includes(exam.value) + ? selectedExams.filter((e) => e !== exam.value) + : [...selectedExams, exam.value], + selectedSlots, + selectedYears, + selectedCampuses, + selectedSemesters, + selectedAnswerKeyIncluded, + ) + } + className={`font-play mb-2 mr-2 flex h-fit cursor-pointer items-center rounded-full border-2 border-black px-2 py-1 text-xs font-semibold hover:bg-slate-800 hover:text-white dark:hover:bg-slate-900 ${selectedExams.includes(exam.value) ? "border-[#B2B8FF] bg-[#B2B8FF] dark:border-[#434dba] dark:bg-[#434dba]" : "bg-none dark:border-white"}`} > {exam.label}
@@ -203,177 +143,11 @@ function SideBar({
+ + {/* Add slots/years/semesters below as needed, same as above */}
-
- - - -
Slots
-
- -
- {slots?.map((slot) => ( -
{ - if (selectedSlots.includes(slot.value)) { - handleApplyFilters( - selectedExams, - selectedSlots.filter((s) => s !== slot.value), - selectedYears, - selectedCampuses, - selectedSemesters, - selectedAnswerKeyIncluded, - ); - } else { - handleApplyFilters( - selectedExams, - [...selectedSlots, slot.value], - selectedYears, - selectedCampuses, - selectedSemesters, - selectedAnswerKeyIncluded, - ); - } - }} - className={`font-play mb-2 mr-2 flex h-fit cursor-pointer items-center rounded-full border-2 border-black px-2 py-1 text-xs font-semibold hover:bg-slate-800 hover:text-white dark:hover:bg-slate-900 ${selectedSlots.includes(slot.value) ? "border-[#B2B8FF] bg-[#B2B8FF] hover:border-black hover:bg-[#B2B8FF] dark:border-[#434dba] dark:bg-[#434dba] dark:hover:border-[white] dark:hover:bg-[#434dba]" : "bg-none hover:bg-[#B2B8FF] dark:border-white dark:hover:border-[#434dba]"}`} - > - {slot.label} -
- ))} -
-
-
-
-
-
- - - -
Years
-
- -
- {years?.map((year) => ( -
{ - if (selectedYears.includes(year.value)) { - handleApplyFilters( - selectedExams, - selectedSlots, - selectedYears.filter((y) => y !== year.value), - selectedCampuses, - selectedSemesters, - selectedAnswerKeyIncluded, - ); - } else { - handleApplyFilters( - selectedExams, - selectedSlots, - [...selectedYears, year.value], - selectedCampuses, - selectedSemesters, - selectedAnswerKeyIncluded, - ); - } - }} - className={`font-play mb-2 mr-2 flex h-fit cursor-pointer items-center rounded-full border-2 border-black px-2 py-1 text-xs font-semibold hover:bg-slate-800 hover:text-white dark:hover:bg-slate-900 ${selectedYears.includes(year.value) ? "border-[#B2B8FF] bg-[#B2B8FF] hover:border-black hover:bg-[#B2B8FF] dark:border-[#434dba] dark:bg-[#434dba] dark:hover:border-[white] dark:hover:bg-[#434dba]" : "bg-none hover:bg-[#B2B8FF] dark:border-white dark:hover:border-[#434dba]"}`} - > - {year.label} -
- ))} -
-
-
-
-
-
- - - -
Semesters
-
- -
- {semesters?.map((semester) => ( -
{ - if (selectedSemesters.includes(semester.value)) { - handleApplyFilters( - selectedExams, - selectedSlots, - selectedYears, - selectedCampuses, - selectedSemesters.filter((s) => s !== semester.value), - selectedAnswerKeyIncluded, - ); - } else { - handleApplyFilters( - selectedExams, - selectedSlots, - selectedYears, - selectedCampuses, - [...selectedSemesters, semester.value], - selectedAnswerKeyIncluded, - ); - } - }} - className={`font-play mb-2 mr-2 flex h-fit cursor-pointer items-center rounded-full border-2 border-black px-2 py-1 text-xs font-semibold hover:bg-slate-800 hover:text-white dark:hover:bg-slate-900 ${selectedSemesters.includes(semester.value) ? "border-[#B2B8FF] bg-[#B2B8FF] hover:border-black hover:bg-[#B2B8FF] dark:border-[#434dba] dark:bg-[#434dba] dark:hover:border-[white] dark:hover:bg-[#434dba]" : "bg-none hover:bg-[#B2B8FF] dark:border-white dark:hover:border-[#434dba]"}`} - > - {semester.label} -
- ))} -
-
-
-
-
- {/*
- - - -
Campuses
-
- -
- {campuses?.map((campus) => ( -
{ - if (selectedCampuses.includes(campus.value)) { - handleApplyFilters( - selectedExams, - selectedSlots, - selectedYears, - selectedCampuses.filter((c) => c !== campus.value), - selectedSemesters, - selectedAnswerKeyIncluded, - ); - } else { - handleApplyFilters( - selectedExams, - selectedSlots, - selectedYears, - [...selectedCampuses, campus.value], - selectedSemesters, - selectedAnswerKeyIncluded, - ); - } - }} - className={`mb-2 mr-2 flex h-fit cursor-pointer items-center rounded-full border-2 border-black px-2 py-1 font-sans text-xs font-semibold hover:bg-slate-800 hover:text-white dark:hover:bg-slate-900 ${selectedCampuses.includes(campus.value) ? "border-[#B2B8FF] bg-[#B2B8FF] hover:border-black hover:bg-[#B2B8FF] dark:border-[#434dba] dark:bg-[#434dba] dark:hover:border-[white] dark:hover:bg-[#434dba]" : "bg-none hover:bg-[#B2B8FF] dark:border-white dark:hover:border-[#434dba]"}`} - > - {campus.label} -
- ))} -
-
-
-
-
*/}
); } -export default SideBar; +export default SideBar; \ No newline at end of file From 3a260293066f808c9ba3cba1fc81a52c9fd24258 Mon Sep 17 00:00:00 2001 From: Noscope999 Date: Thu, 17 Jul 2025 00:41:06 +0530 Subject: [PATCH 2/8] feat:restored deleted filters --- src/components/SideBar.tsx | 215 ++++++++++++++++++++++++++++--------- 1 file changed, 164 insertions(+), 51 deletions(-) diff --git a/src/components/SideBar.tsx b/src/components/SideBar.tsx index 935d743..994d2f4 100644 --- a/src/components/SideBar.tsx +++ b/src/components/SideBar.tsx @@ -1,7 +1,6 @@ "use client"; -import React, { useEffect, useState } from "react"; -import { fetchSubjects } from "./Searchbar/searchbar"; +import React from "react"; import { Filter } from "lucide-react"; import { type Filters, type IPaper } from "@/interface"; import { @@ -12,7 +11,6 @@ import { } from "@/components/ui/accordion"; function SideBar({ - filtersNotPulled, loading, selectedExams, selectedSlots, @@ -23,7 +21,6 @@ function SideBar({ filterOptions, handleApplyFilters, }: { - filtersNotPulled: () => void; loading: boolean; selectedExams: string[]; selectedSlots: string[]; @@ -35,46 +32,40 @@ function SideBar({ closeFilters: () => void; subject: string | null; filterOptions: Filters | undefined; + selectedPapers: IPaper[]; handleApplyFilters: ( exams: string[], slots: string[], years: string[], campus: string[], semester: string[], - anskey: boolean, + anskey: boolean ) => void; }) { - const exams = filterOptions?.uniqueExams.map((exam) => ({ - label: exam, - value: exam, - })); - const slots = filterOptions?.uniqueSlots.map((slot) => ({ - label: slot, - value: slot, - })); - const years = filterOptions?.uniqueYears.map((year) => ({ - label: year, - value: year, - })); - const semesters = filterOptions?.uniqueSemesters.map((semester) => ({ - label: semester, - value: semester, - })); - const [subjects, setSubjects] = useState([]); - - useEffect(() => { - async function fetchSubjectsSidebar() { - if (loading) return; - const fetchedSubjects = await fetchSubjects(); - setSubjects(fetchedSubjects); - } - void fetchSubjectsSidebar(); - }, [loading]); + const exams = + filterOptions?.uniqueExams.map((exam) => ({ + label: exam, + value: exam, + })) ?? []; + const slots = + filterOptions?.uniqueSlots.map((slot) => ({ + label: slot, + value: slot, + })) ?? []; + const years = + filterOptions?.uniqueYears.map((year) => ({ + label: year, + value: year, + })) ?? []; + const semesters = + filterOptions?.uniqueSemesters.map((semester) => ({ + label: semester, + value: semester, + })) ?? []; return ( -
- {/* FILTER HEADER */} -
+
+
Filters
@@ -91,8 +82,7 @@ function SideBar({
- {/* ANSWER KEY TOGGLE */} -
+
{ handleApplyFilters( @@ -101,17 +91,20 @@ function SideBar({ selectedYears, selectedCampuses, selectedSemesters, - !selectedAnswerKeyIncluded, + !selectedAnswerKeyIncluded ); }} - className={`font-play flex cursor-pointer rounded-full border-2 border-black px-2 py-1 text-xs font-semibold hover:bg-slate-800 hover:text-white ${selectedAnswerKeyIncluded ? "border-[#B2B8FF] bg-[#B2B8FF] hover:border-black hover:bg-[#B2B8FF] dark:border-[#434dba] dark:bg-[#434dba] dark:hover:border-[white] dark:hover:bg-[#434dba]" : "bg-none hover:bg-[#B2B8FF] dark:border-white dark:hover:border-[#434dba]"}`} + className={`font-play flex cursor-pointer rounded-full border-2 border-black px-2 py-1 text-xs font-semibold hover:bg-slate-800 hover:text-white ${ + selectedAnswerKeyIncluded + ? "border-[#B2B8FF] bg-[#B2B8FF] hover:border-black hover:bg-[#B2B8FF] dark:border-[#434dba] dark:bg-[#434dba] dark:hover:border-[white] dark:hover:bg-[#434dba]" + : "bg-none hover:bg-[#B2B8FF] dark:border-white dark:hover:border-[#434dba]" + }`} > Answer Key Available
- {/* ACCORDIONS */} -
+
@@ -119,22 +112,27 @@ function SideBar({
- {exams?.map((exam) => ( + {exams.map((exam) => (
+ onClick={() => { + const newExams = selectedExams.includes(exam.value) + ? selectedExams.filter((e) => e !== exam.value) + : [...selectedExams, exam.value]; handleApplyFilters( - selectedExams.includes(exam.value) - ? selectedExams.filter((e) => e !== exam.value) - : [...selectedExams, exam.value], + newExams, selectedSlots, selectedYears, selectedCampuses, selectedSemesters, - selectedAnswerKeyIncluded, - ) - } - className={`font-play mb-2 mr-2 flex h-fit cursor-pointer items-center rounded-full border-2 border-black px-2 py-1 text-xs font-semibold hover:bg-slate-800 hover:text-white dark:hover:bg-slate-900 ${selectedExams.includes(exam.value) ? "border-[#B2B8FF] bg-[#B2B8FF] dark:border-[#434dba] dark:bg-[#434dba]" : "bg-none dark:border-white"}`} + selectedAnswerKeyIncluded + ); + }} + className={`font-play mb-2 mr-2 flex h-fit cursor-pointer items-center rounded-full border-2 border-black px-2 py-1 text-xs font-semibold hover:bg-slate-800 hover:text-white ${ + selectedExams.includes(exam.value) + ? "border-[#B2B8FF] bg-[#B2B8FF] dark:border-[#434dba] dark:bg-[#434dba]" + : "bg-none dark:border-white" + }`} > {exam.label}
@@ -143,11 +141,126 @@ function SideBar({ +
- {/* Add slots/years/semesters below as needed, same as above */} +
+ + + +
Slots
+
+ +
+ {slots.map((slot) => ( +
{ + const newSlots = selectedSlots.includes(slot.value) + ? selectedSlots.filter((s) => s !== slot.value) + : [...selectedSlots, slot.value]; + handleApplyFilters( + selectedExams, + newSlots, + selectedYears, + selectedCampuses, + selectedSemesters, + selectedAnswerKeyIncluded + ); + }} + className={`font-play mb-2 mr-2 flex h-fit cursor-pointer items-center rounded-full border-2 border-black px-2 py-1 text-xs font-semibold hover:bg-slate-800 hover:text-white ${ + selectedSlots.includes(slot.value) + ? "border-[#B2B8FF] bg-[#B2B8FF] dark:border-[#434dba] dark:bg-[#434dba]" + : "bg-none dark:border-white" + }`} + > + {slot.label} +
+ ))} +
+
+
+
+
+ +
+ + + +
Years
+
+ +
+ {years.map((year) => ( +
{ + const newYears = selectedYears.includes(year.value) + ? selectedYears.filter((y) => y !== year.value) + : [...selectedYears, year.value]; + handleApplyFilters( + selectedExams, + selectedSlots, + newYears, + selectedCampuses, + selectedSemesters, + selectedAnswerKeyIncluded + ); + }} + className={`font-play mb-2 mr-2 flex h-fit cursor-pointer items-center rounded-full border-2 border-black px-2 py-1 text-xs font-semibold hover:bg-slate-800 hover:text-white ${ + selectedYears.includes(year.value) + ? "border-[#B2B8FF] bg-[#B2B8FF] dark:border-[#434dba] dark:bg-[#434dba]" + : "bg-none dark:border-white" + }`} + > + {year.label} +
+ ))} +
+
+
+
+
+ +
+ + + +
Semesters
+
+ +
+ {semesters.map((semester) => ( +
{ + const newSems = selectedSemesters.includes(semester.value) + ? selectedSemesters.filter((s) => s !== semester.value) + : [...selectedSemesters, semester.value]; + handleApplyFilters( + selectedExams, + selectedSlots, + selectedYears, + selectedCampuses, + newSems, + selectedAnswerKeyIncluded + ); + }} + className={`font-play mb-2 mr-2 flex h-fit cursor-pointer items-center rounded-full border-2 border-black px-2 py-1 text-xs font-semibold hover:bg-slate-800 hover:text-white ${ + selectedSemesters.includes(semester.value) + ? "border-[#B2B8FF] bg-[#B2B8FF] dark:border-[#434dba] dark:bg-[#434dba]" + : "bg-none dark:border-white" + }`} + > + {semester.label} +
+ ))} +
+
+
+
); } -export default SideBar; \ No newline at end of file +export default SideBar; From ee781f7417b7552f9fb83bcae23561c28000c6b6 Mon Sep 17 00:00:00 2001 From: Noscope999 Date: Thu, 17 Jul 2025 20:22:35 +0530 Subject: [PATCH 3/8] patch:removed grey spinners with skeletons for CLS --- src/components/PapersCarousel.tsx | 29 ++++++++++++++++++++++++----- src/components/ui/skeleton.tsx | 15 +++++++++++++++ 2 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 src/components/ui/skeleton.tsx diff --git a/src/components/PapersCarousel.tsx b/src/components/PapersCarousel.tsx index 9ac6def..d208123 100644 --- a/src/components/PapersCarousel.tsx +++ b/src/components/PapersCarousel.tsx @@ -3,7 +3,6 @@ import { useEffect, useState } from "react"; import axios from "axios"; import { type IUpcomingPaper } from "@/interface"; -import Loader from "./ui/loader"; import UpcomingPaper from "./UpcomingPaper"; import { Carousel, @@ -14,6 +13,7 @@ import { } from "@/components/ui/carousel"; import Autoplay from "embla-carousel-autoplay"; import { chunkArray } from "@/util/utils"; +import { Skeleton } from "@/components/ui/skeleton"; function PapersCarousel({ carouselType, @@ -41,7 +41,7 @@ function PapersCarousel({ "Design and Analysis of Algorithms [MCSE502L]", "Complex Variables and Linear Algebra [BMAT201L]", "Differential Equations and Transforms [BMAT102L]", - ]), + ]) ); handleResize(); @@ -62,11 +62,14 @@ function PapersCarousel({ const storedSubjects = JSON.parse( localStorage.getItem("userSubjects") ?? "[]" ) as string[]; - const response = await axios.post("/api/user-papers", storedSubjects); + const response = await axios.post( + "/api/user-papers", + storedSubjects + ); setDisplayPapers(response.data); } else { const response = await axios.get( - "/api/upcoming-papers", + "/api/upcoming-papers" ); setDisplayPapers(response.data); } @@ -81,7 +84,23 @@ function PapersCarousel({ }, []); if (isLoading) { - return ; + return ( +
+

+ {carouselType === "users" ? "Your Papers" : "Upcoming Papers"} +

+ +
+ {Array.from({ length: 8 }).map((_, index) => ( +
+ + + +
+ ))} +
+
+ ); } const plugins = [Autoplay({ delay: 8000, stopOnInteraction: true })]; diff --git a/src/components/ui/skeleton.tsx b/src/components/ui/skeleton.tsx new file mode 100644 index 0000000..d7e45f7 --- /dev/null +++ b/src/components/ui/skeleton.tsx @@ -0,0 +1,15 @@ +import { cn } from "@/lib/utils" + +function Skeleton({ + className, + ...props +}: React.HTMLAttributes) { + return ( +
+ ) +} + +export { Skeleton } From 6f463fc454849ec9138f0bc5de358467cf21954e Mon Sep 17 00:00:00 2001 From: Noscope999 Date: Fri, 18 Jul 2025 22:43:25 +0530 Subject: [PATCH 4/8] patch:updated skeletons to fit dimensions aptly --- src/components/PapersCarousel.tsx | 72 +++++++++++++++++-------------- 1 file changed, 40 insertions(+), 32 deletions(-) diff --git a/src/components/PapersCarousel.tsx b/src/components/PapersCarousel.tsx index d208123..6633919 100644 --- a/src/components/PapersCarousel.tsx +++ b/src/components/PapersCarousel.tsx @@ -46,10 +46,7 @@ function PapersCarousel({ handleResize(); window.addEventListener("resize", handleResize); - - return () => { - window.removeEventListener("resize", handleResize); - }; + return () => window.removeEventListener("resize", handleResize); }, []); const chunkedPapers = chunkArray(displayPapers, chunkSize); @@ -90,12 +87,28 @@ function PapersCarousel({ {carouselType === "users" ? "Your Papers" : "Upcoming Papers"}

-
- {Array.from({ length: 8 }).map((_, index) => ( -
- - - +
+ {Array.from({ length: chunkSize }).map((_, index) => ( +
+
+ +
+
+ +
+ + +
+
))}
@@ -111,12 +124,9 @@ function PapersCarousel({ {carouselType === "users" ? "Your Papers" : "Upcoming Papers"}

-
+
@@ -125,23 +135,21 @@ function PapersCarousel({
- {chunkedPapers.map((paperGroup, index) => { - return ( - - {paperGroup.map((paper, subIndex) => ( -
- -
- ))} -
- ); - })} + {chunkedPapers.map((paperGroup, index) => ( + + {paperGroup.map((paper, subIndex) => ( +
+ +
+ ))} +
+ ))}
From 9f3460769e516fd446d9fae0e24ed2fbabf6a1ee Mon Sep 17 00:00:00 2001 From: Noscope999 Date: Fri, 18 Jul 2025 23:13:47 +0530 Subject: [PATCH 5/8] patch:removed your papers section and fixed shifting for cls --- src/components/PapersCarousel.tsx | 173 ++++++++++-------------------- src/components/screens/Hero.tsx | 1 - 2 files changed, 59 insertions(+), 115 deletions(-) diff --git a/src/components/PapersCarousel.tsx b/src/components/PapersCarousel.tsx index 6633919..bf2c763 100644 --- a/src/components/PapersCarousel.tsx +++ b/src/components/PapersCarousel.tsx @@ -15,61 +15,17 @@ import Autoplay from "embla-carousel-autoplay"; import { chunkArray } from "@/util/utils"; import { Skeleton } from "@/components/ui/skeleton"; -function PapersCarousel({ - carouselType, -}: { - carouselType: "users" | "default"; -}) { +function PapersCarousel() { const [displayPapers, setDisplayPapers] = useState([]); const [isLoading, setIsLoading] = useState(true); - const [chunkSize, setChunkSize] = useState(4); - - useEffect(() => { - const handleResize = () => { - if (window.innerWidth < 640) { - setChunkSize(4); - } else { - setChunkSize(8); - } - }; - - localStorage.setItem( - "userSubjects", - JSON.stringify([ - "Information Security [CBS3002]", - "Foundations of Data Analytics [BCSE351E]", - "Design and Analysis of Algorithms [MCSE502L]", - "Complex Variables and Linear Algebra [BMAT201L]", - "Differential Equations and Transforms [BMAT102L]", - ]) - ); - - handleResize(); - window.addEventListener("resize", handleResize); - return () => window.removeEventListener("resize", handleResize); - }, []); - - const chunkedPapers = chunkArray(displayPapers, chunkSize); + const chunkSize = 8; useEffect(() => { async function fetchPapers() { try { setIsLoading(true); - if (carouselType === "users") { - const storedSubjects = JSON.parse( - localStorage.getItem("userSubjects") ?? "[]" - ) as string[]; - const response = await axios.post( - "/api/user-papers", - storedSubjects - ); - setDisplayPapers(response.data); - } else { - const response = await axios.get( - "/api/upcoming-papers" - ); - setDisplayPapers(response.data); - } + const response = await axios.get("/api/upcoming-papers"); + setDisplayPapers(response.data); } catch (error) { console.error("Failed to fetch papers:", error); } finally { @@ -80,79 +36,68 @@ function PapersCarousel({ void fetchPapers(); }, []); - if (isLoading) { - return ( -
-

- {carouselType === "users" ? "Your Papers" : "Upcoming Papers"} -

- -
- {Array.from({ length: chunkSize }).map((_, index) => ( -
-
- -
-
- -
- - -
-
-
- ))} -
-
- ); - } - + const chunkedPapers = chunkArray(displayPapers, chunkSize); const plugins = [Autoplay({ delay: 8000, stopOnInteraction: true })]; return (

- {carouselType === "users" ? "Your Papers" : "Upcoming Papers"} + Upcoming Papers

-
- -
- - -
- - {chunkedPapers.map((paperGroup, index) => ( - - {paperGroup.map((paper, subIndex) => ( -
- -
- ))} -
- ))} -
-
-
+ +
+ + +
+ + + {isLoading + ? Array.from({ length: 1 }).map((_, index) => ( + + {Array.from({ length: chunkSize }).map((_, idx) => ( +
+
+ +
+
+ +
+ + +
+
+
+ ))} +
+ )) + : chunkedPapers.map((paperGroup, index) => ( + + {paperGroup.map((paper, subIndex) => ( +
+ +
+ ))} +
+ ))} +
+
); } diff --git a/src/components/screens/Hero.tsx b/src/components/screens/Hero.tsx index b85e9dd..6ac45ae 100644 --- a/src/components/screens/Hero.tsx +++ b/src/components/screens/Hero.tsx @@ -11,7 +11,6 @@ const Hero = () => {
- {/*

Learn More

From f121dc786ad94ecb93691149919729064148cdf0 Mon Sep 17 00:00:00 2001 From: Noscope999 Date: Sat, 19 Jul 2025 00:25:00 +0530 Subject: [PATCH 6/8] patch:added back commented campuses section --- src/components/SideBar.tsx | 44 +++++++++++++++++++++++++++++++++- src/components/ui/skeleton.tsx | 6 ++--- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/src/components/SideBar.tsx b/src/components/SideBar.tsx index 994d2f4..484f61a 100644 --- a/src/components/SideBar.tsx +++ b/src/components/SideBar.tsx @@ -259,8 +259,50 @@ function SideBar({
+ {/*
+ + + +
Campuses
+
+ +
+ {campuses?.map((campus) => ( +
{ + if (selectedCampuses.includes(campus.value)) { + handleApplyFilters( + selectedExams, + selectedSlots, + selectedYears, + selectedCampuses.filter((c) => c !== campus.value), + selectedSemesters, + selectedAnswerKeyIncluded, + ); + } else { + handleApplyFilters( + selectedExams, + selectedSlots, + selectedYears, + [...selectedCampuses, campus.value], + selectedSemesters, + selectedAnswerKeyIncluded, + ); + } + }} + className={`mb-2 mr-2 flex h-fit cursor-pointer items-center rounded-full border-2 border-black px-2 py-1 font-sans text-xs font-semibold hover:bg-slate-800 hover:text-white dark:hover:bg-slate-900 ${selectedCampuses.includes(campus.value) ? "border-[#B2B8FF] bg-[#B2B8FF] hover:border-black hover:bg-[#B2B8FF] dark:border-[#434dba] dark:bg-[#434dba] dark:hover:border-[white] dark:hover:bg-[#434dba]" : "bg-none hover:bg-[#B2B8FF] dark:border-white dark:hover:border-[#434dba]"}`} + > + {campus.label} +
+ ))} +
+
+
+
+
*/}
); } -export default SideBar; +export default SideBar; \ No newline at end of file diff --git a/src/components/ui/skeleton.tsx b/src/components/ui/skeleton.tsx index d7e45f7..c26c4ea 100644 --- a/src/components/ui/skeleton.tsx +++ b/src/components/ui/skeleton.tsx @@ -1,4 +1,4 @@ -import { cn } from "@/lib/utils" +import { cn } from "@/lib/utils"; function Skeleton({ className, @@ -9,7 +9,7 @@ function Skeleton({ className={cn("animate-pulse rounded-md bg-primary/10", className)} {...props} /> - ) + ); } -export { Skeleton } +export { Skeleton }; From 426ed132287d0ce68a3c57779094697ba6d29abd Mon Sep 17 00:00:00 2001 From: Noscope999 Date: Sun, 20 Jul 2025 00:35:24 +0530 Subject: [PATCH 7/8] patch:added back removed buttons for selecting/deselecting/downloading papers --- src/components/PapersCarousel.tsx | 109 +++++++++++++++++++----------- src/components/SideBar.tsx | 32 +++++++++ 2 files changed, 103 insertions(+), 38 deletions(-) diff --git a/src/components/PapersCarousel.tsx b/src/components/PapersCarousel.tsx index bf2c763..1bf237d 100644 --- a/src/components/PapersCarousel.tsx +++ b/src/components/PapersCarousel.tsx @@ -18,7 +18,33 @@ import { Skeleton } from "@/components/ui/skeleton"; function PapersCarousel() { const [displayPapers, setDisplayPapers] = useState([]); const [isLoading, setIsLoading] = useState(true); - const chunkSize = 8; + const [chunkSize, setChunkSize] = useState(4); // dynamic chunk size + + useEffect(() => { + const handleResize = () => { + if (window.innerWidth < 640) { + setChunkSize(4); + } else { + setChunkSize(8); + } + }; + + // preload sample subjects + localStorage.setItem( + "userSubjects", + JSON.stringify([ + "Information Security [CBS3002]", + "Foundations of Data Analytics [BCSE351E]", + "Design and Analysis of Algorithms [MCSE502L]", + "Complex Variables and Linear Algebra [BMAT201L]", + "Differential Equations and Transforms [BMAT102L]", + ]) + ); + + handleResize(); // initialize + window.addEventListener("resize", handleResize); + return () => window.removeEventListener("resize", handleResize); + }, []); useEffect(() => { async function fetchPapers() { @@ -56,46 +82,53 @@ function PapersCarousel() {
- {isLoading - ? Array.from({ length: 1 }).map((_, index) => ( - - {Array.from({ length: chunkSize }).map((_, idx) => ( -
-
- -
-
- -
- - -
-
-
- ))} -
- )) - : chunkedPapers.map((paperGroup, index) => ( - + {Array.from({ length: chunkSize }).map((_, idx) => ( +
- {paperGroup.map((paper, subIndex) => ( -
- +
+ +
+
+ +
+ +
- ))} - +
+
))} + + ) : ( + chunkedPapers.map((paperGroup, index) => ( + + {paperGroup.map((paper, subIndex) => ( +
+ +
+ ))} +
+ )) + )}
diff --git a/src/components/SideBar.tsx b/src/components/SideBar.tsx index 484f61a..074e020 100644 --- a/src/components/SideBar.tsx +++ b/src/components/SideBar.tsx @@ -20,6 +20,13 @@ function SideBar({ selectedAnswerKeyIncluded, filterOptions, handleApplyFilters, + noAppliedFilters, + closeFilters, + subject, + selectedPapers, + handleSelectAll, + handleDeselectAll, + handleDownloadAll, }: { loading: boolean; selectedExams: string[]; @@ -41,6 +48,9 @@ function SideBar({ semester: string[], anskey: boolean ) => void; + handleSelectAll: () => void; + handleDeselectAll: () => void; + handleDownloadAll: () => void; }) { const exams = filterOptions?.uniqueExams.map((exam) => ({ @@ -104,6 +114,28 @@ function SideBar({
+ {/* Select/Deselect/Download All Buttons */} +
+
+ Select All +
+
+ Deselect All +
+
+ Download All +
+
+
From 161e35eb361bf8f2389222e299d7824ec1158251 Mon Sep 17 00:00:00 2001 From: Noscope999 Date: Mon, 21 Jul 2025 00:39:37 +0530 Subject: [PATCH 8/8] feat:added back chunksize but broke skeleton rendering in the process --- src/components/PapersCarousel.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/PapersCarousel.tsx b/src/components/PapersCarousel.tsx index 1bf237d..0d7578f 100644 --- a/src/components/PapersCarousel.tsx +++ b/src/components/PapersCarousel.tsx @@ -129,7 +129,7 @@ function PapersCarousel() { )) )} - +
);