diff --git a/src/components/Card.tsx b/src/components/Card.tsx
index e476147..d73d2d1 100644
--- a/src/components/Card.tsx
+++ b/src/components/Card.tsx
@@ -1,7 +1,9 @@
"use client";
+import React from "react";
import { type IPaper } from "@/interface";
import Image from "next/image";
+import { X } from "lucide-react";
import { Eye, Download, Check } from "lucide-react";
import {
extractBracketContent,
@@ -13,16 +15,18 @@ import {
downloadFile,
} from "@/lib/utils/download";
import { Capsule } from "@/components/ui/capsule";
-import Link from "next/link";
import { cn } from "@/lib/utils";
interface CardProps {
paper: IPaper;
onSelect: (paper: IPaper, isSelected: boolean) => void;
isSelected: boolean;
+ isShow?: boolean;
}
-const Card = ({ paper, onSelect, isSelected }: CardProps) => {
+const Card = ({ paper, onSelect, isSelected, isShow=true }: CardProps) => {
+ const [previewOpen, setPreviewOpen] = React.useState(false);
+ const [iframeLoading, setIframeLoading] = React.useState(true);
const handleDownload = async (paper: IPaper) => {
await downloadFile(getSecureUrl(paper.file_url), generateFileName(paper));
};
@@ -34,76 +38,124 @@ const Card = ({ paper, onSelect, isSelected }: CardProps) => {
const paperLink = `/paper/${paper._id}`;
return (
-
-
-
+ <>
+
{
+ const target = e.target as HTMLElement;
-
-
-
- {extractBracketContent(paper.subject)}
-
-
-
-
-
-
{
- e.preventDefault();
- e.stopPropagation();
- void handleDownload(paper);
- }}
- className="cursor-pointer"
- />
+ if (target.closest("button, input, svg")) return;
+
+ window.open(paperLink, "_blank");
+}}
+ className={cn(
+ "cursor-pointer overflow-hidden rounded-sm border-2 border-[#734DFF] bg-[#FFFFFF] font-play transition-all duration-150 hover:bg-[#EFEAFF] dark:border-[#36266D] dark:bg-[#171720] hover:dark:bg-[#262635]",
+ isSelected && "ring-2 ring-[#7480FF] bg-[#EFEAFF]"
+ )}
+ >
+
+
+
+
+ {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();
+ setIframeLoading(true);
+ setPreviewOpen(true);
+ }}
+ />
+
+ {
+ e.stopPropagation();
+ void handleDownload(paper);
+ }}
+ className="cursor-pointer"
/>
- Select
- {paper.answer_key_included && (
-
-
- Answer Key
-
- )}
+
+
+ {isShow &&
+
{
+ e.stopPropagation();
+ handleCheckboxChange();
+ }}
+ onClick={(e) => e.stopPropagation()}
+ className="h-5 w-5 accent-[#7480FF]"
+ type="checkbox"
+ />
+
Select
+
}
+
+ {paper.answer_key_included && (
+
+
+ Answer Key
+
+ )}
+
+
+ {previewOpen && (
+ setPreviewOpen(false)}
+ >
+
e.stopPropagation()}
+ >
+
+
+
+
+ )}
+ >
);
};
diff --git a/src/components/RelatedPaper.tsx b/src/components/RelatedPaper.tsx
index 18f040d..447be7c 100644
--- a/src/components/RelatedPaper.tsx
+++ b/src/components/RelatedPaper.tsx
@@ -90,7 +90,7 @@ const RelatedPapers = () => {
{relatedPapers.length === 0 ? (
No related papers found.
) : (
-
+
{relatedPapers.map((paper) => (
{
("");
}}
isSelected={false}
+ isShow={false}
/>
))}
diff --git a/src/components/SideBar.tsx b/src/components/SideBar.tsx
index 7ff5a06..f5dc1cf 100644
--- a/src/components/SideBar.tsx
+++ b/src/components/SideBar.tsx
@@ -17,7 +17,6 @@ function SideBar() {
selectedAnswerKeyIncluded,
filterOptions,
handleApplyFilters,
- setCurrentPage,
} = useFilters();
const exams =
filterOptions?.unique_exams.map((exam) => ({ label: exam, value: exam })) ??
diff --git a/src/components/SidebarSection.tsx b/src/components/SidebarSection.tsx
index 1247edc..80d19b7 100644
--- a/src/components/SidebarSection.tsx
+++ b/src/components/SidebarSection.tsx
@@ -21,35 +21,45 @@ const SidebarSection: React.FC
= ({
data,
selected,
updater,
-}) => (
-
-
-
-
- {label}
-
-
-
- {data.map((item) => (
- {
- const newValues = selected.includes(item.value)
- ? selected.filter((v) => v !== item.value)
- : [...selected, item.value];
- updater(newValues);
- }}
- className="mb-2 mr-2"
- >
- {item.label}
-
- ))}
-
-
-
-
-
-);
+}) => {
+ return (
+
+
+
+
+ {label}
+
-export default SidebarSection;
+
+
+ {data.map((item) => (
+ {
+ const newValues = selected.includes(item.value)
+ ? selected.filter((v) => v !== item.value)
+ : [...selected, item.value];
+ updater(newValues);
+ }}
+ className="mb-2 mr-2"
+ >
+ {item.label}
+
+ ))}
+
+
+
+
+
+ );
+};
+
+export default SidebarSection;
\ No newline at end of file