From e915c2b5118ebb968742fc22c37bb4ef6d4a2727 Mon Sep 17 00:00:00 2001 From: Rithish Date: Sat, 11 Apr 2026 17:35:01 +0000 Subject: [PATCH 1/2] fix: resolve accordion not collapsing due to controlled value prop --- .gitignore | 2 +- package-lock.json | 26 ++++++++------------------ src/components/SidebarSection.tsx | 2 +- 3 files changed, 10 insertions(+), 20 deletions(-) diff --git a/.gitignore b/.gitignore index 134b7f31..1509e892 100644 --- a/.gitignore +++ b/.gitignore @@ -34,7 +34,7 @@ yarn-error.log* # local env files # do not commit any .env files to git, except for the .env.example file. https://create.t3.gg/en/usage/env-variables#using-environment-variables .env -.env.lcal +.env.local .env*.local .env.prod # vercel diff --git a/package-lock.json b/package-lock.json index a238c1be..c21fbc1f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,6 @@ "@ungap/with-resolvers": "^0.1.0", "@upstash/ratelimit": "^2.0.5", "@upstash/redis": "^1.33.0", - "@vercel/kv": "^3.0.0", "axios": "^1.8.4", "canvas": "^3.2.0", "class-variance-authority": "^0.7.1", @@ -2662,19 +2661,6 @@ "uncrypto": "^0.1.3" } }, - "node_modules/@vercel/kv": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@vercel/kv/-/kv-3.0.0.tgz", - "integrity": "sha512-pKT8fRnfyYk2MgvyB6fn6ipJPCdfZwiKDdw7vB+HL50rjboEBHDVBEcnwfkEpVSp2AjNtoaOUH7zG+bVC/rvSg==", - "deprecated": "Vercel KV is deprecated. If you had an existing KV store, it should have moved to Upstash Redis which you will see under Vercel Integrations. For new projects, install a Redis integration from Vercel Marketplace: https://vercel.com/marketplace?category=storage&search=redis", - "license": "Apache-2.0", - "dependencies": { - "@upstash/redis": "^1.34.0" - }, - "engines": { - "node": ">=14.6" - } - }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", @@ -7653,8 +7639,9 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "4" }, @@ -7666,8 +7653,9 @@ "version": "5.1.3", "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", - "extraneous": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "extend": "^3.0.2", "https-proxy-agent": "^5.0.0", @@ -7682,8 +7670,9 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", - "extraneous": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "gaxios": "^5.0.0", "json-bigint": "^1.0.0" @@ -7696,8 +7685,9 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "extraneous": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "6", "debug": "4" diff --git a/src/components/SidebarSection.tsx b/src/components/SidebarSection.tsx index e90573c0..1247edc0 100644 --- a/src/components/SidebarSection.tsx +++ b/src/components/SidebarSection.tsx @@ -23,7 +23,7 @@ const SidebarSection: React.FC = ({ updater, }) => (
- +
{label}
From 1ae7e52f354bef4ea28782cf71a64bb598f29084 Mon Sep 17 00:00:00 2001 From: Rithish Date: Sat, 11 Apr 2026 18:25:49 +0000 Subject: [PATCH 2/2] 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 e476147d..740f860c 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()} + > + +