Added download option for assignment cards

Export PDF Download to hook
Prevented some NaN's
This commit is contained in:
Joao Ramos
2024-01-09 23:15:13 +00:00
parent 418221427a
commit cc0f9712d6
6 changed files with 111 additions and 88 deletions

View File

@@ -0,0 +1,60 @@
import React from "react";
import axios from "axios";
import { toast } from "react-toastify";
import { BsFilePdf } from "react-icons/bs";
type DownloadingPdf = {
[key: string]: boolean;
};
type PdfEndpoint = "stats" | "assignments";
export const usePDFDownload = (endpoint: PdfEndpoint) => {
const [downloadingPdf, setDownloadingPdf] = React.useState<DownloadingPdf>(
{}
);
const triggerDownload = async (id: string) => {
try {
setDownloadingPdf((prev) => ({ ...prev, [id]: true }));
const res = await axios.post(`/api/${endpoint}/${id}/export`);
toast.success("Report ready!");
const link = document.createElement("a");
link.href = res.data;
// download should have worked but there are some CORS issues
// https://firebase.google.com/docs/storage/web/download-files#cors_configuration
// link.download="report.pdf";
link.target = "_blank";
link.rel = "noreferrer";
link.click();
setDownloadingPdf((prev) => ({ ...prev, [id]: false }));
} catch (err) {
toast.error("Failed to display the report!");
console.error(err);
setDownloadingPdf((prev) => ({ ...prev, [id]: false }));
}
};
const renderIcon = (
id: string,
downloadClasses: string,
loadingClasses: string
) => {
if (downloadingPdf[id]) {
return (
<span className={`${loadingClasses} loading loading-infinity w-6`} />
);
}
return (
<BsFilePdf
className={`${downloadClasses} text-2xl cursor-pointer`}
onClick={(e) => {
e.stopPropagation();
triggerDownload(id);
}}
/>
);
};
return renderIcon;
};