import { pdf } from "@react-pdf/renderer"; import { i18n } from "next-i18next"; import React, { memo } from "react"; import { FaFilePdf } from "react-icons/fa"; import type { Message } from "../../types/message"; import { MESSAGE_TYPE_GOAL } from "../../types/message"; import { MESSAGE_TYPE_TASK } from "../../types/task"; import WindowButton from "../WindowButton"; const PDFButton = ({ messages, name }: { messages: Message[]; name: string }) => { const textSections = getTextSections(messages); const downloadPDF = async () => { const MyDocument = (await import("./MyDocument")).default as React.FC<{ textSections: string[]; }>; const blob = await pdf().toBlob(); const url = URL.createObjectURL(blob); const link = document.createElement("a"); link.href = url; link.download = "my-document.pdf"; link.click(); URL.revokeObjectURL(url); }; return ( <> { downloadPDF().catch(console.error); }} icon={} text={name} /> ); }; const getTextSections = (messages: Message[]): string[] => { // Note "Thinking" messages have no `value` so they show up as new lines return messages .map((message) => { if (message.type == MESSAGE_TYPE_GOAL) { return `${i18n?.t("LABEL_AGENT_GOAL", { ns: "indexPage" })}: ${message.value}`; } if (message.type == MESSAGE_TYPE_TASK) { if (message.info) { return `${i18n?.t("EXECUTING", { ns: "common" })}: "${message.value}": ${message.info}`; } else { return `${i18n?.t("ADDING_TASK", { ns: "common" })}: ${message.value}`; } } return message.value; }) .filter((message) => message !== ""); }; export default memo(PDFButton);