From 47189b9fca4ced90b34d7eb00a4ba5f9712597e0 Mon Sep 17 00:00:00 2001 From: Khai Ta Date: Wed, 4 Mar 2026 18:11:46 -0500 Subject: [PATCH] analytics export to pdf --- src/app/analytics/layout.tsx | 69 +++++++++++++++++++++++++++- src/common/api/analytics/provider.ts | 27 +++++++++++ 2 files changed, 95 insertions(+), 1 deletion(-) diff --git a/src/app/analytics/layout.tsx b/src/app/analytics/layout.tsx index 1b42632..d7e1096 100644 --- a/src/app/analytics/layout.tsx +++ b/src/app/analytics/layout.tsx @@ -1,10 +1,16 @@ +"use client"; + import SubNavigation from "@/components/layout/SubNavigation"; +import { downloadAnalyticsPDF } from "@/common/api/analytics/provider"; +import { useState } from "react"; type AnalyticsLayoutProps = { children: React.ReactNode; }; export default function AnalyticsLayout({ children }: AnalyticsLayoutProps) { + const [isDownloading, setIsDownloading] = useState(false); + const navItems = [ { label: "Summary", href: "/analytics/summary" }, { label: "Attendance", href: "/analytics/attendance" }, @@ -12,10 +18,71 @@ export default function AnalyticsLayout({ children }: AnalyticsLayoutProps) { { label: "Organizers", href: "/analytics/organizers" }, ]; + const handleExportPDF = async () => { + setIsDownloading(true); + try { + await downloadAnalyticsPDF(); + } catch (error) { + console.error("Failed to download PDF:", error); + alert("Failed to download PDF. Please try again."); + } finally { + setIsDownloading(false); + } + }; + return (
-
+

Analytics

+
{children} diff --git a/src/common/api/analytics/provider.ts b/src/common/api/analytics/provider.ts index 2efbe57..d58eefe 100644 --- a/src/common/api/analytics/provider.ts +++ b/src/common/api/analytics/provider.ts @@ -22,3 +22,30 @@ export async function getOrganizerScans(): Promise { method: "GET", }); } + +export async function downloadAnalyticsPDF(): Promise { + const response = await fetch( + `${process.env.NEXT_PUBLIC_API_BASE_URL}/analytics/pdf`, + { + method: "GET", + credentials: "include", + headers: { + "Content-Type": "application/pdf", + }, + } + ); + + if (!response.ok) { + throw new Error("Failed to download PDF"); + } + + const blob = await response.blob(); + const url = window.URL.createObjectURL(blob); + const link = document.createElement("a"); + link.href = url; + link.download = `analytics-report-${new Date().toISOString().split("T")[0]}.pdf`; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + window.URL.revokeObjectURL(url); +}