From 1ae7e52f354bef4ea28782cf71a64bb598f29084 Mon Sep 17 00:00:00 2001 From: Rithish Date: Sat, 11 Apr 2026 18:25:49 +0000 Subject: [PATCH 01/10] feat: add paper preview modal with PDF viewer (handles CORS using Google viewer) --- src/components/Card.tsx | 159 ++++++++++++++++++++++++---------------- 1 file changed, 97 insertions(+), 62 deletions(-) diff --git a/src/components/Card.tsx b/src/components/Card.tsx index e476147..740f860 100644 --- a/src/components/Card.tsx +++ b/src/components/Card.tsx @@ -1,5 +1,6 @@ "use client"; +import React from "react"; import { type IPaper } from "@/interface"; import Image from "next/image"; import { Eye, Download, Check } from "lucide-react"; @@ -23,6 +24,8 @@ interface CardProps { } const Card = ({ paper, onSelect, isSelected }: CardProps) => { + const [previewOpen, setPreviewOpen] = React.useState(false); + const handleDownload = async (paper: IPaper) => { await downloadFile(getSecureUrl(paper.file_url), generateFileName(paper)); }; @@ -34,77 +37,109 @@ const Card = ({ paper, onSelect, isSelected }: CardProps) => { const paperLink = `/paper/${paper._id}`; return ( -
- - {paper.subject} - -
-
-
- {extractBracketContent(paper.subject)} -
-
- - - - { - e.preventDefault(); - e.stopPropagation(); - void handleDownload(paper); - }} - className="cursor-pointer" - /> + <> +
+ + {paper.subject} + +
+
+
+ {extractBracketContent(paper.subject)} +
-
-
+
-
-
- {extractWithoutBracketContent(paper.subject)} -
-
- {paper.exam} - {paper.slot} - {paper.year} - {paper.semester} +
+
+ {extractWithoutBracketContent(paper.subject)} +
+
+ {paper.exam} + {paper.slot} + {paper.year} + {paper.semester} +
-
- - -
-
- + +
+ { + e.stopPropagation(); + setPreviewOpen(true); + }} + /> + + { + e.stopPropagation(); + void handleDownload(paper); + }} + className="cursor-pointer" /> -

Select

- {paper.answer_key_included && ( -
- - Answer Key + +
+
+ +

Select

- )} + + {paper.answer_key_included && ( +
+ + Answer Key +
+ )} +
-
+ + {previewOpen && ( +
setPreviewOpen(false)} + > +
e.stopPropagation()} + > + +