Skip to content

Commit f188699

Browse files
Merge pull request #240 from Advik-Gupta/staging
fixed bugs in sidebar, request page, footer
2 parents 828d666 + a5d269f commit f188699

File tree

9 files changed

+215
-279
lines changed

9 files changed

+215
-279
lines changed

src/app/api/subscribe/route.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ async function appendEmailToSheet(email: string) {
3232

3333
export async function POST(req: Request) {
3434
try {
35-
const { email } = await req.json() as {email: string};
35+
const { email } = (await req.json()) as { email: string };
3636

3737
if (!email) {
3838
return NextResponse.json({ error: "Email is required" }, { status: 400 });

src/components/Card.tsx

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
extractBracketContent,
1010
extractWithoutBracketContent,
1111
} from "@/util/utils";
12-
import axios from "axios";
12+
import { getSecureUrl, generateFileName, downloadFile } from "@/util/download";
1313
import Link from "next/link";
1414
import { cn } from "@/lib/utils";
1515

@@ -26,28 +26,6 @@ const Card = ({ paper, onSelect, isSelected }: CardProps) => {
2626
setChecked(isSelected);
2727
}, [isSelected]);
2828

29-
const getSecureUrl = (url: string): string =>
30-
url.startsWith("http://") ? url.replace("http://", "https://") : url;
31-
32-
const generateFileName = (paper: IPaper): string => {
33-
const extension = paper.final_url.split(".").pop();
34-
return `${extractBracketContent(paper.subject)}-${paper.exam}-${paper.slot}-${paper.year}.${extension}`;
35-
};
36-
37-
const downloadFile = async (url: string, filename: string): Promise<void> => {
38-
try {
39-
const response = await axios.get(url, { responseType: "blob" });
40-
const blob = new Blob([response.data]);
41-
const link = document.createElement("a");
42-
link.href = window.URL.createObjectURL(blob);
43-
link.download = filename;
44-
link.click();
45-
window.URL.revokeObjectURL(link.href);
46-
} catch (error) {
47-
console.error("Download failed:", error);
48-
}
49-
};
50-
5129
const handleDownload = async (paper: IPaper) => {
5230
await downloadFile(getSecureUrl(paper.final_url), generateFileName(paper));
5331
};

src/components/CatalogueContent.tsx

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import axios, { type AxiosError } from "axios";
66
import { Button } from "@/components/ui/button";
77
import { type IPaper, type Filters } from "@/interface";
88
import Card from "./Card";
9-
import { extractBracketContent } from "@/util/utils";
109
import { useRouter } from "next/navigation";
1110
import Loader from "./ui/loader";
1211
import SideBar from "../components/SideBar";
@@ -15,18 +14,7 @@ import { Filter } from "lucide-react";
1514
import { Sheet, SheetContent, SheetTrigger } from "./ui/sheet";
1615
import { Pin } from "lucide-react";
1716
import { StoredSubjects } from "@/interface";
18-
19-
export async function downloadFile(url: string, filename: string) {
20-
try {
21-
const response = await axios.get(url, { responseType: "blob" });
22-
const blob = new Blob([response.data]);
23-
const link = document.createElement("a");
24-
link.href = window.URL.createObjectURL(blob);
25-
link.download = filename;
26-
link.click();
27-
window.URL.revokeObjectURL(link.href);
28-
} catch (error) {}
29-
}
17+
import { getSecureUrl, generateFileName, downloadFile } from "@/util/download";
3018

3119
const CatalogueContent = () => {
3220
const router = useRouter();
@@ -176,17 +164,15 @@ const CatalogueContent = () => {
176164
);
177165

178166
const handleDownloadAll = useCallback(async () => {
179-
/* if (typeof window !== "undefined" && window.gtag) {
180-
window.gtag("event", "download_all_clicked", {
181-
event_category: "Paper Downloads",
182-
event_label: "Download All Clicked",
183-
});
184-
} */
167+
const uniquePapers = Array.from(
168+
new Set(selectedPapers.map((paper) => paper._id)),
169+
).map((id) => selectedPapers.find((paper) => paper._id === id)) as IPaper[];
185170

186-
for (const paper of selectedPapers) {
187-
const extension = paper.final_url.split(".").pop();
188-
const fileName = `${extractBracketContent(paper.subject)}-${paper.exam}-${paper.slot}-${paper.year}.${extension}`;
189-
await downloadFile(paper.final_url, fileName);
171+
for (const paper of uniquePapers) {
172+
await downloadFile(
173+
getSecureUrl(paper.final_url),
174+
generateFileName(paper),
175+
);
190176
}
191177
}, [selectedPapers]);
192178

@@ -272,7 +258,7 @@ const CatalogueContent = () => {
272258

273259
return (
274260
<div className="relative flex min-h-screen justify-center p-0 md:justify-normal">
275-
<div className="hidden w-[30%] min-w-fit md:block">
261+
<div className="hidden !w-[22%] min-w-[22%] max-w-[22%] flex-shrink-0 md:block">
276262
<SideBar
277263
filtersNotPulled={filtersNotPulled}
278264
loading={loading}

src/components/Footer.tsx

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -110,38 +110,36 @@ export default function Footer() {
110110
</div>
111111

112112
{/* Suggestions */}
113-
<div className="flex w-full flex-col gap-2 text-black dark:text-white sm:w-[45%] lg:w-[25%]">
113+
<div className="flex w-full flex-col gap-4 text-black dark:text-white sm:w-[45%] lg:w-[25%]">
114114
<h3 className="font-jost text-xl font-semibold">
115115
Drop Your Suggestions:
116116
</h3>
117117
<Link
118118
href={`mailto:[email protected]`}
119-
className="mx-auto flex items-center center gap-2 sm:mx-0"
119+
className="flex items-center gap-2"
120120
>
121121
<Mail size={18} />
122122
<span>[email protected]</span>
123123
</Link>
124124

125-
<div className="mt-4 flex w-full max-w-xs flex-col gap-2">
126-
<h3 className="font-jost text-2xl font-semibold">
127-
Subscribe For Updates:
128-
</h3>
129-
<div className="relative w-full">
130-
<Input
131-
id="email"
132-
type="email"
133-
placeholder="Enter Your Email"
134-
className="pr-24"
135-
value={email}
136-
onChange={(e) => setEmail(e.target.value)}
137-
/>
138-
<Button
139-
onClick={handleSubscribe}
140-
className="absolute right-0 top-0 h-full rounded-l-none rounded-r-md bg-[#562EE7] px-4 text-white hover:bg-[#4531b3]"
141-
>
142-
Subscribe!
143-
</Button>
144-
</div>
125+
<h3 className="mt-4 font-jost text-xl font-semibold">
126+
Subscribe For Updates:
127+
</h3>
128+
<div className="flex gap-2">
129+
<Input
130+
id="email"
131+
type="email"
132+
placeholder="Enter Your Email"
133+
className="flex-1"
134+
value={email}
135+
onChange={(e) => setEmail(e.target.value)}
136+
/>
137+
<Button
138+
onClick={handleSubscribe}
139+
className="rounded-md bg-[#562EE7] px-4 text-white hover:bg-[#4531b3]"
140+
>
141+
Subscribe!
142+
</Button>
145143
</div>
146144
</div>
147145
</div>

0 commit comments

Comments
 (0)