11"use client" ;
22
3+ import { Pin } from "lucide-react" ;
34import { useEffect , useState } from "react" ;
45import axios from "axios" ;
56import { type IUpcomingPaper } from "@/interface" ;
@@ -18,21 +19,17 @@ import Autoplay from "embla-carousel-autoplay";
1819import { chunkArray } from "@/util/utils" ;
1920import { StoredSubjects } from "@/interface" ;
2021import SkeletonPaperCard from "./SkeletonPaperCard" ;
21-
22+ import PinnedModal from "./ui/PinnedModal" ;
2223type PinnedPapersCarouselProps = {
2324 carouselType : "users" | "upcoming" ,
24- displayPapers : IUpcomingPaper [ ] ,
25- setDisplayPapers : React . Dispatch < React . SetStateAction < IUpcomingPaper [ ] > >
2625}
2726
2827function PinnedPapersCarousel ( {
2928 carouselType = "upcoming" ,
30- displayPapers,
31- setDisplayPapers
3229} : PinnedPapersCarouselProps ) {
3330 const [ isLoading , setIsLoading ] = useState ( true ) ;
3431 const [ chunkSize , setChunkSize ] = useState < number > ( 4 ) ;
35-
32+ const [ displayPapers , setDisplayPapers ] = useState < IUpcomingPaper [ ] > ( [ ] ) ;
3633 useEffect ( ( ) => {
3734 const handleResize = ( ) => {
3835 if ( window . innerWidth <= 540 ) {
@@ -96,8 +93,39 @@ function PinnedPapersCarousel({
9693 } , [ ] ) ;
9794
9895 useEffect ( ( ) => {
99- const handleSubjectsChange = ( ) => {
100- void fetchPapers ( ) ;
96+ const handleSubjectsChange = async ( ) => {
97+ try {
98+ const storedSubjects = JSON . parse (
99+ localStorage . getItem ( "userSubjects" ) ?? "[]" ,
100+ ) as StoredSubjects ;
101+
102+ const response = await axios . post < { subject : string ; slots : string [ ] } [ ] > (
103+ "/api/user-papers" ,
104+ storedSubjects ,
105+ ) ;
106+
107+ const fetchedPapers = response . data ;
108+
109+ const fetchedSubjectsSet = new Set (
110+ fetchedPapers . map ( ( paper ) => paper . subject ) ,
111+ ) ;
112+
113+ const storedSubjectsArray = Array . isArray ( storedSubjects )
114+ ? storedSubjects
115+ : [ ] ;
116+ const missingSubjects = storedSubjectsArray
117+ . filter ( ( subject : string ) => ! fetchedSubjectsSet . has ( subject ) )
118+ . map ( ( subject : string ) => ( {
119+ subject,
120+ slots : [ ] ,
121+ } ) ) as { subject : string ; slots : string [ ] } [ ] ;
122+
123+ const allDisplayPapers = [ ...fetchedPapers , ...missingSubjects ] ;
124+
125+ setDisplayPapers ( allDisplayPapers ) ;
126+ } catch ( error ) {
127+ console . error ( "Failed to fetch papers:" , error ) ;
128+ }
101129 } ;
102130
103131 window . addEventListener ( "userSubjectsChanged" , handleSubjectsChange ) ;
@@ -164,7 +192,6 @@ function PinnedPapersCarousel({
164192 window . dispatchEvent ( new Event ( "addButtonClicked" ) ) ;
165193 } }
166194 >
167- < AddPapers />
168195 </ div >
169196 ) }
170197 </ CarouselItem >
@@ -173,9 +200,15 @@ function PinnedPapersCarousel({
173200 ) }
174201 </ CarouselContent >
175202 </ Carousel > :
176- < div className = { `relative flex justify-center gap-4 items-center h-max text-center my-48 font-bold` }
203+ < div className = { `relative flex flex-col justify-center gap-4 items-center h-max text-center my-48 font-bold` }
177204 >
178205 Start pinning subjects for quick and easy access.
206+ < div className = "flex h-8 items-center gap-1 rounded-full border border-[#3A3745] bg-[#e8e9ff] px-2.5 py-1 text-xs font-semibold text-gray-700 transition hover:bg-slate-50 dark:bg-black dark:text-white dark:hover:bg-[#1A1823] sm:h-9 sm:gap-2 sm:px-3.5 sm:py-1.5 sm:text-sm md:h-10 md:px-4 md:py-2 md:text-base" >
207+ < Pin className = "h-3.5 w-3.5 sm:h-4 sm:w-4" />
208+ < span className = "truncate" >
209+ < PinnedModal />
210+ </ span >
211+ </ div >
179212 </ div > }
180213 </ div >
181214 </ div >
0 commit comments