Skip to content

Commit 12c158a

Browse files
Merge pull request #318 from Advik-Gupta/prod
Issue Fix: 295, 312, 313, 303
2 parents db777ef + 97d885c commit 12c158a

4 files changed

Lines changed: 197 additions & 91 deletions

File tree

src/components/CatalogueContent.tsx

Lines changed: 57 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ const CatalogueContent = () => {
5353
const [pinned, setPinned] = useState<boolean>(false);
5454
const [relatedSubjects, setRelatedSubjects] = useState<string[]>([]);
5555
const { courses } = useCourses();
56+
const [currentPage, setCurrentPage] = useState(1);
57+
const [papersPerPage, setPapersPerPage] = useState(12); // show 12 per page
5658

5759
// Fetch related subjects when subject changes
5860
useEffect(() => {
@@ -315,6 +317,15 @@ const CatalogueContent = () => {
315317
setSelectedPapers([]);
316318
}, []);
317319

320+
const paginatedPapers = (appliedFilters ? filteredPapers : papers).slice(
321+
(currentPage - 1) * papersPerPage,
322+
currentPage * papersPerPage,
323+
);
324+
325+
const totalPages = Math.ceil(
326+
(appliedFilters ? filteredPapers.length : papers.length) / papersPerPage,
327+
);
328+
318329
// Render loading state until mounted to avoid hydration mismatch
319330
if (!isMounted) {
320331
return <Loader />;
@@ -427,34 +438,59 @@ const CatalogueContent = () => {
427438
{loading ? (
428439
<Loader />
429440
) : papers.length > 0 ? (
430-
<div
431-
className={`grid h-fit grid-cols-1 gap-8 px-[30px] pb-[40px] md:grid-cols-2 lg:grid-cols-4 ${filtersPulled ? "blur-xl" : ""}`}
432-
>
433-
{appliedFilters ? (
434-
filteredPapers.length > 0 ? (
435-
filteredPapers.map((paper: IPaper) => (
441+
<div className="flex flex-col items-center">
442+
<div
443+
className={`grid h-fit grid-cols-1 gap-8 px-[30px] pb-[40px] md:grid-cols-2 lg:grid-cols-4 ${filtersPulled ? "blur-xl" : ""}`}
444+
>
445+
{appliedFilters ? (
446+
paginatedPapers.length > 0 ? (
447+
paginatedPapers.map((paper: IPaper) => (
448+
<Card
449+
key={paper._id}
450+
paper={paper}
451+
onSelect={handleSelectPaper}
452+
isSelected={selectedPapers.some(
453+
(p) => p._id === paper._id,
454+
)}
455+
/>
456+
))
457+
) : (
458+
<div className="col-span-full flex justify-center">
459+
<EmptyState />
460+
</div>
461+
)
462+
) : (
463+
papers.map((paper: IPaper) => (
436464
<Card
437465
key={paper._id}
438466
paper={paper}
439467
onSelect={handleSelectPaper}
440468
isSelected={selectedPapers.some((p) => p._id === paper._id)}
441469
/>
442470
))
443-
) : (
444-
<div className="col-span-full flex justify-center">
445-
<EmptyState />
446-
</div>
447-
)
448-
) : (
449-
papers.map((paper: IPaper) => (
450-
<Card
451-
key={paper._id}
452-
paper={paper}
453-
onSelect={handleSelectPaper}
454-
isSelected={selectedPapers.some((p) => p._id === paper._id)}
455-
/>
456-
))
457-
)}
471+
)}
472+
</div>
473+
<div className="mt-8 flex items-center justify-center gap-4">
474+
<Button
475+
variant="outline"
476+
disabled={currentPage === 1}
477+
onClick={() => setCurrentPage((prev) => prev - 1)}
478+
>
479+
Previous
480+
</Button>
481+
482+
<span className="text-gray-700 dark:text-gray-300">
483+
Page {currentPage} of {totalPages}
484+
</span>
485+
486+
<Button
487+
variant="outline"
488+
disabled={currentPage === totalPages}
489+
onClick={() => setCurrentPage((prev) => prev + 1)}
490+
>
491+
Next
492+
</Button>
493+
</div>
458494
</div>
459495
) : (
460496
<Error

src/components/RelatedPaper.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,14 @@ const RelatedPapers = () => {
6666
if (loading) return <Loader />;
6767
if (!currentPaper) return <div className="font-vipna">Paper not found.</div>;
6868

69+
if (relatedPapers.length === 0) {
70+
return <></>;
71+
}
72+
6973
return (
70-
<div className="font-vipna space-y-4 p-6">
74+
<div className="space-y-4 p-6 font-vipna">
7175
<div className="flex items-center justify-between">
72-
<h2 className="font-play my-6 text-3xl font-semibold">Explore More</h2>
76+
<h2 className="my-6 font-play text-3xl font-semibold">Explore More</h2>
7377

7478
<Link
7579
href={`/catalogue?subject=${encodeURIComponent(currentPaper.subject)}`}

src/components/pdfViewer.tsx

Lines changed: 133 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -168,21 +168,23 @@ export default function PdfViewer({ url, name }: PdfViewerProps) {
168168
return () => window.removeEventListener("resize", calculateScale);
169169
}, []);
170170

171-
useEffect(() => {
172-
const container = containerRef.current;
173-
if (!container) return;
174-
175-
const handleWheel = (e: WheelEvent) => {
176-
if (e.ctrlKey) { // ctrl+wheel is pinch zoom gesture
177-
e.preventDefault();
178-
setScale((prev) => Math.max(0.1, prev + (e.deltaY < 0 ? 0.1 : -0.1)));
179-
}
180-
};
171+
useEffect(() => {
172+
const container = containerRef.current;
173+
if (!container) return;
181174

182-
container.addEventListener("wheel", handleWheel, { passive: false });
183-
return () => container.removeEventListener("wheel", handleWheel);
184-
}, []);
175+
const handleWheel = (e: WheelEvent) => {
176+
if (e.ctrlKey) {
177+
e.preventDefault();
178+
const step = 0.02;
179+
setScale((prev) =>
180+
Math.max(0.25, Math.min(3, prev + (e.deltaY < 0 ? step : -step))),
181+
);
182+
}
183+
};
185184

185+
container.addEventListener("wheel", handleWheel, { passive: false });
186+
return () => container.removeEventListener("wheel", handleWheel);
187+
}, []);
186188

187189
return (
188190
<div className="flex flex-col items-center p-3 md:p-0">
@@ -227,63 +229,128 @@ useEffect(() => {
227229
</div>
228230
))}
229231
</Document>
232+
{isFullscreen && (
233+
<div className="fixed bottom-4 left-1/2 z-50 mt-4 flex -translate-x-1/2 flex-col items-center gap-4 rounded-lg bg-[#F3F5FF] p-4 shadow dark:bg-[#262635] sm:flex-row">
234+
<div className="flex items-center gap-2">
235+
<Button
236+
onClick={goToPreviousPage}
237+
disabled={pageNumber <= 1}
238+
className="h-10 w-10 rounded p-0 text-white transition hover:bg-[#6536c1] disabled:bg-[#706b7a] disabled:opacity-50"
239+
>
240+
<FaLessThan />
241+
</Button>
242+
<input
243+
type="number"
244+
value={pageNumber}
245+
onChange={handlePageChange}
246+
min={1}
247+
max={numPages}
248+
className="h-10 w-16 rounded border p-1 text-center [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none"
249+
/>
250+
<span>of {numPages ?? 1}</span>
251+
<Button
252+
onClick={goToNextPage}
253+
disabled={pageNumber >= (numPages ?? 1)}
254+
className="h-10 w-10 rounded p-0 text-white transition hover:bg-[#6536c1] disabled:bg-[#706b7a] disabled:opacity-50"
255+
>
256+
<FaGreaterThan />
257+
</Button>
258+
</div>
259+
260+
<div className="flex items-center gap-2">
261+
<Button
262+
onClick={zoomOut}
263+
disabled={scale <= 0.25}
264+
className="h-10 w-10 rounded p-0 text-white transition hover:bg-[#6536c1] disabled:bg-gray-300"
265+
>
266+
<ZoomOut />
267+
</Button>
268+
<span>{(scale * 100).toFixed(0)}%</span>
269+
<Button
270+
onClick={zoomIn}
271+
disabled={scale >= 3}
272+
className="h-10 w-10 rounded p-0 text-white transition hover:bg-[#6536c1] disabled:bg-gray-300"
273+
>
274+
<ZoomIn />
275+
</Button>
276+
<ShareButton />
277+
<Button
278+
onClick={downloadPDF}
279+
className="aspect-square h-10 w-10 p-0"
280+
>
281+
<Download />
282+
</Button>
283+
<Button
284+
onClick={toggleFullscreen}
285+
className="h-10 w-10 rounded p-0 text-white transition hover:bg-[#6536c1]"
286+
>
287+
{isFullscreen ? <Minimize2 /> : <Maximize2 />}
288+
</Button>
289+
</div>
290+
</div>
291+
)}
230292
</div>
231293

232-
<div className="mt-4 flex flex-col items-center gap-4 rounded-lg bg-[#F3F5FF] p-4 shadow dark:bg-[#262635] sm:flex-row">
233-
<div className="flex items-center gap-2">
234-
<Button
235-
onClick={goToPreviousPage}
236-
disabled={pageNumber <= 1}
237-
className="h-10 w-10 rounded p-0 text-white transition hover:bg-[#6536c1] disabled:bg-[#706b7a] disabled:opacity-50"
238-
>
239-
<FaLessThan />
240-
</Button>
241-
<input
242-
type="number"
243-
value={pageNumber}
244-
onChange={handlePageChange}
245-
min={1}
246-
max={numPages}
247-
className="h-10 w-16 rounded border p-1 text-center [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none"
248-
/>
249-
<span>of {numPages ?? 1}</span>
250-
<Button
251-
onClick={goToNextPage}
252-
disabled={pageNumber >= (numPages ?? 1)}
253-
className="h-10 w-10 rounded p-0 text-white transition hover:bg-[#6536c1] disabled:bg-[#706b7a] disabled:opacity-50"
254-
>
255-
<FaGreaterThan />
256-
</Button>
257-
</div>
294+
{!isFullscreen && (
295+
<div className="mt-4 flex flex-col items-center gap-4 rounded-lg bg-[#F3F5FF] p-4 shadow dark:bg-[#262635] sm:flex-row">
296+
<div className="flex items-center gap-2">
297+
<Button
298+
onClick={goToPreviousPage}
299+
disabled={pageNumber <= 1}
300+
className="h-10 w-10 rounded p-0 text-white transition hover:bg-[#6536c1] disabled:bg-[#706b7a] disabled:opacity-50"
301+
>
302+
<FaLessThan />
303+
</Button>
304+
<input
305+
type="number"
306+
value={pageNumber}
307+
onChange={handlePageChange}
308+
min={1}
309+
max={numPages}
310+
className="h-10 w-16 rounded border p-1 text-center [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none"
311+
/>
312+
<span>of {numPages ?? 1}</span>
313+
<Button
314+
onClick={goToNextPage}
315+
disabled={pageNumber >= (numPages ?? 1)}
316+
className="h-10 w-10 rounded p-0 text-white transition hover:bg-[#6536c1] disabled:bg-[#706b7a] disabled:opacity-50"
317+
>
318+
<FaGreaterThan />
319+
</Button>
320+
</div>
258321

259-
<div className="flex items-center gap-2">
260-
<Button
261-
onClick={zoomOut}
262-
disabled={scale <= 0.25}
263-
className="h-10 w-10 rounded p-0 text-white transition hover:bg-[#6536c1] disabled:bg-gray-300"
264-
>
265-
<ZoomOut />
266-
</Button>
267-
<span>{(scale * 100).toFixed(0)}%</span>
268-
<Button
269-
onClick={zoomIn}
270-
disabled={scale >= 3}
271-
className="h-10 w-10 rounded p-0 text-white transition hover:bg-[#6536c1] disabled:bg-gray-300"
272-
>
273-
<ZoomIn />
274-
</Button>
275-
<ShareButton />
276-
<Button onClick={downloadPDF} className="aspect-square h-10 w-10 p-0">
277-
<Download />
278-
</Button>
279-
<Button
280-
onClick={toggleFullscreen}
281-
className="h-10 w-10 rounded p-0 text-white transition hover:bg-[#6536c1]"
282-
>
283-
{isFullscreen ? <Minimize2 /> : <Maximize2 />}
284-
</Button>
322+
<div className="flex items-center gap-2">
323+
<Button
324+
onClick={zoomOut}
325+
disabled={scale <= 0.25}
326+
className="h-10 w-10 rounded p-0 text-white transition hover:bg-[#6536c1] disabled:bg-gray-300"
327+
>
328+
<ZoomOut />
329+
</Button>
330+
<span>{(scale * 100).toFixed(0)}%</span>
331+
<Button
332+
onClick={zoomIn}
333+
disabled={scale >= 3}
334+
className="h-10 w-10 rounded p-0 text-white transition hover:bg-[#6536c1] disabled:bg-gray-300"
335+
>
336+
<ZoomIn />
337+
</Button>
338+
<ShareButton />
339+
<Button
340+
onClick={downloadPDF}
341+
className="aspect-square h-10 w-10 p-0"
342+
>
343+
<Download />
344+
</Button>
345+
<Button
346+
onClick={toggleFullscreen}
347+
className="h-10 w-10 rounded p-0 text-white transition hover:bg-[#6536c1]"
348+
>
349+
{isFullscreen ? <Minimize2 /> : <Maximize2 />}
350+
</Button>
351+
</div>
285352
</div>
286-
</div>
353+
)}
287354
</div>
288355
);
289356
}

src/styles/globals.css

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,6 @@ body {
156156
}
157157

158158
@layer utilities {
159-
160159
/* Chrome, Safari and Opera */
161160
.no-scrollbar::-webkit-scrollbar {
162161
display: none;
@@ -168,4 +167,4 @@ body {
168167
scrollbar-width: none;
169168
/* Firefox */
170169
}
171-
}
170+
}

0 commit comments

Comments
 (0)