From 48de83cf32d69709c05531d76ec0596cfb59bec3 Mon Sep 17 00:00:00 2001 From: "JET.D" <70251380+3LL4N@users.noreply.github.com> Date: Sat, 2 Dec 2023 01:28:51 +0800 Subject: [PATCH] added: save test to pdf (#211) --- apps/expo/package.json | 3 + .../SavePdfToAndroidButton.tsx | 66 +++ apps/expo/src/screens/test-details.tsx | 2 + packages/api/package.json | 2 + packages/api/src/functions/pdfKitHandlers.ts | 55 +++ packages/api/src/functions/types/pdfKit.ts | 31 ++ packages/api/src/router/index.ts | 2 + packages/api/src/router/pdfKit.ts | 57 +++ pnpm-lock.yaml | 401 ++++++++++++++++-- 9 files changed, 583 insertions(+), 36 deletions(-) create mode 100644 apps/expo/src/device-file-saving/SavePdfToAndroidButton.tsx create mode 100644 packages/api/src/functions/pdfKitHandlers.ts create mode 100644 packages/api/src/functions/types/pdfKit.ts create mode 100644 packages/api/src/router/pdfKit.ts diff --git a/apps/expo/package.json b/apps/expo/package.json index 88847e11..920f9e6b 100644 --- a/apps/expo/package.json +++ b/apps/expo/package.json @@ -42,10 +42,13 @@ "expo-av": "^13.2.1", "expo-blur": "^12.2.2", "expo-document-picker": "^11.2.2", + "expo-file-system": "^15.6.0", "expo-font": "^11.1.1", "expo-linear-gradient": "^12.1.2", + "expo-media-library": "^15.6.0", "expo-random": "^13.1.2", "expo-secure-store": "^12.1.1", + "expo-sharing": "^11.7.0", "expo-status-bar": "^1.4.4", "expo-web-browser": "^12.1.1", "jest-expo": "^49.0.0", diff --git a/apps/expo/src/device-file-saving/SavePdfToAndroidButton.tsx b/apps/expo/src/device-file-saving/SavePdfToAndroidButton.tsx new file mode 100644 index 00000000..aabfc488 --- /dev/null +++ b/apps/expo/src/device-file-saving/SavePdfToAndroidButton.tsx @@ -0,0 +1,66 @@ +import React, { FC } from "react"; +import { Button, Alert, Platform } from "react-native"; +import * as FileSystem from "expo-file-system"; +import { shareAsync } from "expo-sharing"; +import { trpc } from "../utils/trpc"; + +type DownloadPdfButtonProps = { + testId: string; +}; + +const DownloadPdfButton: FC = (props) => { + const generatePdfMutation = trpc.pdfKit.generatePdfByTestId.useMutation(); + + const saveFile = async (uri: string, filename: string) => { + if (Platform.OS === "android") { + const permissions = + await FileSystem.StorageAccessFramework.requestDirectoryPermissionsAsync(); + if (permissions.granted) { + const base64 = await FileSystem.readAsStringAsync(uri, { + encoding: FileSystem.EncodingType.Base64, + }); + await FileSystem.StorageAccessFramework.createFileAsync( + permissions.directoryUri, + filename, + "testtrek/saves/pdf", + ) + .then(async (uri) => { + await FileSystem.writeAsStringAsync(uri, base64, { + encoding: FileSystem.EncodingType.Base64, + }); + Alert.alert("File Saved", "File has been saved successfully"); + }) + .catch((e) => { + console.log(e); + Alert.alert("Error", "Failed to save file"); + }); + } else { + shareAsync(uri); + } + } else { + shareAsync(uri); + } + }; + + const downloadAndSavePdf = async () => { + try { + const result = await generatePdfMutation.mutateAsync(props.testId); + const base64pdf = result.pdfBuffer; + const filename = `test-${Date.now()}.pdf`; + const localUri = FileSystem.documentDirectory + filename; + + await FileSystem.writeAsStringAsync(localUri, base64pdf, { + encoding: FileSystem.EncodingType.Base64, + }); + + await saveFile(localUri, filename); + } catch (error) { + console.error("Error saving PDF:", error); + Alert.alert("Error", "Unable to generate or download PDF"); + } + }; + + return