@@ -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 {
@@ -26,6 +22,7 @@ import {
2622 downloadFile ,
2723} from "@/util/download_paper" ;
2824import type { ICourses } from "@/interface" ;
25+ import { useCourses } from "@/context/courseContext" ;
2926
3027const CatalogueContent = ( ) => {
3128 const router = useRouter ( ) ;
@@ -52,6 +49,8 @@ const CatalogueContent = () => {
5249 const [ appliedFilters , setAppliedFilters ] = useState < boolean > ( false ) ;
5350 const [ pinned , setPinned ] = useState < boolean > ( false ) ;
5451 const [ relatedSubjects , setRelatedSubjects ] = useState < string [ ] > ( [ ] ) ;
52+ const { courses } = useCourses ( ) ;
53+
5554 // Fetch related subjects when subject changes
5655 useEffect ( ( ) => {
5756 if ( ! subject ) return ;
@@ -78,31 +77,11 @@ const CatalogueContent = () => {
7877 void fetchRelatedSubjects ( ) ;
7978 } , [ subject ] ) ;
8079
81- useEffect ( ( ) => {
82- if ( pathname !== "/catalogue" ) return ;
83-
84- const getSubjects = async ( ) => {
85- try {
86- const res = await fetch ( "/api/course-list" ) ;
87- if ( ! res . ok ) return ;
88-
89- const json : unknown = await res . json ( ) ;
90-
91- if ( Array . isArray ( json ) ) {
92- const filtered = json
93- . filter ( ( item ) : item is ICourses => typeof item === "object" && item !== null && "name" in item )
94- . map ( item => item . name ) ;
95- setSubjects ( filtered ) ;
96- } else {
97- console . error ( "Invalid data returned from API:" , json ) ;
98- }
99- } catch ( err ) {
100- console . error ( "Failed to fetch courses" , err ) ;
101- }
102- } ;
103-
104- void getSubjects ( ) ;
105- } , [ pathname ] ) ;
80+ useEffect ( ( ) => {
81+ if ( pathname !== "/catalogue" ) return ;
82+ const filteredSubjects = courses . map ( ( course ) => course . name ) ;
83+ setSubjects ( filteredSubjects ) ;
84+ } , [ pathname , courses ] ) ;
10685 // Set initial state from searchParams on client-side mount
10786 useEffect ( ( ) => {
10887 setIsMounted ( true ) ;
@@ -321,68 +300,72 @@ const CatalogueContent = () => {
321300
322301 return (
323302 < div className = "relative flex min-h-screen justify-center p-0 md:justify-normal" >
324- { papers . length > 0 && < div className = "hidden !w-[22%] min-w-[22%] max-w-[22%] flex-shrink-0 md:block" >
325- < SideBar
326- filtersNotPulled = { filtersNotPulled }
327- loading = { loading }
328- selectedExams = { selectedExams }
329- selectedSlots = { selectedSlots }
330- selectedYears = { selectedYears }
331- selectedSemesters = { selectedSemesters }
332- selectedCampuses = { selectedCampuses }
333- selectedAnswerKeyIncluded = { selectedAnswerKeyIncluded }
334- noAppliedFilters = { noAppliedFilters }
335- handleApplyFilters = { handleApplyFilters }
336- handleSelectAll = { handleSelectAll }
337- handleDeselectAll = { handleDeselectAll }
338- selectedPapers = { selectedPapers }
339- subject = { subject }
340- filterOptions = { filterOptions }
341- handleDownloadAll = { handleDownloadAll }
342- closeFilters = { closeFilters }
343- />
344- </ div > }
303+ { papers . length > 0 && (
304+ < div className = "hidden !w-[22%] min-w-[22%] max-w-[22%] flex-shrink-0 md:block" >
305+ < SideBar
306+ filtersNotPulled = { filtersNotPulled }
307+ loading = { loading }
308+ selectedExams = { selectedExams }
309+ selectedSlots = { selectedSlots }
310+ selectedYears = { selectedYears }
311+ selectedSemesters = { selectedSemesters }
312+ selectedCampuses = { selectedCampuses }
313+ selectedAnswerKeyIncluded = { selectedAnswerKeyIncluded }
314+ noAppliedFilters = { noAppliedFilters }
315+ handleApplyFilters = { handleApplyFilters }
316+ handleSelectAll = { handleSelectAll }
317+ handleDeselectAll = { handleDeselectAll }
318+ selectedPapers = { selectedPapers }
319+ subject = { subject }
320+ filterOptions = { filterOptions }
321+ handleDownloadAll = { handleDownloadAll }
322+ closeFilters = { closeFilters }
323+ />
324+ </ div >
325+ ) }
345326
346327 < div className = "w-full" >
347- { papers . length > 0 && < Sheet >
348- < SheetTrigger className = "mx-8 mt-8 block md:hidden" >
349- < Button
350- variant = "outline"
351- 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"
328+ { papers . length > 0 && (
329+ < Sheet >
330+ < SheetTrigger className = "mx-8 mt-8 block md:hidden" >
331+ < Button
332+ variant = "outline"
333+ 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"
334+ >
335+ < Filter size = { 18 } />
336+ Add Filters
337+ </ Button >
338+ </ SheetTrigger >
339+ < SheetContent
340+ side = { "left" }
341+ className = "m-0 bg-[#f3f5ff] p-0 pt-4 dark:bg-[#070114]"
352342 >
353- < Filter size = { 18 } />
354- Add Filters
355- </ Button >
356- </ SheetTrigger >
357- < SheetContent
358- side = { "left" }
359- className = "m-0 bg-[#f3f5ff] p-0 pt-4 dark:bg-[#070114]"
360- >
361- < SideBar
362- filtersNotPulled = { filtersNotPulled }
363- loading = { loading }
364- selectedExams = { selectedExams }
365- selectedSlots = { selectedSlots }
366- selectedYears = { selectedYears }
367- selectedSemesters = { selectedSemesters }
368- selectedCampuses = { selectedCampuses }
369- selectedAnswerKeyIncluded = { selectedAnswerKeyIncluded }
370- noAppliedFilters = { noAppliedFilters }
371- handleApplyFilters = { handleApplyFilters }
372- handleSelectAll = { handleSelectAll }
373- handleDeselectAll = { handleDeselectAll }
374- selectedPapers = { selectedPapers }
375- subject = { subject }
376- filterOptions = { filterOptions }
377- handleDownloadAll = { handleDownloadAll }
378- closeFilters = { closeFilters }
379- />
380- </ SheetContent >
381- </ Sheet > }
343+ < SideBar
344+ filtersNotPulled = { filtersNotPulled }
345+ loading = { loading }
346+ selectedExams = { selectedExams }
347+ selectedSlots = { selectedSlots }
348+ selectedYears = { selectedYears }
349+ selectedSemesters = { selectedSemesters }
350+ selectedCampuses = { selectedCampuses }
351+ selectedAnswerKeyIncluded = { selectedAnswerKeyIncluded }
352+ noAppliedFilters = { noAppliedFilters }
353+ handleApplyFilters = { handleApplyFilters }
354+ handleSelectAll = { handleSelectAll }
355+ handleDeselectAll = { handleDeselectAll }
356+ selectedPapers = { selectedPapers }
357+ subject = { subject }
358+ filterOptions = { filterOptions }
359+ handleDownloadAll = { handleDownloadAll }
360+ closeFilters = { closeFilters }
361+ />
362+ </ SheetContent >
363+ </ Sheet >
364+ ) }
382365
383- < div className = "p-7 flex flex-col items-start" >
384- < div className = "md:hidden flex flex-col items-start w-full mb-8 " >
385- < SearchBarChild initialSubjects = { subjects } />
366+ < div className = "flex flex-col items-start p-7 " >
367+ < div className = "mb-8 flex w-full flex-col items-start md:hidden " >
368+ < SearchBarChild initialSubjects = { courses } />
386369 </ div >
387370 < div className = "flex items-center gap-2" >
388371 < div >
0 commit comments