@@ -4,11 +4,7 @@ import { useSearchParams } from "next/navigation";
44import { useCallback , useEffect , useState } from "react" ;
55import axios , { type AxiosError } from "axios" ;
66import { Button } from "@/components/ui/button" ;
7- import {
8- type IPaper ,
9- type Filters ,
10- type StoredSubjects
11- } from "@/interface" ;
7+ import { type IPaper , type Filters , type StoredSubjects } from "@/interface" ;
128import Card from "./Card" ;
139import { useRouter } from "next/navigation" ;
1410import Loader from "./ui/loader" ;
@@ -17,7 +13,7 @@ import Error from "./Error";
1713import { Filter } from "lucide-react" ;
1814import { Sheet , SheetContent , SheetTrigger } from "./ui/sheet" ;
1915import { Pin } from "lucide-react" ;
20- import SearchBarChild from "./Searchbar/searchbar-child"
16+ import SearchBarChild from "./Searchbar/searchbar-child" ;
2117import Link from "next/link" ;
2218import { usePathname } from "next/navigation" ;
2319import {
@@ -28,6 +24,7 @@ import {
2824import type { ICourses } from "@/interface" ;
2925import JSZip from "jszip" ;
3026import { toast } from "react-hot-toast" ;
27+ import { useCourses } from "@/context/courseContext" ;
3128
3229const CatalogueContent = ( ) => {
3330 const router = useRouter ( ) ;
@@ -54,6 +51,8 @@ const CatalogueContent = () => {
5451 const [ appliedFilters , setAppliedFilters ] = useState < boolean > ( false ) ;
5552 const [ pinned , setPinned ] = useState < boolean > ( false ) ;
5653 const [ relatedSubjects , setRelatedSubjects ] = useState < string [ ] > ( [ ] ) ;
54+ const { courses } = useCourses ( ) ;
55+
5756 // Fetch related subjects when subject changes
5857 useEffect ( ( ) => {
5958 if ( ! subject ) return ;
@@ -80,31 +79,11 @@ const CatalogueContent = () => {
8079 void fetchRelatedSubjects ( ) ;
8180 } , [ subject ] ) ;
8281
83- useEffect ( ( ) => {
84- if ( pathname !== "/catalogue" ) return ;
85-
86- const getSubjects = async ( ) => {
87- try {
88- const res = await fetch ( "/api/course-list" ) ;
89- if ( ! res . ok ) return ;
90-
91- const json : unknown = await res . json ( ) ;
92-
93- if ( Array . isArray ( json ) ) {
94- const filtered = json
95- . filter ( ( item ) : item is ICourses => typeof item === "object" && item !== null && "name" in item )
96- . map ( item => item . name ) ;
97- setSubjects ( filtered ) ;
98- } else {
99- console . error ( "Invalid data returned from API:" , json ) ;
100- }
101- } catch ( err ) {
102- console . error ( "Failed to fetch courses" , err ) ;
103- }
104- } ;
105-
106- void getSubjects ( ) ;
107- } , [ pathname ] ) ;
82+ useEffect ( ( ) => {
83+ if ( pathname !== "/catalogue" ) return ;
84+ const filteredSubjects = courses . map ( ( course ) => course . name ) ;
85+ setSubjects ( filteredSubjects ) ;
86+ } , [ pathname , courses ] ) ;
10887 // Set initial state from searchParams on client-side mount
10988 useEffect ( ( ) => {
11089 setIsMounted ( true ) ;
@@ -233,7 +212,7 @@ const CatalogueContent = () => {
233212 const uniquePapers = Array . from (
234213 new Set ( selectedPapers . map ( ( paper ) => paper . _id ) ) ,
235214 ) . map ( ( id ) => selectedPapers . find ( ( paper ) => paper . _id === id ) ) as IPaper [ ] ;
236- if ( ! uniquePapers ) {
215+ if ( ! uniquePapers ) {
237216 toast . error ( "No papers selected for download." ) ;
238217 }
239218 for ( const paper of uniquePapers ) {
@@ -247,7 +226,7 @@ const CatalogueContent = () => {
247226 console . error ( `Failed to fetch ${ paper . final_url } ` , err ) ;
248227 }
249228 }
250-
229+
251230 const zipBlob = await zip . generateAsync ( { type : "blob" } ) ;
252231 const url = URL . createObjectURL ( zipBlob ) ;
253232 const a = document . createElement ( "a" ) ;
@@ -257,7 +236,7 @@ const CatalogueContent = () => {
257236 a . click ( ) ;
258237 a . remove ( ) ;
259238 URL . revokeObjectURL ( url ) ;
260- toast . success ( "Download Initiated" )
239+ toast . success ( "Download Initiated" ) ;
261240 } , [ selectedPapers ] ) ;
262241
263242 const handleApplyFilters = useCallback (
@@ -342,68 +321,72 @@ const CatalogueContent = () => {
342321
343322 return (
344323 < div className = "relative flex min-h-screen justify-center p-0 md:justify-normal" >
345- { papers . length > 0 && < div className = "hidden !w-[22%] min-w-[22%] max-w-[22%] flex-shrink-0 md:block" >
346- < SideBar
347- filtersNotPulled = { filtersNotPulled }
348- loading = { loading }
349- selectedExams = { selectedExams }
350- selectedSlots = { selectedSlots }
351- selectedYears = { selectedYears }
352- selectedSemesters = { selectedSemesters }
353- selectedCampuses = { selectedCampuses }
354- selectedAnswerKeyIncluded = { selectedAnswerKeyIncluded }
355- noAppliedFilters = { noAppliedFilters }
356- handleApplyFilters = { handleApplyFilters }
357- handleSelectAll = { handleSelectAll }
358- handleDeselectAll = { handleDeselectAll }
359- selectedPapers = { selectedPapers }
360- subject = { subject }
361- filterOptions = { filterOptions }
362- handleDownloadSelected = { handleDownloadSelected }
363- closeFilters = { closeFilters }
364- />
365- </ div > }
324+ { papers . length > 0 && (
325+ < div className = "hidden !w-[22%] min-w-[22%] max-w-[22%] flex-shrink-0 md:block" >
326+ < SideBar
327+ filtersNotPulled = { filtersNotPulled }
328+ loading = { loading }
329+ selectedExams = { selectedExams }
330+ selectedSlots = { selectedSlots }
331+ selectedYears = { selectedYears }
332+ selectedSemesters = { selectedSemesters }
333+ selectedCampuses = { selectedCampuses }
334+ selectedAnswerKeyIncluded = { selectedAnswerKeyIncluded }
335+ noAppliedFilters = { noAppliedFilters }
336+ handleApplyFilters = { handleApplyFilters }
337+ handleSelectAll = { handleSelectAll }
338+ handleDeselectAll = { handleDeselectAll }
339+ selectedPapers = { selectedPapers }
340+ subject = { subject }
341+ filterOptions = { filterOptions }
342+ handleDownloadSelected = { handleDownloadSelected }
343+ closeFilters = { closeFilters }
344+ />
345+ </ div >
346+ ) }
366347
367348 < div className = "w-full" >
368- { papers . length > 0 && < Sheet >
369- < SheetTrigger className = "mx-8 mt-8 block md:hidden" >
370- < Button
371- variant = "outline"
372- className = "flex gap-2 border-2 border-black font-sans font-semibold hover:bg-slate-800 hover:text-white dark:border-[#434dba] dark:hover:border-white dark:hover:bg-slate-900"
349+ { papers . length > 0 && (
350+ < Sheet >
351+ < SheetTrigger className = "mx-8 mt-8 block md:hidden" >
352+ < Button
353+ variant = "outline"
354+ className = "flex gap-2 border-2 border-black font-sans font-semibold hover:bg-slate-800 hover:text-white dark:border-[#434dba] dark:hover:border-white dark:hover:bg-slate-900"
355+ >
356+ < Filter size = { 18 } />
357+ Add Filters
358+ </ Button >
359+ </ SheetTrigger >
360+ < SheetContent
361+ side = { "left" }
362+ className = "m-0 bg-[#f3f5ff] p-0 pt-4 dark:bg-[#070114]"
373363 >
374- < Filter size = { 18 } />
375- Add Filters
376- </ Button >
377- </ SheetTrigger >
378- < SheetContent
379- side = { "left" }
380- className = "m-0 bg-[#f3f5ff] p-0 pt-4 dark:bg-[#070114]"
381- >
382- < SideBar
383- filtersNotPulled = { filtersNotPulled }
384- loading = { loading }
385- selectedExams = { selectedExams }
386- selectedSlots = { selectedSlots }
387- selectedYears = { selectedYears }
388- selectedSemesters = { selectedSemesters }
389- selectedCampuses = { selectedCampuses }
390- selectedAnswerKeyIncluded = { selectedAnswerKeyIncluded }
391- noAppliedFilters = { noAppliedFilters }
392- handleApplyFilters = { handleApplyFilters }
393- handleSelectAll = { handleSelectAll }
394- handleDeselectAll = { handleDeselectAll }
395- selectedPapers = { selectedPapers }
396- subject = { subject }
397- filterOptions = { filterOptions }
398- handleDownloadSelected = { handleDownloadSelected }
399- closeFilters = { closeFilters }
400- />
401- </ SheetContent >
402- </ Sheet > }
364+ < SideBar
365+ filtersNotPulled = { filtersNotPulled }
366+ loading = { loading }
367+ selectedExams = { selectedExams }
368+ selectedSlots = { selectedSlots }
369+ selectedYears = { selectedYears }
370+ selectedSemesters = { selectedSemesters }
371+ selectedCampuses = { selectedCampuses }
372+ selectedAnswerKeyIncluded = { selectedAnswerKeyIncluded }
373+ noAppliedFilters = { noAppliedFilters }
374+ handleApplyFilters = { handleApplyFilters }
375+ handleSelectAll = { handleSelectAll }
376+ handleDeselectAll = { handleDeselectAll }
377+ selectedPapers = { selectedPapers }
378+ subject = { subject }
379+ filterOptions = { filterOptions }
380+ handleDownloadSelected = { handleDownloadSelected }
381+ closeFilters = { closeFilters }
382+ />
383+ </ SheetContent >
384+ </ Sheet >
385+ ) }
403386
404- < div className = "p-7 flex flex-col items-start" >
405- < div className = "md:hidden flex flex-col items-start w-full mb-8 " >
406- < SearchBarChild initialSubjects = { subjects } />
387+ < div className = "flex flex-col items-start p-7 " >
388+ < div className = "mb-8 flex w-full flex-col items-start md:hidden " >
389+ < SearchBarChild initialSubjects = { courses } />
407390 </ div >
408391 < div className = "flex items-center gap-2" >
409392 < div >
0 commit comments